dot_hash 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dot_hash/settings.rb +74 -0
- data/lib/dot_hash/version.rb +1 -1
- data/lib/dot_hash.rb +1 -0
- data/test/dot_hash/properties_test.rb +17 -17
- data/test/dot_hash/settings_test.rb +110 -0
- data/test/fixtures/configs1.yaml +7 -0
- data/test/fixtures/configs2.yaml +2 -0
- data/test/test_helper.rb +5 -0
- metadata +11 -4
@@ -0,0 +1,74 @@
|
|
1
|
+
module DotHash
|
2
|
+
class Settings
|
3
|
+
attr_reader :configs
|
4
|
+
|
5
|
+
def initialize(configs, wrapper=Properties)
|
6
|
+
@configs = Properties.new(configs)
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(key)
|
10
|
+
configs[key]
|
11
|
+
end
|
12
|
+
|
13
|
+
def respond_to?(key)
|
14
|
+
configs.respond_to?(key)
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_reader :instance
|
19
|
+
|
20
|
+
def method_missing(key)
|
21
|
+
instance.public_send key
|
22
|
+
end
|
23
|
+
|
24
|
+
def respond_to?(key)
|
25
|
+
instance.respond_to?(key)
|
26
|
+
end
|
27
|
+
|
28
|
+
def load(*args)
|
29
|
+
@instance = new hash_from(*args)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def hash_from *args
|
35
|
+
args.inject({}) do |hash, arg|
|
36
|
+
merge_hashes hash, get_hash_from(arg)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_hash_from arg
|
41
|
+
if arg.is_a? Hash
|
42
|
+
arg
|
43
|
+
elsif File.file? arg
|
44
|
+
get_hash_from_file arg
|
45
|
+
elsif File.directory? arg
|
46
|
+
get_hash_from_directory arg
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_hash_from_file(file)
|
51
|
+
return {} unless file =~ /\.(yaml|yml)/
|
52
|
+
YAML.load_file(file)
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_hash_from_directory(directory)
|
56
|
+
Dir["#{directory}/**/*"].inject({}) do |hash, file|
|
57
|
+
merge_hashes hash, get_hash_from_file(file)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def merge_hashes(h1, h2)
|
62
|
+
return h1 unless h2
|
63
|
+
return h2 unless h1
|
64
|
+
|
65
|
+
h2.each do |key, value|
|
66
|
+
h1[key] = value.is_a?(Hash) ?
|
67
|
+
merge_hashes(h1[key], value) : value
|
68
|
+
end
|
69
|
+
|
70
|
+
h1
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/dot_hash/version.rb
CHANGED
data/lib/dot_hash.rb
CHANGED
@@ -2,80 +2,80 @@ require File.expand_path("../../test_helper", __FILE__)
|
|
2
2
|
|
3
3
|
module DotHash
|
4
4
|
describe Properties do
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :properties
|
6
6
|
|
7
7
|
describe "#method_missing" do
|
8
8
|
describe "with a simple hash" do
|
9
9
|
before do
|
10
|
-
@
|
10
|
+
@properties = Properties.new speed: "15", "power" => 100
|
11
11
|
end
|
12
12
|
|
13
13
|
it "gets a hash property using the dot notation" do
|
14
|
-
|
14
|
+
properties.speed.must_equal "15"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "raises an error if the method is not on the hash" do
|
18
|
-
-> {
|
18
|
+
-> {properties.name}.must_raise NoMethodError
|
19
19
|
end
|
20
20
|
|
21
21
|
it "gets a property from a stringed key" do
|
22
|
-
|
22
|
+
properties.power.must_equal 100
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
describe "with a nested hash" do
|
27
27
|
before do
|
28
|
-
@
|
28
|
+
@properties = Properties.new user: {
|
29
29
|
"info" => {name: "dude", is_admin: false}
|
30
30
|
}
|
31
31
|
end
|
32
32
|
|
33
33
|
it "returns a DotHash instence for property with a nested hash" do
|
34
|
-
|
34
|
+
properties.user.must_be_instance_of DotHash::Properties
|
35
35
|
end
|
36
36
|
|
37
37
|
it "gets chained properties" do
|
38
|
-
|
39
|
-
|
38
|
+
properties.user.info.name.must_equal "dude"
|
39
|
+
properties.user.info.is_admin.must_equal false
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
describe "#[]" do
|
44
44
|
before do
|
45
|
-
@
|
45
|
+
@properties = Properties.new user: { name: "dude" }
|
46
46
|
end
|
47
47
|
|
48
48
|
it "accesses properties like a symbol hash" do
|
49
|
-
|
49
|
+
properties[:user][:name].must_equal "dude"
|
50
50
|
end
|
51
51
|
|
52
52
|
it "accesses properties like a string hash" do
|
53
|
-
|
53
|
+
properties["user"]["name"].must_equal "dude"
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
58
|
describe "#respond_to?" do
|
59
59
|
before do
|
60
|
-
@
|
60
|
+
@properties = Properties.new speed: "15",
|
61
61
|
info: {name: "Eden"},
|
62
62
|
"color" => "#00FFBB"
|
63
63
|
end
|
64
64
|
|
65
65
|
it "responds to a simple property" do
|
66
|
-
|
66
|
+
properties.must_respond_to :speed
|
67
67
|
end
|
68
68
|
|
69
69
|
it "responds to a nested property" do
|
70
|
-
|
70
|
+
properties.info.must_respond_to :name
|
71
71
|
end
|
72
72
|
|
73
73
|
it "respond to a string property" do
|
74
|
-
|
74
|
+
properties.must_respond_to :color
|
75
75
|
end
|
76
76
|
|
77
77
|
it "doesn't respond to a missing property" do
|
78
|
-
|
78
|
+
properties.wont_respond_to :size
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
|
+
|
3
|
+
module DotHash
|
4
|
+
describe Settings do
|
5
|
+
attr_reader :settings
|
6
|
+
|
7
|
+
describe "#method_missing" do
|
8
|
+
before do
|
9
|
+
configs = {site: "skyo.com", facebook: {api: "123"}}
|
10
|
+
@settings = Settings.new configs
|
11
|
+
end
|
12
|
+
|
13
|
+
it "gets hash properties" do
|
14
|
+
settings.site.must_equal "skyo.com"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "gets a nested hash property" do
|
18
|
+
settings.facebook.api.must_equal "123"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#respond_to?" do
|
23
|
+
before do
|
24
|
+
configs = {site: "skyo.com"}
|
25
|
+
@settings = Settings.new configs
|
26
|
+
end
|
27
|
+
|
28
|
+
it "responds to a property on the configs" do
|
29
|
+
settings.must_respond_to :site
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".instance" do
|
34
|
+
before do
|
35
|
+
configs = {site: "skyo.com"}
|
36
|
+
Settings.load configs
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns a singleton instance of the settings" do
|
40
|
+
Settings.instance.must_be_instance_of Settings
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe ".method_missing" do
|
45
|
+
before do
|
46
|
+
configs = {site: "skyo.com"}
|
47
|
+
Settings.load configs
|
48
|
+
end
|
49
|
+
|
50
|
+
it "gets hash properties" do
|
51
|
+
Settings.site.must_equal "skyo.com"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe ".respond_to?" do
|
56
|
+
before do
|
57
|
+
configs = {site: "skyo.com"}
|
58
|
+
Settings.load configs
|
59
|
+
end
|
60
|
+
|
61
|
+
it "responds to a property on the configs" do
|
62
|
+
Settings.must_respond_to :site
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe ".load" do
|
67
|
+
describe "loading from hashes" do
|
68
|
+
before do
|
69
|
+
Settings.load({a: 1, b: {c: 2}}, {b: {x: {z: 10}}})
|
70
|
+
end
|
71
|
+
|
72
|
+
it "adds new properties to the previous hash" do
|
73
|
+
Settings.b.x.z.must_equal 10
|
74
|
+
end
|
75
|
+
|
76
|
+
it "keeps non-changed properties untouched" do
|
77
|
+
Settings.a.must_equal 1
|
78
|
+
end
|
79
|
+
|
80
|
+
it "merges nested hashes correctly" do
|
81
|
+
Settings.b.c.must_equal 2
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "loading from files" do
|
86
|
+
it "loads from a file" do
|
87
|
+
Settings.load fixtures_path("configs1.yaml")
|
88
|
+
Settings.rogue.speed.must_equal 20
|
89
|
+
Settings.rogue.power.must_equal 11
|
90
|
+
end
|
91
|
+
|
92
|
+
it "loads from two files" do
|
93
|
+
Settings.load(
|
94
|
+
fixtures_path("configs1.yaml"),
|
95
|
+
fixtures_path("configs2.yaml")
|
96
|
+
)
|
97
|
+
|
98
|
+
Settings.rogue.speed.must_equal 25
|
99
|
+
Settings.rogue.power.must_equal 11
|
100
|
+
end
|
101
|
+
|
102
|
+
it "loads from a directory" do
|
103
|
+
Settings.load fixtures_path
|
104
|
+
Settings.rogue.speed.must_equal 25
|
105
|
+
Settings.rogue.power.must_equal 11
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dot_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
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: 2013-01-
|
12
|
+
date: 2013-01-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -44,9 +44,13 @@ files:
|
|
44
44
|
- lib/dot_hash.rb
|
45
45
|
- lib/dot_hash/hash_to_properties.rb
|
46
46
|
- lib/dot_hash/properties.rb
|
47
|
+
- lib/dot_hash/settings.rb
|
47
48
|
- lib/dot_hash/version.rb
|
48
49
|
- test/dot_hash/hash_to_properties_test.rb
|
49
50
|
- test/dot_hash/properties_test.rb
|
51
|
+
- test/dot_hash/settings_test.rb
|
52
|
+
- test/fixtures/configs1.yaml
|
53
|
+
- test/fixtures/configs2.yaml
|
50
54
|
- test/test_helper.rb
|
51
55
|
homepage: https://github.com/3den/dot_hash
|
52
56
|
licenses: []
|
@@ -62,7 +66,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
66
|
version: '0'
|
63
67
|
segments:
|
64
68
|
- 0
|
65
|
-
hash: -
|
69
|
+
hash: -4301238719098485564
|
66
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
71
|
none: false
|
68
72
|
requirements:
|
@@ -71,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
75
|
version: '0'
|
72
76
|
segments:
|
73
77
|
- 0
|
74
|
-
hash: -
|
78
|
+
hash: -4301238719098485564
|
75
79
|
requirements: []
|
76
80
|
rubyforge_project:
|
77
81
|
rubygems_version: 1.8.24
|
@@ -81,4 +85,7 @@ summary: Converts hash.to_properties so you can access values using properties.s
|
|
81
85
|
test_files:
|
82
86
|
- test/dot_hash/hash_to_properties_test.rb
|
83
87
|
- test/dot_hash/properties_test.rb
|
88
|
+
- test/dot_hash/settings_test.rb
|
89
|
+
- test/fixtures/configs1.yaml
|
90
|
+
- test/fixtures/configs2.yaml
|
84
91
|
- test/test_helper.rb
|