a9n 0.6.2 → 0.7.0
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/.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)
|