structx 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/structx.rb +10 -9
- data/lib/structx/version.rb +1 -1
- data/test/spec_structx.rb +11 -0
- metadata +4 -4
data/lib/structx.rb
CHANGED
@@ -40,7 +40,7 @@ class StructX
|
|
40
40
|
# Same as Struct if args is Array. Consider args as key-value pairs if it is Hash.
|
41
41
|
def new(*args)
|
42
42
|
# create an instance
|
43
|
-
return orig_new(*args) if @
|
43
|
+
return orig_new(*args) if @__member__ and @__member__.keys.size > 0
|
44
44
|
|
45
45
|
# create subclass
|
46
46
|
Class.new(StructX).tap do |subclass|
|
@@ -60,7 +60,7 @@ class StructX
|
|
60
60
|
|
61
61
|
# Same as Struct#members.
|
62
62
|
def members
|
63
|
-
(@
|
63
|
+
(@__member__ ||= {}).keys
|
64
64
|
end
|
65
65
|
|
66
66
|
# Add member into structure.
|
@@ -70,7 +70,7 @@ class StructX
|
|
70
70
|
# @param data [Hash]
|
71
71
|
# member options
|
72
72
|
def member(name, data={})
|
73
|
-
(@
|
73
|
+
(@__member__ ||= {})[name] = Hash.new.merge(data) # clone the data
|
74
74
|
|
75
75
|
# define member's value reader
|
76
76
|
define_method(name) do
|
@@ -88,7 +88,7 @@ class StructX
|
|
88
88
|
# @return [Hash{Symbol=>Object}]
|
89
89
|
# default values
|
90
90
|
def default_values
|
91
|
-
@
|
91
|
+
@__member__.inject({}) do |tbl, (key, val)|
|
92
92
|
tbl.tap {|x| x[key] = val[:default] if val.has_key?(:default)}
|
93
93
|
end
|
94
94
|
end
|
@@ -104,7 +104,7 @@ class StructX
|
|
104
104
|
private
|
105
105
|
|
106
106
|
def inherited(subclass)
|
107
|
-
@
|
107
|
+
@__member__.each {|key, data| subclass.member(key, data)} if @__member__
|
108
108
|
subclass.instance_variable_set(:@immutable, true) if @immutable
|
109
109
|
end
|
110
110
|
end
|
@@ -169,7 +169,8 @@ class StructX
|
|
169
169
|
# Same as #[]=, but you can set values by hash.
|
170
170
|
def set(pairs={})
|
171
171
|
if not(immutable?)
|
172
|
-
pairs.each {|idx, val|
|
172
|
+
pairs.each {|idx, val| self[idx] = val}
|
173
|
+
return self
|
173
174
|
else
|
174
175
|
pairs.inject(self) {|obj, (idx, val)| obj.send("[]=", idx, val)}
|
175
176
|
end
|
@@ -178,9 +179,9 @@ class StructX
|
|
178
179
|
# Same as Struct#inspect.
|
179
180
|
def inspect
|
180
181
|
name = self.class.inspect[0] == "#" ? "" : " " + self.class.inspect
|
181
|
-
values = @value.map do |key, val|
|
182
|
+
values = (@value || []).map do |key, val|
|
182
183
|
k = (key.to_s[0] == "@" ? ":" : "") + key.to_s
|
183
|
-
v = self == val ? "#<struct %s:...>" % val : val.inspect
|
184
|
+
v = (self == val ? "#<struct %s:...>" % val : val.inspect)
|
184
185
|
"%s=%s" % [k, v]
|
185
186
|
end
|
186
187
|
"#<struct%s %s>" % [name, values.join(", ")]
|
@@ -200,7 +201,7 @@ class StructX
|
|
200
201
|
private
|
201
202
|
|
202
203
|
def __build__(data)
|
203
|
-
tbl = data.inject({}) {|tbl, (m, val)| tbl.tap {|x| x[m] = val
|
204
|
+
tbl = data.inject({}) {|tbl, (m, val)| tbl.tap {|x| x[m] = val unless val.nil?}}
|
204
205
|
default_values = self.class.default_values.inject({}) do |_tbl, (key, val)|
|
205
206
|
_tbl.tap {|x| x[key] = __build_default_value__(val, data)}
|
206
207
|
end
|
data/lib/structx/version.rb
CHANGED
data/test/spec_structx.rb
CHANGED
@@ -39,6 +39,9 @@ describe "StructX" do
|
|
39
39
|
obj.y.should == 2
|
40
40
|
obj.z.should == 3
|
41
41
|
end
|
42
|
+
@class.new(true, false, nil).tap do |obj|
|
43
|
+
obj.values.should == [true, false]
|
44
|
+
end
|
42
45
|
end
|
43
46
|
|
44
47
|
it "should create an instance with key" do
|
@@ -122,10 +125,18 @@ describe "StructX" do
|
|
122
125
|
x[:z].should == 5
|
123
126
|
should.raise(NameError) { x[:a] = 1}
|
124
127
|
end
|
128
|
+
# test for #set
|
129
|
+
@class.new(1, 2, 3).tap do |x|
|
130
|
+
x.set(x: 4, y: 5, z: 6)
|
131
|
+
x.values.should == [4, 5, 6]
|
132
|
+
end
|
133
|
+
|
125
134
|
# immutable tests
|
126
135
|
orig = @immutable.new(1, 2, 3)
|
136
|
+
orig.should.kind_of StructX
|
127
137
|
orig.values.should == [1, 2, 3]
|
128
138
|
updated = orig.set(x: 4, y: 5, z: 6)
|
139
|
+
updated.should.kind_of StructX
|
129
140
|
updated.values.should == [4, 5, 6]
|
130
141
|
orig.values.should == [1, 2, 3]
|
131
142
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: structx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
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-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: forwardablex
|
@@ -146,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
segments:
|
148
148
|
- 0
|
149
|
-
hash:
|
149
|
+
hash: 3356708163444557198
|
150
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
151
|
none: false
|
152
152
|
requirements:
|
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
version: '0'
|
156
156
|
segments:
|
157
157
|
- 0
|
158
|
-
hash:
|
158
|
+
hash: 3356708163444557198
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
161
|
rubygems_version: 1.8.25
|