structure 0.20.1 → 0.21.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/.travis.yml +0 -3
- data/lib/structure.rb +48 -5
- data/lib/structure/{active_support.rb → ext/active_support.rb} +0 -0
- data/lib/structure/version.rb +1 -1
- data/test/structure_test.rb +19 -1
- metadata +5 -5
data/.travis.yml
CHANGED
data/lib/structure.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'forwardable'
|
2
1
|
begin
|
3
2
|
JSON::JSON_LOADED
|
4
3
|
rescue NameError
|
@@ -13,7 +12,6 @@ end
|
|
13
12
|
# end
|
14
13
|
#
|
15
14
|
class Structure
|
16
|
-
extend Forwardable
|
17
15
|
include Enumerable
|
18
16
|
|
19
17
|
# A namespaced basic object.
|
@@ -102,6 +100,29 @@ class Structure
|
|
102
100
|
key name, Array, []
|
103
101
|
end
|
104
102
|
|
103
|
+
alias_method :new_original, :new
|
104
|
+
|
105
|
+
def new(hsh)
|
106
|
+
hsh = hsh.inject({}) do |a, (k, v)|
|
107
|
+
a[Inflector.underscore(k)] =
|
108
|
+
case v
|
109
|
+
when Hash
|
110
|
+
Structure.new(v)
|
111
|
+
when Array
|
112
|
+
v.map { |e| e.is_a?(Hash) ? Structure.new(e) : e }
|
113
|
+
else
|
114
|
+
v
|
115
|
+
end
|
116
|
+
a
|
117
|
+
end
|
118
|
+
|
119
|
+
klass = Class.new(Structure) do
|
120
|
+
hsh.keys.each { |k| key k }
|
121
|
+
end
|
122
|
+
|
123
|
+
klass.new(hsh)
|
124
|
+
end
|
125
|
+
|
105
126
|
# Lazy-eval undefined constants, typically other structures,
|
106
127
|
# assuming they will be defined later in the text.
|
107
128
|
def const_missing(name)
|
@@ -109,7 +130,9 @@ class Structure
|
|
109
130
|
end; private :const_missing
|
110
131
|
|
111
132
|
def inherited(child)
|
112
|
-
|
133
|
+
if self.eql? Structure
|
134
|
+
class << child; alias_method :new, :new_original; end
|
135
|
+
end
|
113
136
|
end; private :inherited
|
114
137
|
end
|
115
138
|
|
@@ -118,7 +141,7 @@ class Structure
|
|
118
141
|
# A hash, if provided, seeds the attributes.
|
119
142
|
def initialize(hsh = {})
|
120
143
|
@attributes = defaults.inject({}) do |a, (k, v)|
|
121
|
-
a[k] = v.
|
144
|
+
a[k] = v.dup rescue v
|
122
145
|
a
|
123
146
|
end
|
124
147
|
|
@@ -163,6 +186,26 @@ class Structure
|
|
163
186
|
def ==(other)
|
164
187
|
other.is_a?(self.class) && attributes == other.attributes
|
165
188
|
end
|
189
|
+
|
190
|
+
def defaults
|
191
|
+
self.class.defaults
|
192
|
+
end; private :defaults
|
193
|
+
|
194
|
+
module Inflector
|
195
|
+
# Makes an underscored, lowercase form from the expression in the
|
196
|
+
# string.
|
197
|
+
#
|
198
|
+
# You know where this is lifted from.
|
199
|
+
def self.underscore(camel_cased_word)
|
200
|
+
word = camel_cased_word.to_s.dup
|
201
|
+
word.gsub!(/::/, '/')
|
202
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
203
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
204
|
+
word.tr!("-", "_")
|
205
|
+
word.downcase!
|
206
|
+
word
|
207
|
+
end
|
208
|
+
end
|
166
209
|
end
|
167
210
|
|
168
|
-
require 'structure/active_support' if defined?(Rails)
|
211
|
+
require 'structure/ext/active_support' if defined?(Rails)
|
File without changes
|
data/lib/structure/version.rb
CHANGED
data/test/structure_test.rb
CHANGED
@@ -26,6 +26,24 @@ class TestStructure < Test::Unit::TestCase
|
|
26
26
|
assert_kind_of Fixnum, double
|
27
27
|
end
|
28
28
|
|
29
|
+
def test_anonymous
|
30
|
+
hsh = { 'FirstName' => 'John', 'LastName' => 'Doe' }
|
31
|
+
str = Structure.new(hsh)
|
32
|
+
assert_equal hsh['FirstName'], str.first_name
|
33
|
+
assert_equal hsh['LastName'], str.last_name
|
34
|
+
assert_raise(NoMethodError) { str.FirstName }
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_anonymous_recursion
|
38
|
+
hsh = { 'Name' => 'John',
|
39
|
+
'Address' => { 'City' => 'Oslo' },
|
40
|
+
'Friends' => [{ 'Name' => 'Jane' }]
|
41
|
+
}
|
42
|
+
str = Structure.new(hsh)
|
43
|
+
assert_equal hsh['Address']['City'], str.address.city
|
44
|
+
assert_equal hsh['Friends'].first['Name'], str.friends.first.name
|
45
|
+
end
|
46
|
+
|
29
47
|
def test_enumeration
|
30
48
|
assert_respond_to Person.new, :map
|
31
49
|
end
|
@@ -80,7 +98,7 @@ class TestStructure < Test::Unit::TestCase
|
|
80
98
|
|
81
99
|
require 'active_support/ordered_hash'
|
82
100
|
require 'active_support/json'
|
83
|
-
require 'structure/active_support'
|
101
|
+
require 'structure/ext/active_support'
|
84
102
|
|
85
103
|
assert_equal true, person.as_json(:only => :name).has_key?(:name)
|
86
104
|
assert_equal false, person.as_json(:except => :name).has_key?(:name)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: structure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.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: 2011-09-
|
12
|
+
date: 2011-09-10 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: Structure is a typed, nestable key/value container.
|
15
15
|
email:
|
@@ -25,7 +25,7 @@ files:
|
|
25
25
|
- README.md
|
26
26
|
- Rakefile
|
27
27
|
- lib/structure.rb
|
28
|
-
- lib/structure/active_support.rb
|
28
|
+
- lib/structure/ext/active_support.rb
|
29
29
|
- lib/structure/version.rb
|
30
30
|
- structure.gemspec
|
31
31
|
- test/structure_test.rb
|
@@ -43,7 +43,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
43
43
|
version: '0'
|
44
44
|
segments:
|
45
45
|
- 0
|
46
|
-
hash: -
|
46
|
+
hash: -3352714224337607479
|
47
47
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
48
|
none: false
|
49
49
|
requirements:
|
@@ -52,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
52
|
version: '0'
|
53
53
|
segments:
|
54
54
|
- 0
|
55
|
-
hash: -
|
55
|
+
hash: -3352714224337607479
|
56
56
|
requirements: []
|
57
57
|
rubyforge_project: structure
|
58
58
|
rubygems_version: 1.8.6
|