diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..2794b95 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,23 @@ + +# see docs at https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/enabling-and-disabling-version-updates + +version: 2 +updates: + - package-ecosystem: "nuget" + directory: "/MarkdownLinkCheckLogParser" + schedule: + interval: "daily" + labels: + - 'dependabot' + - 'bot:robot:' + - 'nuget' + - package-ecosystem: github-actions + # Workflow files stored in the + # default location of `.github/workflows` + directory: '/' + schedule: + interval: "daily" + labels: + - 'dependabot' + - 'bot:robot:' + - 'github-workflows' diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 413a567..10480eb 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -40,7 +40,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v2 with: - dotnet-version: 6.0.x + dotnet-version: 7.0.x - name: Cache/Restore NuGets uses: actions/cache@v3 with: @@ -60,7 +60,7 @@ jobs: run: | $os = $PSVersionTable.OS $testResultsDir = $(Join-Path -Path (Get-Location) -ChildPath "${{ env.TEST_RESULTS_DIR }}") - Write-Output "::set-output name=test-results-dir::$testResultsDir" + Write-Output "test-results-dir=$testResultsDir" >> $env:GITHUB_OUTPUT dotnet test ${{ env.SLN_FILEPATH }} ` -c Release ` --no-build ` @@ -87,7 +87,7 @@ jobs: # - the '(steps..conclusion == 'success' || steps..conclusion == 'failure')' condition: to run the steps only if the step has ran, regardless # if it failed or not. It won't run if the step has been skipped or cancelled. - name: Upload test coverage to Codecov - uses: codecov/codecov-action@v2.1.0 + uses: codecov/codecov-action@v2 with: files: ${{ env.TEST_COVERAGE_FILE }} fail_ci_if_error: true diff --git a/MarkdownLinkCheckLogParser/Directory.Build.props b/MarkdownLinkCheckLogParser/Directory.Build.props index 8042b71..65b083d 100644 --- a/MarkdownLinkCheckLogParser/Directory.Build.props +++ b/MarkdownLinkCheckLogParser/Directory.Build.props @@ -12,19 +12,19 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -35,14 +35,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/GitHubStepOutputExtensions.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/GitHubStepOutputExtensions.cs deleted file mode 100644 index 09097a4..0000000 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/GitHubStepOutputExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Outputs; - -internal static class GitHubStepOutputExtensions -{ - public static string EscapeGitHubStepOutput(this string input) - { - input.NotNull(); - // need to replace newline characters because this output is set as a GitHub - // step output and without this all newlines are lost. - // See https://github.community/t/set-output-truncates-multiline-strings/16852/3 - return input - .Replace("\n", "%0A", StringComparison.InvariantCulture) - .Replace("\r", "%0D", StringComparison.InvariantCulture); - } -} diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonConsoleOutputFormat.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonConsoleOutputFormat.cs index 17c0d50..882ca05 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonConsoleOutputFormat.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonConsoleOutputFormat.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Outputs; -internal class JsonConsoleOutputFormat : IOutputFormat +internal sealed class JsonConsoleOutputFormat : IOutputFormat { private readonly IConsole _console; @@ -16,9 +16,7 @@ public async Task WriteAsync(MarkdownLinkCheckOutput output) { WriteIndented = true, }; - var outputAsJson = JsonSerializer - .Serialize(output, serializeOptions) - .EscapeGitHubStepOutput(); + var outputAsJson = JsonSerializer.Serialize(output, serializeOptions); await _console.Output.WriteLineAsync(outputAsJson); } } diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonFileOutputFormat.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonFileOutputFormat.cs index 45cc4b7..0444ac5 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonFileOutputFormat.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/JsonFileOutputFormat.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Outputs; -internal class JsonFileOutputFormat : IOutputFormat +internal sealed class JsonFileOutputFormat : IOutputFormat { private readonly IFile _file; private readonly OutputJsonFilepath _filepath; diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownConsoleOutputFormat.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownConsoleOutputFormat.cs index 0cb2f5e..5417132 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownConsoleOutputFormat.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownConsoleOutputFormat.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Outputs; -internal class MarkdownConsoleOutputFormat : IOutputFormat +internal sealed class MarkdownConsoleOutputFormat : IOutputFormat { private readonly IConsole _console; @@ -12,12 +12,7 @@ public MarkdownConsoleOutputFormat(IConsole console) public async Task WriteAsync(MarkdownLinkCheckOutput output) { output.NotNull(); - // need to replace newline characters because this output is set as a GitHub - // step output and without this all newlines are lost. - // See https://github.community/t/set-output-truncates-multiline-strings/16852/3 - var markdownText = output - .ToMarkdownText() - .EscapeGitHubStepOutput(); + var markdownText = output.ToMarkdownText(); await _console.Output.WriteAsync(markdownText); } } diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownFileOutputFormat.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownFileOutputFormat.cs index a2fadcb..a7c3be5 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownFileOutputFormat.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Outputs/MarkdownFileOutputFormat.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Outputs; -internal class MarkdownFileOutputFormat : IOutputFormat +internal sealed class MarkdownFileOutputFormat : IOutputFormat { private readonly IFile _file; private readonly OutputMarkdownFilepath _filepath; diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/NotNullOrWhitespaceOptionValidator.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/NotNullOrWhitespaceOptionValidator.cs index d63551f..65e1435 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/NotNullOrWhitespaceOptionValidator.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/NotNullOrWhitespaceOptionValidator.cs @@ -1,7 +1,7 @@ -namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Validators; +namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Validators; #pragma warning disable CA1812 // Avoid uninstantiated internal classes. Referenced via typeof(NotNullOrWhitespaceOptionValidator) usage -internal class NotNullOrWhitespaceOptionValidator : BindingValidator +internal sealed class NotNullOrWhitespaceOptionValidator : BindingValidator { public override BindingValidationError? Validate(string? value) { diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/OutputOptionValidator.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/OutputOptionValidator.cs index 0e188d7..374a4e2 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/OutputOptionValidator.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/CliCommands/ParseLog/Validators/OutputOptionValidator.cs @@ -1,7 +1,7 @@ namespace MarkdownLinkCheckLogParserCli.CliCommands.ParseLog.Validators; #pragma warning disable CA1812 // Avoid uninstantiated internal classes. Referenced via typeof(OutputOptionValidator) usage -internal class OutputOptionValidator : BindingValidator +internal sealed class OutputOptionValidator : BindingValidator { public override BindingValidationError? Validate(string? value) { diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/Files/OutputFile.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/Files/OutputFile.cs index e4a0c70..b332337 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/Files/OutputFile.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/Files/OutputFile.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.Files; -internal class OutputFile : IFile +internal sealed class OutputFile : IFile { public StreamWriter CreateFileStreamWriter(string filename) { diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubHttpClient.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubHttpClient.cs index df41e66..d4c03cc 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubHttpClient.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubHttpClient.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.GitHub; -internal class GitHubHttpClient +internal sealed class GitHubHttpClient { private readonly HttpClient _httpClient; diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubStepLog.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubStepLog.cs index 57a1a4f..68845b0 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubStepLog.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubStepLog.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.GitHub; -internal class GitHubStepLog +internal sealed class GitHubStepLog { private readonly Memory _log; diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubWorkflowRunLogs.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubWorkflowRunLogs.cs index f0d65b8..8c2aa1e 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubWorkflowRunLogs.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/GitHub/GitHubWorkflowRunLogs.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.GitHub; -internal class GitHubWorkflowRunLogs +internal sealed class GitHubWorkflowRunLogs { private readonly GitHubHttpClient _gitHubHttpClient; diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownFileCheck.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownFileCheck.cs index 9bd27cf..cb66d80 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownFileCheck.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownFileCheck.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.MarkdownLinkCheck; -internal class MarkdownFileCheck +internal sealed class MarkdownFileCheck { private readonly List _errors; @@ -28,4 +28,4 @@ internal void AddError(string link, int statusCode) } } -internal record MarkdownLinkError(string Link, int StatusCode); +internal sealed record MarkdownLinkError(string Link, int StatusCode); diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownLinkCheckOutput.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownLinkCheckOutput.cs index 786ea73..7fa2bc1 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownLinkCheckOutput.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/MarkdownLinkCheckOutput.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.MarkdownLinkCheck; -internal class MarkdownLinkCheckOutput +internal sealed class MarkdownLinkCheckOutput { public MarkdownLinkCheckOutput(IReadOnlyList files, bool captureErrorsOnly) { diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/ParserState.cs b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/ParserState.cs index e240714..edba8c1 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/ParserState.cs +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheck/ParserState.cs @@ -2,7 +2,7 @@ namespace MarkdownLinkCheckLogParserCli.MarkdownLinkCheck; // This is part of the Visitor pattern implement to handle the parsing of each log line of the mlc output // This class would be equivalent to the IVisitor in this example https://refactoring.guru/design-patterns/visitor/csharp/example -internal class ParserState +internal sealed class ParserState { private MarkdownFileCheck? _current; private readonly List _files = new List(); diff --git a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheckLogParserCli.csproj b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheckLogParserCli.csproj index badc848..f31a974 100644 --- a/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheckLogParserCli.csproj +++ b/MarkdownLinkCheckLogParser/src/MarkdownLinkCheckLogParserCli/MarkdownLinkCheckLogParserCli.csproj @@ -1,13 +1,13 @@ - + Exe - net6.0 + net7.0 - + - + diff --git a/MarkdownLinkCheckLogParser/testenvironments.json b/MarkdownLinkCheckLogParser/testenvironments.json index 340eddc..0c80ae2 100644 --- a/MarkdownLinkCheckLogParser/testenvironments.json +++ b/MarkdownLinkCheckLogParser/testenvironments.json @@ -2,9 +2,9 @@ "version": "1", "environments": [ { - "name": "WSL-Ubuntu-20.04", + "name": "WSL-Ubuntu-22.04", "type": "wsl", - "wslDistribution": "Ubuntu-20.04" + "wslDistribution": "Ubuntu-22.04" } ] } diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/GitHubStepOutputExtensions.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/GitHubStepOutputExtensions.cs deleted file mode 100644 index a91d047..0000000 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/GitHubStepOutputExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; - -internal static class GitHubStepOutputExtensions -{ - public static string UnEscapeGitHubStepOutput(this string input) - { - // need to replace newline characters because this output is set as a GitHub - // step output and without this all newlines are lost. - // See https://github.community/t/set-output-truncates-multiline-strings/16852/3 - return input - .Replace("%0A", "\n", StringComparison.InvariantCulture) - .Replace("%0D", "\r", StringComparison.InvariantCulture); - } -} diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/InMemoryGitHubWorkflowRunHandler.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/InMemoryGitHubWorkflowRunHandler.cs index 343f5b8..96011f6 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/InMemoryGitHubWorkflowRunHandler.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/InMemoryGitHubWorkflowRunHandler.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; -internal class InMemoryGitHubWorkflowRunHandler : DelegatingHandler +internal sealed class InMemoryGitHubWorkflowRunHandler : DelegatingHandler { private readonly string _logZipFilepath; diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NormalizedLineEndingsFileReader.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/LineEndings.cs similarity index 74% rename from MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NormalizedLineEndingsFileReader.cs rename to MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/LineEndings.cs index c5df984..8397806 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NormalizedLineEndingsFileReader.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/LineEndings.cs @@ -1,15 +1,14 @@ namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; -internal static class NormalizedLineEndingsFileReader +internal static class LineEndings { /// - /// Opens a text file, reads all text and then closes the file. + /// Updates a string so that the line endings match the OS expected line endings. /// - /// The file to open for reading. - /// A string containing all the text of the file with line endings matching the OS. - public static string ReadAllText(string path) + /// String to update. + /// A string containing line endings matching the OS expected line endings. + public static string NormalizeLineEndings(this string original) { - var original = File.ReadAllText(path); if (Environment.OSVersion.Platform == PlatformID.Win32NT && original.Contains(CR + LF, StringComparison.Ordinal)) { // if it's a Windows OS and contains Windows line endings then do nothing diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/MarkdownCheckOutputTestModel.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/MarkdownCheckOutputTestModel.cs index 2da10d5..cc50a34 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/MarkdownCheckOutputTestModel.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/MarkdownCheckOutputTestModel.cs @@ -1,7 +1,7 @@ namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; #pragma warning disable CA1812 // Avoid uninstantiated internal classes. Referenced via JsonSerializer.Deserialize usage -internal class MarkdownLinkCheckOutputJsonModel +internal sealed class MarkdownLinkCheckOutputJsonModel { public MarkdownLinkCheckOutputJsonModel() { @@ -21,7 +21,7 @@ public MarkdownLinkCheckOutputJsonModel() public List Files { get; set; } } -internal class MarkdownFileCheckJsonModel +internal sealed class MarkdownFileCheckJsonModel { public MarkdownFileCheckJsonModel() { @@ -39,7 +39,7 @@ public MarkdownFileCheckJsonModel() public List Errors { get; set; } } -internal class MarkdownLinkErrorJsonModel +internal sealed class MarkdownLinkErrorJsonModel { public string? Link { get; set; } diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NewLines.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NewLines.cs index 21cbf54..434d535 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NewLines.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/NewLines.cs @@ -1,4 +1,5 @@ namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; + internal static class NewLines { public const string CR = "\r"; diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/OsDependantOutput.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/OsDependantOutput.cs index fea67a3..e28c0a9 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/OsDependantOutput.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/OsDependantOutput.cs @@ -5,7 +5,7 @@ internal static class OsDependantOutput public static string ReadAllText(string filepath) { return Environment.OSVersion.Platform == PlatformID.Unix - ? NormalizedLineEndingsFileReader.ReadAllText($"{filepath}-unix.txt") - : NormalizedLineEndingsFileReader.ReadAllText($"{filepath}-windows.txt"); + ? File.ReadAllText($"{filepath}-unix.txt").NormalizeLineEndings() + : File.ReadAllText($"{filepath}-windows.txt").NormalizeLineEndings(); } } diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/ShouldlyExtensions.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/ShouldlyExtensions.cs new file mode 100644 index 0000000..b4699d7 --- /dev/null +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/ShouldlyExtensions.cs @@ -0,0 +1,11 @@ +namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; + +internal static class ShouldlyExtensions +{ + public static void ShouldBeWithNormalizedNewlines(this string actual, string expected) + { + var normalizedActual = actual.NormalizeLineEndings(); + var normalizedExpected = expected.NormalizeLineEndings(); + normalizedActual.ShouldBe(normalizedExpected); + } +} diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/StatusCodeHandler.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/StatusCodeHandler.cs index 51efe40..eeac38f 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/StatusCodeHandler.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/Auxiliary/StatusCodeHandler.cs @@ -1,6 +1,6 @@ namespace MarkdownLinkCheckLogParserCli.Tests.Auxiliary; -internal class StatusCodeHandler : DelegatingHandler +internal sealed class StatusCodeHandler : DelegatingHandler { private readonly HttpStatusCode _statusCode; diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandJsonConsoleOutputTests.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandJsonConsoleOutputTests.cs index d420602..e67e4e9 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandJsonConsoleOutputTests.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandJsonConsoleOutputTests.cs @@ -30,9 +30,7 @@ public async Task ParseLogCommandJsonConsoleTest1() }; using var console = new FakeInMemoryConsole(); await command.ExecuteAsync(console); - var output = console - .ReadOutputString() - .UnEscapeGitHubStepOutput(); + var output = console.ReadOutputString(); var markdownLinkCheckOutputJson = JsonSerializer.Deserialize(output); markdownLinkCheckOutputJson.ShouldNotBeNull(); @@ -90,9 +88,7 @@ public async Task ParseLogCommandJsonConsoleTest2() }; using var console = new FakeInMemoryConsole(); await command.ExecuteAsync(console); - var output = console - .ReadOutputString() - .UnEscapeGitHubStepOutput(); + var output = console.ReadOutputString(); var markdownLinkCheckOutputJson = JsonSerializer.Deserialize(output); markdownLinkCheckOutputJson.ShouldNotBeNull(); @@ -145,9 +141,7 @@ public async Task ParseLogCommandJsonConsoleTest3() }; using var console = new FakeInMemoryConsole(); await command.ExecuteAsync(console); - var output = console - .ReadOutputString() - .UnEscapeGitHubStepOutput(); + var output = console.ReadOutputString(); var markdownLinkCheckOutputJson = JsonSerializer.Deserialize(output); markdownLinkCheckOutputJson.ShouldNotBeNull(); diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownConsoleOutputTests.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownConsoleOutputTests.cs index 39bacbd..7406ee4 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownConsoleOutputTests.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownConsoleOutputTests.cs @@ -31,11 +31,9 @@ public async Task ParseLogCommandMarkdownConsoleTest1() }; using var console = new FakeInMemoryConsole(); await command.ExecuteAsync(console); - var markdownLinkCheckOutputMd = console - .ReadOutputString() - .UnEscapeGitHubStepOutput(); - var expectedMarkdown = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/output-with-errors-capture-errors-only.md"); - markdownLinkCheckOutputMd.ShouldBe(expectedMarkdown); + var markdownLinkCheckOutputMd = console.ReadOutputString(); + var expectedMarkdown = File.ReadAllText("./TestFiles/output-with-errors-capture-errors-only.md"); + markdownLinkCheckOutputMd.ShouldBeWithNormalizedNewlines(expectedMarkdown); } /// @@ -64,11 +62,9 @@ public async Task ParseLogCommandMarkdownConsoleTest2() }; using var console = new FakeInMemoryConsole(); await command.ExecuteAsync(console); - var markdownLinkCheckOutputMd = console - .ReadOutputString() - .UnEscapeGitHubStepOutput(); - var expectedMarkdown = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/output-with-errors-all-files.md"); - markdownLinkCheckOutputMd.ShouldBe(expectedMarkdown); + var markdownLinkCheckOutputMd = console.ReadOutputString(); + var expectedMarkdown = File.ReadAllText("./TestFiles/output-with-errors-all-files.md"); + markdownLinkCheckOutputMd.ShouldBeWithNormalizedNewlines(expectedMarkdown); } /// @@ -98,10 +94,8 @@ public async Task ParseLogCommandMarkdownConsoleTest3() }; using var console = new FakeInMemoryConsole(); await command.ExecuteAsync(console); - var markdownLinkCheckOutputMd = console - .ReadOutputString() - .UnEscapeGitHubStepOutput(); - var expectedMarkdown = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/output-without-errors.md"); - markdownLinkCheckOutputMd.ShouldBe(expectedMarkdown); + var markdownLinkCheckOutputMd = console.ReadOutputString(); + var expectedMarkdown = File.ReadAllText("./TestFiles/output-without-errors.md"); + markdownLinkCheckOutputMd.ShouldBeWithNormalizedNewlines(expectedMarkdown); } } diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownFileOutputTests.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownFileOutputTests.cs index 9fdfeb2..304ee68 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownFileOutputTests.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliCommands/ParseLogCommandMarkdownFileOutputTests.cs @@ -42,8 +42,8 @@ public async Task ParseLogCommandMarkdownFileTest1() markdownMemoryStream.Seek(0, SeekOrigin.Begin); using var markdownStreamReader = new StreamReader(markdownMemoryStream); var markdownAsString = await markdownStreamReader.ReadToEndAsync(); - var expectedMarkdown = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/output-with-errors-capture-errors-only.md"); - markdownAsString.ShouldBe(expectedMarkdown); + var expectedMarkdown = File.ReadAllText("./TestFiles/output-with-errors-capture-errors-only.md"); + markdownAsString.ShouldBeWithNormalizedNewlines(expectedMarkdown); } /// @@ -83,8 +83,8 @@ public async Task ParseLogCommandMarkdownFileTest2() markdownMemoryStream.Seek(0, SeekOrigin.Begin); using var markdownStreamReader = new StreamReader(markdownMemoryStream); var markdownAsString = await markdownStreamReader.ReadToEndAsync(); - var expectedMarkdown = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/output-with-errors-all-files.md"); - markdownAsString.ShouldBe(expectedMarkdown); + var expectedMarkdown = File.ReadAllText("./TestFiles/output-with-errors-all-files.md"); + markdownAsString.ShouldBeWithNormalizedNewlines(expectedMarkdown); } /// @@ -123,8 +123,8 @@ public async Task ParseLogCommandMarkdownFileTest3() markdownMemoryStream.Seek(0, SeekOrigin.Begin); using var markdownStreamReader = new StreamReader(markdownMemoryStream); var markdownAsString = await markdownStreamReader.ReadToEndAsync(); - var expectedMarkdown = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/output-without-errors.md"); - markdownAsString.ShouldBe(expectedMarkdown); + var expectedMarkdown = File.ReadAllText("./TestFiles/output-without-errors.md"); + markdownAsString.ShouldBeWithNormalizedNewlines(expectedMarkdown); } /// diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliIntegration/CliIntegrationTests.cs b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliIntegration/CliIntegrationTests.cs index be68119..1c6f5b7 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliIntegration/CliIntegrationTests.cs +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/CliIntegration/CliIntegrationTests.cs @@ -166,8 +166,8 @@ public async Task AuthTokenOptionValidation(string authToken) }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-auth-token-validation.txt"); - error.ShouldBe(error); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-auth-token-validation.txt"); + error.ShouldBeWithNormalizedNewlines(error); } /// @@ -193,8 +193,8 @@ public async Task RepoOptionValidation(string repo) }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-repo-validation.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-repo-validation.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } /// @@ -220,8 +220,8 @@ public async Task RunIdOptionValidation(string runId) }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-run-id-validation.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-run-id-validation.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } /// @@ -247,8 +247,8 @@ public async Task JobNameOptionValidation(string jobName) }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-job-name-validation.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-job-name-validation.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } /// @@ -274,8 +274,8 @@ public async Task StepNameOptionValidation(string stepName) }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-step-name-validation.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-step-name-validation.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } /// @@ -303,8 +303,8 @@ public async Task OutputOptionValidation1(string output) }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-output-validation1.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-output-validation1.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } /// @@ -330,8 +330,8 @@ public async Task OutputOptionValidation2() }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-output-validation2.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-output-validation2.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } /// @@ -357,7 +357,7 @@ public async Task OutputOptionValidation3() }; await app.RunAsync(args); var error = console.ReadErrorString(); - var expectedError = NormalizedLineEndingsFileReader.ReadAllText("./TestFiles/cli-output-error-output-validation3.txt"); - error.ShouldBe(expectedError); + var expectedError = File.ReadAllText("./TestFiles/cli-output-error-output-validation3.txt"); + error.ShouldBeWithNormalizedNewlines(expectedError); } } diff --git a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/MarkdownLinkCheckLogParserCli.Tests.csproj b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/MarkdownLinkCheckLogParserCli.Tests.csproj index 731b017..26c3040 100644 --- a/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/MarkdownLinkCheckLogParserCli.Tests.csproj +++ b/MarkdownLinkCheckLogParser/tests/MarkdownLinkCheckLogParserCli.Tests/MarkdownLinkCheckLogParserCli.Tests.csproj @@ -1,19 +1,19 @@ - net6.0 + net7.0 false true - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/README.md b/README.md index daf4bdf..4498cbb 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ jobs: - uses: actions/checkout@v3 - name: Run markdown link check log parser id: mlc-log-parser - uses: edumserrano/markdown-link-check-log-parser@v1.3.0 + uses: edumserrano/markdown-link-check-log-parser@v1 with: run-id: '${{ github.event.workflow_run.id }}' job-name: 'Run Markdown Link Check' diff --git a/docs/dev-notes/README.md b/docs/dev-notes/README.md index c61fc10..d67e7a6 100644 --- a/docs/dev-notes/README.md +++ b/docs/dev-notes/README.md @@ -35,7 +35,7 @@ 1) Clone the repo and open the **MarkdownLinkCheckLogParser.sln** solution file at `/MarkdownLinkCheckLogParser`. 2) Go to the test explorer in Visual Studio and run tests. -**Note:** [Remote testing](https://docs.microsoft.com/en-us/visualstudio/test/remote-testing?view=vs-2022) with WSL is configured on the solution which enables you to run the tests locally on Linux or on Windows. You can view the configuration file at [testenvironments.json](/MarkdownLinkCheckLogParser/testenvironments.json). To run the tests on Linux you need to have at least `Visual Studio 2022` and the Linux distro `Ubuntu-20.04` installed on [WSL](https://docs.microsoft.com/en-us/windows/wsl/install). +**Note:** [Remote testing](https://docs.microsoft.com/en-us/visualstudio/test/remote-testing?view=vs-2022) with WSL is configured on the solution which enables you to run the tests locally on Linux or on Windows. You can view the configuration file at [testenvironments.json](/MarkdownLinkCheckLogParser/testenvironments.json). To run the tests on Linux you need to have at least `Visual Studio 2022` and the Linux distro `Ubuntu-22.04` installed on [WSL](https://docs.microsoft.com/en-us/windows/wsl/install). ### Run tests with dotnet CLI @@ -99,9 +99,9 @@ To understand better how the action builds and executes the Docker container loo ### As of writing this, the log for building the docker action looks as follows ``` -/usr/bin/docker build --t 4cd98f:236c6972581e50e94bc7f786208c8965 --f "/home/runner/work/markdown-link-check-log-parser/markdown-link-check-log-parser/v1/Dockerfile" +/usr/bin/docker build +-t 4cd98f:236c6972581e50e94bc7f786208c8965 +-f "/home/runner/work/markdown-link-check-log-parser/markdown-link-check-log-parser/v1/Dockerfile" "/home/runner/work/_actions/edumserrano/markdown-link-check-log-parser/v1" ``` @@ -143,7 +143,7 @@ This way it can successfully build the Dockerfile for this action which would ot -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" --v "/home/runner/work/markdown-link-check-log-parser/markdown-link-check-log-parser":"/github/workspace" +-v "/home/runner/work/markdown-link-check-log-parser/markdown-link-check-log-parser":"/github/workspace" 4cd98f:236c6972581e50e94bc7f786208c8965 ``` diff --git a/entrypoint.ps1 b/entrypoint.ps1 index 934e34a..c79da03 100644 --- a/entrypoint.ps1 +++ b/entrypoint.ps1 @@ -13,16 +13,20 @@ function Main() $argsAsList.Add($arg) } } - + Write-Output "Executing: dotnet '/app/MarkdownLinkCheckLogParserCli.dll' $argsAsList" $output = dotnet '/app/MarkdownLinkCheckLogParserCli.dll' $argsAsList - + if($LASTEXITCODE -ne 0 ) { Write-Output "::error::Markdown link check log parser didn't complete successfully. See the step's log for more details." exit $LASTEXITCODE } - - Write-Output "::set-output name=mlc-result::$output" + + $random = Get-Random + $delimiter = "EOF_$random" + Write-Output "mlc-result<<$delimiter" >> $env:GITHUB_OUTPUT + Write-Output $output >> $env:GITHUB_OUTPUT + Write-Output $delimiter >> $env:GITHUB_OUTPUT } # invoke entrypoint function