easy-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/.github/workflows/publish-gem.yml +60 -0
- data/.github/workflows/rake.yml +35 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +106 -0
- data/LICENSE.txt +21 -0
- data/README.md +209 -0
- data/Rakefile +20 -0
- data/UsingTheRequestObject.md +74 -0
- data/UsingUserConfigurations.md +95 -0
- data/bin/bundle +114 -0
- data/bin/console +15 -0
- data/bin/htmldiff +29 -0
- data/bin/kramdown +29 -0
- data/bin/ldiff +29 -0
- data/bin/license_finder +29 -0
- data/bin/license_finder_pip.py +29 -0
- data/bin/maruku +29 -0
- data/bin/marutex +29 -0
- data/bin/nokogiri +29 -0
- data/bin/racc +29 -0
- data/bin/rackup +29 -0
- data/bin/rake +29 -0
- data/bin/redcarpet +29 -0
- data/bin/reverse_markdown +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/ruby-parse +29 -0
- data/bin/ruby-rewrite +29 -0
- data/bin/setup +8 -0
- data/bin/solargraph +29 -0
- data/bin/thor +29 -0
- data/bin/tilt +29 -0
- data/bin/yard +29 -0
- data/bin/yardoc +29 -0
- data/bin/yri +29 -0
- data/easy-jsonapi.gemspec +39 -0
- data/lib/easy/jsonapi.rb +12 -0
- data/lib/easy/jsonapi/collection.rb +144 -0
- data/lib/easy/jsonapi/config_manager.rb +144 -0
- data/lib/easy/jsonapi/config_manager/config.rb +49 -0
- data/lib/easy/jsonapi/document.rb +71 -0
- data/lib/easy/jsonapi/document/error.rb +48 -0
- data/lib/easy/jsonapi/document/error/error_member.rb +15 -0
- data/lib/easy/jsonapi/document/jsonapi.rb +26 -0
- data/lib/easy/jsonapi/document/jsonapi/jsonapi_member.rb +15 -0
- data/lib/easy/jsonapi/document/links.rb +36 -0
- data/lib/easy/jsonapi/document/links/link.rb +15 -0
- data/lib/easy/jsonapi/document/meta.rb +26 -0
- data/lib/easy/jsonapi/document/meta/meta_member.rb +14 -0
- data/lib/easy/jsonapi/document/resource.rb +56 -0
- data/lib/easy/jsonapi/document/resource/attributes.rb +37 -0
- data/lib/easy/jsonapi/document/resource/attributes/attribute.rb +29 -0
- data/lib/easy/jsonapi/document/resource/relationships.rb +40 -0
- data/lib/easy/jsonapi/document/resource/relationships/relationship.rb +50 -0
- data/lib/easy/jsonapi/document/resource_id.rb +28 -0
- data/lib/easy/jsonapi/exceptions.rb +27 -0
- data/lib/easy/jsonapi/exceptions/document_exceptions.rb +619 -0
- data/lib/easy/jsonapi/exceptions/headers_exceptions.rb +156 -0
- data/lib/easy/jsonapi/exceptions/naming_exceptions.rb +36 -0
- data/lib/easy/jsonapi/exceptions/query_params_exceptions.rb +67 -0
- data/lib/easy/jsonapi/exceptions/user_defined_exceptions.rb +253 -0
- data/lib/easy/jsonapi/field.rb +43 -0
- data/lib/easy/jsonapi/header_collection.rb +38 -0
- data/lib/easy/jsonapi/header_collection/header.rb +11 -0
- data/lib/easy/jsonapi/item.rb +88 -0
- data/lib/easy/jsonapi/middleware.rb +158 -0
- data/lib/easy/jsonapi/name_value_pair.rb +72 -0
- data/lib/easy/jsonapi/name_value_pair_collection.rb +78 -0
- data/lib/easy/jsonapi/parser.rb +38 -0
- data/lib/easy/jsonapi/parser/document_parser.rb +196 -0
- data/lib/easy/jsonapi/parser/headers_parser.rb +33 -0
- data/lib/easy/jsonapi/parser/rack_req_params_parser.rb +117 -0
- data/lib/easy/jsonapi/request.rb +40 -0
- data/lib/easy/jsonapi/request/query_param_collection.rb +56 -0
- data/lib/easy/jsonapi/request/query_param_collection/fields_param.rb +32 -0
- data/lib/easy/jsonapi/request/query_param_collection/fields_param/fieldset.rb +34 -0
- data/lib/easy/jsonapi/request/query_param_collection/filter_param.rb +28 -0
- data/lib/easy/jsonapi/request/query_param_collection/filter_param/filter.rb +34 -0
- data/lib/easy/jsonapi/request/query_param_collection/include_param.rb +119 -0
- data/lib/easy/jsonapi/request/query_param_collection/page_param.rb +55 -0
- data/lib/easy/jsonapi/request/query_param_collection/query_param.rb +47 -0
- data/lib/easy/jsonapi/request/query_param_collection/sort_param.rb +25 -0
- data/lib/easy/jsonapi/response.rb +22 -0
- data/lib/easy/jsonapi/utility.rb +158 -0
- data/lib/easy/jsonapi/version.rb +8 -0
- metadata +248 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JSONAPI
|
4
|
+
class ConfigManager
|
5
|
+
|
6
|
+
# User configurations for the gem
|
7
|
+
class Config
|
8
|
+
|
9
|
+
attr_reader :required_document_members, :required_headers, :required_query_params,
|
10
|
+
:allow_client_ids
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@allow_client_ids = false
|
14
|
+
@default = true
|
15
|
+
end
|
16
|
+
|
17
|
+
# Performancewise, configs are all initialized as a startup cost, to change them you need to
|
18
|
+
# restart the server. As a result of this, the #default? is used to process a request
|
19
|
+
# faster if user-defined configs do not need to be checked when screening http requests.
|
20
|
+
# Because @default is set to false upon config assignment (see #method missing in Config),
|
21
|
+
# this allows the a user to potentially make the middleware screening less performant than necessary
|
22
|
+
# by assigning config values to the default values, or assigning values to something not default,
|
23
|
+
# and then assigning config values to the default again. If used as intended, however, this should make
|
24
|
+
# the middleware screening faster.
|
25
|
+
# @return [TrueClass | FalseClass]
|
26
|
+
def default?
|
27
|
+
@default
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
READER_METHODS = %i[required_document_members required_headers required_query_params allow_client_ids].freeze
|
33
|
+
|
34
|
+
# Only used if implementing Item directly.
|
35
|
+
# dynamically creates accessor methods for instance variables
|
36
|
+
# created in the initialize
|
37
|
+
def method_missing(method_name, *args, &block)
|
38
|
+
super unless READER_METHODS.include?(method_name.to_s[..-2].to_sym)
|
39
|
+
instance_variable_set("@#{method_name}"[..-2].to_sym, args[0])
|
40
|
+
@default = false
|
41
|
+
end
|
42
|
+
|
43
|
+
# Needed when using #method_missing
|
44
|
+
def respond_to_missing?(method_name, *args)
|
45
|
+
methods.include?(method_name) || super
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# classes extending document: (require needed because parser requires document)
|
4
|
+
require 'easy/jsonapi/document/resource'
|
5
|
+
require 'easy/jsonapi/document/resource_id'
|
6
|
+
require 'easy/jsonapi/document/error'
|
7
|
+
require 'easy/jsonapi/document/jsonapi'
|
8
|
+
require 'easy/jsonapi/document/links'
|
9
|
+
require 'easy/jsonapi/document/meta'
|
10
|
+
|
11
|
+
require 'easy/jsonapi/utility'
|
12
|
+
require 'easy/jsonapi/exceptions/document_exceptions'
|
13
|
+
|
14
|
+
module JSONAPI
|
15
|
+
|
16
|
+
# Contains all objects relating to a JSONAPI Document
|
17
|
+
class Document
|
18
|
+
|
19
|
+
attr_reader :data, :meta, :links, :included, :errors, :jsonapi
|
20
|
+
|
21
|
+
# @param document [Hash] A hash of the different possible document members
|
22
|
+
# with the values being clases associated with those members
|
23
|
+
# @data is either a JSONAPI::Document::Resource or a Array<JSONAPI::Document::Resource>
|
24
|
+
# or a JSONAPI::Document::ResourceId or a Array<JSONAPI::Document::ResourceId>
|
25
|
+
# @meta is JSONAPI::Document::Meta
|
26
|
+
# @links is JSONAPI::Document::Links
|
27
|
+
# @included is an Array<JSONAPI::Document::Resource>
|
28
|
+
# @errors is an Array<JSONAPI::Document::Error>
|
29
|
+
# @jsonapi is JSONAPI::Document::Jsonapi
|
30
|
+
# @raise RuntimeError A document must be initialized with a hash of its members.
|
31
|
+
def initialize(document = {})
|
32
|
+
raise 'JSONAPI::Document parameter must be a Hash' unless document.is_a? Hash
|
33
|
+
@data = document[:data]
|
34
|
+
@meta = document[:meta]
|
35
|
+
@links = document[:links] # software generated?
|
36
|
+
@included = document[:included]
|
37
|
+
@errors = document[:errors]
|
38
|
+
@jsonapi = document[:jsonapi] # online documentation
|
39
|
+
end
|
40
|
+
|
41
|
+
# Represent as a string mimicing the JSONAPI format
|
42
|
+
def to_s
|
43
|
+
'{ ' \
|
44
|
+
"#{JSONAPI::Utility.member_to_s('data', @data, first_member: true)}" \
|
45
|
+
"#{JSONAPI::Utility.member_to_s('meta', @meta)}" \
|
46
|
+
"#{JSONAPI::Utility.member_to_s('links', @links)}" \
|
47
|
+
"#{JSONAPI::Utility.member_to_s('included', @included)}" \
|
48
|
+
"#{JSONAPI::Utility.member_to_s('errors', @errors)}" \
|
49
|
+
"#{JSONAPI::Utility.member_to_s('jsonapi', @jsonapi)}" \
|
50
|
+
' }'
|
51
|
+
end
|
52
|
+
|
53
|
+
# Represent as a hash mimicing the JSONAPI format
|
54
|
+
def to_h
|
55
|
+
to_return = {}
|
56
|
+
JSONAPI::Utility.to_h_member(to_return, @data, :data)
|
57
|
+
JSONAPI::Utility.to_h_member(to_return, @meta, :meta)
|
58
|
+
JSONAPI::Utility.to_h_member(to_return, @links, :links)
|
59
|
+
JSONAPI::Utility.to_h_member(to_return, @included, :included)
|
60
|
+
JSONAPI::Utility.to_h_member(to_return, @errors, :errors)
|
61
|
+
JSONAPI::Utility.to_h_member(to_return, @jsonapi, :jsonapi)
|
62
|
+
to_return
|
63
|
+
end
|
64
|
+
|
65
|
+
# Check if the document is JSONAPI compliant
|
66
|
+
# @raise If the document's to_h does not comply
|
67
|
+
def validate
|
68
|
+
JSONAPI::Exceptions::DocumentExceptions.check_compliance(to_h)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair_collection'
|
4
|
+
require 'easy/jsonapi/document/error/error_member' # extension
|
5
|
+
require 'easy/jsonapi/utility'
|
6
|
+
|
7
|
+
module JSONAPI
|
8
|
+
class Document
|
9
|
+
# An individual errors member in a jsonapi's document top level 'errors' member array
|
10
|
+
class Error < JSONAPI::NameValuePairCollection
|
11
|
+
|
12
|
+
# @param err_members [Array<JSONAPI::Document::Error::ErrorMember>]
|
13
|
+
# The error members that belong to this specific error.
|
14
|
+
def initialize(err_members = [])
|
15
|
+
super(err_members, item_type: JSONAPI::Document::Error::ErrorMember)
|
16
|
+
end
|
17
|
+
|
18
|
+
# #empyt? provided by super
|
19
|
+
# #include provided by super
|
20
|
+
|
21
|
+
# Add a error to the collection using it's name
|
22
|
+
# @param error_mem [JSONAPI::Document::Error::ErrorMember]
|
23
|
+
def add(error_mem)
|
24
|
+
super(error_mem, &:name)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Another way to call add
|
28
|
+
# @param (see #add)
|
29
|
+
def <<(error_mem)
|
30
|
+
super(error_mem, &:name)
|
31
|
+
end
|
32
|
+
|
33
|
+
# #<< provided by super, but calls overriden #add
|
34
|
+
# #each provided from super
|
35
|
+
# #remove provided from super
|
36
|
+
# #get provided by super
|
37
|
+
# #keys provided by super
|
38
|
+
# #size provided by super
|
39
|
+
# #to_s provided by super
|
40
|
+
|
41
|
+
# Represent an Error as a hash
|
42
|
+
def to_h
|
43
|
+
JSONAPI::Utility.to_h_collection(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair'
|
4
|
+
require 'easy/jsonapi/document/error'
|
5
|
+
|
6
|
+
module JSONAPI
|
7
|
+
class Document
|
8
|
+
class Error < JSONAPI::NameValuePairCollection
|
9
|
+
|
10
|
+
# An individual error member
|
11
|
+
class ErrorMember < JSONAPI::NameValuePair
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair_collection'
|
4
|
+
require 'easy/jsonapi/document/jsonapi/jsonapi_member' # extension
|
5
|
+
|
6
|
+
module JSONAPI
|
7
|
+
class Document
|
8
|
+
|
9
|
+
# The jsonapi top level member of a JSON:API document
|
10
|
+
class Jsonapi < JSONAPI::NameValuePairCollection
|
11
|
+
|
12
|
+
# @param jsonapi_member_arr [Array<JSONAPI::Document::Jsonapi::JsonapiMember] The collection
|
13
|
+
# of members to intialize this collection with.
|
14
|
+
def initialize(jsonapi_member_arr = [])
|
15
|
+
super(jsonapi_member_arr, item_type: JSONAPI::Document::Jsonapi::JsonapiMember)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Add a jsonapi member to the collection
|
19
|
+
# @param jsonapi_member [JSONAPI::Document::Jsonapi::JsonapiMember] The member to add
|
20
|
+
def add(jsonapi_member)
|
21
|
+
super(jsonapi_member, &:name)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair'
|
4
|
+
require 'easy/jsonapi/document/jsonapi'
|
5
|
+
|
6
|
+
module JSONAPI
|
7
|
+
class Document
|
8
|
+
class Jsonapi < JSONAPI::NameValuePairCollection
|
9
|
+
|
10
|
+
# An individual member in a JSON:API Meta object
|
11
|
+
class JsonapiMember < JSONAPI::NameValuePair
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair_collection'
|
4
|
+
require 'easy/jsonapi/document/links/link' # extension
|
5
|
+
require 'easy/jsonapi/utility'
|
6
|
+
|
7
|
+
module JSONAPI
|
8
|
+
class Document
|
9
|
+
|
10
|
+
# The links of a resource
|
11
|
+
class Links < JSONAPI::NameValuePairCollection
|
12
|
+
|
13
|
+
# @param link_arr [Array<JSONAPI::Document::Links::Link] The array
|
14
|
+
# of links to initialize this collection with.
|
15
|
+
def initialize(link_arr = [])
|
16
|
+
super(link_arr, item_type: JSONAPI::Document::Links::Link)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Add a jsonapi member to the collection
|
20
|
+
# @param link [JSONAPI::Document::Links:Link] The member to add
|
21
|
+
def add(link)
|
22
|
+
super(link, &:name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# #empyt? provided by super class
|
29
|
+
# #include provided by super class
|
30
|
+
# #add provided by super
|
31
|
+
# #each provided from super class
|
32
|
+
# #remove provided from super class
|
33
|
+
# #get provided by super class
|
34
|
+
# #keys provided by super class
|
35
|
+
# #size provided by super class
|
36
|
+
# #to_s provided from super class
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair'
|
4
|
+
require 'easy/jsonapi/document/links'
|
5
|
+
|
6
|
+
module JSONAPI
|
7
|
+
class Document
|
8
|
+
class Links < JSONAPI::NameValuePairCollection
|
9
|
+
|
10
|
+
# An individual attribute in a JSON:API Links object
|
11
|
+
class Link < JSONAPI::NameValuePair
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair_collection'
|
4
|
+
require 'easy/jsonapi/document/meta/meta_member' # extension
|
5
|
+
|
6
|
+
module JSONAPI
|
7
|
+
class Document
|
8
|
+
|
9
|
+
# The meta of a resource
|
10
|
+
class Meta < JSONAPI::NameValuePairCollection
|
11
|
+
|
12
|
+
# @param meta_arr [Array<JSONAPI::Document::Meta::MetaMember] The
|
13
|
+
# array of meta members to initialize the collection with
|
14
|
+
def initialize(meta_arr = [])
|
15
|
+
meta_arr = [meta_arr] unless meta_arr.is_a? Array
|
16
|
+
super(meta_arr, item_type: JSONAPI::Document::Meta::MetaMember)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Add a jsonapi member to the collection
|
20
|
+
# @param meta_member [JSONAPI::Document::Meta::MetaMember] The member to add
|
21
|
+
def add(meta_member)
|
22
|
+
super(meta_member, &:name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/document/meta'
|
4
|
+
|
5
|
+
module JSONAPI
|
6
|
+
class Document
|
7
|
+
class Meta < JSONAPI::NameValuePairCollection
|
8
|
+
|
9
|
+
# An individual member in a JSON:API Meta object
|
10
|
+
class MetaMember < JSONAPI::NameValuePair
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/document/resource/attributes' # extension
|
4
|
+
require 'easy/jsonapi/document/resource/relationships' # extension
|
5
|
+
require 'easy/jsonapi/utility'
|
6
|
+
|
7
|
+
module JSONAPI
|
8
|
+
class Document
|
9
|
+
# A jsonapi resource object
|
10
|
+
class Resource
|
11
|
+
|
12
|
+
attr_accessor :attributes, :relationships, :links, :meta, :type, :id
|
13
|
+
|
14
|
+
# @param members_hash [Hash] The members to initialize a resource with
|
15
|
+
def initialize(members_hash)
|
16
|
+
unless members_hash.is_a? Hash
|
17
|
+
raise 'A JSONAPI::Document::Resource must be initialized with a Hash'
|
18
|
+
end
|
19
|
+
@type = members_hash[:type].to_s unless members_hash[:type].nil?
|
20
|
+
@id = members_hash[:id].to_s unless members_hash[:id].nil?
|
21
|
+
@attributes = members_hash[:attributes]
|
22
|
+
@relationships = members_hash[:relationships]
|
23
|
+
@links = members_hash[:links]
|
24
|
+
@meta = members_hash[:meta]
|
25
|
+
end
|
26
|
+
|
27
|
+
# String representation of Document that is JSON parsable
|
28
|
+
# If any document memeber is nil, it does not include it
|
29
|
+
# in the returned string.
|
30
|
+
# @return [String] The string representation of a JSONAPI Document
|
31
|
+
def to_s
|
32
|
+
'{ ' \
|
33
|
+
"#{JSONAPI::Utility.member_to_s('type', @type, first_member: true)}" \
|
34
|
+
"#{JSONAPI::Utility.member_to_s('id', @id)}" \
|
35
|
+
"#{JSONAPI::Utility.member_to_s('attributes', @attributes)}" \
|
36
|
+
"#{JSONAPI::Utility.member_to_s('relationships', @relationships)}" \
|
37
|
+
"#{JSONAPI::Utility.member_to_s('links', @links)}" \
|
38
|
+
"#{JSONAPI::Utility.member_to_s('meta', @meta)}" \
|
39
|
+
' }'
|
40
|
+
end
|
41
|
+
|
42
|
+
# Hash representation of a jsonapi resource
|
43
|
+
# @return [Hash] The jsonapi representation of the resource
|
44
|
+
def to_h
|
45
|
+
to_return = {}
|
46
|
+
JSONAPI::Utility.to_h_member(to_return, @type, :type)
|
47
|
+
JSONAPI::Utility.to_h_member(to_return, @id, :id)
|
48
|
+
JSONAPI::Utility.to_h_member(to_return, @attributes, :attributes)
|
49
|
+
JSONAPI::Utility.to_h_member(to_return, @relationships, :relationships)
|
50
|
+
JSONAPI::Utility.to_h_member(to_return, @links, :links)
|
51
|
+
JSONAPI::Utility.to_h_member(to_return, @meta, :meta)
|
52
|
+
to_return
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/name_value_pair_collection'
|
4
|
+
require 'easy/jsonapi/document/resource/attributes/attribute'
|
5
|
+
|
6
|
+
module JSONAPI
|
7
|
+
class Document
|
8
|
+
class Resource
|
9
|
+
# The attributes of a resource
|
10
|
+
class Attributes < JSONAPI::NameValuePairCollection
|
11
|
+
|
12
|
+
# @param attr_arr [Array<JSONAPI::Document::Resource::Attributes::Attribute]
|
13
|
+
# The collection of attributes to initialize the collection with.
|
14
|
+
def initialize(attr_arr = [])
|
15
|
+
super(attr_arr, item_type: JSONAPI::Document::Resource::Attributes::Attribute)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Add a jsonapi member to the collection
|
19
|
+
# @param attribute [JSONAPI::Document::Resource::Attributes::Attribute] The member to add
|
20
|
+
def add(attribute)
|
21
|
+
super(attribute, &:name)
|
22
|
+
end
|
23
|
+
|
24
|
+
# #empyt? provided by super
|
25
|
+
# #include provided by super
|
26
|
+
# #add provided by super
|
27
|
+
# #each provided from super
|
28
|
+
# #remove provided from super
|
29
|
+
# #get provided by super
|
30
|
+
# #keys provided by super
|
31
|
+
# #size provided by super
|
32
|
+
|
33
|
+
# to_s provided from super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy/jsonapi/field'
|
4
|
+
require 'easy/jsonapi/document/resource/attributes'
|
5
|
+
require 'easy/jsonapi/name_value_pair'
|
6
|
+
|
7
|
+
module JSONAPI
|
8
|
+
class Document
|
9
|
+
class Resource
|
10
|
+
class Attributes < JSONAPI::NameValuePairCollection
|
11
|
+
|
12
|
+
# An individual attribute in a JSON:API Attributes object
|
13
|
+
class Attribute < JSONAPI::NameValuePair
|
14
|
+
|
15
|
+
attr_reader :field
|
16
|
+
|
17
|
+
# @param name [String] The name of an attribute
|
18
|
+
# @param value [String] The value of an attribute
|
19
|
+
# @param type [Any] The type of an attribute value
|
20
|
+
def initialize(name, value, type: String)
|
21
|
+
@field = JSONAPI::Field.new(name, type: type)
|
22
|
+
super(name, value)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|