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
@@ -5,9 +5,14 @@ module Chamber
|
|
5
5
|
module Commands
|
6
6
|
describe Show do
|
7
7
|
let(:rootpath) { ::File.expand_path('./spec/fixtures') }
|
8
|
-
let(:options)
|
9
|
-
|
10
|
-
|
8
|
+
let(:options) do
|
9
|
+
{
|
10
|
+
basepath: rootpath,
|
11
|
+
rootpath: rootpath,
|
12
|
+
namespaces: 'test',
|
13
|
+
decryption_key: './spec/spec_key',
|
14
|
+
}
|
15
|
+
end
|
11
16
|
|
12
17
|
it 'can return values formatted as environment variables' do
|
13
18
|
expect(Show.call(options.merge(as_env: true))).to eql(
|
@@ -18,15 +23,25 @@ ANOTHER_LEVEL_SETTING_ONE="1"
|
|
18
23
|
ANOTHER_LEVEL_SETTING_TWO="2"
|
19
24
|
MY_BOOLEAN="false"
|
20
25
|
MY_DYNAMIC_SETTING="2"
|
26
|
+
MY_SECURE_SETTINGS="my_secure_value"
|
21
27
|
MY_SETTING="my_value"
|
22
28
|
HEREDOC
|
23
29
|
)
|
24
30
|
end
|
25
31
|
|
32
|
+
it 'can return values filtered by whether or not they are secure' do
|
33
|
+
expect(Show.call(options.merge(as_env: true, only_sensitive: true))).to eql(
|
34
|
+
<<-HEREDOC.chomp
|
35
|
+
MY_SECURE_SETTINGS="my_secure_value"
|
36
|
+
HEREDOC
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
26
40
|
it 'can return values formatted as a hash' do
|
27
41
|
expect(Show.call(options)).to eql(
|
28
42
|
<<-HEREDOC.chomp
|
29
43
|
{"my_setting"=>"my_value",
|
44
|
+
"my_secure_settings"=>"my_secure_value",
|
30
45
|
"my_boolean"=>false,
|
31
46
|
"my_dynamic_setting"=>2,
|
32
47
|
"another_level"=>
|
@@ -9,24 +9,26 @@ describe ContextResolver do
|
|
9
9
|
let(:rails_4_path) { ::File.expand_path('../../../rails-4-test', __FILE__) }
|
10
10
|
|
11
11
|
it 'does not attempt to do any resolution if all valid options are passed in' do
|
12
|
-
options = ContextResolver.resolve(basepath:
|
13
|
-
namespaces:
|
12
|
+
options = ContextResolver.resolve(basepath: 'my_path',
|
13
|
+
namespaces: 'ns')
|
14
14
|
|
15
15
|
expect(options[:basepath].to_s).to eql 'my_path'
|
16
16
|
expect(options[:namespaces]).to eql 'ns'
|
17
17
|
end
|
18
18
|
|
19
|
-
it 'does not attempt to do any resolution if files are passed in in place of a
|
20
|
-
|
21
|
-
|
19
|
+
it 'does not attempt to do any resolution if files are passed in in place of a ' \
|
20
|
+
'basepath' do
|
21
|
+
|
22
|
+
options = ContextResolver.resolve(files: 'my_files',
|
23
|
+
namespaces: 'ns')
|
22
24
|
|
23
25
|
expect(options[:files]).to eql 'my_files'
|
24
26
|
expect(options[:namespaces]).to eql 'ns'
|
25
27
|
end
|
26
28
|
|
27
29
|
it 'defaults the basepath to the rootpath if none is explicitly set' do
|
28
|
-
options = ContextResolver.resolve(rootpath:
|
29
|
-
namespaces:
|
30
|
+
options = ContextResolver.resolve(rootpath: './app',
|
31
|
+
namespaces: 'ns')
|
30
32
|
|
31
33
|
expect(options[:basepath].to_s).to eql './app'
|
32
34
|
end
|
@@ -40,14 +42,13 @@ describe ContextResolver do
|
|
40
42
|
it 'sets the default files if none are passed in' do
|
41
43
|
options = ContextResolver.resolve(basepath: './app')
|
42
44
|
|
43
|
-
expect(options[:files].map(&:to_s)).to eql [
|
44
|
-
|
45
|
-
'./app/settings' ]
|
45
|
+
expect(options[:files].map(&:to_s)).to eql ['./app/settings*.yml',
|
46
|
+
'./app/settings']
|
46
47
|
end
|
47
48
|
|
48
49
|
it 'can handle if keys are passed as strings' do
|
49
|
-
options = ContextResolver.resolve('files' =>
|
50
|
-
'namespaces' =>
|
50
|
+
options = ContextResolver.resolve('files' => 'my_files',
|
51
|
+
'namespaces' => 'ns')
|
51
52
|
|
52
53
|
expect(options[:files]).to eql 'my_files'
|
53
54
|
expect(options[:namespaces]).to eql 'ns'
|
@@ -69,9 +70,20 @@ describe ContextResolver do
|
|
69
70
|
end
|
70
71
|
|
71
72
|
it 'sets the decryption key to the default if not passed in' do
|
72
|
-
options
|
73
|
+
options = ContextResolver.resolve(rootpath: rails_3_path)
|
74
|
+
key_contents = ::File.read(rails_3_path + '/.chamber.pem')
|
73
75
|
|
74
|
-
expect(options[:decryption_key].to_s).to
|
76
|
+
expect(options[:decryption_key].to_s).to eql key_contents
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'sets the decryption key to the value of the CHAMBER_KEY if available' do
|
80
|
+
ENV['CHAMBER_KEY'] = 'my key'
|
81
|
+
|
82
|
+
options = ContextResolver.resolve(rootpath: 'my_path')
|
83
|
+
|
84
|
+
expect(options[:decryption_key].to_s).to eql 'my key'
|
85
|
+
|
86
|
+
ENV['CHAMBER_KEY'] = nil
|
75
87
|
end
|
76
88
|
|
77
89
|
it 'does not set the encryption key if the keyfile does not exist' do
|
@@ -95,32 +107,40 @@ describe ContextResolver do
|
|
95
107
|
end
|
96
108
|
|
97
109
|
it 'sets the information to a Rails preset when the rootpath is a Rails app' do
|
110
|
+
allow(Socket).to receive(:gethostname).and_return 'my_host'
|
111
|
+
|
98
112
|
options = ContextResolver.resolve(rootpath: rails_3_path,
|
99
113
|
preset: 'rails')
|
100
114
|
|
101
115
|
expect(options[:basepath].to_s).to include 'rails-3-test/config'
|
102
|
-
expect(options[:namespaces]).to eql
|
116
|
+
expect(options[:namespaces]).to eql %w{development my_host}
|
103
117
|
end
|
104
118
|
|
105
119
|
it 'sets the basepath if inside a Rails 2 project' do
|
120
|
+
allow(Socket).to receive(:gethostname).and_return 'my_host'
|
121
|
+
|
106
122
|
options = ContextResolver.resolve(rootpath: rails_2_path)
|
107
123
|
|
108
124
|
expect(options[:basepath].to_s).to include 'rails-2-test/config'
|
109
|
-
expect(options[:namespaces]).to eql
|
125
|
+
expect(options[:namespaces]).to eql %w{development my_host}
|
110
126
|
end
|
111
127
|
|
112
128
|
it 'sets the basepath if inside a Rails 3 project' do
|
129
|
+
allow(Socket).to receive(:gethostname).and_return 'my_host'
|
130
|
+
|
113
131
|
options = ContextResolver.resolve(rootpath: rails_3_path)
|
114
132
|
|
115
133
|
expect(options[:basepath].to_s).to include 'rails-3-test/config'
|
116
|
-
expect(options[:namespaces]).to eql
|
134
|
+
expect(options[:namespaces]).to eql %w{development my_host}
|
117
135
|
end
|
118
136
|
|
119
137
|
it 'sets the basepath if inside a Rails 4 project' do
|
138
|
+
allow(Socket).to receive(:gethostname).and_return 'my_host'
|
139
|
+
|
120
140
|
options = ContextResolver.resolve(rootpath: rails_4_path)
|
121
141
|
|
122
142
|
expect(options[:basepath].to_s).to include 'rails-4-test/config'
|
123
|
-
expect(options[:namespaces]).to eql
|
143
|
+
expect(options[:namespaces]).to eql %w{development my_host}
|
124
144
|
end
|
125
145
|
end
|
126
146
|
end
|
@@ -2,12 +2,13 @@ require 'rspectacular'
|
|
2
2
|
require 'chamber/file_set'
|
3
3
|
require 'fileutils'
|
4
4
|
|
5
|
-
|
6
5
|
module Chamber
|
7
6
|
describe FileSet do
|
8
|
-
before(:each)
|
9
|
-
|
10
|
-
|
7
|
+
before(:each) do
|
8
|
+
FileUtils.mkdir '/tmp/settings' unless ::File.exist? '/tmp/settings'
|
9
|
+
FileUtils.mkdir '/tmp/dash-set' unless ::File.exist? '/tmp/dash-set'
|
10
|
+
end
|
11
|
+
after(:each) { FileUtils.rm_rf '/tmp/settings' if ::File.exist? '/tmp/settings' }
|
11
12
|
|
12
13
|
it 'can consider directories containing YAML files' do
|
13
14
|
::File.new('/tmp/settings/some_settings_file.yml', 'w+')
|
@@ -16,9 +17,9 @@ describe FileSet do
|
|
16
17
|
file_set = FileSet.new files: '/tmp/settings'
|
17
18
|
|
18
19
|
expect(file_set.filenames).to eql [
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
'/tmp/settings/another_settings_file.yml',
|
21
|
+
'/tmp/settings/some_settings_file.yml',
|
22
|
+
]
|
22
23
|
|
23
24
|
::FileUtils.rm_rf('/tmp/settings')
|
24
25
|
end
|
@@ -30,9 +31,23 @@ describe FileSet do
|
|
30
31
|
file_set = FileSet.new files: '/tmp/settings/*.yml'
|
31
32
|
|
32
33
|
expect(file_set.filenames).to eql [
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
'/tmp/settings/another_settings_file.yml',
|
35
|
+
'/tmp/settings/some_settings_file.yml',
|
36
|
+
]
|
37
|
+
|
38
|
+
::FileUtils.rm_rf('/tmp/settings')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'will process both *.yml and *.yml.erb files by default' do
|
42
|
+
::File.new('/tmp/settings/some_settings_file.yml', 'w+')
|
43
|
+
::File.new('/tmp/settings/another_settings_file.yml.erb', 'w+')
|
44
|
+
|
45
|
+
file_set = FileSet.new files: '/tmp/settings'
|
46
|
+
|
47
|
+
expect(file_set.filenames).to eql [
|
48
|
+
'/tmp/settings/another_settings_file.yml.erb',
|
49
|
+
'/tmp/settings/some_settings_file.yml',
|
50
|
+
]
|
36
51
|
|
37
52
|
::FileUtils.rm_rf('/tmp/settings')
|
38
53
|
end
|
@@ -44,8 +59,8 @@ describe FileSet do
|
|
44
59
|
namespaces: ['blue']
|
45
60
|
|
46
61
|
expect(file_set.filenames).to eql [
|
47
|
-
|
48
|
-
|
62
|
+
'/tmp/settings/settings-blue.yml',
|
63
|
+
]
|
49
64
|
|
50
65
|
::FileUtils.rm_f('/tmp/settings/settings-blue.yml')
|
51
66
|
end
|
@@ -61,15 +76,17 @@ describe FileSet do
|
|
61
76
|
::FileUtils.rm_f('/tmp/settings/settings-blue.yml')
|
62
77
|
end
|
63
78
|
|
64
|
-
it 'does not consider non-namespaced files which have dashes in their paths as
|
79
|
+
it 'does not consider non-namespaced files which have dashes in their paths as ' \
|
80
|
+
'namespaced' do
|
81
|
+
|
65
82
|
::File.new('/tmp/dash-set/settings.yml', 'w+')
|
66
83
|
|
67
84
|
file_set = FileSet.new files: '/tmp/dash-set/settings*.yml',
|
68
85
|
namespaces: ['blue']
|
69
86
|
|
70
87
|
expect(file_set.filenames).to eql [
|
71
|
-
|
72
|
-
|
88
|
+
'/tmp/dash-set/settings.yml',
|
89
|
+
]
|
73
90
|
|
74
91
|
::FileUtils.rm_r('/tmp/dash-set/settings.yml')
|
75
92
|
end
|
@@ -78,13 +95,13 @@ describe FileSet do
|
|
78
95
|
::File.new('/tmp/settings.yml', 'w+')
|
79
96
|
|
80
97
|
file_set = FileSet.new files: [
|
81
|
-
|
82
|
-
|
83
|
-
|
98
|
+
'/tmp/settings.yml',
|
99
|
+
'/tmp/settings.yml',
|
100
|
+
]
|
84
101
|
|
85
102
|
expect(file_set.filenames).to eql [
|
86
|
-
|
87
|
-
|
103
|
+
'/tmp/settings.yml',
|
104
|
+
]
|
88
105
|
|
89
106
|
::FileUtils.rm_f('/tmp/settings.yml')
|
90
107
|
end
|
@@ -94,14 +111,14 @@ describe FileSet do
|
|
94
111
|
::File.new('/tmp/settings/new_file.yml', 'w+')
|
95
112
|
|
96
113
|
file_set = FileSet.new files: [
|
97
|
-
|
98
|
-
|
99
|
-
|
114
|
+
'/tmp/settings.yml',
|
115
|
+
'/tmp/settings/*.yml',
|
116
|
+
]
|
100
117
|
|
101
118
|
expect(file_set.filenames).to eql [
|
102
|
-
|
103
|
-
|
104
|
-
|
119
|
+
'/tmp/settings.yml',
|
120
|
+
'/tmp/settings/new_file.yml',
|
121
|
+
]
|
105
122
|
|
106
123
|
::FileUtils.rm_rf('/tmp/settings*')
|
107
124
|
end
|
@@ -112,8 +129,8 @@ describe FileSet do
|
|
112
129
|
file_set = FileSet.new files: '/tmp/settings.yml'
|
113
130
|
|
114
131
|
expect(file_set.filenames).to eql [
|
115
|
-
|
116
|
-
|
132
|
+
'/tmp/settings.yml',
|
133
|
+
]
|
117
134
|
|
118
135
|
::FileUtils.rm_rf('/tmp/settings*')
|
119
136
|
end
|
@@ -123,20 +140,20 @@ describe FileSet do
|
|
123
140
|
::File.new('/tmp/settings/settings-green.yml', 'w+')
|
124
141
|
|
125
142
|
file_set = FileSet.new files: '/tmp/settings/settings*.yml',
|
126
|
-
namespaces:
|
143
|
+
namespaces: %w{blue green}
|
127
144
|
|
128
145
|
expect(file_set.filenames).to eql [
|
129
|
-
|
130
|
-
|
131
|
-
|
146
|
+
'/tmp/settings/settings-blue.yml',
|
147
|
+
'/tmp/settings/settings-green.yml',
|
148
|
+
]
|
132
149
|
|
133
150
|
file_set = FileSet.new files: '/tmp/settings/settings*.yml',
|
134
|
-
namespaces:
|
151
|
+
namespaces: %w{green blue}
|
135
152
|
|
136
153
|
expect(file_set.filenames).to eql [
|
137
|
-
|
138
|
-
|
139
|
-
|
154
|
+
'/tmp/settings/settings-green.yml',
|
155
|
+
'/tmp/settings/settings-blue.yml',
|
156
|
+
]
|
140
157
|
|
141
158
|
::FileUtils.rm_f('/tmp/settings/settings*.yml')
|
142
159
|
end
|
@@ -149,9 +166,9 @@ describe FileSet do
|
|
149
166
|
namespaces: ['blue']
|
150
167
|
|
151
168
|
expect(file_set.filenames).to eql [
|
152
|
-
|
153
|
-
|
154
|
-
|
169
|
+
'/tmp/settings.yml',
|
170
|
+
'/tmp/settings-blue.yml',
|
171
|
+
]
|
155
172
|
|
156
173
|
::FileUtils.rm_f('/tmp/settings*.yml')
|
157
174
|
end
|
@@ -164,25 +181,27 @@ describe FileSet do
|
|
164
181
|
namespaces: ['blue']
|
165
182
|
|
166
183
|
expect(file_set.filenames).to eql [
|
167
|
-
|
168
|
-
|
169
|
-
|
184
|
+
'/tmp/settings.yml',
|
185
|
+
'/tmp/settings-blue.yml',
|
186
|
+
]
|
170
187
|
|
171
188
|
::FileUtils.rm_f('/tmp/settings*.yml')
|
172
189
|
end
|
173
190
|
|
174
|
-
it 'considers each glob independently, placing non-namespaced and namespaced
|
191
|
+
it 'considers each glob independently, placing non-namespaced and namespaced ' \
|
192
|
+
'versions of the globs files above those in subsequent globs' do
|
193
|
+
|
175
194
|
::File.new('/tmp/settings/credentials-development.yml', 'w+')
|
176
195
|
::File.new('/tmp/settings/settings.yml', 'w+')
|
177
196
|
|
178
|
-
file_set = FileSet.new files:
|
179
|
-
|
197
|
+
file_set = FileSet.new files: ['/tmp/settings/credentials*.yml',
|
198
|
+
'/tmp/settings/settings*.yml'],
|
180
199
|
namespaces: ['development']
|
181
200
|
|
182
201
|
expect(file_set.filenames).to eql [
|
183
|
-
|
184
|
-
|
185
|
-
|
202
|
+
'/tmp/settings/credentials-development.yml',
|
203
|
+
'/tmp/settings/settings.yml',
|
204
|
+
]
|
186
205
|
|
187
206
|
::FileUtils.rm_rf('/tmp/settings')
|
188
207
|
end
|
@@ -194,9 +213,9 @@ describe FileSet do
|
|
194
213
|
file_set = FileSet.new files: '/tmp/settings/*.yml'
|
195
214
|
|
196
215
|
expect(file_set.filenames).to eql [
|
197
|
-
|
198
|
-
|
199
|
-
|
216
|
+
'/tmp/settings/another_settings_file.yml',
|
217
|
+
'/tmp/settings/some_settings_file.yml',
|
218
|
+
]
|
200
219
|
|
201
220
|
::FileUtils.rm_rf('/tmp/settings')
|
202
221
|
end
|
@@ -213,7 +232,9 @@ describe FileSet do
|
|
213
232
|
::FileUtils.rm_f('/tmp/settings.yml')
|
214
233
|
end
|
215
234
|
|
216
|
-
it 'can convert settings without yielding to the block by using an intermediate
|
235
|
+
it 'can convert settings without yielding to the block by using an intermediate ' \
|
236
|
+
'settings object' do
|
237
|
+
|
217
238
|
::File.new('/tmp/settings.yml', 'w+')
|
218
239
|
|
219
240
|
file_set = FileSet.new files: '/tmp/settings.yml'
|
@@ -4,6 +4,7 @@ require 'chamber/settings'
|
|
4
4
|
require 'chamber/filters/encryption_filter'
|
5
5
|
require 'tempfile'
|
6
6
|
|
7
|
+
# rubocop:disable Metrics/LineLength
|
7
8
|
def create_tempfile_with_content(content)
|
8
9
|
tempfile = Tempfile.new('settings')
|
9
10
|
tempfile.puts content
|
@@ -14,7 +15,7 @@ end
|
|
14
15
|
module Chamber
|
15
16
|
describe File do
|
16
17
|
it 'can convert file contents to settings' do
|
17
|
-
tempfile = create_tempfile_with_content
|
18
|
+
tempfile = create_tempfile_with_content '{ test: settings }'
|
18
19
|
settings_file = File.new path: tempfile.path
|
19
20
|
|
20
21
|
allow(Settings).to receive(:new).
|
@@ -24,7 +25,7 @@ describe File do
|
|
24
25
|
|
25
26
|
expect(file_settings).to eql :settings
|
26
27
|
expect(Settings).to have_received(:new).
|
27
|
-
with(settings: {'test' => 'settings'},
|
28
|
+
with(settings: { 'test' => 'settings' },
|
28
29
|
namespaces: {},
|
29
30
|
decryption_key: nil,
|
30
31
|
encryption_key: nil)
|
@@ -48,42 +49,42 @@ describe File do
|
|
48
49
|
end
|
49
50
|
|
50
51
|
it 'throws an error when the file contents are malformed' do
|
51
|
-
tempfile = create_tempfile_with_content
|
52
|
+
tempfile = create_tempfile_with_content '{ test : '
|
52
53
|
settings_file = File.new path: tempfile.path
|
53
54
|
|
54
55
|
expect { settings_file.to_settings }.to raise_error
|
55
56
|
end
|
56
57
|
|
57
58
|
it 'passes any namespaces through to the settings' do
|
58
|
-
tempfile = create_tempfile_with_content
|
59
|
+
tempfile = create_tempfile_with_content '{ test: settings }'
|
59
60
|
settings_file = File.new path: tempfile.path,
|
60
61
|
namespaces: {
|
61
|
-
environment:
|
62
|
+
environment: :development }
|
62
63
|
|
63
64
|
allow(Settings).to receive(:new)
|
64
65
|
|
65
66
|
settings_file.to_settings
|
66
67
|
|
67
68
|
expect(Settings).to have_received(:new).
|
68
|
-
with(
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
with(settings: { 'test' => 'settings' },
|
70
|
+
namespaces: {
|
71
|
+
environment: :development },
|
72
|
+
decryption_key: nil,
|
73
|
+
encryption_key: nil)
|
73
74
|
end
|
74
75
|
|
75
76
|
it 'can handle files which contain ERB markup' do
|
76
|
-
tempfile = create_tempfile_with_content
|
77
|
+
tempfile = create_tempfile_with_content '{ test: <%= 1 + 1 %> }'
|
77
78
|
settings_file = File.new path: tempfile.path
|
78
79
|
|
79
80
|
allow(Settings).to receive(:new)
|
80
81
|
|
81
82
|
settings_file.to_settings
|
82
83
|
expect(Settings).to have_received(:new).
|
83
|
-
with(
|
84
|
-
|
85
|
-
|
86
|
-
|
84
|
+
with(settings: { 'test' => 2 },
|
85
|
+
namespaces: {},
|
86
|
+
decryption_key: nil,
|
87
|
+
encryption_key: nil)
|
87
88
|
end
|
88
89
|
|
89
90
|
it 'does not throw an error when attempting to convert a file which does not exist' do
|
@@ -127,10 +128,20 @@ HEREDOC
|
|
127
128
|
|
128
129
|
settings_file.secure
|
129
130
|
|
130
|
-
settings_file
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
settings_file = File.new path: tempfile.path
|
132
|
+
raw_data = settings_file.to_settings.send(:raw_data)
|
133
|
+
secure_setting = raw_data['_secure_setting']
|
134
|
+
other_secure_setting = raw_data['_secure_other_setting']
|
135
|
+
|
136
|
+
expect(secure_setting).to match Filters::EncryptionFilter::BASE64_STRING_PATTERN
|
137
|
+
expect(other_secure_setting).to eql 'g4ryOaWniDPht0x1pW10XWgtC7Bax2yQAM3+p9ZDMmBU' \
|
138
|
+
'KlVXgvCn8MvdvciX0126P7uuLylY7Pdbm8AnpjeaTvPO' \
|
139
|
+
'aDnDjPATkH1xpQG/HKBy+7zd67SMb3tJ3sxJNkYm6Rrm' \
|
140
|
+
'ydFHkDCghG37lvCnuZs1Jvd/mhpr/+thqKvtI+c/vzY+' \
|
141
|
+
'eFxM52lnoWWOgqwGCtUjb+PMbq+HjId6X8uRbpL1SpIN' \
|
142
|
+
'A6WYJwvxTVK9XD/HYn67Fcqdova4dEHoqwzFfE+XVXM8' \
|
143
|
+
'uesE1DG3PFNhAzkT+mWXtBmo17i+K4wrOO06I13uDS3x' \
|
144
|
+
'+7LqoZz/Ez17SPXRJze4M/wyWfm43pnuVw=='
|
134
145
|
end
|
135
146
|
|
136
147
|
it 'does not rewrite the entire file but only the encrypted settings' do
|
@@ -153,8 +164,8 @@ HEREDOC
|
|
153
164
|
settings_file.secure
|
154
165
|
|
155
166
|
file_contents = ::File.read(tempfile.path)
|
156
|
-
secure_setting_encoded = file_contents[
|
157
|
-
secure_another_setting_encoded = file_contents[
|
167
|
+
secure_setting_encoded = file_contents[%r{ _secure_setting: ([A-Za-z0-9\+/]{342}==)$}, 1]
|
168
|
+
secure_another_setting_encoded = file_contents[%r{ _secure_another_setting: ([A-Za-z0-9\+/]{342}==)$}, 1]
|
158
169
|
|
159
170
|
expect(::File.read(tempfile.path)).to eql <<-HEREDOC
|
160
171
|
default:
|
@@ -170,7 +181,9 @@ other:
|
|
170
181
|
HEREDOC
|
171
182
|
end
|
172
183
|
|
173
|
-
it 'when rewriting the file, can handle names and values with regex special
|
184
|
+
it 'when rewriting the file, can handle names and values with regex special ' \
|
185
|
+
'characters' do
|
186
|
+
|
174
187
|
tempfile = create_tempfile_with_content <<-HEREDOC
|
175
188
|
stuff:
|
176
189
|
_secure_another+_setting: "Thanks for +all the fish"
|
@@ -182,7 +195,7 @@ HEREDOC
|
|
182
195
|
settings_file.secure
|
183
196
|
|
184
197
|
file_contents = ::File.read(tempfile.path)
|
185
|
-
secure_another_setting_encoded = file_contents[
|
198
|
+
secure_another_setting_encoded = file_contents[%r{ _secure_another\+_setting: ([A-Za-z0-9\+/]{342}==)$}, 1]
|
186
199
|
|
187
200
|
expect(::File.read(tempfile.path)).to eql <<-HEREDOC
|
188
201
|
stuff:
|
@@ -191,3 +204,4 @@ HEREDOC
|
|
191
204
|
end
|
192
205
|
end
|
193
206
|
end
|
207
|
+
# rubocop:enable Metrics/LineLength
|