active_model_serializers 0.10.0 → 0.10.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.
Files changed (171) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +6 -5
  3. data/.travis.yml +30 -21
  4. data/CHANGELOG.md +172 -2
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +23 -4
  7. data/README.md +166 -28
  8. data/Rakefile +3 -32
  9. data/active_model_serializers.gemspec +22 -25
  10. data/appveyor.yml +10 -6
  11. data/bin/rubocop +38 -0
  12. data/docs/README.md +2 -1
  13. data/docs/general/adapters.md +35 -11
  14. data/docs/general/caching.md +7 -1
  15. data/docs/general/configuration_options.md +86 -1
  16. data/docs/general/deserialization.md +1 -1
  17. data/docs/general/fields.md +31 -0
  18. data/docs/general/getting_started.md +1 -1
  19. data/docs/general/logging.md +7 -0
  20. data/docs/general/rendering.md +63 -25
  21. data/docs/general/serializers.md +125 -14
  22. data/docs/howto/add_pagination_links.md +16 -17
  23. data/docs/howto/add_relationship_links.md +140 -0
  24. data/docs/howto/add_root_key.md +11 -0
  25. data/docs/howto/grape_integration.md +42 -0
  26. data/docs/howto/outside_controller_use.md +12 -4
  27. data/docs/howto/passing_arbitrary_options.md +2 -2
  28. data/docs/howto/serialize_poro.md +46 -5
  29. data/docs/howto/test.md +2 -0
  30. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  31. data/docs/integrations/ember-and-json-api.md +67 -32
  32. data/docs/jsonapi/schema.md +1 -1
  33. data/lib/action_controller/serialization.rb +13 -3
  34. data/lib/active_model/serializer/adapter/base.rb +2 -0
  35. data/lib/active_model/serializer/array_serializer.rb +8 -5
  36. data/lib/active_model/serializer/association.rb +62 -10
  37. data/lib/active_model/serializer/belongs_to_reflection.rb +4 -3
  38. data/lib/active_model/serializer/collection_serializer.rb +39 -13
  39. data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +82 -115
  40. data/lib/active_model/serializer/error_serializer.rb +11 -7
  41. data/lib/active_model/serializer/errors_serializer.rb +25 -20
  42. data/lib/active_model/serializer/has_many_reflection.rb +3 -3
  43. data/lib/active_model/serializer/has_one_reflection.rb +1 -4
  44. data/lib/active_model/serializer/lazy_association.rb +95 -0
  45. data/lib/active_model/serializer/lint.rb +134 -130
  46. data/lib/active_model/serializer/reflection.rb +127 -67
  47. data/lib/active_model/serializer/version.rb +1 -1
  48. data/lib/active_model/serializer.rb +297 -79
  49. data/lib/active_model_serializers/adapter/attributes.rb +3 -66
  50. data/lib/active_model_serializers/adapter/base.rb +39 -39
  51. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +2 -2
  52. data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
  53. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +47 -21
  54. data/lib/active_model_serializers/adapter/json_api/relationship.rb +75 -23
  55. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +39 -10
  56. data/lib/active_model_serializers/adapter/json_api.rb +71 -57
  57. data/lib/active_model_serializers/adapter.rb +6 -0
  58. data/lib/active_model_serializers/deprecate.rb +1 -2
  59. data/lib/active_model_serializers/deserialization.rb +2 -0
  60. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  61. data/lib/active_model_serializers/model.rb +109 -28
  62. data/lib/active_model_serializers/railtie.rb +3 -1
  63. data/lib/active_model_serializers/register_jsonapi_renderer.rb +44 -31
  64. data/lib/active_model_serializers/serializable_resource.rb +6 -5
  65. data/lib/active_model_serializers/serialization_context.rb +10 -3
  66. data/lib/active_model_serializers/test/schema.rb +2 -2
  67. data/lib/active_model_serializers.rb +16 -1
  68. data/lib/generators/rails/resource_override.rb +1 -1
  69. data/lib/generators/rails/serializer_generator.rb +4 -4
  70. data/lib/grape/active_model_serializers.rb +7 -5
  71. data/lib/grape/formatters/active_model_serializers.rb +19 -2
  72. data/lib/grape/helpers/active_model_serializers.rb +1 -0
  73. data/lib/tasks/rubocop.rake +53 -0
  74. data/test/action_controller/adapter_selector_test.rb +14 -5
  75. data/test/action_controller/explicit_serializer_test.rb +5 -4
  76. data/test/action_controller/json/include_test.rb +106 -27
  77. data/test/action_controller/json_api/deserialization_test.rb +1 -1
  78. data/test/action_controller/json_api/errors_test.rb +8 -9
  79. data/test/action_controller/json_api/fields_test.rb +66 -0
  80. data/test/action_controller/json_api/linked_test.rb +29 -24
  81. data/test/action_controller/json_api/pagination_test.rb +31 -23
  82. data/test/action_controller/json_api/transform_test.rb +11 -3
  83. data/test/action_controller/lookup_proc_test.rb +49 -0
  84. data/test/action_controller/namespace_lookup_test.rb +232 -0
  85. data/test/action_controller/serialization_scope_name_test.rb +12 -6
  86. data/test/action_controller/serialization_test.rb +12 -9
  87. data/test/active_model_serializers/json_pointer_test.rb +15 -13
  88. data/test/active_model_serializers/model_test.rb +137 -4
  89. data/test/active_model_serializers/railtie_test_isolated.rb +12 -7
  90. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  91. data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
  92. data/test/active_model_serializers/test/schema_test.rb +3 -2
  93. data/test/adapter/attributes_test.rb +40 -0
  94. data/test/adapter/json/collection_test.rb +14 -0
  95. data/test/adapter/json/has_many_test.rb +10 -2
  96. data/test/adapter/json/transform_test.rb +15 -15
  97. data/test/adapter/json_api/collection_test.rb +4 -3
  98. data/test/adapter/json_api/errors_test.rb +17 -19
  99. data/test/adapter/json_api/fields_test.rb +12 -3
  100. data/test/adapter/json_api/has_many_test.rb +49 -20
  101. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +213 -0
  102. data/test/adapter/json_api/json_api_test.rb +5 -7
  103. data/test/adapter/json_api/linked_test.rb +33 -12
  104. data/test/adapter/json_api/links_test.rb +4 -2
  105. data/test/adapter/json_api/pagination_links_test.rb +53 -13
  106. data/test/adapter/json_api/parse_test.rb +1 -1
  107. data/test/adapter/json_api/relationship_test.rb +309 -73
  108. data/test/adapter/json_api/resource_meta_test.rb +3 -3
  109. data/test/adapter/json_api/transform_test.rb +263 -253
  110. data/test/adapter/json_api/type_test.rb +168 -36
  111. data/test/adapter/json_test.rb +8 -7
  112. data/test/adapter/null_test.rb +1 -2
  113. data/test/adapter/polymorphic_test.rb +52 -5
  114. data/test/adapter_test.rb +1 -1
  115. data/test/benchmark/app.rb +1 -1
  116. data/test/benchmark/benchmarking_support.rb +1 -1
  117. data/test/benchmark/bm_active_record.rb +81 -0
  118. data/test/benchmark/bm_adapter.rb +38 -0
  119. data/test/benchmark/bm_caching.rb +16 -16
  120. data/test/benchmark/bm_lookup_chain.rb +83 -0
  121. data/test/benchmark/bm_transform.rb +21 -10
  122. data/test/benchmark/controllers.rb +16 -17
  123. data/test/benchmark/fixtures.rb +72 -72
  124. data/test/cache_test.rb +235 -69
  125. data/test/collection_serializer_test.rb +31 -14
  126. data/test/fixtures/active_record.rb +45 -10
  127. data/test/fixtures/poro.rb +124 -181
  128. data/test/generators/serializer_generator_test.rb +23 -5
  129. data/test/grape_test.rb +170 -56
  130. data/test/lint_test.rb +1 -1
  131. data/test/logger_test.rb +13 -11
  132. data/test/serializable_resource_test.rb +18 -22
  133. data/test/serializers/association_macros_test.rb +3 -2
  134. data/test/serializers/associations_test.rb +222 -49
  135. data/test/serializers/attribute_test.rb +5 -3
  136. data/test/serializers/attributes_test.rb +1 -1
  137. data/test/serializers/caching_configuration_test_isolated.rb +6 -6
  138. data/test/serializers/fieldset_test.rb +1 -1
  139. data/test/serializers/meta_test.rb +12 -6
  140. data/test/serializers/options_test.rb +17 -6
  141. data/test/serializers/read_attribute_for_serialization_test.rb +3 -3
  142. data/test/serializers/reflection_test.rb +427 -0
  143. data/test/serializers/root_test.rb +1 -1
  144. data/test/serializers/serialization_test.rb +2 -2
  145. data/test/serializers/serializer_for_test.rb +12 -10
  146. data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
  147. data/test/support/isolated_unit.rb +9 -4
  148. data/test/support/rails5_shims.rb +8 -2
  149. data/test/support/rails_app.rb +2 -9
  150. data/test/support/serialization_testing.rb +31 -5
  151. data/test/test_helper.rb +13 -0
  152. metadata +130 -71
  153. data/.rubocop_todo.yml +0 -167
  154. data/docs/ARCHITECTURE.md +0 -126
  155. data/lib/active_model/serializer/associations.rb +0 -100
  156. data/lib/active_model/serializer/attributes.rb +0 -82
  157. data/lib/active_model/serializer/collection_reflection.rb +0 -7
  158. data/lib/active_model/serializer/configuration.rb +0 -35
  159. data/lib/active_model/serializer/include_tree.rb +0 -111
  160. data/lib/active_model/serializer/links.rb +0 -35
  161. data/lib/active_model/serializer/meta.rb +0 -29
  162. data/lib/active_model/serializer/singular_reflection.rb +0 -7
  163. data/lib/active_model/serializer/type.rb +0 -25
  164. data/lib/active_model_serializers/key_transform.rb +0 -70
  165. data/test/active_model_serializers/key_transform_test.rb +0 -263
  166. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  167. data/test/adapter/json_api/relationships_test.rb +0 -199
  168. data/test/adapter/json_api/resource_identifier_test.rb +0 -85
  169. data/test/include_tree/from_include_args_test.rb +0 -26
  170. data/test/include_tree/from_string_test.rb +0 -94
  171. data/test/include_tree/include_args_to_hash_test.rb +0 -64
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class SerializerForWithNamespaceTest < ActiveSupport::TestCase
6
+ class Book < ::Model
7
+ attributes :title, :author_name
8
+ associations :publisher, :pages
9
+ end
10
+ class Page < ::Model; attributes :number, :text end
11
+ class Publisher < ::Model; attributes :name end
12
+
13
+ module Api
14
+ module V3
15
+ class BookSerializer < ActiveModel::Serializer
16
+ attributes :title, :author_name
17
+
18
+ has_many :pages
19
+ belongs_to :publisher
20
+ end
21
+
22
+ class PageSerializer < ActiveModel::Serializer
23
+ attributes :number, :text
24
+ end
25
+
26
+ class PublisherSerializer < ActiveModel::Serializer
27
+ attributes :name
28
+ end
29
+ end
30
+ end
31
+
32
+ class BookSerializer < ActiveModel::Serializer
33
+ attributes :title, :author_name
34
+ end
35
+ test 'resource without a namespace' do
36
+ book = Book.new(title: 'A Post', author_name: 'hello')
37
+
38
+ # TODO: this should be able to pull up this serializer without explicitly specifying the serializer
39
+ # currently, with no options, it still uses the Api::V3 serializer
40
+ result = ActiveModelSerializers::SerializableResource.new(book, serializer: BookSerializer).serializable_hash
41
+
42
+ expected = { title: 'A Post', author_name: 'hello' }
43
+ assert_equal expected, result
44
+ end
45
+
46
+ test 'resource with namespace' do
47
+ book = Book.new(title: 'A Post', author_name: 'hi')
48
+
49
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
50
+
51
+ expected = { title: 'A Post', author_name: 'hi', pages: nil, publisher: nil }
52
+ assert_equal expected, result
53
+ end
54
+
55
+ test 'has_many with nested serializer under the namespace' do
56
+ page = Page.new(number: 1, text: 'hello')
57
+ book = Book.new(title: 'A Post', author_name: 'hi', pages: [page])
58
+
59
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
60
+
61
+ expected = {
62
+ title: 'A Post', author_name: 'hi',
63
+ publisher: nil,
64
+ pages: [{
65
+ number: 1, text: 'hello'
66
+ }]
67
+ }
68
+ assert_equal expected, result
69
+ end
70
+
71
+ test 'belongs_to with nested serializer under the namespace' do
72
+ publisher = Publisher.new(name: 'Disney')
73
+ book = Book.new(title: 'A Post', author_name: 'hi', publisher: publisher)
74
+
75
+ result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
76
+
77
+ expected = {
78
+ title: 'A Post', author_name: 'hi',
79
+ pages: nil,
80
+ publisher: {
81
+ name: 'Disney'
82
+ }
83
+ }
84
+ assert_equal expected, result
85
+ end
86
+ end
87
+ end
88
+ end
@@ -41,6 +41,7 @@ require 'active_support/core_ext/string/access'
41
41
 
