agi_active_model_serializers 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) 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 +102 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +51 -0
  8. data/CHANGELOG.md +612 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +56 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +307 -0
  14. data/Rakefile +103 -0
  15. data/active_model_serializers.gemspec +63 -0
  16. data/appveyor.yml +24 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/serve_benchmark +39 -0
  20. data/docs/README.md +41 -0
  21. data/docs/STYLE.md +58 -0
  22. data/docs/general/adapters.md +247 -0
  23. data/docs/general/caching.md +58 -0
  24. data/docs/general/configuration_options.md +169 -0
  25. data/docs/general/deserialization.md +100 -0
  26. data/docs/general/fields.md +31 -0
  27. data/docs/general/getting_started.md +133 -0
  28. data/docs/general/instrumentation.md +40 -0
  29. data/docs/general/key_transforms.md +40 -0
  30. data/docs/general/logging.md +14 -0
  31. data/docs/general/rendering.md +279 -0
  32. data/docs/general/serializers.md +461 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +138 -0
  35. data/docs/howto/add_relationship_links.md +137 -0
  36. data/docs/howto/add_root_key.md +55 -0
  37. data/docs/howto/grape_integration.md +42 -0
  38. data/docs/howto/outside_controller_use.md +65 -0
  39. data/docs/howto/passing_arbitrary_options.md +27 -0
  40. data/docs/howto/serialize_poro.md +32 -0
  41. data/docs/howto/test.md +154 -0
  42. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  43. data/docs/integrations/ember-and-json-api.md +144 -0
  44. data/docs/integrations/grape.md +19 -0
  45. data/docs/jsonapi/errors.md +56 -0
  46. data/docs/jsonapi/schema.md +151 -0
  47. data/docs/jsonapi/schema/schema.json +366 -0
  48. data/docs/rfcs/0000-namespace.md +106 -0
  49. data/docs/rfcs/template.md +15 -0
  50. data/lib/action_controller/serialization.rb +66 -0
  51. data/lib/active_model/serializable_resource.rb +11 -0
  52. data/lib/active_model/serializer.rb +231 -0
  53. data/lib/active_model/serializer/adapter.rb +24 -0
  54. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  55. data/lib/active_model/serializer/adapter/base.rb +18 -0
  56. data/lib/active_model/serializer/adapter/json.rb +15 -0
  57. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  58. data/lib/active_model/serializer/adapter/null.rb +15 -0
  59. data/lib/active_model/serializer/array_serializer.rb +12 -0
  60. data/lib/active_model/serializer/association.rb +34 -0
  61. data/lib/active_model/serializer/attribute.rb +25 -0
  62. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +87 -0
  65. data/lib/active_model/serializer/concerns/associations.rb +102 -0
  66. data/lib/active_model/serializer/concerns/attributes.rb +82 -0
  67. data/lib/active_model/serializer/concerns/caching.rb +292 -0
  68. data/lib/active_model/serializer/concerns/configuration.rb +59 -0
  69. data/lib/active_model/serializer/concerns/links.rb +35 -0
  70. data/lib/active_model/serializer/concerns/meta.rb +29 -0
  71. data/lib/active_model/serializer/concerns/type.rb +25 -0
  72. data/lib/active_model/serializer/error_serializer.rb +14 -0
  73. data/lib/active_model/serializer/errors_serializer.rb +32 -0
  74. data/lib/active_model/serializer/field.rb +90 -0
  75. data/lib/active_model/serializer/fieldset.rb +31 -0
  76. data/lib/active_model/serializer/has_many_reflection.rb +7 -0
  77. data/lib/active_model/serializer/has_one_reflection.rb +7 -0
  78. data/lib/active_model/serializer/lint.rb +150 -0
  79. data/lib/active_model/serializer/null.rb +17 -0
  80. data/lib/active_model/serializer/reflection.rb +163 -0
  81. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  82. data/lib/active_model/serializer/version.rb +5 -0
  83. data/lib/active_model_serializers.rb +53 -0
  84. data/lib/active_model_serializers/adapter.rb +98 -0
  85. data/lib/active_model_serializers/adapter/attributes.rb +13 -0
  86. data/lib/active_model_serializers/adapter/base.rb +83 -0
  87. data/lib/active_model_serializers/adapter/json.rb +21 -0
  88. data/lib/active_model_serializers/adapter/json_api.rb +517 -0
  89. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  90. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  91. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  92. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  93. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  94. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +69 -0
  95. data/lib/active_model_serializers/adapter/json_api/relationship.rb +63 -0
  96. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +51 -0
  97. data/lib/active_model_serializers/adapter/null.rb +9 -0
  98. data/lib/active_model_serializers/callbacks.rb +55 -0
  99. data/lib/active_model_serializers/deprecate.rb +54 -0
  100. data/lib/active_model_serializers/deserialization.rb +15 -0
  101. data/lib/active_model_serializers/json_pointer.rb +14 -0
  102. data/lib/active_model_serializers/logging.rb +122 -0
  103. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  104. data/lib/active_model_serializers/model.rb +71 -0
  105. data/lib/active_model_serializers/railtie.rb +48 -0
  106. data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
  107. data/lib/active_model_serializers/serializable_resource.rb +82 -0
  108. data/lib/active_model_serializers/serialization_context.rb +39 -0
  109. data/lib/active_model_serializers/test.rb +7 -0
  110. data/lib/active_model_serializers/test/schema.rb +138 -0
  111. data/lib/active_model_serializers/test/serializer.rb +125 -0
  112. data/lib/generators/rails/USAGE +6 -0
  113. data/lib/generators/rails/resource_override.rb +10 -0
  114. data/lib/generators/rails/serializer_generator.rb +36 -0
  115. data/lib/generators/rails/templates/serializer.rb.erb +15 -0
  116. data/lib/grape/active_model_serializers.rb +16 -0
  117. data/lib/grape/formatters/active_model_serializers.rb +32 -0
  118. data/lib/grape/helpers/active_model_serializers.rb +17 -0
  119. data/test/action_controller/adapter_selector_test.rb +53 -0
  120. data/test/action_controller/explicit_serializer_test.rb +135 -0
  121. data/test/action_controller/json/include_test.rb +246 -0
  122. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  123. data/test/action_controller/json_api/errors_test.rb +40 -0
  124. data/test/action_controller/json_api/fields_test.rb +66 -0
  125. data/test/action_controller/json_api/linked_test.rb +202 -0
  126. data/test/action_controller/json_api/pagination_test.rb +116 -0
  127. data/test/action_controller/json_api/transform_test.rb +189 -0
  128. data/test/action_controller/lookup_proc_test.rb +49 -0
  129. data/test/action_controller/namespace_lookup_test.rb +232 -0
  130. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  131. data/test/action_controller/serialization_test.rb +472 -0
  132. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  133. data/test/active_model_serializers/json_pointer_test.rb +22 -0
  134. data/test/active_model_serializers/logging_test.rb +77 -0
  135. data/test/active_model_serializers/model_test.rb +69 -0
  136. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  137. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  138. data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
  139. data/test/active_model_serializers/test/schema_test.rb +131 -0
  140. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  141. data/test/active_record_test.rb +9 -0
  142. data/test/adapter/attributes_test.rb +43 -0
  143. data/test/adapter/deprecation_test.rb +100 -0
  144. data/test/adapter/json/belongs_to_test.rb +45 -0
  145. data/test/adapter/json/collection_test.rb +104 -0
  146. data/test/adapter/json/has_many_test.rb +45 -0
  147. data/test/adapter/json/transform_test.rb +93 -0
  148. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  149. data/test/adapter/json_api/collection_test.rb +96 -0
  150. data/test/adapter/json_api/errors_test.rb +76 -0
  151. data/test/adapter/json_api/fields_test.rb +96 -0
  152. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  153. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  154. data/test/adapter/json_api/has_many_test.rb +165 -0
  155. data/test/adapter/json_api/has_one_test.rb +80 -0
  156. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +168 -0
  157. data/test/adapter/json_api/json_api_test.rb +33 -0
  158. data/test/adapter/json_api/linked_test.rb +413 -0
  159. data/test/adapter/json_api/links_test.rb +95 -0
  160. data/test/adapter/json_api/pagination_links_test.rb +193 -0
  161. data/test/adapter/json_api/parse_test.rb +137 -0
  162. data/test/adapter/json_api/relationship_test.rb +397 -0
  163. data/test/adapter/json_api/resource_identifier_test.rb +110 -0
  164. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  165. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  166. data/test/adapter/json_api/transform_test.rb +512 -0
  167. data/test/adapter/json_api/type_test.rb +61 -0
  168. data/test/adapter/json_test.rb +46 -0
  169. data/test/adapter/null_test.rb +22 -0
  170. data/test/adapter/polymorphic_test.rb +171 -0
  171. data/test/adapter_test.rb +67 -0
  172. data/test/array_serializer_test.rb +22 -0
  173. data/test/benchmark/app.rb +65 -0
  174. data/test/benchmark/benchmarking_support.rb +67 -0
  175. data/test/benchmark/bm_active_record.rb +81 -0
  176. data/test/benchmark/bm_adapter.rb +38 -0
  177. data/test/benchmark/bm_caching.rb +119 -0
  178. data/test/benchmark/bm_lookup_chain.rb +83 -0
  179. data/test/benchmark/bm_transform.rb +45 -0
  180. data/test/benchmark/config.ru +3 -0
  181. data/test/benchmark/controllers.rb +83 -0
  182. data/test/benchmark/fixtures.rb +219 -0
  183. data/test/cache_test.rb +595 -0
  184. data/test/collection_serializer_test.rb +123 -0
  185. data/test/fixtures/active_record.rb +113 -0
  186. data/test/fixtures/poro.rb +232 -0
  187. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  188. data/test/generators/serializer_generator_test.rb +74 -0
  189. data/test/grape_test.rb +178 -0
  190. data/test/lint_test.rb +49 -0
  191. data/test/logger_test.rb +20 -0
  192. data/test/poro_test.rb +9 -0
  193. data/test/serializable_resource_test.rb +79 -0
  194. data/test/serializers/association_macros_test.rb +37 -0
  195. data/test/serializers/associations_test.rb +383 -0
  196. data/test/serializers/attribute_test.rb +153 -0
  197. data/test/serializers/attributes_test.rb +52 -0
  198. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  199. data/test/serializers/configuration_test.rb +32 -0
  200. data/test/serializers/fieldset_test.rb +14 -0
  201. data/test/serializers/meta_test.rb +202 -0
  202. data/test/serializers/options_test.rb +32 -0
  203. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  204. data/test/serializers/root_test.rb +21 -0
  205. data/test/serializers/serialization_test.rb +55 -0
  206. data/test/serializers/serializer_for_test.rb +136 -0
  207. data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
  208. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  209. data/test/support/isolated_unit.rb +82 -0
  210. data/test/support/rails5_shims.rb +53 -0
  211. data/test/support/rails_app.rb +36 -0
  212. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  213. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  214. data/test/support/schemas/custom/show.json +7 -0
  215. data/test/support/schemas/hyper_schema.json +93 -0
  216. data/test/support/schemas/render_using_json_api.json +43 -0
  217. data/test/support/schemas/simple_json_pointers.json +10 -0
  218. data/test/support/serialization_testing.rb +71 -0
  219. data/test/test_helper.rb +58 -0
  220. metadata +602 -0
