restful_serializer 0.1.3 → 0.1.4

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.
@@ -1,5 +1,8 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
2
 
3
+ # These routes are only required by some tests, but route generation issues crop
4
+ # up depending on the order in which restful/* files are required. The reasons
5
+ # are mysterious, though they may have something to do with ActionController::UrlWriter
3
6
  ActionController::Routing::Routes.clear!
4
7
  ActionController::Routing::Routes.draw do |map|
5
8
  map.resources :foos
@@ -73,15 +76,15 @@ describe Restful::Serializer do
73
76
  end
74
77
 
75
78
  after(:each) do
76
- Restful.api_prefix = nil
77
- Restful.model_configuration = {}
79
+ Restful.clear
78
80
  end
79
81
 
80
- it "should not interfere with resource route generation" do
82
+ def check_routing
81
83
  ActionController::Routing::Routes.routes.size.should == 30
82
84
  by_method = ActionController::Routing::Routes.routes.group_by { |r|
83
85
  r.conditions[:method]
84
86
  }
87
+ # ActionController::Routing::Routes.routes.each { |r| puts r }
85
88
  by_method[:get].size.should == 4 * 4
86
89
  by_method[:put].size.should == 4
87
90
  by_method[:post].size.should == 4
@@ -89,44 +92,68 @@ describe Restful::Serializer do
89
92
  by_method[nil].size.should == 2
90
93
  end
91
94
 
92
- it "should require a subject" do
93
- lambda { Restful::Serializer.new }.should raise_error(ArgumentError)
94
- Restful::Serializer.new('foo').should be_kind_of(Restful::Serializer)
95
+ it "should not interfere with resource route generation" do
96
+ check_routing
95
97
  end
96
98
 
97
- it "should set klass" do
98
- rs = Restful::Serializer.new(@foo)
99
- rs.klass.should == 'foo'
99
+ it "should not interfere with resource route generation if we configure webservices" do
100
+ Restful.register_web_service('test',
101
+ :resources => {
102
+ :foo => { :serialization => { :only => :id } },
103
+ }
104
+ )
105
+ check_routing
100
106
  end
101
107
 
102
- it "should serialize" do
103
- @foo.save!
104
- rs = Restful::Serializer.new(@foo)
105
- rs.serialize.should == {
106
- 'name' => @foo.name,
107
- 'foo' => {
108
- 'id' => @foo.id,
108
+ describe "with an empty web service" do
109
+
110
+ before(:each) do
111
+ @empty_ws = Restful.register_web_service('empty')
112
+ end
113
+
114
+ it "should require a subject and a web service" do
115
+ lambda { Restful::Serializer.new }.should raise_error(ArgumentError)
116
+ lambda { Restful::Serializer.new('foo') }.should raise_error(ArgumentError)
117
+ Restful::Serializer.new('foo', @empty_ws).should be_kind_of(Restful::Serializer)
118
+ end
119
+
120
+ it "should set klass" do
121
+ rs = Restful::Serializer.new(@foo, @empty_ws)
122
+ rs.klass.should == 'foo'
123
+ end
124
+
125
+ it "should serialize" do
126
+ @foo.save!
127
+ rs = Restful::Serializer.new(@foo, @empty_ws)
128
+ rs.serialize.should == {
109
129
  'name' => @foo.name,
110
- },
111
- 'href' => "http://test.org/foos/#{@foo.id}",
112
- }
130
+ 'foo' => {
131
+ 'id' => @foo.id,
132
+ 'name' => @foo.name,
133
+ },
134
+ 'href' => "http://test.org/foos/#{@foo.id}",
135
+ }
136
+ end
113
137
  end
114
138
 
115
139
  describe "with configuration options" do
116
140
 
117
141
  before(:each) do