42
42
  # These files do not require any others and are needed
43
43
  # to run the tests
44
+ require 'active_support/testing/autorun'
44
45
  require 'active_support/testing/isolation'
45
46
 
46
47
  module TestHelpers
@@ -53,7 +54,7 @@ module TestHelpers
53
54
  require 'rails'
54
55
  require 'action_controller/railtie'
55
56
 
56
- @app = Class.new(Rails::Application) do
57
+ app = Class.new(Rails::Application) do
57
58
  config.eager_load = false
58
59
  config.session_store :cookie_store, key: '_myapp_session'
59
60
  config.active_support.deprecation = :log
@@ -66,14 +67,18 @@ module TestHelpers
66
67
  config.logger = fake_logger
67
68
  Rails.application.routes.default_url_options = { host: 'example.com' }
68
69
  end
69
- @app.respond_to?(:secrets) && @app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
70
+ def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
71
+ app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
70
72
 
73
+ @app = app
71
74
  yield @app if block_given?
72
75
  @app.initialize!
73
76
  end
74
77
  end
75
78
  end
76
79
 
77
- class ActiveSupport::TestCase
78
- include TestHelpers::Generation
80
+ module ActiveSupport
81
+ class TestCase
82
+ include TestHelpers::Generation
83
+ end
79
84
  end
