structx 0.1.2 → 0.1.3
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/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
|