dry-config 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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