app_conf 0.1.1 → 0.1.2
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 +36 -7
- data/app_conf.gemspec +2 -2
- data/lib/app_conf.rb +12 -6
- data/spec/app_conf_spec.rb +33 -12
- metadata +3 -3
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
AppConf
|
2
2
|
=======
|
3
|
-
Simplest YAML Backed Application Configuration
|
3
|
+
Simplest YAML Backed Application Wide Configuration (AppConfig)
|
4
4
|
|
5
5
|
Installation
|
6
6
|
----------------------------------
|
7
7
|
gem install app_conf
|
8
8
|
|
9
|
-
|
9
|
+
Example
|
10
10
|
----------------------------------
|
11
11
|
config.yml
|
12
12
|
---
|
@@ -28,21 +28,50 @@ Code:
|
|
28
28
|
|
29
29
|
Syntax
|
30
30
|
----------------------------------
|
31
|
+
* Load multiple files at once:
|
32
|
+
|
31
33
|
AppConf.load(*filenames)
|
34
|
+
|
35
|
+
* Or individually:
|
36
|
+
|
37
|
+
AppConf.load(filename1)
|
38
|
+
AppConf.load(filename2)
|
39
|
+
|
40
|
+
* Infinitely nested keys:
|
41
|
+
|
32
42
|
AppConf.multiple.nested.keys
|
43
|
+
|
44
|
+
* Override existing values:
|
45
|
+
|
33
46
|
AppConf.loaded.from.yaml = 'can override'
|
47
|
+
|
48
|
+
* Set new values:
|
49
|
+
|
34
50
|
AppConf.non.existing.value = 'can set'
|
35
51
|
|
52
|
+
* Clear entire tree:
|
53
|
+
|
54
|
+
AppConf.clear
|
55
|
+
|
56
|
+
* Returns nil for non-existent keys:
|
57
|
+
|
58
|
+
AppConf.non_existing -> nil
|
59
|
+
AppConf.non_existing.name -> NoMethodError: undefined method `name' for nil:NilClass
|
60
|
+
|
61
|
+
* Not dependent on Rails but easy to use with it. For example:
|
62
|
+
|
63
|
+
AppConf.load('config.yml', "#{Rails.env}.yml")
|
64
|
+
|
36
65
|
Other stuff
|
37
66
|
----------------------------------
|
38
67
|
* Works with Ruby 1.9.2
|
39
68
|
* No gem dependencies
|
40
|
-
*
|
41
|
-
*
|
42
|
-
`AppConf.load('config.yml', "#{Rails.env}.yml")`
|
69
|
+
* Fully tested with MiniTest::Spec
|
70
|
+
* Packaged as a Gem on RubyGems.org
|
43
71
|
|
44
72
|
Why
|
45
73
|
----------------------------------
|
46
|
-
* Because I wanted to write the simplest app config possible
|
47
|
-
*
|
74
|
+
* Because I wanted to write the simplest useful app config possible
|
75
|
+
* Others are either too simple or incomplete, lack documentation or aren't Gem installable
|
76
|
+
* Because I can :-)
|
48
77
|
|
data/app_conf.gemspec
CHANGED
@@ -2,10 +2,10 @@ require 'base64'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'app_conf'
|
5
|
-
s.version = '0.1.
|
5
|
+
s.version = '0.1.2'
|
6
6
|
s.authors = 'Phil Thompson'
|
7
7
|
s.email = Base64.decode64("cGhpbEBlbGVjdHJpY3Zpc2lvbnMuY29t\n")
|
8
|
-
s.summary = 'Simplest YAML Backed Application Configuration'
|
8
|
+
s.summary = 'Simplest YAML Backed Application Wide Configuration (AppConfig)'
|
9
9
|
s.homepage = 'https://github.com/PhilT/app_conf'
|
10
10
|
s.required_rubygems_version = '>= 1.3.6'
|
11
11
|
|
data/lib/app_conf.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
3
|
class AppConf
|
4
|
-
attr_reader :config
|
5
|
-
|
6
4
|
private_class_method :new
|
7
5
|
def initialize
|
8
6
|
@config = {}
|
@@ -15,6 +13,11 @@ class AppConf
|
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
16
|
+
def self.clear
|
17
|
+
@@config = new
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
18
21
|
def method_missing(method, *args, &block)
|
19
22
|
method = method.to_s
|
20
23
|
if method[-1] == '='
|
@@ -31,10 +34,13 @@ class AppConf
|
|
31
34
|
end
|
32
35
|
|
33
36
|
private
|
34
|
-
def self.recurse(
|
35
|
-
|
36
|
-
|
37
|
-
|
37
|
+
def self.recurse(hash, app_config)
|
38
|
+
hash.each do |key, value|
|
39
|
+
if value.is_a?(Hash)
|
40
|
+
new_app_config = new
|
41
|
+
value = recurse(value, app_config.send(key) || new_app_config)
|
42
|
+
end
|
43
|
+
app_config.send("#{key}=", value) if new_app_config.nil? || value === new_app_config
|
38
44
|
end
|
39
45
|
app_config
|
40
46
|
end
|
data/spec/app_conf_spec.rb
CHANGED
@@ -5,44 +5,65 @@ require 'app_conf'
|
|
5
5
|
describe AppConf do
|
6
6
|
before(:each) do
|
7
7
|
@dir = File.dirname(__FILE__)
|
8
|
-
|
9
|
-
|
10
|
-
it 'cannot be instantiated directly' do
|
11
|
-
AppConf.new.must_be_nil
|
8
|
+
AppConf.clear
|
9
|
+
AppConf.load("#{@dir}/config.yml")
|
12
10
|
end
|
13
11
|
|
14
12
|
it 'works with dot notation' do
|
15
|
-
AppConf.load("#{@dir}/config.yml")
|
16
13
|
AppConf.fullname.must_equal 'Joe Bloggs'
|
17
14
|
end
|
18
15
|
|
16
|
+
describe 'clear' do
|
17
|
+
it 'clears all keys' do
|
18
|
+
AppConf.fullname.wont_be_nil
|
19
|
+
AppConf.clear
|
20
|
+
AppConf.fullname.must_be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'does not return AppConf instance' do
|
24
|
+
AppConf.clear.must_be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
19
28
|
it 'works with nested dot notation' do
|
20
|
-
AppConf.load("#{@dir}/config.yml")
|
21
29
|
AppConf.user.name.first.must_equal 'Joe'
|
22
30
|
end
|
23
31
|
|
24
32
|
it 'works with multiple files' do
|
33
|
+
AppConf.clear
|
25
34
|
AppConf.load("#{@dir}/config.yml", "#{@dir}/other.yml")
|
26
35
|
AppConf.user.address.street.must_equal '1 Some Road'
|
27
36
|
AppConf.user.name.first.must_equal 'Joe'
|
28
37
|
end
|
29
38
|
|
39
|
+
it 'loads additional files' do
|
40
|
+
AppConf.load("#{@dir}/other.yml")
|
41
|
+
AppConf.user.address.street.must_equal '1 Some Road'
|
42
|
+
AppConf.user.name.first.must_equal 'Joe'
|
43
|
+
end
|
44
|
+
|
30
45
|
it 'allows additional keys to be set' do
|
31
|
-
AppConf.load("#{@dir}/config.yml")
|
32
46
|
AppConf.user.name.last = 'Bloggs'
|
33
47
|
AppConf.user.name.last.must_equal 'Bloggs'
|
34
48
|
end
|
35
49
|
|
36
50
|
it 'allows existing keys to be overridden' do
|
37
|
-
AppConf.load("#{@dir}/config.yml")
|
38
51
|
AppConf.user.name.first = 'Jody'
|
39
52
|
AppConf.user.name.first.must_equal 'Jody'
|
40
53
|
end
|
41
54
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
55
|
+
describe 'limitations' do
|
56
|
+
it 'cannot be instantiated directly' do
|
57
|
+
AppConf.new.must_be_nil
|
58
|
+
end
|
46
59
|
|
60
|
+
it 'returns nil when unknown key specified' do
|
61
|
+
AppConf.unknown.must_be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'does not allow nested items to be overwritten' do
|
65
|
+
lambda { AppConf.user.name = 'something' }.must_raise RuntimeError
|
66
|
+
end
|
67
|
+
end
|
47
68
|
end
|
48
69
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 2
|
9
|
+
version: 0.1.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Phil Thompson
|
@@ -69,7 +69,7 @@ rubyforge_project:
|
|
69
69
|
rubygems_version: 1.3.7
|
70
70
|
signing_key:
|
71
71
|
specification_version: 3
|
72
|
-
summary: Simplest YAML Backed Application Configuration
|
72
|
+
summary: Simplest YAML Backed Application Wide Configuration (AppConfig)
|
73
73
|
test_files:
|
74
74
|
- spec/app_conf_spec.rb
|
75
75
|
- spec/config.yml
|