active_model_serializers 0.9.6 → 0.9.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1191ac4c27b87b68e877584e0739eeb45d98652b
4
- data.tar.gz: e22fcf90100f324db9ff4617015e787ddb1186bb
3
+ metadata.gz: 2f73f5aff52f42003b604fcc209782d1b074eb9a
4
+ data.tar.gz: 0fce31e1d5f8f01da8c0c9d70c30fee124dc87ff
5
5
  SHA512:
6
- metadata.gz: 00d60b3ac320a5f50fc2b460ce114a7723f8ed85b5ac94513cd159d50aa86f7587a523c00297048a5bf7938dd78be7eb8ac0c6b78b2104009abc473498b6187a
7
- data.tar.gz: f00ab07a45f77ab3650e26f083d90f38ccf46ee53b55bc4f526f0f74628d4f06abd3df83133388c11bfa2889470e03ecd07b8413a7bc1db10403ea74f15ccde2
6
+ metadata.gz: 983ed0d1faf8a9e4cb9cf65e4d71fdc5064016e42190a81aa96f73a37e1e342eecead421ebe69c04cca27db142a622eb966e9fc04b79cc152af5b744d6f97812
7
+ data.tar.gz: 97accf62bff15dc099483199c8ca58c974fc2ee227f64bdbd10223924cdbaa923d4fb59c5ea5a8973fb5612c50e8ef9abf50f300cc8b6f64b80dd9b3a181829f
@@ -1,6 +1,10 @@
1
1
  ## 0.09.x
2
2
 
3
- ### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...0-9-stable)
3
+ ### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.7...0-9-stable)
4
+
5
+ ### [v0.9.7 (2017-05-01)](https://github.com/rails-api/active_model_serializers/compare/v0.9.6...v0.9.7)
6
+
7
+ - [#2080](https://github.com/rails-api/active_model_serializers/pull/2080) remove `{ payload: nil }` from `!serialize.active_model_serializers` ActiveSupport::Notification. `payload` never had a value. Changes, for example `{ serializer: 'ActiveModel::DefaultSerializer', payload: nil }` to be `{ serializer: 'ActiveModel::DefaultSerializer' }` (@yosiat)
4
8
 
5
9
  ### [v0.9.6 (2017-01-10)](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...v0.9.6)
6
10
 
data/README.md CHANGED
@@ -251,11 +251,11 @@ BlogSerializer.new(object, key_format: :lower_camel)
251
251
 
252
252
  You can specify that serializers use unsuffixed names as association keys by default.
253
253
 
254
- `````ruby
254
+ ```ruby
255
255
  ActiveModel::Serializer.setup do |config|
256
256
  config.default_key_type = :name
257
257
  end
258
- ````
258
+ ```
259
259
 
260
260
  This will build association keys like `comments` or `author` instead of `comment_ids` or `author_id`.
261
261
 
@@ -932,7 +932,7 @@ now generates:
932
932
  class PostSerializer < ApplicationSerializer
933
933
  attributes :id
934
934
  end
935
- ````
935
+ ```
936
936
 
937
937
  # Design and Implementation Guidelines
938
938
 
@@ -64,10 +64,5 @@ module ActiveModel
64
64
  end
65
65
  end
66
66
 
67
- private
68
-
69
- def instrumentation_keys
70
- [:object, :scope, :root, :meta_key, :meta, :each_serializer, :resource_name, :key_format, :context]
71
- end
72
67
  end
73
68
  end
@@ -15,18 +15,14 @@ module ActiveModel
15
15
  end
16
16
 
17
17
  def as_json(options={})
18
- instrument('!serialize') do
18
+ instrument do
19
19
  return [] if @object.nil? && @wrap_in_array
20
20
  hash = @object.as_json
21
21
  @wrap_in_array ? [hash] : hash
22
22
  end
23
23
  end
24
+
24
25
  alias serializable_hash as_json
25
26
  alias serializable_object as_json
26
-
27
- private
28
- def instrumentation_keys
29
- [:object, :wrap_in_array]
30
- end
31
27
  end
32
28
  end
@@ -2,12 +2,14 @@ require 'active_model/serializable/utils'
2
2
 
3
3
  module ActiveModel
4
4
  module Serializable
5
+ INSTRUMENTATION_KEY = '!serialize.active_model_serializers'.freeze
6
+
5
7
  def self.included(base)
6
8
  base.extend Utils
7
9
  end
8
10
 
9
11
  def as_json(options={})
10
- instrument('!serialize') do
12
+ instrument do
11
13
  if root = options.fetch(:root, json_key)
12
14
  hash = { root => serializable_object(options) }
13
15
  hash.merge!(serializable_data)
@@ -19,9 +21,7 @@ module ActiveModel
19
21
  end
20
22
 
21
23
  def serializable_object_with_notification(options={})
22
- instrument('!serialize') do
23
- serializable_object(options)
24
- end
24
+ instrument { serializable_object(options) }
25
25
  end
26
26
 
27
27
  def serializable_data
@@ -33,7 +33,11 @@ module ActiveModel
33
33
  end
34
34
 
35
35
  def namespace
36
- get_namespace && Utils._const_get(get_namespace)
36
+ if module_name = get_namespace
37
+ Serializer.serializers_cache.fetch_or_store(module_name) do
38
+ Utils._const_get(module_name)
39
+ end
40
+ end
37
41
  end
38
42
 
39
43
  def embedded_in_root_associations
@@ -47,16 +51,9 @@ module ActiveModel
47
51
  modules[0..-2].join('::') if modules.size > 1
48
52
  end
49
53
 
50
- def instrument(action, &block)
51
- payload = instrumentation_keys.inject({ serializer: self.class.name }) do |payload, key|
52
- payload[:payload] = self.instance_variable_get(:"@#{key}")
53
- payload
54
- end
55
- ActiveSupport::Notifications.instrument("#{action}.active_model_serializers", payload, &block)
56
- end
57
-
58
- def instrumentation_keys
59
- [:object, :scope, :root, :meta_key, :meta, :wrap_in_array, :only, :except, :key_format]
54
+ def instrument(&block)
55
+ payload = { serializer: self.class.name }
56
+ ActiveSupport::Notifications.instrument(INSTRUMENTATION_KEY, payload, &block)
60
57
  end
61
58
  end
62
59
  end
@@ -4,6 +4,7 @@ require 'active_model/serializer/association'
4
4
  require 'active_model/serializer/config'
5
5
 
6
6
  require 'thread'
7
+ require 'concurrent/map'
7
8
 
8
9
  module ActiveModel
9
10
  class Serializer
@@ -65,7 +66,10 @@ end
65
66
  ArraySerializer
66
67
  end
67
68
  else
68
- _const_get build_serializer_class(resource, options)
69
+ klass_name = build_serializer_class(resource, options)
70
+ Serializer.serializers_cache.fetch_or_store(klass_name) do
71
+ _const_get(klass_name)
72
+ end
69
73
  end
70
74
  end
71
75
 
@@ -100,6 +104,10 @@ end
100
104
  associate(Association::HasMany, *attrs)
101
105
  end
102
106
 
107
+ def serializers_cache
108
+ @serializers_cache ||= Concurrent::Map.new
109
+ end
110
+
103
111
  private
104
112
 
105
113
  def strip_attribute(attr)
@@ -203,7 +211,7 @@ end
203
211
  if included_associations.include? name
204
212
  association_serializer = build_serializer(association)
205
213
  # we must do this always because even if the current association is not
206
- # embeded in root, it might have its own associations that are embeded in root
214
+ # embedded in root, it might have its own associations that are embedded in root
207
215
  hash.merge!(association_serializer.embedded_in_root_associations) do |key, oldval, newval|
208
216
  if oldval.respond_to?(:to_ary)
209
217
  [oldval, newval].flatten.uniq
@@ -12,6 +12,10 @@ module ActiveModel
12
12
  include app.routes.url_helpers
13
13
  end
14
14
  end
15
+
16
+ config.to_prepare do
17
+ ActiveModel::Serializer.serializers_cache.clear
18
+ end
15
19
  end
16
20
  end
17
21
 
@@ -1,5 +1,5 @@
1
1
  module ActiveModel
2
2
  class Serializer
3
- VERSION = '0.9.6'
3
+ VERSION = '0.9.7'
4
4
  end
5
5
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # https://github.com/justinweiss/bulk_cache_fetcher/blob/df1c83e06b9641b7ec3408ec577b37528021190f/lib/bulk_cache_fetcher.rb
2
3
  # Fetches many objects from a cache in order. In the event that some
3
4
  # objects can't be served from the cache, you will have the
@@ -6,7 +7,7 @@
6
7
  # Rails' nested caching while avoiding the n+1 queries problem in the
7
8
  # uncached case.
8
9
  class BulkCacheFetcher
9
- VERSION = '1.0.0'.freeze
10
+ VERSION = '1.0.0'
10
11
 
11
12
  # Creates a new bulk cache fetcher, backed by +cache+. Cache must
12
13
  # respond to the standard Rails cache API, described on
@@ -1,56 +1,56 @@
1
- require 'test_helper'
2
-
3
- # https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/testing/integration.rb
4
- # rubocop:disable Style/ClassAndModuleChildren:
5
- class ActionController::Serialization::HttpCacheTest < ActionController::TestCase
6
- # class ActionController::Serialization::HttpCacheTest < ActionDispatch::IntegrationTest
7
- class HttpCacheTestController < ActionController::Base
8
- class Model < ActiveModelSerializers::Model
9
- attr_accessor :name, :description, :comments
10
- end
11
- class ModelSerializer < ActiveModel::Serializer
12
- attributes :name, :description, :comments
13
- end
14
-
15
- def render_as_serializable_object
16
- render serialization_options.merge!(json: model)
17
- end
18
-
19
- def render_as_json_string
20
- json = ActiveModelSerializers::SerializableResource.new(model, serialization_options).to_json
21
- render json: json
22
- end
23
-
24
- private
25
-
26
- def model
27
- Model.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
28
- end
29
-
30
- def serialization_options
31
- { serializer: ModelSerializer, adapter: :json }
32
- end
33
- end
34
-
35
- tests HttpCacheTestController
36
-
37
- DATE = 'Date'.freeze
38
- LAST_MODIFIED = 'Last-Modified'.freeze
39
- ETAG = 'ETag'.freeze
40
- CACHE_CONTROL = 'Cache-Control'.freeze
41
- SPECIAL_KEYS = Set.new(%w(extras no-cache max-age public must-revalidate))
42
- def test_render_as_serializable_object
43
- 10.times do
44
- get :render_as_serializable_object
45
- end
46
- p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
47
- end
48
-
49
- def test_render_as_json_string
50
- 10.times do
51
- get :render_as_json_string
52
- end
53
- p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
54
- end
55
- end
56
- # rubocop:enable Style/ClassAndModuleChildren:
1
+ # require 'test_helper'
2
+ #
3
+ # # https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/testing/integration.rb
4
+ # # rubocop:disable Style/ClassAndModuleChildren:
5
+ # class ActionController::Serialization::HttpCacheTest < ActionController::TestCase
6
+ # # class ActionController::Serialization::HttpCacheTest < ActionDispatch::IntegrationTest
7
+ # class HttpCacheTestController < ActionController::Base
8
+ # class Model < ActiveModelSerializers::Model
9
+ # attr_accessor :name, :description, :comments
10
+ # end
11
+ # class ModelSerializer < ActiveModel::Serializer
12
+ # attributes :name, :description, :comments
13
+ # end
14
+ #
15
+ # def render_as_serializable_object
16
+ # render serialization_options.merge!(json: model)
17
+ # end
18
+ #
19
+ # def render_as_json_string
20
+ # json = ActiveModelSerializers::SerializableResource.new(model, serialization_options).to_json
21
+ # render json: json
22
+ # end
23
+ #
24
+ # private
25
+ #
26
+ # def model
27
+ # Model.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
28
+ # end
29
+ #
30
+ # def serialization_options
31
+ # { serializer: ModelSerializer, adapter: :json }
32
+ # end
33
+ # end
34
+ #
35
+ # tests HttpCacheTestController
36
+ #
37
+ # DATE = 'Date'.freeze
38
+ # LAST_MODIFIED = 'Last-Modified'.freeze
39
+ # ETAG = 'ETag'.freeze
40
+ # CACHE_CONTROL = 'Cache-Control'.freeze
41
+ # SPECIAL_KEYS = Set.new(%w(extras no-cache max-age public must-revalidate))
42
+ # def test_render_as_serializable_object
43
+ # 10.times do
44
+ # get :render_as_serializable_object
45
+ # end
46
+ # p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
47
+ # end
48
+ #
49
+ # def test_render_as_json_string
50
+ # 10.times do
51
+ # get :render_as_json_string
52
+ # end
53
+ # p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
54
+ # end
55
+ # end
56
+ # # rubocop:enable Style/ClassAndModuleChildren:
@@ -0,0 +1,35 @@
1
+ # require 'test_helper'
2
+ #
3
+ # module ActionController
4
+ # module Serialization
5
+ # class ImplicitSerializerTest < ActionController::TestCase
6
+ # class PostWithoutSerializer < ActiveRecord::Base
7
+ # self.table_name = :posts
8
+ # end
9
+ # class ImplicitSerializationTestController < ActionController::Base
10
+ # def render_record_without_serializer
11
+ # @post = PostWithoutSerializer.new(title: 'Title', body: 'Body')
12
+ # render json: @post
13
+ # end
14
+ # end
15
+ #
16
+ # tests ImplicitSerializationTestController
17
+ #
18
+ # def test_record_without_serializer
19
+ # with_adapter :json do
20
+ # get :render_record_without_serializer
21
+ # end
22
+ #
23
+ # expected = {}
24
+ # PostWithoutSerializer.column_names.each { |field| expected[field] ||= nil }
25
+ # expected.update(
26
+ # title: 'Title',
27
+ # body: 'Body'
28
+ # )
29
+ #
30
+ # assert_equal 'application/json', @response.content_type
31
+ # assert_equal expected.to_json, @response.body
32
+ # end
33
+ # end
34
+ # end
35
+ # end
@@ -0,0 +1,60 @@
1
+ # https://github.com/rails-api/active_model_serializers/pull/872
2
+ # approx ref 792fb8a9053f8db3c562dae4f40907a582dd1720 to test against
3
+ require 'bundler/setup'
4
+
5
+ require 'rails'
6
+ require 'active_model'
7
+ require 'active_support'
8
+ require 'active_support/json'
9
+ require 'action_controller'
10
+ require 'action_controller/test_case'
11
+ require 'action_controller/railtie'
12
+ abort "Rails application already defined: #{Rails.application.class}" if Rails.application
13
+
14
+ class NullLogger < Logger
15
+ def initialize(*_args)
16
+ end
17
+
18
+ def add(*_args, &_block)
19
+ end
20
+ end
21
+ class BenchmarkLogger < ActiveSupport::Logger
22
+ def initialize
23
+ @file = StringIO.new
24
+ super(@file)
25
+ end
26
+
27
+ def messages
28
+ @file.rewind
29
+ @file.read
30
+ end
31
+ end
32
+ # ref: https://gist.github.com/bf4/8744473
33
+ class BenchmarkApp < Rails::Application
34
+ # Set up production configuration
35
+ config.eager_load = true
36
+ config.cache_classes = true
37
+ # CONFIG: CACHE_ON={on,off}
38
+ config.action_controller.perform_caching = ENV['CACHE_ON'] != 'off'
39
+ config.action_controller.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
40
+
41
+ config.active_support.test_order = :random
42
+ config.secret_token = 'S' * 30
43
+ config.secret_key_base = 'abc123'
44
+ config.consider_all_requests_local = false
45
+
46
+ # otherwise deadlock occurred
47
+ config.middleware.delete 'Rack::Lock'
48
+
49
+ # to disable log files
50
+ config.logger = NullLogger.new
51
+ config.active_support.deprecation = :log
52
+ config.log_level = :info
53
+ end
54
+
55
+ require 'active_model_serializers'
56
+
57
+ # Initialize app before any serializers are defined, for running across revisions.
58
+ # ref: https://github.com/rails-api/active_model_serializers/pull/1478
59
+ Rails.application.initialize!
60
+
@@ -0,0 +1,67 @@
1
+ require 'benchmark/ips'
2
+ require 'json'
3
+
4
+ # Add benchmarking runner from ruby-bench-suite
5
+ # https://github.com/ruby-bench/ruby-bench-suite/blob/master/rails/benchmarks/support/benchmark_rails.rb
6
+ module Benchmark
7
+ module ActiveModelSerializers
8
+ module TestMethods
9
+ def request(method, path)
10
+ response = Rack::MockRequest.new(BenchmarkApp).send(method, path)
11
+ if response.status.in?([404, 500])
12
+ fail "omg, #{method}, #{path}, '#{response.status}', '#{response.body}'"
13
+ end
14
+ response
15
+ end
16
+ end
17
+
18
+ # extend Benchmark with an `ams` method
19
+ def ams(label = nil, time:, disable_gc: true, warmup: 3, &block)
20
+ fail ArgumentError.new, 'block should be passed' unless block_given?
21
+
22
+ if disable_gc
23
+ GC.disable
24
+ else
25
+ GC.enable
26
+ end
27
+
28
+ report = Benchmark.ips(time, warmup, true) do |x|
29
+ x.report(label) { yield }
30
+ end
31
+
32
+ entry = report.entries.first
33
+
34
+ output = {
35
+ label: label,
36
+ version: ::ActiveModel::Serializer::VERSION.to_s,
37
+ rails_version: ::Rails.version.to_s,
38
+ iterations_per_second: entry.ips,
39
+ iterations_per_second_standard_deviation: entry.error_percentage,
40
+ total_allocated_objects_per_iteration: count_total_allocated_objects(&block)
41
+ }.to_json
42
+
43
+ puts output
44
+ output
45
+ end
46
+
47
+ def count_total_allocated_objects
48
+ if block_given?
49
+ key =
50
+ if RUBY_VERSION < '2.2'
51
+ :total_allocated_object
52
+ else
53
+ :total_allocated_objects
54
+ end
55
+
56
+ before = GC.stat[key]
57
+ yield
58
+ after = GC.stat[key]
59
+ after - before
60
+ else
61
+ -1
62
+ end
63
+ end
64
+ end
65
+
66
+ extend Benchmark::ActiveModelSerializers
67
+ end
@@ -0,0 +1,41 @@
1
+ require_relative './benchmarking_support'
2
+ require_relative './app'
3
+ require_relative './setup'
4
+
5
+ time = 10
6
+ disable_gc = true
7
+
8
+
9
+
10
+ authors_query = Author.preload(:posts).preload(:profile)
11
+ author = authors_query.first
12
+ authors = authors_query.to_a
13
+
14
+
15
+ Benchmark.ams('Single: DefaultSerializer', time: time, disable_gc: disable_gc) do
16
+ ActiveModel::DefaultSerializer.new(author).to_json
17
+ end
18
+
19
+ Benchmark.ams('ArraySerializer', time: time, disable_gc: disable_gc) do
20
+ ActiveModel::ArraySerializer.new(authors).to_json
21
+ end
22
+
23
+ Benchmark.ams('ArraySerializer: each_serializer: DefaultSerializer', time: time, disable_gc: disable_gc) do
24
+ ActiveModel::ArraySerializer.new(authors, each_serializer:ActiveModel::DefaultSerializer).to_json
25
+ end
26
+
27
+ Benchmark.ams('FlatAuthorSerializer', time: time, disable_gc: disable_gc) do
28
+ FlatAuthorSerializer.new(author).to_json
29
+ end
30
+
31
+ Benchmark.ams('ArraySerializer: each_serializer: FlatAuthorSerializer', time: time, disable_gc: disable_gc) do
32
+ ActiveModel::ArraySerializer.new(authors, each_serializer: FlatAuthorSerializer).to_json
33
+ end
34
+
35
+ Benchmark.ams('AuthorWithDefaultRelationshipsSerializer', time: time, disable_gc: disable_gc) do
36
+ AuthorWithDefaultRelationshipsSerializer.new(author).to_json
37
+ end
38
+
39
+ Benchmark.ams('ArraySerializer: each_serializer: AuthorWithDefaultRelationshipsSerializer', time: time, disable_gc: disable_gc) do
40
+ ActiveModel::ArraySerializer.new(authors, each_serializer: AuthorWithDefaultRelationshipsSerializer).to_json
41
+ end
@@ -0,0 +1,75 @@
1
+ ###########################################
2
+ # Setup active record models
3
+ ##########################################
4
+ require 'active_record'
5
+ require 'sqlite3'
6
+
7
+
8
+ # Change the following to reflect your database settings
9
+ ActiveRecord::Base.establish_connection(
10
+ adapter: 'sqlite3',
11
+ database: ':memory:'
12
+ )
13
+
14
+ # Don't show migration output when constructing fake db
15
+ ActiveRecord::Migration.verbose = false
16
+
17
+ ActiveRecord::Schema.define do
18
+ create_table :authors, force: true do |t|
19
+ t.string :name
20
+ end
21
+
22
+ create_table :posts, force: true do |t|
23
+ t.text :body
24
+ t.string :title
25
+ t.references :author
26
+ end
27
+
28
+ create_table :profiles, force: true do |t|
29
+ t.text :project_url
30
+ t.text :bio
31
+ t.date :birthday
32
+ t.references :author
33
+ end
34
+ end
35
+
36
+ class Author < ActiveRecord::Base
37
+ has_one :profile
38
+ has_many :posts
39
+ end
40
+
41
+ class Post < ActiveRecord::Base
42
+ belongs_to :author
43
+ end
44
+
45
+ class Profile < ActiveRecord::Base
46
+ belongs_to :author
47
+ end
48
+
49
+ # Build out the data to serialize
50
+ author = Author.create(name: 'Preston Sego')
51
+ Profile.create(project_url: 'https://github.com/NullVoxPopuli', author: author)
52
+ 50.times do
53
+ Post.create(
54
+ body: 'something about how password restrictions are evil, and less secure, and with the math to prove it.',
55
+ title: 'Your bank is does not know how to do security',
56
+ author: author
57
+ )
58
+ end
59
+
60
+ ActiveModel::Serializer.root = false
61
+ ActiveModel::ArraySerializer.root = false
62
+
63
+ class FlatAuthorSerializer < ActiveModel::Serializer
64
+ attributes :id, :name
65
+ end
66
+
67
+ class AuthorWithDefaultRelationshipsSerializer < ActiveModel::Serializer
68
+ attributes :id, :name
69
+
70
+ has_one :profile
71
+ has_many :posts
72
+ end
73
+
74
+ # For debugging SQL output
75
+ #ActiveRecord::Base.logger = Logger.new(STDERR)
@@ -49,7 +49,7 @@ end
49
49
 
50
50
  class SpecialPost < Post
51
51
  def special_comment
52
- @speical_comment ||= Comment.new(content: 'special')
52
+ @special_comment ||= Comment.new(content: 'special')
53
53
  end
54
54
  end
55
55
 
@@ -0,0 +1,50 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class SerializableTest
5
+ class InstrumentationTest < Minitest::Test
6
+ def setup
7
+ @events = []
8
+
9
+ @subscriber = ActiveSupport::Notifications.subscribe('!serialize.active_model_serializers') do |name, start, finish, id, payload|
10
+ @events << { name: name, serializer: payload[:serializer] }
11
+ end
12
+ end
13
+
14
+ def teardown
15
+ ActiveSupport::Notifications.unsubscribe(@subscriber) if defined?(@subscriber)
16
+ end
17
+
18
+ def test_instruments_default_serializer
19
+ DefaultSerializer.new(1).as_json
20
+
21
+ assert_equal [{ name: '!serialize.active_model_serializers', serializer: 'ActiveModel::DefaultSerializer' }], @events
22
+ end
23
+
24
+ def test_instruments_serializer
25
+ profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
26
+ serializer = ProfileSerializer.new(profile)
27
+
28
+ serializer.as_json
29
+
30
+ assert_equal [{ name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' }], @events
31
+ end
32
+
33
+ def test_instruments_array_serializer
34
+ profiles = [
35
+ Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
36
+ Profile.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2')
37
+ ]
38
+ serializer = ArraySerializer.new(profiles)
39
+
40
+ serializer.as_json
41
+
42
+ assert_equal [
43
+ { name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' },
44
+ { name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' },
45
+ { name: '!serialize.active_model_serializers', serializer: 'ActiveModel::ArraySerializer' }
46
+ ], @events
47
+ end
48
+ end
49
+ end
50
+ 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.9.6
4
+ version: 0.9.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-10 00:00:00.000000000 Z
13
+ date: 2017-05-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -26,6 +26,20 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '3.2'
29
+ - !ruby/object:Gem::Dependency
30
+ name: concurrent-ruby
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
29
43
  - !ruby/object:Gem::Dependency
30
44
  name: rails
31
45
  requirement: !ruby/object:Gem::Requirement
@@ -77,7 +91,12 @@ files:
77
91
  - lib/active_model_serializers.rb
78
92
  - lib/bulk_cache_fetcher.rb
79
93
  - test/action_controller/http_cache_test.rb
94
+ - test/action_controller/regression_test.rb
95
+ - test/benchmark/app.rb
96
+ - test/benchmark/benchmarking_support.rb
97
+ - test/benchmark/bm_active_record.rb
80
98
  - test/benchmark/bm_rails_cache.rb
99
+ - test/benchmark/setup.rb
81
100
  - test/benchmark/tmp/miniprofiler/mp_timers_16x1i2wkkt8b8zybbfbx
82
101
  - test/benchmark/tmp/miniprofiler/mp_timers_3aa299ezxdqvog6sfjzr
83
102
  - test/benchmark/tmp/miniprofiler/mp_timers_3f0bdfx4nib4hxfb5lmq
@@ -145,6 +164,7 @@ files:
145
164
  - test/unit/active_model/serializer/root_test.rb
146
165
  - test/unit/active_model/serializer/scope_test.rb
147
166
  - test/unit/active_model/serializer/url_helpers_test.rb
167
+ - test/unit/active_model/serilizable_test.rb
148
168
  homepage: https://github.com/rails-api/active_model_serializers
149
169
  licenses:
150
170
  - MIT
@@ -172,7 +192,12 @@ summary: Bringing consistency and object orientation to model serialization. Wor
172
192
  great for client-side MVC frameworks!
173
193
  test_files:
174
194
  - test/action_controller/http_cache_test.rb
195
+ - test/action_controller/regression_test.rb
196
+ - test/benchmark/app.rb
197
+ - test/benchmark/benchmarking_support.rb
198
+ - test/benchmark/bm_active_record.rb
175
199
  - test/benchmark/bm_rails_cache.rb
200
+ - test/benchmark/setup.rb
176
201
  - test/benchmark/tmp/miniprofiler/mp_timers_16x1i2wkkt8b8zybbfbx
177
202
  - test/benchmark/tmp/miniprofiler/mp_timers_3aa299ezxdqvog6sfjzr
178
203
  - test/benchmark/tmp/miniprofiler/mp_timers_3f0bdfx4nib4hxfb5lmq
@@ -240,3 +265,4 @@ test_files:
240
265
  - test/unit/active_model/serializer/root_test.rb
241
266
  - test/unit/active_model/serializer/scope_test.rb
242
267
  - test/unit/active_model/serializer/url_helpers_test.rb
268
+ - test/unit/active_model/serilizable_test.rb