118
- Restful.api_prefix = 'prefix'
119
- Restful.model_configuration = {
120
- :foo => {
121
- :name => :fancy_name,
122
- :serialization => { :only => [:name], :methods => [:a_method] },
142
+ Restful.register_web_service('test',
143
+ :api_prefix => 'prefix',
144
+ :resources => {
145
+ :foo => {
146
+ :name_method => :fancy_name,
147
+ :serialization => { :only => [:name], :methods => [:a_method] },
148
+ }
123
149
  }
124
- }
150
+ )
151
+ @test_ws = Restful.web_service_configuration('test')
125
152
  @foo.save!
126
153
  end
127
154
 
128
155
  it "should take options from configuration" do
129
- rs = Restful::Serializer.new(@foo)
156
+ rs = Restful::Serializer.new(@foo, @test_ws)
130
157
  rs.serialize.should == {
131
158
  'name' => @foo.fancy_name,
132
159
  'foo' => {
@@ -137,9 +164,9 @@ describe Restful::Serializer do
137
164
  }
138
165
  end
139
166
 
140
- it "should override options during initialization" do
141
- rs = Restful::Serializer.new(@foo,
142
- :name => :name,
167
+ it "should merge options during initialization" do
168
+ rs = Restful::Serializer.new(@foo, @test_ws,
169
+ :name_method => :name,
143
170
  :serialization => { :only => [:id] },
144
171
  :url_for => :custom_foo
145
172
  )
@@ -147,21 +174,23 @@ describe Restful::Serializer do
147
174
  'name' => @foo.name,
148
175
  'foo' => {
149
176
  'id' => @foo.id,
177
+ 'name' => @foo.name,
178
+ 'a_method' => @foo.a_method,
150
179
  },
151
180
  'href' => "http://test.org/custom_foo/#{@foo.id}",
152
181
  }
153
182
  end
154
183
 
155
- it "should deeply merge overridden options" do
156
- rs = Restful::Serializer.new(@foo,
157
- :deep_merge => { :serialization => { :only => [:id] } }
158
- )
184
+ it "should provide fine grained configuration" do
185
+ rs = Restful::Serializer.new(@foo, @test_ws) do |config|
186
+ config.url_for = nil
187
+ config.serialization.only = :id
188
+ config.serialization.methods.clear
189
+ end
159
190
  rs.serialize.should == {
160
191
  'name' => @foo.fancy_name,
161
192
  'foo' => {
162
193
  'id' => @foo.id,
163
- 'name' => @foo.name,
164
- 'a_method' => @foo.a_method,
165
194
  },
166
195
  'href' => "http://test.org/prefix/foos/#{@foo.id}",
167
196
  }
@@ -171,19 +200,22 @@ describe Restful::Serializer do
171
200
  describe "with associations" do
172
201
 
173
202
  before(:each) do
174
- Restful.model_configuration = {
175
- :foo => {
176
- :associations => :bars,
177
- },
178
- :bar => {
179
- :associations => { :special => :foo, :dingos => nil },
180
- },
181
- }
203
+ Restful.register_web_service('test',
204
+ :resources => {
205
+ :foo => {
206
+ :associations => :bars,
207
+ },
208
+ :bar => {
209
+ :associations => { :special => :foo, :dingos => nil },
210
+ },
211
+ }
212
+ )
213
+ @test_ws = Restful.web_service_configuration('test')
182
214
  generate_instances
183
215
  end
184
216
 
185
217
  it "should include references to associations" do
186
- rs = Restful::Serializer.new(@foo)
218
+ rs = Restful::Serializer.new(@foo, @test_ws)
187
219
  rs.serialize.should == {
188
220
  'name' => @foo.name,
189
221
  'foo' => {
@@ -196,7 +228,7 @@ describe Restful::Serializer do
196
228
  end
197
229
 
198
230
  it "should handle multiple and nested associations" do
199
- rs = Restful::Serializer.new(@bar1)
231
+ rs = Restful::Serializer.new(@bar1, @test_ws)
200
232
  rs.serialize.should == {
201
233
  'name' => @bar1.name,
202
234
  'bar' => {
@@ -214,17 +246,20 @@ describe Restful::Serializer do
214
246
  describe "with subclasses" do
215
247
 
216
248
  before(:each) do
217
- Restful.model_configuration = {
218
- :thing => {
219
- :serialization => { :except => :secret }
249
+ Restful.register_web_service('test',
250
+ :resources => {
251
+ :thing => {
252
+ :serialization => { :except => :secret }
253
+ }
220
254
  }
221
- }
255
+ )
256
+ @test_ws = Restful.web_service_configuration('test')
222
257
  @thing = Thing.create!(:name => 'a thing', :secret => 'a secret')
223
258
  @sub = Sub.create!(:name => 'a sub thing', :secret => 'another secret')
224
259
  end
225
260
 
226
261
  it "should pull superclass configuration up into a subclass serialization" do
227
- rs = Restful::Serializer.new(@sub)
262
+ rs = Restful::Serializer.new(@sub, @test_ws)
228
263
  rs.serialize.should == {
229
264
  'name' => @sub.name,
230
265
  'href' => "http://test.org/things/#{@sub.id}",
@@ -238,20 +273,23 @@ describe Restful::Serializer do
238
273
 
239
274
  describe "with arrays" do
240
275
  before(:each) do
241
- Restful.model_configuration = {
242
- :foo => {
243
- :associations => :bars,
244
- },
245
- :bar => {
246
- :serialization => { :only => [:name], :include => { :dingos => { :only => [ :name, :id] } } },
247
- :associations => [:foo, :dingos],
248
- },
249
- }
276
+ Restful.register_web_service('test',
277
+ :resources => {
278
+ :foo => {
279
+ :associations => :bars,
280
+ },
281
+ :bar => {
282
+ :serialization => { :only => [:name], :include => { :dingos => { :only => [ :name, :id] } } },
283
+ :associations => [:foo, :dingos],
284
+ },
285
+ }
286
+ )
287
+ @test_ws = Restful.web_service_configuration('test')
250
288
  generate_instances
251
289
  end
252
290
 
253
291
  it "should serialize arrays" do
254
- rs = Restful::Serializer.new(@foo.bars)
292
+ rs = Restful::Serializer.new(@foo.bars, @test_ws)
255
293
  rs.serialize.should == [
256
294
  {
257
295
  'name' => @bar1.name,
@@ -271,7 +309,7 @@ describe Restful::Serializer do
271
309
  end
272
310
 
273
311
  it "should deeply serialize arrays if told to" do
274
- rs = Restful::Serializer.new(@foo.bars, :shallow => false)
312
+ rs = Restful::Serializer.new(@foo.bars, @test_ws, :shallow => false)
275
313
  rs.serialize.should == [
276
314
  {
277
315
  'name' => @bar1.name,
@@ -302,8 +340,8 @@ describe Restful::Serializer do
302
340
  ]
303
341
  end
304
342
 
305
- it "should override options during initialization for each member" do
306
- rs = Restful::Serializer.new(@foo.bars,
343
+ it "should merge options during initialization for each member" do
344
+ rs = Restful::Serializer.new(@foo.bars, @test_ws,
307
345
  :serialization => { :only => :id }
308
346
  )
309
347
  rs.serialize.should == [
@@ -311,30 +349,31 @@ describe Restful::Serializer do
311
349
  'name' => @bar1.name,
312
350
  'href' => "http://test.org/bars/#{@bar1.id}",
313
351
  'bar' => {
314
- 'id' => @bar1.id,
352
+ 'name' => @bar1.name,
353
+ 'id' => @bar1.id,
315
354
  },
316
355
  },
317
356
  {
318
357
  'name' => @bar2.name,
319
358
  'href' => "http://test.org/bars/#{@bar2.id}",
320
359
  'bar' => {
321
- 'id' => @bar2.id,
360
+ 'name' => @bar2.name,
361
+ 'id' => @bar2.id,
322
362
  },
323
363
  },
324
364
  ]
325
365
  end
326
366
 
327
- it "should deeply merge overridden options for each member" do
328
- rs = Restful::Serializer.new(@foo.bars,
329
- :deep_merge => { :serialization => { :only => [:id] } }
330
- )
367
+ it "should provide fine grained configuration for each member" do
368
+ rs = Restful::Serializer.new(@foo.bars, @test_ws) do |configure|
369
+ configure.serialization.only = :id
370
+ end
331
371
  rs.serialize.should == [
332
372
  {
333
373
  'name' => @bar1.name,
334
374
  'href' => "http://test.org/bars/#{@bar1.id}",
335
375
  'bar' => {
336
376
  'id' => @bar1.id,
337
- 'name' => @bar1.name,
338
377
  },
339
378
  },
340
379
  {
@@ -342,54 +381,92 @@ describe Restful::Serializer do
342
381
  'href' => "http://test.org/bars/#{@bar2.id}",
343
382
  'bar' => {
344
383
  'id' => @bar2.id,
345
- 'name' => @bar2.name,
346
384
  },
347
385
  },
348
386
  ]
349
387
  end
350
388
  end
351
389
 
352
- it "should hook into activerecord" do
353
- @foo.save!
354
- @foo.should respond_to(:restful)
355
- @foo.restful(:serialization => { :only => :name }).should == {
356
- 'name' => @foo.name,
357
- 'foo' => {
390
+ describe "extensions" do
391
+
392
+ before(:each) do
393
+ Restful.register_web_service('test',
394
+ :resources => {
395
+ :foo => {
396
+ :serialization => { :only => :name },
397
+ :associations => :bars,
398
+ },
399
+ :bar => {
400
+ :serialization => { :only => [:name], :include => { :dingos => { :only => [ :name, :id] } } },
401
+ :associations => [:foo, :dingos],
402
+ },
403
+ }
404
+ )
405
+ @test_ws = Restful.web_service_configuration('test')
406
+ generate_instances
407
+ end
408
+
409
+ it "should hook into activerecord" do
410
+ @foo.should respond_to(:restful)
411
+ result = @foo.restful('test', :serialization => { :only => [:id] })
412
+ result.should == {
358
413
  'name' => @foo.name,
359
- },
360
- 'href' => "http://test.org/foos/#{@foo.id}",
361
- }
362
- end
414
+ 'foo' => {
415
+ 'name' => @foo.name,
416
+ 'id' => @foo.id,
417
+ },
418
+ 'href' => "http://test.org/foos/#{@foo.id}",
419
+ 'bars_href' => "http://test.org/bars",
420
+ }
421
+ # test default web service
422
+ @foo.restful(:serialization => {:only => :id}).should == result
423
+ end
424
+
425
+ it "should hook into associations" do
426
+ result = @foo.bars.restful('test') do |configure|
427
+ configure.serialization.only = []
428
+ end
363
429
 
364
- it "Should hook into associations" do
365
- generate_instances
366
- @foo.bars.restful.should == [
367
- {
368
- "href" => "http://test.org/bars/#{@bar1.id}",
369
- "name" => @bar1.name,
370
- "bar" => {
430
+ result.should == [
431
+ {
432
+ "href" => "http://test.org/bars/#{@bar1.id}",
371
433
  "name" => @bar1.name,
372
- "foo_id" => @bar1.foo_id,
373
- "id" => @bar1.id,
434
+ "bar" => {
435
+ "name" => @bar1.name,
436
+ "foo_id" => @bar1.foo_id,
437
+ "id" => @bar1.id,
438
+ },
374
439
  },
375
- },
376
- {
377
- "href" => "http://test.org/bars/#{@bar2.id}",
378
- "name" => @bar2.name,
379
- "bar" => {
440
+ {
441
+ "href" => "http://test.org/bars/#{@bar2.id}",
380
442
  "name" => @bar2.name,
381
- "foo_id" => @bar2.foo_id,
382
- "id" => @bar2.id,
443
+ "bar" => {
444
+ "name" => @bar2.name,
445
+ "foo_id" => @bar2.foo_id,
446
+ "id" => @bar2.id,
447
+ },
383
448
  },
384
- },
385
- ]
449
+ ]
450
+
451
+ @foo.bars.to_a.restful('test') do |configure|
452
+ configure.serialization.only = []
453
+ end.should == result
454
+ end
455
+
386
456
  end
387
457
 
388
458
  it "should work with AssociationProxy.respond_to" do
389
- pending('associations should respond_to :restful (AR 2.1 issue or AR issue in general?)') do
390
- @foo.bars.should respond_to(:restful)
391
- end
459
+ @foo.bars.should respond_to(:restful)
392
460
  end
461
+
462
+ it "should extend ActiveRecord" do
463
+ @foo.should respond_to(:restful)
464
+ end
465
+
466
+ it "should extend Array" do
467
+ [].should respond_to(:restful)
468
+ end
469
+
393
470
  end
394
471
 
395
472
  describe Restful::DeepHash do
@@ -0,0 +1,66 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe Restful::Configuration::WebService do
4
+
5
+ after(:each) do
6
+ Restful.clear
7
+ end
8
+
9
+ describe "looking up resource configurations" do
10
+
11
+ class Super; end
12
+ class SubClass < Super; end
13
+
14
+ before(:each) do
15
+ @ws = Restful::Configuration::WebService.register('service') do |ws|
16
+ @super_config = ws.register_resource(:super)
17
+ @sub_class_config = ws.register_resource(:sub_class)
18
+ end
19
+ end
20
+
21
+ it "should return nil if no configuration" do
22
+ @ws.resource_configuration_for(nil).should be_nil
23
+ end
24
+
25
+ it "should lookup entries by symbol" do
26
+ @ws.resource_configuration_for(:super).should == @super_config
27
+ end
28
+
29
+ it "should lookup entries from a string" do
30
+ @ws.resource_configuration_for('super').should == @super_config
31
+ end
32
+
33
+ it "should lookup entries by Class" do
34
+ @ws.resource_configuration_for(Super).should == @super_config
35
+ @ws.resource_configuration_for(SubClass).should == @sub_class_config
36
+ end
37
+
38
+ it "should lookup entries by instance class" do
39
+ @ws.resource_configuration_for(Super.new).should == @super_config
40
+ @ws.resource_configuration_for(SubClass.new).should == @sub_class_config
41
+ end
42
+
43
+ end
44
+
45
+ describe "provided resource configurations" do
46
+
47
+ before(:each) do
48
+ @ws = Restful::Configuration::WebService.register('service') do |ws|
49
+ @gold_config = ws.register_resource(:super,
50
+ :serialization => { :only => :foo }
51
+ )
52
+ end
53
+ @config = @ws.resource_configuration_for(:super)
54
+ end
55
+
56
+ it "should produce a clone" do
57
+ @config.should == @gold_config
58
+ @config.should_not equal(@gold_config)
59
+ end
60
+
61
+ it "should produce a deep clone" do
62
+ @config.serialization.should == @gold_config.serialization
63
+ @config.serialization.should_not equal(@gold_config.serialization)
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_serializer
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Partlow
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-19 00:00:00 -07:00
18
+ date: 2011-06-01 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -137,14 +137,17 @@ files:
137
137
  - README.rdoc
138
138
  - Rakefile
139
139
  - lib/restful.rb
140
+ - lib/restful/configuration.rb
140
141
  - lib/restful/serializer.rb
141
142
  - lib/restful/version.rb
142
143
  - restful_serializer.gemspec
144
+ - spec/configuration_spec.rb
143
145
  - spec/database.rb
144
146
  - spec/restful_spec.rb
145
147
  - spec/serializer_spec.rb
146
148
  - spec/spec.opts
147
149
  - spec/spec_helper.rb
150
+ - spec/web_service_spec.rb
148
151
  has_rdoc: true
149
152
  homepage: http://github.com/jpartlow/restful_serializer
150
153
  licenses: []
@@ -183,8 +186,10 @@ signing_key:
183
186
  specification_version: 3
184
187
  summary: Helps with serializing activerecord instances as Restful resources.
185
188
  test_files:
189
+ - spec/configuration_spec.rb
186
190
  - spec/database.rb
187
191
  - spec/restful_spec.rb
188
192
  - spec/serializer_spec.rb
189
193
  - spec/spec.opts
190
194
  - spec/spec_helper.rb
195
+ - spec/web_service_spec.rb