simple_jsonapi 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rubocop.yml +131 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +5 -0
- data/Jenkinsfile +92 -0
- data/LICENSE.txt +22 -0
- data/README.md +532 -0
- data/Rakefile +10 -0
- data/lib/simple_jsonapi.rb +112 -0
- data/lib/simple_jsonapi/definition/attribute.rb +45 -0
- data/lib/simple_jsonapi/definition/base.rb +50 -0
- data/lib/simple_jsonapi/definition/concerns/has_links_object.rb +36 -0
- data/lib/simple_jsonapi/definition/concerns/has_meta_object.rb +36 -0
- data/lib/simple_jsonapi/definition/error.rb +70 -0
- data/lib/simple_jsonapi/definition/error_source.rb +29 -0
- data/lib/simple_jsonapi/definition/link.rb +27 -0
- data/lib/simple_jsonapi/definition/meta.rb +27 -0
- data/lib/simple_jsonapi/definition/relationship.rb +60 -0
- data/lib/simple_jsonapi/definition/resource.rb +104 -0
- data/lib/simple_jsonapi/error_serializer.rb +76 -0
- data/lib/simple_jsonapi/errors/bad_request.rb +11 -0
- data/lib/simple_jsonapi/errors/exception_serializer.rb +6 -0
- data/lib/simple_jsonapi/errors/wrapped_error.rb +35 -0
- data/lib/simple_jsonapi/errors/wrapped_error_serializer.rb +35 -0
- data/lib/simple_jsonapi/helpers/exceptions.rb +39 -0
- data/lib/simple_jsonapi/helpers/serializer_inferrer.rb +136 -0
- data/lib/simple_jsonapi/helpers/serializer_methods.rb +36 -0
- data/lib/simple_jsonapi/node/attributes.rb +51 -0
- data/lib/simple_jsonapi/node/base.rb +91 -0
- data/lib/simple_jsonapi/node/data/collection.rb +25 -0
- data/lib/simple_jsonapi/node/data/singular.rb +26 -0
- data/lib/simple_jsonapi/node/document/base.rb +62 -0
- data/lib/simple_jsonapi/node/document/collection.rb +17 -0
- data/lib/simple_jsonapi/node/document/errors.rb +17 -0
- data/lib/simple_jsonapi/node/document/singular.rb +17 -0
- data/lib/simple_jsonapi/node/error.rb +55 -0
- data/lib/simple_jsonapi/node/error_source.rb +40 -0
- data/lib/simple_jsonapi/node/errors.rb +28 -0
- data/lib/simple_jsonapi/node/included.rb +45 -0
- data/lib/simple_jsonapi/node/object_links.rb +40 -0
- data/lib/simple_jsonapi/node/object_meta.rb +40 -0
- data/lib/simple_jsonapi/node/relationship.rb +79 -0
- data/lib/simple_jsonapi/node/relationship_data/base.rb +53 -0
- data/lib/simple_jsonapi/node/relationship_data/collection.rb +32 -0
- data/lib/simple_jsonapi/node/relationship_data/singular.rb +33 -0
- data/lib/simple_jsonapi/node/relationships.rb +60 -0
- data/lib/simple_jsonapi/node/resource/base.rb +21 -0
- data/lib/simple_jsonapi/node/resource/full.rb +49 -0
- data/lib/simple_jsonapi/node/resource/linkage.rb +25 -0
- data/lib/simple_jsonapi/parameters/fields_spec.rb +45 -0
- data/lib/simple_jsonapi/parameters/include_spec.rb +57 -0
- data/lib/simple_jsonapi/parameters/sort_spec.rb +107 -0
- data/lib/simple_jsonapi/serializer.rb +89 -0
- data/lib/simple_jsonapi/version.rb +3 -0
- data/simple_jsonapi.gemspec +29 -0
- data/test/errors/bad_request_test.rb +34 -0
- data/test/errors/error_serializer_test.rb +229 -0
- data/test/errors/exception_serializer_test.rb +25 -0
- data/test/errors/wrapped_error_serializer_test.rb +91 -0
- data/test/errors/wrapped_error_test.rb +44 -0
- data/test/parameters/fields_spec_test.rb +56 -0
- data/test/parameters/include_spec_test.rb +58 -0
- data/test/parameters/sort_spec_test.rb +65 -0
- data/test/resources/attributes_test.rb +109 -0
- data/test/resources/extras_test.rb +70 -0
- data/test/resources/id_and_type_test.rb +76 -0
- data/test/resources/inclusion_test.rb +134 -0
- data/test/resources/links_test.rb +63 -0
- data/test/resources/meta_test.rb +49 -0
- data/test/resources/relationships_test.rb +262 -0
- data/test/resources/sorting_test.rb +79 -0
- data/test/resources/sparse_fieldset_test.rb +160 -0
- data/test/root_objects_test.rb +165 -0
- data/test/test_helper.rb +31 -0
- metadata +235 -0
data/Rakefile
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext'
|
3
|
+
|
4
|
+
require 'simple_jsonapi/helpers/exceptions'
|
5
|
+
require 'simple_jsonapi/helpers/serializer_inferrer'
|
6
|
+
require 'simple_jsonapi/helpers/serializer_methods'
|
7
|
+
|
8
|
+
require 'simple_jsonapi/parameters/fields_spec'
|
9
|
+
require 'simple_jsonapi/parameters/include_spec'
|
10
|
+
require 'simple_jsonapi/parameters/sort_spec'
|
11
|
+
|
12
|
+
require 'simple_jsonapi/definition/base'
|
13
|
+
require 'simple_jsonapi/definition/attribute'
|
14
|
+
require 'simple_jsonapi/definition/error'
|
15
|
+
require 'simple_jsonapi/definition/error_source'
|
16
|
+
require 'simple_jsonapi/definition/link'
|
17
|
+
require 'simple_jsonapi/definition/meta'
|
18
|
+
require 'simple_jsonapi/definition/relationship'
|
19
|
+
require 'simple_jsonapi/definition/resource'
|
20
|
+
|
21
|
+
require 'simple_jsonapi/node/base'
|
22
|
+
require 'simple_jsonapi/node/attributes'
|
23
|
+
require 'simple_jsonapi/node/data/collection'
|
24
|
+
require 'simple_jsonapi/node/data/singular'
|
25
|
+
require 'simple_jsonapi/node/document/base'
|
26
|
+
require 'simple_jsonapi/node/document/collection'
|
27
|
+
require 'simple_jsonapi/node/document/singular'
|
28
|
+
require 'simple_jsonapi/node/document/errors'
|
29
|
+
require 'simple_jsonapi/node/error'
|
30
|
+
require 'simple_jsonapi/node/error_source'
|
31
|
+
require 'simple_jsonapi/node/errors'
|
32
|
+
require 'simple_jsonapi/node/included'
|
33
|
+
require 'simple_jsonapi/node/object_links'
|
34
|
+
require 'simple_jsonapi/node/object_meta'
|
35
|
+
require 'simple_jsonapi/node/relationship'
|
36
|
+
require 'simple_jsonapi/node/relationship_data/base'
|
37
|
+
require 'simple_jsonapi/node/relationship_data/collection'
|
38
|
+
require 'simple_jsonapi/node/relationship_data/singular'
|
39
|
+
require 'simple_jsonapi/node/relationships'
|
40
|
+
require 'simple_jsonapi/node/resource/base'
|
41
|
+
require 'simple_jsonapi/node/resource/full'
|
42
|
+
require 'simple_jsonapi/node/resource/linkage'
|
43
|
+
|
44
|
+
require 'simple_jsonapi/serializer'
|
45
|
+
require 'simple_jsonapi/error_serializer'
|
46
|
+
|
47
|
+
require 'simple_jsonapi/errors/bad_request'
|
48
|
+
require 'simple_jsonapi/errors/exception_serializer'
|
49
|
+
require 'simple_jsonapi/errors/wrapped_error'
|
50
|
+
require 'simple_jsonapi/errors/wrapped_error_serializer'
|
51
|
+
|
52
|
+
module SimpleJsonapi
|
53
|
+
MIME_TYPE = 'application/vnd.api+json'.freeze
|
54
|
+
|
55
|
+
mattr_accessor :serializer_inferrer, :error_serializer_inferrer
|
56
|
+
|
57
|
+
self.serializer_inferrer = SerializerInferrer.new
|
58
|
+
self.error_serializer_inferrer = SerializerInferrer.new(namespace: SimpleJsonapi::Errors.name)
|
59
|
+
|
60
|
+
def self.render_resource(resource, options = {})
|
61
|
+
document_options = normalize_render_options(
|
62
|
+
options,
|
63
|
+
resource: resource,
|
64
|
+
serializer: serializer_inferrer,
|
65
|
+
)
|
66
|
+
|
67
|
+
Node::Document::Singular.new(document_options).as_jsonapi
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.render_resources(resources, options = {})
|
71
|
+
document_options = normalize_render_options(
|
72
|
+
options,
|
73
|
+
resources: resources,
|
74
|
+
serializer: serializer_inferrer,
|
75
|
+
)
|
76
|
+
|
77
|
+
Node::Document::Collection.new(document_options).as_jsonapi
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.render_errors(errors, options = {})
|
81
|
+
document_options = normalize_render_options(
|
82
|
+
options,
|
83
|
+
errors: errors,
|
84
|
+
serializer: error_serializer_inferrer,
|
85
|
+
)
|
86
|
+
|
87
|
+
Node::Document::Errors.new(document_options).as_jsonapi
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.normalize_render_options(options, defaults)
|
91
|
+
defaults.merge(options.symbolize_keys).transform_keys do |key|
|
92
|
+
key == :serializer ? :serializer_inferrer : key
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
private_class_method :normalize_render_options
|
97
|
+
end
|
98
|
+
|
99
|
+
module SimpleJsonapi::Definition
|
100
|
+
end
|
101
|
+
|
102
|
+
module SimpleJsonapi::Definition::Concerns
|
103
|
+
end
|
104
|
+
|
105
|
+
module SimpleJsonapi::Errors
|
106
|
+
end
|
107
|
+
|
108
|
+
module SimpleJsonapi::Node
|
109
|
+
end
|
110
|
+
|
111
|
+
module SimpleJsonapi::Parameters
|
112
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Represents a single attribute in a resource's +attributes+ collection
|
2
|
+
# @!attribute [r] name
|
3
|
+
# @return [Symbol]
|
4
|
+
# @!attribute [r] data_type
|
5
|
+
# @return [Symbol]
|
6
|
+
# @!attribute [r] array
|
7
|
+
# @return [Boolean]
|
8
|
+
# @!attribute [r] description
|
9
|
+
# @return [String]
|
10
|
+
class SimpleJsonapi::Definition::Attribute < SimpleJsonapi::Definition::Base
|
11
|
+
attr_reader :name, :data_type, :array, :description
|
12
|
+
# @visibility private
|
13
|
+
attr_reader :value_proc
|
14
|
+
|
15
|
+
# @overload initialize(name, type: nil, description: nil, **options, &block)
|
16
|
+
# @overload initialize(name, value, type: nil, description: nil, **options)
|
17
|
+
# @param type [Symbol] data type
|
18
|
+
# @param description [String]
|
19
|
+
# @yieldparam resource [Object]
|
20
|
+
# @yieldreturn [Object]
|
21
|
+
# @option (see Definition::Base#initialize)
|
22
|
+
def initialize(name, *args, type: nil, array: false, description: nil, **options, &block)
|
23
|
+
raise ArgumentError, "A name is required" if name.blank?
|
24
|
+
|
25
|
+
super
|
26
|
+
@name = name.to_sym
|
27
|
+
@data_type = type&.to_sym
|
28
|
+
@array = array
|
29
|
+
@description = description.to_s.presence
|
30
|
+
|
31
|
+
if args.none? && !block_given?
|
32
|
+
@value_proc = wrap_in_proc { |resource| resource.public_send(name) }
|
33
|
+
else
|
34
|
+
@value_proc = wrap_in_proc(*args, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def initialize_dup(new_def)
|
41
|
+
super
|
42
|
+
# name is a symbol, can't be duped
|
43
|
+
new_def.instance_variable_set(:@value_proc, @value_proc.dup)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'simple_jsonapi/definition/concerns/has_links_object'
|
2
|
+
require 'simple_jsonapi/definition/concerns/has_meta_object'
|
3
|
+
|
4
|
+
# Defines how a portion of a rendered JSONAPI document is generated from a
|
5
|
+
# resource or error object. See {file:README.md} for more details.
|
6
|
+
#
|
7
|
+
# @abstract
|
8
|
+
class SimpleJsonapi::Definition::Base
|
9
|
+
# @visibility private
|
10
|
+
# attr_reader :options, :if_predicate, :unless_predicate
|
11
|
+
attr_reader :if_predicate, :unless_predicate
|
12
|
+
|
13
|
+
# @param args See subclass documentation for the arguments they require.
|
14
|
+
# @option options [Proc<Boolean>] if
|
15
|
+
# @option options [Proc<Boolean>] unless
|
16
|
+
def initialize(*_args, **options, &_block)
|
17
|
+
@if_predicate = @unless_predicate = nil
|
18
|
+
@if_predicate = wrap_in_proc(options[:if]) if options.key?(:if)
|
19
|
+
@unless_predicate = wrap_in_proc(options[:unless]) if options.key?(:unless)
|
20
|
+
end
|
21
|
+
|
22
|
+
private def initialize_dup(new_def)
|
23
|
+
super
|
24
|
+
|
25
|
+
new_def.instance_variable_set(:@if_predicate, @if_predicate.dup) unless @if_predicate.nil?
|
26
|
+
new_def.instance_variable_set(:@unless_predicate, @unless_predicate.dup) unless @unless_predicate.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def wrap_in_proc(*args, &block)
|
32
|
+
if args.empty? && !block_given?
|
33
|
+
raise ArgumentError, "Either a value or a block is required"
|
34
|
+
elsif args.size == 1 && block_given?
|
35
|
+
raise ArgumentError, "A value and a block cannot both be present"
|
36
|
+
elsif args.size > 1
|
37
|
+
raise ArgumentError, "Too many arguments provided (#{args.size})"
|
38
|
+
end
|
39
|
+
|
40
|
+
callable_or_value = args[0]
|
41
|
+
|
42
|
+
if block_given?
|
43
|
+
block
|
44
|
+
elsif callable_or_value.is_a?(Proc)
|
45
|
+
callable_or_value
|
46
|
+
else
|
47
|
+
proc { |*| callable_or_value }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module SimpleJsonapi
|
2
|
+
module Definition
|
3
|
+
module Concerns
|
4
|
+
# Adds a {#link} method and {#link_definitions} collection to a
|
5
|
+
# definition.
|
6
|
+
#
|
7
|
+
# @!attribute [r] link_definitions
|
8
|
+
# @return [Hash{Symbol => String,Object}]
|
9
|
+
module HasLinksObject
|
10
|
+
# @visibility private
|
11
|
+
def self.included(base)
|
12
|
+
base.send :attr_accessor, :link_definitions
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(*args, &block)
|
16
|
+
super
|
17
|
+
@link_definitions = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
private def initialize_dup(new_def)
|
21
|
+
super
|
22
|
+
new_def.link_definitions = link_definitions.deep_dup
|
23
|
+
end
|
24
|
+
|
25
|
+
# @overload link(name, options = {}, &block)
|
26
|
+
# @overload link(name, value, options = {})
|
27
|
+
# @yieldparam object [Object]
|
28
|
+
# @yieldreturn [String,Hash]
|
29
|
+
# @return [void]
|
30
|
+
def link(name, *args, **options, &block)
|
31
|
+
link_definitions[name.to_sym] = Link.new(name, *args, options, &block)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module SimpleJsonapi
|
2
|
+
module Definition
|
3
|
+
module Concerns
|
4
|
+
# Adds a {#meta} method and {#meta_definitions} collection to a
|
5
|
+
# definition.
|
6
|
+
#
|
7
|
+
# @!attribute [r] meta_definitions
|
8
|
+
# @return [Hash{Symbol => String,Object}]
|
9
|
+
module HasMetaObject
|
10
|
+
# @visibility private
|
11
|
+
def self.included(base)
|
12
|
+
base.send :attr_accessor, :meta_definitions
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(*args, &block)
|
16
|
+
super
|
17
|
+
@meta_definitions = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
private def initialize_dup(new_def)
|
21
|
+
super
|
22
|
+
new_def.meta_definitions = meta_definitions.deep_dup
|
23
|
+
end
|
24
|
+
|
25
|
+
# @overload meta(name, options = {}, &block)
|
26
|
+
# @overload meta(name, value, options = {})
|
27
|
+
# @yieldparam object [Object]
|
28
|
+
# @yieldreturn [Object]
|
29
|
+
# @return [void]
|
30
|
+
def meta(name, *args, **options, &block)
|
31
|
+
meta_definitions[name.to_sym] = Meta.new(name, *args, options, &block)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# @!attribute [r] member_definitions
|
2
|
+
# @return [Hash{Symbol => Attribute}]
|
3
|
+
# @!attribute [r] source_definition
|
4
|
+
# @return [ErrorSource]
|
5
|
+
class SimpleJsonapi::Definition::Error < SimpleJsonapi::Definition::Base
|
6
|
+
include SimpleJsonapi::Definition::Concerns::HasLinksObject
|
7
|
+
include SimpleJsonapi::Definition::Concerns::HasMetaObject
|
8
|
+
|
9
|
+
attr_reader :member_definitions, :source_definition
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
super
|
13
|
+
@member_definitions = {}
|
14
|
+
@source_definition = SimpleJsonapi::Definition::ErrorSource.new
|
15
|
+
end
|
16
|
+
|
17
|
+
private def initialize_dup(new_def)
|
18
|
+
super
|
19
|
+
new_def.instance_variable_set(:@source_definition, @source_definition.dup) unless @source_definition.nil?
|
20
|
+
new_def.instance_variable_set(:@member_definitions, @member_definitions.dup) unless @member_definitions.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
# @overload id(options = {}, &block)
|
24
|
+
# @overload id(value, options = {})
|
25
|
+
# @return [void]
|
26
|
+
def id(*args, **options, &block)
|
27
|
+
member_definitions[:id] = SimpleJsonapi::Definition::Attribute.new(:id, *args, **options, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
# @overload status(options = {}, &block)
|
31
|
+
# @overload status(value, options = {})
|
32
|
+
# @return [void]
|
33
|
+
def status(*args, **options, &block)
|
34
|
+
member_definitions[:status] = SimpleJsonapi::Definition::Attribute.new(:status, *args, **options, &block)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @overload code(options = {}, &block)
|
38
|
+
# @overload code(value, options = {})
|
39
|
+
# @return [void]
|
40
|
+
def code(*args, **options, &block)
|
41
|
+
member_definitions[:code] = SimpleJsonapi::Definition::Attribute.new(:code, *args, **options, &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
# @overload title(options = {}, &block)
|
45
|
+
# @overload title(value, options = {})
|
46
|
+
# @return [void]
|
47
|
+
def title(*args, **options, &block)
|
48
|
+
member_definitions[:title] = SimpleJsonapi::Definition::Attribute.new(:title, *args, **options, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
# @overload detail(options = {}, &block)
|
52
|
+
# @overload detail(value, options = {})
|
53
|
+
# @return [void]
|
54
|
+
def detail(*args, **options, &block)
|
55
|
+
member_definitions[:detail] = SimpleJsonapi::Definition::Attribute.new(:detail, *args, **options, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
# @overload about_link(options = {}, &block)
|
59
|
+
# @overload about_link(value, options = {})
|
60
|
+
# @return [void]
|
61
|
+
def about_link(*args, **options, &block)
|
62
|
+
link(:about, *args, options, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see ErrorSource#initialize
|
66
|
+
# @return [void]
|
67
|
+
def source(&block)
|
68
|
+
@source_definition = SimpleJsonapi::Definition::ErrorSource.new(&block)
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class SimpleJsonapi::Definition::ErrorSource < SimpleJsonapi::Definition::Base
|
2
|
+
# @visibility private
|
3
|
+
attr_reader :member_definitions
|
4
|
+
|
5
|
+
def initialize(&block)
|
6
|
+
super
|
7
|
+
@member_definitions = {}
|
8
|
+
instance_eval(&block) if block_given?
|
9
|
+
end
|
10
|
+
|
11
|
+
private def initialize_dup(new_def)
|
12
|
+
super
|
13
|
+
new_def.instance_variable_set(:@member_definitions, @member_definitions.dup) unless @member_definitions.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
# @overload pointer(options = {}, &block)
|
17
|
+
# @overload pointer(value, options = {})
|
18
|
+
# @return [void]
|
19
|
+
def pointer(*args, **options, &block)
|
20
|
+
member_definitions[:pointer] = SimpleJsonapi::Definition::Attribute.new(:pointer, *args, **options, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @overload parameter(options = {}, &block)
|
24
|
+
# @overload parameter(value, options = {})
|
25
|
+
# @return [void]
|
26
|
+
def parameter(*args, **options, &block)
|
27
|
+
member_definitions[:parameter] = SimpleJsonapi::Definition::Attribute.new(:parameter, *args, **options, &block)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Represents a single member in a +links+ object
|
2
|
+
# @!attribute [r] name
|
3
|
+
# @return [Symbol]
|
4
|
+
class SimpleJsonapi::Definition::Link < SimpleJsonapi::Definition::Base
|
5
|
+
attr_reader :name
|
6
|
+
# @visibility private
|
7
|
+
attr_reader :value_proc
|
8
|
+
|
9
|
+
# @overload initialize(name, options = {}, &block)
|
10
|
+
# @overload initialize(name, value, options = {})
|
11
|
+
# @yieldparam object [Object] The resource or error.
|
12
|
+
# @yieldreturn [String,Hash] The link or link object.
|
13
|
+
# @option (see Definition::Base#initialize)
|
14
|
+
def initialize(name, *args, **options, &block)
|
15
|
+
raise ArgumentError, "A name is required" if name.blank?
|
16
|
+
|
17
|
+
super
|
18
|
+
@name = name
|
19
|
+
@value_proc = wrap_in_proc(*args, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
private def initialize_dup(new_def)
|
23
|
+
super
|
24
|
+
# name is a symbol, can't be duped
|
25
|
+
new_def.instance_variable_set(:@value_proc, @value_proc.dup)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Represents a single member in a +meta+ object
|
2
|
+
# @!attribute [r] name
|
3
|
+
# @return [Symbol]
|
4
|
+
class SimpleJsonapi::Definition::Meta < SimpleJsonapi::Definition::Base
|
5
|
+
attr_reader :name
|
6
|
+
# @visibility private
|
7
|
+
attr_reader :value_proc
|
8
|
+
|
9
|
+
# @overload initialize(name, options = {}, &block)
|
10
|
+
# @overload initialize(name, value, options = {})
|
11
|
+
# @yieldparam object [Object] The resource or error.
|
12
|
+
# @yieldreturn [String,Hash] The metadata value.
|
13
|
+
# @option (see Definition::Base#initialize)
|
14
|
+
def initialize(name, *args, **options, &block)
|
15
|
+
raise ArgumentError, "A name is required" if name.blank?
|
16
|
+
|
17
|
+
super
|
18
|
+
@name = name
|
19
|
+
@value_proc = wrap_in_proc(*args, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
private def initialize_dup(new_def)
|
23
|
+
super
|
24
|
+
# name is a symbol, can't be duped
|
25
|
+
new_def.instance_variable_set(:@value_proc, @value_proc.dup)
|
26
|
+
end
|
27
|
+
end
|