diff --git a/Extensions.Configuration.GitLab/Extensions.Configuration.GitLab.csproj b/Extensions.Configuration.GitLab/Extensions.Configuration.GitLab.csproj index 53ede66..fc5389a 100644 --- a/Extensions.Configuration.GitLab/Extensions.Configuration.GitLab.csproj +++ b/Extensions.Configuration.GitLab/Extensions.Configuration.GitLab.csproj @@ -1,11 +1,10 @@ - net5.0 - 9 + net8.0;net9.0;net10.0 Denis Ivanov - 1.0.0 - 1.0.0 + 2.0.0 + 2.0.0 Provides GitLab variables configuration provider GitLab;configuration; ASP.NET Core https://github.com/denis-ivanov/Microsoft.Extensions.Configuration.GitLab @@ -16,8 +15,21 @@ - - + + + + + + + + + + + + + + + diff --git a/Extensions.Configuration.GitLab/GitLabConfigurationExtensions.cs b/Extensions.Configuration.GitLab/GitLabConfigurationExtensions.cs index 2fd8f97..4cb1a54 100644 --- a/Extensions.Configuration.GitLab/GitLabConfigurationExtensions.cs +++ b/Extensions.Configuration.GitLab/GitLabConfigurationExtensions.cs @@ -3,82 +3,48 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace Extensions.Configuration.GitLab +namespace Extensions.Configuration.GitLab; + +public static class GitLabConfigurationExtensions { - public static class GitLabConfigurationExtensions + public static IConfigurationBuilder AddGitLab( + [NotNull] this IConfigurationBuilder builder, + [NotNull] string hostUrl, + [NotNull] string projectId, + [NotNull] string authenticationToken, + [NotNull] string environmentName) { - public static IConfigurationBuilder AddGitLab( - [NotNull] this IConfigurationBuilder builder, - [NotNull] string hostUrl, - [NotNull] string projectId, - [NotNull] string authenticationToken, - [NotNull] string environmentName) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (hostUrl == null) - { - throw new ArgumentNullException(nameof(hostUrl)); - } - - if (projectId == null) - { - throw new ArgumentNullException(nameof(projectId)); - } - - if (authenticationToken == null) - { - throw new ArgumentNullException(nameof(authenticationToken)); - } - - if (environmentName == null) - { - throw new ArgumentNullException(nameof(environmentName)); - } - - var options = new GitLabConfigurationOptions(hostUrl, projectId, authenticationToken, environmentName); - return builder.AddGitLab(options); - } - - public static IConfigurationBuilder AddGitLab( - [NotNull] this IConfigurationBuilder builder, - [NotNull] Action configure) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (configure == null) - { - throw new ArgumentNullException(nameof(configure)); - } + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(hostUrl); + ArgumentNullException.ThrowIfNull(projectId); + ArgumentNullException.ThrowIfNull(authenticationToken); + ArgumentNullException.ThrowIfNull(environmentName); + + var options = new GitLabConfigurationOptions(hostUrl, projectId, authenticationToken, environmentName); + return builder.AddGitLab(options); + } - var options = new GitLabConfigurationOptions(); - configure(options); - return builder.AddGitLab(options); - } + public static IConfigurationBuilder AddGitLab( + [NotNull] this IConfigurationBuilder builder, + [NotNull] Action configure) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(configure); - public static IConfigurationBuilder AddGitLab( - [NotNull] this IConfigurationBuilder builder, - [NotNull] GitLabConfigurationOptions options) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } + var options = new GitLabConfigurationOptions(); + configure(options); + return builder.AddGitLab(options); + } - if (options == null) - { - throw new ArgumentNullException(nameof(options)); - } + public static IConfigurationBuilder AddGitLab( + [NotNull] this IConfigurationBuilder builder, + [NotNull] GitLabConfigurationOptions options) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(options); - var gitlabClient = new GitLabClient(options.HostUrl, options.AuthenticationToken); - var source = new GitLabConfigurationSource(gitlabClient, options); - return builder.Add(source); - } + var gitlabClient = new GitLabClient(options.HostUrl, options.AuthenticationToken); + var source = new GitLabConfigurationSource(gitlabClient, options); + return builder.Add(source); } } diff --git a/Extensions.Configuration.GitLab/GitLabConfigurationOptions.cs b/Extensions.Configuration.GitLab/GitLabConfigurationOptions.cs index ad97c3b..f2bc2b1 100644 --- a/Extensions.Configuration.GitLab/GitLabConfigurationOptions.cs +++ b/Extensions.Configuration.GitLab/GitLabConfigurationOptions.cs @@ -2,88 +2,87 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace Extensions.Configuration.GitLab +namespace Extensions.Configuration.GitLab; + +public class GitLabConfigurationOptions { - public class GitLabConfigurationOptions + public GitLabConfigurationOptions() { - public GitLabConfigurationOptions() - { - } + } - public GitLabConfigurationOptions( - [NotNull] string hostUrl, - [NotNull] string projectId, - [NotNull] string authenticationToken, - [NotNull] string environmentName) - { - HostUrl = hostUrl ?? throw new ArgumentNullException(nameof(hostUrl)); - ProjectId = projectId ?? throw new ArgumentNullException(nameof(projectId)); - AuthenticationToken = authenticationToken ?? throw new ArgumentNullException(nameof(authenticationToken)); - EnvironmentName = environmentName ?? throw new ArgumentNullException(nameof(environmentName)); - } + public GitLabConfigurationOptions( + [NotNull] string hostUrl, + [NotNull] string projectId, + [NotNull] string authenticationToken, + [NotNull] string environmentName) + { + HostUrl = hostUrl ?? throw new ArgumentNullException(nameof(hostUrl)); + ProjectId = projectId ?? throw new ArgumentNullException(nameof(projectId)); + AuthenticationToken = authenticationToken ?? throw new ArgumentNullException(nameof(authenticationToken)); + EnvironmentName = environmentName ?? throw new ArgumentNullException(nameof(environmentName)); + } - public TimeSpan ReloadInterval { get; set; } = TimeSpan.FromSeconds(3); + public TimeSpan ReloadInterval { get; set; } = TimeSpan.FromSeconds(3); - public string HostUrl { get; set; } + public string HostUrl { get; set; } - public string AuthenticationToken { get; set; } + public string AuthenticationToken { get; set; } - public string ProjectId { get; set; } + public string ProjectId { get; set; } - public string EnvironmentName { get; set; } = "*"; + public string EnvironmentName { get; set; } = "*"; - public Func KeyNormalizer { get; set; } = NormalizeKey; + public Func KeyNormalizer { get; set; } = NormalizeKey; - public GitLabConfigurationOptions WithReloadInterval(TimeSpan reloadInterval) - { - ReloadInterval = reloadInterval; - return this; - } + public GitLabConfigurationOptions WithReloadInterval(TimeSpan reloadInterval) + { + ReloadInterval = reloadInterval; + return this; + } - public GitLabConfigurationOptions WithHostUrl([NotNull] string hostUrl) - { - HostUrl = hostUrl ?? throw new ArgumentNullException(nameof(hostUrl)); - return this; - } + public GitLabConfigurationOptions WithHostUrl([NotNull] string hostUrl) + { + HostUrl = hostUrl ?? throw new ArgumentNullException(nameof(hostUrl)); + return this; + } - public GitLabConfigurationOptions WithAuthenticationToken([NotNull] string authenticationToken) - { - AuthenticationToken = authenticationToken ?? throw new ArgumentNullException(nameof(authenticationToken)); - return this; - } + public GitLabConfigurationOptions WithAuthenticationToken([NotNull] string authenticationToken) + { + AuthenticationToken = authenticationToken ?? throw new ArgumentNullException(nameof(authenticationToken)); + return this; + } - public GitLabConfigurationOptions WithProjectId([NotNull] string projectId) - { - ProjectId = projectId ?? throw new ArgumentNullException(nameof(projectId)); - return this; - } + public GitLabConfigurationOptions WithProjectId([NotNull] string projectId) + { + ProjectId = projectId ?? throw new ArgumentNullException(nameof(projectId)); + return this; + } - public GitLabConfigurationOptions WithEnvironmentName([NotNull] string environmentName) - { - EnvironmentName = environmentName ?? throw new ArgumentNullException(nameof(environmentName)); - return this; - } + public GitLabConfigurationOptions WithEnvironmentName([NotNull] string environmentName) + { + EnvironmentName = environmentName ?? throw new ArgumentNullException(nameof(environmentName)); + return this; + } - public GitLabConfigurationOptions WithKeyNormalizer([NotNull] Func keyNormalizer) - { - KeyNormalizer = keyNormalizer ?? throw new ArgumentNullException(nameof(keyNormalizer)); - return this; - } + public GitLabConfigurationOptions WithKeyNormalizer([NotNull] Func keyNormalizer) + { + KeyNormalizer = keyNormalizer ?? throw new ArgumentNullException(nameof(keyNormalizer)); + return this; + } - private static string NormalizeKey(string key) + private static string NormalizeKey(string key) + { + if (string.IsNullOrEmpty(key)) { - if (string.IsNullOrEmpty(key)) - { - return key; - } + return key; + } - var segments = Array.ConvertAll(key.Split('_'), e => - { - e = e.ToLower(); - return e.Length <= 1 ? e : char.ToUpper(e[0]) + e.Substring(1); - }); + var segments = Array.ConvertAll(key.Split('_'), e => + { + e = e.ToLower(); + return e.Length <= 1 ? e : char.ToUpper(e[0]) + e.Substring(1); + }); - return string.Join(ConfigurationPath.KeyDelimiter, segments); - } + return string.Join(ConfigurationPath.KeyDelimiter, segments); } } diff --git a/Extensions.Configuration.GitLab/GitLabConfigurationProvider.cs b/Extensions.Configuration.GitLab/GitLabConfigurationProvider.cs index f556af8..9e3847b 100644 --- a/Extensions.Configuration.GitLab/GitLabConfigurationProvider.cs +++ b/Extensions.Configuration.GitLab/GitLabConfigurationProvider.cs @@ -6,117 +6,116 @@ using System.Threading; using System.Threading.Tasks; -namespace Extensions.Configuration.GitLab +namespace Extensions.Configuration.GitLab; + +public class GitLabConfigurationProvider : ConfigurationProvider, IDisposable { - public class GitLabConfigurationProvider : ConfigurationProvider, IDisposable + private readonly IGitLabClient _gitlabClient; + private readonly GitLabConfigurationOptions _options; + private readonly CancellationTokenSource _cancellationTokenSource; + private bool _changeTrackingStarted; + + public GitLabConfigurationProvider( + [NotNull] IGitLabClient gitlabClient, + [NotNull] GitLabConfigurationOptions options) { - private readonly IGitLabClient _gitlabClient; - private readonly GitLabConfigurationOptions _options; - private readonly CancellationTokenSource _cancellationTokenSource; - private bool _changeTrackingStarted; - - public GitLabConfigurationProvider( - [NotNull] IGitLabClient gitlabClient, - [NotNull] GitLabConfigurationOptions options) - { - _gitlabClient = gitlabClient ?? throw new ArgumentNullException(nameof(gitlabClient)); - _options = options ?? throw new ArgumentNullException(nameof(options)); - _cancellationTokenSource = new CancellationTokenSource(); - } + _gitlabClient = gitlabClient ?? throw new ArgumentNullException(nameof(gitlabClient)); + _options = options ?? throw new ArgumentNullException(nameof(options)); + _cancellationTokenSource = new CancellationTokenSource(); + } - public override void Load() - { - LoadAsync().GetAwaiter().GetResult(); - } + public override void Load() + { + LoadAsync().GetAwaiter().GetResult(); + } - private async Task LoadVariablesAsync() + private async Task LoadVariablesAsync() + { + while (!_cancellationTokenSource.IsCancellationRequested) { - while (!_cancellationTokenSource.IsCancellationRequested) + await WaitForReaload(); + + try { - await WaitForReaload(); - - try - { - await LoadAsync(); - } - catch - { - // ignored - } + await LoadAsync(); + } + catch + { + // ignored } } + } + + private async Task WaitForReaload() + { + await Task.Delay(_options.ReloadInterval, _cancellationTokenSource.Token).ConfigureAwait(false); + } - private async Task WaitForReaload() + private async Task LoadAsync() + { + var newData = await GetNewDataAsync(); + + if (Changed(newData)) { - await Task.Delay(_options.ReloadInterval, _cancellationTokenSource.Token).ConfigureAwait(false); + Data = newData; + OnReload(); } - private async Task LoadAsync() + if (!_changeTrackingStarted) { - var newData = await GetNewDataAsync(); - - if (Changed(newData)) - { - Data = newData; - OnReload(); - } - - if (!_changeTrackingStarted) - { - _changeTrackingStarted = true; - LoadVariablesAsync(); - } + _changeTrackingStarted = true; + await LoadVariablesAsync(); } + } - public void Dispose() + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) { - Dispose(true); - GC.SuppressFinalize(this); + _cancellationTokenSource.Cancel(); + _cancellationTokenSource.Dispose(); } + } - protected virtual void Dispose(bool disposing) + private bool Changed(Dictionary newData) + { + if (Data.Count != newData.Count) { - if (disposing) - { - _cancellationTokenSource.Cancel(); - _cancellationTokenSource.Dispose(); - } + return true; } - private bool Changed(Dictionary newData) + foreach (var kv in Data) { - if (Data.Count != newData.Count) + if (!newData.TryGetValue(kv.Key, out var value) || + kv.Value != value) { return true; } + } - foreach (var kv in Data) - { - if (!newData.TryGetValue(kv.Key, out var value) || - kv.Value != value) - { - return true; - } - } + return false; + } - return false; - } + private async Task> GetNewDataAsync() + { + var variables = await _gitlabClient.Projects.GetVariablesAsync(_options.ProjectId); + var newData = new Dictionary(StringComparer.OrdinalIgnoreCase); - private async Task> GetNewDataAsync() + foreach (var variable in variables) { - var variables = await _gitlabClient.Projects.GetVariablesAsync(_options.ProjectId); - var newData = new Dictionary(StringComparer.OrdinalIgnoreCase); - - foreach (var variable in variables) + if (variable.EnvironmentScope == _options.EnvironmentName || + variable.EnvironmentScope == "*") { - if (variable.EnvironmentScope == _options.EnvironmentName || - variable.EnvironmentScope == "*") - { - newData[_options.KeyNormalizer(variable.Key)] = variable.Value; - } + newData[_options.KeyNormalizer(variable.Key)] = variable.Value; } - - return newData; } + + return newData; } } diff --git a/Extensions.Configuration.GitLab/GitLabConfigurationSource.cs b/Extensions.Configuration.GitLab/GitLabConfigurationSource.cs index 77c6127..214d86e 100644 --- a/Extensions.Configuration.GitLab/GitLabConfigurationSource.cs +++ b/Extensions.Configuration.GitLab/GitLabConfigurationSource.cs @@ -3,24 +3,23 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace Extensions.Configuration.GitLab +namespace Extensions.Configuration.GitLab; + +public class GitLabConfigurationSource : IConfigurationSource { - public class GitLabConfigurationSource : IConfigurationSource - { - private readonly IGitLabClient _gitLabClient; - private readonly GitLabConfigurationOptions _options; + private readonly IGitLabClient _gitLabClient; + private readonly GitLabConfigurationOptions _options; - public GitLabConfigurationSource( - [NotNull] IGitLabClient gitLabClient, - [NotNull] GitLabConfigurationOptions options) - { - _gitLabClient = gitLabClient ?? throw new ArgumentNullException(nameof(gitLabClient)); - _options = options ?? throw new ArgumentNullException(nameof(options)); - } + public GitLabConfigurationSource( + [NotNull] IGitLabClient gitLabClient, + [NotNull] GitLabConfigurationOptions options) + { + _gitLabClient = gitLabClient ?? throw new ArgumentNullException(nameof(gitLabClient)); + _options = options ?? throw new ArgumentNullException(nameof(options)); + } - public IConfigurationProvider Build(IConfigurationBuilder builder) - { - return new GitLabConfigurationProvider(_gitLabClient, _options); - } + public IConfigurationProvider Build(IConfigurationBuilder builder) + { + return new GitLabConfigurationProvider(_gitLabClient, _options); } }