chamber 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +288 -173
  3. data/bin/chamber +2 -288
  4. data/lib/chamber.rb +19 -67
  5. data/lib/chamber/binary/heroku.rb +59 -0
  6. data/lib/chamber/binary/runner.rb +94 -0
  7. data/lib/chamber/binary/travis.rb +23 -0
  8. data/lib/chamber/commands/base.rb +33 -0
  9. data/lib/chamber/commands/comparable.rb +37 -0
  10. data/lib/chamber/commands/compare.rb +46 -0
  11. data/lib/chamber/commands/context_resolver.rb +72 -0
  12. data/lib/chamber/commands/files.rb +12 -0
  13. data/lib/chamber/commands/heroku.rb +30 -0
  14. data/lib/chamber/commands/heroku/clear.rb +25 -0
  15. data/lib/chamber/commands/heroku/compare.rb +31 -0
  16. data/lib/chamber/commands/heroku/pull.rb +30 -0
  17. data/lib/chamber/commands/heroku/push.rb +25 -0
  18. data/lib/chamber/commands/initialize.rb +73 -0
  19. data/lib/chamber/commands/securable.rb +48 -0
  20. data/lib/chamber/commands/secure.rb +16 -0
  21. data/lib/chamber/commands/show.rb +23 -0
  22. data/lib/chamber/commands/travis.rb +14 -0
  23. data/lib/chamber/commands/travis/secure.rb +35 -0
  24. data/lib/chamber/configuration.rb +34 -0
  25. data/lib/chamber/environmentable.rb +23 -0
  26. data/lib/chamber/errors/undecryptable_value_error.rb +6 -0
  27. data/lib/chamber/file.rb +17 -5
  28. data/lib/chamber/file_set.rb +18 -12
  29. data/lib/chamber/filters/boolean_conversion_filter.rb +41 -0
  30. data/lib/chamber/filters/decryption_filter.rb +69 -0
  31. data/lib/chamber/filters/encryption_filter.rb +57 -0
  32. data/lib/chamber/filters/environment_filter.rb +75 -0
  33. data/lib/chamber/filters/namespace_filter.rb +37 -0
  34. data/lib/chamber/filters/secure_filter.rb +39 -0
  35. data/lib/chamber/instance.rb +40 -0
  36. data/lib/chamber/namespace_set.rb +55 -16
  37. data/lib/chamber/rails/railtie.rb +1 -1
  38. data/lib/chamber/settings.rb +103 -42
  39. data/lib/chamber/system_environment.rb +3 -93
  40. data/lib/chamber/version.rb +2 -2
  41. data/spec/fixtures/settings.yml +27 -0
  42. data/spec/lib/chamber/commands/context_resolver_spec.rb +106 -0
  43. data/spec/lib/chamber/commands/files_spec.rb +19 -0
  44. data/spec/lib/chamber/commands/heroku/clear_spec.rb +11 -0
  45. data/spec/lib/chamber/commands/heroku/compare_spec.rb +11 -0
  46. data/spec/lib/chamber/commands/heroku/pull_spec.rb +11 -0
  47. data/spec/lib/chamber/commands/heroku/push_spec.rb +11 -0
  48. data/spec/lib/chamber/commands/secure_spec.rb +29 -0
  49. data/spec/lib/chamber/commands/show_spec.rb +43 -0
  50. data/spec/lib/chamber/file_set_spec.rb +1 -1
  51. data/spec/lib/chamber/file_spec.rb +32 -9
  52. data/spec/lib/chamber/filters/boolean_conversion_filter_spec.rb +44 -0
  53. data/spec/lib/chamber/filters/decryption_filter_spec.rb +55 -0
  54. data/spec/lib/chamber/filters/encryption_filter_spec.rb +48 -0
  55. data/spec/lib/chamber/filters/environment_filter_spec.rb +35 -0
  56. data/spec/lib/chamber/filters/namespace_filter_spec.rb +73 -0
  57. data/spec/lib/chamber/filters/secure_filter_spec.rb +36 -0
  58. data/spec/lib/chamber/namespace_set_spec.rb +61 -18
  59. data/spec/lib/chamber/settings_spec.rb +99 -23
  60. data/spec/lib/chamber/system_environment_spec.rb +1 -71
  61. data/spec/lib/chamber_spec.rb +40 -26
  62. data/spec/rails-2-test/config.ru +0 -0
  63. data/spec/rails-2-test/config/application.rb +5 -0
  64. data/spec/rails-2-test/script/console +0 -0
  65. data/spec/rails-3-test/config.ru +0 -0
  66. data/spec/rails-3-test/config/application.rb +5 -0
  67. data/spec/rails-3-test/script/rails +0 -0
  68. data/spec/rails-4-test/bin/rails +0 -0
  69. data/spec/rails-4-test/config.ru +0 -0
  70. data/spec/rails-4-test/config/application.rb +5 -0
  71. data/spec/spec_key +27 -0
  72. data/spec/spec_key.pub +9 -0
  73. metadata +85 -4