@@ -1,7 +1,7 @@
1
1
  module Rails5Shims
2
2
  module ControllerTests
3
3
  # https://github.com/rails/rails/blob/b217354/actionpack/lib/action_controller/test_case.rb
4
- REQUEST_KWARGS = [:params, :session, :flash, :method, :body, :xhr].freeze
4
+ REQUEST_KWARGS = [:params, :headers, :session, :flash, :method, :body, :xhr].freeze
5
5
 
6
6
  def get(path, *args)
7
7
  fold_kwargs!(args)
@@ -30,7 +30,12 @@ module Rails5Shims
30
30
  return unless hash.respond_to?(:key)
31
31
  Rails5Shims::ControllerTests::REQUEST_KWARGS.each do |kwarg|
32
32
  next unless hash.key?(kwarg)
33
- hash.merge! hash.delete(kwarg)
33
+ value = hash.delete(kwarg)
34
+ if value.is_a? String
35
+ args.insert(0, value)
36
+ else
37
+ hash.merge! value
38
+ end
34
39
  end
35
40
  end
36
41
 
@@ -44,4 +49,5 @@ module Rails5Shims
44
49
  end
45
50
  if Rails::VERSION::MAJOR < 5
46
51
  ActionController::TestCase.send :include, Rails5Shims::ControllerTests
52
+ ActionDispatch::IntegrationTest.send :include, Rails5Shims::ControllerTests
47
53
  end
@@ -6,6 +6,8 @@ module ActiveModelSerializers
6
6
  config.active_support.test_order = :random
7
7
  config.action_controller.perform_caching = true
8
8
  config.action_controller.cache_store = :memory_store
9
+
10
+ config.filter_parameters += [:password]
9
11
  end
10
12
 
11
13
  app.routes.default_url_options = { host: 'example.com' }
@@ -22,15 +24,6 @@ ActionController::TestCase.class_eval do
22
24
  def setup
23
25
  @routes = Routes
24
26
  end
25
-
26
- # For Rails5
27
- # https://github.com/rails/rails/commit/ca83436d1b3b6cedd1eca2259f65661e69b01909#diff-b9bbf56e85d3fe1999f16317f2751e76L17
28
- def assigns(key = nil)
29
- warn "DEPRECATION: Calling 'assigns(#{key})' from #{caller[0]}"
30
- assigns = {}.with_indifferent_access
31
- @controller.view_assigns.each { |k, v| assigns.regular_writer(k, v) }
32
- key.nil? ? assigns : assigns[key]
33
- end
34
27
  end
35
28
 
36
29
  # ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
@@ -9,6 +9,22 @@ module SerializationTesting
9
9
  ActiveModelSerializers::SerializableResource.new(obj).to_json
10
10
  end
11
11
 
12
+ def with_namespace_separator(separator)
13
+ original_separator = ActiveModelSerializers.config.jsonapi_namespace_separator
14
+ ActiveModelSerializers.config.jsonapi_namespace_separator = separator
15
+ yield
16
+ ensure
17
+ ActiveModelSerializers.config.jsonapi_namespace_separator = original_separator
18
+ end
19
+
20
+ def with_prepended_lookup(lookup_proc)
21
+ original_lookup = ActiveModelSerializers.config.serializer_lookup_cahin
22
+ ActiveModelSerializers.config.serializer_lookup_chain.unshift lookup_proc
23
+ yield
24
+ ensure
25
+ ActiveModelSerializers.config.serializer_lookup_cahin = original_lookup
26
+ end
27
+
12
28
  # Aliased as :with_configured_adapter to clarify that
13
29
  # this method tests the configured adapter.
14
30
  # When not testing configuration, it may be preferable
@@ -31,6 +47,14 @@ module SerializationTesting
31
47
  ActiveModelSerializers.config.replace(old_config)
32
48
  end
33
49
 
50
+ def with_jsonapi_inflection(inflection)
51
+ original_inflection = ActiveModelSerializers.config.jsonapi_resource_type
52
+ ActiveModelSerializers.config.jsonapi_resource_type = inflection
53
+ yield
54
+ ensure
55
+ ActiveModelSerializers.config.jsonapi_resource_type = original_inflection
56
+ end
57
+
34
58
  def with_serializer_lookup_disabled
35
59
  original_serializer_lookup = ActiveModelSerializers.config.serializer_lookup_enabled
36
60
  ActiveModelSerializers.config.serializer_lookup_enabled = false
@@ -44,10 +68,12 @@ module SerializationTesting
44
68
  end
45
69
  end
46
70
 
47
- class Minitest::Test
48
- def before_setup
49
- ActionController::Base.cache_store.clear
50
- end
71
+ module Minitest
72
+ class Test
73
+ def before_setup
74
+ ActionController::Base.cache_store.clear
75
+ end
51
76
 
52
- include SerializationTesting
77
+ include SerializationTesting
78
+ end
53
79
  end
data/test/test_helper.rb CHANGED
@@ -9,6 +9,7 @@ rescue LoadError
9
9
  STDERR.puts 'Running without SimpleCov'
10
10
  end
11
11
 
12
+ require 'pry'
12
13
  require 'timecop'
13
14
  require 'rails'
14
15
  require 'action_controller'
@@ -39,6 +40,18 @@ require 'minitest'
39
40
  require 'minitest/autorun'
40
41
  Minitest.backtrace_filter = Minitest::BacktraceFilter.new
41
42
 
43
+ module TestHelper
44
+ module_function
45
+
46
+ def silence_warnings
47
+ original_verbose = $VERBOSE
48
+ $VERBOSE = nil
49
+ yield
50
+ ensure
51
+ $VERBOSE = original_verbose
52
+ end
53
+ end
54
+
42
55
  require 'support/rails_app'
43
56
 
44
57
  # require "rails/test_help"