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,38 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Usage:
4
+ # bin/rubocop [-A|-t|-h]
5
+ # bin/rubocop [file or path] [cli options]
6
+ #
7
+ # Options:
8
+ # Autocorrect -A
9
+ # AutoGenConfig -t
10
+ # Usage -h,--help,help
11
+
12
+ set -e
13
+
14
+ case $1 in
15
+ -A)
16
+ echo "Rubocop autocorrect is ON" >&2
17
+ bundle exec rake -f lib/tasks/rubocop.rake rubocop:auto_correct
18
+ ;;
19
+
20
+ -t)
21
+ echo "Rubocop is generating a new TODO" >&2
22
+ bundle exec rake -f lib/tasks/rubocop.rake rubocop:auto_gen_config
23
+ ;;
24
+
25
+ -h|--help|help)
26
+ sed -ne '/^#/!q;s/.\{1,2\}//;1d;p' < "$0"
27
+ ;;
28
+
29
+ *)
30
+ # with no args, run vanilla rubocop
31
+ # else assume we're passing in arbitrary arguments
32
+ if [ -z "$1" ]; then
33
+ bundle exec rake -f lib/tasks/rubocop.rake rubocop
34
+ else
35
+ bundle exec rubocop "$@"
36
+ fi
37
+ ;;
38
+ esac
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,41 @@
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
+
22
+ ## How to
23
+
24
+ - [How to add root key](howto/add_root_key.md)
25
+ - [How to add pagination links](howto/add_pagination_links.md)
26
+ - [How to add relationship links](howto/add_relationship_links.md)
27
+ - [Using ActiveModelSerializers Outside Of Controllers](howto/outside_controller_use.md)
28
+ - [Testing ActiveModelSerializers](howto/test.md)
29
+ - [Passing Arbitrary Options](howto/passing_arbitrary_options.md)
30
+ - [How to serialize a Plain-Old Ruby Object (PORO)](howto/serialize_poro.md)
31
+ - [How to upgrade from `0.8` to `0.10` safely](howto/upgrade_from_0_8_to_0_10.md)
32
+
33
+ ## Integrations
34
+
35
+ | Integration | Supported ActiveModelSerializers versions | Gem name and/or link
36
+ |----|-----|----
37
+ | Ember.js | 0.9.x | [active-model-adapter](https://github.com/ember-data/active-model-adapter)
38
+ | Ember.js | 0.10.x + | [docs/integrations/ember-and-json-api.md](integrations/ember-and-json-api.md)
39
+ | Grape | 0.10.x + | [docs/integrations/grape.md](integrations/grape.md) |
40
+ | Grape | 0.9.x | https://github.com/jrhe/grape-active_model_serializers/ |
41
+ | Sinatra | 0.9.x | https://github.com/SauloSilva/sinatra-active-model-serializers/
@@ -0,0 +1,58 @@
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
+
@@ -0,0 +1,269 @@
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
+ ***IMPORTANT***: Adapter configuration has *no effect* on a serializer instance
40
+ being used directly. That is, `UserSerializer.new(user).as_json` will *always*
41
+ behave as if the adapter were the 'Attributes' adapter. See [Outside Controller
42
+ Usage](../howto/outside_controller_use.md) for more details on recommended
43
+ usage.
44
+
45
+ ## Built in Adapters
46
+
47
+ ### Attributes - Default
48
+
49
+ It's the default adapter, it generates a json response without a root key.
50
+ Doesn't follow any specific convention.
51
+
52
+ ##### Example output
53
+
54
+ ```json
55
+ {
56
+ "title": "Title 1",
57
+ "body": "Body 1",
58
+ "publish_at": "2020-03-16T03:55:25.291Z",
59
+ "author": {
60
+ "first_name": "Bob",
61
+ "last_name": "Jones"
62
+ },
63
+ "comments": [
64
+ {
65
+ "body": "cool"
66
+ },
67
+ {
68
+ "body": "awesome"
69
+ }
70
+ ]
71
+ }
72
+ ```
73
+
74
+ ### JSON
75
+
76
+ The json response is always rendered with a root key.
77
+
78
+ The root key can be overridden by:
79
+ * passing the `root` option in the render call. See details in the [Rendering Guides](rendering.md#overriding-the-root-key).
80
+ * setting the `type` of the serializer. See details in the [Serializers Guide](serializers.md#type).
81
+
82
+ Doesn't follow any specific convention.
83
+
84
+ ##### Example output
85
+
86
+ ```json
87
+ {
88
+ "post": {
89
+ "title": "Title 1",
90
+ "body": "Body 1",
91
+ "publish_at": "2020-03-16T03:55:25.291Z",
92
+ "author": {
93
+ "first_name": "Bob",
94
+ "last_name": "Jones"
95
+ },
96
+ "comments": [{
97
+ "body": "cool"
98
+ }, {
99
+ "body": "awesome"
100
+ }]
101
+ }
102
+ }
103
+ ```
104
+
105
+ ### JSON API
106
+
107
+ This adapter follows **version 1.0** of the [format specified](../jsonapi/schema.md) in
108
+ [jsonapi.org/format](http://jsonapi.org/format).
109
+
110
+ ##### Example output
111
+
112
+ ```json
113
+ {
114
+ "data": {
115
+ "id": "1337",
116
+ "type": "posts",
117
+ "attributes": {
118
+ "title": "Title 1",
119
+ "body": "Body 1",
120
+ "publish-at": "2020-03-16T03:55:25.291Z"
121
+ },
122
+ "relationships": {
123
+ "author": {
124
+ "data": {
125
+ "id": "1",
126
+ "type": "authors"
127
+ }
128
+ },
129
+ "comments": {
130
+ "data": [{
131
+ "id": "7",
132
+ "type": "comments"
133
+ }, {
134
+ "id": "12",
135
+ "type": "comments"
136
+ }]
137
+ }
138
+ },
139
+ "links": {
140
+ "post-authors": "https://example.com/post_authors"
141
+ },
142
+ "meta": {
143
+ "rating": 5,
144
+ "favorite-count": 10
145
+ }
146
+ }
147
+ }
148
+ ```
149
+
150
+ ### Include option
151
+
152
+ Which [serializer associations](https://github.com/rails-api/active_model_serializers/blob/master/docs/general/serializers.md#associations) are rendered can be specified using the `include` option. The option usage is consistent with [the include option in the JSON API spec](http://jsonapi.org/format/#fetching-includes), and is available in all adapters.
153
+
154
+ Example of the usage:
155
+ ```ruby
156
+ render json: @posts, include: ['author', 'comments', 'comments.author']
157
+ # or
158
+ render json: @posts, include: 'author,comments,comments.author'
159
+ ```
160
+
161
+ The format of the `include` option can be either:
162
+
163
+ - a String composed of a comma-separated list of [relationship paths](http://jsonapi.org/format/#fetching-includes).
164
+ - an Array of Symbols and Hashes.
165
+ - a mix of both.
166
+
167
+ An empty string or an empty array will prevent rendering of any associations.
168
+
169
+ In addition, two types of wildcards may be used:
170
+
171
+ - `*` includes one level of associations.
172
+ - `**` includes all recursively.
173
+
174
+ These can be combined with other paths.
175
+
176
+ ```ruby
177
+ render json: @posts, include: '**' # or '*' for a single layer
178
+ ```
179
+
180
+
181
+ The following would render posts and include:
182
+
183
+ - the author
184
+ - the author's comments, and
185
+ - every resource referenced by the author's comments (recursively).
186
+
187
+ It could be combined, like above, with other paths in any combination desired.
188
+
189
+ ```ruby
190
+ render json: @posts, include: 'author.comments.**'
191
+ ```
192
+
193
+ **Note:** Wildcards are ActiveModelSerializers-specific, they are not part of the JSON API spec.
194
+
195
+ The default include for the JSON API adapter is no associations. The default for the JSON and Attributes adapters is all associations.
196
+
197
+ For the JSON API adapter associated resources will be gathered in the `"included"` member. For the JSON and Attributes
198
+ adapters associated resources will be rendered among the other attributes.
199
+
200
+ Only for the JSON API adapter you can specify, which attributes of associated resources will be rendered. This feature
201
+ is called [sparse fieldset](http://jsonapi.org/format/#fetching-sparse-fieldsets):
202
+
203
+ ```ruby
204
+ render json: @posts, include: 'comments', fields: { comments: ['content', 'created_at'] }
205
+ ```
206
+
207
+ ##### Security Considerations
208
+
209
+ Since the included options may come from the query params (i.e. user-controller):
210
+
211
+ ```ruby
212
+ render json: @posts, include: params[:include]
213
+ ```
214
+
215
+ The user could pass in `include=**`.
216
+
217
+ We recommend filtering any user-supplied includes appropriately.
218
+
219
+ ## Advanced adapter configuration
220
+
221
+ ### Registering an adapter
222
+
223
+ The default adapter can be configured, as above, to use any class given to it.
224
+
225
+ An adapter may also be specified, e.g. when rendering, as a class or as a symbol.
226
+ If a symbol, then the adapter must be, e.g. `:great_example`,
227
+ `ActiveModelSerializers::Adapter::GreatExample`, or registered.
228
+
229
+ There are two ways to register an adapter:
230
+
231
+ 1) The simplest, is to subclass `ActiveModelSerializers::Adapter::Base`, e.g. the below will
232
+ register the `Example::UsefulAdapter` as `"example/useful_adapter"`.
233
+
234
+ ```ruby
235
+ module Example
236
+ class UsefulAdapter < ActiveModelSerializers::Adapter::Base
237
+ end
238
+ end
239
+ ```
240
+
241
+ You'll notice that the name it registers is the underscored namespace and class.
242
+
243
+ Under the covers, when the `ActiveModelSerializers::Adapter::Base` is subclassed, it registers
244
+ the subclass as `register("example/useful_adapter", Example::UsefulAdapter)`
245
+
246
+ 2) Any class can be registered as an adapter by calling `register` directly on the
247
+ `ActiveModelSerializers::Adapter` class. e.g., the below registers `MyAdapter` as
248
+ `:special_adapter`.
249
+
250
+ ```ruby
251
+ class MyAdapter; end
252
+ ActiveModelSerializers::Adapter.register(:special_adapter, MyAdapter)
253
+ ```
254
+
255
+ ### Looking up an adapter
256
+
257
+ | Method | Return value |
258
+ | :------------ |:---------------|
259
+ | `ActiveModelSerializers::Adapter.adapter_map` | A Hash of all known adapters `{ adapter_name => adapter_class }` |
260
+ | `ActiveModelSerializers::Adapter.adapters` | A (sorted) Array of all known `adapter_names` |
261
+ | `ActiveModelSerializers::Adapter.lookup(name_or_klass)` | The `adapter_class`, else raises an `ActiveModelSerializers::Adapter::UnknownAdapter` error |
262
+ | `ActiveModelSerializers::Adapter.adapter_class(adapter)` | Delegates to `ActiveModelSerializers::Adapter.lookup(adapter)` |
263
+ | `ActiveModelSerializers::Adapter.configured_adapter` | A convenience method for `ActiveModelSerializers::Adapter.lookup(config.adapter)` |
264
+
265
+ The registered adapter name is always a String, but may be looked up as a Symbol or String.
266
+ Helpfully, the Symbol or String is underscored, so that `get(:my_adapter)` and `get("MyAdapter")`
267
+ may both be used.
268
+
269
+ 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)