From 070b279a7d672fb624104d906b3ee5d5b2e760a9 Mon Sep 17 00:00:00 2001 From: Dominik Mlynek Date: Sat, 23 Mar 2024 22:09:07 +0000 Subject: [PATCH] add `Config.env_parse_arrays` --- lib/config.rb | 1 + lib/config/sources/env_source.rb | 7 +++++-- spec/config_env_spec.rb | 31 +++++++++++++++++++++++++++++++ spec/sources/env_source_spec.rb | 4 ++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lib/config.rb b/lib/config.rb index 0efde070..953e9c67 100644 --- a/lib/config.rb +++ b/lib/config.rb @@ -18,6 +18,7 @@ module Config env_separator: '.', env_converter: :downcase, env_parse_values: true, + env_parse_arrays: false, fail_on_missing: false, file_name: 'settings', dir_name: 'settings', diff --git a/lib/config/sources/env_source.rb b/lib/config/sources/env_source.rb index fdc424a1..ea527db4 100644 --- a/lib/config/sources/env_source.rb +++ b/lib/config/sources/env_source.rb @@ -6,17 +6,20 @@ class EnvSource attr_reader :separator attr_reader :converter attr_reader :parse_values + attr_reader :parse_arrays def initialize(env, prefix: Config.env_prefix || Config.const_name, separator: Config.env_separator, converter: Config.env_converter, - parse_values: Config.env_parse_values) + parse_values: Config.env_parse_values, + parse_arrays: Config.env_parse_arrays) @env = env @prefix = prefix.to_s.split(separator) @separator = separator @converter = converter @parse_values = parse_values + @parse_arrays = parse_arrays end def load @@ -52,7 +55,7 @@ def load leaf[keys.last] = parse_values ? __value(value) : value end - convert_hashes_to_arrays(hash) + parse_arrays ? convert_hashes_to_arrays(hash) : hash end private diff --git a/spec/config_env_spec.rb b/spec/config_env_spec.rb index 65e7da8b..a5eee612 100644 --- a/spec/config_env_spec.rb +++ b/spec/config_env_spec.rb @@ -22,6 +22,7 @@ Config.env_separator = '.' Config.env_converter = :downcase Config.env_parse_values = true + Config.env_parse_arrays = true end it 'should add new setting from ENV variable' do @@ -96,6 +97,36 @@ end end + context 'and parsing ENV variables arrays' do + context 'is enabled' do + before :each do + Config.env_parse_arrays = true + end + + it 'should recognize ENV variables with subsequent numeric suffixes starting from 0 as array' do + ENV['Settings.SomeConfig.0'] = 'first' + ENV['Settings.SomeConfig.1'] = 'second' + + expect(config.someconfig).to eq(['first', 'second']) + end + end + + context 'is disabled' do + before :each do + Config.env_parse_arrays = false + end + + it 'should not recognize ENV variables with subsequent numeric suffixes starting from 0 as array' do + ENV['Settings.SomeConfig.0'] = 'first' + ENV['Settings.SomeConfig.1'] = 'second' + + expect(config.someconfig).to be_a Config::Options + expect(config.someconfig['0']).to eq('first') + expect(config.someconfig['1']).to eq('second') + end + end + end + context 'and custom ENV variables prefix is defined' do before :each do Config.env_prefix = 'MyConfig' diff --git a/spec/sources/env_source_spec.rb b/spec/sources/env_source_spec.rb index 356ea821..08511a30 100644 --- a/spec/sources/env_source_spec.rb +++ b/spec/sources/env_source_spec.rb @@ -45,6 +45,10 @@ module Config::Sources end describe 'arrays' do + before(:each) do + Config.env_parse_arrays = true + end + let(:source) do Config.env_converter = nil EnvSource.new({