toystore 0.8.3 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -2
- data/Changelog.md +9 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +71 -0
- data/Guardfile +15 -0
- data/README.md +28 -0
- data/examples/attributes_abbreviation.rb +1 -2
- data/examples/attributes_virtual.rb +1 -2
- data/examples/identity_map.rb +7 -12
- data/examples/memcached.rb +1 -1
- data/examples/memory.rb +1 -1
- data/examples/mongo.rb +1 -1
- data/examples/redis.rb +1 -1
- data/examples/riak.rb +1 -1
- data/lib/toy.rb +40 -39
- data/lib/toy/attribute.rb +1 -6
- data/lib/toy/attributes.rb +61 -90
- data/lib/toy/caching.rb +11 -13
- data/lib/toy/callbacks.rb +12 -31
- data/lib/toy/cloneable.rb +20 -0
- data/lib/toy/collection.rb +8 -7
- data/lib/toy/dirty.rb +17 -36
- data/lib/toy/dirty_store.rb +32 -0
- data/lib/toy/equality.rb +2 -0
- data/lib/toy/extensions/boolean.rb +22 -18
- data/lib/toy/identity_map.rb +39 -62
- data/lib/toy/list.rb +23 -22
- data/lib/toy/logger.rb +2 -17
- data/lib/toy/mass_assignment_security.rb +3 -5
- data/lib/toy/middleware/identity_map.rb +23 -4
- data/lib/toy/object.rb +16 -0
- data/lib/toy/persistence.rb +72 -62
- data/lib/toy/proxies/list.rb +19 -18
- data/lib/toy/proxies/proxy.rb +7 -6
- data/lib/toy/querying.rb +2 -4
- data/lib/toy/reference.rb +28 -26
- data/lib/toy/reloadable.rb +17 -0
- data/lib/toy/serialization.rb +25 -25
- data/lib/toy/store.rb +3 -11
- data/lib/toy/validations.rb +9 -28
- data/lib/toy/version.rb +1 -1
- data/perf/reads.rb +7 -9
- data/perf/writes.rb +6 -8
- data/spec/helper.rb +3 -1
- data/spec/support/constants.rb +1 -4
- data/spec/support/identity_map_matcher.rb +5 -5
- data/spec/support/objects.rb +38 -0
- data/spec/toy/attribute_spec.rb +1 -1
- data/spec/toy/attributes_spec.rb +1 -153
- data/spec/toy/callbacks_spec.rb +1 -45
- data/spec/toy/cloneable_spec.rb +47 -0
- data/spec/toy/dirty_spec.rb +12 -44
- data/spec/toy/dirty_store_spec.rb +47 -0
- data/spec/toy/equality_spec.rb +5 -19
- data/spec/toy/extensions/boolean_spec.rb +2 -0
- data/spec/toy/identity/uuid_key_factory_spec.rb +2 -2
- data/spec/toy/identity_map_spec.rb +45 -37
- data/spec/toy/identity_spec.rb +1 -1
- data/spec/toy/inspect_spec.rb +1 -1
- data/spec/toy/lists_spec.rb +20 -5
- data/spec/toy/logger_spec.rb +1 -29
- data/spec/toy/mass_assignment_security_spec.rb +16 -5
- data/spec/toy/middleware/identity_map_spec.rb +68 -2
- data/spec/toy/persistence_spec.rb +88 -30
- data/spec/toy/reference_spec.rb +0 -1
- data/spec/toy/references_spec.rb +20 -0
- data/spec/toy/reloadable_spec.rb +81 -0
- data/spec/toy/serialization_spec.rb +1 -110
- data/spec/toy/validations_spec.rb +0 -21
- data/spec/toy_spec.rb +4 -5
- data/test/lint_test.rb +1 -1
- metadata +21 -26
- data/.autotest +0 -11
- data/LOGGING.rdoc +0 -12
- data/README.rdoc +0 -27
- data/examples/models.rb +0 -51
- data/lib/toy/dolly.rb +0 -30
- data/lib/toy/embedded_list.rb +0 -45
- data/lib/toy/embedded_lists.rb +0 -68
- data/lib/toy/index.rb +0 -74
- data/lib/toy/indices.rb +0 -56
- data/lib/toy/proxies/embedded_list.rb +0 -79
- data/spec/toy/dolly_spec.rb +0 -76
- data/spec/toy/embedded_list_spec.rb +0 -607
- data/spec/toy/embedded_lists_spec.rb +0 -172
- data/spec/toy/index_spec.rb +0 -230
- data/spec/toy/indices_spec.rb +0 -141
- data/specs.watchr +0 -52
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Toy::Reloadable do
|
4
|
+
uses_constants('User', 'Game')
|
5
|
+
|
6
|
+
describe "#reload" do
|
7
|
+
before do
|
8
|
+
User.attribute(:name, String)
|
9
|
+
@user = User.create(:name => 'John')
|
10
|
+
end
|
11
|
+
let(:user) { @user }
|
12
|
+
|
13
|
+
it "reloads id from database" do
|
14
|
+
id = user.id
|
15
|
+
user.reload
|
16
|
+
user.id.should == id
|
17
|
+
end
|
18
|
+
|
19
|
+
it "reloads record from the database" do
|
20
|
+
user.name = 'Steve'
|
21
|
+
user.reload
|
22
|
+
user.name.should == 'John'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "is still persisted" do
|
26
|
+
user.should be_persisted
|
27
|
+
user.reload
|
28
|
+
user.should be_persisted
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns the record" do
|
32
|
+
user.name = 'Steve'
|
33
|
+
user.reload.should equal(user)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "resets instance variables" do
|
37
|
+
user.instance_variable_set("@foo", true)
|
38
|
+
user.reload
|
39
|
+
user.instance_variable_get("@foo").should be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "resets lists" do
|
43
|
+
User.list(:games)
|
44
|
+
game = Game.create
|
45
|
+
user.update_attributes(:games => [game])
|
46
|
+
user.games = []
|
47
|
+
user.games.should == []
|
48
|
+
user.reload
|
49
|
+
user.games.should == [game]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "resets references" do
|
53
|
+
Game.reference(:user)
|
54
|
+
game = Game.create(:user => user)
|
55
|
+
game.user = nil
|
56
|
+
game.user.should be_nil
|
57
|
+
game.reload
|
58
|
+
game.user.should == user
|
59
|
+
end
|
60
|
+
|
61
|
+
it "raises NotFound if does not exist" do
|
62
|
+
user.destroy
|
63
|
+
lambda { user.reload }.should raise_error(Toy::NotFound)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "reloads defaults" do
|
67
|
+
User.attribute(:skills, Array)
|
68
|
+
@user.reload
|
69
|
+
@user.skills.should == []
|
70
|
+
end
|
71
|
+
|
72
|
+
it "reloads attributes protected from mass assignment" do
|
73
|
+
User.attribute(:admin, Boolean)
|
74
|
+
User.attr_accessible(:name)
|
75
|
+
user = User.new(:name => 'John')
|
76
|
+
user.admin = true
|
77
|
+
user.save
|
78
|
+
user.reload.admin.should be_true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe Toy::Serialization do
|
4
|
-
uses_constants('User', 'Game', 'Move'
|
4
|
+
uses_constants('User', 'Game', 'Move')
|
5
5
|
|
6
6
|
before do
|
7
7
|
User.attribute :name, String
|
@@ -65,57 +65,6 @@ describe Toy::Serialization do
|
|
65
65
|
ActiveSupport::JSON.decode(json)['user'].should_not have_key('id')
|
66
66
|
end
|
67
67
|
|
68
|
-
describe "serializing with embedded documents" do
|
69
|
-
before do
|
70
|
-
Game.reference(:creator, User)
|
71
|
-
|
72
|
-
Move.attribute(:index, Integer)
|
73
|
-
Move.attribute(:points, Integer)
|
74
|
-
Move.attribute(:words, Array)
|
75
|
-
|
76
|
-
Tile.attribute(:row, Integer)
|
77
|
-
Tile.attribute(:column, Integer)
|
78
|
-
Tile.attribute(:index, Integer)
|
79
|
-
|
80
|
-
Game.embedded_list(:moves)
|
81
|
-
Move.embedded_list(:tiles)
|
82
|
-
|
83
|
-
@user = User.create
|
84
|
-
@game = Game.create!(:creator => @user, :move_attributes => [
|
85
|
-
:index => 0,
|
86
|
-
:points => 15,
|
87
|
-
:tile_attributes => [
|
88
|
-
{:column => 7, :row => 7, :index => 23},
|
89
|
-
{:column => 8, :row => 7, :index => 24},
|
90
|
-
],
|
91
|
-
])
|
92
|
-
end
|
93
|
-
|
94
|
-
it "includes all embedded attributes by default" do
|
95
|
-
move = @game.moves.first
|
96
|
-
tile1 = move.tiles[0]
|
97
|
-
tile2 = move.tiles[1]
|
98
|
-
ActiveSupport::JSON.decode(@game.to_json).should == {
|
99
|
-
'game' => {
|
100
|
-
'id' => @game.id,
|
101
|
-
'creator_id' => @user.id,
|
102
|
-
'moves' => [
|
103
|
-
{
|
104
|
-
'id' => move.id,
|
105
|
-
'index' => 0,
|
106
|
-
'points' => 15,
|
107
|
-
'words' => [],
|
108
|
-
'tiles' => [
|
109
|
-
{'id' => tile1.id, 'column' => 7, 'row' => 7, 'index' => 23},
|
110
|
-
{'id' => tile2.id, 'column' => 8, 'row' => 7, 'index' => 24},
|
111
|
-
]
|
112
|
-
},
|
113
|
-
],
|
114
|
-
}
|
115
|
-
}
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
68
|
describe "serializing relationships" do
|
120
69
|
before do
|
121
70
|
User.list :games, :inverse_of => :user
|
@@ -209,30 +158,6 @@ describe Toy::Serialization do
|
|
209
158
|
end
|
210
159
|
end
|
211
160
|
|
212
|
-
describe "serializing parent relationships" do
|
213
|
-
before do
|
214
|
-
Game.embedded_list :moves
|
215
|
-
Move.parent_reference :game
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should include references" do
|
219
|
-
game = Game.create
|
220
|
-
move = game.moves.create
|
221
|
-
|
222
|
-
ActiveSupport::JSON.decode(move.to_json(:include => [:game])).should == {
|
223
|
-
'move' => {
|
224
|
-
'id' => move.id,
|
225
|
-
'game' => {
|
226
|
-
'id' => game.id,
|
227
|
-
'moves' => [{
|
228
|
-
'id' => move.id
|
229
|
-
}]
|
230
|
-
}
|
231
|
-
}
|
232
|
-
}
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
161
|
describe "serializing specific attributes" do
|
237
162
|
before do
|
238
163
|
Move.attribute(:index, Integer)
|
@@ -301,40 +226,6 @@ describe Toy::Serialization do
|
|
301
226
|
end
|
302
227
|
|
303
228
|
describe "#serializable_hash" do
|
304
|
-
context "with embedded list" do
|
305
|
-
before do
|
306
|
-
Game.embedded_list :moves
|
307
|
-
Move.parent_reference :game
|
308
|
-
|
309
|
-
@game = Game.create
|
310
|
-
@move = game.moves.create
|
311
|
-
end
|
312
|
-
let(:game) { @game }
|
313
|
-
|
314
|
-
it "returns a hash the whole way through" do
|
315
|
-
game.serializable_hash.should == {
|
316
|
-
'id' => game.id,
|
317
|
-
'moves' => [
|
318
|
-
{'id' => game.moves.first.id}
|
319
|
-
]
|
320
|
-
}
|
321
|
-
end
|
322
|
-
|
323
|
-
it "allows using only with embedded" do
|
324
|
-
game.serializable_hash(:only => :moves).should == {
|
325
|
-
'moves' => [
|
326
|
-
{'id' => game.moves.first.id}
|
327
|
-
]
|
328
|
-
}
|
329
|
-
end
|
330
|
-
|
331
|
-
it "allows using except to not include embedded" do
|
332
|
-
game.serializable_hash(:except => :moves).should == {
|
333
|
-
'id' => game.id,
|
334
|
-
}
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
229
|
context "with method that is another toystore object" do
|
339
230
|
before do
|
340
231
|
Game.reference(:creator, User)
|
@@ -147,25 +147,4 @@ describe Toy::Validations do
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
end
|
150
|
-
|
151
|
-
describe ".validates_embedded" do
|
152
|
-
before do
|
153
|
-
Game.embedded_list(:moves)
|
154
|
-
Move.attribute(:index, Integer)
|
155
|
-
Move.validates_presence_of(:index)
|
156
|
-
Game.validates_embedded(:moves)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "adds errors if any of the embedded are invalid" do
|
160
|
-
game = Game.new(:moves => [Move.new])
|
161
|
-
game.valid?
|
162
|
-
game.errors[:moves].should include('is invalid')
|
163
|
-
end
|
164
|
-
|
165
|
-
it "does not have errors if all embedded are valid" do
|
166
|
-
game = Game.new(:moves => [Move.new(:index => 1)])
|
167
|
-
game.valid?
|
168
|
-
game.errors[:moves].should_not include('is invalid')
|
169
|
-
end
|
170
|
-
end
|
171
150
|
end
|
data/spec/toy_spec.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe Toy do
|
4
|
-
uses_constants('User', 'Game'
|
4
|
+
uses_constants('User', 'Game')
|
5
5
|
|
6
6
|
describe ".clear" do
|
7
|
-
it "can clear all the
|
8
|
-
Game.embedded_list(:moves)
|
7
|
+
it "can clear all the adapters in one magical moment" do
|
9
8
|
user = User.create!
|
10
|
-
game = Game.create!
|
9
|
+
game = Game.create!
|
11
10
|
Toy.clear
|
12
11
|
User.get(user.id).should be_nil
|
13
12
|
Game.get(game.id).should be_nil
|
14
13
|
end
|
15
14
|
|
16
|
-
it "does not raise error when no default
|
15
|
+
it "does not raise error when no default adapter set" do
|
17
16
|
klass = Class.new { include Toy::Store }
|
18
17
|
lambda { Toy.clear }.should_not raise_error
|
19
18
|
end
|
data/test/lint_test.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toystore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 59
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 9
|
9
|
+
- 0
|
10
|
+
version: 0.9.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Geoffrey Dagley
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-
|
19
|
+
date: 2012-03-14 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: adapter
|
@@ -105,19 +105,19 @@ extensions: []
|
|
105
105
|
extra_rdoc_files: []
|
106
106
|
|
107
107
|
files:
|
108
|
-
- .autotest
|
109
108
|
- .gitignore
|
109
|
+
- Changelog.md
|
110
110
|
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- Guardfile
|
111
113
|
- LICENSE
|
112
|
-
-
|
113
|
-
- README.rdoc
|
114
|
+
- README.md
|
114
115
|
- Rakefile
|
115
116
|
- examples/attributes_abbreviation.rb
|
116
117
|
- examples/attributes_virtual.rb
|
117
118
|
- examples/identity_map.rb
|
118
119
|
- examples/memcached.rb
|
119
120
|
- examples/memory.rb
|
120
|
-
- examples/models.rb
|
121
121
|
- examples/mongo.rb
|
122
122
|
- examples/namespacing_keys.rb
|
123
123
|
- examples/redis.rb
|
@@ -127,11 +127,10 @@ files:
|
|
127
127
|
- lib/toy/attributes.rb
|
128
128
|
- lib/toy/caching.rb
|
129
129
|
- lib/toy/callbacks.rb
|
130
|
+
- lib/toy/cloneable.rb
|
130
131
|
- lib/toy/collection.rb
|
131
132
|
- lib/toy/dirty.rb
|
132
|
-
- lib/toy/
|
133
|
-
- lib/toy/embedded_list.rb
|
134
|
-
- lib/toy/embedded_lists.rb
|
133
|
+
- lib/toy/dirty_store.rb
|
135
134
|
- lib/toy/equality.rb
|
136
135
|
- lib/toy/exceptions.rb
|
137
136
|
- lib/toy/extensions/array.rb
|
@@ -149,22 +148,21 @@ files:
|
|
149
148
|
- lib/toy/identity/abstract_key_factory.rb
|
150
149
|
- lib/toy/identity/uuid_key_factory.rb
|
151
150
|
- lib/toy/identity_map.rb
|
152
|
-
- lib/toy/index.rb
|
153
|
-
- lib/toy/indices.rb
|
154
151
|
- lib/toy/inspect.rb
|
155
152
|
- lib/toy/list.rb
|
156
153
|
- lib/toy/lists.rb
|
157
154
|
- lib/toy/logger.rb
|
158
155
|
- lib/toy/mass_assignment_security.rb
|
159
156
|
- lib/toy/middleware/identity_map.rb
|
157
|
+
- lib/toy/object.rb
|
160
158
|
- lib/toy/persistence.rb
|
161
159
|
- lib/toy/plugins.rb
|
162
|
-
- lib/toy/proxies/embedded_list.rb
|
163
160
|
- lib/toy/proxies/list.rb
|
164
161
|
- lib/toy/proxies/proxy.rb
|
165
162
|
- lib/toy/querying.rb
|
166
163
|
- lib/toy/reference.rb
|
167
164
|
- lib/toy/references.rb
|
165
|
+
- lib/toy/reloadable.rb
|
168
166
|
- lib/toy/serialization.rb
|
169
167
|
- lib/toy/store.rb
|
170
168
|
- lib/toy/timestamps.rb
|
@@ -178,14 +176,14 @@ files:
|
|
178
176
|
- spec/support/constants.rb
|
179
177
|
- spec/support/identity_map_matcher.rb
|
180
178
|
- spec/support/name_and_number_key_factory.rb
|
179
|
+
- spec/support/objects.rb
|
181
180
|
- spec/toy/attribute_spec.rb
|
182
181
|
- spec/toy/attributes_spec.rb
|
183
182
|
- spec/toy/caching_spec.rb
|
184
183
|
- spec/toy/callbacks_spec.rb
|
184
|
+
- spec/toy/cloneable_spec.rb
|
185
185
|
- spec/toy/dirty_spec.rb
|
186
|
-
- spec/toy/
|
187
|
-
- spec/toy/embedded_list_spec.rb
|
188
|
-
- spec/toy/embedded_lists_spec.rb
|
186
|
+
- spec/toy/dirty_store_spec.rb
|
189
187
|
- spec/toy/equality_spec.rb
|
190
188
|
- spec/toy/exceptions_spec.rb
|
191
189
|
- spec/toy/extensions/array_spec.rb
|
@@ -202,8 +200,6 @@ files:
|
|
202
200
|
- spec/toy/identity/uuid_key_factory_spec.rb
|
203
201
|
- spec/toy/identity_map_spec.rb
|
204
202
|
- spec/toy/identity_spec.rb
|
205
|
-
- spec/toy/index_spec.rb
|
206
|
-
- spec/toy/indices_spec.rb
|
207
203
|
- spec/toy/inspect_spec.rb
|
208
204
|
- spec/toy/list_spec.rb
|
209
205
|
- spec/toy/lists_spec.rb
|
@@ -215,12 +211,12 @@ files:
|
|
215
211
|
- spec/toy/querying_spec.rb
|
216
212
|
- spec/toy/reference_spec.rb
|
217
213
|
- spec/toy/references_spec.rb
|
214
|
+
- spec/toy/reloadable_spec.rb
|
218
215
|
- spec/toy/serialization_spec.rb
|
219
216
|
- spec/toy/store_spec.rb
|
220
217
|
- spec/toy/timestamps_spec.rb
|
221
218
|
- spec/toy/validations_spec.rb
|
222
219
|
- spec/toy_spec.rb
|
223
|
-
- specs.watchr
|
224
220
|
- test/lint_test.rb
|
225
221
|
- toystore.gemspec
|
226
222
|
homepage: http://github.com/newtoy/toystore
|
@@ -262,14 +258,14 @@ test_files:
|
|
262
258
|
- spec/support/constants.rb
|
263
259
|
- spec/support/identity_map_matcher.rb
|
264
260
|
- spec/support/name_and_number_key_factory.rb
|
261
|
+
- spec/support/objects.rb
|
265
262
|
- spec/toy/attribute_spec.rb
|
266
263
|
- spec/toy/attributes_spec.rb
|
267
264
|
- spec/toy/caching_spec.rb
|
268
265
|
- spec/toy/callbacks_spec.rb
|
266
|
+
- spec/toy/cloneable_spec.rb
|
269
267
|
- spec/toy/dirty_spec.rb
|
270
|
-
- spec/toy/
|
271
|
-
- spec/toy/embedded_list_spec.rb
|
272
|
-
- spec/toy/embedded_lists_spec.rb
|
268
|
+
- spec/toy/dirty_store_spec.rb
|
273
269
|
- spec/toy/equality_spec.rb
|
274
270
|
- spec/toy/exceptions_spec.rb
|
275
271
|
- spec/toy/extensions/array_spec.rb
|
@@ -286,8 +282,6 @@ test_files:
|
|
286
282
|
- spec/toy/identity/uuid_key_factory_spec.rb
|
287
283
|
- spec/toy/identity_map_spec.rb
|
288
284
|
- spec/toy/identity_spec.rb
|
289
|
-
- spec/toy/index_spec.rb
|
290
|
-
- spec/toy/indices_spec.rb
|
291
285
|
- spec/toy/inspect_spec.rb
|
292
286
|
- spec/toy/list_spec.rb
|
293
287
|
- spec/toy/lists_spec.rb
|
@@ -299,6 +293,7 @@ test_files:
|
|
299
293
|
- spec/toy/querying_spec.rb
|
300
294
|
- spec/toy/reference_spec.rb
|
301
295
|
- spec/toy/references_spec.rb
|
296
|
+
- spec/toy/reloadable_spec.rb
|
302
297
|
- spec/toy/serialization_spec.rb
|
303
298
|
- spec/toy/store_spec.rb
|
304
299
|
- spec/toy/timestamps_spec.rb
|
data/.autotest
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'autotest/growl'
|
2
|
-
|
3
|
-
Autotest.add_hook(:initialize) {|at|
|
4
|
-
at.add_exception %r{^\.git} # ignore Version Control System
|
5
|
-
at.add_exception %r{^./tmp} # ignore temp files, lest autotest will run again, and again...
|
6
|
-
# at.clear_mappings # take out the default (test/test*rb)
|
7
|
-
at.add_mapping(%r{^lib/.*\.rb$}) {|f, _|
|
8
|
-
Dir['spec/**/*.rb']
|
9
|
-
}
|
10
|
-
nil
|
11
|
-
}
|