@@ -0,0 +1,36 @@
1
+ require 'rspectacular'
2
+ require 'chamber/filters/secure_filter'
3
+
4
+ module Chamber
5
+ module Filters
6
+ describe SecureFilter do
7
+ it 'will return values which are marked as "secure"' do
8
+ filtered_settings = SecureFilter.execute( data: {
9
+ _secure_my_secure_setting: 'hello' })
10
+
11
+ expect(filtered_settings._secure_my_secure_setting).to match 'hello'
12
+ end
13
+
14
+ it 'will not return values which are not marked as "secure"' do
15
+ filtered_settings = SecureFilter.execute( data: {
16
+ my_secure_setting: 'hello' })
17
+
18
+ expect(filtered_settings.my_secure_setting).to be_nil
19
+ end
20
+
21
+ it 'will properly return values even if they are mixed and deeply nested' do
22
+ filtered_settings = SecureFilter.execute( data: {
23
+ _secure_setting: 'hello',
24
+ secure_setting: 'goodbye',
25
+ secure_group: {
26
+ _secure_nested_setting: 'movie',
27
+ insecure_nested_setting: 'dinner' }})
28
+
29
+ expect(filtered_settings._secure_setting).to eql 'hello'
30
+ expect(filtered_settings.secure_setting).to be_nil
31
+ expect(filtered_settings.secure_group._secure_nested_setting).to eql 'movie'
32
+ expect(filtered_settings.secure_group.insecure_nested_setting).to be_nil
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,46 +1,89 @@
1
1
  require 'rspectacular'
2
2
  require 'chamber/namespace_set'
3
3
 
4
- class Chamber
4
+ module Chamber
5
5
  describe NamespaceSet do
6
6
  it 'can create a set from from a hash' do
7
7
  namespace_set = NamespaceSet.new( environment: :development,
8
8
  hostname: 'my host')
9
9
 
10
- expect(namespace_set).to eq [:development, 'my host']
10
+ expect(namespace_set).to eq ['development', 'my host']
11
11
  end
12
12
 
13
13
  it 'can create a set from an array' do
14
14
  namespace_set = NamespaceSet.new([:development,
15
15
  'my host'])
16
16
 
17
- expect(namespace_set).to eq [:development, 'my host']
17
+ expect(namespace_set).to eq ['development', 'my host']
18
18
  end
19
19
 
20
20
  it 'can create a set from a set' do
21
21
  original_set = Set[:development, 'my host']
22
22
  namespace_set = NamespaceSet.new(original_set)
23
23
 
24
- expect(namespace_set).to eq [:development, 'my host']
24
+ expect(namespace_set).to eq ['development', 'my host']
25
+ end
26
+
27
+ it 'can create itself using square-bracket notation' do
28
+ namespace_set = NamespaceSet[:development, 'my host']
29
+
30
+ expect(namespace_set).to eq ['development', 'my host']
31
+ end
32
+
33
+ it 'can create itself from another NamespaceSet' do
34
+ original_set = NamespaceSet[:development, 'my host']
35
+ namespace_set = NamespaceSet.new(original_set)
36
+
37
+ expect(namespace_set).to eq ['development', 'my host']
38
+ end
39
+
40
+ it 'can create itself from a single value' do
41
+ namespace_set = NamespaceSet.new(:development)
42
+
43
+ expect(namespace_set).to eq ['development']
44
+ end
45
+
46
+ it 'when creating itself from another NamespaceSet, it creates a new NamespaceSet' do
47
+ original_set = NamespaceSet[:development, 'my host']
48
+ namespace_set = NamespaceSet.new(original_set)
49
+
50
+ expect(namespace_set.object_id).not_to eq original_set.object_id
51
+ end
52
+
53
+ it 'when creating itself from another NamespaceSet, it does not nest the NamespaceSets' do
54
+ original_set = NamespaceSet[:development, 'my host']
55
+ namespace_set = NamespaceSet.new(original_set)
56
+
57
+ expect(namespace_set.send(:raw_namespaces)).not_to be_a NamespaceSet
25
58
  end
26
59
 
27
60
  it 'can turn itself into an array' do
28
- namespace_set = NamespaceSet.new([:development, 'my host'])
61
+ namespace_set = NamespaceSet[:development, 'my host']
29
62
 
30
- expect(namespace_set.to_ary).to eq [:development, 'my host']
31
- expect(namespace_set.to_a).to eq [:development, 'my host']
63
+ expect(namespace_set.to_ary).to eq ['development', 'my host']
64
+ expect(namespace_set.to_a).to eq ['development', 'my host']
32
65
  end
33
66
 
34
67
  it 'can combine itself with an array' do
35
- namespace_set = NamespaceSet.new([:development, 'my host'])
68
+ namespace_set = NamespaceSet[:development, 'my host']
36
69
  other_set = Set['other value', 3]
70
+
71
+ combined_set = namespace_set + other_set
72
+
73
+ expect(combined_set).to eq ['development', 'my host', 'other value', '3']
74
+ end
75
+
76
+ it 'can combine itself with another NamespaceSet' do
77
+ namespace_set = NamespaceSet[:development, 'my host']
78
+ other_set = NamespaceSet['other value', 3]
79
+
37
80
  combined_set = namespace_set + other_set
38
81
 
39
- expect(combined_set).to eq [:development, 'my host', 'other value', 3]
82
+ expect(combined_set).to eq ['development', 'my host', 'other value', '3']
40
83
  end
41
84
 
42
85
  it 'does not modify the set in place if combining with another array' do
43
- namespace_set = NamespaceSet.new([:development, 'my host'])
86
+ namespace_set = NamespaceSet[:development, 'my host']
44
87
  other_set = Set['other value', 3]
45
88
  combined_set = namespace_set + other_set
46
89
 
@@ -48,32 +91,32 @@ describe NamespaceSet do
48
91
  end
49
92
 
50
93
  it 'can combine itself with something that can be converted to an array' do
51
- namespace_set = NamespaceSet.new([:development, 'my host'])
94
+ namespace_set = NamespaceSet[:development, 'my host']
52
95
  other_set = (1..3)
53
96
  combined_set = namespace_set + other_set
54
97
 
55
- expect(combined_set).to eq [:development, 'my host', 1, 2, 3]
98
+ expect(combined_set).to eq ['development', 'my host', '1', '2', '3']
56
99
  end
57
100
 
58
101
  it 'does not allow duplicate items' do
59
- namespace_set = NamespaceSet.new([:development, :development])
102
+ namespace_set = NamespaceSet[:development, :development]
60
103
 
61
- expect(namespace_set).to eq [:development]
104
+ expect(namespace_set).to eq ['development']
62
105
  end
63
106
 
64
107
  it 'will process a value by executing it if it is a callable' do
65
- namespace_set = NamespaceSet.new([ -> { 'callable' } ])
108
+ namespace_set = NamespaceSet[ -> { 'callable' } ]
66
109
 
67
110
  expect(namespace_set).to eq ['callable']
68
111
 
69
- namespace_set = NamespaceSet.new({ :my_namespace => -> { 'callable' } })
112
+ namespace_set = NamespaceSet.new( :my_namespace => -> { 'callable' } )
70
113
 
71
114
  expect(namespace_set).to eq ['callable']
72
115
  end
73
116
 
74
117
  it 'can compare itself to another NamespaceSet' do
75
- namespace_set = NamespaceSet.new([:development, :development])
76
- other_namespace_set = NamespaceSet.new([:development, :development])
118
+ namespace_set = NamespaceSet[:development, :development]
119
+ other_namespace_set = NamespaceSet[:development, :development]
77
120
 
78
121
  expect(namespace_set).to eql other_namespace_set
79
122
  end
@@ -1,31 +1,31 @@
1
1
  require 'rspectacular'
2
2
  require 'chamber/settings'
3
3
 
4
- class Chamber
4
+ module Chamber
5
5
  describe Settings do
