< Summary

Information
Class: ArturRios.Configuration.Loaders.ConfigurationLoader
Assembly: ArturRios.Configuration
File(s): D:\Repositories\dotnet-configuration\src\Loaders\ConfigurationLoader.cs
Line coverage
100%
Covered lines: 59
Uncovered lines: 0
Coverable lines: 59
Total lines: 138
Line coverage: 100%
Branch coverage
77%
Covered branches: 14
Total branches: 18
Branch coverage: 77.7%
Method coverage
100%
Covered methods: 4
Fully covered methods: 2
Total methods: 4
Method coverage: 100%
Full method coverage: 50%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%44100%
.ctor(...)50%44100%
LoadEnvironment()100%44100%
LoadAppSettings()100%66100%

File(s)

D:\Repositories\dotnet-configuration\src\Loaders\ConfigurationLoader.cs

#LineLine coverage
 1using ArturRios.Configuration.Enums;
 2using DotNetEnv;
 3using Microsoft.Extensions.Configuration;
 4using Microsoft.Extensions.Logging;
 5
 6namespace ArturRios.Configuration.Loaders;
 7
 8/// <summary>
 9/// Provides helper methods to load environment variables from <c>.env</c> files and
 10/// application settings from <c>appsettings.&lt;Environment&gt;.json</c> files.
 11/// </summary>
 12/// <remarks>
 13/// By default, it looks for files under the <c>Environments</c> and <c>Settings</c> folders within the application base
 14/// If a specific environment file is not found, it falls back to the <see cref="EnvironmentType.Local"/> environment.
 15/// </remarks>
 16public class ConfigurationLoader
 17{
 18    /// <summary>
 19    /// Default environment name used when a specific environment file cannot be found.
 20    /// </summary>
 21    private const string DefaultEnvironmentName = nameof(EnvironmentType.Local);
 22    /// <summary>
 23    /// Default folder name that contains <c>.env</c> files.
 24    /// </summary>
 25    private const string DefaultEnvFileFolder = "Environments";
 26    /// <summary>
 27    /// Default folder name that contains <c>appsettings</c> files.
 28    /// </summary>
 29    private const string DefaultAppSettingsFolder = "Settings";
 30    private readonly string _basePath;
 31    private readonly IConfigurationBuilder? _configurationBuilder;
 32    private readonly string _environmentName;
 33    private readonly ILogger<ConfigurationLoader> _logger;
 34
 35    /// <summary>
 36    /// Initializes a new instance of <see cref="ConfigurationLoader"/> using an existing <see cref="IConfigurationBuild
 37    /// </summary>
 38    /// <param name="configurationBuilder">The configuration builder where JSON files will be added.</param>
 39    /// <param name="environmentName">The environment name (e.g., <c>Local</c>, <c>Development</c>, <c>Staging</c>, <c>P
 40    /// <param name="basePath">Optional base path to search for files. If not provided, the current domain base director
 41    /// <param name="logger">Optional logger instance. If not provided, a console logger is created.</param>
 342    public ConfigurationLoader(IConfigurationBuilder configurationBuilder, string environmentName,
 343        string? basePath = null, ILogger<ConfigurationLoader>? logger = null)
 344    {
 345        _configurationBuilder = configurationBuilder;
 346        _environmentName = environmentName;
 347        _basePath = string.IsNullOrEmpty(basePath) ? AppDomain.CurrentDomain.BaseDirectory : basePath;
 348        _logger = logger ?? LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<ConfigurationLoader>();
 349    }
 50
 51    /// <summary>
 52    /// Initializes a new instance of <see cref="ConfigurationLoader"/> without a configuration builder.
 53    /// </summary>
 54    /// <param name="environmentName">The environment name (e.g., <c>Local</c>, <c>Development</c>, <c>Staging</c>, <c>P
 55    /// <param name="basePath">Optional base path to search for files. If not provided, the current domain base director
 56    /// <param name="logger">Optional logger instance. If not provided, a console logger is created.</param>
 57    /// <remarks>
 58    /// Use <see cref="LoadEnvironment"/> with this constructor. <see cref="LoadAppSettings"/> requires an <see cref="IC
 59    /// </remarks>
 460    public ConfigurationLoader(string environmentName, string? basePath = null,
 461        ILogger<ConfigurationLoader>? logger = null)
 462    {
 463        _environmentName = environmentName;
 464        _basePath = string.IsNullOrEmpty(basePath) ? AppDomain.CurrentDomain.BaseDirectory : basePath;
 465        _logger = logger ?? LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<ConfigurationLoader>();
 466    }
 67
 68    /// <summary>
 69    /// Loads environment variables from a specific <c>.env</c> file based on the configured environment.
 70    /// </summary>
 71    /// <remarks>
 72    /// It looks for <c>Environments/.env.&lt;environment&gt;</c> and falls back to <c>Environments/.env.local</c> if no
 73    /// </remarks>
 74    public void LoadEnvironment()
 375    {
 376        var envFolder = Path.Combine(_basePath, DefaultEnvFileFolder);
 377        var envFile = Path.Combine(envFolder, $".env.{_environmentName.ToLower()}");
 378        var defaultEnvFile = Path.Combine(envFolder, $".env.{DefaultEnvironmentName.ToLower()}");
 79
 380        if (File.Exists(envFile))
 181        {
 182            _logger.LogInformation("Loading variables for {EnvironmentName} environment...", _environmentName);
 83
 184            Env.Load(envFile);
 185        }
 286        else if (File.Exists(defaultEnvFile))
 187        {
 188            _logger.LogInformation(
 189                "Could not find variables for {EnvironmentName} environment. Loading default environment {DefaultEnviron
 190                _environmentName, DefaultEnvironmentName);
 91
 192            Env.Load(defaultEnvFile);
 193        }
 94        else
 195        {
 196            _logger.LogInformation("Could not find any environment variables");
 197        }
 398    }
 99
 100    /// <summary>
 101    /// Loads JSON application settings for the configured environment into the provided <see cref="IConfigurationBuilde
 102    /// </summary>
 103    /// <exception cref="InvalidOperationException">Thrown when no <see cref="IConfigurationBuilder"/> was provided in t
 104    /// <remarks>
 105    /// It looks for <c>Settings/appsettings.&lt;environment&gt;.json</c> and falls back to <c>Settings/appsettings.loca
 106    /// </remarks>
 107    public void LoadAppSettings()
 4108    {
 4109        var settingsFolder = Path.Combine(_basePath, DefaultAppSettingsFolder);
 4110        var envSettingsFile = Path.Combine(settingsFolder, $"appsettings.{_environmentName}.json");
 4111        var defaultSettingsFile = Path.Combine(settingsFolder, $"appsettings.{DefaultEnvironmentName}.json");
 112
 4113        if (_configurationBuilder is null)
 1114        {
 1115            throw new InvalidOperationException(
 1116                "Cannot load appsettings.json if configuration builder is not provided on constructor");
 117        }
 118
 3119        if (File.Exists(envSettingsFile))
 1120        {
 1121            _logger.LogInformation("Loading app settings for {EnvironmentName} environment...", _environmentName);
 122
 1123            _configurationBuilder.AddJsonFile(envSettingsFile, false, true);
 1124        }
 2125        else if (File.Exists(defaultSettingsFile))
 1126        {
 1127            _logger.LogInformation(
 1128                "Could not find app settings for {EnvironmentName} environment. Loading default environment {DefaultEnvi
 1129                _environmentName, DefaultEnvironmentName);
 130
 1131            _configurationBuilder.AddJsonFile(defaultSettingsFile, false, true);
 1132        }
 133        else
 1134        {
 1135            _logger.LogInformation("Could not find any app settings");
 1136        }
 3137    }
 138}