a9n 0.6.2 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +4 -0
- data/.rubocop.yml +43 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +3 -3
- data/README.md +7 -7
- data/Rakefile +1 -2
- data/a9n.gemspec +14 -13
- data/lib/a9n.rb +29 -23
- data/lib/a9n/capistrano.rb +1 -1
- data/lib/a9n/capistrano/tasks.cap +3 -3
- data/lib/a9n/capistrano/ver2x.rb +2 -2
- data/lib/a9n/ext/hash.rb +4 -2
- data/lib/a9n/ext/string_inquirer.rb +2 -2
- data/lib/a9n/loader.rb +24 -19
- data/lib/a9n/scope.rb +2 -3
- data/lib/a9n/struct.rb +4 -2
- data/lib/a9n/version.rb +1 -1
- data/spec/integration/a9n_spec.rb +33 -33
- data/spec/spec_helper.rb +9 -12
- data/spec/unit/a9n_spec.rb +55 -55
- data/spec/unit/loader_spec.rb +71 -71
- data/spec/unit/scope_spec.rb +9 -9
- data/spec/unit/struct_spec.rb +68 -55
- data/test_app/benchmark.rb +4 -2
- metadata +26 -10
data/lib/a9n/struct.rb
CHANGED
@@ -12,15 +12,17 @@ module A9n
|
|
12
12
|
data
|
13
13
|
end
|
14
14
|
|
15
|
+
alias to_h to_hash
|
16
|
+
|
15
17
|
def merge(another_data)
|
16
18
|
data.merge!(another_data)
|
17
19
|
end
|
18
20
|
|
19
|
-
def method_missing(name, *
|
21
|
+
def method_missing(name, *_args)
|
20
22
|
if data.key?(name)
|
21
23
|
fetch(name)
|
22
24
|
else
|
23
|
-
|
25
|
+
raise NoSuchConfigurationVariableError.new, name
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
data/lib/a9n/version.rb
CHANGED
@@ -1,38 +1,38 @@
|
|
1
1
|
RSpec.describe A9n do
|
2
2
|
subject { described_class }
|
3
3
|
|
4
|
-
let(:env) {
|
4
|
+
let(:env) { 'test' }
|
5
5
|
|
6
6
|
before do
|
7
7
|
clean_singleton(subject)
|
8
|
-
ENV[
|
9
|
-
ENV[
|
10
|
-
ENV[
|
11
|
-
ENV[
|
8
|
+
ENV['ERB_DWARF'] = 'erbized dwarf'
|
9
|
+
ENV['DWARF_PASSWORD'] = 'dwarf123'
|
10
|
+
ENV['MANDRILL_API_KEY'] = 'ASDF1234'
|
11
|
+
ENV['API_KEY'] = 'XYZ999'
|
12
12
|
subject.app = double(env: env)
|
13
|
-
subject.root = File.expand_path(
|
13
|
+
subject.root = File.expand_path('../../test_app', __dir__)
|
14
14
|
subject.load
|
15
15
|
end
|
16
16
|
|
17
17
|
after do
|
18
18
|
clean_singleton(subject)
|
19
|
-
ENV.delete(
|
20
|
-
ENV.delete(
|
19
|
+
ENV.delete('MANDRILL_API_KEY')
|
20
|
+
ENV.delete('API_KEY')
|
21
21
|
end
|
22
22
|
|
23
|
-
context
|
23
|
+
context 'base config file' do
|
24
24
|
it do
|
25
25
|
expect(subject.storage).to be_kind_of(A9n::Struct)
|
26
26
|
end
|
27
27
|
|
28
28
|
it do
|
29
|
-
expect(subject.default_dwarf).to eq(
|
30
|
-
expect(subject.overriden_dwarf).to eq(
|
29
|
+
expect(subject.default_dwarf).to eq('default dwarf')
|
30
|
+
expect(subject.overriden_dwarf).to eq('already overriden dwarf')
|
31
31
|
end
|
32
32
|
|
33
33
|
it do
|
34
|
-
expect(subject.fetch(:default_dwarf)).to eq(
|
35
|
-
expect(subject.fetch(:overriden_dwarf)).to eq(
|
34
|
+
expect(subject.fetch(:default_dwarf)).to eq('default dwarf')
|
35
|
+
expect(subject.fetch(:overriden_dwarf)).to eq('already overriden dwarf')
|
36
36
|
end
|
37
37
|
|
38
38
|
it do
|
@@ -44,37 +44,37 @@ RSpec.describe A9n do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it do
|
47
|
-
expect { subject.fetch(:invalid,
|
47
|
+
expect { subject.fetch(:invalid, 'Hello').to eq('Hello') }
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
context
|
52
|
-
let(:env) {
|
51
|
+
context 'undefined env' do
|
52
|
+
let(:env) { 'tropical' }
|
53
53
|
|
54
54
|
it do
|
55
|
-
expect(subject.default_dwarf).to eq(
|
56
|
-
expect(subject.overriden_dwarf).to eq(
|
55
|
+
expect(subject.default_dwarf).to eq('default dwarf')
|
56
|
+
expect(subject.overriden_dwarf).to eq('not yet overriden dwarf')
|
57
57
|
end
|
58
58
|
|
59
59
|
it do
|
60
|
-
expect(subject.fetch(:default_dwarf)).to eq(
|
61
|
-
expect(subject.fetch(:overriden_dwarf)).to eq(
|
60
|
+
expect(subject.fetch(:default_dwarf)).to eq('default dwarf')
|
61
|
+
expect(subject.fetch(:overriden_dwarf)).to eq('not yet overriden dwarf')
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
context
|
65
|
+
context 'extra config file' do
|
66
66
|
before do
|
67
67
|
expect(subject.mandrill).to be_kind_of(A9n::Struct)
|
68
68
|
end
|
69
69
|
|
70
70
|
it do
|
71
|
-
expect(subject.mandrill.username).to eq(
|
72
|
-
expect(subject.mandrill.api_key).to eq(
|
71
|
+
expect(subject.mandrill.username).to eq('joe')
|
72
|
+
expect(subject.mandrill.api_key).to eq('ASDF1234')
|
73
73
|
end
|
74
74
|
|
75
75
|
it do
|
76
|
-
expect(subject.mandrill.fetch(:username)).to eq(
|
77
|
-
expect(subject.mandrill.fetch(:api_key)).to eq(
|
76
|
+
expect(subject.mandrill.fetch(:username)).to eq('joe')
|
77
|
+
expect(subject.mandrill.fetch(:api_key)).to eq('ASDF1234')
|
78
78
|
end
|
79
79
|
|
80
80
|
it do
|
@@ -82,19 +82,19 @@ RSpec.describe A9n do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
context
|
85
|
+
context 'extra config file with erb' do
|
86
86
|
before do
|
87
87
|
expect(subject.cloud).to be_kind_of(A9n::Struct)
|
88
88
|
end
|
89
89
|
|
90
90
|
it do
|
91
|
-
expect(subject.cloud.username).to eq(
|
92
|
-
expect(subject.cloud.password).to eq(
|
91
|
+
expect(subject.cloud.username).to eq('testuser')
|
92
|
+
expect(subject.cloud.password).to eq('qwerty')
|
93
93
|
end
|
94
94
|
|
95
95
|
it do
|
96
|
-
expect(subject.cloud.fetch(:username)).to eq(
|
97
|
-
expect(subject.cloud.fetch(:password)).to eq(
|
96
|
+
expect(subject.cloud.fetch(:username)).to eq('testuser')
|
97
|
+
expect(subject.cloud.fetch(:password)).to eq('qwerty')
|
98
98
|
end
|
99
99
|
|
100
100
|
it do
|
@@ -102,17 +102,17 @@ RSpec.describe A9n do
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
context
|
105
|
+
context 'extra config file with example' do
|
106
106
|
before do
|
107
107
|
expect(subject.mailer).to be_kind_of(A9n::Struct)
|
108
108
|
end
|
109
109
|
|
110
110
|
it do
|
111
|
-
expect(subject.mailer.delivery_method).to eq(
|
111
|
+
expect(subject.mailer.delivery_method).to eq('test')
|
112
112
|
end
|
113
113
|
|
114
114
|
it do
|
115
|
-
expect(subject.mailer.fetch(:delivery_method)).to eq(
|
115
|
+
expect(subject.mailer.fetch(:delivery_method)).to eq('test')
|
116
116
|
end
|
117
117
|
|
118
118
|
it do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'simplecov'
|
2
2
|
SimpleCov.start
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler/setup'
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require 'a9n'
|
8
|
+
require 'pry'
|
9
9
|
|
10
10
|
RSpec.configure do |config|
|
11
11
|
# rspec-expectations config goes here. You can use an alternate
|
@@ -16,9 +16,9 @@ RSpec.configure do |config|
|
|
16
16
|
# and `failure_message` of custom matchers include text for helper methods
|
17
17
|
# defined using `chain`, e.g.:
|
18
18
|
# be_bigger_than(2).and_smaller_than(4).description
|
19
|
-
# # =>
|
19
|
+
# # => 'be bigger than 2 and smaller than 4'
|
20
20
|
# ...rather than:
|
21
|
-
# # =>
|
21
|
+
# # => 'be bigger than 2'
|
22
22
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
23
23
|
end
|
24
24
|
|
@@ -48,7 +48,7 @@ RSpec.configure do |config|
|
|
48
48
|
# Allows RSpec to persist some state between runs in order to support
|
49
49
|
# the `--only-failures` and `--next-failure` CLI options. We recommend
|
50
50
|
# you configure your source control system to ignore this file.
|
51
|
-
config.example_status_persistence_file_path =
|
51
|
+
config.example_status_persistence_file_path = 'spec/examples.txt'
|
52
52
|
|
53
53
|
# Limits the available syntax to the non-monkey patched syntax that is
|
54
54
|
# recommended. For more details, see:
|
@@ -91,9 +91,6 @@ end
|
|
91
91
|
|
92
92
|
def clean_singleton(klass)
|
93
93
|
[:@storage, :@env, :@app, :@root].each do |var|
|
94
|
-
|
95
|
-
klass.remove_instance_variable(var)
|
96
|
-
end
|
94
|
+
klass.instance_variable_defined?(var) && klass.remove_instance_variable(var)
|
97
95
|
end
|
98
96
|
end
|
99
|
-
|
data/spec/unit/a9n_spec.rb
CHANGED
@@ -3,42 +3,42 @@ RSpec.describe A9n do
|
|
3
3
|
before { clean_singleton(subject) }
|
4
4
|
after { clean_singleton(subject) }
|
5
5
|
|
6
|
-
describe
|
6
|
+
describe '.env' do
|
7
7
|
before do
|
8
8
|
subject.instance_variable_set(:@env, nil)
|
9
9
|
end
|
10
10
|
|
11
|
-
context
|
11
|
+
context 'app_env is set' do
|
12
12
|
before do
|
13
|
-
expect(subject).to receive(:app).and_return(double(env: ::A9n::StringInquirer.new(
|
13
|
+
expect(subject).to receive(:app).and_return(double(env: ::A9n::StringInquirer.new('dwarf_env')))
|
14
14
|
expect(subject).to receive(:env_var).never
|
15
15
|
end
|
16
16
|
|
17
17
|
it do
|
18
|
-
expect(subject.env).to eq(
|
18
|
+
expect(subject.env).to eq('dwarf_env')
|
19
19
|
expect(subject.env.dwarf_env?).to eq(true)
|
20
20
|
expect(subject.env.production?).to eq(false)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
context
|
24
|
+
context 'when APP_ENV is set' do
|
25
25
|
before do
|
26
26
|
expect(subject).to receive(:app_env).and_return(nil)
|
27
|
-
expect(subject).to receive(:env_var).with(
|
28
|
-
expect(subject).to receive(:env_var).with(
|
29
|
-
expect(subject).to receive(:env_var).with(
|
27
|
+
expect(subject).to receive(:env_var).with('RAILS_ENV').and_return(nil)
|
28
|
+
expect(subject).to receive(:env_var).with('RACK_ENV').and_return(nil)
|
29
|
+
expect(subject).to receive(:env_var).with('APP_ENV').and_return('dwarf_env')
|
30
30
|
end
|
31
31
|
|
32
32
|
it do
|
33
|
-
expect(subject.env).to eq(
|
33
|
+
expect(subject.env).to eq('dwarf_env')
|
34
34
|
expect(subject.env.dwarf_env?).to eq(true)
|
35
35
|
expect(subject.env.production?).to eq(false)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
describe
|
41
|
-
context
|
40
|
+
describe '.app' do
|
41
|
+
context 'when rails not found' do
|
42
42
|
before do
|
43
43
|
expect(subject).to receive(:rails_app).and_return(nil)
|
44
44
|
end
|
@@ -48,8 +48,8 @@ RSpec.describe A9n do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
context
|
52
|
-
let(:app) { double(env:
|
51
|
+
context 'when rails app is being used' do
|
52
|
+
let(:app) { double(env: 'test', root: '/apps/a9n') }
|
53
53
|
|
54
54
|
before do
|
55
55
|
expect(subject).to receive(:rails_app).and_return(app)
|
@@ -60,8 +60,8 @@ RSpec.describe A9n do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
context
|
64
|
-
let(:app) { double(env:
|
63
|
+
context 'when custom non-rails app is being used' do
|
64
|
+
let(:app) { double(env: 'test', root: '/apps/a9n') }
|
65
65
|
|
66
66
|
before do
|
67
67
|
subject.app = app
|
@@ -73,60 +73,60 @@ RSpec.describe A9n do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
describe
|
77
|
-
context
|
78
|
-
let(:app) { double(env:
|
76
|
+
describe '.root' do
|
77
|
+
context 'when app is set' do
|
78
|
+
let(:app) { double(env: 'test', root: '/apps/a9n') }
|
79
79
|
|
80
80
|
before do
|
81
81
|
subject.app = app
|
82
82
|
end
|
83
83
|
|
84
|
-
context
|
84
|
+
context 'with custom path' do
|
85
85
|
before do
|
86
|
-
subject.root =
|
86
|
+
subject.root = '/home/knapo/workspace/a9n'
|
87
87
|
end
|
88
88
|
|
89
89
|
it do
|
90
|
-
expect(subject.root).to eq(Pathname.new(
|
90
|
+
expect(subject.root).to eq(Pathname.new('/home/knapo/workspace/a9n'))
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
context
|
94
|
+
context 'with local app path' do
|
95
95
|
it do
|
96
|
-
expect(subject.root).to eq(
|
96
|
+
expect(subject.root).to eq('/apps/a9n')
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
-
context
|
101
|
+
context 'when app is not set' do
|
102
102
|
it do
|
103
103
|
expect(subject.root).to eq(nil)
|
104
104
|
end
|
105
105
|
|
106
|
-
context
|
106
|
+
context 'when setting a custom path when is falsy' do
|
107
107
|
before do
|
108
|
-
subject.root ||=
|
108
|
+
subject.root ||= '/home/knapo/workspace/a9n'
|
109
109
|
end
|
110
110
|
|
111
111
|
it do
|
112
|
-
expect(subject.root).to eq(Pathname.new(
|
112
|
+
expect(subject.root).to eq(Pathname.new('/home/knapo/workspace/a9n'))
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
context
|
116
|
+
context 'when setting a custom path' do
|
117
117
|
before do
|
118
|
-
subject.root =
|
118
|
+
subject.root = '/home/knapo/workspace/a9n'
|
119
119
|
end
|
120
120
|
|
121
121
|
it do
|
122
|
-
expect(subject.root).to eq(Pathname.new(
|
122
|
+
expect(subject.root).to eq(Pathname.new('/home/knapo/workspace/a9n'))
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
describe
|
129
|
-
context
|
128
|
+
describe '.rails_app' do
|
129
|
+
context 'when defined' do
|
130
130
|
before do
|
131
131
|
Object.const_set(:Rails, Module.new)
|
132
132
|
end
|
@@ -140,54 +140,54 @@ RSpec.describe A9n do
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
143
|
-
context
|
143
|
+
context 'when not defined' do
|
144
144
|
it do
|
145
145
|
expect(subject.rails_app).to be_nil
|
146
146
|
end
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
-
describe
|
150
|
+
describe '.env_var' do
|
151
151
|
before do
|
152
|
-
ENV[
|
152
|
+
ENV['DWARF'] = 'little dwarf'
|
153
153
|
end
|
154
154
|
|
155
155
|
it do
|
156
|
-
expect(subject.env_var(
|
156
|
+
expect(subject.env_var('DWARF')).to eq('little dwarf')
|
157
157
|
end
|
158
158
|
|
159
159
|
it do
|
160
|
-
expect(subject.env_var(
|
160
|
+
expect(subject.env_var('IS_DWARF')).to be_nil
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
describe
|
164
|
+
describe '.default_files' do
|
165
165
|
before do
|
166
|
-
subject.root = File.expand_path(
|
166
|
+
subject.root = File.expand_path('../../test_app', __dir__)
|
167
167
|
end
|
168
168
|
|
169
169
|
it do
|
170
|
-
expect(subject.default_files[0]).to include(
|
170
|
+
expect(subject.default_files[0]).to include('configuration.yml')
|
171
171
|
expect(Pathname.new(subject.default_files[0])).to be_absolute
|
172
|
-
expect(subject.default_files[1]).to include(
|
172
|
+
expect(subject.default_files[1]).to include('a9n/mandrill.yml')
|
173
173
|
expect(Pathname.new(subject.default_files[1])).to be_absolute
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
-
describe
|
177
|
+
describe '.load' do
|
178
178
|
before do
|
179
|
-
expect(described_class).to receive(:env).exactly(2).times.and_return(
|
180
|
-
subject.root =
|
179
|
+
expect(described_class).to receive(:env).exactly(2).times.and_return('dev')
|
180
|
+
subject.root = '/apps/test_app'
|
181
181
|
files.each do |f, cfg|
|
182
|
-
expect(A9n::Loader).to receive(:new).with(f, kind_of(A9n::Scope),
|
182
|
+
expect(A9n::Loader).to receive(:new).with(f, kind_of(A9n::Scope), 'dev').and_return(double(get: cfg))
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
-
context
|
186
|
+
context 'when no files given' do
|
187
187
|
let(:files) do
|
188
188
|
{
|
189
|
-
|
190
|
-
|
189
|
+
'/apps/test_app/config/file1.yml' => { host: 'host1.com' },
|
190
|
+
'/apps/test_app/config/dir/file2.yml' => { host: 'host2.com' }
|
191
191
|
}
|
192
192
|
end
|
193
193
|
|
@@ -201,15 +201,15 @@ RSpec.describe A9n do
|
|
201
201
|
end
|
202
202
|
end
|
203
203
|
|
204
|
-
context
|
204
|
+
context 'when custom files given' do
|
205
205
|
let(:given_files) do
|
206
|
-
[
|
206
|
+
['file3.yml', '/apps/test_app/config/dir/file4.yml']
|
207
207
|
end
|
208
208
|
|
209
209
|
let(:files) do
|
210
210
|
{
|
211
|
-
|
212
|
-
|
211
|
+
'/apps/test_app/config/file3.yml' => { host: 'host3.com' },
|
212
|
+
'/apps/test_app/config/dir/file4.yml' => { host: 'host4.com' }
|
213
213
|
}
|
214
214
|
end
|
215
215
|
|
@@ -224,8 +224,8 @@ RSpec.describe A9n do
|
|
224
224
|
end
|
225
225
|
end
|
226
226
|
|
227
|
-
describe
|
228
|
-
context
|
227
|
+
describe '.method_missing' do
|
228
|
+
context 'when storage is empty' do
|
229
229
|
before do
|
230
230
|
expect(subject).to receive(:load).once
|
231
231
|
end
|
@@ -236,7 +236,7 @@ RSpec.describe A9n do
|
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
239
|
-
context
|
239
|
+
context 'when storage is not empty' do
|
240
240
|
before do
|
241
241
|
subject.storage[:whenever] = 'whenever'
|
242
242
|
expect(subject).not_to receive(:load)
|