diff --git a/.github/agents/test-developer.md b/.github/agents/test-developer.md index 02a40c9..e90725f 100644 --- a/.github/agents/test-developer.md +++ b/.github/agents/test-developer.md @@ -123,6 +123,15 @@ Common anti-patterns to avoid (not exhaustive): // ✅ Good: Assert.HasCount(3, collection); ``` +5. **Avoid Assert.IsTrue for string prefix checks** - Use `Assert.StartsWith` instead of wrapping + `string.StartsWith` in `Assert.IsTrue`, as it produces clearer failure messages that show the expected prefix + and actual value: + + ```csharp + // ❌ Bad: Assert.IsTrue(value.StartsWith("prefix")); + // ✅ Good: Assert.StartsWith("prefix", value); + ``` + ## Defer To - **Requirements Agent**: For test strategy and coverage requirements diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 623d004..85c3d96 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -20,3 +20,7 @@ updates: interval: "weekly" day: "monday" open-pull-requests-limit: 10 + groups: + github-actions-dependencies: + patterns: + - "*" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cc89e2f..3a57173 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -122,13 +122,13 @@ jobs: --property:PackageVersion=${{ inputs.version }} - name: Upload Test Results - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: test-results-${{ matrix.os }} path: test-results/*.trx - name: Upload Artifacts - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: artifacts-${{ matrix.os }} path: | @@ -190,7 +190,7 @@ jobs: upload: false - name: Upload CodeQL SARIF - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: codeql-sarif path: sarif-results/csharp.sarif @@ -215,7 +215,7 @@ jobs: uses: actions/checkout@v6 - name: Download package - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: artifacts-${{ matrix.os }} path: packages @@ -269,13 +269,13 @@ jobs: - name: Upload validation test results if: always() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: validation-test-results-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }} path: validation-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }}.trx - name: Upload version capture - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: version-capture-${{ matrix.os }}-dotnet${{ matrix.dotnet-version }} path: versionmark-int-*.json @@ -299,26 +299,26 @@ jobs: node-version: 'lts/*' - name: Download all test results - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: path: test-results pattern: '*test-results*' continue-on-error: true - name: Download VersionMark package - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: artifacts-windows-latest path: packages - name: Download CodeQL SARIF - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: codeql-sarif path: codeql-results - name: Download all version captures - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: path: version-captures pattern: 'version-capture-*' @@ -522,7 +522,7 @@ jobs: "docs/VersionMark Trace Matrix.pdf" - name: Upload documentation - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: documents path: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index bf33269..821a753 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -52,13 +52,13 @@ jobs: 10.x - name: Download package artifacts - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: artifacts-ubuntu-latest path: artifacts - name: Download documents artifact - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: documents path: artifacts diff --git a/README.md b/README.md index 332337c..a8e0a51 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,8 @@ Generated documentation includes: Copyright (c) DEMA Consulting. Licensed under the MIT License. See [LICENSE][link-license] for details. +By contributing to this project, you agree that your contributions will be licensed under the MIT License. + [badge-forks]: https://img.shields.io/github/forks/demaconsulting/VersionMark?style=plastic [badge-stars]: https://img.shields.io/github/stars/demaconsulting/VersionMark?style=plastic diff --git a/src/DemaConsulting.VersionMark/Context.cs b/src/DemaConsulting.VersionMark/Context.cs index 414c1de..70d1405 100644 --- a/src/DemaConsulting.VersionMark/Context.cs +++ b/src/DemaConsulting.VersionMark/Context.cs @@ -120,6 +120,7 @@ private Context() /// Thrown when arguments are invalid. public static Context Create(string[] args) { + ArgumentNullException.ThrowIfNull(args); var parser = new ArgumentParser(); parser.ParseArguments(args); @@ -249,6 +250,7 @@ private sealed class ArgumentParser /// Command-line arguments. public void ParseArguments(string[] args) { + ArgumentNullException.ThrowIfNull(args); int i = 0; while (i < args.Length) { diff --git a/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj b/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj index a6cbcda..b44b2ee 100644 --- a/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj +++ b/src/DemaConsulting.VersionMark/DemaConsulting.VersionMark.csproj @@ -3,7 +3,7 @@ Exe net8.0;net9.0;net10.0 - 12 + latest enable enable @@ -34,7 +34,7 @@ true - True + true true true latest @@ -49,13 +49,25 @@ + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/DemaConsulting.VersionMark/Validation.cs b/src/DemaConsulting.VersionMark/Validation.cs index 63f54eb..0e4f226 100644 --- a/src/DemaConsulting.VersionMark/Validation.cs +++ b/src/DemaConsulting.VersionMark/Validation.cs @@ -34,6 +34,8 @@ internal static class Validation /// The context containing command line arguments and program state. public static void Run(Context context) { + ArgumentNullException.ThrowIfNull(context); + // Print validation header PrintValidationHeader(context); diff --git a/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj b/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj index f664f86..d2b960a 100644 --- a/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj +++ b/test/DemaConsulting.VersionMark.Tests/DemaConsulting.VersionMark.Tests.csproj @@ -1,7 +1,7 @@ net8.0;net9.0;net10.0 - 12 + latest enable enable true @@ -11,7 +11,7 @@ false true - True + true @@ -23,10 +23,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive