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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -930
  3. data/Rakefile +6 -0
  4. data/lib/chamber.rb +11 -7
  5. data/lib/chamber/binary/heroku.rb +45 -25
  6. data/lib/chamber/binary/runner.rb +82 -44
  7. data/lib/chamber/binary/travis.rb +14 -8
  8. data/lib/chamber/commands/base.rb +1 -2
  9. data/lib/chamber/commands/comparable.rb +0 -1
  10. data/lib/chamber/commands/compare.rb +1 -1
  11. data/lib/chamber/commands/files.rb +0 -1
  12. data/lib/chamber/commands/heroku.rb +2 -3
  13. data/lib/chamber/commands/heroku/push.rb +1 -1
  14. data/lib/chamber/commands/initialize.rb +69 -12
  15. data/lib/chamber/commands/securable.rb +9 -4
  16. data/lib/chamber/commands/secure.rb +1 -1
  17. data/lib/chamber/commands/show.rb +20 -4
  18. data/lib/chamber/commands/travis.rb +0 -1
  19. data/lib/chamber/configuration.rb +5 -5
  20. data/lib/chamber/context_resolver.rb +12 -12
  21. data/lib/chamber/decryption_key.rb +51 -0
  22. data/lib/chamber/environmentable.rb +4 -1
  23. data/lib/chamber/errors/decryption_failure.rb +6 -0
  24. data/lib/chamber/file.rb +7 -8
  25. data/lib/chamber/file_set.rb +23 -22
  26. data/lib/chamber/filters/boolean_conversion_filter.rb +1 -2
  27. data/lib/chamber/filters/decryption_filter.rb +42 -25
  28. data/lib/chamber/filters/encryption_filter.rb +7 -5
  29. data/lib/chamber/filters/environment_filter.rb +7 -7
  30. data/lib/chamber/filters/failed_decryption_filter.rb +41 -0
  31. data/lib/chamber/filters/namespace_filter.rb +1 -1
  32. data/lib/chamber/filters/secure_filter.rb +3 -5
  33. data/lib/chamber/filters/translate_secure_keys_filter.rb +5 -24
  34. data/lib/chamber/namespace_set.rb +6 -6
  35. data/lib/chamber/rails.rb +1 -3
  36. data/lib/chamber/rails/railtie.rb +6 -3
  37. data/lib/chamber/settings.rb +34 -32
  38. data/lib/chamber/version.rb +1 -1
  39. data/spec/fixtures/settings.yml +1 -0
  40. data/spec/lib/chamber/commands/files_spec.rb +4 -2
  41. data/spec/lib/chamber/commands/secure_spec.rb +8 -5
  42. data/spec/lib/chamber/commands/show_spec.rb +18 -3
  43. data/spec/lib/chamber/context_resolver_spec.rb +38 -18
  44. data/spec/lib/chamber/file_set_spec.rb +73 -52
  45. data/spec/lib/chamber/file_spec.rb +37 -23
  46. data/spec/lib/chamber/filters/boolean_conversion_filter_spec.rb +35 -33
  47. data/spec/lib/chamber/filters/decryption_filter_spec.rb +142 -21
  48. data/spec/lib/chamber/filters/encryption_filter_spec.rb +51 -19
  49. data/spec/lib/chamber/filters/environment_filter_spec.rb +12 -6
  50. data/spec/lib/chamber/filters/failed_decryption_filter_spec.rb +53 -0
  51. data/spec/lib/chamber/filters/insecure_filter_spec.rb +38 -18
  52. data/spec/lib/chamber/filters/namespace_filter_spec.rb +38 -38
  53. data/spec/lib/chamber/filters/secure_filter_spec.rb +10 -10
  54. data/spec/lib/chamber/filters/translate_secure_keys_filter_spec.rb +9 -6
  55. data/spec/lib/chamber/namespace_set_spec.rb +7 -5
  56. data/spec/lib/chamber/settings_spec.rb +168 -79
  57. data/spec/lib/chamber_spec.rb +72 -71
  58. metadata +22 -21
  59. data/lib/chamber/errors/undecryptable_value_error.rb +0 -6
  60. data/templates/settings.yml +0 -14
