dry-config 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e1b2402d421af2bd536b7fa28342000bcdbb71e9
4
- data.tar.gz: ad9ec289bc4aa3af5ca980ccd1bfdb046818a689
3
+ metadata.gz: 930941affd9017b1baf6523ff3f7bdd1446556f5
4
+ data.tar.gz: fe728b093446b3db3cbb0c4433230572246e4ada
5
5
  SHA512:
6
- metadata.gz: ae3ba6e99b1661bb39cdcc980031245739f0899fd51ade6cea8cf61e6f60ad91c1ae228f7fb1585a16f3f0d9f203dd7cd3bee6ea6f2fb5cdb1df7be5830b8f80
7
- data.tar.gz: 99dfa4d86675714763b8ebc9ad587ebfee8c5b2698e7ae4598e09264ce0cb0a1bd012f29feb6e24506f42f1d2d61b66ec306a36a30f87ffa78b2a1d1fd037260
6
+ metadata.gz: f5a1875c5fd8705e613b950fc08ac9ef983ba6a5b52d392a23721e332806782978d3fa6fc7d0fbca57f49255caf6c611b04d65694a01af12536a2c771a94c7e7
7
+ data.tar.gz: edf646def929bb16f294ffef1badeabfbd38c0856f35e1a7e6680214ec6bc11cf2cc4bfb3d13e4378d65a827e1613e8bd2d2db9b528b6976338a97b8e50b2d25
data/README.md CHANGED
@@ -140,6 +140,19 @@ interpolations:
140
140
  ```
141
141
 
142
142
  ## Options
143
+
144
+ The default configuration is provided below, override any of these values on construction:
145
+ ```ruby
146
+ {
147
+ env: ENV, # default to ENV for interpolation
148
+ interpolation: true, # interpolate contents on read with env (above defaults to the current process's ENV)
149
+ symbolize: true, # provide symbol based key access for everything i.e. access :development instead of 'development' as a rule
150
+ unsymbolize_to_yaml: true, # on to_yaml or write_yaml_file unsymbolize keys (several external tools do not do well with symbolized keys i.e. write `development:` instead of `:development:`
151
+ default_configuration: {}, # seed configuration (file contents overlay this)
152
+ potential_environments:
153
+ [:development, :test, :staging, :production] # used for pruning (optional)
154
+ }
155
+ ```
143
156
  - Expected environments are `[:development, :test, :staging, :production]`. Expand or redefine `@potential_environments` these by overriding the `#initialize` or doing so in your optional `#seed_default_configuration`. This is used in the used in the overlay pruning process to prevent unused branches of configuration from showing up in the resolved configuration.
144
157
  - An optional `#seed_default_configuration` allows you to provide a configuration base
145
158
  - `#clear` will restore to the seed configuration, allowing you to `#load!` new settings.
@@ -23,15 +23,17 @@ module Dry
23
23
 
24
24
  def initialize(options = {})
25
25
  @options = {
26
- interpolation: true,
27
- symbolize: true,
28
- default_configuration: {},
29
- potential_environments: [:development, :test, :staging, :production]
26
+ env: ENV, # default to ENV for interpolation
27
+ interpolation: true, # interpolate string contents on read with given ENV
28
+ symbolize: true, # provide symbol based key access for everything
29
+ unsymbolize_to_yaml: true, # on to_yaml or write_yaml_file unsymbolize keys
30
+ default_configuration: {}, # seed configuration
31
+ potential_environments: [:development, :test, :staging, :production] # used for pruning (optional)
30
32
  }.merge options
31
33
 
32
34
  @default_configuration = @options[:default_configuration]
33
35
 
34
- # used for pruning initial base set. See #load!
36
+ # (optional) used for pruning initial base set. See #resolve_config
35
37
  @potential_environments = @options[:potential_environments]
36
38
 
37
39
  # setup a default configuration
@@ -47,8 +49,8 @@ module Dry
47
49
  # raise 'Unspecified environment' if environment.nil?
48
50
  raise 'Unspecified filename' if filenames.nil?
49
51
 
50
- # ensure symbol
51
- environment = environment.to_sym unless environment.nil?
52
+ # ensure symbol if symbolize?
53
+ environment = environment.to_sym if symbolize? && !environment.nil?
52
54
 
53
55
  # save these in case we #reload
54
56
  @environment = environment
@@ -95,16 +97,17 @@ module Dry
95
97
  file = File.open(filename, 'r:bom|utf-8')
96
98
  contents = file.read
97
99
 
100
+ env = @options[:env]
98
101
  if interpolate?
99
102
  # interpolate/substitute/expand ENV variables with the string contents before parsing
100
103
  # bash - $VAR
101
- contents = contents.gsub(/\$(\w+)/) { ENV[$1] }
104
+ contents = contents.gsub(/\$(\w+)/) { env[$1] }
102
105
  # bash - ${VAR}
103
- contents = contents.gsub(/\${(\w+)}/) { ENV[$1] }
104
- # bash - ~ is ENV['HOME']
105
- contents = contents.gsub(/(~)/) { ENV['HOME'] }
106
+ contents = contents.gsub(/\${(\w+)}/) { env[$1] }
107
+ # bash - ~ is env['HOME']
108
+ contents = contents.gsub(/(~)/) { env['HOME'] }
106
109
  # ruby - #{VAR}