6
6
  it 'can verify that it is equal to another Settings object' do
7
7
  settings = Settings.new( settings: {setting: 'value'},
8
- namespaces: NamespaceSet.new(['good']))
8
+ namespaces: ['good'])
9
9
  other_settings = Settings.new( settings: {setting: 'value'},
10
- namespaces: NamespaceSet.new(['good']))
10
+ namespaces: ['good'])
11
11
 
12
12
  expect(settings).to eql other_settings
13
13
  end
14
14
 
15
15
  it 'does not consider itself equal if the namespaces are not equal' do
16
16
  settings = Settings.new( settings: {setting: 'value'},
17
- namespaces: NamespaceSet.new(['good']))
17
+ namespaces: ['good'])
18
18
  other_settings = Settings.new( settings: {setting: 'value'},
19
- namespaces: NamespaceSet.new(['bad']))
19
+ namespaces: ['bad'])
20
20
 
21
21
  expect(settings).not_to eql other_settings
22
22
  end
23
23
 
24
24
  it 'does not consider itself equal if the settings are not equal' do
25
25
  settings = Settings.new( settings: {setting: 'value'},
26
- namespaces: NamespaceSet.new(['good']))
26
+ namespaces: ['good'])
27
27
  other_settings = Settings.new( settings: {setting: 'value 1'},
28
- namespaces: NamespaceSet.new(['good']))
28
+ namespaces: ['good'])
29
29
 
30
30
  expect(settings).not_to eql other_settings
31
31
  end
@@ -72,32 +72,55 @@ describe Settings do
72
72
  end
73
73
 
74
74
  it 'can merge itself with a hash' do
75
- settings = Settings.new(settings: {setting: 'value'})
76
- settings.merge!(other_setting: 'another value')
75
+ settings = Settings.new(settings: {setting: 'value'})
76
+ other_settings = { other_setting: 'another value' }
77
+
78
+ merged_settings = settings.merge(other_settings)
77
79
 
78
- expect(settings.to_hash).to eql Hashie::Mash.new( setting: 'value',
79
- other_setting: 'another value')
80
+ expect(merged_settings).to eq('setting' => 'value',
81
+ 'other_setting' => 'another value')
80
82
  end
81
83
 
82
84
  it 'can merge itself with Settings' do
83
85
  settings = Settings.new(settings: {setting: 'value'},
84
- namespaces: NamespaceSet.new(['good']))
85
-
86
+ namespaces: ['good'])
86
87
  other_settings = Settings.new(settings: {other_setting: 'another value'},
87
- namespaces: NamespaceSet.new(['bad']))
88
+ namespaces: ['bad'])
89
+
90
+ merged_settings = settings.merge(other_settings)
91
+
92
+ expect(merged_settings).to eql Settings.new(settings: {
93
+ setting: 'value',
94
+ other_setting: 'another value' },
95
+ namespaces: ['good', 'bad'])
96
+ end
97
+
98
+ it 'does not manipulate the existing Settings but instead returns a new one' do
99
+ settings = Settings.new(settings: {setting: 'value'})
100
+ other_settings = Settings.new(settings: {other_setting: 'another value'})
88
101
 
89
- settings.merge!(other_settings)
102
+ merged_settings = settings.merge(other_settings)
90
103
 
91
- expect(settings).to eql Settings.new( settings: {
92
- setting: 'value',
93
- other_setting: 'another value' },
94
- namespaces: NamespaceSet.new(['good', 'bad']))
104
+ expect(merged_settings.object_id).not_to eql settings.object_id
105
+ expect(merged_settings.object_id).not_to eql other_settings.object_id
95
106
  end
96
107
 
97
108
  it 'can convert itself into a hash' do
98
109
  settings = Settings.new(settings: {setting: 'value'})
99
110
 
100
- expect(settings.to_hash).to eql('setting' => 'value')
111
+ expect(settings.to_hash).to eql('setting' => 'value')
112
+ expect(settings.to_hash).to be_a Hash
113
+ expect(settings.to_hash).not_to be_a Hashie::Mash
114
+ end
115
+
116
+ it 'does not allow manipulation of the internal setting hash when converted to a Hash' do
117
+ settings = Settings.new(settings: {setting: 'value'})
118
+
119
+ settings_hash = settings.to_hash
120
+ settings_hash['setting'] = 'foo'
121
+
122
+ expect(settings.send(:data).object_id).not_to eql settings_hash.object_id
123
+ expect(settings.setting).to eql 'value'
101
124
  end
