nested 0.0.27 → 0.0.28

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab13bf160d76af854150cd009b1f59116a0c58bc
4
- data.tar.gz: df0fe620f543a2f267634f88d86fde251ce9d2e4
3
+ metadata.gz: 530eebbefcb6b3078c4e10362b44bb5f86a18d3a
4
+ data.tar.gz: 782cad01102d3b0af2baf4f63ce0413228afec18
5
5
  SHA512:
6
- metadata.gz: 5eebaafea98746566bfd1b60dda1f5cfeda99920d4d6e804d132b2e2ac236e233ce370168f7b1c08f1f85806b69b9e34f7717c8e4e2de732a5a09f2653f3b7ca
7
- data.tar.gz: f79bea6564bd4c80fa2ef5bf7ae8df1c2a1617f8a5d11c48123ab6a2fdb31817b7c5e0fa4a30c2799a1ed403938fbd74ee48941049fb2587bb5d90ed02784c7e
6
+ metadata.gz: 7895a40cc84bc8068daea8d4c01b253dea34aac7e84bb0b94519003e9aa5c537261c7cdcfc28df839a8f55c674276076f89a62bf43b44ebde52af096196c591c
7
+ data.tar.gz: 55aa216d43349384134b38cbe7a6087610ca6508c3621d0075e40c2e1406bd801eac897104721048606f1857fbce6c8f6131e87895cdf82771954f013e19d0cb
data/README.md CHANGED
@@ -47,7 +47,7 @@ Congrats! You just created your first nested API. Checkout the other sections to
47
47
 
48
48
  ## Nested:App
49
49
 
50
- In nested you implement your API as a normal ruby class which inherit from Nested::App
50
+ In nested you implement your API as a normal ruby class which inherits from Nested::App
51
51
 
52
52
  ```
53
53
  class MyApi < Nested::App
@@ -170,7 +170,7 @@ class MyApi < Nested::App
170
170
  end
171
171
  ```
172
172
 
173
- The model is available in all http verb block. Except inpost. The post block has to return a new model.
173
+ The model is available in all http verb blocks. Except in post. The post block has to return a new model.
174
174
 
175
175
  ```
176
176
  class MyApi < Nested::App
@@ -182,7 +182,7 @@ class MyApi < Nested::App
182
182
  end
183
183
  ```
184
184
 
185
- Nested gives you access to http parameters through the params method as known from other frameworks and addition to this a useful shorthand.
185
+ Nested gives you access to http parameters through the params method as known from other frameworks and in addition to this a useful shorthand.
186
186
 
187
187
  ```
188
188
  class MyApi < Nested::App
@@ -201,3 +201,52 @@ class MyApi < Nested::App
201
201
  end
202
202
  end
203
203
  ```
204
+ ## Serialize
205
+
206
+ Nested does not automatically serialize and expose a attributes of the underlying model as resource fields. You have to list them explicitly. This allows you fine grain control over what and when something is exposed and gets you a decoupling from your model layer as well.
207
+
208
+ Serialize a single field
209
+
210
+ ```
211
+ class MyApi < Nested::App
212
+ singleton :user do
213
+ serialize :email
214
+ get
215
+ end
216
+ end
217
+ ```
218
+
219
+ Serialize multiple fields
220
+
221
+ ```
222
+ class MyApi < Nested::App
223
+ singleton :user do
224
+ serialize :id, :email, :username
225
+ get
226
+ end
227
+ end
228
+ ```
229
+
230
+ You can invoke serialize multiple times.
231
+
232
+ ```
233
+ class MyApi < Nested::App
234
+ singleton :user do
235
+ serialize :id, :email
236
+ serialize :username
237
+ get
238
+ end
239
+ end
240
+ ```
241
+
242
+ In the previous examples we always serialize a 1:1 field value from the model. Sometimes you want to transform the model value or serialize some completly synthetic fields. This can be easily accomplished by passing a one entry Hash to serialize. The key will be used as serialized field name. The value of the hash is expected to be a block which gets invoked with the model as argument. The return value of the block will be used a serialization value.
243
+
244
+ ```
245
+ class MyApi < Nested::App
246
+ singleton :user do
247
+ serialize :id, :email
248
+ serialize username: ->(user){ "*** #{user.username} ***" }
249
+ get
250
+ end
251
+ end
252
+ ```
data/lib/nested/app.rb CHANGED
@@ -8,8 +8,8 @@ module Nested
8
8
  clazz.instance_variable_set("@config", {})
9
9
  end
10
10
 
11
- def self.child_resource(name, clazz, resource_if_block, init_block, &block)
12
- clazz.new(sinatra, name, nil, resource_if_block, init_block)
11
+ def self.child_resource(name, clazz, resource_if_block, model_block, &block)
12
+ clazz.new(sinatra, name, nil, resource_if_block, model_block)
13
13
  .tap{|r| r.instance_eval(&(block||Proc.new{ }))}
14
14
  end
15
15
 
data/lib/nested/many.rb CHANGED
@@ -1,5 +1,15 @@
1
1
  module Nested
2
2
  class Many < Resource
3
+ include WithModelBlock
4
+
5
+ MODEL_BLOCK = Proc.new do
6
+ if @__resource.parent
7
+ instance_variable_get("@#{@__resource.parent.instance_variable_name}").send(@__resource.name)
8
+ else
9
+ nil
10
+ end
11
+ end
12
+
3
13
  def one(&block)
4
14
  one_if(PROC_TRUE, &block)
5
15
  end
@@ -8,12 +18,8 @@ module Nested
8
18
  child_resource(self.name.to_s.singularize.to_sym, One, resource_if_block, nil, &block)
9
19
  end
10
20
 
11
- def default_init_block
12
- if parent
13
- Proc.new{ instance_variable_get("@#{@__resource.parent.instance_variable_name}").send(@__resource.name) }
14
- else
15
- Proc.new { nil }
16
- end
21
+ def default_model_block
22
+ MODEL_BLOCK
17
23
  end
18
24
  end
19
25
  end
data/lib/nested/one.rb CHANGED
@@ -2,20 +2,23 @@ module Nested
2
2
  class One < Resource
3
3
  include WithMany
4
4
 
5
+ MODEL_BLOCK = Proc.new do
6
+ if @__resource.parent
7
+ instance_variable_get("@#{@__resource.parent.instance_variable_name}")
8
+ .where(id: params[:"#{@__resource.parent.name.to_s.singularize.to_sym}_id"])
9
+ .first
10
+ else
11
+ nil
12
+ end
13
+ end
14
+
15
+
5
16
  def initialize_serializer_factory
6
17
  Serializer.new(parent.serializer.includes)
7
18
  end
8
19
 
9
- def default_init_block
10
- if parent
11
- Proc.new do
12
- instance_variable_get("@#{@__resource.parent.instance_variable_name}")
13
- .where(id: params[:"#{@__resource.parent.name.to_s.singularize.to_sym}_id"])
14
- .first
15
- end
16
- else
17
- Proc.new { nil }
18
- end
20
+ def default_model_block
21
+ MODEL_BLOCK
19
22
  end
20
23
 
21
24
  def to_route_part
@@ -1,10 +1,10 @@
1
1
  module Nested
2
2
  class Resource
3
- attr_reader :name, :parent, :actions, :resources, :serializer, :init_block, :sinatra
3
+ attr_reader :name, :parent, :actions, :resources, :serializer, :model_block, :sinatra, :before_blocks, :after_blocks
4
4
 
5
5
  include WithSingleton
6
6
 
7
- def initialize(sinatra, name, parent, resource_if_block, init_block)
7
+ def initialize(sinatra, name, parent, resource_if_block, model_block)
8
8
  raise "resource must be given a name" unless name
9
9
 
10
10
  @sinatra = sinatra
@@ -16,15 +16,15 @@ module Nested
16
16
  raise "resource_if_block is nil, pass Nested::PROC_TRUE instead" unless resource_if_block
17
17
  @resource_if_block = resource_if_block
18
18
 
19
- unless @init_block = init_block
19
+ unless @model_block = model_block
20
20
  if is_a?(One)
21
- @init_block = default_init_block
21
+ @model_block = default_model_block
22
22
  else
23
- @init_block = resource_if_block != PROC_TRUE ? parent.try(:init_block) : default_init_block
23
+ @model_block = resource_if_block != PROC_TRUE ? parent.try(:model_block) : default_model_block
24
24
  end
25
25
  end
26
26
 
27
- raise "no init_block passed and could not lookup any parent or default init_block" unless @init_block
27
+ raise "no model_block passed and could not lookup any parent or default model_block" unless @model_block
28
28
 
29
29
  @before_blocks = []
30
30
  @after_blocks = []
@@ -36,12 +36,16 @@ module Nested
36
36
  Serializer.new([])
37
37
  end
38
38
 
39
- def child_resource(name, clazz, resource_if_block, init_block, &block)
40
- clazz.new(@sinatra, name, self, resource_if_block, init_block)
39
+ def child_resource(name, clazz, resource_if_block, model_block, &block)
40
+ clazz.new(@sinatra, name, self, resource_if_block, model_block)
41
41
  .tap{|r| r.instance_eval(&(block||Proc.new{ }))}
42
42
  .tap{|r| @resources << r}
43
43
  end
44
44
 
45
+ def default_model_block
46
+ raise "implement me"
47
+ end
48
+
45
49
  def to_route_part
46
50
  "/#{@name}"
47
51
  end
@@ -58,15 +62,17 @@ module Nested
58
62
 
59
63
  def serialize(*args)
60
64
  args.each {|arg| serializer + arg }
61
- serializer
65
+ self
62
66
  end
63
67
 
64
68
  def serialize_include_if(condition, *args)
65
69
  args.each {|arg| @serializer + SerializerField.new(arg, condition) }
70
+ self
66
71
  end
67
72
 
68
73
  def serialize_exclude_if(condition, *args)
69
74
  args.each {|arg| @serializer - SerializerField.new(arg, condition) }
75
+ self
70
76
  end
71
77
 
72
78
  def route_replace(route, args)
@@ -88,10 +94,12 @@ module Nested
88
94
  instance_eval do
89
95
  define_method method do |action=nil, &block|
90
96
  send(:"#{method}_if", PROC_TRUE, action, &block)
97
+ self
91
98
  end
92
99
 
93
100
  define_method :"#{method}_if" do |method_if_block, action=nil, &block|
94
101
  create_sinatra_route method, action, method_if_block, &(block||proc {})
102
+ self
95
103
  end
96
104
  end
97
105
  end
@@ -116,14 +124,28 @@ module Nested
116
124
  end
117
125
 
118
126
  def sinatra_init(sinatra)
119
- sinatra.instance_variable_set("@__resource", self)
127
+ sinatra_init_set_resource(sinatra)
120
128
 
121
129
  raise "resource_if is false for resource: #{self.name} " unless sinatra.instance_exec(&@resource_if_block)
122
130
 
123
- @before_blocks.each{|e| sinatra.instance_exec(&e)}
131
+ sinatra_init_before(sinatra)
132
+ sinatra_init_set_model(sinatra)
133
+ sinatra_init_after(sinatra)
134
+ end
124
135
 
125
- sinatra.instance_variable_set("@#{self.instance_variable_name}", sinatra.instance_exec(&@init_block))
136
+ def sinatra_init_set_resource(sinatra)
137
+ sinatra.instance_variable_set("@__resource", self)
138
+ end
139
+
140
+ def sinatra_init_set_model(sinatra)
141
+ sinatra.instance_variable_set("@#{self.instance_variable_name}", sinatra.instance_exec(*(@model_block.parameters.empty? ? [] : [sinatra.instance_exec(&default_model_block)]), &@model_block))
142
+ end
143
+
144
+ def sinatra_init_before(sinatra)
145
+ @before_blocks.each{|e| sinatra.instance_exec(&e)}
146
+ end
126
147
 
148
+ def sinatra_init_after(sinatra)
127
149
  @after_blocks.each{|e| sinatra.instance_exec(&e)}
128
150
  end
129
151
 
@@ -29,17 +29,21 @@ module Nested
29
29
 
30
30
  excludes = this.excludes.select{|e| instance_exec(&e.condition)}
31
31
 
32
- this.includes.reject{|e| excludes.detect{|e2| e2.name == e.name}}.inject({}) do |memo, field|
33
- if instance_exec(&field.condition)
34
- case field.name
35
- when Symbol
36
- memo[field.name] = obj.is_a?(Hash) ? obj[field.name] : obj.send(field.name)
37
- when Hash
38
- field_name, proc = field.name.to_a.first
39
- memo[field_name] = instance_exec(obj, &proc)
32
+ if obj
33
+ this.includes.reject{|e| excludes.detect{|e2| e2.name == e.name}}.inject({}) do |memo, field|
34
+ if instance_exec(&field.condition)
35
+ case field.name
36
+ when Symbol
37
+ memo[field.name] = obj.is_a?(Hash) ? obj[field.name] : obj.send(field.name)
38
+ when Hash
39
+ field_name, proc = field.name.to_a.first
40
+ memo[field_name] = instance_exec(obj, &proc)
41
+ end
40
42
  end
43
+ memo
41
44
  end
42
- memo
45
+ else
46
+ nil
43
47
  end
44
48
  end
45
49
  end
@@ -1,13 +1,18 @@
1
1
  module Nested
2
2
  class Singleton < Resource
3
3
  include WithMany
4
+ include WithModelBlock
4
5
 
5
- def default_init_block
6
- if parent
7
- Proc.new{ instance_variable_get("@#{@__resource.parent.instance_variable_name}").send(@__resource.name) }
6
+ MODEL_BLOCK = Proc.new do
7
+ if @__resource.parent
8
+ instance_variable_get("@#{@__resource.parent.instance_variable_name}").send(@__resource.name)
8
9
  else
9
- Proc.new { nil }
10
+ nil
10
11
  end
11
12
  end
13
+
14
+ def default_model_block
15
+ MODEL_BLOCK
16
+ end
12
17
  end
13
18
  end
@@ -1,11 +1,11 @@
1
1
  module Nested
2
2
  module WithMany
3
- def many(name, init_block=nil, &block)
4
- many_if(PROC_TRUE, name, init_block, &block)
3
+ def many(name, model_block=nil, &block)
4
+ many_if(PROC_TRUE, name, model_block, &block)
5
5
  end
6
6
 
7
- def many_if(resource_if_block, name, init_block=nil, &block)
8
- child_resource(name, Many, resource_if_block, init_block, &block)
7
+ def many_if(resource_if_block, name, model_block=nil, &block)
8
+ child_resource(name, Many, resource_if_block, model_block, &block)
9
9
  end
10
10
  end
11
11
  end
@@ -0,0 +1,9 @@
1
+ module Nested
2
+ module WithModelBlock
3
+ def model(&block)
4
+ raise "do not use model() when you already set a model block" if @model_block != default_model_block && @model_block != Nested::PROC_NIL
5
+ @model_block = block
6
+ self
7
+ end
8
+ end
9
+ end
@@ -1,11 +1,11 @@
1
1
  module Nested
2
2
  module WithSingleton
3
- def singleton(name, init_block=nil, &block)
4
- singleton_if(PROC_TRUE, name, init_block, &block)
3
+ def singleton(name, model_block=nil, &block)
4
+ singleton_if(PROC_TRUE, name, model_block, &block)
5
5
  end
6
6
 
7
- def singleton_if(resource_if_block, name, init_block=nil, &block)
8
- child_resource(name, Singleton, resource_if_block, init_block, &block)
7
+ def singleton_if(resource_if_block, name, model_block=nil, &block)
8
+ child_resource(name, Singleton, resource_if_block, model_block, &block)
9
9
  end
10
10
  end
11
11
  end
data/lib/nested.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Nested
2
2
  PROC_TRUE = Proc.new{ true }
3
+ PROC_NIL = Proc.new{ nil }
3
4
  end
4
5
 
5
6
  require "json"
@@ -11,6 +12,7 @@ require "nested/redirect"
11
12
 
12
13
  require "nested/with_many"
13
14
  require "nested/with_singleton"
15
+ require "nested/with_model_block"
14
16
 
15
17
  require "nested/resource"
16
18
 
data/nested.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "nested"
3
- s.version = "0.0.27"
3
+ s.version = "0.0.28"
4
4
 
5
5
  s.authors = ["Jan Zimmek"]
6
6
  s.email = %q{jan.zimmek@web.de}
data/test/nested_test.rb CHANGED
@@ -14,18 +14,57 @@ class NestedTest < Test::Unit::TestCase
14
14
  @sinatra = mock
15
15
  end
16
16
 
17
+ def test_initialize
18
+ r = singleton(:project)
19
+
20
+ assert_equal :project, r.name
21
+ assert_equal nil, r.parent
22
+ assert_equal [], r.resources
23
+ assert_equal [], r.actions
24
+ assert_equal Nested::PROC_NIL, r.model_block
25
+
26
+
27
+ assert_equal [], r.before_blocks
28
+ assert_equal [], r.after_blocks
29
+
30
+ assert_equal Nested::Singleton::MODEL_BLOCK, singleton(:project, nil).model_block
31
+ assert_equal Nested::Many::MODEL_BLOCK, many(:projects, nil).model_block
32
+ assert_equal Nested::One::MODEL_BLOCK, many(:projects, nil).one.model_block
33
+ end
34
+
17
35
  def test_serialize
18
36
  serializer = mock()
19
37
 
20
38
  r = singleton(:project)
21
39
  r.stubs(:serializer).returns(serializer)
22
40
 
23
- assert_equal serializer, r.serialize
41
+ assert_equal r, r.serialize
24
42
 
25
43
  serializer.expects(:+).with(:name)
26
44
  r.serialize :name
27
45
  end
28
46
 
47
+ def test_before
48
+ b = ->{}
49
+ r = singleton(:project)
50
+ assert_equal r, r.before(&b)
51
+ assert_equal [b], r.before_blocks
52
+ end
53
+
54
+ def test_after
55
+ b = ->{}
56
+ r = singleton(:project)
57
+ assert_equal r, r.after(&b)
58
+ assert_equal [b], r.after_blocks
59
+ end
60
+
61
+ def test_model_block
62
+ model_block = ->{ }
63
+ r = singleton(:project)
64
+ assert_equal r, r.model(&model_block)
65
+ assert_equal model_block, r.model_block
66
+ end
67
+
29
68
  def test_route_replace
30
69
  resource = many(:projects).one
31
70
 
@@ -177,52 +216,45 @@ class NestedTest < Test::Unit::TestCase
177
216
  # get
178
217
 
179
218
  @sinatra.expects(:send).with(:get, "/project")
180
- singleton(:project).get
219
+ r = singleton(:project)
220
+ assert_equal r, r.get
181
221
 
182
222
  @sinatra.expects(:send).with(:get, "/project/action")
183
- singleton(:project).get(:action)
223
+ r = singleton(:project)
224
+ assert_equal r, r.get(:action)
184
225
 
