active_model_serializers 0.10.0 → 0.10.2

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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -4
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +39 -2
  5. data/Gemfile +1 -1
  6. data/README.md +21 -24
  7. data/Rakefile +3 -3
  8. data/active_model_serializers.gemspec +19 -23
  9. data/docs/general/adapters.md +4 -2
  10. data/docs/general/configuration_options.md +6 -1
  11. data/docs/general/deserialization.md +1 -1
  12. data/docs/general/fields.md +31 -0
  13. data/docs/general/rendering.md +7 -2
  14. data/docs/general/serializers.md +62 -3
  15. data/docs/howto/add_pagination_links.md +2 -3
  16. data/docs/integrations/ember-and-json-api.md +25 -10
  17. data/docs/jsonapi/schema.md +1 -1
  18. data/lib/action_controller/serialization.rb +4 -3
  19. data/lib/active_model/serializer/adapter/base.rb +2 -0
  20. data/lib/active_model/serializer/array_serializer.rb +8 -5
  21. data/lib/active_model/serializer/associations.rb +6 -7
  22. data/lib/active_model/serializer/belongs_to_reflection.rb +0 -3
  23. data/lib/active_model/serializer/caching.rb +67 -112
  24. data/lib/active_model/serializer/collection_serializer.rb +30 -10
  25. data/lib/active_model/serializer/configuration.rb +1 -0
  26. data/lib/active_model/serializer/error_serializer.rb +11 -7
  27. data/lib/active_model/serializer/errors_serializer.rb +25 -20
  28. data/lib/active_model/serializer/has_many_reflection.rb +0 -3
  29. data/lib/active_model/serializer/has_one_reflection.rb +0 -3
  30. data/lib/active_model/serializer/lint.rb +134 -130
  31. data/lib/active_model/serializer/reflection.rb +3 -3
  32. data/lib/active_model/serializer/version.rb +1 -1
  33. data/lib/active_model/serializer.rb +57 -15
  34. data/lib/active_model_serializers/adapter/attributes.rb +2 -67
  35. data/lib/active_model_serializers/adapter/base.rb +38 -38
  36. data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
  37. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +8 -1
  38. data/lib/active_model_serializers/adapter/json_api.rb +36 -28
  39. data/lib/active_model_serializers/adapter.rb +6 -0
  40. data/lib/active_model_serializers/deprecate.rb +1 -2
  41. data/lib/active_model_serializers/deserialization.rb +2 -0
  42. data/lib/active_model_serializers/model.rb +3 -1
  43. data/lib/active_model_serializers/railtie.rb +3 -1
  44. data/lib/active_model_serializers/register_jsonapi_renderer.rb +44 -31
  45. data/lib/active_model_serializers/serialization_context.rb +10 -3
  46. data/lib/active_model_serializers.rb +6 -0
  47. data/lib/generators/rails/serializer_generator.rb +3 -3
  48. data/lib/grape/active_model_serializers.rb +7 -5
  49. data/lib/grape/formatters/active_model_serializers.rb +19 -2
  50. data/lib/grape/helpers/active_model_serializers.rb +1 -0
  51. data/test/action_controller/adapter_selector_test.rb +4 -4
  52. data/test/action_controller/explicit_serializer_test.rb +5 -4
  53. data/test/action_controller/json/include_test.rb +106 -27
  54. data/test/action_controller/json_api/errors_test.rb +6 -7
  55. data/test/action_controller/json_api/linked_test.rb +29 -24
  56. data/test/action_controller/json_api/pagination_test.rb +19 -19
  57. data/test/action_controller/serialization_test.rb +10 -7
  58. data/test/active_model_serializers/json_pointer_test.rb +15 -13
  59. data/test/active_model_serializers/key_transform_test.rb +254 -252
  60. data/test/active_model_serializers/model_test.rb +6 -4
  61. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +143 -0
  62. data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
  63. data/test/adapter/json/collection_test.rb +14 -0
  64. data/test/adapter/json/transform_test.rb +14 -14
  65. data/test/adapter/json_api/collection_test.rb +4 -3
  66. data/test/adapter/json_api/errors_test.rb +17 -19
  67. data/test/adapter/json_api/has_many_test.rb +18 -18
  68. data/test/adapter/json_api/json_api_test.rb +5 -7
  69. data/test/adapter/json_api/linked_test.rb +9 -6
  70. data/test/adapter/json_api/links_test.rb +3 -1
  71. data/test/adapter/json_api/pagination_links_test.rb +19 -7
  72. data/test/adapter/json_api/relationships_test.rb +9 -4
  73. data/test/adapter/json_api/resource_identifier_test.rb +7 -2
  74. data/test/adapter/json_api/resource_meta_test.rb +3 -3
  75. data/test/adapter/json_api/transform_test.rb +251 -250
  76. data/test/adapter/json_api/type_test.rb +1 -1
  77. data/test/adapter/json_test.rb +8 -7
  78. data/test/adapter/null_test.rb +1 -2
  79. data/test/adapter/polymorphic_test.rb +5 -5
  80. data/test/adapter_test.rb +1 -1
  81. data/test/benchmark/app.rb +1 -1
  82. data/test/benchmark/bm_caching.rb +15 -15
  83. data/test/benchmark/bm_transform.rb +16 -5
  84. data/test/benchmark/controllers.rb +16 -17
  85. data/test/benchmark/fixtures.rb +72 -72
  86. data/test/cache_test.rb +101 -45
  87. data/test/collection_serializer_test.rb +2 -2
  88. data/test/fixtures/poro.rb +8 -7
  89. data/test/grape_test.rb +152 -56
  90. data/test/lint_test.rb +1 -1
  91. data/test/logger_test.rb +13 -11
  92. data/test/serializable_resource_test.rb +18 -22
  93. data/test/serializers/associations_test.rb +10 -10
  94. data/test/serializers/attribute_test.rb +1 -1
  95. data/test/serializers/attributes_test.rb +1 -1
  96. data/test/serializers/fieldset_test.rb +1 -1
  97. data/test/serializers/meta_test.rb +12 -6
  98. data/test/serializers/root_test.rb +1 -1
  99. data/test/serializers/serializer_for_test.rb +3 -1
  100. data/test/support/isolated_unit.rb +5 -2
  101. data/test/support/rails5_shims.rb +8 -2
  102. data/test/support/rails_app.rb +0 -9
  103. data/test/support/serialization_testing.rb +7 -5
  104. metadata +54 -24
  105. data/.rubocop_todo.yml +0 -167
  106. data/lib/active_model/serializer/include_tree.rb +0 -111
  107. data/test/include_tree/from_include_args_test.rb +0 -26
  108. data/test/include_tree/from_string_test.rb +0 -94
  109. data/test/include_tree/include_args_to_hash_test.rb +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb97c8740c2530c085ee9186ea27ddd220367fc3
4
- data.tar.gz: 0a768d3ab122abe2c3e7f5b6c00a8dada6872433
3
+ metadata.gz: d9ab72fd33fbf20e8630b9109d18edda9272658e
4
+ data.tar.gz: 8654e40594d8bf26038b329a8044dc9197bc5733
5
5
  SHA512:
6
- metadata.gz: 5589022dd6fa160c0a03981cedf46433fb1eb19e4bac5f3489908671e9e0969c48bb7a86cf03d12cf8ce825b2efe3ed6ad1b6594019635470319c899e7964617
7
- data.tar.gz: 989cf413780f12d47a553a7aae5cba33de1625bbc022366b7e4533810b87b151302ed6000116c03234bf2b2048a913048624728a54be87cead848076924cf6ce
6
+ metadata.gz: 454504b650ab8302e6e1f87b15f952ff3068033bcaaac136764211fbcb724759b354d66b7e0b662e1e10a1b57734173b4843f96eb2344c164d568fae824da8b3
7
+ data.tar.gz: 56355761907c1ea7882d7b04dc8adcff8538f188bd418946c2493a267188cedfef4247e410206b4c479575ba926efa1259c5966e166b901eaea26c45b7d4aae8
data/.rubocop.yml CHANGED
@@ -1,7 +1,5 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
1
  AllCops:
4
- TargetRubyVersion: 2.2
2
+ TargetRubyVersion: 2.1
5
3
  Exclude:
6
4
  - config/initializers/forbidden_yaml.rb
7
5
  - !ruby/regexp /(vendor|bundle|bin|db|tmp)\/.*/
@@ -46,7 +44,7 @@ Style/AlignParameters:
46
44
  EnforcedStyle: with_fixed_indentation
47
45
 
48
46
  Style/ClassAndModuleChildren:
49
- EnforcedStyle: compact
47
+ EnforcedStyle: nested
50
48
 
51
49
  Style/Documentation:
52
50
  Enabled: false
data/.travis.yml CHANGED
@@ -27,6 +27,7 @@ env:
27
27
  matrix:
28
28
  - "RAILS_VERSION=4.1"
29
29
  - "RAILS_VERSION=4.2"
30
+ - "RAILS_VERSION=5.0"
30
31
  - "RAILS_VERSION=master"
31
32
 
32
33
  matrix:
data/CHANGELOG.md CHANGED
@@ -1,8 +1,44 @@
1
1
  ## 0.10.x
2
2
 
3
- ### [master (unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0...master)
3
+ ### [master (unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.2...master)
4
4
 
5
- ### v0.10.0 (2016-05-17)
5
+ Breaking changes:
6
+
7
+ Features:
8
+
9
+ Fixes:
10
+
11
+ Misc:
12
+
13
+ ### [v0.10.2 (2016-07-05)(unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.1...v0.10.2)
14
+
15
+ Fixes:
16
+ - [#1814] (https://github.com/rails-api/active_model_serializers/pull/1814) Ensuring read_multi works with fragment cache
17
+
18
+ Misc:
19
+ - [#1808](https://github.com/rails-api/active_model_serializers/pull/1808) Adds documentation for `fields` option. (@luizkowalski)
20
+
21
+ ### [v0.10.1 (2016-06-16)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0...v0.10.1)
22
+
23
+ Features:
24
+ - [#1668](https://github.com/rails-api/active_model_serializers/pull/1668) Exclude nil and empty links. (@sigmike)
25
+ - [#1426](https://github.com/rails-api/active_model_serializers/pull/1426) Add ActiveModelSerializers.config.default_includes (@empact)
26
+
27
+ Fixes:
28
+ - [#1754](https://github.com/rails-api/active_model_serializers/pull/1754) Fixes #1759, Grape integration, improves serialization_context
29
+ missing error message on pagination. Document overriding CollectionSerializer#paginated?. (@bf4)
30
+ Moved serialization_context creation to Grape formatter, so resource serialization works without explicit calls to the `render` helper method.
31
+ Added Grape collection tests. (@onomated)
32
+ - [#1287](https://github.com/rails-api/active_model_serializers/pull/1287) Pass `fields` options from adapter to serializer. (@vasilakisfil)
33
+ - [#1710](https://github.com/rails-api/active_model_serializers/pull/1710) Prevent association loading when `include_data` option
34
+ is set to `false`. (@groyoh)
35
+ - [#1747](https://github.com/rails-api/active_model_serializers/pull/1747) Improve jsonapi mime type registration for Rails 5 (@remear)
36
+
37
+ Misc:
38
+ - [#1734](https://github.com/rails-api/active_model_serializers/pull/1734) Adds documentation for conditional attribute (@lambda2)
39
+ - [#1685](https://github.com/rails-api/active_model_serializers/pull/1685) Replace `IncludeTree` with `IncludeDirective` from the jsonapi gem.
40
+
41
+ ### [v0.10.0 (2016-05-17)](https://github.com/rails-api/active_model_serializers/compare/4a2d9853ba7...v0.10.0)
6
42
 
7
43
  Breaking changes:
8
44
  - [#1662](https://github.com/rails-api/active_model_serializers/pull/1662) Drop support for Rails 4.0 and Ruby 2.0.0. (@remear)
@@ -22,6 +58,7 @@ Fixes:
22
58
 
23
59
  Misc:
24
60
  - [#1673](https://github.com/rails-api/active_model_serializers/pull/1673) Adds "How to" guide on using AMS with POROs (@DrSayre)
61
+ - [#1730](https://github.com/rails-api/active_model_serializers/pull/1730) Adds documentation for overriding default serializer based on conditions (@groyoh/@cgmckeever)
25
62
 
26
63
  ### [v0.10.0.rc5 (2016-04-04)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0.rc4...v0.10.0.rc5)
27
64
 
data/Gemfile CHANGED
@@ -48,6 +48,6 @@ group :test do
48
48
  end
49
49
 
50
50
  group :development, :test do
51
- gem 'rubocop', '~> 0.39.0', require: false
51
+ gem 'rubocop', '~> 0.40.0', require: false
52
52
  gem 'yard', require: false
53
53
  end
data/README.md CHANGED
@@ -24,17 +24,6 @@
24
24
  </tr>
25
25
  </table>
26
26
 
27
-
28
- ## Documentation
29
-
30
- - [0.10 (master) Documentation](https://github.com/rails-api/active_model_serializers/tree/master)
31
- - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/v0.10.0)
32
- - [Guides](docs)
33
- - [0.9 (0-9-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
34
- - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-9-stable)
35
- - [0.8 (0-8-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-8-stable)
36
- - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-8-stable)
37
-
38
27
  ## About
39
28
 
40
29
  ActiveModelSerializers brings convention over configuration to your JSON generation.
@@ -50,33 +39,24 @@ resource serialization. The serialization has the `#as_json`, `#to_json` and `#s
50
39
  methods used by the Rails JSON Renderer. (SerializableResource actually delegates
51
40
  these methods to the adapter.)
52
41
 
53
- By default ActiveModelSerializers will use the **Attributes Adapter**.
42
+ By default ActiveModelSerializers will use the **Attributes Adapter** (no JSON root).
54
43
  But we strongly advise you to use **JsonApi Adapter**, which
55
44
  follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
56
45
  Check how to change the adapter in the sections below.
57
46
 
58
- ## RELEASE CANDIDATE, PLEASE READ
59
-
60
- This is the **master** branch of ActiveModelSerializers.
61
-
62
- It will become the `0.10.0` release when it's ready. Currently this is a release candidate.
63
-
64
47
  `0.10.x` is **not** backward compatible with `0.9.x` nor `0.8.x`.
65
48
 
66
- `0.10.x` will be based on the `0.8.0` code, but with a more flexible
49
+ `0.10.x` is based on the `0.8.0` code, but with a more flexible
67
50
  architecture. We'd love your help. [Learn how you can help here.](CONTRIBUTING.md)
68
51
 
69
52
  It is generally safe and recommended to use the master branch.
70
53
 
71
- For more information, see the post '[The future of
72
- AMS](https://medium.com/@joaomdmoura/the-future-of-ams-e5f9047ca7e9)'.
73
-
74
54
  ## Installation
75
55
 
76
56
  Add this line to your application's Gemfile:
77
57
 
78
58
  ```
79
- gem 'active_model_serializers'
59
+ gem 'active_model_serializers', '~> 0.10.0'
80
60
  ```
81
61
 
82
62
  And then execute:
@@ -103,8 +83,25 @@ If you'd like to chat, we have a [community slack](http://amserializers.herokuap
103
83
 
104
84
  Thanks!
105
85
 
86
+ ## Documentation
87
+
88
+ - [0.10 (master) Documentation](https://github.com/rails-api/active_model_serializers/tree/master)
89
+ - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/v0.10.0)
90
+ - [Guides](docs)
91
+ - [0.9 (0-9-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
92
+ - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-9-stable)
93
+ - [0.8 (0-8-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-8-stable)
94
+ - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-8-stable)
95
+
96
+
106
97
  ## High-level behavior
107
98
 
99
+ Choose an adapter from [adapters](lib/active_model_serializers/adapter):
100
+
101
+ ``` ruby
102
+ ActiveModelSerializers.config.adapter = :json_api # Default: `:attributes`
103
+ ```
104
+
108
105
  Given a [serializable model](lib/active_model/serializer/lint.rb):
109
106
 
110
107
  ```ruby
@@ -162,6 +159,6 @@ serializer.associations
162
159
  ```
163
160
  See [ARCHITECTURE.md](docs/ARCHITECTURE.md) for more information.
164
161
 
165
- # Contributing
162
+ ## Contributing
166
163
 
167
164
  See [CONTRIBUTING.md](CONTRIBUTING.md)
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ rescue LoadError
5
5
  end
6
6
  begin
7
7
  require 'simplecov'
8
- rescue LoadError
8
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
9
9
  end
10
10
 
11
11
  Bundler::GemHelper.install_tasks
@@ -33,7 +33,7 @@ end
33
33
  begin
34
34
  require 'rubocop'
35
35
  require 'rubocop/rake_task'
36
- rescue LoadError
36
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
37
37
  else
38
38
  Rake::Task[:rubocop].clear if Rake::Task.task_defined?(:rubocop)
39
39
  require 'rbconfig'
@@ -100,4 +100,4 @@ else
100
100
  end
101
101
 
102
102
  desc 'CI test task'
103
- task :ci => [:default]
103
+ task ci: [:default]
@@ -19,33 +19,35 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
  spec.executables = []
21
21
 
22
- spec.required_ruby_version = '>= 2.0.0'
22
+ spec.required_ruby_version = '>= 2.1'
23
23
 
24
- rails_versions = '>= 4.0'
24
+ rails_versions = ['>= 4.1', '< 6']
25
25
  spec.add_runtime_dependency 'activemodel', rails_versions
26
- # 'activesupport', rails_versions
27
- # 'builder'
26
+ # 'activesupport', rails_versions
27
+ # 'builder'
28
28
 
29
29
  spec.add_runtime_dependency 'actionpack', rails_versions
30
- # 'activesupport', rails_versions
31
- # 'rack'
32
- # 'rack-test', '~> 0.6.2'
30
+ # 'activesupport', rails_versions
31
+ # 'rack'
32
+ # 'rack-test', '~> 0.6.2'
33
33
 
34
34
  spec.add_runtime_dependency 'railties', rails_versions
35
- # 'activesupport', rails_versions
36
- # 'actionpack', rails_versions
37
- # 'rake', '>= 0.8.7'
35
+ # 'activesupport', rails_versions
36
+ # 'actionpack', rails_versions
37
+ # 'rake', '>= 0.8.7'
38
38
 
39
39
  # 'activesupport', rails_versions
40
- # 'i18n,
41
- # 'tzinfo'
42
- # 'minitest'
43
- # 'thread_safe'
40
+ # 'i18n,
41
+ # 'tzinfo'
42
+ # 'minitest'
43
+ # 'thread_safe'
44
+
45
+ spec.add_runtime_dependency 'jsonapi', '~> 0.1.1.beta2'
44
46
 
45
47
  spec.add_development_dependency 'activerecord', rails_versions
46
- # arel
47
- # activesupport
48
- # activemodel
48
+ # arel
49
+ # activesupport
50
+ # activemodel
49
51
 
50
52
  # Soft dependency for pagination
51
53
  spec.add_development_dependency 'kaminari', ' ~> 0.16.3'
@@ -57,10 +59,4 @@ Gem::Specification.new do |spec|
57
59
  spec.add_development_dependency 'grape', ['>= 0.13', '< 1.0']
58
60
  spec.add_development_dependency 'json_schema'
59
61
  spec.add_development_dependency 'rake', ['>= 10.0', '< 12.0']
60
-
61
- spec.post_install_message = <<-EOF
62
- NOTE: The default key case for the JsonApi adapter has changed to dashed.
63
- See https://github.com/rails-api/active_model_serializers/blob/master/docs/general/key_transforms.md
64
- for more information on configuring this behavior.
65
- EOF
66
62
  end
@@ -67,9 +67,11 @@ Doesn't follow any specific convention.
67
67
 
68
68
  ### JSON
69
69
 
70
- The response document always with a root key.
70
+ The json response is always rendered with a root key.
71
71
 
72
- The root key **can't be overridden**, and will be derived from the resource being serialized.
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).
73
75
 
74
76
  Doesn't follow any specific convention.
75
77
 
@@ -52,9 +52,14 @@ Each adapter has a default key transform configured:
52
52
  `config.key_transform` is a global override of the adapter default. Adapters
53
53
  still prefer the render option `:key_transform` over this setting.
54
54
 
55
+ *NOTE: Key transforms can be expensive operations. If key transforms are unnecessary for the
56
+ application, setting `config.key_transform` to `:unaltered` will provide a performance boost.*
55
57
 
56
- ## JSON API
58
+ ##### default_includes
59
+ What relationships to serialize by default. Default: `'*'`, which includes one level of related
60
+ objects. See [includes](adapters.md#included) for more info.
57
61
 
62
+ ## JSON API
58
63
 
59
64
  ##### jsonapi_resource_type
60
65
 
@@ -42,7 +42,7 @@ document = {
42
42
  'title' => 'Title 1',
43
43
  'date' => '2015-12-20'
44
44
  },
45
- 'associations' => {
45
+ 'relationships' => {
46
46
  'author' => {
47
47
  'data' => {
48
48
  'type' => 'user',
@@ -0,0 +1,31 @@
1
+ [Back to Guides](../README.md)
2
+
3
+ # Fields
4
+
5
+ If for any reason, you need to restrict the fields returned, you should use `fields` option.
6
+
7
+ For example, if you have a serializer like this
8
+
9
+ ```ruby
10
+ class UserSerializer < ActiveModel::Serializer
11
+ attributes :access_token, :first_name, :last_name
12
+ end
13
+ ```
14
+
15
+ and in a specific controller, you want to return `access_token` only, `fields` will help you:
16
+
17
+ ```ruby
18
+ class AnonymousController < ApplicationController
19
+ def create
20
+ render json: User.create(activation_state: 'anonymous'), fields: [:access_token], status: 201
21
+ end
22
+ end
23
+ ```
24
+
25
+ Note that this is only valid for the `json` and `attributes` adapter. For the `json_api` adapter, you would use
26
+
27
+ ```ruby
28
+ render json: @user, fields: { users: [:access_token] }
29
+ ```
30
+
31
+ Where `users` is the JSONAPI type.
@@ -73,7 +73,12 @@ See [ARCHITECTURE](../ARCHITECTURE.md) for more information.
73
73
 
74
74
  #### fields
75
75
 
76
- PR please :)
76
+ If you are using `json` or `attributes` adapter
77
+ ```ruby
78
+ render json: @user, fields: [:access_token]
79
+ ```
80
+
81
+ See [Fields](fields.md) for more information.
77
82
 
78
83
  #### adapter
79
84
 
@@ -83,7 +88,7 @@ PR please :)
83
88
 
84
89
  ```render json: posts, each_serializer: PostSerializer, key_transform: :camel_lower```
85
90
 
86
- See [Key Transforms](key_transforms.md) for more informaiton.
91
+ See [Key Transforms](key_transforms.md) for more information.
87
92
 
88
93
  #### meta
89
94
 
@@ -31,10 +31,21 @@ Serialization of the resource `title`
31
31
  |---------------------------- |-------------|
32
32
  | `attribute :title` | `{ title: 'Some Title' } `
33
33
  | `attribute :title, key: :name` | `{ name: 'Some Title' } `
34
- | `attribute :title { 'A Different Title'}` | `{ title: 'A Different Title' } `
34
+ | `attribute(:title) { 'A Different Title'}` | `{ title: 'A Different Title' } `
35
35
  | `attribute :title`<br>`def title 'A Different Title' end` | `{ title: 'A Different Title' }`
36
36
 
37
- [PR please for conditional attributes:)](https://github.com/rails-api/active_model_serializers/pull/1403)
37
+ An `if` or `unless` option can make an attribute conditional. It takes a symbol of a method name on the serializer, or a lambda literal.
38
+
39
+ e.g.
40
+
41
+ ```ruby
42
+ attribute :private_data, if: :is_current_user?
43
+ attribute :another_private_data, if: -> { scope.admin? }
44
+
45
+ def is_current_user?
46
+ object.id == current_user.id
47
+ end
48
+ ```
38
49
 
39
50
  ### Associations
40
51
 
@@ -255,7 +266,7 @@ In the controller, the scope/scope_name options are equal to
255
266
  the [`serialization_scope`method](https://github.com/rails-api/active_model_serializers/blob/d02cd30fe55a3ea85e1d351b6e039620903c1871/lib/action_controller/serialization.rb#L13-L20),
256
267
  which is `:current_user`, by default.
257
268
 
258
- Specfically, the `scope_name` is defaulted to `:current_user`, and may be set as
269
+ Specifically, the `scope_name` is defaulted to `:current_user`, and may be set as
259
270
  `serialization_scope :view_context`. The `scope` is set to `send(scope_name)` when `scope_name` is
260
271
  present and the controller responds to `scope_name`.
261
272
 
@@ -303,6 +314,38 @@ So that when we render the `#edit` action, we'll get
303
314
 
304
315
  Where `can_edit` is `view_context.current_user.admin?` (true).
305
316
 
317
+ You can also tell what to set as `serialization_scope` for specific actions.
318
+
319
+ For example, use `admin_user` only for `Admin::PostSerializer` and `current_user` for rest.
320
+
321
+ ```ruby
322
+ class PostsController < ActionController::Base
323
+
324
+ before_action only: :edit do
325
+ self.class.serialization_scope :admin_user
326
+ end
327
+
328
+ def show
329
+ render json: @post, serializer: PostSerializer
330
+ end
331
+
332
+ def edit
333
+ @post.save
334
+ render json: @post, serializer: Admin::PostSerializer
335
+ end
336
+
337
+ private
338
+
339
+ def admin_user
340
+ User.new(id: 2, name: 'Bob', admin: true)
341
+ end
342
+
343
+ def current_user
344
+ User.new(id: 2, name: 'Bob', admin: false)
345
+ end
346
+ end
347
+ ```
348
+
306
349
  #### #read_attribute_for_serialization(key)
307
350
 
308
351
  The serialized value for a given key. e.g. `read_attribute_for_serialization(:title) #=> 'Hello World'`
@@ -370,3 +413,19 @@ class PostSerializer < ActiveModel::Serializer
370
413
  end
371
414
  end
372
415
  ```
416
+
417
+ ## Overriding association serializer lookup
418
+
419
+ If you want to define a specific serializer lookup for your associations, you can override
420
+ the `ActiveModel::Serializer.serializer_for` method to return a serializer class based on defined conditions.
421
+
422
+ ```ruby
423
+ class MySerializer < ActiveModel::Serializer
424
+ def self.serializer_for(model, options)
425
+ return SparseAdminSerializer if model.class == 'Admin'
426
+ super
427
+ end
428
+
429
+ # the rest of the serializer
430
+ end
431
+ ```
@@ -81,7 +81,7 @@ def pagination_dict(object)
81
81
  {
82
82
  current_page: object.current_page,
83
83
  next_page: object.next_page,
84
- prev_page: object.prev_page,
84
+ prev_page: object.prev_page, # use object.previous_page when using will_paginate
85
85
  total_pages: object.total_pages,
86
86
  total_count: object.total_count
87
87
  }
@@ -126,14 +126,13 @@ def meta_attributes(resource, extra_meta = {})
126
126
  {
127
127
  current_page: resource.current_page,
128
128
  next_page: resource.next_page,
129
- prev_page: resource.prev_page,
129
+ prev_page: resource.prev_page, # use resource.previous_page when using will_paginate
130
130
  total_pages: resource.total_pages,
131
131
  total_count: resource.total_count
132
132
  }.merge(extra_meta)
133
133
  end
134
134
  ```
135
135
 
136
-
137
136
  ### Attributes adapter
138
137
 
139
138
  This adapter does not allow us to use `meta` key, due to that it is not possible to add pagination links.
@@ -17,17 +17,32 @@ To solve this, in Ember, both the adapter and the serializer will need some modi
17
17
 
18
18
  ### Server-Side Changes
19
19
 
20
- there are multiple mimetypes for json that should all be parsed similarly, so
21
- in `config/initializers/mime_types.rb`:
20
+ First, set the adapter type in an initializer file:
21
+
22
+ ```ruby
23
+ # config/initializers/active_model_serializers.rb
24
+ ActiveModelSerializers.config.adapter = :json_api
25
+ ```
26
+
27
+ or:
28
+
29
+ ```ruby
30
+ # config/initializers/active_model_serializers.rb
31
+ ActiveModelSerializers.config.adapter = ActiveModelSerializers::Adapter::JsonApi
32
+ ```
33
+
34
+ You will also want to set the `key_transform` to `:unaltered` since you will adjust the attributes in your Ember serializer to use underscores instead of dashes later. You could also use `:underscore`, but `:unaltered` is better for performance.
35
+
36
+ ```ruby
37
+ # config/initializers/active_model_serializers.rb
38
+ ActiveModelSerializers.config.key_transform = :unaltered
39
+ ```
40
+
41
+ Lastly, in order to properly handle JSON API responses, we need to register a JSON API renderer, like so:
42
+
22
43
  ```ruby
23
- api_mime_types = %W(
24
- application/vnd.api+json
25
- text/x-json
26
- application/json
27
- )
28
-
29
- Mime::Type.unregister :json
30
- Mime::Type.register 'application/json', :json, api_mime_types
44
+ # config/initializers/active_model_serializers.rb
45
+ require 'active_model_serializers/register_jsonapi_renderer'
31
46
  ```
32
47
 
33
48
  ### Adapter Changes
@@ -28,7 +28,7 @@ Example supported requests
28
28
  - Relationships
29
29
  - GET /articles/1/relationships/comments
30
30
  - GET /articles/1/relationships/author
31
- - Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `ActiveModel::Serializer::IncludeTree`
31
+ - Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `JSONAPI::IncludeDirective`
32
32
  - GET /articles/1?`include`=comments
33
33
  - GET /articles/1?`include`=comments.author
34
34
  - GET /articles/1?`include`=author,comments.author
@@ -19,12 +19,13 @@ module ActionController
19
19
  end
20
20
 
21
21
  def serialization_scope
22
- send(_serialization_scope) if _serialization_scope &&
23
- respond_to?(_serialization_scope, true)
22
+ return unless _serialization_scope && respond_to?(_serialization_scope, true)
23
+
24
+ send(_serialization_scope)
24
25
  end
25
26
 
26
27
  def get_serializer(resource, options = {})
27
- if !use_adapter?
28
+ unless use_adapter?
28
29
  warn 'ActionController::Serialization#use_adapter? has been removed. '\
29
30
  "Please pass 'adapter: false' or see ActiveSupport::SerializableResource.new"
30
31
  options[:adapter] = false
@@ -7,9 +7,11 @@ module ActiveModel
7
7
  deprecate :inherited, 'ActiveModelSerializers::Adapter::Base.'
8
8
  end
9
9
 
10
+ # :nocov:
10
11
  def initialize(serializer, options = {})
11
12
  super(ActiveModelSerializers::Adapter::Base.new(serializer, options))
12
13
  end
14
+ # :nocov:
13
15
  end
14
16
  end
15
17
  end
@@ -1,9 +1,12 @@
1
1
  require 'active_model/serializer/collection_serializer'
2
- class ActiveModel::Serializer
3
- class ArraySerializer < CollectionSerializer
4
- class << self
5
- extend ActiveModelSerializers::Deprecate
6
- deprecate :new, 'ActiveModel::Serializer::CollectionSerializer.'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class ArraySerializer < CollectionSerializer
6
+ class << self
7
+ extend ActiveModelSerializers::Deprecate
8
+ deprecate :new, 'ActiveModel::Serializer::CollectionSerializer.'
9
+ end
7
10
  end
8
11
  end
9
12
  end
@@ -10,8 +10,6 @@ module ActiveModel
10
10
  module Associations
11
11
  extend ActiveSupport::Concern
12
12
 
13
- DEFAULT_INCLUDE_TREE = ActiveModel::Serializer::IncludeTree.from_string('*')
14
-
15
13
  included do
16
14
  with_options instance_writer: false, instance_reader: true do |serializer|
17
15
  serializer.class_attribute :_reflections
@@ -41,7 +39,7 @@ module ActiveModel
41
39
  # @example
42
40
  # has_many :comments, serializer: CommentSummarySerializer
43
41
  #
44
- def has_many(name, options = {}, &block)
42
+ def has_many(name, options = {}, &block) # rubocop:disable Style/PredicateName
45
43
  associate(HasManyReflection.new(name, options, block))
46
44
  end
47
45
 
@@ -63,7 +61,7 @@ module ActiveModel
63
61
  # @example
64
62
  # has_one :author, serializer: AuthorSerializer
65
63
  #
66
- def has_one(name, options = {}, &block)
64
+ def has_one(name, options = {}, &block) # rubocop:disable Style/PredicateName
67
65
  associate(HasOneReflection.new(name, options, block))
68
66
  end
69
67
 
@@ -80,17 +78,18 @@ module ActiveModel
80
78
  end
81
79
  end
82
80
 
83
- # @param [IncludeTree] include_tree (defaults to all associations when not provided)
81
+ # @param [JSONAPI::IncludeDirective] include_directive (defaults to the
82
+ # +default_include_directive+ config value when not provided)
84
83
  # @return [Enumerator<Association>]
85
84
  #
86
- def associations(include_tree = DEFAULT_INCLUDE_TREE)
85
+ def associations(include_directive = ActiveModelSerializers.default_include_directive)
87
86
  return unless object
88
87
 
89
88
  Enumerator.new do |y|
90
89
  self.class._reflections.each do |reflection|
91
90
  next if reflection.excluded?(self)
92
91
  key = reflection.options.fetch(:key, reflection.name)
93
- next unless include_tree.key?(key)
92
+ next unless include_directive.key?(key)
94
93
  y.yield reflection.build_association(self, instance_options)
95
94
  end
96
95
  end
@@ -2,9 +2,6 @@ module ActiveModel
2
2
  class Serializer
3
3
  # @api private
4
4
  class BelongsToReflection < SingularReflection
5
- def macro
6
- :belongs_to
7
- end
8
5
  end
9
6
  end
10
7
  end