a9n 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +2 -1
- data/lib/a9n.rb +26 -8
- data/lib/a9n/version.rb +1 -1
- data/spec/a9n_spec.rb +56 -25
- data/spec/fixtures/configuration.yml +5 -0
- data/spec/struct_spec.rb +5 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6fafa85c44eb1e47cfc4a8c8c75d1d5ad46c982
|
4
|
+
data.tar.gz: 3e014475898cc21ec793573cae9873b35539fddd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ad1197d5321b3c868ff02c4d1265538d2fee85a9a24bf12a801dbac3e94f8f6705a5059315d5fec3472c2f2388b25c32d56006ed002cecea2adb30b6c98125a
|
7
|
+
data.tar.gz: e2e61a41f5b9b53bc86f6640f7d8160acdfae31d04d4a81c847eab5d883ff92095d475b623a80f475a71318e0376c328002880d45b37c7498a66012b15a84729
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -10,7 +10,8 @@
|
|
10
10
|
[codeclimate]: https://codeclimate.com/github/knapo/a9n
|
11
11
|
[coveralls]: https://coveralls.io/r/knapo/a9n
|
12
12
|
|
13
|
-
Simple tool for managing extra configuration in ruby/rails apps. Supports Rails 2.x, 3.x, 4.x and Ruby 1.9, 2.0.
|
13
|
+
Simple tool for managing extra configuration in ruby/rails apps. Supports Rails 2.x, 3.x, 4.x and Ruby 1.9, 2.0.
|
14
|
+
Ruby 1.8 is not supported in version 0.1.2 and higher.
|
14
15
|
|
15
16
|
## Installation
|
16
17
|
|
data/lib/a9n.rb
CHANGED
@@ -43,8 +43,17 @@ module A9n
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def load
|
46
|
-
|
47
|
-
|
46
|
+
env_config = load_env_config
|
47
|
+
default_config = load_default_config
|
48
|
+
|
49
|
+
whole_config = default_config.merge(env_config)
|
50
|
+
|
51
|
+
@@configuration = Struct.new(whole_config)
|
52
|
+
end
|
53
|
+
|
54
|
+
def load_env_config
|
55
|
+
base = load_yml('config/configuration.yml.example', env)
|
56
|
+
local = load_yml('config/configuration.yml', env)
|
48
57
|
|
49
58
|
if base.nil? && local.nil?
|
50
59
|
raise MissingConfigurationFile.new("Neither config/configuration.yml.example nor config/configuration.yml was found")
|
@@ -54,18 +63,27 @@ module A9n
|
|
54
63
|
verify!(base, local)
|
55
64
|
end
|
56
65
|
|
57
|
-
|
66
|
+
local || base
|
67
|
+
end
|
68
|
+
|
69
|
+
def load_default_config
|
70
|
+
data = load_yml('config/configuration.yml.example', 'defaults', false)
|
71
|
+
data ||= load_yml('config/configuration.yml', 'defaults', false)
|
72
|
+
data ||= {}
|
73
|
+
return data
|
58
74
|
end
|
59
75
|
|
60
|
-
def load_yml(file)
|
76
|
+
def load_yml(file, env, raise_when_not_found = true)
|
61
77
|
path = File.join(self.root, file)
|
62
|
-
return unless File.exists?(path)
|
78
|
+
return nil unless File.exists?(path)
|
63
79
|
yml = YAML.load(ERB.new(File.read(path)).result)
|
64
80
|
|
65
|
-
if yml[
|
66
|
-
return yml[
|
81
|
+
if yml[env].is_a?(Hash)
|
82
|
+
return yml[env].deep_symbolize_keys
|
83
|
+
elsif raise_when_not_found
|
84
|
+
raise MissingConfigurationData.new("Configuration data for #{env} was not found in #{file}")
|
67
85
|
else
|
68
|
-
|
86
|
+
return nil
|
69
87
|
end
|
70
88
|
end
|
71
89
|
|
data/lib/a9n/version.rb
CHANGED
data/spec/a9n_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe A9n do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
context 'when custom non-rails app is being used' do
|
15
|
-
let(:local_app) { double(:
|
15
|
+
let(:local_app) { double(env: 'test', root: '/apps/a9n') }
|
16
16
|
before { described_class.local_app = local_app }
|
17
17
|
|
18
18
|
specify { described_class.local_app.should == local_app }
|
@@ -22,7 +22,7 @@ describe A9n do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
describe '.root' do
|
25
|
-
let(:local_app) { double(:
|
25
|
+
let(:local_app) { double(env: 'test', root: '/apps/a9n') }
|
26
26
|
before { described_class.local_app = local_app }
|
27
27
|
|
28
28
|
context 'with custom path' do
|
@@ -48,17 +48,33 @@ describe A9n do
|
|
48
48
|
|
49
49
|
describe '.load' do
|
50
50
|
let(:base_sample_config){
|
51
|
-
{ :
|
51
|
+
{ app_url: 'http://127.0.0.1:3000', api_key: 'base1234' }
|
52
52
|
}
|
53
53
|
let(:local_sample_config){
|
54
|
-
{ :
|
54
|
+
{ app_host: '127.0.0.1:3000', api_key: 'local1234' }
|
55
55
|
}
|
56
|
-
|
56
|
+
let(:base_default_config){
|
57
|
+
{ page_title: 'Base Kiełbasa', api_key: 'base1234default' }
|
58
|
+
}
|
59
|
+
let(:local_default_config){
|
60
|
+
{ page_title: 'Local Kiełbasa', api_key: 'local1234default' }
|
61
|
+
}
|
62
|
+
let(:env){
|
63
|
+
'tropical'
|
64
|
+
}
|
65
|
+
subject {
|
66
|
+
described_class
|
67
|
+
}
|
68
|
+
before do
|
69
|
+
allow(described_class).to receive(:env).and_return(env)
|
70
|
+
end
|
57
71
|
|
58
72
|
context 'when no configuration file exists' do
|
59
73
|
before do
|
60
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example').and_return(nil)
|
61
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml').and_return(nil)
|
74
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', env).and_return(nil)
|
75
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', env).and_return(nil)
|
76
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', 'defaults', false).never
|
77
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', 'defaults', false).never
|
62
78
|
expect(described_class).to receive(:verify!).never
|
63
79
|
end
|
64
80
|
it 'raises expection' do
|
@@ -68,44 +84,59 @@ describe A9n do
|
|
68
84
|
end
|
69
85
|
end
|
70
86
|
|
71
|
-
context 'when base configuration file exists' do
|
87
|
+
context 'when base configuration file exists with defaults' do
|
72
88
|
before do
|
73
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example').and_return(base_sample_config)
|
74
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml').and_return(nil)
|
89
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', env).and_return(base_sample_config)
|
90
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', env).and_return(nil)
|
91
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', 'defaults', false).and_return(base_default_config)
|
92
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', 'defaults', false).never
|
93
|
+
|
75
94
|
expect(described_class).to receive(:verify!).never
|
76
95
|
described_class.load
|
77
96
|
end
|
78
97
|
|
79
98
|
its(:app_url) { should_not be_nil }
|
80
99
|
its(:app_url) { should == subject.fetch(:app_url) }
|
100
|
+
its(:page_title) { should == 'Base Kiełbasa' }
|
101
|
+
its(:api_key) { should == 'base1234' }
|
81
102
|
specify {
|
82
103
|
expect { subject.app_host }.to raise_error(described_class::NoSuchConfigurationVariable)
|
83
104
|
}
|
84
105
|
end
|
85
106
|
|
86
|
-
context 'when local configuration file exists' do
|
107
|
+
context 'when local configuration file exists with defaults' do
|
87
108
|
before do
|
88
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example').and_return(nil)
|
89
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml').and_return(local_sample_config)
|
109
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', env).and_return(nil)
|
110
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', env).and_return(local_sample_config)
|
111
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', 'defaults', false).and_return(nil)
|
112
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', 'defaults', false).and_return(local_default_config)
|
90
113
|
expect(described_class).to receive(:verify!).never
|
91
114
|
described_class.load
|
92
115
|
end
|
93
116
|
|
94
117
|
its(:app_host) { should_not be_nil }
|
118
|
+
its(:page_title) { should == 'Local Kiełbasa' }
|
119
|
+
its(:api_key) { should == 'local1234' }
|
95
120
|
specify {
|
96
121
|
expect { subject.app_url }.to raise_error(described_class::NoSuchConfigurationVariable)
|
97
122
|
}
|
98
123
|
end
|
99
124
|
|
100
|
-
context 'when both local and base configuration file exists' do
|
125
|
+
context 'when both local and base configuration file exists without defaults' do
|
101
126
|
context 'with same data' do
|
102
127
|
before do
|
103
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example').and_return(base_sample_config)
|
104
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml').and_return(base_sample_config)
|
128
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', env).and_return(base_sample_config)
|
129
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', env).and_return(base_sample_config)
|
130
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', 'defaults', false).and_return(nil)
|
131
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', 'defaults', false).and_return(nil)
|
105
132
|
described_class.load
|
106
133
|
end
|
107
134
|
|
108
|
-
its(:app_url) { should_not be_nil }
|
135
|
+
its(:app_url) { should_not be_nil }
|
136
|
+
its(:api_key) { should == 'base1234' }
|
137
|
+
specify {
|
138
|
+
expect { subject.page_title }.to raise_error(described_class::NoSuchConfigurationVariable)
|
139
|
+
}
|
109
140
|
specify {
|
110
141
|
expect { subject.app_host }.to raise_error(described_class::NoSuchConfigurationVariable)
|
111
142
|
}
|
@@ -113,8 +144,10 @@ describe A9n do
|
|
113
144
|
|
114
145
|
context 'with different data' do
|
115
146
|
before do
|
116
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example').and_return(base_sample_config)
|
117
|
-
expect(described_class).to receive(:load_yml).with('config/configuration.yml').and_return(local_sample_config)
|
147
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', env).and_return(base_sample_config)
|
148
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', env).and_return(local_sample_config)
|
149
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml.example', 'defaults', false).never
|
150
|
+
expect(described_class).to receive(:load_yml).with('config/configuration.yml', 'defaults', false).never
|
118
151
|
end
|
119
152
|
it 'raises expection' do
|
120
153
|
expect {
|
@@ -127,14 +160,15 @@ describe A9n do
|
|
127
160
|
|
128
161
|
describe '.load_yml' do
|
129
162
|
let(:root) { File.dirname(__FILE__) }
|
130
|
-
|
163
|
+
let(:env) { 'test' }
|
164
|
+
subject { described_class.load_yml(file_path, env) }
|
131
165
|
|
132
166
|
before do
|
133
167
|
expect(described_class).to receive(:root).at_least(:once).and_return(root)
|
168
|
+
expect(described_class).to receive(:env).never
|
134
169
|
end
|
135
170
|
|
136
171
|
context 'when file not exists' do
|
137
|
-
before { expect(described_class).to receive(:env).never }
|
138
172
|
let(:file_path) { 'file_not_existing_in_universe.yml' }
|
139
173
|
|
140
174
|
it 'returns nil' do
|
@@ -146,12 +180,9 @@ describe A9n do
|
|
146
180
|
let(:file_path) { 'fixtures/configuration.yml'}
|
147
181
|
before {
|
148
182
|
ENV['DWARF'] = 'erbized dwarf'
|
149
|
-
expect(described_class).to receive(:env).twice.and_return(env)
|
150
183
|
}
|
151
184
|
|
152
185
|
context 'and has data' do
|
153
|
-
let(:env) { 'test' }
|
154
|
-
|
155
186
|
it 'returns non-empty hash' do
|
156
187
|
subject.should be_kind_of(Hash)
|
157
188
|
subject.keys.should_not be_empty
|
@@ -187,7 +218,7 @@ describe A9n do
|
|
187
218
|
|
188
219
|
context 'local_app_env is set' do
|
189
220
|
before {
|
190
|
-
expect(described_class).to receive(:local_app).and_return(double(:
|
221
|
+
expect(described_class).to receive(:local_app).and_return(double(env: 'dwarf_env')).exactly(3).times
|
191
222
|
expect(described_class).to receive(:get_env_var).never
|
192
223
|
}
|
193
224
|
its(:env) { should == 'dwarf_env' }
|
@@ -1,9 +1,13 @@
|
|
1
|
+
defaults:
|
2
|
+
default_dwarf: "default dwarf"
|
3
|
+
overriden_dwarf: "not yet overriden dwarf"
|
1
4
|
development:
|
2
5
|
nil_dwarf: ~
|
3
6
|
false_dwarf: false
|
4
7
|
true_dwarf: true
|
5
8
|
string_dwarf: "dwarf"
|
6
9
|
erb_dwarf: "<%= ENV['DWARF'] %>"
|
10
|
+
overriden_dwarf: "already overriden dwarf"
|
7
11
|
hash_dwarf:
|
8
12
|
dwarf_1: "hello 1"
|
9
13
|
dwarf_2: "hello 2"
|
@@ -13,6 +17,7 @@ test:
|
|
13
17
|
true_dwarf: true
|
14
18
|
string_dwarf: "dwarf"
|
15
19
|
erb_dwarf: "<%= ENV['DWARF'] %>"
|
20
|
+
overriden_dwarf: "already overriden dwarf"
|
16
21
|
hash_dwarf:
|
17
22
|
dwarf_1: "hello 1"
|
18
23
|
dwarf_2: "hello 2"
|
data/spec/struct_spec.rb
CHANGED
@@ -3,11 +3,11 @@ require 'spec_helper'
|
|
3
3
|
describe A9n::Struct do
|
4
4
|
subject {
|
5
5
|
described_class.new({
|
6
|
-
:
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
6
|
+
non_empty_dwarf: 'dwarf',
|
7
|
+
nil_dwarf: nil,
|
8
|
+
false_dwarf: false,
|
9
|
+
true_dwarf: true,
|
10
|
+
hash_dwarf: { dwarf: 'hello' }
|
11
11
|
})
|
12
12
|
}
|
13
13
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: a9n
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Krzysztof Knapik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Simple tool for managing extra configuration in ruby/rails apps
|
14
14
|
email:
|