@@ -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,247 @@
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)
@@ -0,0 +1,58 @@
1
+ [Back to Guides](../README.md)
2
+
3
+ # Caching
4
+
5
+ ## Warning
6
+
7
+ There is currently a problem with caching in AMS [Caching doesn't improve performance](https://github.com/rails-api/active_model_serializers/issues/1586). Adding caching _may_ slow down your application, rather than speeding it up. We suggest you benchmark any caching you implement before using in a production enviroment
8
+
9
+ ___
10
+
11
+ To cache a serializer, call ```cache``` and pass its options.
12
+ The options are the same options of ```ActiveSupport::Cache::Store```, plus
13
+ a ```key``` option that will be the prefix of the object cache
14
+ on a pattern ```"#{key}/#{object.id}-#{object.updated_at}"```.
15
+
16
+ The cache support is optimized to use the cached object in multiple request. An object cached on a ```show``` request will be reused at the ```index```. If there is a relationship with another cached serializer it will also be created and reused automatically.
17
+
18
+ **[NOTE] Every object is individually cached.**
19
+
20
+ **[NOTE] The cache is automatically expired after an object is updated, but it's not deleted.**
21
+
22
+ ```ruby
23
+ cache(options = nil) # options: ```{key, expires_in, compress, force, race_condition_ttl}```
24
+ ```
25
+
26
+ Take the example below:
27
+
28
+ ```ruby
29
+ class PostSerializer < ActiveModel::Serializer
30
+ cache key: 'post', expires_in: 3.hours
31
+ attributes :title, :body
32
+
33
+ has_many :comments
34
+ end
35
+ ```
36
+
37
+ On this example every ```Post``` object will be cached with
38
+ the key ```"post/#{post.id}-#{post.updated_at}"```. You can use this key to expire it as you want,
39
+ but in this case it will be automatically expired after 3 hours.
40
+
41
+ ## Fragment Caching
42
+
43
+ If there is some API endpoint that shouldn't be fully cached, you can still optimise it, using Fragment Cache on the attributes and relationships that you want to cache.
44
+
45
+ You can define the attribute by using ```only``` or ```except``` option on cache method.
46
+
47
+ **[NOTE] Cache serializers will be used at their relationships**
48
+
49
+ Example:
50
+
51
+ ```ruby
52
+ class PostSerializer < ActiveModel::Serializer
53
+ cache key: 'post', expires_in: 3.hours, only: [:title]
54
+ attributes :title, :body
55
+
56
+ has_many :comments
57
+ end
58
+ ```
@@ -0,0 +1,169 @@
1
+ [Back to Guides](../README.md)
2
+
3
+ # Configuration Options
4
+
5
+ The following configuration options can be set on
6
+ `ActiveModelSerializers.config`, preferably inside an initializer.
7
+
8
+ ## General
9
+
10
+ ##### adapter
11
+
12
+ The [adapter](adapters.md) to use.
13
+
14
+ Possible values:
15
+
16
+ - `:attributes` (default)
17
+ - `:json`
18
+ - `:json_api`
19
+
20
+ ##### serializer_lookup_enabled
21
+
22
+ Enable automatic serializer lookup.
23
+
24
+ Possible values:
25
+
26
+ - `true` (default)
27
+ - `false`
28
+
29
+ When `false`, serializers must be explicitly specified.
30
+
31
+ ##### key_transform
32
+
33
+ The [key transform](key_transforms.md) to use.
34
+
35
+
36
+ | Option | Result |
37
+ |----|----|
38
+ | `:camel` | ExampleKey |
39
+ | `:camel_lower` | exampleKey |
40
+ | `:dash` | example-key |
41
+ | `:unaltered` | the original, unaltered key |
42
+ | `:underscore` | example_key |
43
+ | `nil` | use the adapter default |
44
+
45
+ Each adapter has a default key transform configured:
46
+
47
+ | Adapter | Default Key Transform |
48
+ |----|----|
49
+ | `Attributes` | `:unaltered` |
50
+ | `Json` | `:unaltered` |
51
+ | `JsonApi` | `:dash` |
52
+
53
+ `config.key_transform` is a global override of the adapter default. Adapters
54
+ still prefer the render option `:key_transform` over this setting.
55
+
56
+ *NOTE: Key transforms can be expensive operations. If key transforms are unnecessary for the
57
+ application, setting `config.key_transform` to `:unaltered` will provide a performance boost.*
58
+
59
+ ##### default_includes
60
+ What relationships to serialize by default. Default: `'*'`, which includes one level of related
61
+ objects. See [includes](adapters.md#included) for more info.
62
+
63
+
64
+ ##### serializer_lookup_chain
65
+
66
+ Configures how serializers are searched for. By default, the lookup chain is
67
+
68
+ ```ruby
69
+ ActiveModelSerializers::LookupChain::DEFAULT
70
+ ```
71
+
72
+ which is shorthand for
73
+
74
+ ```ruby
75
+ [
76
+ ActiveModelSerializers::LookupChain::BY_PARENT_SERIALIZER,
77
+ ActiveModelSerializers::LookupChain::BY_NAMESPACE,
78
+ ActiveModelSerializers::LookupChain::BY_RESOURCE_NAMESPACE,
79
+ ActiveModelSerializers::LookupChain::BY_RESOURCE
80
+ ]
81
+ ```
82
+
83
+ Each of the array entries represent a proc. A serializer lookup proc will be yielded 3 arguments. `resource_class`, `serializer_class`, and `namespace`.
84
+
85
+ Note that:
86
+ - `resource_class` is the class of the resource being rendered
87
+ - by default `serializer_class` is `ActiveModel::Serializer`
88
+ - for association lookup it's the "parent" serializer
89
+ - `namespace` correspond to either the controller namespace or the [optionally] specified [namespace render option](./rendering.md#namespace)
90
+
91
+ An example config could be:
92
+
93
+ ```ruby
94
+ ActiveModelSerializers.config.serializer_lookup_chain = [
95
+ lambda do |resource_class, serializer_class, namespace|
96
+ "API::#{namespace}::#{resource_class}"
97
+ end
98
+ ]
99
+ ```
100
+
101
+ If you simply want to add to the existing lookup_chain. Use `unshift`.
102
+
103
+ ```ruby
104
+ ActiveModelSerializers.config.serializer_lookup_chain.unshift(
105
+ lambda do |resource_class, serializer_class, namespace|
106
+ # ...
107
+ end
108
+ )
109
+ ```
110
+
111
+ See [lookup_chain.rb](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/lookup_chain.rb) for further explanations and examples.
112
+
113
+ ## JSON API
114
+
115
+ ##### jsonapi_resource_type
116
+
117
+ Sets whether the [type](http://jsonapi.org/format/#document-resource-identifier-objects)
118
+ of the resource should be `singularized` or `pluralized` when it is not
119
+ [explicitly specified by the serializer](https://github.com/rails-api/active_model_serializers/blob/master/docs/general/serializers.md#type)
120
+
121
+ Possible values:
122
+
123
+ - `:singular`
124
+ - `:plural` (default)
125
+
126
+ ##### jsonapi_namespace_separator
127
+
128
+ Sets separator string for namespaced models to render `type` attribute.
129
+
130
+
131
+ | Separator | Example: Admin::User |
132
+ |----|----|
133
+ | `'-'` (default) | 'admin-users'
134
+ | `'--'` (recommended) | 'admin--users'
135
+
136
+ See [Recommendation for dasherizing (kebab-case-ing) namespaced object, such as `Admin::User`](https://github.com/json-api/json-api/issues/850)
137
+ for more discussion.
138
+
139
+ ##### jsonapi_include_toplevel_object
140
+
141
+ Include a [top level jsonapi member](http://jsonapi.org/format/#document-jsonapi-object)
142
+ in the response document.
143
+
144
+ Possible values:
145
+
146
+ - `true`
147
+ - `false` (default)
148
+
149
+ ##### jsonapi_version
150
+
151
+ The latest version of the spec to which the API conforms.
152
+
153
+ Default: `'1.0'`.
154
+
155
+ *Used when `jsonapi_include_toplevel_object` is `true`*
156
+
157
+ ##### jsonapi_toplevel_meta
158
+
159
+ Optional top-level metadata. Not included if empty.
160
+
161
+ Default: `{}`.
162
+
163
+ *Used when `jsonapi_include_toplevel_object` is `true`*
164
+
165
+
166
+ ## Hooks
167
+
168
+ To run a hook when ActiveModelSerializers is loaded, use
169
+ `ActiveSupport.on_load(:action_controller) do end`