structx 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -38,6 +38,20 @@ end
38
38
  B.new(1) # => #<struct B x=1, y=10, z=100>
39
39
  ```
40
40
 
41
+ You can set dynamic default values with proc object.
42
+
43
+ ```ruby
44
+ class B < StructX
45
+ member :x, default: lambda {$N}
46
+ member :y, default: lambda {|obj| $N+1}
47
+ member :z, default: lambda {|obj, data| $N+2}
48
+ end
49
+ $N = 1
50
+ B.new # => #<struct B x=1, y=2, z=3>
51
+ $N = 10
52
+ B.new # => #<struct B x=10, y=11, z=12>
53
+ ```
54
+
41
55
  ### Immutable mode
42
56
 
43
57
  ```ruby
@@ -201,6 +201,23 @@ class StructX
201
201
 
202
202
  def __build__(data)
203
203
  tbl = data.inject({}) {|tbl, (m, val)| tbl.tap {|x| x[m] = val if val}}
204
- self.class.default_values.merge(tbl)
204
+ default_values = self.class.default_values.inject({}) do |_tbl, (key, val)|
205
+ _tbl.tap {|x| x[key] = __build_default_value__(val, data)}
206
+ end
207
+ default_values.merge(tbl)
208
+ end
209
+
210
+ def __build_default_value__(val, data)
211
+ return val unless val.kind_of?(Proc)
212
+
213
+ if val.arity == 1
214
+ val.call(self)
215
+ elsif val.arity > 1
216
+ val.call(self, data)
217
+ elsif val.arity < 0
218
+ val.call(self, data)
219
+ else
220
+ val.call
221
+ end
205
222
  end
206
223
  end
@@ -1,4 +1,4 @@
1
1
  class StructX
2
2
  # version of StructX
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.2"
4
4
  end
@@ -6,6 +6,12 @@ class A < StructX
6
6
  member :z, type: Integer, default: 100
7
7
  end
8
8
 
9
+ class B < StructX
10
+ member :p0, default: lambda { $N }
11
+ member :p1, default: lambda {|obj| $N + 1}
12
+ member :p2, default: lambda {|obj, data| $N +2}
13
+ end
14
+
9
15
  describe "StructX" do
10
16
  describe "StructX.new(:x, :y, :z)" do
11
17
  before do
@@ -200,5 +206,16 @@ describe "StructX" do
200
206
  end
201
207
  end
202
208
  end
209
+
210
+ describe "B < StructX" do
211
+ it "should get default value" do
212
+ $N = 1
213
+ obj1 = B.new
214
+ $N = 10
215
+ obj2 = B.new
216
+ obj1.values.should == [1, 2, 3]
217
+ obj2.values.should == [10, 11, 12]
218
+ end
219
+ end
203
220
  end
204
221
 
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.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -146,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
146
  version: '0'
147
147
  segments:
148
148
  - 0
149
- hash: 1674864282059584366
149
+ hash: 526403309236552593
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: 1674864282059584366
158
+ hash: 526403309236552593
159
159
  requirements: []
160
160
  rubyforge_project:
161
161
  rubygems_version: 1.8.25