active_model_serializers 0.10.0 → 0.10.13
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 +5 -5
- data/CHANGELOG.md +239 -2
- data/README.md +171 -34
- data/lib/action_controller/serialization.rb +23 -3
- data/lib/active_model/serializable_resource.rb +2 -0
- data/lib/active_model/serializer/adapter/attributes.rb +2 -0
- data/lib/active_model/serializer/adapter/base.rb +4 -0
- data/lib/active_model/serializer/adapter/json.rb +2 -0
- data/lib/active_model/serializer/adapter/json_api.rb +2 -0
- data/lib/active_model/serializer/adapter/null.rb +2 -0
- data/lib/active_model/serializer/adapter.rb +2 -0
- data/lib/active_model/serializer/array_serializer.rb +10 -5
- data/lib/active_model/serializer/association.rb +64 -10
- data/lib/active_model/serializer/attribute.rb +2 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +6 -3
- data/lib/active_model/serializer/collection_serializer.rb +48 -13
- data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +89 -117
- data/lib/active_model/serializer/error_serializer.rb +13 -7
- data/lib/active_model/serializer/errors_serializer.rb +27 -20
- data/lib/active_model/serializer/field.rb +2 -0
- data/lib/active_model/serializer/fieldset.rb +3 -1
- data/lib/active_model/serializer/has_many_reflection.rb +5 -3
- data/lib/active_model/serializer/has_one_reflection.rb +3 -4
- data/lib/active_model/serializer/lazy_association.rb +99 -0
- data/lib/active_model/serializer/link.rb +23 -0
- data/lib/active_model/serializer/lint.rb +136 -130
- data/lib/active_model/serializer/null.rb +2 -0
- data/lib/active_model/serializer/reflection.rb +130 -65
- data/lib/active_model/serializer/version.rb +3 -1
- data/lib/active_model/serializer.rb +321 -86
- data/lib/active_model_serializers/adapter/attributes.rb +17 -57
- data/lib/active_model_serializers/adapter/base.rb +41 -39
- data/lib/active_model_serializers/adapter/json.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
- data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +3 -1
- data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +52 -20
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +77 -23
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +41 -10
- data/lib/active_model_serializers/adapter/json_api.rb +84 -65
- data/lib/active_model_serializers/adapter/null.rb +2 -0
- data/lib/active_model_serializers/adapter.rb +9 -1
- data/lib/active_model_serializers/callbacks.rb +2 -0
- data/lib/active_model_serializers/deprecate.rb +3 -2
- data/lib/active_model_serializers/deserialization.rb +4 -0
- data/lib/active_model_serializers/json_pointer.rb +2 -0
- data/lib/active_model_serializers/logging.rb +2 -0
- data/lib/active_model_serializers/lookup_chain.rb +82 -0
- data/lib/active_model_serializers/model/caching.rb +26 -0
- data/lib/active_model_serializers/model.rb +111 -28
- data/lib/active_model_serializers/railtie.rb +7 -1
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +46 -31
- data/lib/active_model_serializers/serializable_resource.rb +10 -7
- data/lib/active_model_serializers/serialization_context.rb +12 -3
- data/lib/active_model_serializers/test/schema.rb +4 -2
- data/lib/active_model_serializers/test/serializer.rb +2 -0
- data/lib/active_model_serializers/test.rb +2 -0
- data/lib/active_model_serializers.rb +35 -10
- data/lib/generators/rails/resource_override.rb +3 -1
- data/lib/generators/rails/serializer_generator.rb +6 -4
- data/lib/grape/active_model_serializers.rb +9 -5
- data/lib/grape/formatters/active_model_serializers.rb +21 -2
- data/lib/grape/helpers/active_model_serializers.rb +3 -0
- data/lib/tasks/rubocop.rake +55 -0
- metadata +104 -296
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -104
- data/.rubocop_todo.yml +0 -167
- data/.simplecov +0 -110
- data/.travis.yml +0 -43
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -53
- data/Rakefile +0 -103
- data/active_model_serializers.gemspec +0 -66
- data/appveyor.yml +0 -24
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/serve_benchmark +0 -39
- data/docs/ARCHITECTURE.md +0 -126
- data/docs/README.md +0 -40
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -245
- data/docs/general/caching.md +0 -52
- data/docs/general/configuration_options.md +0 -100
- data/docs/general/deserialization.md +0 -100
- data/docs/general/getting_started.md +0 -133
- data/docs/general/instrumentation.md +0 -40
- data/docs/general/key_transforms.md +0 -40
- data/docs/general/logging.md +0 -14
- data/docs/general/rendering.md +0 -255
- data/docs/general/serializers.md +0 -372
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -139
- data/docs/howto/add_root_key.md +0 -51
- data/docs/howto/outside_controller_use.md +0 -58
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -32
- data/docs/howto/test.md +0 -152
- data/docs/integrations/ember-and-json-api.md +0 -112
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/jsonapi/schema.md +0 -151
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/lib/active_model/serializer/associations.rb +0 -100
- data/lib/active_model/serializer/attributes.rb +0 -82
- data/lib/active_model/serializer/collection_reflection.rb +0 -7
- data/lib/active_model/serializer/configuration.rb +0 -35
- data/lib/active_model/serializer/include_tree.rb +0 -111
- data/lib/active_model/serializer/links.rb +0 -35
- data/lib/active_model/serializer/meta.rb +0 -29
- data/lib/active_model/serializer/singular_reflection.rb +0 -7
- data/lib/active_model/serializer/type.rb +0 -25
- data/lib/active_model_serializers/key_transform.rb +0 -70
- data/test/action_controller/adapter_selector_test.rb +0 -53
- data/test/action_controller/explicit_serializer_test.rb +0 -134
- data/test/action_controller/json/include_test.rb +0 -167
- data/test/action_controller/json_api/deserialization_test.rb +0 -112
- data/test/action_controller/json_api/errors_test.rb +0 -41
- data/test/action_controller/json_api/linked_test.rb +0 -197
- data/test/action_controller/json_api/pagination_test.rb +0 -116
- data/test/action_controller/json_api/transform_test.rb +0 -181
- data/test/action_controller/serialization_scope_name_test.rb +0 -229
- data/test/action_controller/serialization_test.rb +0 -469
- data/test/active_model_serializers/adapter_for_test.rb +0 -208
- data/test/active_model_serializers/json_pointer_test.rb +0 -20
- data/test/active_model_serializers/key_transform_test.rb +0 -263
- data/test/active_model_serializers/logging_test.rb +0 -77
- data/test/active_model_serializers/model_test.rb +0 -9
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -58
- data/test/active_model_serializers/test/schema_test.rb +0 -130
- data/test/active_model_serializers/test/serializer_test.rb +0 -62
- data/test/active_record_test.rb +0 -9
- data/test/adapter/deprecation_test.rb +0 -100
- data/test/adapter/json/belongs_to_test.rb +0 -45
- data/test/adapter/json/collection_test.rb +0 -90
- data/test/adapter/json/has_many_test.rb +0 -45
- data/test/adapter/json/transform_test.rb +0 -93
- data/test/adapter/json_api/belongs_to_test.rb +0 -155
- data/test/adapter/json_api/collection_test.rb +0 -95
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -87
- data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
- data/test/adapter/json_api/has_many_test.rb +0 -144
- data/test/adapter/json_api/has_one_test.rb +0 -80
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -392
- data/test/adapter/json_api/links_test.rb +0 -93
- data/test/adapter/json_api/pagination_links_test.rb +0 -166
- data/test/adapter/json_api/parse_test.rb +0 -137
- data/test/adapter/json_api/relationship_test.rb +0 -161
- data/test/adapter/json_api/relationships_test.rb +0 -199
- data/test/adapter/json_api/resource_identifier_test.rb +0 -85
- data/test/adapter/json_api/resource_meta_test.rb +0 -100
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
- data/test/adapter/json_api/transform_test.rb +0 -502
- data/test/adapter/json_api/type_test.rb +0 -61
- data/test/adapter/json_test.rb +0 -45
- data/test/adapter/null_test.rb +0 -23
- data/test/adapter/polymorphic_test.rb +0 -171
- data/test/adapter_test.rb +0 -67
- data/test/array_serializer_test.rb +0 -22
- data/test/benchmark/app.rb +0 -65
- data/test/benchmark/benchmarking_support.rb +0 -67
- data/test/benchmark/bm_caching.rb +0 -119
- data/test/benchmark/bm_transform.rb +0 -34
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -84
- data/test/benchmark/fixtures.rb +0 -219
- data/test/cache_test.rb +0 -485
- data/test/collection_serializer_test.rb +0 -110
- data/test/fixtures/active_record.rb +0 -78
- data/test/fixtures/poro.rb +0 -282
- data/test/generators/scaffold_controller_generator_test.rb +0 -24
- data/test/generators/serializer_generator_test.rb +0 -57
- data/test/grape_test.rb +0 -82
- data/test/include_tree/from_include_args_test.rb +0 -26
- data/test/include_tree/from_string_test.rb +0 -94
- data/test/include_tree/include_args_to_hash_test.rb +0 -64
- data/test/lint_test.rb +0 -49
- data/test/logger_test.rb +0 -18
- data/test/poro_test.rb +0 -9
- data/test/serializable_resource_test.rb +0 -83
- data/test/serializers/association_macros_test.rb +0 -36
- data/test/serializers/associations_test.rb +0 -295
- data/test/serializers/attribute_test.rb +0 -151
- data/test/serializers/attributes_test.rb +0 -52
- data/test/serializers/caching_configuration_test_isolated.rb +0 -170
- data/test/serializers/configuration_test.rb +0 -32
- data/test/serializers/fieldset_test.rb +0 -14
- data/test/serializers/meta_test.rb +0 -196
- data/test/serializers/options_test.rb +0 -21
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
- data/test/serializers/root_test.rb +0 -21
- data/test/serializers/serialization_test.rb +0 -55
- data/test/serializers/serializer_for_test.rb +0 -134
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -79
- data/test/support/rails5_shims.rb +0 -47
- data/test/support/rails_app.rb +0 -45
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
- data/test/support/schemas/custom/show.json +0 -7
- data/test/support/schemas/hyper_schema.json +0 -93
- data/test/support/schemas/render_using_json_api.json +0 -43
- data/test/support/schemas/simple_json_pointers.json +0 -10
- data/test/support/serialization_testing.rb +0 -53
- data/test/test_helper.rb +0 -57
data/docs/jsonapi/schema.md
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
[](http://jsonapi.org/)
|
|
4
|
-
|
|
5
|
-
## JSON API Requests
|
|
6
|
-
|
|
7
|
-
- [Query Parameters Spec](http://jsonapi.org/format/#query-parameters)
|
|
8
|
-
|
|
9
|
-
Headers:
|
|
10
|
-
|
|
11
|
-
- Request: `Accept: application/vnd.api+json`
|
|
12
|
-
- Response: `Content-Type: application/vnd.api+json`
|
|
13
|
-
|
|
14
|
-
### [Fetching Data](http://jsonapi.org/format/#fetching)
|
|
15
|
-
|
|
16
|
-
A server MUST support fetching resource data for every URL provided as:
|
|
17
|
-
|
|
18
|
-
- a `self` link as part of the top-level links object
|
|
19
|
-
- a `self` link as part of a resource-level links object
|
|
20
|
-
- a `related` link as part of a relationship-level links object
|
|
21
|
-
|
|
22
|
-
Example supported requests
|
|
23
|
-
|
|
24
|
-
- Individual resource or collection
|
|
25
|
-
- GET /articles
|
|
26
|
-
- GET /articles/1
|
|
27
|
-
- GET /articles/1/author
|
|
28
|
-
- Relationships
|
|
29
|
-
- GET /articles/1/relationships/comments
|
|
30
|
-
- GET /articles/1/relationships/author
|
|
31
|
-
- Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `ActiveModel::Serializer::IncludeTree`
|
|
32
|
-
- GET /articles/1?`include`=comments
|
|
33
|
-
- GET /articles/1?`include`=comments.author
|
|
34
|
-
- GET /articles/1?`include`=author,comments.author
|
|
35
|
-
- GET /articles/1/relationships/comments?`include`=comments.author
|
|
36
|
-
- Optional: [Sparse Fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets) `ActiveModel::Serializer::Fieldset`
|
|
37
|
-
- GET /articles?`include`=author&`fields`[articles]=title,body&`fields`[people]=name
|
|
38
|
-
- Optional: [Sorting](http://jsonapi.org/format/#fetching-sorting)
|
|
39
|
-
- GET /people?`sort`=age
|
|
40
|
-
- GET /people?`sort`=age,author.name
|
|
41
|
-
- GET /articles?`sort`=-created,title
|
|
42
|
-
- Optional: [Pagination](http://jsonapi.org/format/#fetching-pagination)
|
|
43
|
-
- GET /articles?`page`[number]=3&`page`[size]=1
|
|
44
|
-
- Optional: [Filtering](http://jsonapi.org/format/#fetching-filtering)
|
|
45
|
-
- GET /comments?`filter`[post]=1
|
|
46
|
-
- GET /comments?`filter`[post]=1,2
|
|
47
|
-
- GET /comments?`filter`[post]=1,2
|
|
48
|
-
|
|
49
|
-
### [CRUD Actions](http://jsonapi.org/format/#crud)
|
|
50
|
-
|
|
51
|
-
### [Asynchronous Processing](http://jsonapi.org/recommendations/#asynchronous-processing)
|
|
52
|
-
|
|
53
|
-
### [Bulk Operations Extension](http://jsonapi.org/extensions/bulk/)
|
|
54
|
-
|
|
55
|
-
## JSON API Document Schema
|
|
56
|
-
|
|
57
|
-
| JSON API object | JSON API properties | Required | ActiveModelSerializers representation |
|
|
58
|
-
|-----------------------|----------------------------------------------------------------------------------------------------|----------|---------------------------------------|
|
|
59
|
-
| schema | oneOf (success, failure, info) | |
|
|
60
|
-
| success | data, included, meta, links, jsonapi | | AM::SerializableResource
|
|
61
|
-
| success.meta | meta | | AMS::Adapter::Base#meta
|
|
62
|
-
| success.included | UniqueArray(resource) | | AMS::Adapter::JsonApi#serializable_hash_for_collection
|
|
63
|
-
| success.data | data | |
|
|
64
|
-
| success.links | allOf (links, pagination) | | AMS::Adapter::JsonApi#links_for
|
|
65
|
-
| success.jsonapi | jsonapi | |
|
|
66
|
-
| failure | errors, meta, jsonapi | errors | AMS::Adapter::JsonApi#failure_document, #1004
|
|
67
|
-
| failure.errors | UniqueArray(error) | | AM::S::ErrorSerializer, #1004
|
|
68
|
-
| meta | Object | |
|
|
69
|
-
| data | oneOf (resource, UniqueArray(resource)) | | AMS::Adapter::JsonApi#serializable_hash_for_collection,#serializable_hash_for_single_resource
|
|
70
|
-
| resource | String(type), String(id),<br>attributes, relationships,<br>links, meta | type, id | AM::S::Adapter::JsonApi#primary_data_for
|
|
71
|
-
| links | Uri(self), Link(related) | | #1028, #1246, #1282
|
|
72
|
-
| link | oneOf (linkString, linkObject) | |
|
|
73
|
-
| link.linkString | Uri | |
|
|
74
|
-
| link.linkObject | Uri(href), meta | href |
|
|
75
|
-
| attributes | patternProperties(<br>`"^(?!relationships$|links$)\\w[-\\w_]*$"`),<br>any valid JSON | | AM::Serializer#attributes, AMS::Adapter::JsonApi#resource_object_for
|
|
76
|
-
| relationships | patternProperties(<br>`"^\\w[-\\w_]*$"`);<br>links, relationships.data, meta | | AMS::Adapter::JsonApi#relationships_for
|
|
77
|
-
| relationships.data | oneOf (relationshipToOne, relationshipToMany) | | AMS::Adapter::JsonApi#resource_identifier_for
|
|
78
|
-
| relationshipToOne | anyOf(empty, linkage) | |
|
|
79
|
-
| relationshipToMany | UniqueArray(linkage) | |
|
|
80
|
-
| empty | null | |
|
|
81
|
-
| linkage | String(type), String(id), meta | type, id | AMS::Adapter::JsonApi#primary_data_for
|
|
82
|
-
| pagination | pageObject(first), pageObject(last),<br>pageObject(prev), pageObject(next) | | AMS::Adapter::JsonApi::PaginationLinks#serializable_hash
|
|
83
|
-
| pagination.pageObject | oneOf(Uri, null) | |
|
|
84
|
-
| jsonapi | String(version), meta | | AMS::Adapter::JsonApi::Jsonapi#as_json
|
|
85
|
-
| error | String(id), links, String(status),<br>String(code), String(title),<br>String(detail), error.source, meta | | AM::S::ErrorSerializer, AMS::Adapter::JsonApi::Error.resource_errors
|
|
86
|
-
| error.source | String(pointer), String(parameter) | | AMS::Adapter::JsonApi::Error.error_source
|
|
87
|
-
| pointer | [JSON Pointer RFC6901](https://tools.ietf.org/html/rfc6901) | | AMS::JsonPointer
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
The [http://jsonapi.org/schema](schema/schema.json) makes a nice roadmap.
|
|
91
|
-
|
|
92
|
-
### Success Document
|
|
93
|
-
- [ ] success
|
|
94
|
-
- [ ] data: `"$ref": "#/definitions/data"`
|
|
95
|
-
- [ ] included: array of unique items of type `"$ref": "#/definitions/resource"`
|
|
96
|
-
- [ ] meta: `"$ref": "#/definitions/meta"`
|
|
97
|
-
- [ ] links:
|
|
98
|
-
- [ ] link: `"$ref": "#/definitions/links"`
|
|
99
|
-
- [ ] pagination: ` "$ref": "#/definitions/pagination"`
|
|
100
|
-
- [ ] jsonapi: ` "$ref": "#/definitions/jsonapi"`
|
|
101
|
-
|
|
102
|
-
### Failure Document
|
|
103
|
-
|
|
104
|
-
- [ ] failure
|
|
105
|
-
- [x] errors: array of unique items of type ` "$ref": "#/definitions/error"`
|
|
106
|
-
- [ ] meta: `"$ref": "#/definitions/meta"`
|
|
107
|
-
- [ ] jsonapi: `"$ref": "#/definitions/jsonapi"`
|
|
108
|
-
|
|
109
|
-
### Info Document
|
|
110
|
-
|
|
111
|
-
- [ ] info
|
|
112
|
-
- [ ] meta: `"$ref": "#/definitions/meta"`
|
|
113
|
-
- [ ] links: `"$ref": "#/definitions/links"`
|
|
114
|
-
- [ ] jsonapi: ` "$ref": "#/definitions/jsonapi"`
|
|
115
|
-
|
|
116
|
-
### Definitions
|
|
117
|
-
|
|
118
|
-
- [ ] definitions:
|
|
119
|
-
- [ ] meta
|
|
120
|
-
- [ ] data: oneOf (resource, array of unique resources)
|
|
121
|
-
- [ ] resource
|
|
122
|
-
- [ ] attributes
|
|
123
|
-
- [ ] relationships
|
|
124
|
-
- [ ] relationshipToOne
|
|
125
|
-
- [ ] empty
|
|
126
|
-
- [ ] linkage
|
|
127
|
-
- [ ] meta
|
|
128
|
-
- [ ] relationshipToMany
|
|
129
|
-
- [ ] linkage
|
|
130
|
-
- [ ] meta
|
|
131
|
-
- [ ] links
|
|
132
|
-
- [ ] meta
|
|
133
|
-
- [ ] links
|
|
134
|
-
- [ ] link
|
|
135
|
-
- [ ] uri
|
|
136
|
-
- [ ] href, meta
|
|
137
|
-
- [ ] pagination
|
|
138
|
-
- [ ] jsonapi
|
|
139
|
-
- [ ] meta
|
|
140
|
-
- [ ] error
|
|
141
|
-
- [ ] id: a unique identifier for this particular occurrence of the problem.
|
|
142
|
-
- [ ] links: a links object containing the following members:
|
|
143
|
-
- [ ] about: a link that leads to further details about this particular occurrence of the problem.
|
|
144
|
-
- [ ] status: the HTTP status code applicable to this problem, expressed as a string value.
|
|
145
|
-
- [ ] code: an application-specific error code, expressed as a string value.
|
|
146
|
-
- [ ] title: a short, human-readable summary of the problem that SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
|
|
147
|
-
- [x] detail: a human-readable explanation specific to this occurrence of the problem.
|
|
148
|
-
- [x] source: an object containing references to the source of the error, optionally including any of the following members:
|
|
149
|
-
- [x] pointer: a JSON Pointer [RFC6901](https://tools.ietf.org/html/rfc6901) to the associated entity in the request document [e.g. "/data" for a primary data object, or "/data/attributes/title" for a specific attribute].
|
|
150
|
-
- [x] parameter: a string indicating which query parameter caused the error.
|
|
151
|
-
- [ ] meta: a meta object containing non-standard meta-information about the error.
|
data/docs/rfcs/0000-namespace.md
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
- Start Date: (2015-10-29)
|
|
2
|
-
- RFC PR: https://github.com/rails-api/active_model_serializers/pull/1310
|
|
3
|
-
- ActiveModelSerializers Issue: https://github.com/rails-api/active_model_serializers/issues/1298
|
|
4
|
-
|
|
5
|
-
# Summary
|
|
6
|
-
|
|
7
|
-
Provide a consistent API for the user of the AMS.
|
|
8
|
-
|
|
9
|
-
# Motivation
|
|
10
|
-
|
|
11
|
-
The actual public API is defined under `ActiveModelSerializers`,
|
|
12
|
-
`ActiveModel::Serializer` and `ActiveModel`.
|
|
13
|
-
|
|
14
|
-
At the `ActiveModel::Serializer` we have:
|
|
15
|
-
|
|
16
|
-
- `ActiveModel::Serializer.config`
|
|
17
|
-
- `ActiveModel::Serializer`
|
|
18
|
-
|
|
19
|
-
At the `ActiveModelSerializers` we have:
|
|
20
|
-
|
|
21
|
-
- `ActiveModelSerializers::Model`
|
|
22
|
-
- `ActiveModelSerializers.logger`
|
|
23
|
-
|
|
24
|
-
At `ActiveModel` we have:
|
|
25
|
-
|
|
26
|
-
- `ActiveModel::SerializableResource`
|
|
27
|
-
|
|
28
|
-
The idea here is to provide a single namespace `ActiveModelSerializers` to the user.
|
|
29
|
-
Following the same idea we have on other gems like
|
|
30
|
-
[Devise](https://github.com/plataformatec/devise/blob/e9c82472ffe7c43a448945f77e034a0e47dde0bb/lib/devise.rb),
|
|
31
|
-
[Refile](https://github.com/refile/refile/blob/6b24c293d044862dafbf1bfa4606672a64903aa2/lib/refile.rb) and
|
|
32
|
-
[Active Job](https://github.com/rails/rails/blob/30bacc26f8f258b39e12f63fe52389a968d9c1ea/activejob/lib/active_job.rb)
|
|
33
|
-
for example.
|
|
34
|
-
|
|
35
|
-
This way we are clarifing the boundaries of
|
|
36
|
-
[ActiveModelSerializers and Rails](https://github.com/rails-api/active_model_serializers/blob/master/CHANGELOG.md#prehistory)
|
|
37
|
-
and make clear that the `ActiveModel::Serializer` class is no longer the primary
|
|
38
|
-
behavior of the ActiveModelSerializers.
|
|
39
|
-
|
|
40
|
-
# Detailed design
|
|
41
|
-
|
|
42
|
-
## New classes and modules organization
|
|
43
|
-
|
|
44
|
-
Since this will be a big change we can do this on baby steps, read small pull requests. A
|
|
45
|
-
possible approach is:
|
|
46
|
-
|
|
47
|
-
- All new code will be in `lib/active_model_serializers/` using
|
|
48
|
-
the module namespace `ActiveModelSerializers`.
|
|
49
|
-
- Move all content under `ActiveModel::Serializer` to be under
|
|
50
|
-
`ActiveModelSerializers`, the adapter is on this steps;
|
|
51
|
-
- Move all content under `ActiveModel` to be under `ActiveModelSerializers`,
|
|
52
|
-
the `SerializableResource` is on this step;
|
|
53
|
-
- Change all public API that doesn't make sense, keeping in mind only to keep
|
|
54
|
-
this in the same namespace
|
|
55
|
-
- Update the README;
|
|
56
|
-
- Update the docs;
|
|
57
|
-
|
|
58
|
-
The following table represents the current and the desired classes and modules
|
|
59
|
-
at the first moment.
|
|
60
|
-
|
|
61
|
-
| Current | Desired | Notes |
|
|
62
|
-
|--------------------------------------------------------|--------------------------------------------------|--------------------|
|
|
63
|
-
| `ActiveModelSerializers` and `ActiveModel::Serializer` | `ActiveModelSerializers` | The main namespace |
|
|
64
|
-
| `ActiveModelSerializers.logger` | `ActiveModelSerializers.logger` ||
|
|
65
|
-
| `ActiveModelSerializers::Model` | `ActiveModelSerializers::Model` ||
|
|
66
|
-
| `ActiveModel::SerializableResource` | `ActiveModelSerializers::SerializableResource` ||
|
|
67
|
-
| `ActiveModel::Serializer` | `ActiveModelSerializers::Serializer` | The name can be discussed in a future pull request. For example, we can rename this to `Resource` [following this idea](https://github.com/rails-api/active_model_serializers/pull/1301/files#r42963185) more info about naming in the next section|
|
|
68
|
-
| `ActiveModel::Serializer.config` | `ActiveModelSerializers.config` ||
|
|
69
|
-
|
|
70
|
-
## Renaming of class and modules
|
|
71
|
-
|
|
72
|
-
When moving some content to the new namespace we can find some names that does
|
|
73
|
-
not make much sense like `ActiveModel::Serializer::Adapter::JsonApi`.
|
|
74
|
-
Discussion of renaming existing classes / modules and JsonApi objects will
|
|
75
|
-
happen in separate pull requests, and issues, and in the google doc
|
|
76
|
-
https://docs.google.com/document/d/1rcrJr0sVcazY2Opd_6Kmv1iIwuHbI84s1P_NzFn-05c/edit?usp=sharing
|
|
77
|
-
|
|
78
|
-
Some of names already have a definition.
|
|
79
|
-
|
|
80
|
-
- Adapters get their own namespace under ActiveModelSerializers. E.g
|
|
81
|
-
`ActiveModelSerializers::Adapter`
|
|
82
|
-
- Serializers get their own namespace under ActiveModelSerializers. E.g
|
|
83
|
-
`ActiveModelSerializers::Serializer`
|
|
84
|
-
|
|
85
|
-
## Keeping compatibility
|
|
86
|
-
|
|
87
|
-
All moved classes or modules be aliased to their old name and location with
|
|
88
|
-
deprecation warnings, such as
|
|
89
|
-
[was done for CollectionSerializer](https://github.com/rails-api/active_model_serializers/pull/1251).
|
|
90
|
-
|
|
91
|
-
# Drawbacks
|
|
92
|
-
|
|
93
|
-
This will be a breaking change, so all users serializers will be broken after a
|
|
94
|
-
major bump.
|
|
95
|
-
All pull requests will need to rebase since the architeture will change a lot.
|
|
96
|
-
|
|
97
|
-
# Alternatives
|
|
98
|
-
|
|
99
|
-
We can keep the way it is, and keep in mind to not add another namespace as a
|
|
100
|
-
public API.
|
|
101
|
-
|
|
102
|
-
# Unresolved questions
|
|
103
|
-
|
|
104
|
-
What is the better class name to be used to the class that will be inherited at
|
|
105
|
-
the creation of a serializer. This can be discussed in other RFC or directly via
|
|
106
|
-
pull request.
|
data/docs/rfcs/template.md
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
- Start Date: (YYYY-MM-DD)
|
|
2
|
-
- RFC PR: https://github.com/rails-api/active_model_serializers/pull/dddd
|
|
3
|
-
- ActiveModelSerializers Issue: https://github.com/rails-api/active_model_serializers/issues/dddd
|
|
4
|
-
|
|
5
|
-
# Summary
|
|
6
|
-
|
|
7
|
-
# Motivation
|
|
8
|
-
|
|
9
|
-
# Detailed design
|
|
10
|
-
|
|
11
|
-
# Drawbacks
|
|
12
|
-
|
|
13
|
-
# Alternatives
|
|
14
|
-
|
|
15
|
-
# Unresolved questions
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
# Defines an association in the object should be rendered.
|
|
4
|
-
#
|
|
5
|
-
# The serializer object should implement the association name
|
|
6
|
-
# as a method which should return an array when invoked. If a method
|
|
7
|
-
# with the association name does not exist, the association name is
|
|
8
|
-
# dispatched to the serialized object.
|
|
9
|
-
#
|
|
10
|
-
module Associations
|
|
11
|
-
extend ActiveSupport::Concern
|
|
12
|
-
|
|
13
|
-
DEFAULT_INCLUDE_TREE = ActiveModel::Serializer::IncludeTree.from_string('*')
|
|
14
|
-
|
|
15
|
-
included do
|
|
16
|
-
with_options instance_writer: false, instance_reader: true do |serializer|
|
|
17
|
-
serializer.class_attribute :_reflections
|
|
18
|
-
self._reflections ||= []
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
extend ActiveSupport::Autoload
|
|
22
|
-
autoload :Association
|
|
23
|
-
autoload :Reflection
|
|
24
|
-
autoload :SingularReflection
|
|
25
|
-
autoload :CollectionReflection
|
|
26
|
-
autoload :BelongsToReflection
|
|
27
|
-
autoload :HasOneReflection
|
|
28
|
-
autoload :HasManyReflection
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
module ClassMethods
|
|
32
|
-
def inherited(base)
|
|
33
|
-
super
|
|
34
|
-
base._reflections = _reflections.dup
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @param [Symbol] name of the association
|
|
38
|
-
# @param [Hash<Symbol => any>] options for the reflection
|
|
39
|
-
# @return [void]
|
|
40
|
-
#
|
|
41
|
-
# @example
|
|
42
|
-
# has_many :comments, serializer: CommentSummarySerializer
|
|
43
|
-
#
|
|
44
|
-
def has_many(name, options = {}, &block)
|
|
45
|
-
associate(HasManyReflection.new(name, options, block))
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# @param [Symbol] name of the association
|
|
49
|
-
# @param [Hash<Symbol => any>] options for the reflection
|
|
50
|
-
# @return [void]
|
|
51
|
-
#
|
|
52
|
-
# @example
|
|
53
|
-
# belongs_to :author, serializer: AuthorSerializer
|
|
54
|
-
#
|
|
55
|
-
def belongs_to(name, options = {}, &block)
|
|
56
|
-
associate(BelongsToReflection.new(name, options, block))
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# @param [Symbol] name of the association
|
|
60
|
-
# @param [Hash<Symbol => any>] options for the reflection
|
|
61
|
-
# @return [void]
|
|
62
|
-
#
|
|
63
|
-
# @example
|
|
64
|
-
# has_one :author, serializer: AuthorSerializer
|
|
65
|
-
#
|
|
66
|
-
def has_one(name, options = {}, &block)
|
|
67
|
-
associate(HasOneReflection.new(name, options, block))
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
private
|
|
71
|
-
|
|
72
|
-
# Add reflection and define {name} accessor.
|
|
73
|
-
# @param [ActiveModel::Serializer::Reflection] reflection
|
|
74
|
-
# @return [void]
|
|
75
|
-
#
|
|
76
|
-
# @api private
|
|
77
|
-
#
|
|
78
|
-
def associate(reflection)
|
|
79
|
-
self._reflections << reflection
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# @param [IncludeTree] include_tree (defaults to all associations when not provided)
|
|
84
|
-
# @return [Enumerator<Association>]
|
|
85
|
-
#
|
|
86
|
-
def associations(include_tree = DEFAULT_INCLUDE_TREE)
|
|
87
|
-
return unless object
|
|
88
|
-
|
|
89
|
-
Enumerator.new do |y|
|
|
90
|
-
self.class._reflections.each do |reflection|
|
|
91
|
-
next if reflection.excluded?(self)
|
|
92
|
-
key = reflection.options.fetch(:key, reflection.name)
|
|
93
|
-
next unless include_tree.key?(key)
|
|
94
|
-
y.yield reflection.build_association(self, instance_options)
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
module Attributes
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
|
|
6
|
-
included do
|
|
7
|
-
with_options instance_writer: false, instance_reader: false do |serializer|
|
|
8
|
-
serializer.class_attribute :_attributes_data # @api private
|
|
9
|
-
self._attributes_data ||= {}
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
extend ActiveSupport::Autoload
|
|
13
|
-
autoload :Attribute
|
|
14
|
-
|
|
15
|
-
# Return the +attributes+ of +object+ as presented
|
|
16
|
-
# by the serializer.
|
|
17
|
-
def attributes(requested_attrs = nil, reload = false)
|
|
18
|
-
@attributes = nil if reload
|
|
19
|
-
@attributes ||= self.class._attributes_data.each_with_object({}) do |(key, attr), hash|
|
|
20
|
-
next if attr.excluded?(self)
|
|
21
|
-
next unless requested_attrs.nil? || requested_attrs.include?(key)
|
|
22
|
-
hash[key] = attr.value(self)
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
module ClassMethods
|
|
28
|
-
def inherited(base)
|
|
29
|
-
super
|
|
30
|
-
base._attributes_data = _attributes_data.dup
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# @example
|
|
34
|
-
# class AdminAuthorSerializer < ActiveModel::Serializer
|
|
35
|
-
# attributes :id, :name, :recent_edits
|
|
36
|
-
def attributes(*attrs)
|
|
37
|
-
attrs = attrs.first if attrs.first.class == Array
|
|
38
|
-
|
|
39
|
-
attrs.each do |attr|
|
|
40
|
-
attribute(attr)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# @example
|
|
45
|
-
# class AdminAuthorSerializer < ActiveModel::Serializer
|
|
46
|
-
# attributes :id, :recent_edits
|
|
47
|
-
# attribute :name, key: :title
|
|
48
|
-
#
|
|
49
|
-
# attribute :full_name do
|
|
50
|
-
# "#{object.first_name} #{object.last_name}"
|
|
51
|
-
# end
|
|
52
|
-
#
|
|
53
|
-
# def recent_edits
|
|
54
|
-
# object.edits.last(5)
|
|
55
|
-
# end
|
|
56
|
-
def attribute(attr, options = {}, &block)
|
|
57
|
-
key = options.fetch(:key, attr)
|
|
58
|
-
_attributes_data[key] = Attribute.new(attr, options, block)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# @api private
|
|
62
|
-
# keys of attributes
|
|
63
|
-
# @see Serializer::attribute
|
|
64
|
-
def _attributes
|
|
65
|
-
_attributes_data.keys
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# @api private
|
|
69
|
-
# maps attribute value to explict key name
|
|
70
|
-
# @see Serializer::attribute
|
|
71
|
-
# @see FragmentCache#fragment_serializer
|
|
72
|
-
def _attributes_keys
|
|
73
|
-
_attributes_data
|
|
74
|
-
.each_with_object({}) do |(key, attr), hash|
|
|
75
|
-
next if key == attr.name
|
|
76
|
-
hash[attr.name] = { key: key }
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
module Configuration
|
|
4
|
-
include ActiveSupport::Configurable
|
|
5
|
-
extend ActiveSupport::Concern
|
|
6
|
-
|
|
7
|
-
# Configuration options may also be set in
|
|
8
|
-
# Serializers and Adapters
|
|
9
|
-
included do |base|
|
|
10
|
-
config = base.config
|
|
11
|
-
config.collection_serializer = ActiveModel::Serializer::CollectionSerializer
|
|
12
|
-
config.serializer_lookup_enabled = true
|
|
13
|
-
|
|
14
|
-
def config.array_serializer=(collection_serializer)
|
|
15
|
-
self.collection_serializer = collection_serializer
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def config.array_serializer
|
|
19
|
-
collection_serializer
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
config.adapter = :attributes
|
|
23
|
-
config.jsonapi_resource_type = :plural
|
|
24
|
-
config.jsonapi_version = '1.0'
|
|
25
|
-
config.jsonapi_toplevel_meta = {}
|
|
26
|
-
# Make JSON API top-level jsonapi member opt-in
|
|
27
|
-
# ref: http://jsonapi.org/format/#document-top-level
|
|
28
|
-
config.jsonapi_include_toplevel_object = false
|
|
29
|
-
config.key_transform = nil
|
|
30
|
-
|
|
31
|
-
config.schema_path = 'test/support/schemas'
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
# TODO: description of this class, and overview of how it's used
|
|
4
|
-
class IncludeTree
|
|
5
|
-
module Parsing
|
|
6
|
-
module_function
|
|
7
|
-
|
|
8
|
-
# Translates a comma separated list of dot separated paths (JSON API format) into a Hash.
|
|
9
|
-
#
|
|
10
|
-
# @example
|
|
11
|
-
# `'posts.author, posts.comments.upvotes, posts.comments.author'`
|
|
12
|
-
#
|
|
13
|
-
# would become
|
|
14
|
-
#
|
|
15
|
-
# `{ posts: { author: {}, comments: { author: {}, upvotes: {} } } }`.
|
|
16
|
-
#
|
|
17
|
-
# @param [String] included
|
|
18
|
-
# @return [Hash] a Hash representing the same tree structure
|
|
19
|
-
def include_string_to_hash(included)
|
|
20
|
-
# TODO: Needs comment walking through the process of what all this is doing.
|
|
21
|
-
included.delete(' ').split(',').reduce({}) do |hash, path|
|
|
22
|
-
include_tree = path.split('.').reverse_each.reduce({}) { |a, e| { e.to_sym => a } }
|
|
23
|
-
hash.deep_merge!(include_tree)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Translates the arguments passed to the include option into a Hash. The format can be either
|
|
28
|
-
# a String (see #include_string_to_hash), an Array of Symbols and Hashes, or a mix of both.
|
|
29
|
-
#
|
|
30
|
-
# @example
|
|
31
|
-
# `posts: [:author, comments: [:author, :upvotes]]`
|
|
32
|
-
#
|
|
33
|
-
# would become
|
|
34
|
-
#
|
|
35
|
-
# `{ posts: { author: {}, comments: { author: {}, upvotes: {} } } }`.
|
|
36
|
-
#
|
|
37
|
-
# @example
|
|
38
|
-
# `[:author, :comments => [:author]]`
|
|
39
|
-
#
|
|
40
|
-
# would become
|
|
41
|
-
#
|
|
42
|
-
# `{:author => {}, :comments => { author: {} } }`
|
|
43
|
-
#
|
|
44
|
-
# @param [Symbol, Hash, Array, String] included
|
|
45
|
-
# @return [Hash] a Hash representing the same tree structure
|
|
46
|
-
def include_args_to_hash(included)
|
|
47
|
-
case included
|
|
48
|
-
when Symbol
|
|
49
|
-
{ included => {} }
|
|
50
|
-
when Hash
|
|
51
|
-
included.each_with_object({}) do |(key, value), hash|
|
|
52
|
-
hash[key] = include_args_to_hash(value)
|
|
53
|
-
end
|
|
54
|
-
when Array
|
|
55
|
-
included.reduce({}) { |a, e| a.deep_merge!(include_args_to_hash(e)) }
|
|
56
|
-
when String
|
|
57
|
-
include_string_to_hash(included)
|
|
58
|
-
else
|
|
59
|
-
{}
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Builds an IncludeTree from a comma separated list of dot separated paths (JSON API format).
|
|
65
|
-
# @example `'posts.author, posts.comments.upvotes, posts.comments.author'`
|
|
66
|
-
#
|
|
67
|
-
# @param [String] included
|
|
68
|
-
# @return [IncludeTree]
|
|
69
|
-
#
|
|
70
|
-
def self.from_string(included)
|
|
71
|
-
new(Parsing.include_string_to_hash(included))
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Translates the arguments passed to the include option into an IncludeTree.
|
|
75
|
-
# The format can be either a String (see #from_string), an Array of Symbols and Hashes, or a mix of both.
|
|
76
|
-
# @example `posts: [:author, comments: [:author, :upvotes]]`
|
|
77
|
-
#
|
|
78
|
-
# @param [Symbol, Hash, Array, String] included
|
|
79
|
-
# @return [IncludeTree]
|
|
80
|
-
#
|
|
81
|
-
def self.from_include_args(included)
|
|
82
|
-
return included if included.is_a?(IncludeTree)
|
|
83
|
-
|
|
84
|
-
new(Parsing.include_args_to_hash(included))
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# @param [Hash] hash
|
|
88
|
-
def initialize(hash = {})
|
|
89
|
-
@hash = hash
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def key?(key)
|
|
93
|
-
@hash.key?(key) || @hash.key?(:*) || @hash.key?(:**)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def [](key)
|
|
97
|
-
# TODO(beauby): Adopt a lazy caching strategy for generating subtrees.
|
|
98
|
-
case
|
|
99
|
-
when @hash.key?(key)
|
|
100
|
-
self.class.new(@hash[key])
|
|
101
|
-
when @hash.key?(:*)
|
|
102
|
-
self.class.new(@hash[:*])
|
|
103
|
-
when @hash.key?(:**)
|
|
104
|
-
self.class.new(:** => {})
|
|
105
|
-
else
|
|
106
|
-
nil
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
module Links
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
|
|
6
|
-
included do
|
|
7
|
-
with_options instance_writer: false, instance_reader: true do |serializer|
|
|
8
|
-
serializer.class_attribute :_links # @api private
|
|
9
|
-
self._links ||= {}
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
extend ActiveSupport::Autoload
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
module ClassMethods
|
|
16
|
-
def inherited(base)
|
|
17
|
-
super
|
|
18
|
-
base._links = _links.dup
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Define a link on a serializer.
|
|
22
|
-
# @example
|
|
23
|
-
# link(:self) { resource_url(object) }
|
|
24
|
-
# @example
|
|
25
|
-
# link(:self) { "http://example.com/resource/#{object.id}" }
|
|
26
|
-
# @example
|
|
27
|
-
# link :resource, "http://example.com/resource"
|
|
28
|
-
#
|
|
29
|
-
def link(name, value = nil, &block)
|
|
30
|
-
_links[name] = block || value
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
module Meta
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
|
|
6
|
-
included do
|
|
7
|
-
with_options instance_writer: false, instance_reader: true do |serializer|
|
|
8
|
-
serializer.class_attribute :_meta # @api private
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
extend ActiveSupport::Autoload
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
module ClassMethods
|
|
15
|
-
# Set the JSON API meta attribute of a serializer.
|
|
16
|
-
# @example
|
|
17
|
-
# class AdminAuthorSerializer < ActiveModel::Serializer
|
|
18
|
-
# meta { stuff: 'value' }
|
|
19
|
-
# @example
|
|
20
|
-
# meta do
|
|
21
|
-
# { comment_count: object.comments.count }
|
|
22
|
-
# end
|
|
23
|
-
def meta(value = nil, &block)
|
|
24
|
-
self._meta = block || value
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|