structx 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 @member
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
- (@member ||= {}).keys
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
- (@member ||= {})[name] = Hash.new.merge(data)
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
- @member.inject({}) do |tbl, (key, val)|
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
- @member.each {|key, data| subclass.member(key, data)} if @member
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| obj[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 if 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
@@ -1,4 +1,4 @@
1
1
  class StructX
2
2
  # version of StructX
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.3"
4
4
  end
@@ -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.2
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-07-28 00:00:00.000000000 Z
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: 526403309236552593
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: 526403309236552593
158
+ hash: 3356708163444557198
159
159
  requirements: []
160
160
  rubyforge_project:
161
161
  rubygems_version: 1.8.25