model_pack 0.9.1 → 0.9.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.
- checksums.yaml +4 -4
- data/README.md +8 -8
- data/lib/model_pack/attribute_methods.rb +2 -2
- data/lib/model_pack/class_methods.rb +12 -5
- data/lib/model_pack/constructor.rb +1 -1
- data/lib/model_pack/serialization.rb +2 -1
- data/lib/model_pack/version.rb +1 -1
- data/spec/model_pack_spec.rb +96 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dabb01b01889b40d35d86225715aa392b26c9998
|
4
|
+
data.tar.gz: 85c4e83fb4e2fc2af86d31f864c0277e04d0db54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf57987290bb914c78f5cfa6d62bb00ebc26f2676cace86713feba5d9ef2a2504a8a2803558e4f1811550daadd9b6c461286aeb49d86c185c98e434e934fabb3
|
7
|
+
data.tar.gz: 7f587c452db113574c71c11612781e0001c1db57f8e0387ade3d3677d3754ce0b10d34a6d57473453d63da0ae82901579af5c12d8326d9ea5f9148162376d98c
|
data/README.md
CHANGED
@@ -60,9 +60,9 @@ puts line.length
|
|
60
60
|
```ruby
|
61
61
|
class Polygon
|
62
62
|
include ModelPack::Document
|
63
|
-
|
63
|
+
|
64
64
|
array :points, class_name: Point
|
65
|
-
|
65
|
+
|
66
66
|
def sides
|
67
67
|
return [] if points.size < 2
|
68
68
|
[[points.first]].tap do |sides|
|
@@ -73,7 +73,7 @@ class Polygon
|
|
73
73
|
sides.last.push(points.first)
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
def perimeter
|
78
78
|
sides.inject(0) { |sum, side| sum + Math.sqrt((side[0].x-side[1].x)**2 + (side[0].y-side[1].y)**2) }
|
79
79
|
end
|
@@ -86,7 +86,7 @@ puts polygon.perimeter
|
|
86
86
|
|
87
87
|
```ruby
|
88
88
|
polygon = Polygon.new(points: [{x: 0, y: 0}, {x:5, y:0}, {x:5, y:5}])
|
89
|
-
json = polygon.as_json
|
89
|
+
json = polygon.as_json # same serializable_hash
|
90
90
|
```
|
91
91
|
|
92
92
|
### Копирование моделей
|
@@ -94,7 +94,7 @@ json = polygon.as_json() # same serializable_hash
|
|
94
94
|
```ruby
|
95
95
|
polygon = Polygon.new(points: [{x: 3, y: 3}, {x:2, y:1}, {x:4, y:2}])
|
96
96
|
polygon_copy = polygon.copy # same polygon_copy = Polygon.new(polygon.serializable_hash)
|
97
|
-
puts polygon_copy
|
97
|
+
puts polygon_copy.serializable_hash
|
98
98
|
```
|
99
99
|
|
100
100
|
### Выборочная сериализация
|
@@ -102,9 +102,9 @@ puts polygon_copy
|
|
102
102
|
```ruby
|
103
103
|
class SecureData
|
104
104
|
include ModelPack::Document
|
105
|
-
attribute :hidden_field,
|
106
|
-
attribute :const_field,
|
107
|
-
attribute :always_string,
|
105
|
+
attribute :hidden_field, serialize: lambda { |v| nil }
|
106
|
+
attribute :const_field, serialize: lambda { |v| :always_this }
|
107
|
+
attribute :always_string, serialize: lambda { |v| v.to_s }
|
108
108
|
end
|
109
109
|
secure_data = SecureData.new( hidden_field: "secured text", const_field: :some_value, always_string: 55)
|
110
110
|
unsecure_hash = secure_data.serializable_hash
|
@@ -18,14 +18,14 @@ module ModelPack
|
|
18
18
|
self.class.attribute_names.inject({}) { |h, name| h[name] = send(name); h }
|
19
19
|
end
|
20
20
|
|
21
|
-
def update_attributes(
|
21
|
+
def update_attributes(attributes)
|
22
22
|
attributes.each do |name, attribute|
|
23
23
|
key = "#{name}="
|
24
24
|
send(key, attribute) if respond_to?(key)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
def update_attributes!(
|
28
|
+
def update_attributes!(attributes)
|
29
29
|
# check present first
|
30
30
|
attributes.each do |name, attribute|
|
31
31
|
raise ArgumentError, "undefined attribute `#{name}`" unless attribute_names.include?(method)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module ModelPack
|
2
2
|
module ClassMethods
|
3
3
|
|
4
|
-
def attribute(name, writer: lambda { |v| v }, default: nil, as: nil, serialize: nil)
|
5
|
-
attribute_reader(name, default: default, as: as, serialize: serialize)
|
4
|
+
def attribute(name, writer: lambda { |v| v }, default: nil, as: nil, serialize: nil, predicate: nil)
|
5
|
+
attribute_reader(name, default: default, as: as, serialize: serialize, predicate: predicate)
|
6
6
|
attribute_writer(name, writer: writer)
|
7
7
|
register_attribute(name)
|
8
8
|
end
|
@@ -13,7 +13,7 @@ module ModelPack
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def attribute_reader(name, default: nil, as: nil, serialize: nil)
|
16
|
+
def attribute_reader(name, default: nil, as: nil, serialize: nil, predicate: nil)
|
17
17
|
default_dup = default.dup rescue default
|
18
18
|
default_value = default_dup || (as && as.new)
|
19
19
|
|
@@ -21,6 +21,12 @@ module ModelPack
|
|
21
21
|
instance_variable_defined?("@#{name}") ? instance_variable_get("@#{name}") : instance_variable_set("@#{name}", default_value)
|
22
22
|
end
|
23
23
|
|
24
|
+
# define predicate method if required
|
25
|
+
define_method "#{name}?" do
|
26
|
+
value = (instance_variable_defined?("@#{name}") ? instance_variable_get("@#{name}") : instance_variable_set("@#{name}", default_value))
|
27
|
+
predicate.is_a?(Proc) ? predicate.call(value) : !!value # false for nil or false
|
28
|
+
end if predicate
|
29
|
+
|
24
30
|
define_method "#{name}_hash" do
|
25
31
|
instance_exec(send(name), &serialize)
|
26
32
|
end if serialize
|
@@ -38,13 +44,14 @@ module ModelPack
|
|
38
44
|
default: default,
|
39
45
|
serialize: serialize,
|
40
46
|
as: Array,
|
41
|
-
writer: writer || lambda { |array| array.collect { |v| v.is_a?(Hash) && class_name ? class_name.new(v) : v } })
|
47
|
+
writer: writer || lambda { |array| array.is_a?(Array) ? (array.collect { |v| v.is_a?(Hash) && class_name ? class_name.new(v) : v }) : [] })
|
42
48
|
end
|
43
49
|
|
44
|
-
def
|
50
|
+
def dictionary(name, class_name: nil, default: nil, serialize: nil, writer: nil)
|
45
51
|
attribute(name,
|
46
52
|
default: default,
|
47
53
|
serialize: serialize,
|
54
|
+
writer: writer || lambda { |dictionary| Hash[dictionary.map { |k,v| [k, v.is_a?(Hash) && class_name ? class_name.new(v) : v]}] },
|
48
55
|
as: Hash)
|
49
56
|
end
|
50
57
|
end
|
data/lib/model_pack/version.rb
CHANGED
data/spec/model_pack_spec.rb
CHANGED
@@ -23,6 +23,13 @@ describe ModelPack::ClassMethods do
|
|
23
23
|
expect(point.attributes).to include({x: 3, y: 5})
|
24
24
|
end
|
25
25
|
|
26
|
+
it "should update_attributes change values" do
|
27
|
+
point = Point.new(x: 4, y: 6)
|
28
|
+
point.update_attributes(x:3, y:2)
|
29
|
+
expect(point.x).to be(3)
|
30
|
+
expect(point.y).to be(2)
|
31
|
+
end
|
32
|
+
|
26
33
|
it "should create embedded models" do
|
27
34
|
class Line
|
28
35
|
include ModelPack::Document
|
@@ -115,25 +122,111 @@ describe ModelPack::ClassMethods do
|
|
115
122
|
end
|
116
123
|
end
|
117
124
|
|
118
|
-
it "should model have
|
125
|
+
it "should model have nary field" do
|
119
126
|
class Options
|
120
127
|
include ModelPack::Document
|
121
128
|
|
122
|
-
|
129
|
+
dictionary :options
|
130
|
+
dictionary :points, class_name: Point
|
123
131
|
|
124
132
|
def method_missing(name, *a)
|
125
133
|
options[name]
|
126
134
|
end
|
127
135
|
end
|
128
136
|
|
129
|
-
options = Options.new(
|
137
|
+
options = Options.new(
|
138
|
+
options: { a: 5, b: 6 },
|
139
|
+
points: {
|
140
|
+
"a" => {x:0, y:1},
|
141
|
+
"b" => {x:1, y:3},
|
142
|
+
"c" => {x:3, y:2}
|
143
|
+
}
|
144
|
+
)
|
130
145
|
|
131
146
|
expect(options.a).to be(5)
|
132
147
|
expect(options.b).to be(6)
|
148
|
+
expect(options.points['a'].x).to be(0)
|
149
|
+
expect(options.points['b'].y).to be(3)
|
150
|
+
expect(options.points['c'].y).to be(2)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should initizalize with string attributes" do
|
154
|
+
point = Point.new({"x" => 3, "y" => 5})
|
155
|
+
expect(point.x).to be(3)
|
156
|
+
expect(point.y).to be(5)
|
157
|
+
expect(point.attributes).to include({x: 3, y: 5})
|
133
158
|
end
|
134
159
|
|
135
160
|
it "should serialize model with custom serializer" do
|
161
|
+
class IntData
|
162
|
+
include ModelPack::Document
|
163
|
+
attribute :integer, serialize: lambda { |v| 5 }
|
164
|
+
end
|
165
|
+
|
166
|
+
int_data = IntData.new(integer: 13)
|
167
|
+
expect(int_data.serializable_hash[:integer]).to be(5)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should have initialize" do
|
171
|
+
class StringBuffer
|
172
|
+
include ModelPack::Document
|
173
|
+
|
174
|
+
attribute :buffer, default: ''
|
175
|
+
attribute :position
|
176
|
+
|
177
|
+
def initialize
|
178
|
+
@position = buffer.size
|
179
|
+
end
|
180
|
+
end
|
136
181
|
|
182
|
+
buffer = StringBuffer.new(buffer: 'Lorem Ipsum')
|
183
|
+
expect(buffer.position).to be(11)
|
137
184
|
end
|
138
185
|
|
186
|
+
it "should have peredicate method" do
|
187
|
+
class OptionsWithPredicate
|
188
|
+
include ModelPack::Document
|
189
|
+
|
190
|
+
attribute :save, predicate: true
|
191
|
+
attribute :load, predicate: lambda { |v| !!v ? 'YES' : 'NO' }
|
192
|
+
end
|
193
|
+
|
194
|
+
owp = OptionsWithPredicate.new(
|
195
|
+
save: true,
|
196
|
+
load: true
|
197
|
+
)
|
198
|
+
expect(owp.save?).to be true
|
199
|
+
expect(owp.load?).to eq('YES')
|
200
|
+
|
201
|
+
owp = OptionsWithPredicate.new(
|
202
|
+
save: false,
|
203
|
+
load: false
|
204
|
+
)
|
205
|
+
expect(owp.save?).to be false
|
206
|
+
expect(owp.load?).to eq('NO')
|
207
|
+
|
208
|
+
owp = OptionsWithPredicate.new
|
209
|
+
|
210
|
+
expect(owp.save?).to be false
|
211
|
+
expect(owp.load?).to eq('NO')
|
212
|
+
end
|
213
|
+
|
214
|
+
|
215
|
+
it "should boolean type works well" do
|
216
|
+
class BooleanData
|
217
|
+
include ModelPack::Document
|
218
|
+
|
219
|
+
attribute :bit
|
220
|
+
end
|
221
|
+
|
222
|
+
true_data = BooleanData.new(bit: true)
|
223
|
+
false_data = BooleanData.new(bit: false)
|
224
|
+
copy_true_data = true_data.copy
|
225
|
+
copy_false_data = false_data.copy
|
226
|
+
|
227
|
+
expect(true_data.serializable_hash[:bit]).to be true
|
228
|
+
expect(false_data.serializable_hash[:bit]).to be false
|
229
|
+
expect(copy_true_data.serializable_hash[:bit]).to be true
|
230
|
+
expect(copy_false_data.serializable_hash[:bit]).to be false
|
231
|
+
end
|
139
232
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: model_pack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- che
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|