basic_config 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,4 @@
1
- # BasicConfig
2
-
3
- [![Build Status](https://secure.travis-ci.org/stephan778/basic_config.png)](http://travis-ci.org/stephan778/basic_config)
1
+ # BasicConfig [![Build Status](https://secure.travis-ci.org/stephan778/basic_config.png)](http://travis-ci.org/stephan778/basic_config)
4
2
 
5
3
  Friendly configuration wrapper. If you find yourself using things like:
6
4
 
@@ -75,10 +73,23 @@ or corrupting some data until you finally notice and track it down back to this
75
73
 
76
74
  If you are using a `BasicConfig`:
77
75
  ```ruby
76
+ AppConfig = BasicConfig.load_env('config/application.yml', 'development')
78
77
  secret_token = AppConfig.something
79
78
  ```
80
- you'll get `NoMethodError` in that particular line with the name of the key that
81
- is missing.
79
+ you'll get `BasicConfig::NotFound` exception with a message similar to this:
80
+
81
+ Configuration key 'development.something' is missing in config/application.yml
82
+
83
+ if you're constructing BasicConfig with `new`, then it'll show source code
84
+ location where BasicConfig is initialized.
85
+
86
+ ```ruby
87
+ AppConfig = BasicConfig.new({ secret_token: 'something' })
88
+ secret_token = AppConfig.secret_toklen # Note a typo here
89
+
90
+ # Will result in exception:
91
+ # BasicConfig::NotFound: Configuration key 'secret_toklen' is missing in BasicConfig constructed at your_file.rb:5 in `new'
92
+ ```
82
93
 
83
94
  *Note:* There is also an `include?` method which you can use to check if
84
95
  particular key exist in your config - `AppConfig.include?(:something)`.
data/basic_config.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(spec)/})
13
13
  gem.name = 'basic_config'
14
14
  gem.require_path = 'lib'
15
- gem.version = '0.0.2'
15
+ gem.version = '0.1.0'
16
16
 
17
17
  gem.add_development_dependency('rspec', '~> 2.10')
18
18
  end
data/lib/basic_config.rb CHANGED
@@ -1,9 +1,24 @@
1
1
  require 'yaml'
2
2
 
3
3
  class BasicConfig
4
- def initialize(hash)
4
+ class NotFound < RuntimeError
5
+ attr_reader :name, :scope, :key
6
+
7
+ def initialize(name, scope, key)
8
+ @name = name
9
+ @scope = scope
10
+ @key = key
11
+
12
+ super("Configuration key '#{scope}#{key}' is missing in #{name}")
13
+ end
14
+ end
15
+
16
+ def initialize(hash, configuration_name = nil, configuration_scope = '')
5
17
  raise ArgumentError, 'Hash can not be nil' if hash.nil?
6
18
 
19
+ @name = configuration_name || "BasicConfig constructed at #{caller[0]}"
20
+ @scope = configuration_scope
21
+
7
22
  # Symbolize keys: don't want to add ActiveSupport dependency just for this.
8
23
  @hash = hash.inject({}) do |h, (key, value)|
9
24
  h[key.to_sym] = value
@@ -11,7 +26,7 @@ class BasicConfig
11
26
  end
12
27
 
13
28
  @hash.each do |key, value|
14
- @hash[key] = BasicConfig.new(value) if value.is_a?(Hash)
29
+ @hash[key] = BasicConfig.new(value, @name, [@scope, key, '.'].join) if value.is_a?(Hash)
15
30
  end
16
31
  end
17
32
 
@@ -28,7 +43,7 @@ class BasicConfig
28
43
  raise ArgumentError, 'Getter can not receive any arguments' if !args.empty? || block_given?
29
44
  @hash[meth]
30
45
  else
31
- super
46
+ raise NotFound.new(@name, @scope, meth)
32
47
  end
33
48
  end
34
49
 
@@ -45,10 +60,10 @@ class BasicConfig
45
60
  end
46
61
 
47
62
  def self.load_file(name)
48
- BasicConfig.new(YAML.load_file(name))
63
+ BasicConfig.new(YAML.load_file(name), name)
49
64
  end
50
65
 
51
66
  def self.load_env(name, env)
52
- BasicConfig.new(YAML.load_file(name)[env])
67
+ BasicConfig.new(YAML.load_file(name)[env], name, env + '.')
53
68
  end
54
69
  end
@@ -41,28 +41,28 @@ describe BasicConfig do
41
41
  end
42
42
 
43
43
  it 'correctly handles respond_to? queries' do
44
- subject.should respond_to :one
45
- subject.should respond_to :three
46
- subject.should_not respond_to :unknown
44
+ should respond_to :one
45
+ should respond_to :three
46
+ should_not respond_to :unknown
47
47
  end
48
-
49
- it 'raises NoMethodError for unknown keys' do
50
- expect { subject.four }.to raise_error(NoMethodError)
48
+
49
+ it 'raises BasicConfig::KeyNotFound for unknown keys' do
50
+ expect { subject.four }.to raise_error(BasicConfig::NotFound)
51
51
  end
52
52
 
53
53
  it 'can be converted back to hash' do
54
54
  subject.to_hash.should == symbolized_hash
55
55
  end
56
56
 
57
- describe '::load_file' do
57
+ describe '.load_file' do
58
58
  it 'uses YAML to load files' do
59
- YAML.should_receive(:load_file).with('file').and_return(:content)
60
- BasicConfig.should_receive(:new).with(:content)
61
- BasicConfig.load_file('file')
59
+ content = { key: 'value' }
60
+ YAML.stub(:load_file).with('file').and_return(content)
61
+ BasicConfig.load_file('file').to_hash.should == content
62
62
  end
63
63
  end
64
64
 
65
- describe '::load_env' do
65
+ describe '.load_env' do
66
66
  let(:content) do
67
67
  {
68
68
  'development' => {
@@ -73,10 +73,86 @@ describe BasicConfig do
73
73
  }
74
74
  }
75
75
  end
76
+ let(:environment) { 'development' }
77
+ let(:expected_result) { { value: 'x' } }
78
+
76
79
  it 'selects env section from YAML loaded file' do
77
- YAML.should_receive(:load_file).with('file').and_return(content)
78
- BasicConfig.should_receive(:new).with(content['development'])
79
- BasicConfig.load_env('file', 'development')
80
+ YAML.stub(:load_file).with('file').and_return(content)
81
+ BasicConfig.load_env('file', environment).to_hash.should == expected_result
82
+ end
83
+ end
84
+
85
+ describe BasicConfig::NotFound do
86
+ let(:exception) do
87
+ begin
88
+ config.missing_key
89
+ rescue BasicConfig::NotFound => expected_failure
90
+ expected_failure
91
+ end
92
+ end
93
+ subject { exception.message }
94
+ let(:original_config) { BasicConfig.new(hash) }
95
+ let(:original_scoping) { '' }
96
+
97
+ shared_examples_for 'specific failure' do
98
+ it 'contains the right location' do
99
+ should include location
100
+ end
101
+
102
+ it 'contains the right key' do
103
+ should include "'#{missing_key_name}'"
104
+ end
105
+ end
106
+
107
+ shared_examples_for 'construction contexts' do
108
+ context 'when constructed manually' do
109
+ let(:original_config) { BasicConfig.new(hash) }
110
+ let(:location) { 'spec/basic_config_spec.rb:109' }
111
+
112
+ it_behaves_like 'specific failure'
113
+ end
114
+
115
+ context 'when loaded from YAML' do
116
+ let(:content) { hash }
117
+ let(:filename) { 'example.yml' }
118
+ let(:location) { filename }
119
+
120
+ before do
121
+ YAML.stub(:load_file).with(filename).and_return(content)
122
+ end
123
+
124
+ let(:original_config) { BasicConfig.load_file(filename) }
125
+
126
+ it_behaves_like 'specific failure'
127
+
128
+ context 'with env' do
129
+ let(:content) do
130
+ {
131
+ 'development' => hash,
132
+ 'test' => hash
133
+ }
134
+ end
135
+ let(:environment) { 'development' }
136
+ let(:original_config) { BasicConfig.load_env(filename, environment) }
137
+ let(:original_scoping) { 'development.' }
138
+
139
+ it_behaves_like 'specific failure'
140
+ end
141
+ end
142
+ end
143
+
144
+ context 'top-level' do
145
+ let(:config) { original_config }
146
+ let(:missing_key_name) { "#{original_scoping}missing_key" }
147
+
148
+ it_behaves_like 'construction contexts'
149
+ end
150
+
151
+ context 'one-level in' do
152
+ let(:config) { original_config.three }
153
+ let(:missing_key_name) { "#{original_scoping}three.missing_key" }
154
+
155
+ it_behaves_like 'construction contexts'
80
156
  end
81
157
  end
82
158
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: basic_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-02 00:00:00.000000000 Z
12
+ date: 2012-06-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec