active_model_serializers 0.5.1 → 0.5.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.markdown CHANGED
@@ -126,12 +126,12 @@ class PostSerializer < ActiveModel::Serializer
126
126
 
127
127
  # only let the user see comments he created.
128
128
  def comments
129
- post.comments.where(:created_by => @scope)
129
+ post.comments.where(:created_by => options[:scope])
130
130
  end
131
131
  end
132
132
  ```
133
133
 
134
- In a serializer, `@scope` is the current authorization scope (usually
134
+ In a serializer, `options[:scope]` is the current authorization scope (usually
135
135
  `current_user`), which the controller gives to the serializer when you call
136
136
  `render :json`
137
137
 
@@ -219,11 +219,11 @@ this:
219
219
  "id": 1,
220
220
  "title": "New post",
221
221
  "body": "A body!",
222
- "comments": [ 1 ]
222
+ "comments": [ 1, 2 ]
223
223
  },
224
224
  "comments": [
225
225
  { "id": 1, "body": "what a dumb post", "tags": [ 1, 2 ] },
226
- { "id": 1, "body": "i liked it", "tags": [ 1, 3 ] },
226
+ { "id": 2, "body": "i liked it", "tags": [ 1, 3 ] },
227
227
  ],
228
228
  "tags": [
229
229
  { "id": 1, "name": "short" },
@@ -41,7 +41,7 @@ module ActionController
41
41
 
42
42
  def _render_option_json(json, options)
43
43
  if json.respond_to?(:to_ary)
44
- options[:root] ||= controller_name
44
+ options[:root] ||= controller_name unless options[:root] == false
45
45
  end
46
46
 
47
47
  serializer = options.delete(:serializer) ||
@@ -52,7 +52,15 @@ module ActiveModel
52
52
  @options[:hash] = hash = {}
53
53
  @options[:unique_values] = {}
54
54
 
55
- array = serializable_array.map(&:serializable_hash)
55
+ array = serializable_array.map do |item|
56
+ if item.is_a?(Hash)
57
+ item
58
+ elsif item.respond_to?(:serializable_hash)
59
+ item.serializable_hash
60
+ else
61
+ item.as_json
62
+ end
63
+ end
56
64
 
57
65
  if root = @options[:root]
58
66
  hash.merge!(root => array)
@@ -91,7 +99,7 @@ module ActiveModel
91
99
  # end
92
100
  #
93
101
  # def author?
94
- # post.author == scope
102
+ # post.author == options[:scope]
95
103
  # end
96
104
  # end
97
105
  #
@@ -402,9 +410,13 @@ module ActiveModel
402
410
  # Returns a hash representation of the serializable
403
411
  # object without the root.
404
412
  def serializable_hash
405
- node = attributes
406
- include_associations!(node) if _embed
407
- node
413
+ instrument(:serialize, :serializer => self.class.name) do
414
+ node = attributes
415
+ instrument :associations do
416
+ include_associations!(node) if _embed
417
+ end
418
+ node
419
+ end
408
420
  end
409
421
 
410
422
  def include_associations!(node)
@@ -505,6 +517,12 @@ module ActiveModel
505
517
  end
506
518
 
507
519
  alias :read_attribute_for_serialization :send
520
+
521
+ # Use ActiveSupport::Notifications to send events to external systems.
522
+ # The event name is: name.class_name.serializer
523
+ def instrument(name, payload = {}, &block)
524
+ ActiveSupport::Notifications.instrument("#{name}.serializer", payload, &block)
525
+ end
508
526
  end
509
527
  end
510
528
 
@@ -1,5 +1,5 @@
1
1
  module ActiveModel
2
2
  class Serializer
3
- VERSION = "0.5.1"
3
+ VERSION = "0.5.2"
4
4
  end
5
5
  end
@@ -1,5 +1,6 @@
1
1
  require "active_support"
2
2
  require "active_support/core_ext/string/inflections"
3
+ require "active_support/notifications"
3
4
  require "active_model"
4
5
  require "active_model/serializer"
5
6
 
@@ -7,6 +8,8 @@ if defined?(Rails)
7
8
  module ActiveModel
8
9
  class Railtie < Rails::Railtie
9
10
  generators do |app|
11
+ app ||= Rails.application # Rails 3.0.x does not yield `app`
12
+
10
13
  Rails::Generators.configure!(app.config.generators)
11
14
  require "generators/resource_override"
12
15
  end
@@ -17,7 +17,7 @@ module Rails
17
17
  private
18
18
 
19
19
  def attributes_names
20
- attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym }
20
+ [:id] + attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym }
21
21
  end
22
22
 
23
23
  def association_names
@@ -1,9 +1,8 @@
1
1
  <% module_namespacing do -%>
2
2
  class <%= class_name %>Serializer < <%= parent_class_name %>
3
- <% if attributes.any? -%> attributes <%= attributes_names.map(&:inspect).join(", ") %>
4
- <% end -%>
3
+ attributes <%= attributes_names.map(&:inspect).join(", ") %>
5
4
  <% association_names.each do |attribute| -%>
6
5
  has_one :<%= attribute %>
7
6
  <% end -%>
8
7
  end
9
- <% end -%>
8
+ <% end -%>
@@ -185,24 +185,6 @@ class AssociationTest < ActiveModel::TestCase
185
185
  }, @root_hash)
186
186
  end
187
187
 
188
- def test_with_default_has_one_with_custom_key
189
- @post_serializer_class.class_eval do
190
- has_one :comment, :key => :custom_comment
191
- end
192
-
193
- include! :comment
194
-
195
- assert_equal({
196
- :custom_comment => 1
197
- }, @hash)
198
-
199
- assert_equal({
200
- :custom_comments => [
201
- { :id => 1, :body => "ZOMG A COMMENT" }
202
- ]
203
- }, @root_hash)
204
- end
205
-
206
188
  def test_embed_objects_for_has_many_associations
207
189
  @post_serializer_class.class_eval do
208
190
  has_many :comments, :embed => :objects
@@ -55,13 +55,13 @@ class SerializerGeneratorTest < Rails::Generators::TestCase
55
55
  def test_generates_attributes_and_associations
56
56
  run_generator
57
57
  assert_file "app/serializers/account_serializer.rb" do |serializer|
58
- assert_match(/^ attributes :name, :description$/, serializer)
58
+ assert_match(/^ attributes :id, :name, :description$/, serializer)
59
59
  assert_match(/^ has_one :business$/, serializer)
60
60
  end
61
61
  end
62
62
 
63
63
  def test_with_no_attributes_does_not_add_extra_space
64
64
  run_generator ["account"]
65
- assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer\nend/
65
+ assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer\n attributes :id\nend/
66
66
  end
67
67
  end
@@ -140,6 +140,11 @@ class RenderJsonTest < ActionController::TestCase
140
140
  render :json => HypermediaSerializable.new
141
141
  end
142
142
 
143
+ def render_json_array_with_no_root
144
+ render :json => [], :root => false
145
+ end
146
+
147
+
143
148
  private
144
149
  def default_serializer_options
145
150
  if params[:check_defaults]
@@ -217,7 +222,7 @@ class RenderJsonTest < ActionController::TestCase
217
222
  assert_match '"object":{"serializable_object":true}', @response.body
218
223
  end
219
224
 
220
- def test_render_json_with_serializer
225
+ def test_render_json_with_serializer_checking_defaults
221
226
  get :render_json_with_serializer, :check_defaults => true
222
227
  assert_match '"scope":{"current_user":true}', @response.body
223
228
  assert_match '"object":{"serializable_object":true}', @response.body
@@ -250,4 +255,9 @@ class RenderJsonTest < ActionController::TestCase
250
255
  get :render_json_with_links
251
256
  assert_match '{"link":"http://www.nextangle.com/hypermedia"}', @response.body
252
257
  end
258
+
259
+ def test_render_json_array_with_no_root
260
+ get :render_json_array_with_no_root
261
+ assert_equal '[]', @response.body
262
+ end
253
263
  end
@@ -71,8 +71,8 @@ class SerializerTest < ActiveModel::TestCase
71
71
  end
72
72
 
73
73
  class CommentSerializer
74
- def initialize(comment, scope, options={})
75
- @comment, @scope = comment, scope
74
+ def initialize(comment, options={})
75
+ @comment = comment
76
76
  end
77
77
 
78
78
  def serializable_hash
@@ -375,21 +375,22 @@ class SerializerTest < ActiveModel::TestCase
375
375
  }, serializer.as_json)
376
376
  end
377
377
 
378
+ # serialize different typed objects
378
379
  def test_array_serializer
379
380
  model = Model.new
380
381
  user = User.new
381
382
  comments = Comment.new(:title => "Comment1", :id => 1)
382
383
 
383
384
  array = [model, user, comments]
384
- serializer = array.active_model_serializer.new(array, {:scope => true})
385
+ serializer = array.active_model_serializer.new(array, :scope => {:scope => true})
385
386
  assert_equal([
386
387
  { :model => "Model" },
387
- { :user => { :last_name=>"Valim", :ok=>true, :first_name=>"Jose", :scope => true } },
388
- { :comment => { :title => "Comment1" } }
388
+ { :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true },
389
+ { :title => "Comment1" }
389
390
  ], serializer.as_json)
390
391
  end
391
392
 
392
- def test_array_serializer
393
+ def test_array_serializer_with_root
393
394
  comment1 = Comment.new(:title => "Comment1", :id => 1)
394
395
  comment2 = Comment.new(:title => "Comment2", :id => 2)
395
396
 
@@ -403,6 +404,13 @@ class SerializerTest < ActiveModel::TestCase
403
404
  ]}, serializer.as_json)
404
405
  end
405
406
 
407
+ def test_array_serializer_with_hash
408
+ hash = {:value => "something"}
409
+ array = [hash]
410
+ serializer = array.active_model_serializer.new(array, :root => :items)
411
+ assert_equal({ :items => [ hash ]}, serializer.as_json)
412
+ end
413
+
406
414
  class CustomBlog < Blog
407
415
  attr_accessor :public_posts, :public_user
408
416
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-23 00:00:00.000000000 Z
13
+ date: 2012-06-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
17
- requirement: &2153228860 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: '3.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2153228860
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '3.0'
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: rails
28
- requirement: &2153227780 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ~>
@@ -33,7 +38,12 @@ dependencies:
33
38
  version: '3.0'
34
39
  type: :development
35
40
  prerelease: false
36
- version_requirements: *2153227780
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
37
47
  description: Making it easy to serialize models for client-side use
38
48
  email:
39
49
  - jose.valim@gmail.com
@@ -85,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
95
  version: '0'
86
96
  requirements: []
87
97
  rubyforge_project:
88
- rubygems_version: 1.8.15
98
+ rubygems_version: 1.8.24
89
99
  signing_key:
90
100
  specification_version: 3
91
101
  summary: Bringing consistency and object orientation to model serialization. Works
@@ -97,4 +107,3 @@ test_files:
97
107
  - test/serializer_support_test.rb
98
108
  - test/serializer_test.rb
99
109
  - test/test_helper.rb
100
- has_rdoc: