active_model_serializers 0.10.3 → 0.10.12
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 +154 -2
- data/README.md +153 -15
- data/lib/action_controller/serialization.rb +11 -1
- data/lib/active_model/serializable_resource.rb +2 -0
- data/lib/active_model/serializer.rb +275 -81
- data/lib/active_model/serializer/adapter.rb +2 -0
- data/lib/active_model/serializer/adapter/attributes.rb +2 -0
- data/lib/active_model/serializer/adapter/base.rb +2 -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/array_serializer.rb +2 -0
- data/lib/active_model/serializer/association.rb +53 -14
- data/lib/active_model/serializer/attribute.rb +2 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +7 -1
- data/lib/active_model/serializer/collection_serializer.rb +8 -5
- data/lib/active_model/serializer/concerns/caching.rb +36 -23
- data/lib/active_model/serializer/error_serializer.rb +2 -0
- data/lib/active_model/serializer/errors_serializer.rb +2 -0
- 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 +6 -1
- data/lib/active_model/serializer/has_one_reflection.rb +3 -1
- 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 +2 -0
- data/lib/active_model/serializer/null.rb +2 -0
- data/lib/active_model/serializer/reflection.rb +122 -73
- data/lib/active_model/serializer/version.rb +3 -1
- data/lib/active_model_serializers.rb +29 -11
- data/lib/active_model_serializers/adapter.rb +3 -1
- data/lib/active_model_serializers/adapter/attributes.rb +23 -0
- data/lib/active_model_serializers/adapter/base.rb +4 -2
- data/lib/active_model_serializers/adapter/json.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api.rb +44 -26
- 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 +2 -0
- data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +42 -21
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -9
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +35 -18
- data/lib/active_model_serializers/adapter/null.rb +2 -0
- data/lib/active_model_serializers/callbacks.rb +2 -0
- data/lib/active_model_serializers/deprecate.rb +2 -0
- data/lib/active_model_serializers/deserialization.rb +2 -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 +2 -0
- data/lib/active_model_serializers/model.rb +111 -30
- data/lib/active_model_serializers/model/caching.rb +25 -0
- data/lib/active_model_serializers/railtie.rb +4 -0
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
- data/lib/active_model_serializers/serializable_resource.rb +4 -2
- data/lib/active_model_serializers/serialization_context.rb +2 -0
- data/lib/active_model_serializers/test.rb +2 -0
- data/lib/active_model_serializers/test/schema.rb +4 -2
- data/lib/active_model_serializers/test/serializer.rb +2 -0
- data/lib/generators/rails/resource_override.rb +3 -1
- data/lib/generators/rails/serializer_generator.rb +2 -0
- data/lib/grape/active_model_serializers.rb +2 -0
- data/lib/grape/formatters/active_model_serializers.rb +2 -0
- data/lib/grape/helpers/active_model_serializers.rb +2 -0
- data/lib/tasks/rubocop.rake +55 -0
- metadata +74 -291
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -102
- data/.simplecov +0 -110
- data/.travis.yml +0 -51
- data/CODE_OF_CONDUCT.md +0 -74
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -56
- data/Rakefile +0 -103
- data/active_model_serializers.gemspec +0 -62
- 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 -125
- data/docs/README.md +0 -42
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -247
- data/docs/general/caching.md +0 -58
- data/docs/general/configuration_options.md +0 -169
- data/docs/general/deserialization.md +0 -100
- data/docs/general/fields.md +0 -31
- 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 -294
- data/docs/general/serializers.md +0 -461
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -138
- data/docs/howto/add_relationship_links.md +0 -137
- data/docs/howto/add_root_key.md +0 -55
- data/docs/howto/grape_integration.md +0 -42
- data/docs/howto/outside_controller_use.md +0 -65
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -32
- data/docs/howto/test.md +0 -154
- data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
- data/docs/integrations/ember-and-json-api.md +0 -144
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema.md +0 -151
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/lib/active_model/serializer/collection_reflection.rb +0 -7
- data/lib/active_model/serializer/concerns/associations.rb +0 -102
- data/lib/active_model/serializer/concerns/attributes.rb +0 -82
- data/lib/active_model/serializer/concerns/configuration.rb +0 -59
- data/lib/active_model/serializer/concerns/links.rb +0 -35
- data/lib/active_model/serializer/concerns/meta.rb +0 -29
- data/lib/active_model/serializer/concerns/type.rb +0 -25
- data/lib/active_model/serializer/singular_reflection.rb +0 -7
- data/lib/active_model_serializers/key_transform.rb +0 -74
- data/test/action_controller/adapter_selector_test.rb +0 -53
- data/test/action_controller/explicit_serializer_test.rb +0 -135
- data/test/action_controller/json/include_test.rb +0 -246
- data/test/action_controller/json_api/deserialization_test.rb +0 -112
- data/test/action_controller/json_api/errors_test.rb +0 -40
- data/test/action_controller/json_api/fields_test.rb +0 -57
- data/test/action_controller/json_api/linked_test.rb +0 -202
- 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/lookup_proc_test.rb +0 -49
- data/test/action_controller/namespace_lookup_test.rb +0 -226
- data/test/action_controller/serialization_scope_name_test.rb +0 -229
- data/test/action_controller/serialization_test.rb +0 -472
- data/test/active_model_serializers/adapter_for_test.rb +0 -208
- data/test/active_model_serializers/json_pointer_test.rb +0 -22
- data/test/active_model_serializers/key_transform_test.rb +0 -297
- data/test/active_model_serializers/logging_test.rb +0 -77
- data/test/active_model_serializers/model_test.rb +0 -22
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -143
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
- 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/attributes_test.rb +0 -43
- 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 -104
- 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 -96
- data/test/adapter/json_api/errors_test.rb +0 -76
- data/test/adapter/json_api/fields_test.rb +0 -88
- 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 -165
- data/test/adapter/json_api/has_one_test.rb +0 -80
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -166
- data/test/adapter/json_api/json_api_test.rb +0 -33
- data/test/adapter/json_api/linked_test.rb +0 -413
- data/test/adapter/json_api/links_test.rb +0 -95
- data/test/adapter/json_api/pagination_links_test.rb +0 -193
- data/test/adapter/json_api/parse_test.rb +0 -137
- data/test/adapter/json_api/relationship_test.rb +0 -397
- data/test/adapter/json_api/resource_identifier_test.rb +0 -110
- 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 -504
- data/test/adapter/json_api/type_test.rb +0 -61
- data/test/adapter/json_test.rb +0 -46
- data/test/adapter/null_test.rb +0 -22
- 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_active_record.rb +0 -81
- data/test/benchmark/bm_adapter.rb +0 -38
- data/test/benchmark/bm_caching.rb +0 -119
- data/test/benchmark/bm_lookup_chain.rb +0 -83
- data/test/benchmark/bm_transform.rb +0 -45
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -83
- data/test/benchmark/fixtures.rb +0 -219
- data/test/cache_test.rb +0 -579
- data/test/collection_serializer_test.rb +0 -110
- data/test/fixtures/active_record.rb +0 -78
- data/test/fixtures/poro.rb +0 -286
- data/test/generators/scaffold_controller_generator_test.rb +0 -24
- data/test/generators/serializer_generator_test.rb +0 -74
- data/test/grape_test.rb +0 -178
- data/test/lint_test.rb +0 -49
- data/test/logger_test.rb +0 -20
- data/test/poro_test.rb +0 -9
- data/test/serializable_resource_test.rb +0 -79
- data/test/serializers/association_macros_test.rb +0 -37
- data/test/serializers/associations_test.rb +0 -370
- 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 -202
- 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 -136
- data/test/serializers/serializer_for_with_namespace_test.rb +0 -87
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -82
- data/test/support/rails5_shims.rb +0 -53
- data/test/support/rails_app.rb +0 -36
- 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 -71
- data/test/test_helper.rb +0 -58
data/bin/serve_benchmark
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -e
|
|
3
|
-
|
|
4
|
-
case "$1" in
|
|
5
|
-
|
|
6
|
-
start)
|
|
7
|
-
config="${CONFIG_RU:-test/benchmark/config.ru}"
|
|
8
|
-
bundle exec ruby -Ilib -S rackup "$config" --daemonize --pid tmp/benchmark_app.pid --warn --server webrick
|
|
9
|
-
until [ -f 'tmp/benchmark_app.pid' ]; do
|
|
10
|
-
sleep 0.1 # give it time to start.. I don't know a better way
|
|
11
|
-
done
|
|
12
|
-
cat tmp/benchmark_app.pid
|
|
13
|
-
true
|
|
14
|
-
;;
|
|
15
|
-
|
|
16
|
-
stop)
|
|
17
|
-
if [ -f 'tmp/benchmark_app.pid' ]; then
|
|
18
|
-
kill -TERM $(cat tmp/benchmark_app.pid)
|
|
19
|
-
else
|
|
20
|
-
echo 'No pidfile'
|
|
21
|
-
false
|
|
22
|
-
fi
|
|
23
|
-
;;
|
|
24
|
-
|
|
25
|
-
status)
|
|
26
|
-
if [ -f 'tmp/benchmark_app.pid' ]; then
|
|
27
|
-
kill -0 $(cat tmp/benchmark_app.pid)
|
|
28
|
-
[ "$?" -eq 0 ]
|
|
29
|
-
else
|
|
30
|
-
echo 'No pidfile'
|
|
31
|
-
false
|
|
32
|
-
fi
|
|
33
|
-
;;
|
|
34
|
-
|
|
35
|
-
*)
|
|
36
|
-
echo "Usage: $0 [start|stop|status]"
|
|
37
|
-
;;
|
|
38
|
-
|
|
39
|
-
esac
|
data/docs/ARCHITECTURE.md
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
[Back to Guides](README.md)
|
|
2
|
-
|
|
3
|
-
This document focuses on architecture the 0.10.x version of ActiveModelSerializers. If you are interested in the architecture of the 0.8 or 0.9 versions,
|
|
4
|
-
please refer to the [0.8 README](https://github.com/rails-api/active_model_serializers/blob/0-8-stable/README.md) or
|
|
5
|
-
[0.9 README](https://github.com/rails-api/active_model_serializers/blob/0-9-stable/README.md).
|
|
6
|
-
|
|
7
|
-
The original design is also available [here](https://github.com/rails-api/active_model_serializers/blob/d72b66d4c5355b0ff0a75a04895fcc4ea5b0c65e/README.textile).
|
|
8
|
-
|
|
9
|
-
# ARCHITECTURE
|
|
10
|
-
|
|
11
|
-
An **`ActiveModel::Serializer`** wraps a [serializable resource](https://github.com/rails/rails/blob/4-2-stable/activemodel/lib/active_model/serialization.rb)
|
|
12
|
-
and exposes an `attributes` method, among a few others.
|
|
13
|
-
It allows you to specify which attributes and associations should be represented in the serializatation of the resource.
|
|
14
|
-
It requires an adapter to transform its attributes into a JSON document; it cannot be serialized itself.
|
|
15
|
-
It may be useful to think of it as a
|
|
16
|
-
[presenter](http://blog.steveklabnik.com/posts/2011-09-09-better-ruby-presenters).
|
|
17
|
-
|
|
18
|
-
The **`ActiveModel::CollectionSerializer`** represents a collection of resources as serializers
|
|
19
|
-
and, if there is no serializer, primitives.
|
|
20
|
-
|
|
21
|
-
The **`ActiveModel::Adapter`** describes the structure of the JSON document generated from a
|
|
22
|
-
serializer. For example, the `Attributes` example represents each serializer as its
|
|
23
|
-
unmodified attributes. The `JsonApi` adapter represents the serializer as a [JSON
|
|
24
|
-
API](http://jsonapi.org/) document.
|
|
25
|
-
|
|
26
|
-
The **`ActiveModelSerializers::SerializableResource`** acts to coordinate the serializer(s) and adapter
|
|
27
|
-
to an object that responds to `to_json`, and `as_json`. It is used in the controller to
|
|
28
|
-
encapsulate the serialization resource when rendered. However, it can also be used on its own
|
|
29
|
-
to serialize a resource outside of a controller, as well.
|
|
30
|
-
|
|
31
|
-
## Primitive handling
|
|
32
|
-
|
|
33
|
-
Definitions: A primitive is usually a String or Array. There is no serializer
|
|
34
|
-
defined for them; they will be serialized when the resource is converted to JSON (`as_json` or
|
|
35
|
-
`to_json`). (The below also applies for any object with no serializer.)
|
|
36
|
-
|
|
37
|
-
ActiveModelSerializers doesn't handle primitives passed to `render json:` at all.
|
|
38
|
-
|
|
39
|
-
However, when a primitive value is an attribute or in a collection,
|
|
40
|
-
it is not modified.
|
|
41
|
-
|
|
42
|
-
Internally, if no serializer can be found in the controller, the resource is not decorated by
|
|
43
|
-
ActiveModelSerializers.
|
|
44
|
-
|
|
45
|
-
If the collection serializer (CollectionSerializer) cannot
|
|
46
|
-
identify a serializer for a resource in its collection, it throws [`:no_serializer`](https://github.com/rails-api/active_model_serializers/issues/1191#issuecomment-142327128).
|
|
47
|
-
For example, when caught by `Reflection#build_association`, the association value is set directly:
|
|
48
|
-
|
|
49
|
-
```ruby
|
|
50
|
-
reflection_options[:virtual_value] = association_value.try(:as_json) || association_value
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
(which is called by the adapter as `serializer.associations(*)`.)
|
|
54
|
-
|
|
55
|
-
## How options are parsed
|
|
56
|
-
|
|
57
|
-
High-level overview:
|
|
58
|
-
|
|
59
|
-
- For a collection
|
|
60
|
-
- `:serializer` specifies the collection serializer and
|
|
61
|
-
- `:each_serializer` specifies the serializer for each resource in the collection.
|
|
62
|
-
- For a single resource, the `:serializer` option is the resource serializer.
|
|
63
|
-
- Options are partitioned in serializer options and adapter options. Keys for adapter options are specified by
|
|
64
|
-
[`ADAPTER_OPTION_KEYS`](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/serializable_resource.rb#L5).
|
|
65
|
-
The remaining options are serializer options.
|
|
66
|
-
|
|
67
|
-
Details:
|
|
68
|
-
|
|
69
|
-
1. **ActionController::Serialization**
|
|
70
|
-
1. `serializable_resource = ActiveModelSerializers::SerializableResource.new(resource, options)`
|
|
71
|
-
1. `options` are partitioned into `adapter_opts` and everything else (`serializer_opts`).
|
|
72
|
-
The `adapter_opts` keys are defined in `ActiveModelSerializers::SerializableResource::ADAPTER_OPTION_KEYS`.
|
|
73
|
-
1. **ActiveModelSerializers::SerializableResource**
|
|
74
|
-
1. `if serializable_resource.serializer?` (there is a serializer for the resource, and an adapter is used.)
|
|
75
|
-
- Where `serializer?` is `use_adapter? && !!(serializer)`
|
|
76
|
-
- Where `use_adapter?`: 'True when no explicit adapter given, or explicit value is truthy (non-nil);
|
|
77
|
-
False when explicit adapter is falsy (nil or false)'
|
|
78
|
-
- Where `serializer`:
|
|
79
|
-
1. from explicit `:serializer` option, else
|
|
80
|
-
2. implicitly from resource `ActiveModel::Serializer.serializer_for(resource)`
|
|
81
|
-
1. A side-effect of checking `serializer` is:
|
|
82
|
-
- The `:serializer` option is removed from the serializer_opts hash
|
|
83
|
-
- If the `:each_serializer` option is present, it is removed from the serializer_opts hash and set as the `:serializer` option
|
|
84
|
-
1. The serializer and adapter are created as
|
|
85
|
-
1. `serializer_instance = serializer.new(resource, serializer_opts)`
|
|
86
|
-
2. `adapter_instance = ActiveModel::Serializer::Adapter.create(serializer_instance, adapter_opts)`
|
|
87
|
-
1. **ActiveModel::Serializer::CollectionSerializer#new**
|
|
88
|
-
1. If the `serializer_instance` was a `CollectionSerializer` and the `:serializer` serializer_opts
|
|
89
|
-
is present, then [that serializer is passed into each resource](https://github.com/rails-api/active_model_serializers/blob/a54d237e2828fe6bab1ea5dfe6360d4ecc8214cd/lib/active_model/serializer/array_serializer.rb#L14-L16).
|
|
90
|
-
1. **ActiveModel::Serializer#attributes** is used by the adapter to get the attributes for
|
|
91
|
-
resource as defined by the serializer.
|
|
92
|
-
|
|
93
|
-
## What does a 'serializable resource' look like?
|
|
94
|
-
|
|
95
|
-
- An `ActiveRecord::Base` object.
|
|
96
|
-
- Any Ruby object that passes the
|
|
97
|
-
[Lint](http://www.rubydoc.info/github/rails-api/active_model_serializers/ActiveModel/Serializer/Lint/Tests)
|
|
98
|
-
[code](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model/serializer/lint.rb).
|
|
99
|
-
|
|
100
|
-
ActiveModelSerializers provides a
|
|
101
|
-
[`ActiveModelSerializers::Model`](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/model.rb),
|
|
102
|
-
which is a simple serializable PORO (Plain-Old Ruby Object).
|
|
103
|
-
|
|
104
|
-
ActiveModelSerializers::Model may be used either as a template, or in production code.
|
|
105
|
-
|
|
106
|
-
```ruby
|
|
107
|
-
class MyModel < ActiveModelSerializers::Model
|
|
108
|
-
attr_accessor :id, :name, :level
|
|
109
|
-
end
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
The default serializer for `MyModel` would be `MyModelSerializer` whether MyModel is an
|
|
113
|
-
ActiveRecord::Base object or not.
|
|
114
|
-
|
|
115
|
-
Outside of the controller the rules are **exactly** the same as for records. For example:
|
|
116
|
-
|
|
117
|
-
```ruby
|
|
118
|
-
render json: MyModel.new(level: 'awesome'), adapter: :json
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
would be serialized the same as
|
|
122
|
-
|
|
123
|
-
```ruby
|
|
124
|
-
ActiveModelSerializers::SerializableResource.new(MyModel.new(level: 'awesome'), adapter: :json).as_json
|
|
125
|
-
```
|
data/docs/README.md
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# Docs - ActiveModel::Serializer 0.10.x
|
|
2
|
-
|
|
3
|
-
This is the documentation of ActiveModelSerializers, it's focused on the **0.10.x version.**
|
|
4
|
-
|
|
5
|
-
-----
|
|
6
|
-
|
|
7
|
-
## General
|
|
8
|
-
|
|
9
|
-
- [Getting Started](general/getting_started.md)
|
|
10
|
-
- [Configuration Options](general/configuration_options.md)
|
|
11
|
-
- [Serializers](general/serializers.md)
|
|
12
|
-
- [Adapters](general/adapters.md)
|
|
13
|
-
- [Rendering](general/rendering.md)
|
|
14
|
-
- [Caching](general/caching.md)
|
|
15
|
-
- [Logging](general/logging.md)
|
|
16
|
-
- [Deserialization](general/deserialization.md)
|
|
17
|
-
- [Instrumentation](general/instrumentation.md)
|
|
18
|
-
- JSON API
|
|
19
|
-
- [Schema](jsonapi/schema.md)
|
|
20
|
-
- [Errors](jsonapi/errors.md)
|
|
21
|
-
- [ARCHITECTURE](ARCHITECTURE.md)
|
|
22
|
-
|
|
23
|
-
## How to
|
|
24
|
-
|
|
25
|
-
- [How to add root key](howto/add_root_key.md)
|
|
26
|
-
- [How to add pagination links](howto/add_pagination_links.md)
|
|
27
|
-
- [How to add relationship links](howto/add_relationship_links.md)
|
|
28
|
-
- [Using ActiveModelSerializers Outside Of Controllers](howto/outside_controller_use.md)
|
|
29
|
-
- [Testing ActiveModelSerializers](howto/test.md)
|
|
30
|
-
- [Passing Arbitrary Options](howto/passing_arbitrary_options.md)
|
|
31
|
-
- [How to serialize a Plain-Old Ruby Object (PORO)](howto/serialize_poro.md)
|
|
32
|
-
- [How to upgrade from `0.8` to `0.10` safely](howto/upgrade_from_0_8_to_0_10.md)
|
|
33
|
-
|
|
34
|
-
## Integrations
|
|
35
|
-
|
|
36
|
-
| Integration | Supported ActiveModelSerializers versions | Gem name and/or link
|
|
37
|
-
|----|-----|----
|
|
38
|
-
| Ember.js | 0.9.x | [active-model-adapter](https://github.com/ember-data/active-model-adapter)
|
|
39
|
-
| Ember.js | 0.10.x + | [docs/integrations/ember-and-json-api.md](integrations/ember-and-json-api.md)
|
|
40
|
-
| Grape | 0.10.x + | [docs/integrations/grape.md](integrations/grape.md) |
|
|
41
|
-
| Grape | 0.9.x | https://github.com/jrhe/grape-active_model_serializers/ |
|
|
42
|
-
| Sinatra | 0.9.x | https://github.com/SauloSilva/sinatra-active-model-serializers/
|
data/docs/STYLE.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# STYLE
|
|
2
|
-
|
|
3
|
-
## Code and comments
|
|
4
|
-
|
|
5
|
-
- We are actively working to identify tasks under the label [**Good for New
|
|
6
|
-
Contributors**](https://github.com/rails-api/active_model_serializers/labels/Good%20for%20New%20Contributors).
|
|
7
|
-
- [Changelog
|
|
8
|
-
Missing](https://github.com/rails-api/active_model_serializers/issues?q=label%3A%22Changelog+Missing%22+is%3Aclosed) is
|
|
9
|
-
an easy way to help out.
|
|
10
|
-
|
|
11
|
-
- [Fix a bug](https://github.com/rails-api/active_model_serializers/labels/Ready%20for%20PR).
|
|
12
|
-
- Ready for PR - A well defined bug, needs someone to PR a fix.
|
|
13
|
-
- Bug - Anything that is broken.
|
|
14
|
-
- Regression - A bug that did not exist in previous versions and isn't a new feature (applied in tandem with Bug).
|
|
15
|
-
- Performance - A performance related issue. We could track this as a bug, but usually these would have slightly lower priority than standard bugs.
|
|
16
|
-
|
|
17
|
-
- [Develop new features](https://github.com/rails-api/active_model_serializers/labels/Feature).
|
|
18
|
-
|
|
19
|
-
- [Improve code quality](https://codeclimate.com/github/rails-api/active_model_serializers/code?sort=smell_count&sort_direction=desc).
|
|
20
|
-
|
|
21
|
-
- [Improve amount of code exercised by tests](https://codeclimate.com/github/rails-api/active_model_serializers/coverage?sort=covered_percent&sort_direction=asc).
|
|
22
|
-
|
|
23
|
-
- [Fix RuboCop (Style) TODOS](https://github.com/rails-api/active_model_serializers/blob/master/.rubocop_todo.yml).
|
|
24
|
-
- Delete and offsense, run `rake rubocop` (or possibly `rake rubocop:auto_correct`),
|
|
25
|
-
and [submit a PR](CONTRIBUTING.md#submitting-a-pull-request-pr).
|
|
26
|
-
|
|
27
|
-
- We are also encouraging comments to substantial changes (larger than bugfixes and simple features) under an
|
|
28
|
-
"RFC" (Request for Comments) process before we start active development.
|
|
29
|
-
Look for the [**RFC**](https://github.com/rails-api/active_model_serializers/labels/RFC) label.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
## Pull requests
|
|
33
|
-
|
|
34
|
-
- If the tests pass and the pull request looks good, a maintainer will merge it.
|
|
35
|
-
- If the pull request needs to be changed,
|
|
36
|
-
- you can change it by updating the branch you generated the pull request from
|
|
37
|
-
- either by adding more commits, or
|
|
38
|
-
- by force pushing to it
|
|
39
|
-
- A maintainer can make any changes themselves and manually merge the code in.
|
|
40
|
-
|
|
41
|
-
## Commit messages
|
|
42
|
-
|
|
43
|
-
- [A Note About Git Commit Messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
|
44
|
-
- [http://stopwritingramblingcommitmessages.com/](http://stopwritingramblingcommitmessages.com/)
|
|
45
|
-
- [ThoughtBot style guide](https://github.com/thoughtbot/guides/tree/master/style#git)
|
|
46
|
-
|
|
47
|
-
#### About Pull Requests (PR's)
|
|
48
|
-
|
|
49
|
-
- [Using Pull Requests](https://help.github.com/articles/using-pull-requests)
|
|
50
|
-
- [Github pull requests made easy](http://www.element84.com/github-pull-requests-made-easy.html)
|
|
51
|
-
- [Exercism Git Workflow](http://help.exercism.io/git-workflow.html).
|
|
52
|
-
- [Level up your Git](http://rakeroutes.com/blog/deliberate-git/)
|
|
53
|
-
- [All Your Open Source Code Are Belong To Us](http://www.benjaminfleischer.com/2013/07/30/all-your-open-source-code-are-belong-to-us/)
|
|
54
|
-
|
|
55
|
-
## Issue Labeling
|
|
56
|
-
|
|
57
|
-
ActiveModelSerializers uses a subset of [StandardIssueLabels](https://github.com/wagenet/StandardIssueLabels) for Github Issues. You can [see our labels here](https://github.com/rails-api/active_model_serializers/labels).
|
|
58
|
-
|
data/docs/general/adapters.md
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Adapters
|
|
4
|
-
|
|
5
|
-
ActiveModelSerializers offers the ability to configure which adapter
|
|
6
|
-
to use both globally and/or when serializing (usually when rendering).
|
|
7
|
-
|
|
8
|
-
The global adapter configuration is set on [`ActiveModelSerializers.config`](configuration_options.md).
|
|
9
|
-
It should be set only once, preferably at initialization.
|
|
10
|
-
|
|
11
|
-
For example:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
ActiveModelSerializers.config.adapter = ActiveModelSerializers::Adapter::JsonApi
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
or
|
|
18
|
-
|
|
19
|
-
```ruby
|
|
20
|
-
ActiveModelSerializers.config.adapter = :json_api
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
or
|
|
24
|
-
|
|
25
|
-
```ruby
|
|
26
|
-
ActiveModelSerializers.config.adapter = :json
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
The local adapter option is in the format `adapter: adapter`, where `adapter` is
|
|
30
|
-
any of the same values as set globally.
|
|
31
|
-
|
|
32
|
-
The configured adapter can be set as a symbol, class, or class name, as described in
|
|
33
|
-
[Advanced adapter configuration](adapters.md#advanced-adapter-configuration).
|
|
34
|
-
|
|
35
|
-
The `Attributes` adapter does not include a root key. It is just the serialized attributes.
|
|
36
|
-
|
|
37
|
-
Use either the `JSON` or `JSON API` adapters if you want the response document to have a root key.
|
|
38
|
-
|
|
39
|
-
## Built in Adapters
|
|
40
|
-
|
|
41
|
-
### Attributes - Default
|
|
42
|
-
|
|
43
|
-
It's the default adapter, it generates a json response without a root key.
|
|
44
|
-
Doesn't follow any specific convention.
|
|
45
|
-
|
|
46
|
-
##### Example output
|
|
47
|
-
|
|
48
|
-
```json
|
|
49
|
-
{
|
|
50
|
-
"title": "Title 1",
|
|
51
|
-
"body": "Body 1",
|
|
52
|
-
"publish_at": "2020-03-16T03:55:25.291Z",
|
|
53
|
-
"author": {
|
|
54
|
-
"first_name": "Bob",
|
|
55
|
-
"last_name": "Jones"
|
|
56
|
-
},
|
|
57
|
-
"comments": [
|
|
58
|
-
{
|
|
59
|
-
"body": "cool"
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"body": "awesome"
|
|
63
|
-
}
|
|
64
|
-
]
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### JSON
|
|
69
|
-
|
|
70
|
-
The json response is always rendered with a root key.
|
|
71
|
-
|
|
72
|
-
The root key can be overridden by:
|
|
73
|
-
* passing the `root` option in the render call. See details in the [Rendering Guides](rendering.md#overriding-the-root-key).
|
|
74
|
-
* setting the `type` of the serializer. See details in the [Serializers Guide](serializers.md#type).
|
|
75
|
-
|
|
76
|
-
Doesn't follow any specific convention.
|
|
77
|
-
|
|
78
|
-
##### Example output
|
|
79
|
-
|
|
80
|
-
```json
|
|
81
|
-
{
|
|
82
|
-
"post": {
|
|
83
|
-
"title": "Title 1",
|
|
84
|
-
"body": "Body 1",
|
|
85
|
-
"publish_at": "2020-03-16T03:55:25.291Z",
|
|
86
|
-
"author": {
|
|
87
|
-
"first_name": "Bob",
|
|
88
|
-
"last_name": "Jones"
|
|
89
|
-
},
|
|
90
|
-
"comments": [{
|
|
91
|
-
"body": "cool"
|
|
92
|
-
}, {
|
|
93
|
-
"body": "awesome"
|
|
94
|
-
}]
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### JSON API
|
|
100
|
-
|
|
101
|
-
This adapter follows **version 1.0** of the [format specified](../jsonapi/schema.md) in
|
|
102
|
-
[jsonapi.org/format](http://jsonapi.org/format).
|
|
103
|
-
|
|
104
|
-
##### Example output
|
|
105
|
-
|
|
106
|
-
```json
|
|
107
|
-
{
|
|
108
|
-
"data": {
|
|
109
|
-
"id": "1337",
|
|
110
|
-
"type": "posts",
|
|
111
|
-
"attributes": {
|
|
112
|
-
"title": "Title 1",
|
|
113
|
-
"body": "Body 1",
|
|
114
|
-
"publish-at": "2020-03-16T03:55:25.291Z"
|
|
115
|
-
},
|
|
116
|
-
"relationships": {
|
|
117
|
-
"author": {
|
|
118
|
-
"data": {
|
|
119
|
-
"id": "1",
|
|
120
|
-
"type": "authors"
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
"comments": {
|
|
124
|
-
"data": [{
|
|
125
|
-
"id": "7",
|
|
126
|
-
"type": "comments"
|
|
127
|
-
}, {
|
|
128
|
-
"id": "12",
|
|
129
|
-
"type": "comments"
|
|
130
|
-
}]
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
"links": {
|
|
134
|
-
"post-authors": "https://example.com/post_authors"
|
|
135
|
-
},
|
|
136
|
-
"meta": {
|
|
137
|
-
"rating": 5,
|
|
138
|
-
"favorite-count": 10
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
#### Included
|
|
145
|
-
|
|
146
|
-
It will include the associated resources in the `"included"` member
|
|
147
|
-
when the resource names are included in the `include` option.
|
|
148
|
-
Including nested associated resources is also supported.
|
|
149
|
-
|
|
150
|
-
```ruby
|
|
151
|
-
render json: @posts, include: ['author', 'comments', 'comments.author']
|
|
152
|
-
# or
|
|
153
|
-
render json: @posts, include: 'author,comments,comments.author'
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
In addition, two types of wildcards may be used:
|
|
157
|
-
|
|
158
|
-
- `*` includes one level of associations.
|
|
159
|
-
- `**` includes all recursively.
|
|
160
|
-
|
|
161
|
-
These can be combined with other paths.
|
|
162
|
-
|
|
163
|
-
```ruby
|
|
164
|
-
render json: @posts, include: '**' # or '*' for a single layer
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
The format of the `include` option can be either:
|
|
168
|
-
|
|
169
|
-
- a String composed of a comma-separated list of [relationship paths](http://jsonapi.org/format/#fetching-includes).
|
|
170
|
-
- an Array of Symbols and Hashes.
|
|
171
|
-
- a mix of both.
|
|
172
|
-
|
|
173
|
-
The following would render posts and include:
|
|
174
|
-
|
|
175
|
-
- the author
|
|
176
|
-
- the author's comments, and
|
|
177
|
-
- every resource referenced by the author's comments (recursively).
|
|
178
|
-
|
|
179
|
-
It could be combined, like above, with other paths in any combination desired.
|
|
180
|
-
|
|
181
|
-
```ruby
|
|
182
|
-
render json: @posts, include: 'author.comments.**'
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
##### Security Considerations
|
|
186
|
-
|
|
187
|
-
Since the included options may come from the query params (i.e. user-controller):
|
|
188
|
-
|
|
189
|
-
```ruby
|
|
190
|
-
render json: @posts, include: params[:include]
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
The user could pass in `include=**`.
|
|
194
|
-
|
|
195
|
-
We recommend filtering any user-supplied includes appropriately.
|
|
196
|
-
|
|
197
|
-
## Advanced adapter configuration
|
|
198
|
-
|
|
199
|
-
### Registering an adapter
|
|
200
|
-
|
|
201
|
-
The default adapter can be configured, as above, to use any class given to it.
|
|
202
|
-
|
|
203
|
-
An adapter may also be specified, e.g. when rendering, as a class or as a symbol.
|
|
204
|
-
If a symbol, then the adapter must be, e.g. `:great_example`,
|
|
205
|
-
`ActiveModelSerializers::Adapter::GreatExample`, or registered.
|
|
206
|
-
|
|
207
|
-
There are two ways to register an adapter:
|
|
208
|
-
|
|
209
|
-
1) The simplest, is to subclass `ActiveModelSerializers::Adapter::Base`, e.g. the below will
|
|
210
|
-
register the `Example::UsefulAdapter` as `"example/useful_adapter"`.
|
|
211
|
-
|
|
212
|
-
```ruby
|
|
213
|
-
module Example
|
|
214
|
-
class UsefulAdapter < ActiveModelSerializers::Adapter::Base
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
You'll notice that the name it registers is the underscored namespace and class.
|
|
220
|
-
|
|
221
|
-
Under the covers, when the `ActiveModelSerializers::Adapter::Base` is subclassed, it registers
|
|
222
|
-
the subclass as `register("example/useful_adapter", Example::UsefulAdapter)`
|
|
223
|
-
|
|
224
|
-
2) Any class can be registered as an adapter by calling `register` directly on the
|
|
225
|
-
`ActiveModelSerializers::Adapter` class. e.g., the below registers `MyAdapter` as
|
|
226
|
-
`:special_adapter`.
|
|
227
|
-
|
|
228
|
-
```ruby
|
|
229
|
-
class MyAdapter; end
|
|
230
|
-
ActiveModelSerializers::Adapter.register(:special_adapter, MyAdapter)
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Looking up an adapter
|
|
234
|
-
|
|
235
|
-
| Method | Return value |
|
|
236
|
-
| :------------ |:---------------|
|
|
237
|
-
| `ActiveModelSerializers::Adapter.adapter_map` | A Hash of all known adapters `{ adapter_name => adapter_class }` |
|
|
238
|
-
| `ActiveModelSerializers::Adapter.adapters` | A (sorted) Array of all known `adapter_names` |
|
|
239
|
-
| `ActiveModelSerializers::Adapter.lookup(name_or_klass)` | The `adapter_class`, else raises an `ActiveModelSerializers::Adapter::UnknownAdapter` error |
|
|
240
|
-
| `ActiveModelSerializers::Adapter.adapter_class(adapter)` | Delegates to `ActiveModelSerializers::Adapter.lookup(adapter)` |
|
|
241
|
-
| `ActiveModelSerializers::Adapter.configured_adapter` | A convenience method for `ActiveModelSerializers::Adapter.lookup(config.adapter)` |
|
|
242
|
-
|
|
243
|
-
The registered adapter name is always a String, but may be looked up as a Symbol or String.
|
|
244
|
-
Helpfully, the Symbol or String is underscored, so that `get(:my_adapter)` and `get("MyAdapter")`
|
|
245
|
-
may both be used.
|
|
246
|
-
|
|
247
|
-
For more information, see [the Adapter class on GitHub](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/adapter.rb)
|