185
226
  # post
186
227
 
187
228
  @sinatra.expects(:send).with(:post, "/project")
188
- singleton(:project).post
229
+ r = singleton(:project)
230
+ assert_equal r, r.post
189
231
 
190
232
  @sinatra.expects(:send).with(:post, "/project/action")
191
- singleton(:project).post(:action)
233
+ r = singleton(:project)
234
+ assert_equal r, r.post(:action)
192
235
 
193
236
  # put
194
237
 
195
238
  @sinatra.expects(:send).with(:put, "/project")
196
- singleton(:project).put
239
+ r = singleton(:project)
240
+ assert_equal r, r.put
197
241
 
198
242
  @sinatra.expects(:send).with(:put, "/project/action")
199
- singleton(:project).put(:action)
243
+ r = singleton(:project)
244
+ assert_equal r, r.put(:action)
200
245
 
201
246
  # delete
202
247
 
203
248
  @sinatra.expects(:send).with(:delete, "/project")
204
- singleton(:project).delete
249
+ r = singleton(:project)
250
+ assert_equal r, r.delete
205
251
 
206
252
  @sinatra.expects(:send).with(:delete, "/project/action")
207
- singleton(:project).delete(:action)
253
+ r = singleton(:project)
254
+ assert_equal r, r.delete(:action)
208
255
  end
209
256
 
210
257
 
211
- # def test_serializer
212
- # singleton!
213
-
214
- # @r.serialize :name
215
-
216
- # assert_equal({name: "joe"}, @r.instance_variable_get("@__serialize").call({name: "joe"}))
217
- # assert_equal({name: "joe"}, @r.instance_variable_get("@__serialize").call({name: "joe", boss: true}))
218
- # assert_equal({name: "joe"}, @r.instance_variable_get("@__serialize").call(OpenStruct.new({name: "joe"})))
219
-
220
- # @r.serialize :name, virtual: ->(o){ o[:name] + "!!" }
221
- # assert_equal({name: "joe", virtual: "joe!!"}, @r.instance_variable_get("@__serialize").call({name: "joe"}))
222
- # end
223
-
224
- # # ----
225
-
226
258
  def test_sinatra_response_type
227
259
  assert_equal :error, singleton(:project).sinatra_response_type(ActiveModel::Errors.new({}))
228
260
 
@@ -319,4 +351,84 @@ class NestedTest < Test::Unit::TestCase
319
351
  assert_equal ["project", "entry"], Nested::Js.function_arguments(many(:projects).one.many(:entries).one)
320
352
  end
321
353
 
