active_model_serializers 0.10.0 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +239 -2
- data/README.md +171 -34
- data/lib/action_controller/serialization.rb +23 -3
- data/lib/active_model/serializable_resource.rb +2 -0
- data/lib/active_model/serializer/adapter/attributes.rb +2 -0
- data/lib/active_model/serializer/adapter/base.rb +4 -0
- data/lib/active_model/serializer/adapter/json.rb +2 -0
- data/lib/active_model/serializer/adapter/json_api.rb +2 -0
- data/lib/active_model/serializer/adapter/null.rb +2 -0
- data/lib/active_model/serializer/adapter.rb +2 -0
- data/lib/active_model/serializer/array_serializer.rb +10 -5
- data/lib/active_model/serializer/association.rb +64 -10
- data/lib/active_model/serializer/attribute.rb +2 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +6 -3
- data/lib/active_model/serializer/collection_serializer.rb +48 -13
- data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +89 -117
- data/lib/active_model/serializer/error_serializer.rb +13 -7
- data/lib/active_model/serializer/errors_serializer.rb +27 -20
- data/lib/active_model/serializer/field.rb +2 -0
- data/lib/active_model/serializer/fieldset.rb +3 -1
- data/lib/active_model/serializer/has_many_reflection.rb +5 -3
- data/lib/active_model/serializer/has_one_reflection.rb +3 -4
- data/lib/active_model/serializer/lazy_association.rb +99 -0
- data/lib/active_model/serializer/link.rb +23 -0
- data/lib/active_model/serializer/lint.rb +136 -130
- data/lib/active_model/serializer/null.rb +2 -0
- data/lib/active_model/serializer/reflection.rb +130 -65
- data/lib/active_model/serializer/version.rb +3 -1
- data/lib/active_model/serializer.rb +321 -86
- data/lib/active_model_serializers/adapter/attributes.rb +17 -57
- data/lib/active_model_serializers/adapter/base.rb +41 -39
- data/lib/active_model_serializers/adapter/json.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
- data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +3 -1
- data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +52 -20
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +77 -23
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +41 -10
- data/lib/active_model_serializers/adapter/json_api.rb +84 -65
- data/lib/active_model_serializers/adapter/null.rb +2 -0
- data/lib/active_model_serializers/adapter.rb +9 -1
- data/lib/active_model_serializers/callbacks.rb +2 -0
- data/lib/active_model_serializers/deprecate.rb +3 -2
- data/lib/active_model_serializers/deserialization.rb +4 -0
- data/lib/active_model_serializers/json_pointer.rb +2 -0
- data/lib/active_model_serializers/logging.rb +2 -0
- data/lib/active_model_serializers/lookup_chain.rb +82 -0
- data/lib/active_model_serializers/model/caching.rb +26 -0
- data/lib/active_model_serializers/model.rb +111 -28
- data/lib/active_model_serializers/railtie.rb +7 -1
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +46 -31
- data/lib/active_model_serializers/serializable_resource.rb +10 -7
- data/lib/active_model_serializers/serialization_context.rb +12 -3
- data/lib/active_model_serializers/test/schema.rb +4 -2
- data/lib/active_model_serializers/test/serializer.rb +2 -0
- data/lib/active_model_serializers/test.rb +2 -0
- data/lib/active_model_serializers.rb +35 -10
- data/lib/generators/rails/resource_override.rb +3 -1
- data/lib/generators/rails/serializer_generator.rb +6 -4
- data/lib/grape/active_model_serializers.rb +9 -5
- data/lib/grape/formatters/active_model_serializers.rb +21 -2
- data/lib/grape/helpers/active_model_serializers.rb +3 -0
- data/lib/tasks/rubocop.rake +55 -0
- metadata +104 -296
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -104
- data/.rubocop_todo.yml +0 -167
- data/.simplecov +0 -110
- data/.travis.yml +0 -43
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -53
- data/Rakefile +0 -103
- data/active_model_serializers.gemspec +0 -66
- data/appveyor.yml +0 -24
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/serve_benchmark +0 -39
- data/docs/ARCHITECTURE.md +0 -126
- data/docs/README.md +0 -40
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -245
- data/docs/general/caching.md +0 -52
- data/docs/general/configuration_options.md +0 -100
- data/docs/general/deserialization.md +0 -100
- data/docs/general/getting_started.md +0 -133
- data/docs/general/instrumentation.md +0 -40
- data/docs/general/key_transforms.md +0 -40
- data/docs/general/logging.md +0 -14
- data/docs/general/rendering.md +0 -255
- data/docs/general/serializers.md +0 -372
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -139
- data/docs/howto/add_root_key.md +0 -51
- data/docs/howto/outside_controller_use.md +0 -58
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -32
- data/docs/howto/test.md +0 -152
- data/docs/integrations/ember-and-json-api.md +0 -112
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/jsonapi/schema.md +0 -151
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/lib/active_model/serializer/associations.rb +0 -100
- data/lib/active_model/serializer/attributes.rb +0 -82
- data/lib/active_model/serializer/collection_reflection.rb +0 -7
- data/lib/active_model/serializer/configuration.rb +0 -35
- data/lib/active_model/serializer/include_tree.rb +0 -111
- data/lib/active_model/serializer/links.rb +0 -35
- data/lib/active_model/serializer/meta.rb +0 -29
- data/lib/active_model/serializer/singular_reflection.rb +0 -7
- data/lib/active_model/serializer/type.rb +0 -25
- data/lib/active_model_serializers/key_transform.rb +0 -70
- data/test/action_controller/adapter_selector_test.rb +0 -53
- data/test/action_controller/explicit_serializer_test.rb +0 -134
- data/test/action_controller/json/include_test.rb +0 -167
- data/test/action_controller/json_api/deserialization_test.rb +0 -112
- data/test/action_controller/json_api/errors_test.rb +0 -41
- data/test/action_controller/json_api/linked_test.rb +0 -197
- data/test/action_controller/json_api/pagination_test.rb +0 -116
- data/test/action_controller/json_api/transform_test.rb +0 -181
- data/test/action_controller/serialization_scope_name_test.rb +0 -229
- data/test/action_controller/serialization_test.rb +0 -469
- data/test/active_model_serializers/adapter_for_test.rb +0 -208
- data/test/active_model_serializers/json_pointer_test.rb +0 -20
- data/test/active_model_serializers/key_transform_test.rb +0 -263
- data/test/active_model_serializers/logging_test.rb +0 -77
- data/test/active_model_serializers/model_test.rb +0 -9
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -58
- data/test/active_model_serializers/test/schema_test.rb +0 -130
- data/test/active_model_serializers/test/serializer_test.rb +0 -62
- data/test/active_record_test.rb +0 -9
- data/test/adapter/deprecation_test.rb +0 -100
- data/test/adapter/json/belongs_to_test.rb +0 -45
- data/test/adapter/json/collection_test.rb +0 -90
- data/test/adapter/json/has_many_test.rb +0 -45
- data/test/adapter/json/transform_test.rb +0 -93
- data/test/adapter/json_api/belongs_to_test.rb +0 -155
- data/test/adapter/json_api/collection_test.rb +0 -95
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -87
- data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
- data/test/adapter/json_api/has_many_test.rb +0 -144
- data/test/adapter/json_api/has_one_test.rb +0 -80
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -392
- data/test/adapter/json_api/links_test.rb +0 -93
- data/test/adapter/json_api/pagination_links_test.rb +0 -166
- data/test/adapter/json_api/parse_test.rb +0 -137
- data/test/adapter/json_api/relationship_test.rb +0 -161
- data/test/adapter/json_api/relationships_test.rb +0 -199
- data/test/adapter/json_api/resource_identifier_test.rb +0 -85
- data/test/adapter/json_api/resource_meta_test.rb +0 -100
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
- data/test/adapter/json_api/transform_test.rb +0 -502
- data/test/adapter/json_api/type_test.rb +0 -61
- data/test/adapter/json_test.rb +0 -45
- data/test/adapter/null_test.rb +0 -23
- data/test/adapter/polymorphic_test.rb +0 -171
- data/test/adapter_test.rb +0 -67
- data/test/array_serializer_test.rb +0 -22
- data/test/benchmark/app.rb +0 -65
- data/test/benchmark/benchmarking_support.rb +0 -67
- data/test/benchmark/bm_caching.rb +0 -119
- data/test/benchmark/bm_transform.rb +0 -34
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -84
- data/test/benchmark/fixtures.rb +0 -219
- data/test/cache_test.rb +0 -485
- data/test/collection_serializer_test.rb +0 -110
- data/test/fixtures/active_record.rb +0 -78
- data/test/fixtures/poro.rb +0 -282
- data/test/generators/scaffold_controller_generator_test.rb +0 -24
- data/test/generators/serializer_generator_test.rb +0 -57
- data/test/grape_test.rb +0 -82
- 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
- data/test/lint_test.rb +0 -49
- data/test/logger_test.rb +0 -18
- data/test/poro_test.rb +0 -9
- data/test/serializable_resource_test.rb +0 -83
- data/test/serializers/association_macros_test.rb +0 -36
- data/test/serializers/associations_test.rb +0 -295
- data/test/serializers/attribute_test.rb +0 -151
- data/test/serializers/attributes_test.rb +0 -52
- data/test/serializers/caching_configuration_test_isolated.rb +0 -170
- data/test/serializers/configuration_test.rb +0 -32
- data/test/serializers/fieldset_test.rb +0 -14
- data/test/serializers/meta_test.rb +0 -196
- data/test/serializers/options_test.rb +0 -21
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
- data/test/serializers/root_test.rb +0 -21
- data/test/serializers/serialization_test.rb +0 -55
- data/test/serializers/serializer_for_test.rb +0 -134
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -79
- data/test/support/rails5_shims.rb +0 -47
- data/test/support/rails_app.rb +0 -45
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
- data/test/support/schemas/custom/show.json +0 -7
- data/test/support/schemas/hyper_schema.json +0 -93
- data/test/support/schemas/render_using_json_api.json +0 -43
- data/test/support/schemas/simple_json_pointers.json +0 -10
- data/test/support/serialization_testing.rb +0 -53
- data/test/test_helper.rb +0 -57
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
module ActiveModel
|
|
4
|
-
class Serializer
|
|
5
|
-
class CollectionSerializerTest < ActiveSupport::TestCase
|
|
6
|
-
MessagesSerializer = Class.new(ActiveModel::Serializer) do
|
|
7
|
-
type 'messages'
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def setup
|
|
11
|
-
@comment = Comment.new
|
|
12
|
-
@post = Post.new
|
|
13
|
-
@resource = build_named_collection @comment, @post
|
|
14
|
-
@serializer = collection_serializer.new(@resource, { some: :options })
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def collection_serializer
|
|
18
|
-
CollectionSerializer
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def build_named_collection(*resource)
|
|
22
|
-
resource.define_singleton_method(:name) { 'MeResource' }
|
|
23
|
-
resource
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def test_has_object_reader_serializer_interface
|
|
27
|
-
assert_equal @serializer.object, @resource
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def test_respond_to_each
|
|
31
|
-
assert_respond_to @serializer, :each
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def test_each_object_should_be_serialized_with_appropriate_serializer
|
|
35
|
-
serializers = @serializer.to_a
|
|
36
|
-
|
|
37
|
-
assert_kind_of CommentSerializer, serializers.first
|
|
38
|
-
assert_kind_of Comment, serializers.first.object
|
|
39
|
-
|
|
40
|
-
assert_kind_of PostSerializer, serializers.last
|
|
41
|
-
assert_kind_of Post, serializers.last.object
|
|
42
|
-
|
|
43
|
-
assert_equal :options, serializers.last.custom_options[:some]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def test_serializer_option_not_passed_to_each_serializer
|
|
47
|
-
serializers = collection_serializer.new([@post], { serializer: PostSerializer }).to_a
|
|
48
|
-
|
|
49
|
-
refute serializers.first.custom_options.key?(:serializer)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def test_root_default
|
|
53
|
-
@serializer = collection_serializer.new([@comment, @post])
|
|
54
|
-
assert_nil @serializer.root
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def test_root
|
|
58
|
-
expected = 'custom_root'
|
|
59
|
-
@serializer = collection_serializer.new([@comment, @post], root: expected)
|
|
60
|
-
assert_equal expected, @serializer.root
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def test_root_with_no_serializers
|
|
64
|
-
expected = 'custom_root'
|
|
65
|
-
@serializer = collection_serializer.new([], root: expected)
|
|
66
|
-
assert_equal expected, @serializer.root
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def test_json_key_with_resource_with_serializer
|
|
70
|
-
singular_key = @serializer.send(:serializers).first.json_key
|
|
71
|
-
assert_equal singular_key.pluralize, @serializer.json_key
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def test_json_key_with_resource_with_name_and_no_serializers
|
|
75
|
-
serializer = collection_serializer.new(build_named_collection)
|
|
76
|
-
assert_equal 'me_resources', serializer.json_key
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def test_json_key_with_resource_with_nil_name_and_no_serializers
|
|
80
|
-
resource = []
|
|
81
|
-
resource.define_singleton_method(:name) { nil }
|
|
82
|
-
serializer = collection_serializer.new(resource)
|
|
83
|
-
assert_nil serializer.json_key
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def test_json_key_with_resource_without_name_and_no_serializers
|
|
87
|
-
serializer = collection_serializer.new([])
|
|
88
|
-
assert_nil serializer.json_key
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def test_json_key_with_empty_resources_with_serializer
|
|
92
|
-
resource = []
|
|
93
|
-
serializer = collection_serializer.new(resource, serializer: MessagesSerializer)
|
|
94
|
-
assert_equal 'messages', serializer.json_key
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def test_json_key_with_root
|
|
98
|
-
expected = 'custom_root'
|
|
99
|
-
serializer = collection_serializer.new(@resource, root: expected)
|
|
100
|
-
assert_equal expected, serializer.json_key
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def test_json_key_with_root_and_no_serializers
|
|
104
|
-
expected = 'custom_root'
|
|
105
|
-
serializer = collection_serializer.new(build_named_collection, root: expected)
|
|
106
|
-
assert_equal expected, serializer.json_key
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
require 'active_record'
|
|
2
|
-
|
|
3
|
-
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
|
|
4
|
-
ActiveRecord::Schema.define do
|
|
5
|
-
self.verbose = false
|
|
6
|
-
create_table :posts, force: true do |t|
|
|
7
|
-
t.string :title
|
|
8
|
-
t.text :body
|
|
9
|
-
t.references :author
|
|
10
|
-
t.timestamps null: false
|
|
11
|
-
end
|
|
12
|
-
create_table :authors, force: true do |t|
|
|
13
|
-
t.string :name
|
|
14
|
-
t.timestamps null: false
|
|
15
|
-
end
|
|
16
|
-
create_table :comments, force: true do |t|
|
|
17
|
-
t.text :contents
|
|
18
|
-
t.references :author
|
|
19
|
-
t.references :post
|
|
20
|
-
t.timestamp null: false
|
|
21
|
-
end
|
|
22
|
-
create_table :employees, force: true do |t|
|
|
23
|
-
t.string :name
|
|
24
|
-
t.string :email
|
|
25
|
-
t.timestamp null: false
|
|
26
|
-
end
|
|
27
|
-
create_table :object_tags, force: true do |t|
|
|
28
|
-
t.string :poly_tag_id
|
|
29
|
-
t.string :taggable_type
|
|
30
|
-
t.string :taggable_id
|
|
31
|
-
t.timestamp null: false
|
|
32
|
-
end
|
|
33
|
-
create_table :poly_tags, force: true do |t|
|
|
34
|
-
t.string :phrase
|
|
35
|
-
t.timestamp null: false
|
|
36
|
-
end
|
|
37
|
-
create_table :pictures, force: true do |t|
|
|
38
|
-
t.string :title
|
|
39
|
-
t.string :imageable_type
|
|
40
|
-
t.string :imageable_id
|
|
41
|
-
t.timestamp null: false
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
module ARModels
|
|
46
|
-
class Post < ActiveRecord::Base
|
|
47
|
-
has_many :comments
|
|
48
|
-
belongs_to :author
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
class Comment < ActiveRecord::Base
|
|
52
|
-
belongs_to :post
|
|
53
|
-
belongs_to :author
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
class Author < ActiveRecord::Base
|
|
57
|
-
has_many :posts
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
class PostSerializer < ActiveModel::Serializer
|
|
61
|
-
attributes :id, :title, :body
|
|
62
|
-
|
|
63
|
-
has_many :comments
|
|
64
|
-
belongs_to :author
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
class CommentSerializer < ActiveModel::Serializer
|
|
68
|
-
attributes :id, :contents
|
|
69
|
-
|
|
70
|
-
belongs_to :author
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
class AuthorSerializer < ActiveModel::Serializer
|
|
74
|
-
attributes :id, :name
|
|
75
|
-
|
|
76
|
-
has_many :posts
|
|
77
|
-
end
|
|
78
|
-
end
|
data/test/fixtures/poro.rb
DELETED
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
verbose = $VERBOSE
|
|
2
|
-
$VERBOSE = nil
|
|
3
|
-
class Model < ActiveModelSerializers::Model
|
|
4
|
-
FILE_DIGEST = Digest::MD5.hexdigest(File.open(__FILE__).read)
|
|
5
|
-
|
|
6
|
-
### Helper methods, not required to be serializable
|
|
7
|
-
|
|
8
|
-
# Convenience when not adding @attributes readers and writers
|
|
9
|
-
def method_missing(meth, *args)
|
|
10
|
-
if meth.to_s =~ /^(.*)=$/
|
|
11
|
-
attributes[$1.to_sym] = args[0]
|
|
12
|
-
elsif attributes.key?(meth)
|
|
13
|
-
attributes[meth]
|
|
14
|
-
else
|
|
15
|
-
super
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# required for ActiveModel::AttributeAssignment#_assign_attribute
|
|
20
|
-
# in Rails 5
|
|
21
|
-
def respond_to_missing?(method_name, _include_private = false)
|
|
22
|
-
attributes.key?(method_name.to_s.tr('=', '').to_sym) || super
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# see
|
|
27
|
-
# https://github.com/rails/rails/blob/4-2-stable/activemodel/lib/active_model/errors.rb
|
|
28
|
-
# The below allows you to do:
|
|
29
|
-
#
|
|
30
|
-
# model = ModelWithErrors.new
|
|
31
|
-
# model.validate! # => ["cannot be nil"]
|
|
32
|
-
# model.errors.full_messages # => ["name cannot be nil"]
|
|
33
|
-
class ModelWithErrors < ::ActiveModelSerializers::Model
|
|
34
|
-
attr_accessor :name
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
class Profile < Model
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
class ProfileSerializer < ActiveModel::Serializer
|
|
41
|
-
attributes :name, :description
|
|
42
|
-
|
|
43
|
-
# TODO: is this used anywhere?
|
|
44
|
-
def arguments_passed_in?
|
|
45
|
-
instance_options[:my_options] == :accessible
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
class ProfilePreviewSerializer < ActiveModel::Serializer
|
|
50
|
-
attributes :name
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
Post = Class.new(Model)
|
|
54
|
-
Like = Class.new(Model)
|
|
55
|
-
Author = Class.new(Model)
|
|
56
|
-
Bio = Class.new(Model)
|
|
57
|
-
Blog = Class.new(Model)
|
|
58
|
-
Role = Class.new(Model)
|
|
59
|
-
User = Class.new(Model)
|
|
60
|
-
Location = Class.new(Model)
|
|
61
|
-
Place = Class.new(Model)
|
|
62
|
-
Tag = Class.new(Model)
|
|
63
|
-
VirtualValue = Class.new(Model)
|
|
64
|
-
Comment = Class.new(Model) do
|
|
65
|
-
# Uses a custom non-time-based cache key
|
|
66
|
-
def cache_key
|
|
67
|
-
"#{self.class.name.downcase}/#{self.id}"
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
class Employee < ActiveRecord::Base
|
|
72
|
-
has_many :pictures, as: :imageable
|
|
73
|
-
has_many :object_tags, as: :taggable
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
class ObjectTag < ActiveRecord::Base
|
|
77
|
-
belongs_to :poly_tag
|
|
78
|
-
belongs_to :taggable, polymorphic: true
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
class Picture < ActiveRecord::Base
|
|
82
|
-
belongs_to :imageable, polymorphic: true
|
|
83
|
-
has_many :object_tags, as: :taggable
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
class PolyTag < ActiveRecord::Base
|
|
87
|
-
has_many :object_tags
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
module Spam; end
|
|
91
|
-
Spam::UnrelatedLink = Class.new(Model)
|
|
92
|
-
|
|
93
|
-
PostSerializer = Class.new(ActiveModel::Serializer) do
|
|
94
|
-
cache key: 'post', expires_in: 0.1, skip_digest: true
|
|
95
|
-
attributes :id, :title, :body
|
|
96
|
-
|
|
97
|
-
has_many :comments
|
|
98
|
-
belongs_to :blog
|
|
99
|
-
belongs_to :author
|
|
100
|
-
|
|
101
|
-
def blog
|
|
102
|
-
Blog.new(id: 999, name: 'Custom blog')
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# TODO: is this used anywhere?
|
|
106
|
-
def custom_options
|
|
107
|
-
instance_options
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
SpammyPostSerializer = Class.new(ActiveModel::Serializer) do
|
|
112
|
-
attributes :id
|
|
113
|
-
has_many :related
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
CommentSerializer = Class.new(ActiveModel::Serializer) do
|
|
117
|
-
cache expires_in: 1.day, skip_digest: true
|
|
118
|
-
attributes :id, :body
|
|
119
|
-
|
|
120
|
-
belongs_to :post
|
|
121
|
-
belongs_to :author
|
|
122
|
-
|
|
123
|
-
def custom_options
|
|
124
|
-
instance_options
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
AuthorSerializer = Class.new(ActiveModel::Serializer) do
|
|
129
|
-
cache key: 'writer', skip_digest: true
|
|
130
|
-
attribute :id
|
|
131
|
-
attribute :name
|
|
132
|
-
|
|
133
|
-
has_many :posts
|
|
134
|
-
has_many :roles
|
|
135
|
-
has_one :bio
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
RoleSerializer = Class.new(ActiveModel::Serializer) do
|
|
139
|
-
cache only: [:name], skip_digest: true
|
|
140
|
-
attributes :id, :name, :description, :slug
|
|
141
|
-
|
|
142
|
-
def slug
|
|
143
|
-
"#{object.name}-#{object.id}"
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
belongs_to :author
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
LikeSerializer = Class.new(ActiveModel::Serializer) do
|
|
150
|
-
attributes :id, :time
|
|
151
|
-
|
|
152
|
-
belongs_to :likeable
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
LocationSerializer = Class.new(ActiveModel::Serializer) do
|
|
156
|
-
cache only: [:place], skip_digest: true
|
|
157
|
-
attributes :id, :lat, :lng
|
|
158
|
-
|
|
159
|
-
belongs_to :place
|
|
160
|
-
|
|
161
|
-
def place
|
|
162
|
-
'Nowhere'
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
PlaceSerializer = Class.new(ActiveModel::Serializer) do
|
|
167
|
-
attributes :id, :name
|
|
168
|
-
|
|
169
|
-
has_many :locations
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
BioSerializer = Class.new(ActiveModel::Serializer) do
|
|
173
|
-
cache except: [:content], skip_digest: true
|
|
174
|
-
attributes :id, :content, :rating
|
|
175
|
-
|
|
176
|
-
belongs_to :author
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
BlogSerializer = Class.new(ActiveModel::Serializer) do
|
|
180
|
-
cache key: 'blog'
|
|
181
|
-
attributes :id, :name
|
|
182
|
-
|
|
183
|
-
belongs_to :writer
|
|
184
|
-
has_many :articles
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
PaginatedSerializer = Class.new(ActiveModel::Serializer::CollectionSerializer) do
|
|
188
|
-
def json_key
|
|
189
|
-
'paginated'
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
AlternateBlogSerializer = Class.new(ActiveModel::Serializer) do
|
|
194
|
-
attribute :id
|
|
195
|
-
attribute :name, key: :title
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
CustomBlogSerializer = Class.new(ActiveModel::Serializer) do
|
|
199
|
-
attribute :id
|
|
200
|
-
attribute :special_attribute
|
|
201
|
-
|
|
202
|
-
has_many :articles
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
CommentPreviewSerializer = Class.new(ActiveModel::Serializer) do
|
|
206
|
-
attributes :id
|
|
207
|
-
|
|
208
|
-
belongs_to :post
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
AuthorPreviewSerializer = Class.new(ActiveModel::Serializer) do
|
|
212
|
-
attributes :id
|
|
213
|
-
|
|
214
|
-
has_many :posts
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
PostPreviewSerializer = Class.new(ActiveModel::Serializer) do
|
|
218
|
-
attributes :title, :body, :id
|
|
219
|
-
|
|
220
|
-
has_many :comments, serializer: CommentPreviewSerializer
|
|
221
|
-
belongs_to :author, serializer: AuthorPreviewSerializer
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
PostWithTagsSerializer = Class.new(ActiveModel::Serializer) do
|
|
225
|
-
attributes :id
|
|
226
|
-
|
|
227
|
-
has_many :tags
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
PostWithCustomKeysSerializer = Class.new(ActiveModel::Serializer) do
|
|
231
|
-
attributes :id
|
|
232
|
-
|
|
233
|
-
has_many :comments, key: :reviews
|
|
234
|
-
belongs_to :author, key: :writer
|
|
235
|
-
has_one :blog, key: :site
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
VirtualValueSerializer = Class.new(ActiveModel::Serializer) do
|
|
239
|
-
attributes :id
|
|
240
|
-
|
|
241
|
-
has_many :reviews, virtual_value: [{ type: 'reviews', id: '1' },
|
|
242
|
-
{ type: 'reviews', id: '2' }]
|
|
243
|
-
has_one :maker, virtual_value: { type: 'makers', id: '1' }
|
|
244
|
-
|
|
245
|
-
def reviews
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
def maker
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
PolymorphicHasManySerializer = Class.new(ActiveModel::Serializer) do
|
|
253
|
-
attributes :id, :name
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
PolymorphicBelongsToSerializer = Class.new(ActiveModel::Serializer) do
|
|
257
|
-
attributes :id, :title
|
|
258
|
-
|
|
259
|
-
has_one :imageable, serializer: PolymorphicHasManySerializer, polymorphic: true
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
PolymorphicSimpleSerializer = Class.new(ActiveModel::Serializer) do
|
|
263
|
-
attributes :id
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
PolymorphicObjectTagSerializer = Class.new(ActiveModel::Serializer) do
|
|
267
|
-
attributes :id
|
|
268
|
-
|
|
269
|
-
has_many :taggable, serializer: PolymorphicSimpleSerializer, polymorphic: true
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
PolymorphicTagSerializer = Class.new(ActiveModel::Serializer) do
|
|
273
|
-
attributes :id, :phrase
|
|
274
|
-
|
|
275
|
-
has_many :object_tags, serializer: PolymorphicObjectTagSerializer
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
|
|
279
|
-
cache only: [:id]
|
|
280
|
-
attributes :id
|
|
281
|
-
end
|
|
282
|
-
$VERBOSE = verbose
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
require 'generators/rails/resource_override'
|
|
3
|
-
|
|
4
|
-
class ResourceGeneratorTest < Rails::Generators::TestCase
|
|
5
|
-
destination File.expand_path('../../../tmp/generators', __FILE__)
|
|
6
|
-
setup :prepare_destination, :copy_routes
|
|
7
|
-
|
|
8
|
-
tests Rails::Generators::ResourceGenerator
|
|
9
|
-
arguments %w(account)
|
|
10
|
-
|
|
11
|
-
def test_serializer_file_is_generated
|
|
12
|
-
run_generator
|
|
13
|
-
|
|
14
|
-
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ActiveModel::Serializer/
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
def copy_routes
|
|
20
|
-
config_dir = File.join(destination_root, 'config')
|
|
21
|
-
FileUtils.mkdir_p(config_dir)
|
|
22
|
-
File.write(File.join(config_dir, 'routes.rb'), 'Rails.application.routes.draw {}')
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
require 'generators/rails/resource_override'
|
|
3
|
-
require 'generators/rails/serializer_generator'
|
|
4
|
-
|
|
5
|
-
class SerializerGeneratorTest < Rails::Generators::TestCase
|
|
6
|
-
destination File.expand_path('../../../tmp/generators', __FILE__)
|
|
7
|
-
setup :prepare_destination
|
|
8
|
-
|
|
9
|
-
tests Rails::Generators::SerializerGenerator
|
|
10
|
-
arguments %w(account name:string description:text business:references)
|
|
11
|
-
|
|
12
|
-
def test_generates_a_serializer
|
|
13
|
-
run_generator
|
|
14
|
-
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ActiveModel::Serializer/
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def test_generates_a_namespaced_serializer
|
|
18
|
-
run_generator ['admin/account']
|
|
19
|
-
assert_file 'app/serializers/admin/account_serializer.rb', /class Admin::AccountSerializer < ActiveModel::Serializer/
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def test_uses_application_serializer_if_one_exists
|
|
23
|
-
Object.const_set(:ApplicationSerializer, Class.new)
|
|
24
|
-
run_generator
|
|
25
|
-
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ApplicationSerializer/
|
|
26
|
-
ensure
|
|
27
|
-
Object.send :remove_const, :ApplicationSerializer
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def test_uses_given_parent
|
|
31
|
-
Object.const_set(:ApplicationSerializer, Class.new)
|
|
32
|
-
run_generator ['Account', '--parent=MySerializer']
|
|
33
|
-
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < MySerializer/
|
|
34
|
-
ensure
|
|
35
|
-
Object.send :remove_const, :ApplicationSerializer
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def test_generates_attributes_and_associations
|
|
39
|
-
run_generator
|
|
40
|
-
assert_file 'app/serializers/account_serializer.rb' do |serializer|
|
|
41
|
-
assert_match(/^ attributes :id, :name, :description$/, serializer)
|
|
42
|
-
assert_match(/^ has_one :business$/, serializer)
|
|
43
|
-
assert_match(/^end\n*\z/, serializer)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def test_with_no_attributes_does_not_add_extra_space
|
|
48
|
-
run_generator ['account']
|
|
49
|
-
assert_file 'app/serializers/account_serializer.rb' do |content|
|
|
50
|
-
if RUBY_PLATFORM =~ /mingw/
|
|
51
|
-
assert_no_match(/\r\n\r\nend/, content)
|
|
52
|
-
else
|
|
53
|
-
assert_no_match(/\n\nend/, content)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
data/test/grape_test.rb
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
require 'grape'
|
|
3
|
-
require 'grape/active_model_serializers'
|
|
4
|
-
|
|
5
|
-
class ActiveModelSerializers::GrapeTest < ActiveSupport::TestCase
|
|
6
|
-
include Rack::Test::Methods
|
|
7
|
-
module Models
|
|
8
|
-
def self.model1
|
|
9
|
-
ARModels::Post.new(id: 1, title: 'Dummy Title', body: 'Lorem Ipsum')
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def self.model2
|
|
13
|
-
ARModels::Post.new(id: 2, title: 'Second Dummy Title', body: 'Second Lorem Ipsum')
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def self.all
|
|
17
|
-
@all ||=
|
|
18
|
-
begin
|
|
19
|
-
model1.save!
|
|
20
|
-
model2.save!
|
|
21
|
-
ARModels::Post.all
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
class GrapeTest < Grape::API
|
|
27
|
-
format :json
|
|
28
|
-
include Grape::ActiveModelSerializers
|
|
29
|
-
|
|
30
|
-
resources :grape do
|
|
31
|
-
get '/render' do
|
|
32
|
-
render Models.model1
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
get '/render_with_json_api' do
|
|
36
|
-
post = Models.model1
|
|
37
|
-
render post, meta: { page: 1, total_pages: 2 }, adapter: :json_api
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
get '/render_array_with_json_api' do
|
|
41
|
-
posts = Models.all
|
|
42
|
-
render posts, adapter: :json_api
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def app
|
|
48
|
-
GrapeTest.new
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def test_formatter_returns_json
|
|
52
|
-
get '/grape/render'
|
|
53
|
-
|
|
54
|
-
post = Models.model1
|
|
55
|
-
serializable_resource = serializable(post)
|
|
56
|
-
|
|
57
|
-
assert last_response.ok?
|
|
58
|
-
assert_equal serializable_resource.to_json, last_response.body
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def test_render_helper_passes_through_options_correctly
|
|
62
|
-
get '/grape/render_with_json_api'
|
|
63
|
-
|
|
64
|
-
post = Models.model1
|
|
65
|
-
serializable_resource = serializable(post, serializer: ARModels::PostSerializer, adapter: :json_api, meta: { page: 1, total_pages: 2 })
|
|
66
|
-
|
|
67
|
-
assert last_response.ok?
|
|
68
|
-
assert_equal serializable_resource.to_json, last_response.body
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def test_formatter_handles_arrays
|
|
72
|
-
get '/grape/render_array_with_json_api'
|
|
73
|
-
|
|
74
|
-
posts = Models.all
|
|
75
|
-
serializable_resource = serializable(posts, adapter: :json_api)
|
|
76
|
-
|
|
77
|
-
assert last_response.ok?
|
|
78
|
-
assert_equal serializable_resource.to_json, last_response.body
|
|
79
|
-
ensure
|
|
80
|
-
ARModels::Post.delete_all
|
|
81
|
-
end
|
|
82
|
-
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
|