hashr 0.0.11 → 0.0.12
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/Gemfile.lock +1 -1
- data/README.md +20 -0
- data/lib/hashr.rb +33 -2
- data/lib/hashr/version.rb +1 -1
- data/test/hashr_test.rb +24 -0
- metadata +38 -63
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -94,6 +94,26 @@ Include modules to nested hashes like this:
|
|
94
94
|
config.boxes.count # => 3
|
95
95
|
config.boxes.names # => ["box-1", "box-2", "box-3"]
|
96
96
|
|
97
|
+
As overwriting Hash methods for method access to keys is a common pattern there's a short cut to it:
|
98
|
+
|
99
|
+
class Config < Hashr
|
100
|
+
define :_access => [:count, :key]
|
101
|
+
end
|
102
|
+
|
103
|
+
config = Config.new(:count => 3, :key => 'key')
|
104
|
+
config.count # => 3
|
105
|
+
config.key # => 'key'
|
106
|
+
|
107
|
+
Both `:_include` and `:_access` can be defined as defaults, i.e. so that they will be used on all nested hashes:
|
108
|
+
|
109
|
+
class Config < Hashr
|
110
|
+
default :_access => :key
|
111
|
+
end
|
112
|
+
|
113
|
+
config = Config.new(:key => 'key', :foo => { :key => 'foo.key' })
|
114
|
+
config.key # => 'key'
|
115
|
+
config.foo.key # => 'foo.key'
|
116
|
+
|
97
117
|
## Environment defaults
|
98
118
|
|
99
119
|
Hashr includes a simple module that makes it easy to overwrite configuration defaults from environment variables:
|
data/lib/hashr.rb
CHANGED
@@ -15,10 +15,19 @@ class Hashr < Hash
|
|
15
15
|
def definition
|
16
16
|
@definition ||= {}
|
17
17
|
end
|
18
|
+
|
19
|
+
def default(defaults)
|
20
|
+
@defaults = defaults
|
21
|
+
end
|
22
|
+
|
23
|
+
def defaults
|
24
|
+
@defaults ||= {}
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
def initialize(data = {}, definition = self.class.definition, &block)
|
21
|
-
replace(deep_hashrize(definition.deep_merge((data || {}).deep_symbolize_keys)))
|
29
|
+
replace((deep_hashrize(definition.deep_merge((data || {}).deep_symbolize_keys))))
|
30
|
+
deep_defaultize(self)
|
22
31
|
(class << self; self; end).class_eval(&block) if block_given?
|
23
32
|
end
|
24
33
|
|
@@ -46,6 +55,10 @@ class Hashr < Hash
|
|
46
55
|
Array(modules).each { |mod| meta_class.send(:include, mod) } if modules
|
47
56
|
end
|
48
57
|
|
58
|
+
def include_accessors(accessors)
|
59
|
+
Array(accessors).each { |accessor| meta_class.send(:define_method, accessor) { self[accessor] } } if accessors
|
60
|
+
end
|
61
|
+
|
49
62
|
def meta_class
|
50
63
|
class << self; self end
|
51
64
|
end
|
@@ -54,13 +67,31 @@ class Hashr < Hash
|
|
54
67
|
|
55
68
|
def deep_hashrize(hash)
|
56
69
|
hash.inject(TEMPLATE.dup) do |result, (key, value)|
|
57
|
-
|
70
|
+
case key.to_sym
|
71
|
+
when :_include
|
58
72
|
result.include_modules(value)
|
73
|
+
when :_access
|
74
|
+
result.include_accessors(value)
|
59
75
|
else
|
60
76
|
result.store(key.to_sym, value.is_a?(Hash) ? deep_hashrize(value) : value)
|
61
77
|
end
|
62
78
|
result
|
63
79
|
end
|
64
80
|
end
|
81
|
+
|
82
|
+
def deep_defaultize(hash)
|
83
|
+
self.class.defaults.each do |key, value|
|
84
|
+
case key.to_sym
|
85
|
+
when :_include
|
86
|
+
hash.include_modules(value)
|
87
|
+
when :_access
|
88
|
+
hash.include_accessors(value)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
hash.each do |key, value|
|
92
|
+
deep_defaultize(value) if value.is_a?(Hash)
|
93
|
+
end
|
94
|
+
hash
|
95
|
+
end
|
65
96
|
end
|
66
97
|
|
data/lib/hashr/version.rb
CHANGED
data/test/hashr_test.rb
CHANGED
@@ -130,6 +130,30 @@ class HashrTest < Test::Unit::TestCase
|
|
130
130
|
assert_equal 'helper', klass.new.foo.helper
|
131
131
|
end
|
132
132
|
|
133
|
+
test 'a key :_access includes an anonymous module with accessors' do
|
134
|
+
klass = Class.new(Hashr) do
|
135
|
+
define :foo => { :_access => [:key] }
|
136
|
+
end
|
137
|
+
|
138
|
+
assert_equal 'key', klass.new(:foo => { :key => 'key' }).foo.key
|
139
|
+
end
|
140
|
+
|
141
|
+
test 'all: allows to define :_include modules which will be included into all nested hashes' do
|
142
|
+
klass = Class.new(Hashr) do
|
143
|
+
default :_include => Module.new { def helper; 'helper'; end }
|
144
|
+
end
|
145
|
+
assert_equal 'helper', klass.new.helper
|
146
|
+
assert_equal 'helper', klass.new(:foo => { :bar => {} }).foo.bar.helper
|
147
|
+
end
|
148
|
+
|
149
|
+
test 'all: allows to define :_access which will include an anonymous module with accessors into all nested hashes' do
|
150
|
+
klass = Class.new(Hashr) do
|
151
|
+
default :_access => :key
|
152
|
+
end
|
153
|
+
assert_equal 'key', klass.new(:key => 'key').key
|
154
|
+
assert_equal 'key', klass.new(:foo => { :bar => { :key => 'key' } }).foo.bar.key
|
155
|
+
end
|
156
|
+
|
133
157
|
test 'anonymously overwriting core Hash methods' do
|
134
158
|
hashr = Hashr.new(:count => 5) do
|
135
159
|
def count
|
metadata
CHANGED
@@ -1,61 +1,45 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashr
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.12
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 11
|
10
|
-
version: 0.0.11
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Sven Fuchs
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-08-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rake
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70320929512120 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :development
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: test_declarative
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: *70320929512120
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: test_declarative
|
27
|
+
requirement: &70320929511400 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
hash: 27
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
- 0
|
46
|
-
- 2
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
47
32
|
version: 0.0.2
|
48
33
|
type: :development
|
49
|
-
|
50
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70320929511400
|
36
|
+
description: Simple Hash extension to make working with nested hashes (e.g. for configuration)
|
37
|
+
easier and less error-prone.
|
51
38
|
email: svenfuchs@artweb-design.de
|
52
39
|
executables: []
|
53
|
-
|
54
40
|
extensions: []
|
55
|
-
|
56
41
|
extra_rdoc_files: []
|
57
|
-
|
58
|
-
files:
|
42
|
+
files:
|
59
43
|
- lib/hashr/core_ext/ruby/hash.rb
|
60
44
|
- lib/hashr/env_defaults.rb
|
61
45
|
- lib/hashr/version.rb
|
@@ -69,36 +53,27 @@ files:
|
|
69
53
|
- README.md
|
70
54
|
homepage: http://github.com/svenfuchs/hashr
|
71
55
|
licenses: []
|
72
|
-
|
73
56
|
post_install_message:
|
74
57
|
rdoc_options: []
|
75
|
-
|
76
|
-
require_paths:
|
58
|
+
require_paths:
|
77
59
|
- lib
|
78
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
61
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
|
85
|
-
- 0
|
86
|
-
version: "0"
|
87
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
67
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
segments:
|
94
|
-
- 0
|
95
|
-
version: "0"
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
96
72
|
requirements: []
|
97
|
-
|
98
|
-
rubyforge_project: "[none]"
|
73
|
+
rubyforge_project: ! '[none]'
|
99
74
|
rubygems_version: 1.8.6
|
100
75
|
signing_key:
|
101
76
|
specification_version: 3
|
102
|
-
summary: Simple Hash extension to make working with nested hashes (e.g. for configuration)
|
77
|
+
summary: Simple Hash extension to make working with nested hashes (e.g. for configuration)
|
78
|
+
easier and less error-prone
|
103
79
|
test_files: []
|
104
|
-
|