102
125
 
103
126
  it 'allows messages to be passed through to the underlying data' do
@@ -126,10 +149,63 @@ describe Settings do
126
149
  other_namespace_setting: 'value' },
127
150
  non_namespace_setting: 'other value'
128
151
  },
129
- namespaces: NamespaceSet.new(['namespace_value', 'other_namespace_value']))
152
+ namespaces: ['namespace_value', 'other_namespace_value'])
153
+
154
+ expect(settings).to eq('namespace_setting' => 'value',
155
+ 'other_namespace_setting' => 'value')
156
+ end
157
+
158
+ it 'can decrypt a setting if it finds a secure key' do
159
+ settings = Settings.new(settings: {
160
+ _secure_my_encrypted_setting: 'cJbFe0NI5wknmsp2fVgpC/YeBD2pvcdVD+p0pUdnMoYThaV4mpsspg/ZTBtmjx7kMwcF6cjXFLDVw3FxptTHwzJUd4akun6EZ57m+QzCMJYnfY95gB2/emEAQLSz4/YwsE4LDGydkEjY1ZprfXznf+rU31YGDJUTf34ESz7fsQGSc9DjkBb9ao8Mv4cI7pCXkQZDwS5kLAZDf6agy1GzeL71Z8lrmQzk8QQuf/1kQzxsWVlzpKNXWS7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1kKTcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ=='
161
+ },
162
+ decryption_key: './spec/spec_key')
163
+
164
+ expect(settings).to eq('my_encrypted_setting' => 'hello')
165
+ end
166
+
167
+ it 'can encrypt a setting if it finds a secure key' do
168
+ settings = Settings.new(settings: {
169
+ _secure_my_encrypted_setting: 'hello'
170
+ },
171
+ encryption_key: './spec/spec_key.pub',
172
+ pre_filters: [],
173
+ post_filters: [ Filters::EncryptionFilter ])
174
+
175
+ expect(settings._secure_my_encrypted_setting).to match Filters::EncryptionFilter::BASE64_STRING_PATTERN
176
+ end
177
+
178
+ it 'can encrypt a settings without explicitly having to have a filter passed' do
179
+ settings = Settings.new(settings: {
180
+ _secure_my_encrypted_setting: 'hello'
181
+ },
182
+ decryption_key: './spec/spec_key',
183
+ encryption_key: './spec/spec_key.pub')
184
+
185
+ expect(settings).to eq('my_encrypted_setting' => 'hello')
186
+
187
+ secure_settings = settings.secure
188
+
189
+ expect(secure_settings._secure_my_encrypted_setting).to match Filters::EncryptionFilter::BASE64_STRING_PATTERN
190
+ end
191
+
192
+ it 'can check if it is equal to other items which can be converted into hashes' do
193
+ settings = Settings.new(settings: {setting: 'value'})
194
+
195
+ expect(settings).to eq('setting' => 'value')
196
+ end
197
+
198
+ it 'can filter secured settings' do
199
+ settings = Settings.new(settings: {
200
+ _secure_my_encrypted_setting: 'cJbFe0NI5wknmsp2fVgpC/YeBD2pvcdVD+p0pUdnMoYThaV4mpsspg/ZTBtmjx7kMwcF6cjXFLDVw3FxptTHwzJUd4akun6EZ57m+QzCMJYnfY95gB2/emEAQLSz4/YwsE4LDGydkEjY1ZprfXznf+rU31YGDJUTf34ESz7fsQGSc9DjkBb9ao8Mv4cI7pCXkQZDwS5kLAZDf6agy1GzeL71Z8lrmQzk8QQuf/1kQzxsWVlzpKNXWS7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1kKTcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==',
201
+ my_insecure_setting: 'goodbye',
202
+ },
203
+ decryption_key: './spec/spec_key')
204
+
205
+ secured_settings = settings.secured
130
206
 
131
- expect(settings.to_hash).to eql('namespace_setting' => 'value',
132
- 'other_namespace_setting' => 'value')
207
+ expect(secured_settings.my_encrypted_setting).to eql 'hello'
208
+ expect(secured_settings.my_insecure_setting?).to be_false
133
209
  end
134
210
  end
135
211
  end