354
+ def test_sinatra_init
355
+ @sinatra.stubs(:get)
356
+ r = singleton(:project, ->{ {name: "joe"} }).get
357
+
358
+ r.expects(:sinatra_init_set_resource).with(@sinatra)
359
+ r.expects(:sinatra_init_before).with(@sinatra)
360
+ r.expects(:sinatra_init_set_model).with(@sinatra)
361
+ r.expects(:sinatra_init_after).with(@sinatra)
362
+
363
+ r.sinatra_init(@sinatra)
364
+
365
+ r.expects(:sinatra_init_set_resource).with(@sinatra)
366
+
367
+ assert_raise RuntimeError do
368
+ r.instance_variable_set("@resource_if_block", ->{ false })
369
+ r.sinatra_init(@sinatra)
370
+ end
371
+ end
372
+
373
+ def test_sinatra_init_set_resource
374
+ @sinatra.stubs(:get)
375
+ r = singleton(:project, ->{ {name: "joe"} }).get
376
+ r.sinatra_init_set_resource(@sinatra)
377
+ assert_equal r, @sinatra.instance_variable_get("@__resource")
378
+ end
379
+
380
+ def test_sinatra_init_set_model
381
+ @sinatra.stubs(:get)
382
+ @sinatra.instance_variable_set("@some_value", 10)
383
+ r = singleton(:project, ->{ {name: "joe", some_value: @some_value} }).get
384
+ r.sinatra_init_set_model(@sinatra)
385
+ assert_equal ({name: "joe", some_value: 10}), @sinatra.instance_variable_get("@project")
386
+
387
+ @sinatra.stubs(:get)
388
+ @sinatra.instance_variable_set("@some_value", 10)
389
+ @sinatra.instance_variable_set("@other_value", 2)
390
+
391
+ r = singleton(:project, ->(default){ {name: "joe", some_value: @some_value * default} }).get
392
+ r.stubs(:default_model_block).returns(->{ @other_value })
393
+ r.sinatra_init_set_model(@sinatra)
394
+ assert_equal ({name: "joe", some_value: 20}), @sinatra.instance_variable_get("@project")
395
+ end
396
+
397
+ def test_sinatra_init_before
398
+ @sinatra.stubs(:get)
399
+ before_called = false
400
+
401
+ r = singleton(:project, ->{ {name: "joe"} }).get.before(&->{ before_called = true })
402
+ r.sinatra_init_before(@sinatra)
403
+
404
+ assert_equal true, before_called
405
+ end
406
+
407
+ def test_sinatra_init_after
408
+ @sinatra.stubs(:get)
409
+ after_called = false
410
+
411
+ r = singleton(:project, ->{ {name: "joe"} }).get.after(&->{ after_called = true })
412
+ r.sinatra_init_after(@sinatra)
413
+
414
+ assert_equal true, after_called
415
+ end
416
+
417
+ def test_default_model_block
418
+ assert_equal Nested::Singleton::MODEL_BLOCK, singleton(:project).default_model_block
419
+ assert_equal Nested::Many::MODEL_BLOCK, many(:projects).default_model_block
420
+ assert_equal Nested::One::MODEL_BLOCK, many(:projects).one.default_model_block
421
+ end
422
+
423
+ def test_model
424
+ model_block = ->{}
425
+ r = singleton(:project)
426
+ assert_equal r, r.model(&model_block)
427
+ assert_equal model_block, r.instance_variable_get("@model_block")
428
+
429
+ assert_raise RuntimeError do
430
+ singleton(:project, ->{ 10 }).model(&->{ 20 })
431
+ end
432
+ end
433
+
322
434
  end
@@ -38,6 +38,8 @@ class SerializerTest < Test::Unit::TestCase
38
38
 
39
39
  ser + :name
40
40
  assert_equal({id: 2, name: "joe"}, obj.instance_eval(&ser.serialize))
41
+
42
+ assert_equal(nil, nil.instance_eval(&ser.serialize))
41
43
  end
42
44
 
43
45
  def test_serialize_with_symbolize_keys
data/test/test_helper.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module TestHelper
2
- def singleton(name)
3
- Nested::Singleton.new(@sinatra, name, nil, Nested::PROC_TRUE, nil)
2
+ def singleton(name, model_block=Nested::PROC_NIL)
3
+ Nested::Singleton.new(@sinatra, name, nil, Nested::PROC_TRUE, model_block)
4
4
  end
5
5
 
6
- def many(name)
7
- Nested::Many.new(@sinatra, name, nil, Nested::PROC_TRUE, nil)
6
+ def many(name, model_block=Nested::PROC_NIL)
7
+ Nested::Many.new(@sinatra, name, nil, Nested::PROC_TRUE, model_block)
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nested
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.27
4
+ version: 0.0.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Zimmek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-04 00:00:00.000000000 Z
11
+ date: 2014-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -90,6 +90,7 @@ files:
90
90
  - lib/nested/serializer_field.rb
91
91
  - lib/nested/singleton.rb
92
92
  - lib/nested/with_many.rb
93
+ - lib/nested/with_model_block.rb
93
94
  - lib/nested/with_singleton.rb
94
95
  - nested.gemspec
95
96
  - test/nested_test.rb