@@ -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://<%= Chamber[:test][:my_username] %>:<%= Chamber[:test][:my_password] %>@127.0.0.1
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(:basepath => '/tmp/chamber') }
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(:basepath => '/tmp/chamber')
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(:basepath => Pathname.new('/tmp/chamber'))
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(:basepath => '/tmp/chamber')
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( :basepath => '/tmp/chamber',
127
- :namespaces => {
128
- :my_namespace => -> { 'blue' } } )
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( :basepath => '/tmp/chamber',
136
- :namespaces => {
137
- :first_namespace_call => -> { :first },
138
- :second_namespace_call => -> { :second }, } )
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 ['first', 'second']
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( :basepath => '/tmp/chamber',
145
- :namespaces => {
146
- :first_namespace_call => -> { :first },
147
- :first_namespace_call => -> { :first }, } )
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( :basepath => '/tmp/chamber',
154
- :namespaces => {
155
- :my_namespace => -> { 'blue' } } )
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( :basepath => '/tmp/chamber',
162
- :namespaces => {
163
- :my_namespace => -> { 'blue' } } )
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(:basepath => '/tmp/chamber')
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 does not understand' do
173
- expect{ Chamber.env.i_do_not_know }.to raise_error NoMethodError
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( :basepath => '/tmp/chamber',
178
- :namespaces => {
179
- :non_existant_namespace => -> { false } } )
172
+ Chamber.load(basepath: '/tmp/chamber',
173
+ namespaces: {
174
+ non_existant_namespace: -> { false } })
180
175
 
181
- expect { Chamber.load(:basepath => '/tmp/chamber') }.not_to raise_error
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( :basepath => '/tmp/chamber',
186
- :namespaces => {
187
- :my_namespace => -> { 'blue' } } )
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 any exist' do
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 a value namespace' do
203
- Chamber.load( :basepath => '/tmp/chamber',
204
- :namespaces => {
205
- :my_namespace => -> { 'blue' } } )
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( :basepath => '/tmp/chamber',
212
- :namespaces => {
213
- :my_namespace => -> { 'blue' } } )
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( :basepath => '/tmp/chamber',
220
- :namespaces => {
221
- :my_namespace => -> { 'blue' } } )
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 it does not know they are namespaced' do
227
- Chamber.load(:basepath => '/tmp/chamber')
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(:basepath => '/tmp/chamber')
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 use data from credentials in subsequently loaded files' do
259
- expect(Chamber[:test][:my_ftp_url]).to eql 'ftp://username:password@127.0.0.1'
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/credentials.yml']
268
-
269
- expect(Chamber.filenames).to eql ['/tmp/chamber/credentials.yml']
270
- expect(Chamber.to_hash).to eql('test' => {
271
- 'my_username' => 'username',
272
- 'my_password' => 'password', } )
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: '/tmp/chamber',
277
- files: 'credentials.yml'
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: '/tmp/chamber/secure.yml',
296
- decryption_key: './spec/spec_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.0
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-09-23 00:00:00.000000000 Z
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
- Chamber lets you source your Settings from an arbitrary number of YAML files and
88
- provides a simple mechanism for overriding settings from the ENV, which is
89
- friendly to how Heroku addons work.
90
- email: mark@stevenhallen.com
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/undecryptable_value_error.rb
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
- - templates/settings.yml
175
- homepage: https://github.com/m5rk/chamber
176
- licenses: []
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: chamber
196
- rubygems_version: 2.2.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
@@ -1,6 +0,0 @@
1
- module Chamber
2
- module Errors
3
- class UndecryptableValueError < RuntimeError
4
- end
5
- end
6
- end
@@ -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