a9n 0.1.2 → 0.1.3
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/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:
|