107
- contents = contents.gsub(/\#{(\w+)}/) { ENV[$1] }
110
+ contents = contents.gsub(/\#{(\w+)}/) { env[$1] }
108
111
  end
109
112
  # now parse
110
113
  config = Psych.load(contents, filename)
@@ -114,10 +117,19 @@ module Dry
114
117
  config
115
118
  end
116
119
 
120
+ def to_yaml
121
+ if unsymbolize_to_yaml?
122
+ config = @configuration.dup.deep_symbolize(true)
123
+ else
124
+ config = @configuration
125
+ end
126
+
127
+ Psych.dump(config)
128
+ end
117
129
 
118
130
  def write_yaml_file(filename)
119
131
  File.open(filename, 'w') do |file|
120
- file.write(Psych.dump(@configuration))
132
+ file.write(to_yaml)
121
133
  end
122
134
  end
123
135
 
@@ -160,6 +172,10 @@ module Dry
160
172
  @options[:symbolize]
161
173
  end
162
174
 
175
+ def unsymbolize_to_yaml?
176
+ @options[:unsymbolize_to_yaml]
177
+ end
178
+
163
179
  def interpolate?
164
180
  @options[:interpolation]
165
181
  end
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Config
3
- VERSION = '1.2.2'
3
+ VERSION = '1.2.3'
4
4
  end
5
5
  end
@@ -4,8 +4,6 @@ require 'singleton'
4
4
  describe Dry::Config::Base do
5
5
 
6
6
  class AcmeConfig < Dry::Config::Base
7
- include Singleton
8
-
9
7
  def initialize(options = {})
10
8
  options = {
11
9
  # seed the sensible defaults here (overridable)
@@ -22,19 +20,24 @@ describe Dry::Config::Base do
22
20
  end
23
21
  end
24
22
 
25
- subject(:acmeConfig) { AcmeConfig.instance }
23
+ class SingletonAcmeConfig < AcmeConfig
24
+ include Singleton
25
+ end
26
+
27
+ subject(:acmeConfig) { AcmeConfig.new }
28
+ before(:each) {
29
+ acmeConfig.clear
30
+ }
26
31
 
27
32
  it 'should work as a singleton' do
28
- expect(acmeConfig).to equal(AcmeConfig.instance)
33
+ expect(SingletonAcmeConfig.instance).to equal(SingletonAcmeConfig.instance)
29
34
  end
30
35
 
31
36
  it 'should not raise error when key is not found' do
32
- acmeConfig.clear
33
37
  expect(acmeConfig.app).to be_nil
34
38
  end
35
39
 
36
40
  it 'should provide seed configuration' do
37
- acmeConfig.clear
38
41
  assert_common_seed_settings
39
42
  expect(acmeConfig.options.length).to eql 0
40
43
 
@@ -45,13 +48,12 @@ describe Dry::Config::Base do
45
48
 
46
49
  context 'hash delegation' do
47
50
  it 'manupulated delegated methods setter/getter/include?' do
48
- acmeConfig.clear
49
51
  acmeConfig.load!(nil, config_file_path)
50
52
  expect(acmeConfig.symbolize?).to be_truthy
51
53
 
52
54
  acmeConfig['foo'] = 'bar'
53
- expect(acmeConfig.configuration['foo']).to be_nil # no symbolization on direct access
54
- expect(acmeConfig['foo']).to eq 'bar' # symbolization based on options
55
+ expect(acmeConfig.configuration['foo']).to be_nil # no symbolization manipulation to key on direct access to underlying hash
56
+ expect(acmeConfig['foo']).to eq 'bar' # symbolization manipulation of key based on options
55
57
 
56
58
  expect(acmeConfig.configuration[:foo]).to eq 'bar' # setter symbolizes, this works
57
59
  expect(acmeConfig[:foo]).to eq 'bar'
@@ -61,7 +63,7 @@ describe Dry::Config::Base do
61
63
  end
62
64
 
63
65
  it 'direct delegation' do
64
- acmeConfig.clear
66
+
65
67
  acmeConfig.load!(nil, config_file_path)
66
68
  expect(acmeConfig.symbolize?).to be_truthy
67
69
 
@@ -76,10 +78,41 @@ describe Dry::Config::Base do
76
78
  end
77
79
  end
78
80
 
81
+ context 'unsymbolize_to_yaml' do
82
+ it 'defaults to unsymbolized' do
83
+ acmeConfig.load!(nil, config_file_path)
84
+ expect(acmeConfig.symbolize?).to be_truthy
85
+ expect(acmeConfig.unsymbolize_to_yaml?).to be_truthy
86
+
87
+ yaml = acmeConfig.to_yaml
88
+ # puts yaml
89
+ expect(yaml =~ /\:app\:/).to be_falsey
90
+ expect(yaml =~ /app\:/).to be_truthy
91
+
92
+ expect(yaml =~ /\:strategy\:/).to be_falsey
93
+ expect(yaml =~ /strategy\:/).to be_truthy
94
+ end
95
+
96
+ context 'symbolize: false' do
97
+ subject(:acmeConfig) { AcmeConfig.new(unsymbolize_to_yaml:false) }
98
+
99
+ it 'should leave keys symbolized' do
100
+ acmeConfig.load!(nil, config_file_path)
101
+ expect(acmeConfig.symbolize?).to be_truthy
102
+ expect(acmeConfig.unsymbolize_to_yaml?).to be_falsey
103
+
104
+ yaml = acmeConfig.to_yaml
105
+ # puts yaml
106
+ expect(yaml =~ /\:app\:/).to be_truthy
107
+ expect(yaml =~ /\:strategy\:/).to be_truthy
108
+ end
109
+ end
110
+ end
111
+
79
112
  context 'when loading a single configuration file' do
80
113
 
81
114
  it 'should read file with nil environment' do
82
- acmeConfig.clear
115
+
83
116
  acmeConfig.load!(nil, config_file_path)
84
117
 
85
118
  assert_common_seed_settings
@@ -94,7 +127,7 @@ describe Dry::Config::Base do
94
127
  end
95
128
 
96
129
  it 'should override with development environment' do
97
- acmeConfig.clear
130
+
98
131
  acmeConfig.load!(:development, config_file_path)
99
132
 
100
133
  # assert_common_seed_settings
@@ -111,7 +144,7 @@ describe Dry::Config::Base do
111
144
  end
112
145
 
113
146
  it 'should override with production environment' do
114
- acmeConfig.clear
147
+
115
148
  acmeConfig.load!(:production, config_file_path)
116
149
 
117
150
  # assert_common_seed_settings
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-config
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Ross