active_model_serializers_custom 0.10.90

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 (215) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +35 -0
  5. data/.rubocop.yml +109 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +63 -0
  8. data/CHANGELOG.md +727 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +74 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +305 -0
  14. data/Rakefile +76 -0
  15. data/active_model_serializers.gemspec +64 -0
  16. data/appveyor.yml +28 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/rubocop +38 -0
  20. data/bin/serve_benchmark +39 -0
  21. data/docs/README.md +41 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +269 -0
  24. data/docs/general/caching.md +58 -0
  25. data/docs/general/configuration_options.md +185 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/fields.md +31 -0
  28. data/docs/general/getting_started.md +133 -0
  29. data/docs/general/instrumentation.md +40 -0
  30. data/docs/general/key_transforms.md +40 -0
  31. data/docs/general/logging.md +21 -0
  32. data/docs/general/rendering.md +293 -0
  33. data/docs/general/serializers.md +495 -0
  34. data/docs/how-open-source-maintained.jpg +0 -0
  35. data/docs/howto/add_pagination_links.md +138 -0
  36. data/docs/howto/add_relationship_links.md +140 -0
  37. data/docs/howto/add_root_key.md +62 -0
  38. data/docs/howto/grape_integration.md +42 -0
  39. data/docs/howto/outside_controller_use.md +66 -0
  40. data/docs/howto/passing_arbitrary_options.md +27 -0
  41. data/docs/howto/serialize_poro.md +73 -0
  42. data/docs/howto/test.md +154 -0
  43. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  44. data/docs/integrations/ember-and-json-api.md +147 -0
  45. data/docs/integrations/grape.md +19 -0
  46. data/docs/jsonapi/errors.md +56 -0
  47. data/docs/jsonapi/schema.md +151 -0
  48. data/docs/jsonapi/schema/schema.json +366 -0
  49. data/docs/rfcs/0000-namespace.md +106 -0
  50. data/docs/rfcs/template.md +15 -0
  51. data/lib/action_controller/serialization.rb +76 -0
  52. data/lib/active_model/serializable_resource.rb +13 -0
  53. data/lib/active_model/serializer.rb +418 -0
  54. data/lib/active_model/serializer/adapter.rb +26 -0
  55. data/lib/active_model/serializer/adapter/attributes.rb +17 -0
  56. data/lib/active_model/serializer/adapter/base.rb +20 -0
  57. data/lib/active_model/serializer/adapter/json.rb +17 -0
  58. data/lib/active_model/serializer/adapter/json_api.rb +17 -0
  59. data/lib/active_model/serializer/adapter/null.rb +17 -0
  60. data/lib/active_model/serializer/array_serializer.rb +14 -0
  61. data/lib/active_model/serializer/association.rb +91 -0
  62. data/lib/active_model/serializer/attribute.rb +27 -0
  63. data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +90 -0
  65. data/lib/active_model/serializer/concerns/caching.rb +304 -0
  66. data/lib/active_model/serializer/error_serializer.rb +16 -0
  67. data/lib/active_model/serializer/errors_serializer.rb +34 -0
  68. data/lib/active_model/serializer/field.rb +92 -0
  69. data/lib/active_model/serializer/fieldset.rb +33 -0
  70. data/lib/active_model/serializer/has_many_reflection.rb +12 -0
  71. data/lib/active_model/serializer/has_one_reflection.rb +9 -0
  72. data/lib/active_model/serializer/lazy_association.rb +99 -0
  73. data/lib/active_model/serializer/link.rb +23 -0
  74. data/lib/active_model/serializer/lint.rb +152 -0
  75. data/lib/active_model/serializer/null.rb +19 -0
  76. data/lib/active_model/serializer/reflection.rb +212 -0
  77. data/lib/active_model/serializer/version.rb +7 -0
  78. data/lib/active_model_serializers.rb +63 -0
  79. data/lib/active_model_serializers/adapter.rb +100 -0
  80. data/lib/active_model_serializers/adapter/attributes.rb +15 -0
  81. data/lib/active_model_serializers/adapter/base.rb +85 -0
  82. data/lib/active_model_serializers/adapter/json.rb +23 -0
  83. data/lib/active_model_serializers/adapter/json_api.rb +535 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +90 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
  92. data/lib/active_model_serializers/adapter/null.rb +11 -0
  93. data/lib/active_model_serializers/callbacks.rb +57 -0
  94. data/lib/active_model_serializers/deprecate.rb +56 -0
  95. data/lib/active_model_serializers/deserialization.rb +17 -0
  96. data/lib/active_model_serializers/json_pointer.rb +16 -0
  97. data/lib/active_model_serializers/logging.rb +124 -0
  98. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  99. data/lib/active_model_serializers/model.rb +132 -0
  100. data/lib/active_model_serializers/railtie.rb +52 -0
  101. data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
  102. data/lib/active_model_serializers/serializable_resource.rb +84 -0
  103. data/lib/active_model_serializers/serialization_context.rb +41 -0
  104. data/lib/active_model_serializers/test.rb +9 -0
  105. data/lib/active_model_serializers/test/schema.rb +140 -0
  106. data/lib/active_model_serializers/test/serializer.rb +127 -0
  107. data/lib/generators/rails/USAGE +6 -0
  108. data/lib/generators/rails/resource_override.rb +12 -0
  109. data/lib/generators/rails/serializer_generator.rb +38 -0
  110. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  111. data/lib/grape/active_model_serializers.rb +18 -0
  112. data/lib/grape/formatters/active_model_serializers.rb +34 -0
  113. data/lib/grape/helpers/active_model_serializers.rb +19 -0
  114. data/lib/tasks/rubocop.rake +55 -0
  115. data/test/action_controller/adapter_selector_test.rb +64 -0
  116. data/test/action_controller/explicit_serializer_test.rb +137 -0
  117. data/test/action_controller/json/include_test.rb +248 -0
  118. data/test/action_controller/json_api/deserialization_test.rb +114 -0
  119. data/test/action_controller/json_api/errors_test.rb +42 -0
  120. data/test/action_controller/json_api/fields_test.rb +68 -0
  121. data/test/action_controller/json_api/linked_test.rb +204 -0
  122. data/test/action_controller/json_api/pagination_test.rb +126 -0
  123. data/test/action_controller/json_api/transform_test.rb +191 -0
  124. data/test/action_controller/lookup_proc_test.rb +51 -0
  125. data/test/action_controller/namespace_lookup_test.rb +239 -0
  126. data/test/action_controller/serialization_scope_name_test.rb +237 -0
  127. data/test/action_controller/serialization_test.rb +480 -0
  128. data/test/active_model_serializers/adapter_for_test.rb +210 -0
  129. data/test/active_model_serializers/json_pointer_test.rb +24 -0
  130. data/test/active_model_serializers/logging_test.rb +79 -0
  131. data/test/active_model_serializers/model_test.rb +144 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +70 -0
  133. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +163 -0
  134. data/test/active_model_serializers/serialization_context_test_isolated.rb +73 -0
  135. data/test/active_model_serializers/test/schema_test.rb +133 -0
  136. data/test/active_model_serializers/test/serializer_test.rb +64 -0
  137. data/test/active_record_test.rb +11 -0
  138. data/test/adapter/attributes_test.rb +42 -0
  139. data/test/adapter/deprecation_test.rb +102 -0
  140. data/test/adapter/json/belongs_to_test.rb +47 -0
  141. data/test/adapter/json/collection_test.rb +106 -0
  142. data/test/adapter/json/has_many_test.rb +55 -0
  143. data/test/adapter/json/transform_test.rb +95 -0
  144. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  145. data/test/adapter/json_api/collection_test.rb +98 -0
  146. data/test/adapter/json_api/errors_test.rb +78 -0
  147. data/test/adapter/json_api/fields_test.rb +98 -0
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  149. data/test/adapter/json_api/has_many_test.rb +175 -0
  150. data/test/adapter/json_api/has_one_test.rb +82 -0
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +215 -0
  152. data/test/adapter/json_api/json_api_test.rb +35 -0
  153. data/test/adapter/json_api/linked_test.rb +415 -0
  154. data/test/adapter/json_api/links_test.rb +112 -0
  155. data/test/adapter/json_api/pagination_links_test.rb +208 -0
  156. data/test/adapter/json_api/parse_test.rb +139 -0
  157. data/test/adapter/json_api/relationship_test.rb +399 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +102 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +84 -0
  160. data/test/adapter/json_api/transform_test.rb +514 -0
  161. data/test/adapter/json_api/type_test.rb +195 -0
  162. data/test/adapter/json_test.rb +48 -0
  163. data/test/adapter/null_test.rb +24 -0
  164. data/test/adapter/polymorphic_test.rb +220 -0
  165. data/test/adapter_test.rb +69 -0
  166. data/test/array_serializer_test.rb +24 -0
  167. data/test/benchmark/app.rb +67 -0
  168. data/test/benchmark/benchmarking_support.rb +69 -0
  169. data/test/benchmark/bm_active_record.rb +83 -0
  170. data/test/benchmark/bm_adapter.rb +40 -0
  171. data/test/benchmark/bm_caching.rb +121 -0
  172. data/test/benchmark/bm_lookup_chain.rb +85 -0
  173. data/test/benchmark/bm_transform.rb +47 -0
  174. data/test/benchmark/config.ru +3 -0
  175. data/test/benchmark/controllers.rb +85 -0
  176. data/test/benchmark/fixtures.rb +221 -0
  177. data/test/cache_test.rb +717 -0
  178. data/test/collection_serializer_test.rb +129 -0
  179. data/test/fixtures/active_record.rb +115 -0
  180. data/test/fixtures/poro.rb +227 -0
  181. data/test/generators/scaffold_controller_generator_test.rb +26 -0
  182. data/test/generators/serializer_generator_test.rb +77 -0
  183. data/test/grape_test.rb +198 -0
  184. data/test/lint_test.rb +51 -0
  185. data/test/logger_test.rb +22 -0
  186. data/test/poro_test.rb +11 -0
  187. data/test/serializable_resource_test.rb +81 -0
  188. data/test/serializers/association_macros_test.rb +39 -0
  189. data/test/serializers/associations_test.rb +520 -0
  190. data/test/serializers/attribute_test.rb +155 -0
  191. data/test/serializers/attributes_test.rb +54 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +172 -0
  193. data/test/serializers/configuration_test.rb +34 -0
  194. data/test/serializers/fieldset_test.rb +16 -0
  195. data/test/serializers/meta_test.rb +204 -0
  196. data/test/serializers/options_test.rb +34 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +81 -0
  198. data/test/serializers/reflection_test.rb +481 -0
  199. data/test/serializers/root_test.rb +23 -0
  200. data/test/serializers/serialization_test.rb +57 -0
  201. data/test/serializers/serializer_for_test.rb +138 -0
  202. data/test/serializers/serializer_for_with_namespace_test.rb +90 -0
  203. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  204. data/test/support/isolated_unit.rb +86 -0
  205. data/test/support/rails5_shims.rb +55 -0
  206. data/test/support/rails_app.rb +40 -0
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  209. data/test/support/schemas/custom/show.json +7 -0
  210. data/test/support/schemas/hyper_schema.json +93 -0
  211. data/test/support/schemas/render_using_json_api.json +43 -0
  212. data/test/support/schemas/simple_json_pointers.json +10 -0
  213. data/test/support/serialization_testing.rb +81 -0
  214. data/test/test_helper.rb +72 -0
  215. metadata +622 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ # meta
7
+ # definition:
8
+ # JSON Object
9
+ #
10
+ # description:
11
+ # Non-standard meta-information that can not be represented as an attribute or relationship.
12
+ # structure:
13
+ # {
14
+ # attitude: 'adjustable'
15
+ # }
16
+ class Meta
17
+ def initialize(serializer)
18
+ @object = serializer.object
19
+ @scope = serializer.scope
20
+
21
+ # Use the return value of the block unless it is nil.
22
+ if serializer._meta.respond_to?(:call)
23
+ @value = instance_eval(&serializer._meta)
24
+ else
25
+ @value = serializer._meta
26
+ end
27
+ end
28
+
29
+ def as_json
30
+ @value
31
+ end
32
+
33
+ protected
34
+
35
+ attr_reader :object, :scope
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi < Base
6
+ class PaginationLinks
7
+ MissingSerializationContextError = Class.new(KeyError)
8
+ FIRST_PAGE = 1
9
+
10
+ attr_reader :collection, :context
11
+
12
+ def initialize(collection, adapter_options)
13
+ @collection = collection
14
+ @adapter_options = adapter_options
15
+ @context = adapter_options.fetch(:serialization_context) do
16
+ fail MissingSerializationContextError, <<-EOF.freeze
17
+ JsonApi::PaginationLinks requires a ActiveModelSerializers::SerializationContext.
18
+ Please pass a ':serialization_context' option or
19
+ override CollectionSerializer#paginated? to return 'false'.
20
+ EOF
21
+ end
22
+ end
23
+
24
+ def as_json
25
+ {
26
+ self: location_url,
27
+ first: first_page_url,
28
+ prev: prev_page_url,
29
+ next: next_page_url,
30
+ last: last_page_url
31
+ }
32
+ end
33
+
34
+ protected
35
+
36
+ attr_reader :adapter_options
37
+
38
+ private
39
+
40
+ def location_url
41
+ url_for_page(collection.current_page)
42
+ end
43
+
44
+ def first_page_url
45
+ url_for_page(1)
46
+ end
47
+
48
+ def last_page_url
49
+ if collection.total_pages == 0
50
+ url_for_page(FIRST_PAGE)
51
+ else
52
+ url_for_page(collection.total_pages)
53
+ end
54
+ end
55
+
56
+ def prev_page_url
57
+ return nil if collection.current_page == FIRST_PAGE
58
+ url_for_page(collection.current_page - FIRST_PAGE)
59
+ end
60
+
61
+ def next_page_url
62
+ return nil if collection.total_pages == 0 || collection.current_page == collection.total_pages
63
+ url_for_page(collection.next_page)
64
+ end
65
+
66
+ def url_for_page(number)
67
+ params = query_parameters.dup
68
+ params[:page] = { size: per_page, number: number }
69
+ "#{url(adapter_options)}?#{params.to_query}"
70
+ end
71
+
72
+ def url(options = {})
73
+ @url ||= options.fetch(:links, {}).fetch(:self, nil) || request_url
74
+ end
75
+
76
+ def request_url
77
+ @request_url ||= context.request_url
78
+ end
79
+
80
+ def query_parameters
81
+ @query_parameters ||= context.query_parameters
82
+ end
83
+
84
+ def per_page
85
+ @per_page ||= collection.try(:per_page) || collection.try(:limit_value) || collection.size
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class Relationship
7
+ # {http://jsonapi.org/format/#document-resource-object-related-resource-links Document Resource Object Related Resource Links}
8
+ # {http://jsonapi.org/format/#document-links Document Links}
9
+ # {http://jsonapi.org/format/#document-resource-object-linkage Document Resource Relationship Linkage}
10
+ # {http://jsonapi.org/format/#document-meta Document Meta}
11
+ def initialize(parent_serializer, serializable_resource_options, association)
12
+ @parent_serializer = parent_serializer
13
+ @association = association
14
+ @serializable_resource_options = serializable_resource_options
15
+ end
16
+
17
+ def as_json
18
+ hash = {}
19
+
20
+ hash[:data] = data_for(association) if association.include_data?
21
+
22
+ links = links_for(association)
23
+ hash[:links] = links if links.any?
24
+
25
+ meta = meta_for(association)
26
+ hash[:meta] = meta if meta
27
+ hash[:meta] = {} if hash.empty?
28
+
29
+ hash
30
+ end
31
+
32
+ protected
33
+
34
+ attr_reader :parent_serializer, :serializable_resource_options, :association
35
+
36
+ private
37
+
38
+ # TODO(BF): Avoid db hit on belong_to_ releationship by using foreign_key on self
39
+ def data_for(association)
40
+ if association.collection?
41
+ data_for_many(association)
42
+ else
43
+ data_for_one(association)
44
+ end
45
+ end
46
+
47
+ def data_for_one(association)
48
+ if belongs_to_id_on_self?(association)
49
+ id = parent_serializer.read_attribute_for_serialization(association.reflection.foreign_key)
50
+ type =
51
+ if association.polymorphic?
52
+ # We can't infer resource type for polymorphic relationships from the serializer.
53
+ # We can ONLY know a polymorphic resource type by inspecting each resource.
54
+ association.lazy_association.serializer.json_key
55
+ else
56
+ association.reflection.type.to_s
57
+ end
58
+ ResourceIdentifier.for_type_with_id(type, id, serializable_resource_options)
59
+ else
60
+ # TODO(BF): Process relationship without evaluating lazy_association
61
+ serializer = association.lazy_association.serializer
62
+ if (virtual_value = association.virtual_value)
63
+ virtual_value
64
+ elsif serializer && association.object
65
+ ResourceIdentifier.new(serializer, serializable_resource_options).as_json
66
+ else
67
+ nil
68
+ end
69
+ end
70
+ end
71
+
72
+ def data_for_many(association)
73
+ # TODO(BF): Process relationship without evaluating lazy_association
74
+ collection_serializer = association.lazy_association.serializer
75
+ if collection_serializer.respond_to?(:each)
76
+ collection_serializer.map do |serializer|
77
+ ResourceIdentifier.new(serializer, serializable_resource_options).as_json
78
+ end
79
+ elsif (virtual_value = association.virtual_value)
80
+ virtual_value
81
+ else
82
+ []
83
+ end
84
+ end
85
+
86
+ def links_for(association)
87
+ association.links.each_with_object({}) do |(key, value), hash|
88
+ result = Link.new(parent_serializer, value).as_json
89
+ hash[key] = result if result
90
+ end
91
+ end
92
+
93
+ def meta_for(association)
94
+ meta = association.meta
95
+ meta.respond_to?(:call) ? parent_serializer.instance_eval(&meta) : meta
96
+ end
97
+
98
+ def belongs_to_id_on_self?(association)
99
+ parent_serializer.config.jsonapi_use_foreign_key_on_belongs_to_relationship &&
100
+ association.belongs_to? &&
101
+ parent_serializer.object.respond_to?(association.reflection.foreign_key)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class ResourceIdentifier
7
+ def self.type_for(serializer, serializer_type = nil, transform_options = {})
8
+ raw_type = serializer_type ? serializer_type : raw_type_from_serializer_object(serializer.object)
9
+ JsonApi.send(:transform_key_casing!, raw_type, transform_options)
10
+ end
11
+
12
+ def self.for_type_with_id(type, id, options)
13
+ type = inflect_type(type)
14
+ type = type_for(:no_class_needed, type, options)
15
+ if id.blank?
16
+ { type: type }
17
+ else
18
+ { id: id.to_s, type: type }
19
+ end
20
+ end
21
+
22
+ def self.raw_type_from_serializer_object(object)
23
+ class_name = object.class.name # should use model_name
24
+ raw_type = class_name.underscore
25
+ raw_type = inflect_type(raw_type)
26
+ raw_type
27
+ .gsub!('/'.freeze, ActiveModelSerializers.config.jsonapi_namespace_separator)
28
+ raw_type
29
+ end
30
+
31
+ def self.inflect_type(type)
32
+ singularize = ActiveModelSerializers.config.jsonapi_resource_type == :singular
33
+ inflection = singularize ? :singularize : :pluralize
34
+ ActiveSupport::Inflector.public_send(inflection, type)
35
+ end
36
+
37
+ # {http://jsonapi.org/format/#document-resource-identifier-objects Resource Identifier Objects}
38
+ def initialize(serializer, options)
39
+ @id = id_for(serializer)
40
+ @type = type_for(serializer, options)
41
+ end
42
+
43
+ def as_json
44
+ if id.blank?
45
+ { type: type }
46
+ else
47
+ { id: id.to_s, type: type }
48
+ end
49
+ end
50
+
51
+ protected
52
+
53
+ attr_reader :id, :type
54
+
55
+ private
56
+
57
+ def type_for(serializer, transform_options)
58
+ serializer_type = serializer._type
59
+ self.class.type_for(serializer, serializer_type, transform_options)
60
+ end
61
+
62
+ def id_for(serializer)
63
+ serializer.read_attribute_for_serialization(:id).to_s
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class Null < Base
6
+ def serializable_hash(*)
7
+ {}
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adapted from
4
+ # https://github.com/rails/rails/blob/7f18ea14c8/activejob/lib/active_job/callbacks.rb
5
+ require 'active_support/callbacks'
6
+
7
+ module ActiveModelSerializers
8
+ # = ActiveModelSerializers Callbacks
9
+ #
10
+ # ActiveModelSerializers provides hooks during the life cycle of serialization and
11
+ # allow you to trigger logic. Available callbacks are:
12
+ #
13
+ # * <tt>around_render</tt>
14
+ #
15
+ module Callbacks
16
+ extend ActiveSupport::Concern
17
+ include ActiveSupport::Callbacks
18
+
19
+ included do
20
+ define_callbacks :render
21
+ end
22
+
23
+ # These methods will be included into any ActiveModelSerializers object, adding
24
+ # callbacks for +render+.
25
+ module ClassMethods
26
+ # Defines a callback that will get called around the render method,
27
+ # whether it is as_json, to_json, or serializable_hash
28
+ #
29
+ # class ActiveModelSerializers::SerializableResource
30
+ # include ActiveModelSerializers::Callbacks
31
+ #
32
+ # around_render do |args, block|
33
+ # tag_logger do
34
+ # notify_render do
35
+ # block.call(args)
36
+ # end
37
+ # end
38
+ # end
39
+ #
40
+ # def as_json
41
+ # run_callbacks :render do
42
+ # adapter.as_json
43
+ # end
44
+ # end
45
+ # # Note: So that we can re-use the instrumenter for as_json, to_json, and
46
+ # # serializable_hash, we aren't using the usual format, which would be:
47
+ # # def render(args)
48
+ # # adapter.as_json
49
+ # # end
50
+ # end
51
+ #
52
+ def around_render(*filters, &blk)
53
+ set_callback(:render, :around, *filters, &blk)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # Provides a single method +deprecate+ to be used to declare when
5
+ # something is going away.
6
+ #
7
+ # class Legacy
8
+ # def self.klass_method
9
+ # # ...
10
+ # end
11
+ #
12
+ # def instance_method
13
+ # # ...
14
+ # end
15
+ #
16
+ # extend ActiveModelSerializers::Deprecate
17
+ # deprecate :instance_method, "ActiveModelSerializers::NewPlace#new_method"
18
+ #
19
+ # class << self
20
+ # extend ActiveModelSerializers::Deprecate
21
+ # deprecate :klass_method, :none
22
+ # end
23
+ # end
24
+ #
25
+ # Adapted from https://github.com/rubygems/rubygems/blob/1591331/lib/rubygems/deprecate.rb
26
+ module ActiveModelSerializers
27
+ module Deprecate
28
+ ##
29
+ # Simple deprecation method that deprecates +name+ by wrapping it up
30
+ # in a dummy method. It warns on each call to the dummy method
31
+ # telling the user of +replacement+ (unless +replacement+ is :none) that it is planned to go away.
32
+
33
+ def deprecate(name, replacement)
34
+ old = "_deprecated_#{name}"
35
+ alias_method old, name
36
+ class_eval do
37
+ define_method(name) do |*args, &block|
38
+ target = is_a?(Module) ? "#{self}." : "#{self.class}#"
39
+ msg = ["NOTE: #{target}#{name} is deprecated",
40
+ replacement == :none ? ' with no replacement' : "; use #{replacement} instead",
41
+ "\n#{target}#{name} called from #{ActiveModelSerializers.location_of_caller.join(':')}"]
42
+ warn "#{msg.join}."
43
+ send old, *args, &block
44
+ end
45
+ end
46
+ end
47
+
48
+ def delegate_and_deprecate(method, delegee)
49
+ delegate method, to: delegee
50
+ deprecate method, "#{delegee.name}."
51
+ end
52
+
53
+ module_function :deprecate
54
+ module_function :delegate_and_deprecate
55
+ end
56
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModelSerializers
4
+ module Deserialization
5
+ module_function
6
+
7
+ def jsonapi_parse(*args)
8
+ Adapter::JsonApi::Deserialization.parse(*args)
9
+ end
10
+
11
+ # :nocov:
12
+ def jsonapi_parse!(*args)
13
+ Adapter::JsonApi::Deserialization.parse!(*args)
14
+ end
15
+ # :nocov:
16
+ end
17
+ end