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 +14 -0
- data/lib/structx.rb +18 -1
- data/lib/structx/version.rb +1 -1
- data/test/spec_structx.rb +17 -0
- metadata +3 -3
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
|
data/lib/structx.rb
CHANGED
@@ -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.
|
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
|
data/lib/structx/version.rb
CHANGED
data/test/spec_structx.rb
CHANGED
@@ -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.
|
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:
|
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:
|
158
|
+
hash: 526403309236552593
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
161
|
rubygems_version: 1.8.25
|