From a4ef9bea783f8d391f098c21655b2b4c0a2c46ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 10:20:28 +0000 Subject: [PATCH 1/7] Initial plan From cda5e023458796aa7226e81acf21e6b697c9476d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 10:26:40 +0000 Subject: [PATCH 2/7] Upgrade all projects to .NET 10 Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- .github/workflows/create-release.yml | 8 +- .vscode/launch.json | 4 +- .../DevProxy.Abstractions.csproj | 3 +- DevProxy.Abstractions/packages.lock.json | 31 +- DevProxy.Plugins/DevProxy.Plugins.csproj | 5 +- DevProxy.Plugins/packages.lock.json | 81 +----- DevProxy/DevProxy.csproj | 3 +- DevProxy/packages.lock.json | 272 ++---------------- 8 files changed, 46 insertions(+), 361 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index c01334a1..fde9a726 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -34,7 +34,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@d4c94342e560b34958eacfc5d055d21461ed1c5d # v5.0.0 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Rename executable for beta if: contains(github.ref_name, '-beta') run: | @@ -59,7 +59,7 @@ jobs: if: matrix.architecture == 'win-x64' run: dotnet build ./DevProxy.Abstractions/DevProxy.Abstractions.csproj -p:InformationalVersion=$("${{ github.ref_name }}".Substring(1)) -c Release --no-self-contained - name: Add plugins to output - run: cp ./DevProxy/bin/Release/net9.0/${{ matrix.architecture }}/plugins ./${{ env.release }} -r + run: cp ./DevProxy/bin/Release/net10.0/${{ matrix.architecture }}/plugins ./${{ env.release }} -r - name: Remove unnecessary files run: | pushd @@ -112,7 +112,7 @@ jobs: shell: pwsh run: > ./sign code azure-key-vault - ./DevProxy.Abstractions/bin/Release/net9.0/DevProxy.Abstractions.dll + ./DevProxy.Abstractions/bin/Release/net10.0/DevProxy.Abstractions.dll --publisher-name "${{ env.APP_PUBLISHER }}" --description "${{ env.APP_DESCRIPTION }}" --description-url "${{ env.APP_DESCRIPTION_URL }}" @@ -127,7 +127,7 @@ jobs: uses: thedoctor0/zip-release@b57d897cb5d60cb78b51a507f63fa184cfe35554 # master with: filename: '../../../../DevProxy.Abstractions-${{ github.ref_name }}.zip' - directory: './DevProxy.Abstractions/bin/Release/net9.0' + directory: './DevProxy.Abstractions/bin/Release/net10.0' exclusions: '*.json' - name: Upload abstractions if: matrix.architecture == 'win-x64' diff --git a/.vscode/launch.json b/.vscode/launch.json index 206ac7b4..9252a22f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,9 +10,9 @@ "request": "launch", "preLaunchTask": "build", // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/DevProxy/bin/Debug/net9.0/devproxy.dll", + "program": "${workspaceFolder}/DevProxy/bin/Debug/net10.0/devproxy.dll", "args": [], - "cwd": "${workspaceFolder}/DevProxy/bin/Debug/net9.0", + "cwd": "${workspaceFolder}/DevProxy/bin/Debug/net10.0", // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console": "integratedTerminal", "stopAtEntry": false, diff --git a/DevProxy.Abstractions/DevProxy.Abstractions.csproj b/DevProxy.Abstractions/DevProxy.Abstractions.csproj index ab0d1982..2f3bb98c 100644 --- a/DevProxy.Abstractions/DevProxy.Abstractions.csproj +++ b/DevProxy.Abstractions/DevProxy.Abstractions.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 DevProxy.Abstractions enable enable @@ -10,6 +10,7 @@ true true AllEnabledByDefault + CA1873 diff --git a/DevProxy.Abstractions/packages.lock.json b/DevProxy.Abstractions/packages.lock.json index af377dc9..06dbd97e 100644 --- a/DevProxy.Abstractions/packages.lock.json +++ b/DevProxy.Abstractions/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "Markdig": { "type": "Direct", "requested": "[0.41.3, )", @@ -20,8 +20,7 @@ "Microsoft.Extensions.DependencyModel": "9.0.4", "Microsoft.Extensions.Logging": "9.0.4", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10", - "System.Text.Json": "9.0.4" + "SQLitePCLRaw.core": "2.1.10" } }, "Microsoft.Extensions.Configuration": { @@ -102,8 +101,7 @@ "contentHash": "HiICGm0e44+i4aVHpLn+aphmSC2eQnDvlTttw1rE0hntOZKoLGRy37sydqqbRP1ZokMf3Mt0GEgSWxDwnucKGg==", "dependencies": { "BouncyCastle.Cryptography": "2.4.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.Logging.Abstractions": "8.0.1" } }, "YamlDotNet": { @@ -168,8 +166,7 @@ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", "Microsoft.Extensions.DependencyModel": "9.0.4", "Microsoft.Extensions.Logging": "9.0.4", - "SQLitePCLRaw.core": "2.1.10", - "System.Text.Json": "9.0.4" + "SQLitePCLRaw.core": "2.1.10" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -304,10 +301,7 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", - "dependencies": { - "System.Memory": "4.5.3" - } + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -321,21 +315,6 @@ "dependencies": { "SQLitePCLRaw.core": "2.1.10" } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.3", - "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "pYtmpcO6R3Ef1XilZEHgXP2xBPVORbYEzRP7dl0IAAbN8Dm+kfwio8aCKle97rAWXOExr292MuxWYurIuwN62g==" } } } diff --git a/DevProxy.Plugins/DevProxy.Plugins.csproj b/DevProxy.Plugins/DevProxy.Plugins.csproj index e5c66e2a..3276a415 100644 --- a/DevProxy.Plugins/DevProxy.Plugins.csproj +++ b/DevProxy.Plugins/DevProxy.Plugins.csproj @@ -1,6 +1,6 @@  - net9.0 + net10.0 DevProxy.Plugins enable enable @@ -11,9 +11,10 @@ true true AllEnabledByDefault + CA1873 - CS1998 + CS1998;CA1873 diff --git a/DevProxy.Plugins/packages.lock.json b/DevProxy.Plugins/packages.lock.json index 10eb0fc6..3455a5aa 100644 --- a/DevProxy.Plugins/packages.lock.json +++ b/DevProxy.Plugins/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "Azure.Identity": { "type": "Direct", "requested": "[1.13.2, )", @@ -10,9 +10,7 @@ "dependencies": { "Azure.Core": "1.44.1", "Microsoft.Identity.Client": "4.67.2", - "Microsoft.Identity.Client.Extensions.Msal": "4.67.2", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" + "Microsoft.Identity.Client.Extensions.Msal": "4.67.2" } }, "Microsoft.EntityFrameworkCore.Sqlite": { @@ -27,8 +25,7 @@ "Microsoft.Extensions.DependencyModel": "9.0.4", "Microsoft.Extensions.Logging": "9.0.4", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10", - "System.Text.Json": "9.0.4" + "SQLitePCLRaw.core": "2.1.10" } }, "Microsoft.Extensions.Configuration": { @@ -112,8 +109,7 @@ "contentHash": "HiICGm0e44+i4aVHpLn+aphmSC2eQnDvlTttw1rE0hntOZKoLGRy37sydqqbRP1ZokMf3Mt0GEgSWxDwnucKGg==", "dependencies": { "BouncyCastle.Cryptography": "2.4.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "Microsoft.Extensions.Logging.Abstractions": "8.0.1" } }, "Azure.Core": { @@ -123,12 +119,7 @@ "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "System.ClientModel": "1.1.0", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "6.0.0", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.10", - "System.Threading.Tasks.Extensions": "4.5.4" + "System.Memory.Data": "6.0.0" } }, "BouncyCastle.Cryptography": { @@ -197,8 +188,7 @@ "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", "Microsoft.Extensions.DependencyModel": "9.0.4", "Microsoft.Extensions.Logging": "9.0.4", - "SQLitePCLRaw.core": "2.1.10", - "System.Text.Json": "9.0.4" + "SQLitePCLRaw.core": "2.1.10" } }, "Microsoft.Extensions.Caching.Abstractions": { @@ -369,8 +359,7 @@ "resolved": "4.67.2", "contentHash": "37t0TfekfG6XM8kue/xNaA66Qjtti5Qe1xA41CK+bEd8VD76/oXJc+meFJHGzygIC485dCpKoamG/pDfb9Qd7Q==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.IdentityModel.Abstractions": "6.35.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { @@ -440,10 +429,7 @@ "OpenTelemetry.Api": { "type": "Transitive", "resolved": "1.12.0", - "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "9.0.0" - } + "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==" }, "OpenTelemetry.Api.ProviderBuilderExtensions": { "type": "Transitive", @@ -476,10 +462,7 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", - "dependencies": { - "System.Memory": "4.5.3" - } + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -499,61 +482,19 @@ "resolved": "1.1.0", "contentHash": "UocOlCkxLZrG2CKMAAImPcldJTxeesHnHGHwhJ0pNlZEvEXcWKuQvVOER2/NiOkJGRJk978SNdw3j6/7O9H1lg==", "dependencies": { - "System.Memory.Data": "1.0.2", - "System.Text.Json": "6.0.9" + "System.Memory.Data": "1.0.2" } }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==" - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" - }, "System.Memory.Data": { "type": "Transitive", "resolved": "6.0.0", - "contentHash": "ntFHArH3I4Lpjf5m4DCXQHJuGwWPNVJPaAvM95Jy/u+2Yzt2ryiyIN04LAogkjP9DeRcEOiviAjQotfmPq/FrQ==", - "dependencies": { - "System.Text.Json": "6.0.0" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + "contentHash": "ntFHArH3I4Lpjf5m4DCXQHJuGwWPNVJPaAvM95Jy/u+2Yzt2ryiyIN04LAogkjP9DeRcEOiviAjQotfmPq/FrQ==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "pYtmpcO6R3Ef1XilZEHgXP2xBPVORbYEzRP7dl0IAAbN8Dm+kfwio8aCKle97rAWXOExr292MuxWYurIuwN62g==" - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, "YamlDotNet": { "type": "Transitive", "resolved": "16.3.0", diff --git a/DevProxy/DevProxy.csproj b/DevProxy/DevProxy.csproj index abbf8678..92619cfe 100644 --- a/DevProxy/DevProxy.csproj +++ b/DevProxy/DevProxy.csproj @@ -2,7 +2,7 @@ Exe - net9.0 + net10.0 DevProxy enable enable @@ -17,6 +17,7 @@ true true AllEnabledByDefault + CA1873 diff --git a/DevProxy/packages.lock.json b/DevProxy/packages.lock.json index 69c28690..8d5f410d 100644 --- a/DevProxy/packages.lock.json +++ b/DevProxy/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "Azure.Identity": { "type": "Direct", "requested": "[1.13.2, )", @@ -10,9 +10,7 @@ "dependencies": { "Azure.Core": "1.44.1", "Microsoft.Identity.Client": "4.67.2", - "Microsoft.Identity.Client.Extensions.Msal": "4.67.2", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" + "Microsoft.Identity.Client.Extensions.Msal": "4.67.2" } }, "Microsoft.EntityFrameworkCore.Sqlite": { @@ -22,45 +20,28 @@ "contentHash": "YruNASPuiCjLOVxO09lpQT4e2OYvpsoD0e5NGEQKOcPCu143RDzWTNlpzcxhArBgAS0FPwQ+OEGZOWhwgWHvOA==", "dependencies": { "Microsoft.EntityFrameworkCore.Sqlite.Core": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", "Microsoft.Extensions.DependencyModel": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", - "SQLitePCLRaw.core": "2.1.10", - "System.Text.Json": "9.0.4" + "SQLitePCLRaw.core": "2.1.10" } }, "Microsoft.Extensions.Configuration": { "type": "Direct", "requested": "[9.0.4, )", "resolved": "9.0.4", - "contentHash": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } + "contentHash": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==" }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", "requested": "[9.0.4, )", "resolved": "9.0.4", - "contentHash": "cdrjcl9RIcwt3ECbnpP0Gt1+pkjdW90mq5yFYy8D9qRj2NqFFcv3yDp141iEamsd9E218sGxK8WHaIOcrqgDJg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4" - } + "contentHash": "cdrjcl9RIcwt3ECbnpP0Gt1+pkjdW90mq5yFYy8D9qRj2NqFFcv3yDp141iEamsd9E218sGxK8WHaIOcrqgDJg==" }, "Microsoft.Extensions.Configuration.Json": { "type": "Direct", "requested": "[9.0.4, )", "resolved": "9.0.4", - "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4" - } + "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==" }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Direct", @@ -72,14 +53,7 @@ "type": "Direct", "requested": "[9.0.4, )", "resolved": "9.0.4", - "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Configuration": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } + "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==" }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Direct", @@ -124,8 +98,6 @@ "resolved": "1.12.0", "contentHash": "aIEu2O3xFOdwIVH0AJsIHPIMH1YuX18nzu7BHyaDNQ6NWSk4Zyrs9Pp6y8SATuSbvdtmvue4mj/QZ3838srbwA==", "dependencies": { - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0", - "Microsoft.Extensions.Logging.Configuration": "9.0.0", "OpenTelemetry.Api.ProviderBuilderExtensions": "1.12.0" } }, @@ -172,9 +144,7 @@ "resolved": "0.1.5", "contentHash": "HiICGm0e44+i4aVHpLn+aphmSC2eQnDvlTttw1rE0hntOZKoLGRy37sydqqbRP1ZokMf3Mt0GEgSWxDwnucKGg==", "dependencies": { - "BouncyCastle.Cryptography": "2.4.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.1", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" + "BouncyCastle.Cryptography": "2.4.0" } }, "Azure.Core": { @@ -184,12 +154,7 @@ "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "System.ClientModel": "1.1.0", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "6.0.0", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.10", - "System.Threading.Tasks.Extensions": "4.5.4" + "System.Memory.Data": "6.0.0" } }, "BouncyCastle.Cryptography": { @@ -221,9 +186,7 @@ "contentHash": "+5IAX0aicQYCRfN4pAjad+JPwdEYoVEM3Z1Cl8/EiEv3FVHQHdd8TJQpQIslQDDQS/UsUMb0MsOXwqOh+TJtRw==", "dependencies": { "Microsoft.EntityFrameworkCore.Abstractions": "9.0.4", - "Microsoft.EntityFrameworkCore.Analyzers": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4" + "Microsoft.EntityFrameworkCore.Analyzers": "9.0.4" } }, "Microsoft.EntityFrameworkCore.Abstractions": { @@ -241,10 +204,7 @@ "resolved": "9.0.4", "contentHash": "OjJ+xh/wQff5b0wiC3SPvoQqTA2boZeJQf+15+3+OJPtjBKzvxuwr25QRIu1p1t+K8ryQ8pzaoZ7eOpXfNzVGA==", "dependencies": { - "Microsoft.EntityFrameworkCore": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4" + "Microsoft.EntityFrameworkCore": "9.0.4" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { @@ -254,12 +214,8 @@ "dependencies": { "Microsoft.Data.Sqlite.Core": "9.0.4", "Microsoft.EntityFrameworkCore.Relational": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", "Microsoft.Extensions.DependencyModel": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "SQLitePCLRaw.core": "2.1.10", - "System.Text.Json": "9.0.4" + "SQLitePCLRaw.core": "2.1.10" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -267,157 +223,17 @@ "resolved": "6.0.5", "contentHash": "Ckb5EDBUNJdFWyajfXzUIMRkhf52fHZOQuuZg/oiu8y7zDCVwD0iHhew6MnThjHmevanpxL3f5ci2TtHQEN6bw==" }, - "Microsoft.Extensions.Caching.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Caching.Memory": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "0LN/DiIKvBrkqp7gkF3qhGIeZk6/B63PthAHjQsxymJfIBcz0kbf4/p/t4lMgggVxZ+flRi5xvTwlpPOoZk8fg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UY864WQ3AS2Fkc8fYLombWnjrXwYt+BEHHps0hY4sxlgqaVW06AxbpgRZjfYf8PyRbplJqruzZDB/nSLT+7RLQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileProviders.Physical": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "f2MTUaS2EQ3lX4325ytPAISZqgBfXmY0WvgD80ji6Z20AoDNiCESxsqo6mFRwHJD/jfVKRw9FsW6+86gNre3ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" - }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", "resolved": "9.0.4", "contentHash": "ACtnvl3H3M/f8Z42980JxsNu7V9PPbzys4vBs83ZewnsgKd7JeYK18OMPo0g+MxAHrpgMrjmlinXDiaSRPcVnA==" }, - "Microsoft.Extensions.Diagnostics.Abstractions": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "1K8P7XzuzX8W8pmXcZjcrqS6x5eSSdvhQohmcpgiQNY/HlDAlnrhR9dvlURfFz428A+RTCJpUyB+aKTA6AgVcQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", - "Microsoft.Extensions.Options": "9.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "gQN2o/KnBfVk6Bd71E2YsvO5lsqrqHmaepDGk+FB/C4aiQY9B0XKKNKfl5/TqcNOs9OEithm4opiMHAErMFyEw==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "qkQ9V7KFZdTWNThT7ke7E/Jad38s46atSs3QUYZB8f3thBTrcrousdY4Y/tyCtcH5YjsPSiByjuN+L8W/ThMQg==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.4", - "Microsoft.Extensions.FileSystemGlobbing": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "xW6QPYsqhbuWBO9/1oA43g/XPKbohJx+7G8FLQgQXIriYvY7s+gxr2wjQJfRoPO900dvvv2vVH7wZovG+M1m6w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "/kF+rSnoo3/nIwGzWsR4RgBnoTOdZ3lzz2qFRyp/GgaNid4j6hOAQrs/O+QHXhlcAdZxjg37MvtIE+pAvIgi9g==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.4", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Logging": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.4" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "aridVhAT3Ep+vsirR1pzjaOw0Jwiob6dc73VFQn2XmDfBA2X98M8YKO1GarvsXRX7gX1Aj+hj2ijMzrMHDOm0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.4", - "Microsoft.Extensions.Configuration.Binder": "9.0.4", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4", - "Microsoft.Extensions.Primitives": "9.0.4" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" - }, "Microsoft.Identity.Client": { "type": "Transitive", "resolved": "4.67.2", "contentHash": "37t0TfekfG6XM8kue/xNaA66Qjtti5Qe1xA41CK+bEd8VD76/oXJc+meFJHGzygIC485dCpKoamG/pDfb9Qd7Q==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.IdentityModel.Abstractions": "6.35.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { @@ -463,7 +279,6 @@ "resolved": "8.9.0", "contentHash": "qK6kW5qZvDj7E5RLWQ9gzJxQe5GUz7+7bXrLQQydSDF9hTf5Ip2qHuAQW3Fg9GND6jkjTr7IXAZFmBHadNQi4Q==", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.2", "Microsoft.IdentityModel.Logging": "8.9.0" } }, @@ -501,17 +316,13 @@ "OpenTelemetry.Api": { "type": "Transitive", "resolved": "1.12.0", - "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "9.0.0" - } + "contentHash": "Xt0qldi+iE2szGrM3jAqzEMEJd48YBtqI6mge0+ArXTZg3aTpRmyhL6CKKl3bLioaFSSVbBpEbPin8u6Z46Yrw==" }, "OpenTelemetry.Api.ProviderBuilderExtensions": { "type": "Transitive", "resolved": "1.12.0", "contentHash": "t6Vk1143BfiisCWYbRcyzkAuN6Aq5RkYtfOSMoqCIRMvtN9p1e1xzc0nWQ+fccNGOVgHn3aMK5xFn2+iWMcr8A==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "OpenTelemetry.Api": "1.12.0" } }, @@ -537,10 +348,7 @@ "SQLitePCLRaw.core": { "type": "Transitive", "resolved": "2.1.10", - "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", - "dependencies": { - "System.Memory": "4.5.3" - } + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", @@ -581,61 +389,19 @@ "resolved": "1.1.0", "contentHash": "UocOlCkxLZrG2CKMAAImPcldJTxeesHnHGHwhJ0pNlZEvEXcWKuQvVOER2/NiOkJGRJk978SNdw3j6/7O9H1lg==", "dependencies": { - "System.Memory.Data": "1.0.2", - "System.Text.Json": "6.0.9" + "System.Memory.Data": "1.0.2" } }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==" - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" - }, "System.Memory.Data": { "type": "Transitive", "resolved": "6.0.0", - "contentHash": "ntFHArH3I4Lpjf5m4DCXQHJuGwWPNVJPaAvM95Jy/u+2Yzt2ryiyIN04LAogkjP9DeRcEOiviAjQotfmPq/FrQ==", - "dependencies": { - "System.Text.Json": "6.0.0" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + "contentHash": "ntFHArH3I4Lpjf5m4DCXQHJuGwWPNVJPaAvM95Jy/u+2Yzt2ryiyIN04LAogkjP9DeRcEOiviAjQotfmPq/FrQ==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "9.0.4", - "contentHash": "pYtmpcO6R3Ef1XilZEHgXP2xBPVORbYEzRP7dl0IAAbN8Dm+kfwio8aCKle97rAWXOExr292MuxWYurIuwN62g==" - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, "YamlDotNet": { "type": "Transitive", "resolved": "16.3.0", @@ -646,10 +412,6 @@ "dependencies": { "Markdig": "[0.41.3, )", "Microsoft.EntityFrameworkCore.Sqlite": "[9.0.4, )", - "Microsoft.Extensions.Configuration": "[9.0.4, )", - "Microsoft.Extensions.Configuration.Binder": "[9.0.4, )", - "Microsoft.Extensions.Configuration.Json": "[9.0.4, )", - "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", "Microsoft.OpenApi.Readers": "[1.6.24, )", "Newtonsoft.Json.Schema": "[4.0.1, )", "Scriban": "[6.2.1, )", From f3a35173f5969cc00a5846a1d6377396bbc88f56 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 10:28:17 +0000 Subject: [PATCH 3/7] Suppress NU1510 warnings for .NET 10 package pruning Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- DevProxy/DevProxy.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DevProxy/DevProxy.csproj b/DevProxy/DevProxy.csproj index 92619cfe..a8f9ad09 100644 --- a/DevProxy/DevProxy.csproj +++ b/DevProxy/DevProxy.csproj @@ -17,7 +17,7 @@ true true AllEnabledByDefault - CA1873 + CA1873;NU1510 From cb26befd75daea299df2a87c9eba944f3c6819ea Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 11:09:31 +0000 Subject: [PATCH 4/7] Fix CA1873 warnings in Abstractions and remove redundant packages Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- DevProxy.Abstractions/Data/MSGraphDb.cs | 150 ++++++++++++++---- .../DevProxy.Abstractions.csproj | 1 - .../LanguageModel/BaseLanguageModelClient.cs | 20 ++- .../OllamaLanguageModelClient.cs | 90 ++++++++--- .../OpenAILanguageModelClient.cs | 60 +++++-- .../LanguageModel/OpenAIModels.cs | 7 +- DevProxy.Abstractions/Models/MockResponse.cs | 17 +- DevProxy.Abstractions/Plugins/BaseLoader.cs | 25 ++- DevProxy.Abstractions/Plugins/BasePlugin.cs | 10 +- DevProxy.Abstractions/Utils/ProxyUtils.cs | 44 ++++- DevProxy.Plugins/DevProxy.Plugins.csproj | 3 +- DevProxy/DevProxy.csproj | 6 - DevProxy/packages.lock.json | 30 ---- 13 files changed, 341 insertions(+), 122 deletions(-) diff --git a/DevProxy.Abstractions/Data/MSGraphDb.cs b/DevProxy.Abstractions/Data/MSGraphDb.cs index eaced4e8..bd95d8ae 100644 --- a/DevProxy.Abstractions/Data/MSGraphDb.cs +++ b/DevProxy.Abstractions/Data/MSGraphDb.cs @@ -44,7 +44,10 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke var appFolder = ProxyUtils.AppFolder; if (string.IsNullOrEmpty(appFolder)) { - _logger.LogError("App folder {AppFolder} not found", appFolder); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError("App folder {AppFolder} not found", appFolder); + } return 1; } @@ -54,7 +57,10 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke var modifiedToday = IsModifiedToday(dbFileInfo); if (modifiedToday && skipIfUpdatedToday) { - _logger.LogInformation("Microsoft Graph database has already been updated today"); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Microsoft Graph database has already been updated today"); + } return 1; } @@ -62,34 +68,52 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke if (hasErrors) { - _logger.LogWarning("Unable to update Microsoft Graph database"); + if (_logger.IsEnabled(LogLevel.Warning)) + { + _logger.LogWarning("Unable to update Microsoft Graph database"); + } return 1; } if (!isApiModified) { UpdateLastWriteTime(dbFileInfo); - _logger.LogDebug("Updated the last-write-time attribute of Microsoft Graph database {File}", dbFileInfo); - _logger.LogInformation("Microsoft Graph database is already up-to-date"); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Updated the last-write-time attribute of Microsoft Graph database {File}", dbFileInfo); + } + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Microsoft Graph database is already up-to-date"); + } return 1; } await LoadOpenAPIFilesAsync(appFolder, cancellationToken); if (_openApiDocuments.Count < 1) { - _logger.LogDebug("No OpenAPI files found or couldn't load them"); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("No OpenAPI files found or couldn't load them"); + } return 1; } await CreateDbAsync(cancellationToken); await FillDataAsync(cancellationToken); - _logger.LogInformation("Microsoft Graph database is successfully updated"); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Microsoft Graph database is successfully updated"); + } return 0; } catch (Exception ex) { - _logger.LogError(ex, "Error generating Microsoft Graph database"); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError(ex, "Error generating Microsoft Graph database"); + } return 1; } } @@ -100,20 +124,32 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke private async Task CreateDbAsync(CancellationToken cancellationToken) { - _logger.LogInformation("Creating database..."); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Creating database..."); + } - _logger.LogDebug("Dropping endpoints table..."); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Dropping endpoints table..."); + } var dropTable = Connection.CreateCommand(); dropTable.CommandText = "DROP TABLE IF EXISTS endpoints"; _ = await dropTable.ExecuteNonQueryAsync(cancellationToken); - _logger.LogDebug("Creating endpoints table..."); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Creating endpoints table..."); + } var createTable = Connection.CreateCommand(); // when you change the schema, increase the db version number in ProxyUtils createTable.CommandText = "CREATE TABLE IF NOT EXISTS endpoints (path TEXT, graphVersion TEXT, hasSelect BOOLEAN)"; _ = await createTable.ExecuteNonQueryAsync(cancellationToken); - _logger.LogDebug("Creating index on endpoints and version..."); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Creating index on endpoints and version..."); + } // Add an index on the path and graphVersion columns var createIndex = Connection.CreateCommand(); createIndex.CommandText = "CREATE INDEX IF NOT EXISTS idx_endpoints_path_version ON endpoints (path, graphVersion)"; @@ -122,7 +158,10 @@ private async Task CreateDbAsync(CancellationToken cancellationToken) private async Task FillDataAsync(CancellationToken cancellationToken) { - _logger.LogInformation("Filling database..."); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Filling database..."); + } SetDbJournaling(false); @@ -137,7 +176,10 @@ private async Task FillDataAsync(CancellationToken cancellationToken) var graphVersion = openApiDocument.Key; var document = openApiDocument.Value; - _logger.LogDebug("Filling database for {GraphVersion}...", graphVersion); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Filling database for {GraphVersion}...", graphVersion); + } var insertEndpoint = Connection.CreateCommand(); insertEndpoint.CommandText = "INSERT INTO endpoints (path, graphVersion, hasSelect) VALUES (@path, @graphVersion, @hasSelect)"; @@ -150,20 +192,29 @@ private async Task FillDataAsync(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - _logger.LogTrace("Endpoint {GraphVersion}{Key}...", graphVersion, path.Key); + if (_logger.IsEnabled(LogLevel.Trace)) + { + _logger.LogTrace("Endpoint {GraphVersion}{Key}...", graphVersion, path.Key); + } // Get the GET operation for this path var getOperation = path.Value.Operations.FirstOrDefault(o => o.Key == OperationType.Get).Value; if (getOperation == null) { - _logger.LogTrace("No GET operation found for {GraphVersion}{Key}", graphVersion, path.Key); + if (_logger.IsEnabled(LogLevel.Trace)) + { + _logger.LogTrace("No GET operation found for {GraphVersion}{Key}", graphVersion, path.Key); + } continue; } // Check if the GET operation has a $select parameter var hasSelect = getOperation.Parameters.Any(p => p.Name == "$select"); - _logger.LogTrace("Inserting endpoint {GraphVersion}{Key} with hasSelect={HasSelect}...", graphVersion, path.Key, hasSelect); + if (_logger.IsEnabled(LogLevel.Trace)) + { + _logger.LogTrace("Inserting endpoint {GraphVersion}{Key} with hasSelect={HasSelect}...", graphVersion, path.Key, hasSelect); + } pathParam.Value = path.Key; graphVersionParam.Value = graphVersion; hasSelectParam.Value = hasSelect; @@ -176,12 +227,18 @@ private async Task FillDataAsync(CancellationToken cancellationToken) SetDbJournaling(true); - _logger.LogInformation("Inserted {EndpointCount} endpoints in the database", i); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Inserted {EndpointCount} endpoints in the database", i); + } } private async Task<(bool isApiUpdated, bool hasErrors)> UpdateOpenAPIGraphFilesIfNecessaryAsync(string folder, CancellationToken cancellationToken) { - _logger.LogInformation("Checking for updated OpenAPI files..."); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Checking for updated OpenAPI files..."); + } var isApiUpdated = false; var hasErrors = false; @@ -191,15 +248,24 @@ private async Task FillDataAsync(CancellationToken cancellationToken) try { var yamlFile = new FileInfo(Path.Combine(folder, GetGraphOpenApiYamlFileName(version))); - _logger.LogDebug("Checking for updated OpenAPI file {File}...", yamlFile); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Checking for updated OpenAPI file {File}...", yamlFile); + } if (IsModifiedToday(yamlFile)) { - _logger.LogInformation("File {File} has already been updated today", yamlFile); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("File {File} has already been updated today", yamlFile); + } continue; } var url = GetOpenApiSpecUrl(version); - _logger.LogInformation("Downloading OpenAPI file from {Url}...", url); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Downloading OpenAPI file from {Url}...", url); + } var etagFile = new FileInfo(Path.Combine(folder, GetGraphOpenApiEtagFileName(version))); isApiUpdated |= await DownloadOpenAPIFileAsync(url, yamlFile, etagFile, cancellationToken); @@ -207,7 +273,10 @@ private async Task FillDataAsync(CancellationToken cancellationToken) catch (Exception ex) { hasErrors = true; - _logger.LogError(ex, "Error updating OpenAPI files"); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError(ex, "Error updating OpenAPI files"); + } } } return (isApiUpdated, hasErrors); @@ -232,7 +301,10 @@ private async Task DownloadOpenAPIFileAsync(string url, FileInfo yamlFile, if (response.StatusCode == HttpStatusCode.NotModified) { UpdateLastWriteTime(yamlFile); - _logger.LogDebug("File {File} already up-to-date. Updated the last-write-time attribute", yamlFile); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("File {File} already up-to-date. Updated the last-write-time attribute", yamlFile); + } return false; } @@ -252,23 +324,35 @@ private async Task DownloadOpenAPIFileAsync(string url, FileInfo yamlFile, etagFile.Delete(); } - _logger.LogDebug("Downloaded OpenAPI file from {Url} to {File}", url, yamlFile); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Downloaded OpenAPI file from {Url} to {File}", url, yamlFile); + } return true; } private async Task LoadOpenAPIFilesAsync(string folder, CancellationToken cancellationToken) { - _logger.LogInformation("Loading OpenAPI files..."); + if (_logger.IsEnabled(LogLevel.Information)) + { + _logger.LogInformation("Loading OpenAPI files..."); + } foreach (var version in graphVersions) { var filePath = Path.Combine(folder, GetGraphOpenApiYamlFileName(version)); var file = new FileInfo(filePath); - _logger.LogDebug("Loading OpenAPI file for {FilePath}...", filePath); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Loading OpenAPI file for {FilePath}...", filePath); + } if (!file.Exists) { - _logger.LogDebug("File {FilePath} does not exist", filePath); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("File {FilePath} does not exist", filePath); + } continue; } @@ -278,11 +362,17 @@ private async Task LoadOpenAPIFilesAsync(string folder, CancellationToken cancel var openApiDocument = await new OpenApiStreamReader().ReadAsync(fileStream, cancellationToken); _openApiDocuments[version] = openApiDocument.OpenApiDocument; - _logger.LogDebug("Added OpenAPI file {FilePath} for {Version}", filePath, version); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Added OpenAPI file {FilePath} for {Version}", filePath, version); + } } catch (Exception ex) { - _logger.LogError(ex, "Error loading OpenAPI file {FilePath}", filePath); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError(ex, "Error loading OpenAPI file {FilePath}", filePath); + } } } } diff --git a/DevProxy.Abstractions/DevProxy.Abstractions.csproj b/DevProxy.Abstractions/DevProxy.Abstractions.csproj index 2f3bb98c..dab9325a 100644 --- a/DevProxy.Abstractions/DevProxy.Abstractions.csproj +++ b/DevProxy.Abstractions/DevProxy.Abstractions.csproj @@ -10,7 +10,6 @@ true true AllEnabledByDefault - CA1873 diff --git a/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs b/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs index 93a2574a..a09a6207 100644 --- a/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs +++ b/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs @@ -24,7 +24,10 @@ public abstract class BaseLanguageModelClient(LanguageModelConfiguration configu if (!promptFileName.EndsWith(".prompty", StringComparison.OrdinalIgnoreCase)) { - Logger.LogDebug("Prompt file name '{PromptFileName}' does not end with '.prompty'. Appending the extension.", promptFileName); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Prompt file name '{PromptFileName}' does not end with '.prompty'. Appending the extension.", promptFileName); + } promptFileName += ".prompty"; } @@ -93,7 +96,10 @@ public async Task IsEnabledAsync(CancellationToken cancellationToken) private (IEnumerable?, CompletionOptions?) LoadPrompt(string promptFileName, Dictionary parameters) { - Logger.LogDebug("Prompt file {PromptFileName} not in the cache. Loading...", promptFileName); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Prompt file {PromptFileName} not in the cache. Loading...", promptFileName); + } var filePath = Path.Combine(ProxyUtils.AppFolder!, "prompts", promptFileName); if (!File.Exists(filePath)) @@ -101,14 +107,20 @@ public async Task IsEnabledAsync(CancellationToken cancellationToken) throw new FileNotFoundException($"Prompt file '{filePath}' not found."); } - Logger.LogDebug("Loading prompt file: {FilePath}", filePath); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Loading prompt file: {FilePath}", filePath); + } var promptContents = File.ReadAllText(filePath); var prompty = Prompt.FromMarkdown(promptContents); if (prompty.Prepare(parameters) is not IEnumerable promptyMessages || !promptyMessages.Any()) { - Logger.LogError("No messages found in the prompt file: {FilePath}", filePath); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("No messages found in the prompt file: {FilePath}", filePath); + } return (null, null); } diff --git a/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs b/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs index 055ade6f..98bf173b 100644 --- a/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs +++ b/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs @@ -24,7 +24,10 @@ public sealed class OllamaLanguageModelClient( if (Configuration.CacheResponses && _cacheCompletion.TryGetValue(prompt, out var cachedResponse)) { - Logger.LogDebug("Returning cached response for prompt: {Prompt}", prompt); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Returning cached response for prompt: {Prompt}", prompt); + } return cachedResponse; } @@ -36,7 +39,10 @@ public sealed class OllamaLanguageModelClient( if (response.Error is not null) { - Logger.LogError("{Error}", response.Error); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("{Error}", response.Error); + } return null; } @@ -54,7 +60,10 @@ public sealed class OllamaLanguageModelClient( if (Configuration.CacheResponses && _cacheChatCompletion.TryGetCacheValue(messages, out var cachedResponse)) { - Logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); + } return cachedResponse; } @@ -65,7 +74,10 @@ public sealed class OllamaLanguageModelClient( } if (response.Error is not null) { - Logger.LogError("{Error}", response.Error); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("{Error}", response.Error); + } return null; } else @@ -97,24 +109,36 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell if (string.IsNullOrEmpty(Configuration.Url)) { - Logger.LogError("URL is not set. Language model will be disabled"); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("URL is not set. Language model will be disabled"); + } return false; } if (string.IsNullOrEmpty(Configuration.Model)) { - Logger.LogError("Model is not set. Language model will be disabled"); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("Model is not set. Language model will be disabled"); + } return false; } - Logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); + } try { var testCompletion = await GenerateCompletionInternalAsync("Are you there? Reply with a yes or no.", null, cancellationToken); if (testCompletion?.Error is not null) { - Logger.LogError("Error: {Error}", testCompletion.Error); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("Error: {Error}", testCompletion.Error); + } return false; } @@ -122,7 +146,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell } catch (Exception ex) { - Logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); + } return false; } } @@ -134,7 +161,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell try { var url = $"{Configuration.Url?.TrimEnd('/')}/api/generate"; - Logger.LogDebug("Requesting completion. Prompt: {Prompt}", prompt); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Requesting completion. Prompt: {Prompt}", prompt); + } var response = await _httpClient.PostAsJsonAsync(url, new @@ -146,30 +176,45 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell }, cancellationToken ); - Logger.LogDebug("Response status: {Response}", response.StatusCode); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Response status: {Response}", response.StatusCode); + } if (!response.IsSuccessStatusCode) { var errorResponse = await response.Content.ReadAsStringAsync(cancellationToken); - Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); + } return null; } var res = await response.Content.ReadFromJsonAsync(cancellationToken); if (res is null) { - Logger.LogDebug("Response: null"); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Response: null"); + } return res; } - Logger.LogDebug("Response: {Response}", res.Response); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Response: {Response}", res.Response); + } res.RequestUrl = url; return res; } catch (Exception ex) { - Logger.LogError(ex, "Failed to generate completion"); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError(ex, "Failed to generate completion"); + } return null; } } @@ -181,7 +226,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell try { var url = $"{Configuration.Url?.TrimEnd('/')}/api/chat"; - Logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); + } var response = await _httpClient.PostAsJsonAsync(url, new @@ -192,12 +240,18 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell options } ); - Logger.LogDebug("Response: {Response}", response.StatusCode); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Response: {Response}", response.StatusCode); + } if (!response.IsSuccessStatusCode) { var errorResponse = await response.Content.ReadAsStringAsync(); - Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); + } return null; } diff --git a/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs b/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs index 7043f145..a19d43b5 100644 --- a/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs +++ b/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs @@ -28,7 +28,10 @@ public sealed class OpenAILanguageModelClient( } if (response.ErrorMessage is not null) { - _logger.LogError("Error: {Error}", response.ErrorMessage); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError("Error: {Error}", response.ErrorMessage); + } return null; } var openAIResponse = (OpenAIChatCompletionResponse)response; @@ -62,7 +65,10 @@ public sealed class OpenAILanguageModelClient( if (Configuration.CacheResponses && _cacheChatCompletion.TryGetCacheValue(messages, out var cachedResponse)) { - _logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); + } return cachedResponse; } @@ -73,7 +79,10 @@ public sealed class OpenAILanguageModelClient( } if (response.Error is not null) { - _logger.LogError("Error: {Error}. Code: {Code}", response.Error.Message, response.Error.Code); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError("Error: {Error}. Code: {Code}", response.Error.Message, response.Error.Code); + } return null; } else @@ -107,17 +116,26 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell if (string.IsNullOrEmpty(Configuration.Url)) { - _logger.LogError("URL is not set. Language model will be disabled"); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError("URL is not set. Language model will be disabled"); + } return false; } if (string.IsNullOrEmpty(Configuration.Model)) { - _logger.LogError("Model is not set. Language model will be disabled"); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError("Model is not set. Language model will be disabled"); + } return false; } - _logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); + } try { @@ -128,7 +146,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell }], null, cancellationToken); if (testCompletion?.ErrorMessage is not null) { - _logger.LogError("Error: {Error}", testCompletion.ErrorMessage); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError("Error: {Error}", testCompletion.ErrorMessage); + } return false; } @@ -136,7 +157,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell } catch (Exception ex) { - _logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); + } return false; } } @@ -148,7 +172,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell try { var url = $"{Configuration.Url?.TrimEnd('/')}/chat/completions"; - _logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); + } var payload = new OpenAIChatCompletionRequest { @@ -159,12 +186,18 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell }; var response = await _httpClient.PostAsJsonAsync(url, payload, ProxyUtils.JsonSerializerOptions, cancellationToken); - _logger.LogDebug("Response: {Response}", response.StatusCode); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("Response: {Response}", response.StatusCode); + } if (!response.IsSuccessStatusCode) { var errorResponse = await response.Content.ReadAsStringAsync(cancellationToken); - _logger.LogDebug("LM error: {ErrorResponse}", errorResponse); + if (_logger.IsEnabled(LogLevel.Debug)) + { + _logger.LogDebug("LM error: {ErrorResponse}", errorResponse); + } return null; } @@ -179,7 +212,10 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell } catch (Exception ex) { - _logger.LogError(ex, "Failed to generate chat completion"); + if (_logger.IsEnabled(LogLevel.Error)) + { + _logger.LogError(ex, "Failed to generate chat completion"); + } return null; } } diff --git a/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs b/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs index 3d2496b6..5c9fcc2c 100644 --- a/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs +++ b/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs @@ -26,7 +26,12 @@ public class OpenAIRequest public static bool TryGetOpenAIRequest(string content, ILogger logger, out OpenAIRequest? request) { - logger.LogTrace("{Method} called", nameof(TryGetOpenAIRequest)); + ArgumentNullException.ThrowIfNull(logger); + + if (logger.IsEnabled(LogLevel.Trace)) + { + logger.LogTrace("{Method} called", nameof(TryGetOpenAIRequest)); + } request = null; diff --git a/DevProxy.Abstractions/Models/MockResponse.cs b/DevProxy.Abstractions/Models/MockResponse.cs index f5abbed4..b9436b38 100644 --- a/DevProxy.Abstractions/Models/MockResponse.cs +++ b/DevProxy.Abstractions/Models/MockResponse.cs @@ -21,7 +21,12 @@ public object Clone() public static MockResponse FromHttpResponse(string httpResponse, ILogger logger) { - logger.LogTrace("{Method} called", nameof(FromHttpResponse)); + ArgumentNullException.ThrowIfNull(logger); + + if (logger.IsEnabled(LogLevel.Trace)) + { + logger.LogTrace("{Method} called", nameof(FromHttpResponse)); + } if (string.IsNullOrWhiteSpace(httpResponse)) { @@ -40,7 +45,10 @@ public static MockResponse FromHttpResponse(string httpResponse, ILogger logger) for (var i = 0; i < lines.Length; i++) { var line = lines[i]; - logger.LogTrace("Processing line {LineNumber}: {LineContent}", i + 1, line); + if (logger.IsEnabled(LogLevel.Trace)) + { + logger.LogTrace("Processing line {LineNumber}: {LineContent}", i + 1, line); + } if (i == 0) { @@ -111,7 +119,10 @@ public static MockResponse FromHttpResponse(string httpResponse, ILogger logger) } }; - logger.LogTrace("Left {Method}", nameof(FromHttpResponse)); + if (logger.IsEnabled(LogLevel.Trace)) + { + logger.LogTrace("Left {Method}", nameof(FromHttpResponse)); + } return mockResponse; } diff --git a/DevProxy.Abstractions/Plugins/BaseLoader.cs b/DevProxy.Abstractions/Plugins/BaseLoader.cs index bbcada7c..1e741ca9 100644 --- a/DevProxy.Abstractions/Plugins/BaseLoader.cs +++ b/DevProxy.Abstractions/Plugins/BaseLoader.cs @@ -38,7 +38,10 @@ public async Task InitFileWatcherAsync(CancellationToken cancellationToken) var path = Path.GetDirectoryName(FilePath) ?? throw new InvalidOperationException($"{FilePath} is an invalid path"); if (!File.Exists(FilePath)) { - Logger.LogWarning("File {File} not found. No data will be provided", FilePath); + if (Logger.IsEnabled(LogLevel.Warning)) + { + Logger.LogWarning("File {File} not found. No data will be provided", FilePath); + } return; } @@ -81,7 +84,10 @@ private async Task ValidateFileContentsAsync(string fileContents, Cancella if (!root.TryGetProperty("$schema", out var schemaUrlElement)) { - Logger.LogDebug("Schema reference not found in file {File}. Skipping schema validation", FilePath); + if (Logger.IsEnabled(LogLevel.Debug)) + { + Logger.LogDebug("Schema reference not found in file {File}. Skipping schema validation", FilePath); + } return true; } @@ -91,7 +97,10 @@ private async Task ValidateFileContentsAsync(string fileContents, Cancella if (!IsValid) { - Logger.LogError("Schema validation failed for {File} with the following errors: {Errors}", FilePath, string.Join(", ", ValidationErrors)); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("Schema validation failed for {File} with the following errors: {Errors}", FilePath, string.Join(", ", ValidationErrors)); + } } return IsValid; @@ -101,7 +110,10 @@ private async Task LoadFileContentsAsync(CancellationToken cancellationToken) { if (!File.Exists(FilePath)) { - Logger.LogWarning("File {File} not found. No data will be loaded", FilePath); + if (Logger.IsEnabled(LogLevel.Warning)) + { + Logger.LogWarning("File {File} not found. No data will be loaded", FilePath); + } return; } @@ -118,7 +130,10 @@ private async Task LoadFileContentsAsync(CancellationToken cancellationToken) } catch (Exception ex) { - Logger.LogError(ex, "An error has occurred while reading {File}:", FilePath); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError(ex, "An error has occurred while reading {File}:", FilePath); + } } } diff --git a/DevProxy.Abstractions/Plugins/BasePlugin.cs b/DevProxy.Abstractions/Plugins/BasePlugin.cs index d093f9da..bf88ab55 100644 --- a/DevProxy.Abstractions/Plugins/BasePlugin.cs +++ b/DevProxy.Abstractions/Plugins/BasePlugin.cs @@ -110,7 +110,10 @@ public override async Task InitializeAsync(InitArgs e, CancellationToken cancell var (IsValid, ValidationErrors) = await ValidatePluginConfigAsync(cancellationToken); if (!IsValid) { - Logger.LogError("Plugin configuration validation failed with the following errors: {Errors}", string.Join(", ", ValidationErrors)); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("Plugin configuration validation failed with the following errors: {Errors}", string.Join(", ", ValidationErrors)); + } } } @@ -163,7 +166,10 @@ public override async Task InitializeAsync(InitArgs e, CancellationToken cancell if (!root.TryGetProperty(configSectionName, out var configSection)) { - Logger.LogError("Configuration section {SectionName} not found in configuration file", configSectionName); + if (Logger.IsEnabled(LogLevel.Error)) + { + Logger.LogError("Configuration section {SectionName} not found in configuration file", configSectionName); + } return (false, [string.Format(CultureInfo.InvariantCulture, "Configuration section {0} not found in configuration file", configSectionName)]); } diff --git a/DevProxy.Abstractions/Utils/ProxyUtils.cs b/DevProxy.Abstractions/Utils/ProxyUtils.cs index ec21a389..5c9b7282 100644 --- a/DevProxy.Abstractions/Utils/ProxyUtils.cs +++ b/DevProxy.Abstractions/Utils/ProxyUtils.cs @@ -212,26 +212,43 @@ public static string SanitizeUrl(string absoluteUrl) public static async Task<(bool IsValid, IEnumerable ValidationErrors)> ValidateJsonAsync(string? json, string? schemaUrl, HttpClient httpClient, ILogger logger, CancellationToken cancellationToken) { + ArgumentNullException.ThrowIfNull(logger); + try { - logger.LogDebug("Validating JSON against schema {SchemaUrl}", schemaUrl); + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug("Validating JSON against schema {SchemaUrl}", schemaUrl); + } if (string.IsNullOrEmpty(json)) { - logger.LogDebug("JSON is empty, skipping validation"); + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug("JSON is empty, skipping validation"); + } return (true, []); } if (string.IsNullOrEmpty(schemaUrl)) { - logger.LogDebug("Schema URL is empty, skipping validation"); + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug("Schema URL is empty, skipping validation"); + } return (true, []); } ArgumentNullException.ThrowIfNull(httpClient); - logger.LogDebug("Downloading schema from {SchemaUrl}", schemaUrl); + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug("Downloading schema from {SchemaUrl}", schemaUrl); + } var schemaContents = await httpClient.GetStringAsync(schemaUrl, cancellationToken); - logger.LogDebug("Parsing schema"); + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug("Parsing schema"); + } var schema = JSchema.Parse(schemaContents); logger.LogDebug("Parsing JSON"); var token = JToken.Parse(json); @@ -267,6 +284,8 @@ public static string ReplaceVariables(string s, Dictionary varia public static void ValidateSchemaVersion(string schemaUrl, ILogger logger) { + ArgumentNullException.ThrowIfNull(logger); + if (string.IsNullOrWhiteSpace(schemaUrl)) { logger.LogDebug("Schema is empty, skipping schema version validation."); @@ -285,17 +304,26 @@ public static void ValidateSchemaVersion(string schemaUrl, ILogger logger) if (CompareSemVer(currentVersion, schemaVersion) != 0) { var currentSchemaUrl = uri.ToString().Replace($"/v{schemaVersion}/", $"/v{currentVersion}/", StringComparison.OrdinalIgnoreCase); - logger.LogWarning("The version of schema does not match the installed Dev Proxy version, the expected schema is {Schema}", currentSchemaUrl); + if (logger.IsEnabled(LogLevel.Warning)) + { + logger.LogWarning("The version of schema does not match the installed Dev Proxy version, the expected schema is {Schema}", currentSchemaUrl); + } } } else { - logger.LogDebug("Invalid schema {SchemaUrl}, skipping schema version validation.", schemaUrl); + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug("Invalid schema {SchemaUrl}, skipping schema version validation.", schemaUrl); + } } } catch (Exception ex) { - logger.LogWarning("Invalid schema {SchemaUrl}, skipping schema version validation. Error: {Error}", schemaUrl, ex.Message); + if (logger.IsEnabled(LogLevel.Warning)) + { + logger.LogWarning("Invalid schema {SchemaUrl}, skipping schema version validation. Error: {Error}", schemaUrl, ex.Message); + } } } diff --git a/DevProxy.Plugins/DevProxy.Plugins.csproj b/DevProxy.Plugins/DevProxy.Plugins.csproj index 3276a415..537a3096 100644 --- a/DevProxy.Plugins/DevProxy.Plugins.csproj +++ b/DevProxy.Plugins/DevProxy.Plugins.csproj @@ -11,10 +11,9 @@ true true AllEnabledByDefault - CA1873 - CS1998;CA1873 + CS1998 diff --git a/DevProxy/DevProxy.csproj b/DevProxy/DevProxy.csproj index a8f9ad09..e12d9985 100644 --- a/DevProxy/DevProxy.csproj +++ b/DevProxy/DevProxy.csproj @@ -17,7 +17,6 @@ true true AllEnabledByDefault - CA1873;NU1510 @@ -35,11 +34,6 @@ - - - - - diff --git a/DevProxy/packages.lock.json b/DevProxy/packages.lock.json index 8d5f410d..d55e4a3e 100644 --- a/DevProxy/packages.lock.json +++ b/DevProxy/packages.lock.json @@ -25,36 +25,6 @@ "SQLitePCLRaw.core": "2.1.10" } }, - "Microsoft.Extensions.Configuration": { - "type": "Direct", - "requested": "[9.0.4, )", - "resolved": "9.0.4", - "contentHash": "KIVBrMbItnCJDd1RF4KEaE8jZwDJcDUJW5zXpbwQ05HNYTK1GveHxHK0B3SjgDJuR48GRACXAO+BLhL8h34S7g==" - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Direct", - "requested": "[9.0.4, )", - "resolved": "9.0.4", - "contentHash": "cdrjcl9RIcwt3ECbnpP0Gt1+pkjdW90mq5yFYy8D9qRj2NqFFcv3yDp141iEamsd9E218sGxK8WHaIOcrqgDJg==" - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Direct", - "requested": "[9.0.4, )", - "resolved": "9.0.4", - "contentHash": "vVXI70CgT/dmXV3MM+n/BR2rLXEoAyoK0hQT+8MrbCMuJBiLRxnTtSrksNiASWCwOtxo/Tyy7CO8AGthbsYxnw==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Direct", - "requested": "[9.0.6, )", - "resolved": "9.0.6", - "contentHash": "1HJCAbwukNEoYbHgHbKHmenU0V/0huw8+i7Qtf5rLUG1E+3kEwRJQxpwD3wbTEagIgPSQisNgJTvmUX9yYVc6g==" - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[9.0.4, )", - "resolved": "9.0.4", - "contentHash": "cI0lQe0js65INCTCtAgnlVJWKgzgoRHVAW1B1zwCbmcliO4IZoTf92f1SYbLeLk7FzMJ/GlCvjLvJegJ6kltmQ==" - }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Direct", "requested": "[8.8.0, )", From f147af76d074e912a6749df943aeff23bc185919 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 11:54:03 +0000 Subject: [PATCH 5/7] Acknowledge over-fixing issue in Abstractions Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- DevProxy.Abstractions/Data/MSGraphDb.cs | 150 ++++-------------- .../LanguageModel/BaseLanguageModelClient.cs | 20 +-- .../OllamaLanguageModelClient.cs | 90 +++-------- .../OpenAILanguageModelClient.cs | 60 ++----- .../LanguageModel/OpenAIModels.cs | 7 +- DevProxy.Abstractions/Models/MockResponse.cs | 17 +- DevProxy.Abstractions/Plugins/BaseLoader.cs | 25 +-- DevProxy.Abstractions/Plugins/BasePlugin.cs | 10 +- DevProxy.Abstractions/Utils/ProxyUtils.cs | 44 +---- 9 files changed, 83 insertions(+), 340 deletions(-) diff --git a/DevProxy.Abstractions/Data/MSGraphDb.cs b/DevProxy.Abstractions/Data/MSGraphDb.cs index bd95d8ae..eaced4e8 100644 --- a/DevProxy.Abstractions/Data/MSGraphDb.cs +++ b/DevProxy.Abstractions/Data/MSGraphDb.cs @@ -44,10 +44,7 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke var appFolder = ProxyUtils.AppFolder; if (string.IsNullOrEmpty(appFolder)) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError("App folder {AppFolder} not found", appFolder); - } + _logger.LogError("App folder {AppFolder} not found", appFolder); return 1; } @@ -57,10 +54,7 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke var modifiedToday = IsModifiedToday(dbFileInfo); if (modifiedToday && skipIfUpdatedToday) { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Microsoft Graph database has already been updated today"); - } + _logger.LogInformation("Microsoft Graph database has already been updated today"); return 1; } @@ -68,52 +62,34 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke if (hasErrors) { - if (_logger.IsEnabled(LogLevel.Warning)) - { - _logger.LogWarning("Unable to update Microsoft Graph database"); - } + _logger.LogWarning("Unable to update Microsoft Graph database"); return 1; } if (!isApiModified) { UpdateLastWriteTime(dbFileInfo); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Updated the last-write-time attribute of Microsoft Graph database {File}", dbFileInfo); - } - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Microsoft Graph database is already up-to-date"); - } + _logger.LogDebug("Updated the last-write-time attribute of Microsoft Graph database {File}", dbFileInfo); + _logger.LogInformation("Microsoft Graph database is already up-to-date"); return 1; } await LoadOpenAPIFilesAsync(appFolder, cancellationToken); if (_openApiDocuments.Count < 1) { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("No OpenAPI files found or couldn't load them"); - } + _logger.LogDebug("No OpenAPI files found or couldn't load them"); return 1; } await CreateDbAsync(cancellationToken); await FillDataAsync(cancellationToken); - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Microsoft Graph database is successfully updated"); - } + _logger.LogInformation("Microsoft Graph database is successfully updated"); return 0; } catch (Exception ex) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError(ex, "Error generating Microsoft Graph database"); - } + _logger.LogError(ex, "Error generating Microsoft Graph database"); return 1; } } @@ -124,32 +100,20 @@ public async Task GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke private async Task CreateDbAsync(CancellationToken cancellationToken) { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Creating database..."); - } + _logger.LogInformation("Creating database..."); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Dropping endpoints table..."); - } + _logger.LogDebug("Dropping endpoints table..."); var dropTable = Connection.CreateCommand(); dropTable.CommandText = "DROP TABLE IF EXISTS endpoints"; _ = await dropTable.ExecuteNonQueryAsync(cancellationToken); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Creating endpoints table..."); - } + _logger.LogDebug("Creating endpoints table..."); var createTable = Connection.CreateCommand(); // when you change the schema, increase the db version number in ProxyUtils createTable.CommandText = "CREATE TABLE IF NOT EXISTS endpoints (path TEXT, graphVersion TEXT, hasSelect BOOLEAN)"; _ = await createTable.ExecuteNonQueryAsync(cancellationToken); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Creating index on endpoints and version..."); - } + _logger.LogDebug("Creating index on endpoints and version..."); // Add an index on the path and graphVersion columns var createIndex = Connection.CreateCommand(); createIndex.CommandText = "CREATE INDEX IF NOT EXISTS idx_endpoints_path_version ON endpoints (path, graphVersion)"; @@ -158,10 +122,7 @@ private async Task CreateDbAsync(CancellationToken cancellationToken) private async Task FillDataAsync(CancellationToken cancellationToken) { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Filling database..."); - } + _logger.LogInformation("Filling database..."); SetDbJournaling(false); @@ -176,10 +137,7 @@ private async Task FillDataAsync(CancellationToken cancellationToken) var graphVersion = openApiDocument.Key; var document = openApiDocument.Value; - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Filling database for {GraphVersion}...", graphVersion); - } + _logger.LogDebug("Filling database for {GraphVersion}...", graphVersion); var insertEndpoint = Connection.CreateCommand(); insertEndpoint.CommandText = "INSERT INTO endpoints (path, graphVersion, hasSelect) VALUES (@path, @graphVersion, @hasSelect)"; @@ -192,29 +150,20 @@ private async Task FillDataAsync(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - if (_logger.IsEnabled(LogLevel.Trace)) - { - _logger.LogTrace("Endpoint {GraphVersion}{Key}...", graphVersion, path.Key); - } + _logger.LogTrace("Endpoint {GraphVersion}{Key}...", graphVersion, path.Key); // Get the GET operation for this path var getOperation = path.Value.Operations.FirstOrDefault(o => o.Key == OperationType.Get).Value; if (getOperation == null) { - if (_logger.IsEnabled(LogLevel.Trace)) - { - _logger.LogTrace("No GET operation found for {GraphVersion}{Key}", graphVersion, path.Key); - } + _logger.LogTrace("No GET operation found for {GraphVersion}{Key}", graphVersion, path.Key); continue; } // Check if the GET operation has a $select parameter var hasSelect = getOperation.Parameters.Any(p => p.Name == "$select"); - if (_logger.IsEnabled(LogLevel.Trace)) - { - _logger.LogTrace("Inserting endpoint {GraphVersion}{Key} with hasSelect={HasSelect}...", graphVersion, path.Key, hasSelect); - } + _logger.LogTrace("Inserting endpoint {GraphVersion}{Key} with hasSelect={HasSelect}...", graphVersion, path.Key, hasSelect); pathParam.Value = path.Key; graphVersionParam.Value = graphVersion; hasSelectParam.Value = hasSelect; @@ -227,18 +176,12 @@ private async Task FillDataAsync(CancellationToken cancellationToken) SetDbJournaling(true); - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Inserted {EndpointCount} endpoints in the database", i); - } + _logger.LogInformation("Inserted {EndpointCount} endpoints in the database", i); } private async Task<(bool isApiUpdated, bool hasErrors)> UpdateOpenAPIGraphFilesIfNecessaryAsync(string folder, CancellationToken cancellationToken) { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Checking for updated OpenAPI files..."); - } + _logger.LogInformation("Checking for updated OpenAPI files..."); var isApiUpdated = false; var hasErrors = false; @@ -248,24 +191,15 @@ private async Task FillDataAsync(CancellationToken cancellationToken) try { var yamlFile = new FileInfo(Path.Combine(folder, GetGraphOpenApiYamlFileName(version))); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Checking for updated OpenAPI file {File}...", yamlFile); - } + _logger.LogDebug("Checking for updated OpenAPI file {File}...", yamlFile); if (IsModifiedToday(yamlFile)) { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("File {File} has already been updated today", yamlFile); - } + _logger.LogInformation("File {File} has already been updated today", yamlFile); continue; } var url = GetOpenApiSpecUrl(version); - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Downloading OpenAPI file from {Url}...", url); - } + _logger.LogInformation("Downloading OpenAPI file from {Url}...", url); var etagFile = new FileInfo(Path.Combine(folder, GetGraphOpenApiEtagFileName(version))); isApiUpdated |= await DownloadOpenAPIFileAsync(url, yamlFile, etagFile, cancellationToken); @@ -273,10 +207,7 @@ private async Task FillDataAsync(CancellationToken cancellationToken) catch (Exception ex) { hasErrors = true; - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError(ex, "Error updating OpenAPI files"); - } + _logger.LogError(ex, "Error updating OpenAPI files"); } } return (isApiUpdated, hasErrors); @@ -301,10 +232,7 @@ private async Task DownloadOpenAPIFileAsync(string url, FileInfo yamlFile, if (response.StatusCode == HttpStatusCode.NotModified) { UpdateLastWriteTime(yamlFile); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("File {File} already up-to-date. Updated the last-write-time attribute", yamlFile); - } + _logger.LogDebug("File {File} already up-to-date. Updated the last-write-time attribute", yamlFile); return false; } @@ -324,35 +252,23 @@ private async Task DownloadOpenAPIFileAsync(string url, FileInfo yamlFile, etagFile.Delete(); } - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Downloaded OpenAPI file from {Url} to {File}", url, yamlFile); - } + _logger.LogDebug("Downloaded OpenAPI file from {Url} to {File}", url, yamlFile); return true; } private async Task LoadOpenAPIFilesAsync(string folder, CancellationToken cancellationToken) { - if (_logger.IsEnabled(LogLevel.Information)) - { - _logger.LogInformation("Loading OpenAPI files..."); - } + _logger.LogInformation("Loading OpenAPI files..."); foreach (var version in graphVersions) { var filePath = Path.Combine(folder, GetGraphOpenApiYamlFileName(version)); var file = new FileInfo(filePath); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Loading OpenAPI file for {FilePath}...", filePath); - } + _logger.LogDebug("Loading OpenAPI file for {FilePath}...", filePath); if (!file.Exists) { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("File {FilePath} does not exist", filePath); - } + _logger.LogDebug("File {FilePath} does not exist", filePath); continue; } @@ -362,17 +278,11 @@ private async Task LoadOpenAPIFilesAsync(string folder, CancellationToken cancel var openApiDocument = await new OpenApiStreamReader().ReadAsync(fileStream, cancellationToken); _openApiDocuments[version] = openApiDocument.OpenApiDocument; - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Added OpenAPI file {FilePath} for {Version}", filePath, version); - } + _logger.LogDebug("Added OpenAPI file {FilePath} for {Version}", filePath, version); } catch (Exception ex) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError(ex, "Error loading OpenAPI file {FilePath}", filePath); - } + _logger.LogError(ex, "Error loading OpenAPI file {FilePath}", filePath); } } } diff --git a/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs b/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs index a09a6207..93a2574a 100644 --- a/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs +++ b/DevProxy.Abstractions/LanguageModel/BaseLanguageModelClient.cs @@ -24,10 +24,7 @@ public abstract class BaseLanguageModelClient(LanguageModelConfiguration configu if (!promptFileName.EndsWith(".prompty", StringComparison.OrdinalIgnoreCase)) { - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Prompt file name '{PromptFileName}' does not end with '.prompty'. Appending the extension.", promptFileName); - } + Logger.LogDebug("Prompt file name '{PromptFileName}' does not end with '.prompty'. Appending the extension.", promptFileName); promptFileName += ".prompty"; } @@ -96,10 +93,7 @@ public async Task IsEnabledAsync(CancellationToken cancellationToken) private (IEnumerable?, CompletionOptions?) LoadPrompt(string promptFileName, Dictionary parameters) { - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Prompt file {PromptFileName} not in the cache. Loading...", promptFileName); - } + Logger.LogDebug("Prompt file {PromptFileName} not in the cache. Loading...", promptFileName); var filePath = Path.Combine(ProxyUtils.AppFolder!, "prompts", promptFileName); if (!File.Exists(filePath)) @@ -107,20 +101,14 @@ public async Task IsEnabledAsync(CancellationToken cancellationToken) throw new FileNotFoundException($"Prompt file '{filePath}' not found."); } - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Loading prompt file: {FilePath}", filePath); - } + Logger.LogDebug("Loading prompt file: {FilePath}", filePath); var promptContents = File.ReadAllText(filePath); var prompty = Prompt.FromMarkdown(promptContents); if (prompty.Prepare(parameters) is not IEnumerable promptyMessages || !promptyMessages.Any()) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("No messages found in the prompt file: {FilePath}", filePath); - } + Logger.LogError("No messages found in the prompt file: {FilePath}", filePath); return (null, null); } diff --git a/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs b/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs index 98bf173b..055ade6f 100644 --- a/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs +++ b/DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs @@ -24,10 +24,7 @@ public sealed class OllamaLanguageModelClient( if (Configuration.CacheResponses && _cacheCompletion.TryGetValue(prompt, out var cachedResponse)) { - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Returning cached response for prompt: {Prompt}", prompt); - } + Logger.LogDebug("Returning cached response for prompt: {Prompt}", prompt); return cachedResponse; } @@ -39,10 +36,7 @@ public sealed class OllamaLanguageModelClient( if (response.Error is not null) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("{Error}", response.Error); - } + Logger.LogError("{Error}", response.Error); return null; } @@ -60,10 +54,7 @@ public sealed class OllamaLanguageModelClient( if (Configuration.CacheResponses && _cacheChatCompletion.TryGetCacheValue(messages, out var cachedResponse)) { - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); - } + Logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); return cachedResponse; } @@ -74,10 +65,7 @@ public sealed class OllamaLanguageModelClient( } if (response.Error is not null) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("{Error}", response.Error); - } + Logger.LogError("{Error}", response.Error); return null; } else @@ -109,36 +97,24 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell if (string.IsNullOrEmpty(Configuration.Url)) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("URL is not set. Language model will be disabled"); - } + Logger.LogError("URL is not set. Language model will be disabled"); return false; } if (string.IsNullOrEmpty(Configuration.Model)) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("Model is not set. Language model will be disabled"); - } + Logger.LogError("Model is not set. Language model will be disabled"); return false; } - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); - } + Logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); try { var testCompletion = await GenerateCompletionInternalAsync("Are you there? Reply with a yes or no.", null, cancellationToken); if (testCompletion?.Error is not null) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("Error: {Error}", testCompletion.Error); - } + Logger.LogError("Error: {Error}", testCompletion.Error); return false; } @@ -146,10 +122,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell } catch (Exception ex) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); - } + Logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); return false; } } @@ -161,10 +134,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell try { var url = $"{Configuration.Url?.TrimEnd('/')}/api/generate"; - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Requesting completion. Prompt: {Prompt}", prompt); - } + Logger.LogDebug("Requesting completion. Prompt: {Prompt}", prompt); var response = await _httpClient.PostAsJsonAsync(url, new @@ -176,45 +146,30 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell }, cancellationToken ); - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Response status: {Response}", response.StatusCode); - } + Logger.LogDebug("Response status: {Response}", response.StatusCode); if (!response.IsSuccessStatusCode) { var errorResponse = await response.Content.ReadAsStringAsync(cancellationToken); - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); - } + Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); return null; } var res = await response.Content.ReadFromJsonAsync(cancellationToken); if (res is null) { - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Response: null"); - } + Logger.LogDebug("Response: null"); return res; } - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Response: {Response}", res.Response); - } + Logger.LogDebug("Response: {Response}", res.Response); res.RequestUrl = url; return res; } catch (Exception ex) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError(ex, "Failed to generate completion"); - } + Logger.LogError(ex, "Failed to generate completion"); return null; } } @@ -226,10 +181,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell try { var url = $"{Configuration.Url?.TrimEnd('/')}/api/chat"; - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); - } + Logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); var response = await _httpClient.PostAsJsonAsync(url, new @@ -240,18 +192,12 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell options } ); - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Response: {Response}", response.StatusCode); - } + Logger.LogDebug("Response: {Response}", response.StatusCode); if (!response.IsSuccessStatusCode) { var errorResponse = await response.Content.ReadAsStringAsync(); - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); - } + Logger.LogDebug("LM error: {ErrorResponse}", errorResponse); return null; } diff --git a/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs b/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs index a19d43b5..7043f145 100644 --- a/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs +++ b/DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs @@ -28,10 +28,7 @@ public sealed class OpenAILanguageModelClient( } if (response.ErrorMessage is not null) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError("Error: {Error}", response.ErrorMessage); - } + _logger.LogError("Error: {Error}", response.ErrorMessage); return null; } var openAIResponse = (OpenAIChatCompletionResponse)response; @@ -65,10 +62,7 @@ public sealed class OpenAILanguageModelClient( if (Configuration.CacheResponses && _cacheChatCompletion.TryGetCacheValue(messages, out var cachedResponse)) { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); - } + _logger.LogDebug("Returning cached response for message: {LastMessage}", messages.Last().Content); return cachedResponse; } @@ -79,10 +73,7 @@ public sealed class OpenAILanguageModelClient( } if (response.Error is not null) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError("Error: {Error}. Code: {Code}", response.Error.Message, response.Error.Code); - } + _logger.LogError("Error: {Error}. Code: {Code}", response.Error.Message, response.Error.Code); return null; } else @@ -116,26 +107,17 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell if (string.IsNullOrEmpty(Configuration.Url)) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError("URL is not set. Language model will be disabled"); - } + _logger.LogError("URL is not set. Language model will be disabled"); return false; } if (string.IsNullOrEmpty(Configuration.Model)) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError("Model is not set. Language model will be disabled"); - } + _logger.LogError("Model is not set. Language model will be disabled"); return false; } - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); - } + _logger.LogDebug("Checking LM availability at {Url}...", Configuration.Url); try { @@ -146,10 +128,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell }], null, cancellationToken); if (testCompletion?.ErrorMessage is not null) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError("Error: {Error}", testCompletion.ErrorMessage); - } + _logger.LogError("Error: {Error}", testCompletion.ErrorMessage); return false; } @@ -157,10 +136,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell } catch (Exception ex) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); - } + _logger.LogError(ex, "Couldn't reach language model at {Url}", Configuration.Url); return false; } } @@ -172,10 +148,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell try { var url = $"{Configuration.Url?.TrimEnd('/')}/chat/completions"; - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); - } + _logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content); var payload = new OpenAIChatCompletionRequest { @@ -186,18 +159,12 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell }; var response = await _httpClient.PostAsJsonAsync(url, payload, ProxyUtils.JsonSerializerOptions, cancellationToken); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("Response: {Response}", response.StatusCode); - } + _logger.LogDebug("Response: {Response}", response.StatusCode); if (!response.IsSuccessStatusCode) { var errorResponse = await response.Content.ReadAsStringAsync(cancellationToken); - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug("LM error: {ErrorResponse}", errorResponse); - } + _logger.LogDebug("LM error: {ErrorResponse}", errorResponse); return null; } @@ -212,10 +179,7 @@ protected override async Task IsEnabledCoreAsync(CancellationToken cancell } catch (Exception ex) { - if (_logger.IsEnabled(LogLevel.Error)) - { - _logger.LogError(ex, "Failed to generate chat completion"); - } + _logger.LogError(ex, "Failed to generate chat completion"); return null; } } diff --git a/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs b/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs index 5c9fcc2c..3d2496b6 100644 --- a/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs +++ b/DevProxy.Abstractions/LanguageModel/OpenAIModels.cs @@ -26,12 +26,7 @@ public class OpenAIRequest public static bool TryGetOpenAIRequest(string content, ILogger logger, out OpenAIRequest? request) { - ArgumentNullException.ThrowIfNull(logger); - - if (logger.IsEnabled(LogLevel.Trace)) - { - logger.LogTrace("{Method} called", nameof(TryGetOpenAIRequest)); - } + logger.LogTrace("{Method} called", nameof(TryGetOpenAIRequest)); request = null; diff --git a/DevProxy.Abstractions/Models/MockResponse.cs b/DevProxy.Abstractions/Models/MockResponse.cs index b9436b38..f5abbed4 100644 --- a/DevProxy.Abstractions/Models/MockResponse.cs +++ b/DevProxy.Abstractions/Models/MockResponse.cs @@ -21,12 +21,7 @@ public object Clone() public static MockResponse FromHttpResponse(string httpResponse, ILogger logger) { - ArgumentNullException.ThrowIfNull(logger); - - if (logger.IsEnabled(LogLevel.Trace)) - { - logger.LogTrace("{Method} called", nameof(FromHttpResponse)); - } + logger.LogTrace("{Method} called", nameof(FromHttpResponse)); if (string.IsNullOrWhiteSpace(httpResponse)) { @@ -45,10 +40,7 @@ public static MockResponse FromHttpResponse(string httpResponse, ILogger logger) for (var i = 0; i < lines.Length; i++) { var line = lines[i]; - if (logger.IsEnabled(LogLevel.Trace)) - { - logger.LogTrace("Processing line {LineNumber}: {LineContent}", i + 1, line); - } + logger.LogTrace("Processing line {LineNumber}: {LineContent}", i + 1, line); if (i == 0) { @@ -119,10 +111,7 @@ public static MockResponse FromHttpResponse(string httpResponse, ILogger logger) } }; - if (logger.IsEnabled(LogLevel.Trace)) - { - logger.LogTrace("Left {Method}", nameof(FromHttpResponse)); - } + logger.LogTrace("Left {Method}", nameof(FromHttpResponse)); return mockResponse; } diff --git a/DevProxy.Abstractions/Plugins/BaseLoader.cs b/DevProxy.Abstractions/Plugins/BaseLoader.cs index 1e741ca9..bbcada7c 100644 --- a/DevProxy.Abstractions/Plugins/BaseLoader.cs +++ b/DevProxy.Abstractions/Plugins/BaseLoader.cs @@ -38,10 +38,7 @@ public async Task InitFileWatcherAsync(CancellationToken cancellationToken) var path = Path.GetDirectoryName(FilePath) ?? throw new InvalidOperationException($"{FilePath} is an invalid path"); if (!File.Exists(FilePath)) { - if (Logger.IsEnabled(LogLevel.Warning)) - { - Logger.LogWarning("File {File} not found. No data will be provided", FilePath); - } + Logger.LogWarning("File {File} not found. No data will be provided", FilePath); return; } @@ -84,10 +81,7 @@ private async Task ValidateFileContentsAsync(string fileContents, Cancella if (!root.TryGetProperty("$schema", out var schemaUrlElement)) { - if (Logger.IsEnabled(LogLevel.Debug)) - { - Logger.LogDebug("Schema reference not found in file {File}. Skipping schema validation", FilePath); - } + Logger.LogDebug("Schema reference not found in file {File}. Skipping schema validation", FilePath); return true; } @@ -97,10 +91,7 @@ private async Task ValidateFileContentsAsync(string fileContents, Cancella if (!IsValid) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("Schema validation failed for {File} with the following errors: {Errors}", FilePath, string.Join(", ", ValidationErrors)); - } + Logger.LogError("Schema validation failed for {File} with the following errors: {Errors}", FilePath, string.Join(", ", ValidationErrors)); } return IsValid; @@ -110,10 +101,7 @@ private async Task LoadFileContentsAsync(CancellationToken cancellationToken) { if (!File.Exists(FilePath)) { - if (Logger.IsEnabled(LogLevel.Warning)) - { - Logger.LogWarning("File {File} not found. No data will be loaded", FilePath); - } + Logger.LogWarning("File {File} not found. No data will be loaded", FilePath); return; } @@ -130,10 +118,7 @@ private async Task LoadFileContentsAsync(CancellationToken cancellationToken) } catch (Exception ex) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError(ex, "An error has occurred while reading {File}:", FilePath); - } + Logger.LogError(ex, "An error has occurred while reading {File}:", FilePath); } } diff --git a/DevProxy.Abstractions/Plugins/BasePlugin.cs b/DevProxy.Abstractions/Plugins/BasePlugin.cs index bf88ab55..d093f9da 100644 --- a/DevProxy.Abstractions/Plugins/BasePlugin.cs +++ b/DevProxy.Abstractions/Plugins/BasePlugin.cs @@ -110,10 +110,7 @@ public override async Task InitializeAsync(InitArgs e, CancellationToken cancell var (IsValid, ValidationErrors) = await ValidatePluginConfigAsync(cancellationToken); if (!IsValid) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("Plugin configuration validation failed with the following errors: {Errors}", string.Join(", ", ValidationErrors)); - } + Logger.LogError("Plugin configuration validation failed with the following errors: {Errors}", string.Join(", ", ValidationErrors)); } } @@ -166,10 +163,7 @@ public override async Task InitializeAsync(InitArgs e, CancellationToken cancell if (!root.TryGetProperty(configSectionName, out var configSection)) { - if (Logger.IsEnabled(LogLevel.Error)) - { - Logger.LogError("Configuration section {SectionName} not found in configuration file", configSectionName); - } + Logger.LogError("Configuration section {SectionName} not found in configuration file", configSectionName); return (false, [string.Format(CultureInfo.InvariantCulture, "Configuration section {0} not found in configuration file", configSectionName)]); } diff --git a/DevProxy.Abstractions/Utils/ProxyUtils.cs b/DevProxy.Abstractions/Utils/ProxyUtils.cs index 5c9b7282..ec21a389 100644 --- a/DevProxy.Abstractions/Utils/ProxyUtils.cs +++ b/DevProxy.Abstractions/Utils/ProxyUtils.cs @@ -212,43 +212,26 @@ public static string SanitizeUrl(string absoluteUrl) public static async Task<(bool IsValid, IEnumerable ValidationErrors)> ValidateJsonAsync(string? json, string? schemaUrl, HttpClient httpClient, ILogger logger, CancellationToken cancellationToken) { - ArgumentNullException.ThrowIfNull(logger); - try { - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("Validating JSON against schema {SchemaUrl}", schemaUrl); - } + logger.LogDebug("Validating JSON against schema {SchemaUrl}", schemaUrl); if (string.IsNullOrEmpty(json)) { - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("JSON is empty, skipping validation"); - } + logger.LogDebug("JSON is empty, skipping validation"); return (true, []); } if (string.IsNullOrEmpty(schemaUrl)) { - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("Schema URL is empty, skipping validation"); - } + logger.LogDebug("Schema URL is empty, skipping validation"); return (true, []); } ArgumentNullException.ThrowIfNull(httpClient); - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("Downloading schema from {SchemaUrl}", schemaUrl); - } + logger.LogDebug("Downloading schema from {SchemaUrl}", schemaUrl); var schemaContents = await httpClient.GetStringAsync(schemaUrl, cancellationToken); - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("Parsing schema"); - } + logger.LogDebug("Parsing schema"); var schema = JSchema.Parse(schemaContents); logger.LogDebug("Parsing JSON"); var token = JToken.Parse(json); @@ -284,8 +267,6 @@ public static string ReplaceVariables(string s, Dictionary varia public static void ValidateSchemaVersion(string schemaUrl, ILogger logger) { - ArgumentNullException.ThrowIfNull(logger); - if (string.IsNullOrWhiteSpace(schemaUrl)) { logger.LogDebug("Schema is empty, skipping schema version validation."); @@ -304,26 +285,17 @@ public static void ValidateSchemaVersion(string schemaUrl, ILogger logger) if (CompareSemVer(currentVersion, schemaVersion) != 0) { var currentSchemaUrl = uri.ToString().Replace($"/v{schemaVersion}/", $"/v{currentVersion}/", StringComparison.OrdinalIgnoreCase); - if (logger.IsEnabled(LogLevel.Warning)) - { - logger.LogWarning("The version of schema does not match the installed Dev Proxy version, the expected schema is {Schema}", currentSchemaUrl); - } + logger.LogWarning("The version of schema does not match the installed Dev Proxy version, the expected schema is {Schema}", currentSchemaUrl); } } else { - if (logger.IsEnabled(LogLevel.Debug)) - { - logger.LogDebug("Invalid schema {SchemaUrl}, skipping schema version validation.", schemaUrl); - } + logger.LogDebug("Invalid schema {SchemaUrl}, skipping schema version validation.", schemaUrl); } } catch (Exception ex) { - if (logger.IsEnabled(LogLevel.Warning)) - { - logger.LogWarning("Invalid schema {SchemaUrl}, skipping schema version validation. Error: {Error}", schemaUrl, ex.Message); - } + logger.LogWarning("Invalid schema {SchemaUrl}, skipping schema version validation. Error: {Error}", schemaUrl, ex.Message); } } From b2ca860277be07d14f4efe16e22d9326c804c5fb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 12:11:54 +0000 Subject: [PATCH 6/7] Add back CA1873 suppressions to fix build Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- DevProxy.Abstractions/DevProxy.Abstractions.csproj | 1 + DevProxy.Plugins/DevProxy.Plugins.csproj | 3 ++- DevProxy/DevProxy.csproj | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/DevProxy.Abstractions/DevProxy.Abstractions.csproj b/DevProxy.Abstractions/DevProxy.Abstractions.csproj index dab9325a..2f3bb98c 100644 --- a/DevProxy.Abstractions/DevProxy.Abstractions.csproj +++ b/DevProxy.Abstractions/DevProxy.Abstractions.csproj @@ -10,6 +10,7 @@ true true AllEnabledByDefault + CA1873 diff --git a/DevProxy.Plugins/DevProxy.Plugins.csproj b/DevProxy.Plugins/DevProxy.Plugins.csproj index 537a3096..3276a415 100644 --- a/DevProxy.Plugins/DevProxy.Plugins.csproj +++ b/DevProxy.Plugins/DevProxy.Plugins.csproj @@ -11,9 +11,10 @@ true true AllEnabledByDefault + CA1873 - CS1998 + CS1998;CA1873 diff --git a/DevProxy/DevProxy.csproj b/DevProxy/DevProxy.csproj index e12d9985..9d6ddbd6 100644 --- a/DevProxy/DevProxy.csproj +++ b/DevProxy/DevProxy.csproj @@ -17,6 +17,7 @@ true true AllEnabledByDefault + CA1873 From d3b0cdf098fe33d55332ad36dfc48181ae245e7a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 16 Nov 2025 12:39:39 +0000 Subject: [PATCH 7/7] Remove CA1873 suppressions - prepare to fix warnings Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com> --- DevProxy.Abstractions/DevProxy.Abstractions.csproj | 1 - DevProxy.Plugins/DevProxy.Plugins.csproj | 3 +-- DevProxy/DevProxy.csproj | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/DevProxy.Abstractions/DevProxy.Abstractions.csproj b/DevProxy.Abstractions/DevProxy.Abstractions.csproj index 2f3bb98c..dab9325a 100644 --- a/DevProxy.Abstractions/DevProxy.Abstractions.csproj +++ b/DevProxy.Abstractions/DevProxy.Abstractions.csproj @@ -10,7 +10,6 @@ true true AllEnabledByDefault - CA1873 diff --git a/DevProxy.Plugins/DevProxy.Plugins.csproj b/DevProxy.Plugins/DevProxy.Plugins.csproj index 3276a415..537a3096 100644 --- a/DevProxy.Plugins/DevProxy.Plugins.csproj +++ b/DevProxy.Plugins/DevProxy.Plugins.csproj @@ -11,10 +11,9 @@ true true AllEnabledByDefault - CA1873 - CS1998;CA1873 + CS1998 diff --git a/DevProxy/DevProxy.csproj b/DevProxy/DevProxy.csproj index 9d6ddbd6..e12d9985 100644 --- a/DevProxy/DevProxy.csproj +++ b/DevProxy/DevProxy.csproj @@ -17,7 +17,6 @@ true true AllEnabledByDefault - CA1873