structx 0.1.1 → 0.1.2

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/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