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.
@@ -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