@@ -1,7 +1,7 @@
1
1
  require 'rspectacular'
2
2
  require 'chamber/system_environment'
3
3
 
4
- class Chamber
4
+ module Chamber
5
5
  describe SystemEnvironment do
6
6
  it 'can extract environment variables based on a hash that is passed in' do
7
7
  source_hash = {
@@ -36,20 +36,6 @@ describe SystemEnvironment do
36
36
  })
37
37
  end
38
38
 
39
- it 'allows injected environment variables to be prefixed for compatibility' do
40
- ENV['PREFIX_VALUE_ONE'] = 'value 1'
41
-
42
- source_hash = {
43
- value_one: 'value',
44
- }
45
-
46
- environment_hash = SystemEnvironment.inject_into(source_hash, [:prefix])
47
-
48
- expect(environment_hash).to eql({
49
- 'value_one' => 'value 1',
50
- })
51
- end
52
-
53
39
  it 'allows extracted environment variables to be prefixed for compatibility' do
54
40
  source_hash = {
55
41
  value_one: 'value',
@@ -61,61 +47,5 @@ describe SystemEnvironment do
61
47
  'PREFIX_VALUE_ONE' => 'value',
62
48
  })
63
49
  end
64
-
65
- it 'can inject existing environment variable values into a hash' do
66
- ENV['LEVEL_ONE_1_LEVEL_TWO_1'] = 'value 1'
67
- ENV['LEVEL_ONE_1_LEVEL_TWO_2_LEVEL_THREE_1'] = 'value 2'
68
- ENV['LEVEL_ONE_1_LEVEL_TWO_2_LEVEL_THREE_2'] = 'value 3'
69
- ENV['LEVEL_ONE_1_LEVEL_TWO_3'] = 'value 4'
70
- ENV['LEVEL_ONE_1_LEVEL_ONE_2'] = 'value 5'
71
-
72
- source_hash = {
73
- level_one_1: {
74
- level_two_1: nil,
75
- level_two_2: {
76
- level_three_1: nil,
77
- level_three_2: '',
78
- },
79
- level_two_3: '',
80
- level_one_2: '' }
81
- }
82
-
83
- expect(SystemEnvironment.inject_into(source_hash)).to eql({
84
- 'level_one_1' => {
85
- 'level_two_1' => 'value 1',
86
- 'level_two_2' => {
87
- 'level_three_1' => 'value 2',
88
- 'level_three_2' => 'value 3',
89
- },
90
- 'level_two_3' => 'value 4',
91
- 'level_one_2' => 'value 5' }
92
- })
93
-
94
- ENV.delete('LEVEL_ONE_1_LEVEL_TWO_1')
95
- ENV.delete('LEVEL_ONE_1_LEVEL_TWO_2_LEVEL_THREE_1')
96
- ENV.delete('LEVEL_ONE_1_LEVEL_TWO_2_LEVEL_THREE_2')
97
- ENV.delete('LEVEL_ONE_1_LEVEL_TWO_3')
98
- ENV.delete('LEVEL_ONE_1_LEVEL_ONE_2')
99
- end
100
-
101
- it 'can convert simple boolean text values to their Boolean equivalents' do
102
- source_hash = {
103
- true_text: 'true',
104
- true_single: 't',
105
- true_yes: 'yes',
106
- false_text: 'false',
107
- false_single: 'f',
108
- false_no: 'no',
109
- }
110
-
111
- environment_hash = SystemEnvironment.inject_into(source_hash)
112
-
113
- expect(environment_hash['true_text']).to be_a TrueClass
114
- expect(environment_hash['true_single']).to be_a TrueClass
115
- expect(environment_hash['true_yes']).to be_a TrueClass
116
- expect(environment_hash['false_text']).to be_a FalseClass
117
- expect(environment_hash['false_single']).to be_a FalseClass
118
- expect(environment_hash['false_no']).to be_a FalseClass
119
- end
120
50
  end
121
51
  end
@@ -23,6 +23,13 @@ test:
23
23
  HEREDOC
24
24
  end
25
25
 
