dot_hash 0.3.2 → 0.3.4
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/lib/dot_hash/hash_loader.rb +51 -0
- data/lib/dot_hash/properties.rb +8 -2
- data/lib/dot_hash/settings.rb +2 -43
- data/lib/dot_hash/version.rb +1 -1
- data/lib/dot_hash.rb +1 -0
- data/test/dot_hash/hash_loader_test.rb +53 -0
- data/test/dot_hash/hash_to_properties_test.rb +1 -1
- data/test/dot_hash/properties_test.rb +17 -2
- data/test/dot_hash/settings_test.rb +1 -1
- data/test/test_helper.rb +2 -1
- metadata +7 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module DotHash
|
|
2
|
+
class HashLoader
|
|
3
|
+
attr_reader :hashes
|
|
4
|
+
|
|
5
|
+
def initialize *hashes
|
|
6
|
+
@hashes = hashes
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def load
|
|
10
|
+
hashes.inject({}) do |hash, arg|
|
|
11
|
+
merge_hashes hash, get_hash_from(arg)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def merge_hashes(h1, h2)
|
|
16
|
+
return h1 unless h2
|
|
17
|
+
return h2 unless h1
|
|
18
|
+
|
|
19
|
+
h2.each do |key, value|
|
|
20
|
+
h1[key] = value.is_a?(Hash) ?
|
|
21
|
+
merge_hashes(h1[key], value) : value
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
h1
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def get_hash_from arg
|
|
30
|
+
if arg.is_a? Hash
|
|
31
|
+
arg
|
|
32
|
+
elsif File.file? arg
|
|
33
|
+
get_hash_from_file arg
|
|
34
|
+
elsif File.directory? arg
|
|
35
|
+
get_hash_from_directory arg
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get_hash_from_file(file)
|
|
40
|
+
return {} unless file =~ /\.(yaml|yml)$/
|
|
41
|
+
YAML.load_file(file)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def get_hash_from_directory(directory)
|
|
45
|
+
Dir["#{directory}/**/*"].inject({}) do |hash, file|
|
|
46
|
+
merge_hashes hash, get_hash_from_file(file)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
data/lib/dot_hash/properties.rb
CHANGED
|
@@ -8,15 +8,21 @@ module DotHash
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def method_missing(key, *args, &block)
|
|
11
|
-
has_key?(key)
|
|
12
|
-
execute(key, *args, &block)
|
|
11
|
+
if has_key?(key)
|
|
12
|
+
execute(key, *args, &block)
|
|
13
|
+
else
|
|
13
14
|
super(key, *args, &block)
|
|
15
|
+
end
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
def respond_to?(key)
|
|
17
19
|
has_key?(key) or super(key)
|
|
18
20
|
end
|
|
19
21
|
|
|
22
|
+
def to_s
|
|
23
|
+
hash.to_s
|
|
24
|
+
end
|
|
25
|
+
|
|
20
26
|
def [](key)
|
|
21
27
|
get_value(key)
|
|
22
28
|
end
|
data/lib/dot_hash/settings.rb
CHANGED
|
@@ -22,52 +22,11 @@ module DotHash
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def respond_to?(key)
|
|
25
|
-
instance.respond_to?(key)
|
|
25
|
+
super(key) || instance.respond_to?(key)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def load(*args)
|
|
29
|
-
@instance = new
|
|
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
|
|
29
|
+
@instance = new HashLoader.new(*args).load
|
|
71
30
|
end
|
|
72
31
|
end
|
|
73
32
|
end
|
data/lib/dot_hash/version.rb
CHANGED
data/lib/dot_hash.rb
CHANGED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require_relative "../test_helper"
|
|
2
|
+
|
|
3
|
+
module DotHash
|
|
4
|
+
describe HashLoader do
|
|
5
|
+
|
|
6
|
+
describe "#load" do
|
|
7
|
+
it "merges the given hashes" do
|
|
8
|
+
loader = HashLoader.new(
|
|
9
|
+
{a: 1, b: {c: 2}},
|
|
10
|
+
{b: {x: {z: 10}}}
|
|
11
|
+
)
|
|
12
|
+
loader.load.must_equal({a: 1, b: {c: 2, x: {z: 10}}})
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "loads from a file" do
|
|
16
|
+
loader = HashLoader.new fixtures_path("configs1.yaml")
|
|
17
|
+
|
|
18
|
+
loader.load.must_equal({
|
|
19
|
+
"default" => {"attr" => {"speed"=>10, "power"=>11}},
|
|
20
|
+
"rogue" => {"attr" => {"speed"=>20, "power"=>11}}
|
|
21
|
+
})
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "loads from two files" do
|
|
25
|
+
loader = HashLoader.new(
|
|
26
|
+
fixtures_path("configs1.yaml"),
|
|
27
|
+
fixtures_path("configs2.yaml")
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
loader.load.must_equal({
|
|
31
|
+
"default"=>{"attr"=>{"speed"=>10, "power"=>11}},
|
|
32
|
+
"rogue"=>{"attr"=>{"speed"=>25, "power"=>11}}
|
|
33
|
+
})
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "does not load files without the yaml extension" do
|
|
37
|
+
loader = HashLoader.new fixtures_path("config.yaml.example")
|
|
38
|
+
|
|
39
|
+
loader.load.must_equal({})
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "loads from a directory" do
|
|
43
|
+
loader = HashLoader.new fixtures_path
|
|
44
|
+
|
|
45
|
+
loader.load.must_equal({
|
|
46
|
+
"default"=>{"attr"=>{"speed"=>10, "power"=>11}},
|
|
47
|
+
"rogue"=>{"attr"=>{"speed"=>25, "power"=>11}}
|
|
48
|
+
})
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "../test_helper"
|
|
2
2
|
|
|
3
3
|
module DotHash
|
|
4
4
|
describe Properties do
|
|
@@ -15,7 +15,9 @@ module DotHash
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
it "raises an error if the method is not on the hash" do
|
|
18
|
-
-> {
|
|
18
|
+
-> {
|
|
19
|
+
properties.name
|
|
20
|
+
}.must_raise NoMethodError, "undefined method `name' for {:speed=>\"15\", \"power\"=>100}:DotHash::Properties"
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
it "gets a property from a stringed key" do
|
|
@@ -75,6 +77,19 @@ module DotHash
|
|
|
75
77
|
end
|
|
76
78
|
end
|
|
77
79
|
|
|
80
|
+
describe "#to_s" do
|
|
81
|
+
attr_reader :hash
|
|
82
|
+
|
|
83
|
+
before do
|
|
84
|
+
@hash = { user: {name: "dude"} }
|
|
85
|
+
@properties = Properties.new @hash
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "returns the hash as a string" do
|
|
89
|
+
properties.to_s.must_equal hash.to_s
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
78
93
|
describe "#respond_to?" do
|
|
79
94
|
before do
|
|
80
95
|
@properties = Properties.new speed: "15",
|
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.3.
|
|
4
|
+
version: 0.3.4
|
|
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-
|
|
12
|
+
date: 2013-04-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rake
|
|
@@ -42,10 +42,12 @@ files:
|
|
|
42
42
|
- Rakefile
|
|
43
43
|
- dot_hash.gemspec
|
|
44
44
|
- lib/dot_hash.rb
|
|
45
|
+
- lib/dot_hash/hash_loader.rb
|
|
45
46
|
- lib/dot_hash/hash_to_properties.rb
|
|
46
47
|
- lib/dot_hash/properties.rb
|
|
47
48
|
- lib/dot_hash/settings.rb
|
|
48
49
|
- lib/dot_hash/version.rb
|
|
50
|
+
- test/dot_hash/hash_loader_test.rb
|
|
49
51
|
- test/dot_hash/hash_to_properties_test.rb
|
|
50
52
|
- test/dot_hash/properties_test.rb
|
|
51
53
|
- test/dot_hash/settings_test.rb
|
|
@@ -67,7 +69,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
67
69
|
version: '0'
|
|
68
70
|
segments:
|
|
69
71
|
- 0
|
|
70
|
-
hash: -
|
|
72
|
+
hash: -817138279000566861
|
|
71
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
74
|
none: false
|
|
73
75
|
requirements:
|
|
@@ -76,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
76
78
|
version: '0'
|
|
77
79
|
segments:
|
|
78
80
|
- 0
|
|
79
|
-
hash: -
|
|
81
|
+
hash: -817138279000566861
|
|
80
82
|
requirements: []
|
|
81
83
|
rubyforge_project:
|
|
82
84
|
rubygems_version: 1.8.24
|
|
@@ -84,6 +86,7 @@ signing_key:
|
|
|
84
86
|
specification_version: 3
|
|
85
87
|
summary: Converts hash.to_properties so you can access values using properties.some_key
|
|
86
88
|
test_files:
|
|
89
|
+
- test/dot_hash/hash_loader_test.rb
|
|
87
90
|
- test/dot_hash/hash_to_properties_test.rb
|
|
88
91
|
- test/dot_hash/properties_test.rb
|
|
89
92
|
- test/dot_hash/settings_test.rb
|