basic_config 0.0.2 → 0.1.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.
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