26
+ File.open('/tmp/chamber/secure.yml', 'w+') do |file|
27
+ file.puts <<-HEREDOC
28
+ test:
29
+ _secure_my_encrpyted_setting: cJbFe0NI5wknmsp2fVgpC/YeBD2pvcdVD+p0pUdnMoYThaV4mpsspg/ZTBtmjx7kMwcF6cjXFLDVw3FxptTHwzJUd4akun6EZ57m+QzCMJYnfY95gB2/emEAQLSz4/YwsE4LDGydkEjY1ZprfXznf+rU31YGDJUTf34ESz7fsQGSc9DjkBb9ao8Mv4cI7pCXkQZDwS5kLAZDf6agy1GzeL71Z8lrmQzk8QQuf/1kQzxsWVlzpKNXWS7u2CJ0sN5eINMngJBfv5ZFrZgfXc86wdgUKc8aaoX8OQA1kKTcdgbE9NcAhNr1+WfNxMnz84XzmUp2Y0H1jPgGkBKQJKArfQ==
30
+ HEREDOC
31
+ end
32
+
26
33
  File.open('/tmp/chamber/credentials.yml', 'w+') do |file|
27
34
  file.puts <<-HEREDOC
28
35
  test:
@@ -71,19 +78,19 @@ only_namespaced_sub_settings:
71
78
  HEREDOC
72
79
  end
73
80
 
74
- describe Chamber, :singletons => [Chamber] do
81
+ describe Chamber do
75
82
  before(:each) { Chamber.load(:basepath => '/tmp/chamber') }
76
83
 
77
84
  it 'knows how to load itself with a path string' do
78
85
  Chamber.load(:basepath => '/tmp/chamber')
79
86
 
80
- expect(Chamber.basepath.to_s).to eql '/tmp/chamber'
87
+ expect(Chamber.configuration.basepath.to_s).to eql '/tmp/chamber'
81
88
  end
82
89
 
83
90
  it 'knows how to load itself with a path object' do
84
91
  Chamber.load(:basepath => Pathname.new('/tmp/chamber'))
85
92
 
86
- expect(Chamber.basepath.to_s).to eql '/tmp/chamber'
93
+ expect(Chamber.configuration.basepath.to_s).to eql '/tmp/chamber'
87
94
  end
88
95
 
89
96
  it 'processes settings files through ERB before YAML' do
@@ -95,11 +102,11 @@ describe Chamber, :singletons => [Chamber] do
95
102
  end
96
103
 
97
104
  it 'can access the settings through method-based access' do
98
- expect(Chamber.instance.test.my_setting).to eql 'my_value'
105
+ expect(Chamber.test.my_setting).to eql 'my_value'
99
106
  end
100
107
 
101
- it 'can access the instance via "env"' do
102
- expect(Chamber.instance.test.my_setting).to eql 'my_value'
108
+ it 'can access the settings via "env"' do
109
+ expect(Chamber.env.test.my_setting).to eql 'my_value'
103
110
  end
104
111
 
105
112
  it 'prefers values stored in environment variables over those in the YAML files' do
@@ -107,9 +114,9 @@ describe Chamber, :singletons => [Chamber] do
107
114
  ENV['TEST_ANOTHER_LEVEL_LEVEL_THREE_AN_ARRAY'] = 'something'
108
115
 
109
116
  Chamber.load(:basepath => '/tmp/chamber')
110
- expect(Chamber.instance.test.my_setting).to eql 'some_other_value'
111
- expect(Chamber.instance.test.another_level.level_three.an_array).to eql 'something'
112
- expect(Chamber.instance.test.my_dynamic_setting).to eql 2
117
+ expect(Chamber.test.my_setting).to eql 'some_other_value'
118
+ expect(Chamber.test.another_level.level_three.an_array).to eql 'something'
119
+ expect(Chamber.test.my_dynamic_setting).to eql 2
113
120
 
114
121
  ENV.delete 'TEST_MY_SETTING'
115
122
  ENV.delete 'TEST_ANOTHER_LEVEL_LEVEL_THREE_AN_ARRAY'
@@ -120,8 +127,8 @@ describe Chamber, :singletons => [Chamber] do
120
127
  :namespaces => {
121
128
  :my_namespace => -> { 'blue' } } )
122
129
 
123
- expect(Chamber.instance.other.everything).to eql 'works'
124
- expect(Chamber.instance.test.my_dynamic_setting).to eql 2
130
+ expect(Chamber.other.everything).to eql 'works'
131
+ expect(Chamber.test.my_dynamic_setting).to eql 2
125
132
  end
126
133
 
127
134
  it 'loads multiple namespaces if it is called twice' do
