chamber 2.4.0 → 2.7.1
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 +4 -4
- data/README.md +16 -930
- data/Rakefile +6 -0
- data/lib/chamber.rb +11 -7
- data/lib/chamber/binary/heroku.rb +45 -25
- data/lib/chamber/binary/runner.rb +82 -44
- data/lib/chamber/binary/travis.rb +14 -8
- data/lib/chamber/commands/base.rb +1 -2
- data/lib/chamber/commands/comparable.rb +0 -1
- data/lib/chamber/commands/compare.rb +1 -1
- data/lib/chamber/commands/files.rb +0 -1
- data/lib/chamber/commands/heroku.rb +2 -3
- data/lib/chamber/commands/heroku/push.rb +1 -1
- data/lib/chamber/commands/initialize.rb +69 -12
- data/lib/chamber/commands/securable.rb +9 -4
- data/lib/chamber/commands/secure.rb +1 -1
- data/lib/chamber/commands/show.rb +20 -4
- data/lib/chamber/commands/travis.rb +0 -1
- data/lib/chamber/configuration.rb +5 -5
- data/lib/chamber/context_resolver.rb +12 -12
- data/lib/chamber/decryption_key.rb +51 -0
- data/lib/chamber/environmentable.rb +4 -1
- data/lib/chamber/errors/decryption_failure.rb +6 -0
- data/lib/chamber/file.rb +7 -8
- data/lib/chamber/file_set.rb +23 -22
- data/lib/chamber/filters/boolean_conversion_filter.rb +1 -2
- data/lib/chamber/filters/decryption_filter.rb +42 -25
- data/lib/chamber/filters/encryption_filter.rb +7 -5
- data/lib/chamber/filters/environment_filter.rb +7 -7
- data/lib/chamber/filters/failed_decryption_filter.rb +41 -0
- data/lib/chamber/filters/namespace_filter.rb +1 -1
- data/lib/chamber/filters/secure_filter.rb +3 -5
- data/lib/chamber/filters/translate_secure_keys_filter.rb +5 -24
- data/lib/chamber/namespace_set.rb +6 -6
- data/lib/chamber/rails.rb +1 -3
- data/lib/chamber/rails/railtie.rb +6 -3
- data/lib/chamber/settings.rb +34 -32
- data/lib/chamber/version.rb +1 -1
- data/spec/fixtures/settings.yml +1 -0
- data/spec/lib/chamber/commands/files_spec.rb +4 -2
- data/spec/lib/chamber/commands/secure_spec.rb +8 -5
- data/spec/lib/chamber/commands/show_spec.rb +18 -3
- data/spec/lib/chamber/context_resolver_spec.rb +38 -18
- data/spec/lib/chamber/file_set_spec.rb +73 -52
- data/spec/lib/chamber/file_spec.rb +37 -23
- data/spec/lib/chamber/filters/boolean_conversion_filter_spec.rb +35 -33
- data/spec/lib/chamber/filters/decryption_filter_spec.rb +142 -21
- data/spec/lib/chamber/filters/encryption_filter_spec.rb +51 -19
- data/spec/lib/chamber/filters/environment_filter_spec.rb +12 -6
- data/spec/lib/chamber/filters/failed_decryption_filter_spec.rb +53 -0
- data/spec/lib/chamber/filters/insecure_filter_spec.rb +38 -18
- data/spec/lib/chamber/filters/namespace_filter_spec.rb +38 -38
- data/spec/lib/chamber/filters/secure_filter_spec.rb +10 -10
- data/spec/lib/chamber/filters/translate_secure_keys_filter_spec.rb +9 -6
- data/spec/lib/chamber/namespace_set_spec.rb +7 -5
- data/spec/lib/chamber/settings_spec.rb +168 -79
- data/spec/lib/chamber_spec.rb +72 -71
- metadata +22 -21
- data/lib/chamber/errors/undecryptable_value_error.rb +0 -6
- data/templates/settings.yml +0 -14
data/spec/lib/chamber_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rspectacular'
|
|
2
2
|
require 'chamber'
|
3
3
|
require 'fileutils'
|
4
4
|
|
5
|
+
# rubocop:disable Metrics/LineLength
|
5
6
|
FileUtils.mkdir_p '/tmp/chamber/settings' unless File.exist? '/tmp/chamber/settings'
|
6
7
|
|
7
8
|
File.open('/tmp/chamber/settings.yml', 'w+') do |file|
|
@@ -10,7 +11,7 @@ test:
|
|
10
11
|
my_setting: my_value
|
11
12
|
my_boolean: "false"
|
12
13
|
my_dynamic_setting: <%= 1 + 1 %>
|
13
|
-
my_ftp_url: ftp
|
14
|
+
my_ftp_url: ftp://username:password@127.0.0.1
|
14
15
|
another_level:
|
15
16
|
setting_one: 1
|
16
17
|
setting_two: 2
|
@@ -30,14 +31,6 @@ test:
|
|
30
31
|
HEREDOC
|
31
32
|
end
|
32
33
|
|
33
|
-
File.open('/tmp/chamber/credentials.yml', 'w+') do |file|
|
34
|
-
file.puts <<-HEREDOC
|
35
|
-
test:
|
36
|
-
my_username: username
|
37
|
-
my_password: password
|
38
|
-
HEREDOC
|
39
|
-
end
|
40
|
-
|
41
34
|
File.open('/tmp/chamber/settings-blue.yml', 'w+') do |file|
|
42
35
|
file.puts <<-HEREDOC
|
43
36
|
test:
|
@@ -79,16 +72,16 @@ only_namespaced_sub_settings:
|
|
79
72
|
end
|
80
73
|
|
81
74
|
describe Chamber do
|
82
|
-
before(:each) { Chamber.load(:
|
75
|
+
before(:each) { Chamber.load(basepath: '/tmp/chamber') }
|
83
76
|
|
84
77
|
it 'knows how to load itself with a path string' do
|
85
|
-
Chamber.load(:
|
78
|
+
Chamber.load(basepath: '/tmp/chamber')
|
86
79
|
|
87
80
|
expect(Chamber.configuration.basepath.to_s).to eql '/tmp/chamber'
|
88
81
|
end
|
89
82
|
|
90
83
|
it 'knows how to load itself with a path object' do
|
91
|
-
Chamber.load(:
|
84
|
+
Chamber.load(basepath: Pathname.new('/tmp/chamber'))
|
92
85
|
|
93
86
|
expect(Chamber.configuration.basepath.to_s).to eql '/tmp/chamber'
|
94
87
|
end
|
@@ -113,7 +106,7 @@ describe Chamber do
|
|
113
106
|
ENV['TEST_MY_SETTING'] = 'some_other_value'
|
114
107
|
ENV['TEST_ANOTHER_LEVEL_LEVEL_THREE_AN_ARRAY'] = 'something'
|
115
108
|
|
116
|
-
Chamber.load(:
|
109
|
+
Chamber.load(basepath: '/tmp/chamber')
|
117
110
|
expect(Chamber.test.my_setting).to eql 'some_other_value'
|
118
111
|
expect(Chamber.test.another_level.level_three.an_array).to eql 'something'
|
119
112
|
expect(Chamber.test.my_dynamic_setting).to eql 2
|
@@ -123,75 +116,79 @@ describe Chamber do
|
|
123
116
|
end
|
124
117
|
|
125
118
|
it 'can load files based on the namespace passed in' do
|
126
|
-
Chamber.load(
|
127
|
-
|
128
|
-
|
119
|
+
Chamber.load(basepath: '/tmp/chamber',
|
120
|
+
namespaces: {
|
121
|
+
my_namespace: -> { 'blue' } })
|
129
122
|
|
130
123
|
expect(Chamber.other.everything).to eql 'works'
|
131
124
|
expect(Chamber.test.my_dynamic_setting).to eql 2
|
132
125
|
end
|
133
126
|
|
134
127
|
it 'loads multiple namespaces if it is called twice' do
|
135
|
-
Chamber.load(
|
136
|
-
|
137
|
-
|
138
|
-
|
128
|
+
Chamber.load(basepath: '/tmp/chamber',
|
129
|
+
namespaces: {
|
130
|
+
first_namespace_call: -> { :first },
|
131
|
+
second_namespace_call: -> { :second } })
|
139
132
|
|
140
|
-
expect(Chamber.namespaces.to_a).to eql
|
133
|
+
expect(Chamber.namespaces.to_a).to eql %w{first second}
|
141
134
|
end
|
142
135
|
|
143
136
|
it 'does not load the same namespace twice' do
|
144
|
-
Chamber.load(
|
145
|
-
|
146
|
-
|
147
|
-
|
137
|
+
Chamber.load(basepath: '/tmp/chamber',
|
138
|
+
namespaces: {
|
139
|
+
first_namespace_call: -> { :first },
|
140
|
+
first_namespace_call: -> { :first } })
|
148
141
|
|
149
142
|
expect(Chamber.namespaces.to_a).to eql ['first']
|
150
143
|
end
|
151
144
|
|
152
145
|
it 'will load settings files which are only namespaced' do
|
153
|
-
Chamber.load(
|
154
|
-
|
155
|
-
|
146
|
+
Chamber.load(basepath: '/tmp/chamber',
|
147
|
+
namespaces: {
|
148
|
+
my_namespace: -> { 'blue' } })
|
156
149
|
|
157
150
|
expect(Chamber[:only_namespaced_sub_settings][:another_sub_setting]).to eql 'namespaced'
|
158
151
|
end
|
159
152
|
|
160
153
|
it 'clears all settings each time the settings are loaded' do
|
161
|
-
Chamber.load(
|
162
|
-
|
163
|
-
|
154
|
+
Chamber.load(basepath: '/tmp/chamber',
|
155
|
+
namespaces: {
|
156
|
+
my_namespace: -> { 'blue' } })
|
164
157
|
|
165
158
|
expect(Chamber[:only_namespaced_sub_settings][:another_sub_setting]).to eql 'namespaced'
|
166
159
|
|
167
|
-
Chamber.load(:
|
160
|
+
Chamber.load(basepath: '/tmp/chamber')
|
168
161
|
|
169
162
|
expect(Chamber[:only_namespaced_sub_settings]).to be_nil
|
170
163
|
end
|
171
164
|
|
172
|
-
it 'still raises an error if you try to send a message which the settings hash
|
173
|
-
|
165
|
+
it 'still raises an error if you try to send a message which the settings hash ' \
|
166
|
+
'does not understand' do
|
167
|
+
|
168
|
+
expect { Chamber.env.i_do_not_know }.to raise_error NoMethodError
|
174
169
|
end
|
175
170
|
|
176
171
|
it 'does not raise an exception if a namespaced file does not exist' do
|
177
|
-
Chamber.load(
|
178
|
-
|
179
|
-
|
172
|
+
Chamber.load(basepath: '/tmp/chamber',
|
173
|
+
namespaces: {
|
174
|
+
non_existant_namespace: -> { false } })
|
180
175
|
|
181
|
-
expect { Chamber.load(:
|
176
|
+
expect { Chamber.load(basepath: '/tmp/chamber') }.not_to raise_error
|
182
177
|
end
|
183
178
|
|
184
179
|
it 'merges (not overrides) subsequent settings' do
|
185
|
-
Chamber.load(
|
186
|
-
|
187
|
-
|
180
|
+
Chamber.load(basepath: '/tmp/chamber',
|
181
|
+
namespaces: {
|
182
|
+
my_namespace: -> { 'blue' } })
|
188
183
|
|
189
184
|
expect(Chamber.test.my_setting).to eql 'my_value'
|
190
185
|
expect(Chamber.test.my_other_setting).to eql 'my_other_value'
|
191
186
|
expect(Chamber.test.another_level.setting_one).to eql 3
|
192
187
|
end
|
193
188
|
|
194
|
-
it 'loads YAML files from the "settings" directory under the base directory if
|
189
|
+
it 'loads YAML files from the "settings" directory under the base directory if ' \
|
190
|
+
'any exist' do
|
191
|
+
|
195
192
|
expect(Chamber.sub_settings.my_sub_setting).to eql 'my_sub_setting_value'
|
196
193
|
end
|
197
194
|
|
@@ -199,39 +196,43 @@ describe Chamber do
|
|
199
196
|
expect(Chamber['sub_settings-namespaced']).to be_nil
|
200
197
|
end
|
201
198
|
|
202
|
-
it 'loads namespaced YAML files in the "settings" directory if they correspond to
|
203
|
-
|
204
|
-
|
205
|
-
|
199
|
+
it 'loads namespaced YAML files in the "settings" directory if they correspond to ' \
|
200
|
+
'a value namespace' do
|
201
|
+
|
202
|
+
Chamber.load(basepath: '/tmp/chamber',
|
203
|
+
namespaces: {
|
204
|
+
my_namespace: -> { 'blue' } })
|
206
205
|
|
207
206
|
expect(Chamber['sub_settings']['my_namespaced_sub_setting']).to eql 'my_namespaced_sub_setting_value'
|
208
207
|
end
|
209
208
|
|
210
209
|
it 'loads namespaced settings if they are inline in a non-namespaced filename' do
|
211
|
-
Chamber.load(
|
212
|
-
|
213
|
-
|
210
|
+
Chamber.load(basepath: '/tmp/chamber',
|
211
|
+
namespaces: {
|
212
|
+
my_namespace: -> { 'blue' } })
|
214
213
|
|
215
214
|
expect(Chamber['my_settings_for_inline_namespace']).to eql 'my_value_for_inline_namespace'
|
216
215
|
end
|
217
216
|
|
218
217
|
it 'does not load non-namespaced data from a file if inline namespaces are found' do
|
219
|
-
Chamber.load(
|
220
|
-
|
221
|
-
|
218
|
+
Chamber.load(basepath: '/tmp/chamber',
|
219
|
+
namespaces: {
|
220
|
+
my_namespace: -> { 'blue' } })
|
222
221
|
|
223
222
|
expect(Chamber['my_non_inline_namespaced_setting']).not_to eql 'my_value_for_non_inline_namespace'
|
224
223
|
end
|
225
224
|
|
226
|
-
it 'loads the entire inline namespaced file if no namespaces are passed in since
|
227
|
-
|
225
|
+
it 'loads the entire inline namespaced file if no namespaces are passed in since ' \
|
226
|
+
'it does not know they are namespaced' do
|
227
|
+
|
228
|
+
Chamber.load(basepath: '/tmp/chamber')
|
228
229
|
|
229
230
|
expect(Chamber['blue']['my_settings_for_inline_namespace']).to eql 'my_value_for_inline_namespace'
|
230
231
|
expect(Chamber['my_non_inline_namespaced_setting']).to eql 'my_value_for_non_inline_namespace'
|
231
232
|
end
|
232
233
|
|
233
234
|
it 'can convert the settings to their environment variable versions' do
|
234
|
-
Chamber.load(:
|
235
|
+
Chamber.load(basepath: '/tmp/chamber')
|
235
236
|
|
236
237
|
expect(Chamber.to_environment).to eql(
|
237
238
|
'SUB_SETTINGS_MY_SUB_SETTING' => 'my_sub_setting_value',
|
@@ -242,9 +243,7 @@ describe Chamber do
|
|
242
243
|
'TEST_MY_DYNAMIC_SETTING' => '2',
|
243
244
|
'TEST_MY_SETTING' => 'my_value',
|
244
245
|
'TEST_MY_FTP_URL' => 'ftp://username:password@127.0.0.1',
|
245
|
-
'TEST_MY_PASSWORD' => 'password',
|
246
246
|
'TEST_MY_SETTING' => 'my_value',
|
247
|
-
'TEST_MY_USERNAME' => 'username',
|
248
247
|
'TEST_MY_BOOLEAN' => 'false',
|
249
248
|
'BLUE_MY_SETTINGS_FOR_INLINE_NAMESPACE' => 'my_value_for_inline_namespace',
|
250
249
|
'MY_NON_INLINE_NAMESPACED_SETTING' => 'my_value_for_non_inline_namespace',
|
@@ -255,26 +254,27 @@ describe Chamber do
|
|
255
254
|
expect(Chamber[:test][:my_boolean]).to be_a FalseClass
|
256
255
|
end
|
257
256
|
|
258
|
-
it 'can
|
259
|
-
|
260
|
-
end
|
257
|
+
it 'can notify properly whether it responds to messages if the underlying ' \
|
258
|
+
'settings does' do
|
261
259
|
|
262
|
-
it 'can notify properly whether it responds to messages if the underlying settings does' do
|
263
260
|
expect(Chamber.respond_to?(:sub_settings)).to be_a TrueClass
|
264
261
|
end
|
265
262
|
|
266
263
|
it 'can explicitly specify files without specifying a basepath' do
|
267
|
-
Chamber.load files: ['/tmp/chamber/
|
268
|
-
|
269
|
-
expect(Chamber.filenames).to
|
270
|
-
expect(Chamber.to_hash).to
|
271
|
-
|
272
|
-
|
264
|
+
Chamber.load files: ['/tmp/chamber/settings.yml']
|
265
|
+
|
266
|
+
expect(Chamber.filenames).to eql ['/tmp/chamber/settings.yml']
|
267
|
+
expect(Chamber.to_hash).to include(
|
268
|
+
'test' => include(
|
269
|
+
'my_setting' => 'my_value',
|
270
|
+
'my_ftp_url' => 'ftp://username:password@127.0.0.1',
|
271
|
+
),
|
272
|
+
)
|
273
273
|
end
|
274
274
|
|
275
275
|
it 'ignores the basepath if file patterns are explicitly passed in' do
|
276
|
-
Chamber.load basepath:
|
277
|
-
files:
|
276
|
+
Chamber.load basepath: '/tmp/chamber',
|
277
|
+
files: 'settings.yml'
|
278
278
|
|
279
279
|
expect(Chamber.filenames).to be_empty
|
280
280
|
end
|
@@ -292,9 +292,10 @@ describe Chamber do
|
|
292
292
|
end
|
293
293
|
|
294
294
|
it 'can unencrpyt an already encrpyted value if it has access to the private key' do
|
295
|
-
Chamber.load(files:
|
296
|
-
decryption_key:
|
295
|
+
Chamber.load(files: '/tmp/chamber/secure.yml',
|
296
|
+
decryption_key: './spec/spec_key')
|
297
297
|
|
298
298
|
expect(Chamber.test.my_encrpyted_setting).to eql 'hello'
|
299
299
|
end
|
300
300
|
end
|
301
|
+
# rubocop:enable Metrics/LineLength
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chamber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- stevenhallen
|
8
|
-
- m5rk
|
9
7
|
- thekompanee
|
10
8
|
- jfelchner
|
9
|
+
- stevenhallen
|
10
|
+
- m5rk
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-
|
14
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: thor
|
@@ -83,20 +83,19 @@ dependencies:
|
|
83
83
|
- - "~>"
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: 0.3.0
|
86
|
-
description:
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
email:
|
86
|
+
description: "\n Chamber lets you source your Settings from
|
87
|
+
an arbitrary number of YAML files and\n provides a simple
|
88
|
+
mechanism for overriding settings from the ENV, which is\n friendly
|
89
|
+
to how Heroku addons work.\n "
|
90
|
+
email: hello@thekompanee.com
|
91
91
|
executables:
|
92
92
|
- chamber
|
93
93
|
extensions: []
|
94
|
-
extra_rdoc_files:
|
95
|
-
- README.md
|
96
|
-
- LICENSE
|
94
|
+
extra_rdoc_files: []
|
97
95
|
files:
|
98
96
|
- LICENSE
|
99
97
|
- README.md
|
98
|
+
- Rakefile
|
100
99
|
- bin/chamber
|
101
100
|
- lib/chamber.rb
|
102
101
|
- lib/chamber/binary/heroku.rb
|
@@ -119,14 +118,16 @@ files:
|
|
119
118
|
- lib/chamber/commands/travis/secure.rb
|
120
119
|
- lib/chamber/configuration.rb
|
121
120
|
- lib/chamber/context_resolver.rb
|
121
|
+
- lib/chamber/decryption_key.rb
|
122
122
|
- lib/chamber/environmentable.rb
|
123
|
-
- lib/chamber/errors/
|
123
|
+
- lib/chamber/errors/decryption_failure.rb
|
124
124
|
- lib/chamber/file.rb
|
125
125
|
- lib/chamber/file_set.rb
|
126
126
|
- lib/chamber/filters/boolean_conversion_filter.rb
|
127
127
|
- lib/chamber/filters/decryption_filter.rb
|
128
128
|
- lib/chamber/filters/encryption_filter.rb
|
129
129
|
- lib/chamber/filters/environment_filter.rb
|
130
|
+
- lib/chamber/filters/failed_decryption_filter.rb
|
130
131
|
- lib/chamber/filters/insecure_filter.rb
|
131
132
|
- lib/chamber/filters/namespace_filter.rb
|
132
133
|
- lib/chamber/filters/secure_filter.rb
|
@@ -153,6 +154,7 @@ files:
|
|
153
154
|
- spec/lib/chamber/filters/decryption_filter_spec.rb
|
154
155
|
- spec/lib/chamber/filters/encryption_filter_spec.rb
|
155
156
|
- spec/lib/chamber/filters/environment_filter_spec.rb
|
157
|
+
- spec/lib/chamber/filters/failed_decryption_filter_spec.rb
|
156
158
|
- spec/lib/chamber/filters/insecure_filter_spec.rb
|
157
159
|
- spec/lib/chamber/filters/namespace_filter_spec.rb
|
158
160
|
- spec/lib/chamber/filters/secure_filter_spec.rb
|
@@ -171,14 +173,12 @@ files:
|
|
171
173
|
- spec/rails-4-test/config/application.rb
|
172
174
|
- spec/spec_key
|
173
175
|
- spec/spec_key.pub
|
174
|
-
|
175
|
-
|
176
|
-
|
176
|
+
homepage: https://github.com/thekompanee/chamber
|
177
|
+
licenses:
|
178
|
+
- MIT
|
177
179
|
metadata: {}
|
178
180
|
post_install_message:
|
179
|
-
rdoc_options:
|
180
|
-
- "--charset"
|
181
|
-
- UTF-8
|
181
|
+
rdoc_options: []
|
182
182
|
require_paths:
|
183
183
|
- lib
|
184
184
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -192,8 +192,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
192
|
- !ruby/object:Gem::Version
|
193
193
|
version: '0'
|
194
194
|
requirements: []
|
195
|
-
rubyforge_project:
|
196
|
-
rubygems_version: 2.
|
195
|
+
rubyforge_project:
|
196
|
+
rubygems_version: 2.4.2
|
197
197
|
signing_key:
|
198
198
|
specification_version: 4
|
199
199
|
summary: A surprisingly configurable convention-based approach to managing your application's
|
@@ -214,6 +214,7 @@ test_files:
|
|
214
214
|
- spec/lib/chamber/filters/decryption_filter_spec.rb
|
215
215
|
- spec/lib/chamber/filters/encryption_filter_spec.rb
|
216
216
|
- spec/lib/chamber/filters/environment_filter_spec.rb
|
217
|
+
- spec/lib/chamber/filters/failed_decryption_filter_spec.rb
|
217
218
|
- spec/lib/chamber/filters/insecure_filter_spec.rb
|
218
219
|
- spec/lib/chamber/filters/namespace_filter_spec.rb
|
219
220
|
- spec/lib/chamber/filters/secure_filter_spec.rb
|
data/templates/settings.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
development:
|
2
|
-
setting: development_value
|
3
|
-
# The following will become 'secure_setting'
|
4
|
-
_secure_secure_setting: secure_development_value
|
5
|
-
|
6
|
-
test:
|
7
|
-
setting: test_value
|
8
|
-
# The following will become 'secure_setting'
|
9
|
-
_secure_secure_setting: secure_test_value
|
10
|
-
|
11
|
-
production:
|
12
|
-
setting: production_value
|
13
|
-
# The following will become 'secure_setting'
|
14
|
-
_secure_secure_setting: secure_production_value
|