active_model_serializers 0.10.0 → 0.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -4
- data/.travis.yml +17 -5
- data/CHANGELOG.md +112 -2
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -2
- data/README.md +166 -26
- data/Rakefile +3 -3
- data/active_model_serializers.gemspec +21 -24
- data/appveyor.yml +9 -3
- data/docs/README.md +2 -1
- data/docs/general/adapters.md +4 -2
- data/docs/general/caching.md +7 -1
- data/docs/general/configuration_options.md +70 -1
- data/docs/general/deserialization.md +1 -1
- data/docs/general/fields.md +31 -0
- data/docs/general/logging.md +7 -0
- data/docs/general/rendering.md +44 -20
- data/docs/general/serializers.md +100 -11
- data/docs/howto/add_pagination_links.md +15 -16
- data/docs/howto/add_relationship_links.md +140 -0
- data/docs/howto/add_root_key.md +4 -0
- data/docs/howto/grape_integration.md +42 -0
- data/docs/howto/outside_controller_use.md +12 -4
- data/docs/howto/passing_arbitrary_options.md +2 -2
- data/docs/howto/serialize_poro.md +46 -5
- data/docs/howto/test.md +2 -0
- data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
- data/docs/integrations/ember-and-json-api.md +64 -32
- data/docs/jsonapi/schema.md +1 -1
- data/lib/action_controller/serialization.rb +13 -3
- data/lib/active_model/serializer/adapter/base.rb +2 -0
- data/lib/active_model/serializer/array_serializer.rb +8 -5
- data/lib/active_model/serializer/association.rb +19 -4
- data/lib/active_model/serializer/belongs_to_reflection.rb +0 -3
- data/lib/active_model/serializer/collection_serializer.rb +35 -12
- data/lib/active_model/serializer/{associations.rb → concerns/associations.rb} +13 -11
- data/lib/active_model/serializer/{attributes.rb → concerns/attributes.rb} +1 -1
- data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +72 -113
- data/lib/active_model/serializer/{configuration.rb → concerns/configuration.rb} +25 -1
- data/lib/active_model/serializer/{links.rb → concerns/links.rb} +0 -0
- data/lib/active_model/serializer/{meta.rb → concerns/meta.rb} +0 -0
- data/lib/active_model/serializer/{type.rb → concerns/type.rb} +0 -0
- data/lib/active_model/serializer/error_serializer.rb +11 -7
- data/lib/active_model/serializer/errors_serializer.rb +25 -20
- data/lib/active_model/serializer/has_many_reflection.rb +0 -3
- data/lib/active_model/serializer/has_one_reflection.rb +0 -3
- data/lib/active_model/serializer/lint.rb +134 -130
- data/lib/active_model/serializer/reflection.rb +37 -21
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model/serializer.rb +76 -37
- data/lib/active_model_serializers/adapter/attributes.rb +3 -66
- data/lib/active_model_serializers/adapter/base.rb +39 -39
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +1 -1
- data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +8 -1
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +30 -19
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +23 -9
- data/lib/active_model_serializers/adapter/json_api.rb +44 -43
- data/lib/active_model_serializers/adapter.rb +6 -0
- data/lib/active_model_serializers/deprecate.rb +1 -2
- data/lib/active_model_serializers/deserialization.rb +2 -0
- data/lib/active_model_serializers/lookup_chain.rb +80 -0
- data/lib/active_model_serializers/model.rb +108 -28
- data/lib/active_model_serializers/railtie.rb +3 -1
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +44 -31
- data/lib/active_model_serializers/serializable_resource.rb +6 -5
- data/lib/active_model_serializers/serialization_context.rb +10 -3
- data/lib/active_model_serializers/test/schema.rb +2 -2
- data/lib/active_model_serializers.rb +15 -0
- data/lib/generators/rails/resource_override.rb +1 -1
- data/lib/generators/rails/serializer_generator.rb +4 -4
- data/lib/grape/active_model_serializers.rb +7 -5
- data/lib/grape/formatters/active_model_serializers.rb +19 -2
- data/lib/grape/helpers/active_model_serializers.rb +1 -0
- data/test/action_controller/adapter_selector_test.rb +14 -5
- data/test/action_controller/explicit_serializer_test.rb +5 -4
- data/test/action_controller/json/include_test.rb +106 -27
- data/test/action_controller/json_api/errors_test.rb +8 -9
- data/test/action_controller/json_api/fields_test.rb +66 -0
- data/test/action_controller/json_api/linked_test.rb +29 -24
- data/test/action_controller/json_api/pagination_test.rb +19 -19
- data/test/action_controller/json_api/transform_test.rb +11 -3
- data/test/action_controller/lookup_proc_test.rb +49 -0
- data/test/action_controller/namespace_lookup_test.rb +232 -0
- data/test/action_controller/serialization_scope_name_test.rb +12 -6
- data/test/action_controller/serialization_test.rb +12 -9
- data/test/active_model_serializers/json_pointer_test.rb +15 -13
- data/test/active_model_serializers/model_test.rb +137 -4
- data/test/active_model_serializers/railtie_test_isolated.rb +12 -7
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
- data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
- data/test/active_model_serializers/test/schema_test.rb +3 -2
- data/test/adapter/attributes_test.rb +40 -0
- data/test/adapter/json/collection_test.rb +14 -0
- data/test/adapter/json/has_many_test.rb +10 -2
- data/test/adapter/json/transform_test.rb +15 -15
- data/test/adapter/json_api/collection_test.rb +4 -3
- data/test/adapter/json_api/errors_test.rb +17 -19
- data/test/adapter/json_api/fields_test.rb +12 -3
- data/test/adapter/json_api/has_many_test.rb +49 -20
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +183 -0
- data/test/adapter/json_api/json_api_test.rb +5 -7
- data/test/adapter/json_api/linked_test.rb +33 -12
- data/test/adapter/json_api/links_test.rb +4 -2
- data/test/adapter/json_api/pagination_links_test.rb +35 -8
- data/test/adapter/json_api/relationship_test.rb +309 -73
- data/test/adapter/json_api/resource_identifier_test.rb +27 -2
- data/test/adapter/json_api/resource_meta_test.rb +3 -3
- data/test/adapter/json_api/transform_test.rb +263 -253
- data/test/adapter/json_api/type_test.rb +1 -1
- data/test/adapter/json_test.rb +8 -7
- data/test/adapter/null_test.rb +1 -2
- data/test/adapter/polymorphic_test.rb +5 -5
- data/test/adapter_test.rb +1 -1
- data/test/benchmark/app.rb +1 -1
- data/test/benchmark/benchmarking_support.rb +1 -1
- data/test/benchmark/bm_active_record.rb +81 -0
- data/test/benchmark/bm_adapter.rb +38 -0
- data/test/benchmark/bm_caching.rb +16 -16
- data/test/benchmark/bm_lookup_chain.rb +83 -0
- data/test/benchmark/bm_transform.rb +21 -10
- data/test/benchmark/controllers.rb +16 -17
- data/test/benchmark/fixtures.rb +72 -72
- data/test/cache_test.rb +235 -69
- data/test/collection_serializer_test.rb +25 -12
- data/test/fixtures/active_record.rb +45 -10
- data/test/fixtures/poro.rb +124 -181
- data/test/generators/serializer_generator_test.rb +23 -5
- data/test/grape_test.rb +170 -56
- data/test/lint_test.rb +1 -1
- data/test/logger_test.rb +13 -11
- data/test/serializable_resource_test.rb +18 -22
- data/test/serializers/association_macros_test.rb +3 -2
- data/test/serializers/associations_test.rb +132 -36
- data/test/serializers/attribute_test.rb +5 -3
- data/test/serializers/attributes_test.rb +1 -1
- data/test/serializers/caching_configuration_test_isolated.rb +6 -6
- data/test/serializers/fieldset_test.rb +1 -1
- data/test/serializers/meta_test.rb +12 -6
- data/test/serializers/options_test.rb +17 -6
- data/test/serializers/read_attribute_for_serialization_test.rb +3 -3
- data/test/serializers/root_test.rb +1 -1
- data/test/serializers/serialization_test.rb +2 -2
- data/test/serializers/serializer_for_test.rb +12 -10
- data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
- data/test/support/isolated_unit.rb +5 -2
- data/test/support/rails5_shims.rb +8 -2
- data/test/support/rails_app.rb +2 -9
- data/test/support/serialization_testing.rb +23 -5
- data/test/test_helper.rb +13 -0
- metadata +104 -38
- data/.rubocop_todo.yml +0 -167
- data/docs/ARCHITECTURE.md +0 -126
- data/lib/active_model/serializer/include_tree.rb +0 -111
- data/lib/active_model_serializers/key_transform.rb +0 -70
- data/test/active_model_serializers/key_transform_test.rb +0 -263
- data/test/adapter/json_api/relationships_test.rb +0 -199
- data/test/include_tree/from_include_args_test.rb +0 -26
- data/test/include_tree/from_string_test.rb +0 -94
- data/test/include_tree/include_args_to_hash_test.rb +0 -64
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
module ActiveModel
|
|
2
|
-
class Serializer
|
|
3
|
-
# TODO: description of this class, and overview of how it's used
|
|
4
|
-
class IncludeTree
|
|
5
|
-
module Parsing
|
|
6
|
-
module_function
|
|
7
|
-
|
|
8
|
-
# Translates a comma separated list of dot separated paths (JSON API format) into a Hash.
|
|
9
|
-
#
|
|
10
|
-
# @example
|
|
11
|
-
# `'posts.author, posts.comments.upvotes, posts.comments.author'`
|
|
12
|
-
#
|
|
13
|
-
# would become
|
|
14
|
-
#
|
|
15
|
-
# `{ posts: { author: {}, comments: { author: {}, upvotes: {} } } }`.
|
|
16
|
-
#
|
|
17
|
-
# @param [String] included
|
|
18
|
-
# @return [Hash] a Hash representing the same tree structure
|
|
19
|
-
def include_string_to_hash(included)
|
|
20
|
-
# TODO: Needs comment walking through the process of what all this is doing.
|
|
21
|
-
included.delete(' ').split(',').reduce({}) do |hash, path|
|
|
22
|
-
include_tree = path.split('.').reverse_each.reduce({}) { |a, e| { e.to_sym => a } }
|
|
23
|
-
hash.deep_merge!(include_tree)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Translates the arguments passed to the include option into a Hash. The format can be either
|
|
28
|
-
# a String (see #include_string_to_hash), an Array of Symbols and Hashes, or a mix of both.
|
|
29
|
-
#
|
|
30
|
-
# @example
|
|
31
|
-
# `posts: [:author, comments: [:author, :upvotes]]`
|
|
32
|
-
#
|
|
33
|
-
# would become
|
|
34
|
-
#
|
|
35
|
-
# `{ posts: { author: {}, comments: { author: {}, upvotes: {} } } }`.
|
|
36
|
-
#
|
|
37
|
-
# @example
|
|
38
|
-
# `[:author, :comments => [:author]]`
|
|
39
|
-
#
|
|
40
|
-
# would become
|
|
41
|
-
#
|
|
42
|
-
# `{:author => {}, :comments => { author: {} } }`
|
|
43
|
-
#
|
|
44
|
-
# @param [Symbol, Hash, Array, String] included
|
|
45
|
-
# @return [Hash] a Hash representing the same tree structure
|
|
46
|
-
def include_args_to_hash(included)
|
|
47
|
-
case included
|
|
48
|
-
when Symbol
|
|
49
|
-
{ included => {} }
|
|
50
|
-
when Hash
|
|
51
|
-
included.each_with_object({}) do |(key, value), hash|
|
|
52
|
-
hash[key] = include_args_to_hash(value)
|
|
53
|
-
end
|
|
54
|
-
when Array
|
|
55
|
-
included.reduce({}) { |a, e| a.deep_merge!(include_args_to_hash(e)) }
|
|
56
|
-
when String
|
|
57
|
-
include_string_to_hash(included)
|
|
58
|
-
else
|
|
59
|
-
{}
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Builds an IncludeTree from a comma separated list of dot separated paths (JSON API format).
|
|
65
|
-
# @example `'posts.author, posts.comments.upvotes, posts.comments.author'`
|
|
66
|
-
#
|
|
67
|
-
# @param [String] included
|
|
68
|
-
# @return [IncludeTree]
|
|
69
|
-
#
|
|
70
|
-
def self.from_string(included)
|
|
71
|
-
new(Parsing.include_string_to_hash(included))
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Translates the arguments passed to the include option into an IncludeTree.
|
|
75
|
-
# The format can be either a String (see #from_string), an Array of Symbols and Hashes, or a mix of both.
|
|
76
|
-
# @example `posts: [:author, comments: [:author, :upvotes]]`
|
|
77
|
-
#
|
|
78
|
-
# @param [Symbol, Hash, Array, String] included
|
|
79
|
-
# @return [IncludeTree]
|
|
80
|
-
#
|
|
81
|
-
def self.from_include_args(included)
|
|
82
|
-
return included if included.is_a?(IncludeTree)
|
|
83
|
-
|
|
84
|
-
new(Parsing.include_args_to_hash(included))
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# @param [Hash] hash
|
|
88
|
-
def initialize(hash = {})
|
|
89
|
-
@hash = hash
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def key?(key)
|
|
93
|
-
@hash.key?(key) || @hash.key?(:*) || @hash.key?(:**)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def [](key)
|
|
97
|
-
# TODO(beauby): Adopt a lazy caching strategy for generating subtrees.
|
|
98
|
-
case
|
|
99
|
-
when @hash.key?(key)
|
|
100
|
-
self.class.new(@hash[key])
|
|
101
|
-
when @hash.key?(:*)
|
|
102
|
-
self.class.new(@hash[:*])
|
|
103
|
-
when @hash.key?(:**)
|
|
104
|
-
self.class.new(:** => {})
|
|
105
|
-
else
|
|
106
|
-
nil
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
require 'active_support/core_ext/hash/keys'
|
|
2
|
-
|
|
3
|
-
module ActiveModelSerializers
|
|
4
|
-
module KeyTransform
|
|
5
|
-
module_function
|
|
6
|
-
|
|
7
|
-
# Transforms values to UpperCamelCase or PascalCase.
|
|
8
|
-
#
|
|
9
|
-
# @example:
|
|
10
|
-
# "some_key" => "SomeKey",
|
|
11
|
-
# @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L66-L76 ActiveSupport::Inflector.camelize}
|
|
12
|
-
def camel(value)
|
|
13
|
-
case value
|
|
14
|
-
when Hash then value.deep_transform_keys! { |key| camel(key) }
|
|
15
|
-
when Symbol then camel(value.to_s).to_sym
|
|
16
|
-
when String then value.underscore.camelize
|
|
17
|
-
else value
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Transforms values to camelCase.
|
|
22
|
-
#
|
|
23
|
-
# @example:
|
|
24
|
-
# "some_key" => "someKey",
|
|
25
|
-
# @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L66-L76 ActiveSupport::Inflector.camelize}
|
|
26
|
-
def camel_lower(value)
|
|
27
|
-
case value
|
|
28
|
-
when Hash then value.deep_transform_keys! { |key| camel_lower(key) }
|
|
29
|
-
when Symbol then camel_lower(value.to_s).to_sym
|
|
30
|
-
when String then value.underscore.camelize(:lower)
|
|
31
|
-
else value
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Transforms values to dashed-case.
|
|
36
|
-
# This is the default case for the JsonApi adapter.
|
|
37
|
-
#
|
|
38
|
-
# @example:
|
|
39
|
-
# "some_key" => "some-key",
|
|
40
|
-
# @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L185-L187 ActiveSupport::Inflector.dasherize}
|
|
41
|
-
def dash(value)
|
|
42
|
-
case value
|
|
43
|
-
when Hash then value.deep_transform_keys! { |key| dash(key) }
|
|
44
|
-
when Symbol then dash(value.to_s).to_sym
|
|
45
|
-
when String then value.underscore.dasherize
|
|
46
|
-
else value
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Transforms values to underscore_case.
|
|
51
|
-
# This is the default case for deserialization in the JsonApi adapter.
|
|
52
|
-
#
|
|
53
|
-
# @example:
|
|
54
|
-
# "some-key" => "some_key",
|
|
55
|
-
# @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L89-L98 ActiveSupport::Inflector.underscore}
|
|
56
|
-
def underscore(value)
|
|
57
|
-
case value
|
|
58
|
-
when Hash then value.deep_transform_keys! { |key| underscore(key) }
|
|
59
|
-
when Symbol then underscore(value.to_s).to_sym
|
|
60
|
-
when String then value.underscore
|
|
61
|
-
else value
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Returns the value unaltered
|
|
66
|
-
def unaltered(value)
|
|
67
|
-
value
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class ActiveModelSerializers::KeyTransformTest < ActiveSupport::TestCase
|
|
4
|
-
def test_camel
|
|
5
|
-
obj = Object.new
|
|
6
|
-
scenarios = [
|
|
7
|
-
{
|
|
8
|
-
value: { :"some-key" => 'value' },
|
|
9
|
-
expected: { :SomeKey => 'value' }
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
value: { :someKey => 'value' },
|
|
13
|
-
expected: { :SomeKey => 'value' }
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
value: { :some_key => 'value' },
|
|
17
|
-
expected: { :SomeKey => 'value' }
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
value: { 'some-key' => 'value' },
|
|
21
|
-
expected: { 'SomeKey' => 'value' }
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
value: { 'someKey' => 'value' },
|
|
25
|
-
expected: { 'SomeKey' => 'value' }
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
value: { 'some_key' => 'value' },
|
|
29
|
-
expected: { 'SomeKey' => 'value' }
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
value: :"some-value",
|
|
33
|
-
expected: :SomeValue
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
value: :some_value,
|
|
37
|
-
expected: :SomeValue
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
value: :someValue,
|
|
41
|
-
expected: :SomeValue
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
value: 'some-value',
|
|
45
|
-
expected: 'SomeValue'
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
value: 'someValue',
|
|
49
|
-
expected: 'SomeValue'
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
value: 'some_value',
|
|
53
|
-
expected: 'SomeValue'
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
value: obj,
|
|
57
|
-
expected: obj
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
value: nil,
|
|
61
|
-
expected: nil
|
|
62
|
-
}
|
|
63
|
-
]
|
|
64
|
-
scenarios.each do |s|
|
|
65
|
-
result = ActiveModelSerializers::KeyTransform.camel(s[:value])
|
|
66
|
-
assert_equal s[:expected], result
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def test_camel_lower
|
|
71
|
-
obj = Object.new
|
|
72
|
-
scenarios = [
|
|
73
|
-
{
|
|
74
|
-
value: { :"some-key" => 'value' },
|
|
75
|
-
expected: { :someKey => 'value' }
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
value: { :SomeKey => 'value' },
|
|
79
|
-
expected: { :someKey => 'value' }
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
value: { :some_key => 'value' },
|
|
83
|
-
expected: { :someKey => 'value' }
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
value: { 'some-key' => 'value' },
|
|
87
|
-
expected: { 'someKey' => 'value' }
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
value: { 'SomeKey' => 'value' },
|
|
91
|
-
expected: { 'someKey' => 'value' }
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
value: { 'some_key' => 'value' },
|
|
95
|
-
expected: { 'someKey' => 'value' }
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
value: :"some-value",
|
|
99
|
-
expected: :someValue
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
value: :SomeValue,
|
|
103
|
-
expected: :someValue
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
value: :some_value,
|
|
107
|
-
expected: :someValue
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
value: 'some-value',
|
|
111
|
-
expected: 'someValue'
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
value: 'SomeValue',
|
|
115
|
-
expected: 'someValue'
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
value: 'some_value',
|
|
119
|
-
expected: 'someValue'
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
value: obj,
|
|
123
|
-
expected: obj
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
value: nil,
|
|
127
|
-
expected: nil
|
|
128
|
-
}
|
|
129
|
-
]
|
|
130
|
-
scenarios.each do |s|
|
|
131
|
-
result = ActiveModelSerializers::KeyTransform.camel_lower(s[:value])
|
|
132
|
-
assert_equal s[:expected], result
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def test_dash
|
|
137
|
-
obj = Object.new
|
|
138
|
-
scenarios = [
|
|
139
|
-
{
|
|
140
|
-
value: { :some_key => 'value' },
|
|
141
|
-
expected: { :"some-key" => 'value' }
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
value: { 'some_key' => 'value' },
|
|
145
|
-
expected: { 'some-key' => 'value' }
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
value: { :SomeKey => 'value' },
|
|
149
|
-
expected: { :"some-key" => 'value' }
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
value: { 'SomeKey' => 'value' },
|
|
153
|
-
expected: { 'some-key' => 'value' }
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
value: { :someKey => 'value' },
|
|
157
|
-
expected: { :"some-key" => 'value' }
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
value: { 'someKey' => 'value' },
|
|
161
|
-
expected: { 'some-key' => 'value' }
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
value: :some_value,
|
|
165
|
-
expected: :"some-value"
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
value: :SomeValue,
|
|
169
|
-
expected: :"some-value"
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
value: 'SomeValue',
|
|
173
|
-
expected: 'some-value'
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
value: :someValue,
|
|
177
|
-
expected: :"some-value"
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
value: 'someValue',
|
|
181
|
-
expected: 'some-value'
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
value: obj,
|
|
185
|
-
expected: obj
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
value: nil,
|
|
189
|
-
expected: nil
|
|
190
|
-
}
|
|
191
|
-
]
|
|
192
|
-
scenarios.each do |s|
|
|
193
|
-
result = ActiveModelSerializers::KeyTransform.dash(s[:value])
|
|
194
|
-
assert_equal s[:expected], result
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def test_underscore
|
|
199
|
-
obj = Object.new
|
|
200
|
-
scenarios = [
|
|
201
|
-
{
|
|
202
|
-
value: { :"some-key" => 'value' },
|
|
203
|
-
expected: { :some_key => 'value' }
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
value: { 'some-key' => 'value' },
|
|
207
|
-
expected: { 'some_key' => 'value' }
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
value: { :SomeKey => 'value' },
|
|
211
|
-
expected: { :some_key => 'value' }
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
value: { 'SomeKey' => 'value' },
|
|
215
|
-
expected: { 'some_key' => 'value' }
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
value: { :someKey => 'value' },
|
|
219
|
-
expected: { :some_key => 'value' }
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
value: { 'someKey' => 'value' },
|
|
223
|
-
expected: { 'some_key' => 'value' }
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
value: :"some-value",
|
|
227
|
-
expected: :some_value
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
value: :SomeValue,
|
|
231
|
-
expected: :some_value
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
value: :someValue,
|
|
235
|
-
expected: :some_value
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
value: 'some-value',
|
|
239
|
-
expected: 'some_value'
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
value: 'SomeValue',
|
|
243
|
-
expected: 'some_value'
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
value: 'someValue',
|
|
247
|
-
expected: 'some_value'
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
value: obj,
|
|
251
|
-
expected: obj
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
value: nil,
|
|
255
|
-
expected: nil
|
|
256
|
-
}
|
|
257
|
-
]
|
|
258
|
-
scenarios.each do |s|
|
|
259
|
-
result = ActiveModelSerializers::KeyTransform.underscore(s[:value])
|
|
260
|
-
assert_equal s[:expected], result
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
end
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
module ActiveModel
|
|
4
|
-
class Serializer
|
|
5
|
-
module Adapter
|
|
6
|
-
class JsonApi
|
|
7
|
-
class RelationshipTest < ActiveSupport::TestCase
|
|
8
|
-
RelationshipAuthor = Class.new(::Model)
|
|
9
|
-
class RelationshipAuthorSerializer < ActiveModel::Serializer
|
|
10
|
-
has_one :bio do
|
|
11
|
-
link :self, '//example.com/link_author/relationships/bio'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
has_one :profile do
|
|
15
|
-
link :related do
|
|
16
|
-
"//example.com/profiles/#{object.profile.id}"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
has_many :locations do
|
|
21
|
-
link :related do
|
|
22
|
-
ids = object.locations.map(&:id).join(',')
|
|
23
|
-
href "//example.com/locations/#{ids}"
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
has_many :posts do
|
|
28
|
-
link :related do
|
|
29
|
-
ids = object.posts.map(&:id).join(',')
|
|
30
|
-
href "//example.com/posts/#{ids}"
|
|
31
|
-
meta ids: ids
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
has_many :comments do
|
|
36
|
-
link :self do
|
|
37
|
-
meta ids: [1]
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
has_many :roles do |serializer|
|
|
42
|
-
meta count: object.posts.count
|
|
43
|
-
serializer.cached_roles
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
has_one :blog do
|
|
47
|
-
link :self, '//example.com/link_author/relationships/blog'
|
|
48
|
-
include_data false
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
belongs_to :reviewer do
|
|
52
|
-
meta name: 'Dan Brown'
|
|
53
|
-
include_data true
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
has_many :likes do
|
|
57
|
-
link :related do
|
|
58
|
-
ids = object.likes.map(&:id).join(',')
|
|
59
|
-
href "//example.com/likes/#{ids}"
|
|
60
|
-
meta ids: ids
|
|
61
|
-
end
|
|
62
|
-
meta liked: object.likes.any?
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def cached_roles
|
|
66
|
-
[
|
|
67
|
-
Role.new(id: 'from-serializer-method')
|
|
68
|
-
]
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def setup
|
|
73
|
-
@post = Post.new(id: 1337, comments: [], author: nil)
|
|
74
|
-
@blog = Blog.new(id: 1337, name: 'extra')
|
|
75
|
-
@bio = Bio.new(id: 1337)
|
|
76
|
-
@like = Like.new(id: 1337)
|
|
77
|
-
@role = Role.new(id: 'from-record')
|
|
78
|
-
@profile = Profile.new(id: 1337)
|
|
79
|
-
@location = Location.new(id: 1337)
|
|
80
|
-
@reviewer = Author.new(id: 1337)
|
|
81
|
-
@comment = Comment.new(id: 1337)
|
|
82
|
-
@author = RelationshipAuthor.new(
|
|
83
|
-
id: 1337,
|
|
84
|
-
posts: [@post],
|
|
85
|
-
blog: @blog,
|
|
86
|
-
reviewer: @reviewer,
|
|
87
|
-
bio: @bio,
|
|
88
|
-
likes: [@like],
|
|
89
|
-
roles: [@role],
|
|
90
|
-
locations: [@location],
|
|
91
|
-
profile: @profile,
|
|
92
|
-
comments: [@comment]
|
|
93
|
-
)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def test_relationship_simple_link
|
|
97
|
-
expected = {
|
|
98
|
-
data: {
|
|
99
|
-
id: '1337',
|
|
100
|
-
type: 'bios'
|
|
101
|
-
},
|
|
102
|
-
links: {
|
|
103
|
-
self: '//example.com/link_author/relationships/bio'
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
assert_relationship(:bio, expected)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def test_relationship_block_link
|
|
110
|
-
expected = {
|
|
111
|
-
data: { id: '1337', type: 'profiles' },
|
|
112
|
-
links: { related: '//example.com/profiles/1337' }
|
|
113
|
-
}
|
|
114
|
-
assert_relationship(:profile, expected)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def test_relationship_block_link_href
|
|
118
|
-
expected = {
|
|
119
|
-
data: [{ id: '1337', type: 'locations' }],
|
|
120
|
-
links: {
|
|
121
|
-
related: { href: '//example.com/locations/1337' }
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
assert_relationship(:locations, expected)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def test_relationship_block_link_href_and_meta
|
|
128
|
-
expected = {
|
|
129
|
-
data: [{ id: '1337', type: 'posts' }],
|
|
130
|
-
links: {
|
|
131
|
-
related: {
|
|
132
|
-
href: '//example.com/posts/1337',
|
|
133
|
-
meta: { ids: '1337' }
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
assert_relationship(:posts, expected)
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def test_relationship_block_link_meta
|
|
141
|
-
expected = {
|
|
142
|
-
data: [{ id: '1337', type: 'comments' }],
|
|
143
|
-
links: {
|
|
144
|
-
self: {
|
|
145
|
-
meta: { ids: [1] }
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
assert_relationship(:comments, expected)
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def test_relationship_meta
|
|
153
|
-
expected = {
|
|
154
|
-
data: [{ id: 'from-serializer-method', type: 'roles' }],
|
|
155
|
-
meta: { count: 1 }
|
|
156
|
-
}
|
|
157
|
-
assert_relationship(:roles, expected)
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def test_relationship_not_including_data
|
|
161
|
-
expected = {
|
|
162
|
-
links: { self: '//example.com/link_author/relationships/blog' }
|
|
163
|
-
}
|
|
164
|
-
assert_relationship(:blog, expected)
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
def test_relationship_including_data_explicit
|
|
168
|
-
expected = {
|
|
169
|
-
data: { id: '1337', type: 'authors' },
|
|
170
|
-
meta: { name: 'Dan Brown' }
|
|
171
|
-
}
|
|
172
|
-
assert_relationship(:reviewer, expected)
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def test_relationship_with_everything
|
|
176
|
-
expected = {
|
|
177
|
-
data: [{ id: '1337', type: 'likes' }],
|
|
178
|
-
links: {
|
|
179
|
-
related: {
|
|
180
|
-
href: '//example.com/likes/1337',
|
|
181
|
-
meta: { ids: '1337' }
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
meta: { liked: true }
|
|
185
|
-
}
|
|
186
|
-
assert_relationship(:likes, expected)
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
private
|
|
190
|
-
|
|
191
|
-
def assert_relationship(relationship_name, expected)
|
|
192
|
-
hash = serializable(@author, adapter: :json_api).serializable_hash
|
|
193
|
-
assert_equal(expected, hash[:data][:relationships][relationship_name])
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
module ActiveModel
|
|
4
|
-
class Serializer
|
|
5
|
-
class IncludeTree
|
|
6
|
-
class FromStringTest < ActiveSupport::TestCase
|
|
7
|
-
def test_simple_array
|
|
8
|
-
input = [:comments, :author]
|
|
9
|
-
actual = ActiveModel::Serializer::IncludeTree.from_include_args(input)
|
|
10
|
-
assert(actual.key?(:author))
|
|
11
|
-
assert(actual.key?(:comments))
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def test_nested_array
|
|
15
|
-
input = [:comments, posts: [:author, comments: [:author]]]
|
|
16
|
-
actual = ActiveModel::Serializer::IncludeTree.from_include_args(input)
|
|
17
|
-
assert(actual.key?(:posts))
|
|
18
|
-
assert(actual[:posts].key?(:author))
|
|
19
|
-
assert(actual[:posts].key?(:comments))
|
|
20
|
-
assert(actual[:posts][:comments].key?(:author))
|
|
21
|
-
assert(actual.key?(:comments))
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|