From 73e797b11f70d8de66fdee35f3a8c0c5605cc935 Mon Sep 17 00:00:00 2001 From: Jorge Rodriguez Galan Date: Tue, 24 Feb 2026 13:52:06 +0000 Subject: [PATCH] feat(dotnet): add support for net10 and drop win registry provider --- .github/workflows/ci.yaml | 39 ++------ .github/workflows/publish.yaml | 9 +- build.cake | 2 +- config.yml | 2 - dotnet-tools.json | 2 +- global.json | 6 +- .../Appy.Sample.1Password.Api.csproj | 2 +- samples/Appy.Sample.1Password.Api/Dockerfile | 4 +- .../Appy.Sample.WinRegistry.Api.csproj | 12 --- .../Composition/DatabaseSettings.cs | 6 -- .../YourOrgConfigurationExtensions.cs | 43 --------- .../Controllers/SampleController.cs | 11 --- .../Appy.Sample.WinRegistry.Api/Program.cs | 58 ------------ .../appsettings.Development.json | 9 -- .../appsettings.json | 13 --- .../Appy.Configuration.1Password.Tests.csproj | 2 +- .../Appy.Configuration.1Password.csproj | 3 +- ...ppy.Configuration.WinRegistry.Tests.csproj | 30 ------ .../WinRegistryConfigurationTests.cs | 53 ----------- .../Appy.Configuration.WinRegistry.csproj | 24 ----- .../WinRegistryConfigurationExtensions.cs | 37 -------- .../WinRegistryConfigurationProvider.cs | 93 ------------------- .../WinRegistryConfigurationSource.cs | 51 ---------- src/Appy.Configuration.sln | 21 ----- .../Appy.Configuration.csproj | 4 +- ...Appy.Infrastructure.1Password.Tests.csproj | 2 +- .../Appy.Infrastructure.1Password.csproj | 2 +- src/Appy.TestTools/Appy.TestTools.csproj | 2 +- .../Api/Fixtures/OnePasswordApiTestFixture.cs | 24 +++-- .../Appy.Tool.1Password.Tests.csproj | 2 +- .../Api/OnePasswordApiRunner.cs | 49 +++++----- .../Appy.Tool.1Password.csproj | 3 +- src/Appy.Tool.1Password/Dockerfile | 6 +- src/Directory.Packages.props | 46 +++++---- 34 files changed, 100 insertions(+), 572 deletions(-) delete mode 100644 samples/Appy.Sample.WinRegistry.Api/Appy.Sample.WinRegistry.Api.csproj delete mode 100644 samples/Appy.Sample.WinRegistry.Api/Composition/DatabaseSettings.cs delete mode 100644 samples/Appy.Sample.WinRegistry.Api/Configuration/YourOrgConfigurationExtensions.cs delete mode 100644 samples/Appy.Sample.WinRegistry.Api/Controllers/SampleController.cs delete mode 100644 samples/Appy.Sample.WinRegistry.Api/Program.cs delete mode 100644 samples/Appy.Sample.WinRegistry.Api/appsettings.Development.json delete mode 100644 samples/Appy.Sample.WinRegistry.Api/appsettings.json delete mode 100644 src/Appy.Configuration.WinRegistry.Tests/Appy.Configuration.WinRegistry.Tests.csproj delete mode 100644 src/Appy.Configuration.WinRegistry.Tests/WinRegistryConfigurationTests.cs delete mode 100644 src/Appy.Configuration.WinRegistry/Appy.Configuration.WinRegistry.csproj delete mode 100644 src/Appy.Configuration.WinRegistry/WinRegistryConfigurationExtensions.cs delete mode 100644 src/Appy.Configuration.WinRegistry/WinRegistryConfigurationProvider.cs delete mode 100644 src/Appy.Configuration.WinRegistry/WinRegistryConfigurationSource.cs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ab3cd97..8925891 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -8,30 +8,6 @@ env: jobs: - ################################################### - # DOCS - ################################################### - - # docs: - # name: Documentation - # runs-on: ubuntu-latest - # steps: - # - name: Checkout - # uses: actions/checkout@master - - # - name: Setup dotnet - # uses: actions/setup-dotnet@v1 - # with: - # dotnet-version: '5.0.100' # SDK Version to use. - - # - name: Build - # shell: bash - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # cd docs - # dotnet run --configuration Release - ################################################### # BUILD ################################################### @@ -43,19 +19,19 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cache packages - uses: actions/cache@v3 + uses: actions/cache@v5 with: path: ${{ env.NUGET_PACKAGES }} key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }} restore-keys: ${{ runner.os }}-nuget- - - name: Setup .NET SDK - uses: actions/setup-dotnet@v3 + - name: Setup .NET SDK (global.json) + uses: actions/setup-dotnet@v5 - name: Integration Tests shell: bash @@ -82,7 +58,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v6 with: fetch-depth: 0 @@ -93,12 +69,13 @@ jobs: key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }} restore-keys: ${{ runner.os }}-nuget- - - name: Setup .NET SDK - uses: actions/setup-dotnet@v3 + - name: Setup .NET SDK (global.json) + uses: actions/setup-dotnet@v5 with: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Integration Tests shell: bash diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 3223676..51b2010 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -21,23 +21,24 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Cache packages - uses: actions/cache@v3 + uses: actions/cache@v5 with: path: ${{ env.NUGET_PACKAGES }} key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }} restore-keys: ${{ runner.os }}-nuget- - - name: Setup .NET SDK - uses: actions/setup-dotnet@v3 + - name: Setup .NET SDK (global.json) + uses: actions/setup-dotnet@v5 with: dotnet-version: | 8.0.x 9.0.x + 10.0.x - name: Login to Docker Hub uses: docker/login-action@v2 diff --git a/build.cake b/build.cake index 9b49db9..7823a3b 100644 --- a/build.cake +++ b/build.cake @@ -2,7 +2,7 @@ #addin nuget:?package=System.Xml.XDocument&version=4.3.0 #addin nuget:?package=Cake.MinVer&version=4.0.0 #addin nuget:?package=Cake.Yaml&version=6.0.0 -#addin nuget:?package=Cake.Docker&version=1.3.0 +#addin nuget:?package=Cake.Docker&version=1.5.0-beta.1 #load "./functions.cake" diff --git a/config.yml b/config.yml index 1d67dc7..82a893b 100644 --- a/config.yml +++ b/config.yml @@ -1,7 +1,5 @@ Appy.Configuration: Type: Package -Appy.Configuration.WinRegistry: - Type: Package Appy.Infrastructure.1Password: Type: Package Appy.Configuration.1Password: diff --git a/dotnet-tools.json b/dotnet-tools.json index f97c43f..d2a8356 100644 --- a/dotnet-tools.json +++ b/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "cake.tool": { - "version": "5.0.0", + "version": "6.0.0", "commands": [ "dotnet-cake" ] diff --git a/global.json b/global.json index 6444165..34ed857 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "9.0.100", - "rollForward": "latestMinor" + "version": "10.0.103", + "rollForward": "latestFeature" }, "msbuild-sdks": { - "Microsoft.Build.Traversal": "4.1.0" + "Microsoft.Build.Traversal": "4.1.82" } } \ No newline at end of file diff --git a/samples/Appy.Sample.1Password.Api/Appy.Sample.1Password.Api.csproj b/samples/Appy.Sample.1Password.Api/Appy.Sample.1Password.Api.csproj index 0600db2..00be4a3 100644 --- a/samples/Appy.Sample.1Password.Api/Appy.Sample.1Password.Api.csproj +++ b/samples/Appy.Sample.1Password.Api/Appy.Sample.1Password.Api.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 Appy.Sample.OnePassword.Api false Linux diff --git a/samples/Appy.Sample.1Password.Api/Dockerfile b/samples/Appy.Sample.1Password.Api/Dockerfile index 7e4753c..caf167a 100644 --- a/samples/Appy.Sample.1Password.Api/Dockerfile +++ b/samples/Appy.Sample.1Password.Api/Dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0.3-noble AS base WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:9.0.100-bookworm-slim AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0.103-noble AS build WORKDIR / COPY ["samples/Appy.Sample.1Password.Api/Appy.Sample.1Password.Api.csproj", "samples/Appy.Sample.1Password.Api/"] COPY ["src/Appy.Configuration.1Password/Appy.Configuration.1Password.csproj", "src/Appy.Configuration.1Password/"] diff --git a/samples/Appy.Sample.WinRegistry.Api/Appy.Sample.WinRegistry.Api.csproj b/samples/Appy.Sample.WinRegistry.Api/Appy.Sample.WinRegistry.Api.csproj deleted file mode 100644 index ba9bccf..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/Appy.Sample.WinRegistry.Api.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net9.0 - false - - - - - - - diff --git a/samples/Appy.Sample.WinRegistry.Api/Composition/DatabaseSettings.cs b/samples/Appy.Sample.WinRegistry.Api/Composition/DatabaseSettings.cs deleted file mode 100644 index 8a0d5a2..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/Composition/DatabaseSettings.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Appy.Sample.WinRegistry.Api.Composition; - -public class DatabaseSettings -{ - public string ConnectionString { get; set; } -} \ No newline at end of file diff --git a/samples/Appy.Sample.WinRegistry.Api/Configuration/YourOrgConfigurationExtensions.cs b/samples/Appy.Sample.WinRegistry.Api/Configuration/YourOrgConfigurationExtensions.cs deleted file mode 100644 index c40ff94..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/Configuration/YourOrgConfigurationExtensions.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using Appy.Configuration.WinRegistry; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; - -namespace Appy.Sample.WinRegistry.Api.Configuration; - -public static class YourOrgConfigurationExtensions -{ - public static IConfigurationBuilder AddYourOrgRegistrySection( - this IConfigurationBuilder builder, - Action configureSource = null) - { - return builder.AddRegistrySection(() => - Microsoft.Win32.Registry.CurrentUser, "Software\\YOUR_ORG\\Settings"); - } - - public static IHostBuilder AddYourOrgAppConfiguration(this IHostBuilder hostBuilder) - { - hostBuilder.ConfigureAppConfiguration((hostingContext, config) => - { - config.AddYourOrgConfigurationBuilders(hostingContext.HostingEnvironment); - }); - - return hostBuilder; - } - - public static IConfigurationBuilder AddYourOrgConfigurationBuilders(this IConfigurationBuilder builder, IHostEnvironment env) - { - builder - .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) - .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) - .AddEnvironmentVariables(); - - if (env.IsDevelopment()) - { - builder - .AddYourOrgRegistrySection(); - } - - return builder; - } -} \ No newline at end of file diff --git a/samples/Appy.Sample.WinRegistry.Api/Controllers/SampleController.cs b/samples/Appy.Sample.WinRegistry.Api/Controllers/SampleController.cs deleted file mode 100644 index ac3af5a..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/Controllers/SampleController.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace Appy.Sample.WinRegistry.Api.Controllers; - -[ApiController] -[Route("[controller]")] -public class SampleController : ControllerBase -{ - [HttpGet] - public string Get() => "Hello!"; -} \ No newline at end of file diff --git a/samples/Appy.Sample.WinRegistry.Api/Program.cs b/samples/Appy.Sample.WinRegistry.Api/Program.cs deleted file mode 100644 index 574cb1d..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/Program.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Appy.Configuration.WinRegistry; -using Appy.Sample.WinRegistry.Api.Composition; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -var builder = WebApplication.CreateBuilder(args); - -// Register your configuration providers - -builder.Configuration.Sources.Clear(); - -builder.Configuration - // Options to load your project settings - // 1 - Load without any extension - .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) - .AddEnvironmentVariables(); - - if (builder.Environment.IsDevelopment()) - { - builder.Configuration - .AddRegistrySection(() => Microsoft.Win32.Registry.CurrentUser, "Software\\YOUR_ORG\\Settings"); - } - - // 2 - Using a custom extension with pre-configured settings for your organization - // .AddYourOrgAppConfiguration() - - -// Load app settings - -var databaseSettings = new DatabaseSettings(); - -builder.Configuration.GetSection("Database").Bind(databaseSettings); - -// Register dependencies - -builder.Services.AddControllers(); - -var app = builder.Build(); - -// Configure the app - -if (app.Environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app - .UseRouting() - .UseHttpsRedirection() - .UseAuthorization() - .UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - -await app.RunAsync(); \ No newline at end of file diff --git a/samples/Appy.Sample.WinRegistry.Api/appsettings.Development.json b/samples/Appy.Sample.WinRegistry.Api/appsettings.Development.json deleted file mode 100644 index 8983e0f..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/samples/Appy.Sample.WinRegistry.Api/appsettings.json b/samples/Appy.Sample.WinRegistry.Api/appsettings.json deleted file mode 100644 index 018f567..0000000 --- a/samples/Appy.Sample.WinRegistry.Api/appsettings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "Database": { - "ConnectionString": "" - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*" -} diff --git a/src/Appy.Configuration.1Password.Tests/Appy.Configuration.1Password.Tests.csproj b/src/Appy.Configuration.1Password.Tests/Appy.Configuration.1Password.Tests.csproj index 91f6fc3..50d7a86 100644 --- a/src/Appy.Configuration.1Password.Tests/Appy.Configuration.1Password.Tests.csproj +++ b/src/Appy.Configuration.1Password.Tests/Appy.Configuration.1Password.Tests.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 false Appy.Configuration.OnePassword.Tests diff --git a/src/Appy.Configuration.1Password/Appy.Configuration.1Password.csproj b/src/Appy.Configuration.1Password/Appy.Configuration.1Password.csproj index 6f1e5ed..753a0ec 100644 --- a/src/Appy.Configuration.1Password/Appy.Configuration.1Password.csproj +++ b/src/Appy.Configuration.1Password/Appy.Configuration.1Password.csproj @@ -1,7 +1,7 @@ - net9.0;net8.0 + net10.0;net9.0;net8.0 enable Appy.Configuration.OnePassword @@ -17,7 +17,6 @@ - diff --git a/src/Appy.Configuration.WinRegistry.Tests/Appy.Configuration.WinRegistry.Tests.csproj b/src/Appy.Configuration.WinRegistry.Tests/Appy.Configuration.WinRegistry.Tests.csproj deleted file mode 100644 index b7243d1..0000000 --- a/src/Appy.Configuration.WinRegistry.Tests/Appy.Configuration.WinRegistry.Tests.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - net9.0;net8.0 - false - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - diff --git a/src/Appy.Configuration.WinRegistry.Tests/WinRegistryConfigurationTests.cs b/src/Appy.Configuration.WinRegistry.Tests/WinRegistryConfigurationTests.cs deleted file mode 100644 index dc047c5..0000000 --- a/src/Appy.Configuration.WinRegistry.Tests/WinRegistryConfigurationTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -using FluentAssertions; -using Microsoft.Extensions.Configuration; -using Xunit; - -namespace Appy.Configuration.WinRegistry.Tests; - -#pragma warning disable CA1416 - -public class WinRegistryConfigurationTests -{ - [Fact(Skip = "Manual execution only")] - public void ShouldReadSingleValueFromRegistrySection() - { - var target = new WinRegistryConfigurationProvider(new WinRegistryConfigurationSource( - () => Microsoft.Win32.Registry.LocalMachine, - "SOFTWARE\\Microsoft\\Shell")); - - target.Load(); - - string actual; - - target.TryGet("USB:NotifyOnUsbErrors", out actual); - - actual.Should().Be("1"); - } - - [Fact(Skip = "Manual execution only")] - public void ShouldReadNestedObjectFromRegistrySection() - { - var configBuilder = new ConfigurationBuilder(); - var config = configBuilder.AddRegistrySection(() => - Microsoft.Win32.Registry.CurrentUser, "Software\\YOUR_ORG\\Settings") - .Build(); - - var expected = new DatabaseSettings - { - ConnectionString = "Data Source=(LocalDb)\\mssqllocaldb;Initial Catalog=local-org-database;Integrated Security=True" - }; - - var databaseSettings = new DatabaseSettings(); - - config.GetSection("Database").Bind(databaseSettings); - - databaseSettings.Should().BeEquivalentTo(expected); - } - -#pragma warning restore CA1416 - - private class DatabaseSettings - { - public string ConnectionString { get; set; } - } -} \ No newline at end of file diff --git a/src/Appy.Configuration.WinRegistry/Appy.Configuration.WinRegistry.csproj b/src/Appy.Configuration.WinRegistry/Appy.Configuration.WinRegistry.csproj deleted file mode 100644 index b428480..0000000 --- a/src/Appy.Configuration.WinRegistry/Appy.Configuration.WinRegistry.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net9.0;net8.0 - enable - - - - - - - - - - - - - - - 3.0.0 - False - - - \ No newline at end of file diff --git a/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationExtensions.cs b/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationExtensions.cs deleted file mode 100644 index 7dace4c..0000000 --- a/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationExtensions.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using Microsoft.Extensions.Configuration; - -namespace Appy.Configuration.WinRegistry; - -/// -/// Extension methods for adding -/// -public static class WinRegistryConfigurationExtensions -{ - /// - /// Adds Windows Registry configuration provider for to . - /// - /// The to add to. - /// registry root getter - /// section path - /// Configures the source. - /// The . - public static IConfigurationBuilder AddRegistrySection( - this IConfigurationBuilder builder, - Func registryRoot, - string sectionPath, - Action configureSource = null!) - { - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - return builder; - } - - var source = new WinRegistryConfigurationSource(registryRoot, sectionPath); - - configureSource?.Invoke(source); - - return builder.Add(source); - } -} \ No newline at end of file diff --git a/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationProvider.cs b/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationProvider.cs deleted file mode 100644 index a1a00e2..0000000 --- a/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationProvider.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.Configuration; -using Microsoft.Win32; - -namespace Appy.Configuration.WinRegistry; - -/// -/// Configuration provider for Windows Registry -/// -public class WinRegistryConfigurationProvider : ConfigurationProvider -{ - readonly WinRegistryConfigurationSource _source; - - /// Creates configuration provider for Windows Registry. - /// - /// The source settings. - public WinRegistryConfigurationProvider(WinRegistryConfigurationSource source) - { - _source = source ?? throw new ArgumentNullException(nameof(source)); - } - -#pragma warning disable CA1416 - - /// - public override void Load() - { - var root = _source.RegistryRoot.Invoke(); - - if (root == null) - { - throw new ArgumentOutOfRangeException(nameof(_source), $"{nameof(WinRegistryConfigurationSource.RegistryRoot)} must return not null instance of {_source.RegistryRoot.Method.ReturnType.Name}"); - } - - var section = root.OpenSubKey(_source.SectionPath); - - if (section == null) - { - Data = new Dictionary(); - } - - var data = new Dictionary(); - var prefixStack = new Stack(); - - if (!string.IsNullOrWhiteSpace(_source.RootSection)) - { - prefixStack.Push(_source.RootSection); - } - - try - { - ReadSection(section, data, prefixStack); - } - finally - { - section?.Dispose(); - } - - _source.DataAdapter?.Invoke(data); - - Data = data; - } - - static void ReadSection(RegistryKey? section, IDictionary data, Stack prefixStack) - { - foreach (var subKeyName in section?.GetSubKeyNames()!) - { - prefixStack.Push(subKeyName); - - using (var subKey = section.OpenSubKey(subKeyName)) - { - ReadSection(subKey, data, prefixStack); - } - - prefixStack.Pop(); - } - - foreach (var valueName in section.GetValueNames()) - { - prefixStack.Push(valueName); - - var keyPath = ConfigurationPath.Combine(prefixStack.Reverse()); - - data[keyPath] = section.GetValue(valueName)?.ToString(); - - prefixStack.Pop(); - } - } - -#pragma warning restore CA1416 - -} \ No newline at end of file diff --git a/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationSource.cs b/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationSource.cs deleted file mode 100644 index ae0ba1e..0000000 --- a/src/Appy.Configuration.WinRegistry/WinRegistryConfigurationSource.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.Configuration; -using Microsoft.Win32; - -namespace Appy.Configuration.WinRegistry; - -/// -/// Represents Windows Registry as and -/// -public class WinRegistryConfigurationSource : IConfigurationSource -{ - /// - /// Creates for specified of Windows Registry - /// - /// registry root getter - /// section path - public WinRegistryConfigurationSource( - Func registryRoot, - string sectionPath) - { - if (string.IsNullOrWhiteSpace(sectionPath)) - throw new ArgumentException("Registry section name must be specified", nameof(sectionPath)); - - SectionPath = sectionPath; - - RegistryRoot = registryRoot ?? throw new ArgumentNullException(nameof(registryRoot)); - } - - /// Gets Windows Registry section path - /// - public string SectionPath { get; } - - /// Gets Registry root getter - /// - public Func RegistryRoot { get; } - - /// Gets or sets optimal configuration data adapter. - /// Will be invoked after reading data from registry. - /// - public Action>? DataAdapter { get; set; } - - /// Gets or sets configuration root section (optional). - /// Specified value will be added as root section of registry keys. - /// - public string? RootSection { get; set; } - - /// - public IConfigurationProvider Build(IConfigurationBuilder builder) => - new WinRegistryConfigurationProvider(this); -} \ No newline at end of file diff --git a/src/Appy.Configuration.sln b/src/Appy.Configuration.sln index f0c7324..8d364ab 100644 --- a/src/Appy.Configuration.sln +++ b/src/Appy.Configuration.sln @@ -3,14 +3,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30503.244 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Appy.Configuration.WinRegistry", "Appy.Configuration.WinRegistry\Appy.Configuration.WinRegistry.csproj", "{ECBE4EAB-D0DC-46F8-B717-81860FCCADD4}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{681560C8-60ED-4042-9731-32DD889BF7CF}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{67D7A0F0-F4A4-4921-AED7-A3DD911E3EE0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Appy.Sample.WinRegistry.Api", "..\samples\Appy.Sample.WinRegistry.Api\Appy.Sample.WinRegistry.Api.csproj", "{431DCB52-484D-4FE8-A99F-25B082CA35AE}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Appy.Configuration.1Password", "Appy.Configuration.1Password\Appy.Configuration.1Password.csproj", "{EDB36184-BBA8-4818-8167-1A7EE319766F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Appy.Sample.1Password.Api", "..\samples\Appy.Sample.1Password.Api\Appy.Sample.1Password.Api.csproj", "{85A334CA-E1C3-4B70-BF31-103BD189D958}" @@ -36,8 +32,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F90AF1CE EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{450B3144-2677-4626-AAD1-12C7D3702B83}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Appy.Configuration.WinRegistry.Tests", "Appy.Configuration.WinRegistry.Tests\Appy.Configuration.WinRegistry.Tests.csproj", "{A9FF5CDC-58A5-4070-8E74-9F7BD540FD6B}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Appy.Configuration.1Password.Tests", "Appy.Configuration.1Password.Tests\Appy.Configuration.1Password.Tests.csproj", "{EA756FFC-F1E0-4092-BF13-25EE36D1D929}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Appy.TestTools", "Appy.TestTools\Appy.TestTools.csproj", "{4534AF32-C351-4177-B636-4A5E21B12C77}" @@ -52,14 +46,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ECBE4EAB-D0DC-46F8-B717-81860FCCADD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECBE4EAB-D0DC-46F8-B717-81860FCCADD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECBE4EAB-D0DC-46F8-B717-81860FCCADD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECBE4EAB-D0DC-46F8-B717-81860FCCADD4}.Release|Any CPU.Build.0 = Release|Any CPU - {431DCB52-484D-4FE8-A99F-25B082CA35AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {431DCB52-484D-4FE8-A99F-25B082CA35AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {431DCB52-484D-4FE8-A99F-25B082CA35AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {431DCB52-484D-4FE8-A99F-25B082CA35AE}.Release|Any CPU.Build.0 = Release|Any CPU {EDB36184-BBA8-4818-8167-1A7EE319766F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EDB36184-BBA8-4818-8167-1A7EE319766F}.Debug|Any CPU.Build.0 = Debug|Any CPU {EDB36184-BBA8-4818-8167-1A7EE319766F}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -80,10 +66,6 @@ Global {616EA1FD-C76E-4928-A692-33FBC4402381}.Debug|Any CPU.Build.0 = Debug|Any CPU {616EA1FD-C76E-4928-A692-33FBC4402381}.Release|Any CPU.ActiveCfg = Release|Any CPU {616EA1FD-C76E-4928-A692-33FBC4402381}.Release|Any CPU.Build.0 = Release|Any CPU - {A9FF5CDC-58A5-4070-8E74-9F7BD540FD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A9FF5CDC-58A5-4070-8E74-9F7BD540FD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A9FF5CDC-58A5-4070-8E74-9F7BD540FD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A9FF5CDC-58A5-4070-8E74-9F7BD540FD6B}.Release|Any CPU.Build.0 = Release|Any CPU {EA756FFC-F1E0-4092-BF13-25EE36D1D929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA756FFC-F1E0-4092-BF13-25EE36D1D929}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA756FFC-F1E0-4092-BF13-25EE36D1D929}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -105,14 +87,11 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {ECBE4EAB-D0DC-46F8-B717-81860FCCADD4} = {681560C8-60ED-4042-9731-32DD889BF7CF} - {431DCB52-484D-4FE8-A99F-25B082CA35AE} = {67D7A0F0-F4A4-4921-AED7-A3DD911E3EE0} {EDB36184-BBA8-4818-8167-1A7EE319766F} = {681560C8-60ED-4042-9731-32DD889BF7CF} {85A334CA-E1C3-4B70-BF31-103BD189D958} = {67D7A0F0-F4A4-4921-AED7-A3DD911E3EE0} {EF99DD07-EA42-46C4-9938-FED45DC244C8} = {681560C8-60ED-4042-9731-32DD889BF7CF} {7BDB2895-CBB1-42EB-BEBC-3CCA6F3422CD} = {681560C8-60ED-4042-9731-32DD889BF7CF} {616EA1FD-C76E-4928-A692-33FBC4402381} = {681560C8-60ED-4042-9731-32DD889BF7CF} - {A9FF5CDC-58A5-4070-8E74-9F7BD540FD6B} = {450B3144-2677-4626-AAD1-12C7D3702B83} {EA756FFC-F1E0-4092-BF13-25EE36D1D929} = {450B3144-2677-4626-AAD1-12C7D3702B83} {4534AF32-C351-4177-B636-4A5E21B12C77} = {450B3144-2677-4626-AAD1-12C7D3702B83} {7F4BEF41-A528-45CB-8024-8FEB830CDB2A} = {450B3144-2677-4626-AAD1-12C7D3702B83} diff --git a/src/Appy.Configuration/Appy.Configuration.csproj b/src/Appy.Configuration/Appy.Configuration.csproj index 85187c2..f055264 100644 --- a/src/Appy.Configuration/Appy.Configuration.csproj +++ b/src/Appy.Configuration/Appy.Configuration.csproj @@ -1,7 +1,7 @@ - net9.0;net8.0 + net10.0;net9.0;net8.0 Library enable @@ -14,7 +14,7 @@ - + diff --git a/src/Appy.Infrastructure.1Password.Tests/Appy.Infrastructure.1Password.Tests.csproj b/src/Appy.Infrastructure.1Password.Tests/Appy.Infrastructure.1Password.Tests.csproj index 2e62fb6..e46e06d 100644 --- a/src/Appy.Infrastructure.1Password.Tests/Appy.Infrastructure.1Password.Tests.csproj +++ b/src/Appy.Infrastructure.1Password.Tests/Appy.Infrastructure.1Password.Tests.csproj @@ -1,7 +1,7 @@ - net9.0;net8.0 + net10.0;net9.0;net8.0 false Appy.Infrastructure.OnePassword.Tests diff --git a/src/Appy.Infrastructure.1Password/Appy.Infrastructure.1Password.csproj b/src/Appy.Infrastructure.1Password/Appy.Infrastructure.1Password.csproj index 09ab633..8f06801 100644 --- a/src/Appy.Infrastructure.1Password/Appy.Infrastructure.1Password.csproj +++ b/src/Appy.Infrastructure.1Password/Appy.Infrastructure.1Password.csproj @@ -1,7 +1,7 @@ - net9.0;net8.0 + net10.0;net9.0;net8.0 Library enable Appy.Infrastructure.OnePassword diff --git a/src/Appy.TestTools/Appy.TestTools.csproj b/src/Appy.TestTools/Appy.TestTools.csproj index af7abf8..e2e6d5f 100644 --- a/src/Appy.TestTools/Appy.TestTools.csproj +++ b/src/Appy.TestTools/Appy.TestTools.csproj @@ -1,7 +1,7 @@ - net9.0;net8.0 + net10.0;net9.0;net8.0 false false diff --git a/src/Appy.Tool.1Password.Tests/Api/Fixtures/OnePasswordApiTestFixture.cs b/src/Appy.Tool.1Password.Tests/Api/Fixtures/OnePasswordApiTestFixture.cs index ba3a4cd..3b07c33 100644 --- a/src/Appy.Tool.1Password.Tests/Api/Fixtures/OnePasswordApiTestFixture.cs +++ b/src/Appy.Tool.1Password.Tests/Api/Fixtures/OnePasswordApiTestFixture.cs @@ -14,14 +14,24 @@ public class OnePasswordApiTestFixture : WebApplicationFactory logging - .ClearProviders() - .AddXUnit(_output)); + builder.ConfigureWebHost(webBuilder => + { + webBuilder + .UseTestServer() + .UseEnvironment(Environments.Development) + .ConfigureLogging(logging => logging + .ClearProviders() + .AddXUnit(_output)); + }); + + return base.CreateHost(builder); + } + + protected override IHostBuilder CreateHostBuilder() + { + return OnePasswordApiRunner.CreateHostBuilder(); } public OnePasswordApiTestFixture WithOutput(ITestOutputHelper output) diff --git a/src/Appy.Tool.1Password.Tests/Appy.Tool.1Password.Tests.csproj b/src/Appy.Tool.1Password.Tests/Appy.Tool.1Password.Tests.csproj index 021e0c2..7249146 100644 --- a/src/Appy.Tool.1Password.Tests/Appy.Tool.1Password.Tests.csproj +++ b/src/Appy.Tool.1Password.Tests/Appy.Tool.1Password.Tests.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 false Appy.Tool.OnePassword.Tests diff --git a/src/Appy.Tool.1Password/Api/OnePasswordApiRunner.cs b/src/Appy.Tool.1Password/Api/OnePasswordApiRunner.cs index 84a3b15..1f4c579 100644 --- a/src/Appy.Tool.1Password/Api/OnePasswordApiRunner.cs +++ b/src/Appy.Tool.1Password/Api/OnePasswordApiRunner.cs @@ -8,55 +8,54 @@ namespace Appy.Tool.OnePassword.Api; public class OnePasswordApiRunner : IOnePasswordApiRunner { - IWebHost _webHost; + IHost? _host; - public static IWebHostBuilder CreateHostBuilder() + public static IHostBuilder CreateHostBuilder() { - return new WebHostBuilder() - .UseKestrel() - .ConfigureLogging(logging => + return new HostBuilder() + .ConfigureWebHost(webBuilder => { - logging.ClearProviders(); - logging.SetMinimumLevel(LogLevel.Warning); - logging.SetMinimumLevel(LogLevel.None); - }) - .SuppressStatusMessages(true) - .UseEnvironment(Environments.Production) - .UseStartup(); + webBuilder + .UseKestrel() + .ConfigureLogging(logging => + { + logging.ClearProviders(); + logging.SetMinimumLevel(LogLevel.None); + }) + .SuppressStatusMessages(true) + .UseEnvironment(Environments.Production) + .UseStartup(); + }); } public void Start(OnePasswordApiSettings settings) { if (IsRunning()) - { throw new Exception("OnePassword Api already started"); - } - _webHost = CreateHostBuilder() - .UseUrls($"http://*:{settings.Port}") + _host = CreateHostBuilder() + .ConfigureWebHost(webBuilder => + { + webBuilder.UseUrls($"http://*:{settings.Port}"); + }) .Build(); if (!settings.StartWithoutBlocking) { - _webHost.Run(); + _host.Run(); return; } - var _ = _webHost.RunAsync(); + _ = _host.RunAsync(); } - public bool IsRunning() - { - return _webHost != null; - } + public bool IsRunning() => _host != null; public Task Stop() { if (!IsRunning()) - { return Task.CompletedTask; - } - return _webHost.StopAsync(); + return _host!.StopAsync(); } } \ No newline at end of file diff --git a/src/Appy.Tool.1Password/Appy.Tool.1Password.csproj b/src/Appy.Tool.1Password/Appy.Tool.1Password.csproj index 5f305a6..c91fa4c 100644 --- a/src/Appy.Tool.1Password/Appy.Tool.1Password.csproj +++ b/src/Appy.Tool.1Password/Appy.Tool.1Password.csproj @@ -5,7 +5,7 @@ Appy.Tool.1Password Appy.Tool.1Password appy-op - net9.0 + net10.0 latest true true @@ -18,7 +18,6 @@ - diff --git a/src/Appy.Tool.1Password/Dockerfile b/src/Appy.Tool.1Password/Dockerfile index 67dec9d..6cf7e10 100644 --- a/src/Appy.Tool.1Password/Dockerfile +++ b/src/Appy.Tool.1Password/Dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0.3-noble AS base WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:9.0.100-bookworm-slim AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0.103-noble AS build ARG configuration=Release @@ -28,7 +28,7 @@ RUN dotnet publish "Appy.Tool.1Password.csproj" -c $configuration -o /app/publis FROM base AS final # Install 1Password CLI (op) -ENV OP_VERSION 2.23.0 +ENV OP_VERSION 2.32.1 RUN buildDeps="curl gnupg dirmngr unzip" \ && runDeps="ca-certificates" \ && apt-get update \ diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 0853f4f..e2e00d5 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -5,38 +5,44 @@ - + - + - - + - + + - + + - + + - + + - + + - - - + + - - - - + + + + + + + - - + + - - + + \ No newline at end of file