@@ -130,7 +137,7 @@ describe Chamber, :singletons => [Chamber] do
130
137
  :first_namespace_call => -> { :first },
131
138
  :second_namespace_call => -> { :second }, } )
132
139
 
133
- expect(Chamber.instance.namespaces.to_a).to eql [:first, :second]
140
+ expect(Chamber.namespaces.to_a).to eql ['first', 'second']
134
141
  end
135
142
 
136
143
  it 'does not load the same namespace twice' do
@@ -139,7 +146,7 @@ describe Chamber, :singletons => [Chamber] do
139
146
  :first_namespace_call => -> { :first },
140
147
  :first_namespace_call => -> { :first }, } )
141
148
 
142
- expect(Chamber.instance.namespaces.to_a).to eql [:first]
149
+ expect(Chamber.namespaces.to_a).to eql ['first']
143
150
  end
144
151
 
145
152
  it 'will load settings files which are only namespaced' do
@@ -163,7 +170,7 @@ describe Chamber, :singletons => [Chamber] do
163
170
  end
164
171
 
165
172
  it 'still raises an error if you try to send a message which the settings hash does not understand' do
166
- expect{ Chamber.instance.i_do_not_know }.to raise_error NoMethodError
173
+ expect{ Chamber.env.i_do_not_know }.to raise_error NoMethodError
167
174
  end
168
175
 
169
176
  it 'does not raise an exception if a namespaced file does not exist' do
@@ -179,13 +186,13 @@ describe Chamber, :singletons => [Chamber] do
179
186
  :namespaces => {
180
187
  :my_namespace => -> { 'blue' } } )
181
188
 
182
- expect(Chamber.instance.test.my_setting).to eql 'my_value'
183
- expect(Chamber.instance.test.my_other_setting).to eql 'my_other_value'
184
- expect(Chamber.instance.test.another_level.setting_one).to eql 3
189
+ expect(Chamber.test.my_setting).to eql 'my_value'
190
+ expect(Chamber.test.my_other_setting).to eql 'my_other_value'
191
+ expect(Chamber.test.another_level.setting_one).to eql 3
185
192
  end
186
193
 
187
194
  it 'loads YAML files from the "settings" directory under the base directory if any exist' do
188
- expect(Chamber.instance.sub_settings.my_sub_setting).to eql 'my_sub_setting_value'
195
+ expect(Chamber.sub_settings.my_sub_setting).to eql 'my_sub_setting_value'
189
196
  end
190
197
 
191
198
  it 'does not load YAML files from the "settings" directory if it is namespaced' do
@@ -253,16 +260,16 @@ describe Chamber, :singletons => [Chamber] do
253
260
  end
254
261
 
255
262
  it 'can notify properly whether it responds to messages if the underlying settings does' do
256
- expect(Chamber.env.respond_to?(:sub_settings)).to be_a TrueClass
263
+ expect(Chamber.respond_to?(:sub_settings)).to be_a TrueClass
257
264
  end
258
265
 
259
266
  it 'can explicitly specify files without specifying a basepath' do
260
267
  Chamber.load files: ['/tmp/chamber/credentials.yml']
261
268
 
262
- expect(Chamber.filenames).to eql ['/tmp/chamber/credentials.yml']
263
- expect(Chamber.settings.to_hash).to eql('test' => {
264
- 'my_username' => 'username',
265
- 'my_password' => 'password', } )
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', } )
266
273
  end
267
274
 
268
275
  it 'ignores the basepath if file patterns are explicitly passed in' do
@@ -273,14 +280,21 @@ describe Chamber, :singletons => [Chamber] do
273
280
  end
274
281
 
275
282
  it 'can render itself as a string even if it has not been loaded' do
276
- Singleton.__init__(Chamber)
283
+ Chamber.load
277
284
 
278
285
  expect(Chamber.to_s).to eql ''
279
286
  end
280
287
 
281
288
  it 'can determine settings even if it has not been loaded' do
282
- Singleton.__init__(Chamber)
289
+ Chamber.load
290
+
291
+ expect(Chamber.to_hash).to eql({})
292
+ end
293
+
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')
283
297
 
284
- expect(Chamber.settings.to_hash).to eql({})
298
+ expect(Chamber.test.my_encrpyted_setting).to eql 'hello'
285
299
  end
286
300
  end