ruby_jsonapi 1.0.1
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 +7 -0
- data/LICENSE.txt +201 -0
- data/README.md +129 -0
- data/lib/extensions/has_one.rb +18 -0
- data/lib/fast_jsonapi/attribute.rb +5 -0
- data/lib/fast_jsonapi/helpers.rb +21 -0
- data/lib/fast_jsonapi/instrumentation/skylight.rb +3 -0
- data/lib/fast_jsonapi/instrumentation.rb +7 -0
- data/lib/fast_jsonapi/link.rb +5 -0
- data/lib/fast_jsonapi/object_serializer.rb +351 -0
- data/lib/fast_jsonapi/railtie.rb +11 -0
- data/lib/fast_jsonapi/relationship.rb +236 -0
- data/lib/fast_jsonapi/scalar.rb +29 -0
- data/lib/fast_jsonapi/serialization_core.rb +202 -0
- data/lib/fast_jsonapi/version.rb +3 -0
- data/lib/fast_jsonapi.rb +12 -0
- data/lib/generators/serializer/USAGE +8 -0
- data/lib/generators/serializer/serializer_generator.rb +19 -0
- data/lib/generators/serializer/templates/serializer.rb.tt +6 -0
- data/lib/jsonapi/serializer/errors.rb +21 -0
- data/lib/jsonapi/serializer/instrumentation.rb +28 -0
- data/lib/jsonapi/serializer/version.rb +5 -0
- data/lib/jsonapi/serializer.rb +12 -0
- metadata +257 -0
@@ -0,0 +1,202 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/concern'
|
5
|
+
require 'digest/sha1'
|
6
|
+
|
7
|
+
module FastJsonapi
|
8
|
+
MandatoryField = Class.new(StandardError)
|
9
|
+
|
10
|
+
module SerializationCore
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
class << self
|
15
|
+
attr_accessor :attributes_to_serialize,
|
16
|
+
:relationships_to_serialize,
|
17
|
+
:cachable_relationships_to_serialize,
|
18
|
+
:uncachable_relationships_to_serialize,
|
19
|
+
:transform_method,
|
20
|
+
:record_type,
|
21
|
+
:record_id,
|
22
|
+
:cache_store_instance,
|
23
|
+
:cache_store_options,
|
24
|
+
:data_links,
|
25
|
+
:meta_to_serialize
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class_methods do
|
30
|
+
def id_hash(id, record_type, default_return = false)
|
31
|
+
if id.present?
|
32
|
+
{ id: id.to_s, type: record_type }
|
33
|
+
else
|
34
|
+
default_return ? { id: nil, type: record_type } : nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def links_hash(record, params = {})
|
39
|
+
data_links.each_with_object({}) do |(_k, link), hash|
|
40
|
+
link.serialize(record, params, hash)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def attributes_hash(record, fieldset = nil, params = {})
|
45
|
+
attributes = attributes_to_serialize
|
46
|
+
attributes = attributes.slice(*fieldset) if fieldset.present?
|
47
|
+
attributes = {} if fieldset == []
|
48
|
+
|
49
|
+
attributes.each_with_object({}) do |(_k, attribute), hash|
|
50
|
+
attribute.serialize(record, params, hash)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def relationships_hash(record, relationships = nil, fieldset = nil, includes_list = nil, params = {})
|
55
|
+
relationships = relationships_to_serialize if relationships.nil?
|
56
|
+
relationships = relationships.slice(*fieldset) if fieldset.present?
|
57
|
+
relationships = {} if fieldset == []
|
58
|
+
|
59
|
+
relationships.each_with_object({}) do |(key, relationship), hash|
|
60
|
+
included = includes_list.present? && includes_list.include?(key)
|
61
|
+
relationship.serialize(record, included, params, hash)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def meta_hash(record, params = {})
|
66
|
+
FastJsonapi.call_proc(meta_to_serialize, record, params)
|
67
|
+
end
|
68
|
+
|
69
|
+
def record_hash(record, fieldset, includes_list, params = {})
|
70
|
+
if cache_store_instance
|
71
|
+
cache_opts = record_cache_options(cache_store_options, fieldset, includes_list, params)
|
72
|
+
record_hash = cache_store_instance.fetch(record, **cache_opts) do
|
73
|
+
temp_hash = id_hash(id_from_record(record, params), record_type, true)
|
74
|
+
temp_hash[:attributes] = attributes_hash(record, fieldset, params) if attributes_to_serialize.present?
|
75
|
+
temp_hash[:relationships] = relationships_hash(record, cachable_relationships_to_serialize, fieldset, includes_list, params) if cachable_relationships_to_serialize.present?
|
76
|
+
temp_hash[:links] = links_hash(record, params) if data_links.present?
|
77
|
+
temp_hash
|
78
|
+
end
|
79
|
+
record_hash[:relationships] = (record_hash[:relationships] || {}).merge(relationships_hash(record, uncachable_relationships_to_serialize, fieldset, includes_list, params)) if uncachable_relationships_to_serialize.present?
|
80
|
+
else
|
81
|
+
record_hash = id_hash(id_from_record(record, params), record_type, true)
|
82
|
+
record_hash[:attributes] = attributes_hash(record, fieldset, params) if attributes_to_serialize.present?
|
83
|
+
record_hash[:relationships] = relationships_hash(record, nil, fieldset, includes_list, params) if relationships_to_serialize.present?
|
84
|
+
record_hash[:links] = links_hash(record, params) if data_links.present?
|
85
|
+
end
|
86
|
+
|
87
|
+
record_hash[:meta] = meta_hash(record, params) if meta_to_serialize.present?
|
88
|
+
record_hash
|
89
|
+
end
|
90
|
+
|
91
|
+
# Cache options helper. Use it to adapt cache keys/rules.
|
92
|
+
#
|
93
|
+
# If a fieldset is specified, it modifies the namespace to include the
|
94
|
+
# fields from the fieldset.
|
95
|
+
#
|
96
|
+
# @param options [Hash] default cache options
|
97
|
+
# @param fieldset [Array, nil] passed fieldset values
|
98
|
+
# @param includes_list [Array, nil] passed included values
|
99
|
+
# @param params [Hash] the serializer params
|
100
|
+
#
|
101
|
+
# @return [Hash] processed options hash
|
102
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
103
|
+
def record_cache_options(options, fieldset, includes_list, params)
|
104
|
+
return options unless fieldset
|
105
|
+
|
106
|
+
options = options ? options.dup : {}
|
107
|
+
options[:namespace] ||= 'ruby_jsonapi'
|
108
|
+
|
109
|
+
fieldset_key = fieldset.join('_')
|
110
|
+
|
111
|
+
# Use a fixed-length fieldset key if the current length is more than
|
112
|
+
# the length of a SHA1 digest
|
113
|
+
if fieldset_key.length > 40
|
114
|
+
fieldset_key = Digest::SHA1.hexdigest(fieldset_key)
|
115
|
+
end
|
116
|
+
|
117
|
+
options[:namespace] = "#{options[:namespace]}-fieldset:#{fieldset_key}"
|
118
|
+
options
|
119
|
+
end
|
120
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
121
|
+
|
122
|
+
def id_from_record(record, params)
|
123
|
+
return FastJsonapi.call_proc(record_id, record, params) if record_id.is_a?(Proc)
|
124
|
+
return record.send(record_id) if record_id
|
125
|
+
raise MandatoryField, 'id is a mandatory field in the jsonapi spec' unless record.respond_to?(:id)
|
126
|
+
|
127
|
+
record.id
|
128
|
+
end
|
129
|
+
|
130
|
+
# It chops out the root association (first part) from each include.
|
131
|
+
#
|
132
|
+
# It keeps an unique list and collects all of the rest of the include
|
133
|
+
# value to hand it off to the next related to include serializer.
|
134
|
+
#
|
135
|
+
# This method will turn that include array into a Hash that looks like:
|
136
|
+
#
|
137
|
+
# {
|
138
|
+
# authors: Set.new([
|
139
|
+
# 'books',
|
140
|
+
# 'books.genre',
|
141
|
+
# 'books.genre.books',
|
142
|
+
# 'books.genre.books.authors',
|
143
|
+
# 'books.genre.books.genre'
|
144
|
+
# ]),
|
145
|
+
# genre: Set.new(['books'])
|
146
|
+
# }
|
147
|
+
#
|
148
|
+
# Because the serializer only cares about the root associations
|
149
|
+
# included, it only needs the first segment of each include
|
150
|
+
# (for books, it's the "authors" and "genre") and it doesn't need to
|
151
|
+
# waste cycles parsing the rest of the include value. That will be done
|
152
|
+
# by the next serializer in line.
|
153
|
+
#
|
154
|
+
# @param includes_list [List] to be parsed
|
155
|
+
# @return [Hash]
|
156
|
+
def parse_includes_list(includes_list)
|
157
|
+
includes_list.each_with_object({}) do |include_item, include_sets|
|
158
|
+
include_base, include_remainder = include_item.to_s.split('.', 2)
|
159
|
+
include_sets[include_base.to_sym] ||= Set.new
|
160
|
+
include_sets[include_base.to_sym] << include_remainder if include_remainder
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# includes handler
|
165
|
+
def get_included_records(record, includes_list, known_included_objects, fieldsets, params = {})
|
166
|
+
return unless includes_list.present?
|
167
|
+
return [] unless relationships_to_serialize
|
168
|
+
|
169
|
+
includes_list = parse_includes_list(includes_list)
|
170
|
+
|
171
|
+
includes_list.each_with_object([]) do |include_item, included_records|
|
172
|
+
relationship_item = relationships_to_serialize[include_item.first]
|
173
|
+
|
174
|
+
next unless relationship_item&.include_relationship?(record, params)
|
175
|
+
|
176
|
+
included_objects = Array(relationship_item.fetch_associated_object(record, params))
|
177
|
+
next if included_objects.empty?
|
178
|
+
|
179
|
+
static_serializer = relationship_item.static_serializer
|
180
|
+
static_record_type = relationship_item.static_record_type
|
181
|
+
|
182
|
+
included_objects.each do |inc_obj|
|
183
|
+
serializer = static_serializer || relationship_item.serializer_for(inc_obj, params)
|
184
|
+
record_type = static_record_type || serializer.record_type
|
185
|
+
|
186
|
+
if include_item.last.any?
|
187
|
+
serializer_records = serializer.get_included_records(inc_obj, include_item.last, known_included_objects, fieldsets, params)
|
188
|
+
included_records.concat(serializer_records) unless serializer_records.empty?
|
189
|
+
end
|
190
|
+
|
191
|
+
code = "#{record_type}_#{serializer.id_from_record(inc_obj, params)}"
|
192
|
+
next if known_included_objects.include?(code)
|
193
|
+
|
194
|
+
known_included_objects << code
|
195
|
+
|
196
|
+
included_records << serializer.record_hash(inc_obj, fieldsets[record_type], includes_list, params)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
data/lib/fast_jsonapi.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jsonapi/serializer/errors'
|
4
|
+
|
5
|
+
module FastJsonapi
|
6
|
+
require 'fast_jsonapi/object_serializer'
|
7
|
+
if defined?(::Rails)
|
8
|
+
require 'fast_jsonapi/railtie'
|
9
|
+
elsif defined?(::ActiveRecord)
|
10
|
+
require 'extensions/has_one'
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/base'
|
4
|
+
|
5
|
+
class SerializerGenerator < Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
|
+
|
8
|
+
argument :attributes, type: :array, default: [], banner: 'field field'
|
9
|
+
|
10
|
+
def create_serializer_file
|
11
|
+
template 'serializer.rb.tt', File.join('app', 'serializers', class_path, "#{file_name}_serializer.rb")
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def attributes_names
|
17
|
+
attributes.map { |a| a.name.to_sym.inspect }
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JSONAPI
|
4
|
+
module Serializer
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
7
|
+
class UnsupportedIncludeError < Error
|
8
|
+
attr_reader :include_item, :klass
|
9
|
+
|
10
|
+
def initialize(include_item, klass)
|
11
|
+
super()
|
12
|
+
@include_item = include_item
|
13
|
+
@klass = klass
|
14
|
+
end
|
15
|
+
|
16
|
+
def message
|
17
|
+
"#{include_item} is not specified as a relationship on #{klass}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/notifications'
|
3
|
+
|
4
|
+
module JSONAPI
|
5
|
+
module Serializer
|
6
|
+
# Support for instrumentation
|
7
|
+
module Instrumentation
|
8
|
+
# Performance instrumentation namespace
|
9
|
+
NOTIFICATION_NAMESPACE = 'render.ruby_jsonapi.'.freeze
|
10
|
+
|
11
|
+
# Patch methods to use instrumentation...
|
12
|
+
%w[
|
13
|
+
serializable_hash
|
14
|
+
get_included_records
|
15
|
+
relationships_hash
|
16
|
+
].each do |method_name|
|
17
|
+
define_method(method_name) do |*args|
|
18
|
+
ActiveSupport::Notifications.instrument(
|
19
|
+
NOTIFICATION_NAMESPACE + method_name,
|
20
|
+
{ name: self.class.name, serializer: self.class }
|
21
|
+
) do
|
22
|
+
super(*args)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,257 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby_jsonapi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- JSON:API Serializer Community
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2025-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ffaker
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: jsonapi-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.0.5
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.0.5
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-performance
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rubocop-rspec
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sqlite3
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
description: Fast, enhanced, and compliant Ruby implementation of the JSON:API specification,
|
196
|
+
evolving from jsonapi-serializer/jsonapi-serializer (originally Netflix/fast_jsonapi)
|
197
|
+
with enhanced features beyond serialization.
|
198
|
+
email: ''
|
199
|
+
executables: []
|
200
|
+
extensions: []
|
201
|
+
extra_rdoc_files:
|
202
|
+
- LICENSE.txt
|
203
|
+
- README.md
|
204
|
+
files:
|
205
|
+
- LICENSE.txt
|
206
|
+
- README.md
|
207
|
+
- lib/extensions/has_one.rb
|
208
|
+
- lib/fast_jsonapi.rb
|
209
|
+
- lib/fast_jsonapi/attribute.rb
|
210
|
+
- lib/fast_jsonapi/helpers.rb
|
211
|
+
- lib/fast_jsonapi/instrumentation.rb
|
212
|
+
- lib/fast_jsonapi/instrumentation/skylight.rb
|
213
|
+
- lib/fast_jsonapi/link.rb
|
214
|
+
- lib/fast_jsonapi/object_serializer.rb
|
215
|
+
- lib/fast_jsonapi/railtie.rb
|
216
|
+
- lib/fast_jsonapi/relationship.rb
|
217
|
+
- lib/fast_jsonapi/scalar.rb
|
218
|
+
- lib/fast_jsonapi/serialization_core.rb
|
219
|
+
- lib/fast_jsonapi/version.rb
|
220
|
+
- lib/generators/serializer/USAGE
|
221
|
+
- lib/generators/serializer/serializer_generator.rb
|
222
|
+
- lib/generators/serializer/templates/serializer.rb.tt
|
223
|
+
- lib/jsonapi/serializer.rb
|
224
|
+
- lib/jsonapi/serializer/errors.rb
|
225
|
+
- lib/jsonapi/serializer/instrumentation.rb
|
226
|
+
- lib/jsonapi/serializer/version.rb
|
227
|
+
homepage: https://github.com/fkiene/ruby_jsonapi
|
228
|
+
licenses:
|
229
|
+
- Apache-2.0
|
230
|
+
metadata:
|
231
|
+
homepage_uri: https://github.com/fkiene/ruby_jsonapi
|
232
|
+
bug_tracker_uri: https://github.com/fkiene/ruby_jsonapi/issues
|
233
|
+
documentation_uri: https://fkiene.github.io/ruby_jsonapi/
|
234
|
+
changelog_uri: https://github.com/fkiene/ruby_jsonapi/blob/main/CHANGELOG.md
|
235
|
+
source_code_uri: https://github.com/fkiene/ruby_jsonapi
|
236
|
+
rubygems_mfa_required: 'true'
|
237
|
+
github_repo: https://github.com/fkiene/ruby_jsonapi
|
238
|
+
post_install_message:
|
239
|
+
rdoc_options: []
|
240
|
+
require_paths:
|
241
|
+
- lib
|
242
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
243
|
+
requirements:
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: '0'
|
247
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
248
|
+
requirements:
|
249
|
+
- - ">="
|
250
|
+
- !ruby/object:Gem::Version
|
251
|
+
version: '0'
|
252
|
+
requirements: []
|
253
|
+
rubygems_version: 3.4.21
|
254
|
+
signing_key:
|
255
|
+
specification_version: 4
|
256
|
+
summary: Fast, enhanced, and compliant Ruby implementation of the JSON:API specification
|
257
|
+
test_files: []
|