chamber 2.4.0 → 2.7.1

Sign up to get free protection for your applications and to get access to all the features.
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