jsonapi_compliable 0.11.34 → 1.0.alpha.2
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/.ruby-version +1 -1
- data/.travis.yml +1 -2
- data/Rakefile +7 -3
- data/jsonapi_compliable.gemspec +7 -3
- data/lib/generators/jsonapi/resource_generator.rb +8 -79
- data/lib/generators/jsonapi/templates/application_resource.rb.erb +2 -1
- data/lib/generators/jsonapi/templates/controller.rb.erb +19 -64
- data/lib/generators/jsonapi/templates/resource.rb.erb +5 -47
- data/lib/generators/jsonapi/templates/resource_reads_spec.rb.erb +62 -0
- data/lib/generators/jsonapi/templates/resource_writes_spec.rb.erb +63 -0
- data/lib/jsonapi_compliable.rb +87 -18
- data/lib/jsonapi_compliable/adapters/abstract.rb +202 -45
- data/lib/jsonapi_compliable/adapters/active_record.rb +6 -130
- data/lib/jsonapi_compliable/adapters/active_record/base.rb +247 -0
- data/lib/jsonapi_compliable/adapters/active_record/belongs_to_sideload.rb +17 -0
- data/lib/jsonapi_compliable/adapters/active_record/has_many_sideload.rb +17 -0
- data/lib/jsonapi_compliable/adapters/active_record/has_one_sideload.rb +17 -0
- data/lib/jsonapi_compliable/adapters/active_record/inferrence.rb +12 -0
- data/lib/jsonapi_compliable/adapters/active_record/many_to_many_sideload.rb +30 -0
- data/lib/jsonapi_compliable/adapters/null.rb +177 -6
- data/lib/jsonapi_compliable/base.rb +33 -320
- data/lib/jsonapi_compliable/context.rb +16 -0
- data/lib/jsonapi_compliable/deserializer.rb +14 -39
- data/lib/jsonapi_compliable/errors.rb +227 -24
- data/lib/jsonapi_compliable/extensions/extra_attribute.rb +3 -1
- data/lib/jsonapi_compliable/filter_operators.rb +25 -0
- data/lib/jsonapi_compliable/hash_renderer.rb +57 -0
- data/lib/jsonapi_compliable/query.rb +190 -202
- data/lib/jsonapi_compliable/rails.rb +12 -6
- data/lib/jsonapi_compliable/railtie.rb +64 -0
- data/lib/jsonapi_compliable/renderer.rb +60 -0
- data/lib/jsonapi_compliable/resource.rb +35 -663
- data/lib/jsonapi_compliable/resource/configuration.rb +239 -0
- data/lib/jsonapi_compliable/resource/dsl.rb +138 -0
- data/lib/jsonapi_compliable/resource/interface.rb +32 -0
- data/lib/jsonapi_compliable/resource/polymorphism.rb +68 -0
- data/lib/jsonapi_compliable/resource/sideloading.rb +102 -0
- data/lib/jsonapi_compliable/resource_proxy.rb +127 -0
- data/lib/jsonapi_compliable/responders.rb +19 -0
- data/lib/jsonapi_compliable/runner.rb +25 -0
- data/lib/jsonapi_compliable/scope.rb +37 -79
- data/lib/jsonapi_compliable/scoping/extra_attributes.rb +29 -0
- data/lib/jsonapi_compliable/scoping/filter.rb +39 -58
- data/lib/jsonapi_compliable/scoping/filterable.rb +9 -14
- data/lib/jsonapi_compliable/scoping/paginate.rb +9 -3
- data/lib/jsonapi_compliable/scoping/sort.rb +16 -4
- data/lib/jsonapi_compliable/sideload.rb +221 -347
- data/lib/jsonapi_compliable/sideload/belongs_to.rb +34 -0
- data/lib/jsonapi_compliable/sideload/has_many.rb +16 -0
- data/lib/jsonapi_compliable/sideload/has_one.rb +9 -0
- data/lib/jsonapi_compliable/sideload/many_to_many.rb +24 -0
- data/lib/jsonapi_compliable/sideload/polymorphic_belongs_to.rb +108 -0
- data/lib/jsonapi_compliable/stats/payload.rb +4 -8
- data/lib/jsonapi_compliable/types.rb +172 -0
- data/lib/jsonapi_compliable/util/attribute_check.rb +88 -0
- data/lib/jsonapi_compliable/util/persistence.rb +29 -7
- data/lib/jsonapi_compliable/util/relationship_payload.rb +4 -4
- data/lib/jsonapi_compliable/util/render_options.rb +4 -32
- data/lib/jsonapi_compliable/util/serializer_attributes.rb +98 -0
- data/lib/jsonapi_compliable/util/validation_response.rb +15 -9
- data/lib/jsonapi_compliable/version.rb +1 -1
- metadata +105 -24
- data/lib/generators/jsonapi/field_generator.rb +0 -0
- data/lib/generators/jsonapi/templates/create_request_spec.rb.erb +0 -29
- data/lib/generators/jsonapi/templates/destroy_request_spec.rb.erb +0 -20
- data/lib/generators/jsonapi/templates/index_request_spec.rb.erb +0 -22
- data/lib/generators/jsonapi/templates/payload.rb.erb +0 -39
- data/lib/generators/jsonapi/templates/serializer.rb.erb +0 -25
- data/lib/generators/jsonapi/templates/show_request_spec.rb.erb +0 -19
- data/lib/generators/jsonapi/templates/update_request_spec.rb.erb +0 -33
- data/lib/jsonapi_compliable/adapters/active_record_sideloading.rb +0 -152
- data/lib/jsonapi_compliable/scoping/extra_fields.rb +0 -58
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe <%= resource_klass %>, type: :resource do
|
4
|
+
describe 'creating' do
|
5
|
+
let(:payload) do
|
6
|
+
{
|
7
|
+
data: {
|
8
|
+
type: '<%= file_name.pluralize %>',
|
9
|
+
attributes: { }
|
10
|
+
}
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:instance) do
|
15
|
+
<%= resource_klass %>.build(payload)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'works' do
|
19
|
+
expect {
|
20
|
+
expect(instance.save).to eq(true)
|
21
|
+
}.to change { <%= model_klass %>.count }.by(1)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'updating' do
|
26
|
+
let!(:<%= file_name %>) { create(:<%= file_name %>) }
|
27
|
+
|
28
|
+
let(:payload) do
|
29
|
+
{
|
30
|
+
data: {
|
31
|
+
id: <%= file_name %>.id.to_s,
|
32
|
+
type: '<%= file_name.pluralize %>',
|
33
|
+
attributes: { } # Todo!
|
34
|
+
}
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:instance) do
|
39
|
+
<%= resource_klass %>.find(payload)
|
40
|
+
end
|
41
|
+
|
42
|
+
xit 'works (add some attributes and enable this spec)' do
|
43
|
+
expect {
|
44
|
+
expect(instance.update_attributes).to eq(true)
|
45
|
+
}.to change { <%= file_name %>.reload.updated_at }
|
46
|
+
# and change { instance.foo }.to('bar') <- example
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'destroying' do
|
51
|
+
let!(:<%= file_name %>) { create(:<%= file_name %>) }
|
52
|
+
|
53
|
+
let(:instance) do
|
54
|
+
<%= resource_klass %>.find(id: <%= file_name %>.id)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'works' do
|
58
|
+
expect {
|
59
|
+
expect(instance.destroy).to eq(true)
|
60
|
+
}.to change { <%= model_klass %>.count }.by(-1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/jsonapi_compliable.rb
CHANGED
@@ -1,20 +1,88 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'active_support/core_ext/string'
|
4
|
+
require 'active_support/core_ext/class/attribute'
|
5
|
+
require 'active_support/core_ext/hash/conversions' # to_xml
|
6
|
+
require 'active_support/concern'
|
7
|
+
require 'active_support/time'
|
8
|
+
|
9
|
+
require 'dry-types'
|
10
|
+
require 'jsonapi_errorable'
|
11
|
+
|
12
|
+
require 'jsonapi/serializable'
|
13
|
+
# Temporary fix until fixed upstream
|
14
|
+
# https://github.com/jsonapi-rb/jsonapi-serializable/pull/102
|
15
|
+
JSONAPI::Serializable::Resource.class_eval do
|
16
|
+
def requested_relationships(fields)
|
17
|
+
@_relationships
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# This library looks up a serializer based on the record's class name
|
22
|
+
# This wouldn't work for us, since a model may be associated with
|
23
|
+
# multiple resources.
|
24
|
+
# Instead, this variable is assigned when the query is resolved
|
25
|
+
# To ensure we always render with the *resource* serializer
|
26
|
+
JSONAPI::Serializable::Renderer.class_eval do
|
27
|
+
def _build(object, exposures, klass)
|
28
|
+
klass = object.instance_variable_get(:@__serializer_klass)
|
29
|
+
klass.new(exposures.merge(object: object))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# See above comment
|
34
|
+
JSONAPI::Serializable::Relationship.class_eval do
|
35
|
+
def data
|
36
|
+
@_resources_block = proc do
|
37
|
+
resources = yield
|
38
|
+
if resources.nil?
|
39
|
+
nil
|
40
|
+
elsif resources.respond_to?(:to_ary)
|
41
|
+
Array(resources).map do |obj|
|
42
|
+
klass = obj.instance_variable_get(:@__serializer_klass)
|
43
|
+
klass.new(@_exposures.merge(object: obj))
|
44
|
+
end
|
45
|
+
else
|
46
|
+
klass = resources.instance_variable_get(:@__serializer_klass)
|
47
|
+
klass.new(@_exposures.merge(object: resources))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
1
53
|
require "jsonapi_compliable/version"
|
2
54
|
require "jsonapi_compliable/configuration"
|
55
|
+
require "jsonapi_compliable/context"
|
3
56
|
require "jsonapi_compliable/errors"
|
57
|
+
require "jsonapi_compliable/types"
|
58
|
+
require "jsonapi_compliable/adapters/abstract"
|
59
|
+
require "jsonapi_compliable/resource/sideloading"
|
60
|
+
require "jsonapi_compliable/resource/configuration"
|
61
|
+
require "jsonapi_compliable/resource/dsl"
|
62
|
+
require "jsonapi_compliable/resource/interface"
|
63
|
+
require "jsonapi_compliable/resource/polymorphism"
|
64
|
+
require "jsonapi_compliable/sideload"
|
65
|
+
require "jsonapi_compliable/sideload/has_many"
|
66
|
+
require "jsonapi_compliable/sideload/belongs_to"
|
67
|
+
require "jsonapi_compliable/sideload/has_one"
|
68
|
+
require "jsonapi_compliable/sideload/many_to_many"
|
69
|
+
require "jsonapi_compliable/sideload/polymorphic_belongs_to"
|
4
70
|
require "jsonapi_compliable/resource"
|
71
|
+
require "jsonapi_compliable/resource_proxy"
|
5
72
|
require "jsonapi_compliable/query"
|
6
|
-
require "jsonapi_compliable/sideload"
|
7
73
|
require "jsonapi_compliable/scope"
|
8
74
|
require "jsonapi_compliable/deserializer"
|
75
|
+
require "jsonapi_compliable/renderer"
|
76
|
+
require "jsonapi_compliable/hash_renderer"
|
77
|
+
require "jsonapi_compliable/filter_operators"
|
9
78
|
require "jsonapi_compliable/scoping/base"
|
10
79
|
require "jsonapi_compliable/scoping/sort"
|
11
80
|
require "jsonapi_compliable/scoping/paginate"
|
12
|
-
require "jsonapi_compliable/scoping/
|
81
|
+
require "jsonapi_compliable/scoping/extra_attributes"
|
13
82
|
require "jsonapi_compliable/scoping/filterable"
|
14
83
|
require "jsonapi_compliable/scoping/default_filter"
|
15
84
|
require "jsonapi_compliable/scoping/filter"
|
16
85
|
require "jsonapi_compliable/util/render_options"
|
17
|
-
require "jsonapi_compliable/adapters/abstract"
|
18
86
|
require "jsonapi_compliable/stats/dsl"
|
19
87
|
require "jsonapi_compliable/stats/payload"
|
20
88
|
require "jsonapi_compliable/util/include_params"
|
@@ -25,26 +93,25 @@ require "jsonapi_compliable/util/persistence"
|
|
25
93
|
require "jsonapi_compliable/util/validation_response"
|
26
94
|
require "jsonapi_compliable/util/sideload"
|
27
95
|
require "jsonapi_compliable/util/hooks"
|
96
|
+
require "jsonapi_compliable/util/attribute_check"
|
97
|
+
require "jsonapi_compliable/util/serializer_attributes"
|
28
98
|
|
29
|
-
|
30
|
-
if defined?(Rails)
|
31
|
-
require 'jsonapi_compliable/rails'
|
32
|
-
else
|
33
|
-
require 'jsonapi/serializable'
|
34
|
-
end
|
35
|
-
|
36
|
-
# Temporary fix until fixed upstream
|
37
|
-
# https://github.com/jsonapi-rb/jsonapi-serializable/pull/102
|
38
|
-
JSONAPI::Serializable::Resource.class_eval do
|
39
|
-
def requested_relationships(fields)
|
40
|
-
@_relationships
|
41
|
-
end
|
42
|
-
end
|
99
|
+
require 'jsonapi_compliable/adapters/null'
|
43
100
|
|
44
101
|
require "jsonapi_compliable/extensions/extra_attribute"
|
45
102
|
require "jsonapi_compliable/extensions/boolean_attribute"
|
46
103
|
require "jsonapi_compliable/extensions/temp_id"
|
47
104
|
|
105
|
+
if defined?(ActiveRecord)
|
106
|
+
require 'jsonapi_compliable/adapters/active_record'
|
107
|
+
end
|
108
|
+
|
109
|
+
if defined?(Rails)
|
110
|
+
require 'jsonapi_compliable/railtie'
|
111
|
+
require 'jsonapi_compliable/rails'
|
112
|
+
require 'jsonapi_compliable/responders'
|
113
|
+
end
|
114
|
+
|
48
115
|
module JsonapiCompliable
|
49
116
|
autoload :Base, 'jsonapi_compliable/base'
|
50
117
|
|
@@ -65,7 +132,7 @@ module JsonapiCompliable
|
|
65
132
|
end
|
66
133
|
|
67
134
|
# @api private
|
68
|
-
def self.with_context(obj, namespace)
|
135
|
+
def self.with_context(obj, namespace = nil)
|
69
136
|
begin
|
70
137
|
prior = self.context
|
71
138
|
self.context = { object: obj, namespace: namespace }
|
@@ -89,3 +156,5 @@ module JsonapiCompliable
|
|
89
156
|
yield config
|
90
157
|
end
|
91
158
|
end
|
159
|
+
|
160
|
+
require "jsonapi_compliable/runner"
|
@@ -76,17 +76,184 @@ module JsonapiCompliable
|
|
76
76
|
# @see Adapters::ActiveRecordSideloading
|
77
77
|
# @see Adapters::Null
|
78
78
|
class Abstract
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
79
|
+
def filter_string_eq(scope, attribute, value)
|
80
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_eq)
|
81
|
+
end
|
82
|
+
|
83
|
+
def filter_string_eql(scope, attribute, value)
|
84
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_eql)
|
85
|
+
end
|
86
|
+
|
87
|
+
def filter_string_not_eq(scope, attribute, value)
|
88
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_not_eq)
|
89
|
+
end
|
90
|
+
|
91
|
+
def filter_string_not_eql(scope, attribute, value)
|
92
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_not_eql)
|
93
|
+
end
|
94
|
+
|
95
|
+
def filter_string_prefix(scope, attribute, value)
|
96
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_prefix)
|
97
|
+
end
|
98
|
+
|
99
|
+
def filter_string_not_prefix(scope, attribute, value)
|
100
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_not_prefix)
|
101
|
+
end
|
102
|
+
|
103
|
+
def filter_string_suffix(scope, attribute, value)
|
104
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_suffix)
|
105
|
+
end
|
106
|
+
|
107
|
+
def filter_string_not_suffix(scope, attribute, value)
|
108
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_not_suffix)
|
109
|
+
end
|
110
|
+
|
111
|
+
def filter_string_like(scope, attribute, value)
|
112
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_like)
|
113
|
+
end
|
114
|
+
|
115
|
+
def filter_string_not_like(scope, attribute, value)
|
116
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_string_not_like)
|
117
|
+
end
|
118
|
+
|
119
|
+
def filter_integer_eq(scope, attribute, value)
|
120
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_integer_eq)
|
121
|
+
end
|
122
|
+
|
123
|
+
def filter_integer_not_eq(scope, attribute, value)
|
124
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_integer_not_eq)
|
125
|
+
end
|
126
|
+
|
127
|
+
def filter_integer_gt(scope, attribute, value)
|
128
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_integer_gt)
|
129
|
+
end
|
130
|
+
|
131
|
+
def filter_integer_gte(scope, attribute, value)
|
132
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_integer_gte)
|
133
|
+
end
|
134
|
+
|
135
|
+
def filter_integer_lt(scope, attribute, value)
|
136
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_integer_lt)
|
137
|
+
end
|
138
|
+
|
139
|
+
def filter_integer_lte(scope, attribute, value)
|
140
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_integer_lte)
|
141
|
+
end
|
142
|
+
|
143
|
+
def filter_datetime_eq(scope, attribute, value)
|
144
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_eq)
|
145
|
+
end
|
146
|
+
|
147
|
+
def filter_datetime_not_eq(scope, attribute, value)
|
148
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_not_eq)
|
149
|
+
end
|
150
|
+
|
151
|
+
def filter_datetime_lte(scope, attribute, value)
|
152
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_lte)
|
153
|
+
end
|
154
|
+
|
155
|
+
def filter_float_eq(scope, attribute, value)
|
156
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_float_eq)
|
157
|
+
end
|
158
|
+
|
159
|
+
def filter_float_not_eq(scope, attribute, value)
|
160
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_float_not_eq)
|
161
|
+
end
|
162
|
+
|
163
|
+
def filter_float_gt(scope, attribute, value)
|
164
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_float_gt)
|
165
|
+
end
|
166
|
+
|
167
|
+
def filter_float_gte(scope, attribute, value)
|
168
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_float_gte)
|
169
|
+
end
|
170
|
+
|
171
|
+
def filter_float_lt(scope, attribute, value)
|
172
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_float_lt)
|
173
|
+
end
|
174
|
+
|
175
|
+
def filter_float_lte(scope, attribute, value)
|
176
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_float_lte)
|
177
|
+
end
|
178
|
+
|
179
|
+
def filter_decimal_eq(scope, attribute, value)
|
180
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_decimal_eq)
|
181
|
+
end
|
182
|
+
|
183
|
+
def filter_decimal_not_eq(scope, attribute, value)
|
184
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_decimal_not_eq)
|
185
|
+
end
|
186
|
+
|
187
|
+
def filter_decimal_gt(scope, attribute, value)
|
188
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_decimal_gt)
|
189
|
+
end
|
190
|
+
|
191
|
+
def filter_decimal_gte(scope, attribute, value)
|
192
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_decimal_gte)
|
193
|
+
end
|
194
|
+
|
195
|
+
def filter_decimal_lt(scope, attribute, value)
|
196
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_decimal_lt)
|
197
|
+
end
|
198
|
+
|
199
|
+
def filter_decimal_lte(scope, attribute, value)
|
200
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_decimal_lte)
|
201
|
+
end
|
202
|
+
|
203
|
+
def filter_datetime_eq(scope, attribute, value)
|
204
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_eq)
|
205
|
+
end
|
206
|
+
|
207
|
+
def filter_datetime_not_eq(scope, attribute, value)
|
208
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_not_eq)
|
209
|
+
end
|
210
|
+
|
211
|
+
def filter_datetime_gt(scope, attribute, value)
|
212
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_gt)
|
213
|
+
end
|
214
|
+
|
215
|
+
def filter_datetime_gte(scope, attribute, value)
|
216
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_gte)
|
217
|
+
end
|
218
|
+
|
219
|
+
def filter_datetime_lt(scope, attribute, value)
|
220
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_lt)
|
221
|
+
end
|
222
|
+
|
223
|
+
def filter_datetime_lte(scope, attribute, value)
|
224
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_datetime_lte)
|
225
|
+
end
|
226
|
+
|
227
|
+
def filter_date_eq(scope, attribute, value)
|
228
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_date_eq)
|
229
|
+
end
|
230
|
+
|
231
|
+
def filter_date_not_eq(scope, attribute, value)
|
232
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_date_not_eq)
|
233
|
+
end
|
234
|
+
|
235
|
+
def filter_date_gt(scope, attribute, value)
|
236
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_date_gt)
|
237
|
+
end
|
238
|
+
|
239
|
+
def filter_date_gte(scope, attribute, value)
|
240
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_date_gte)
|
241
|
+
end
|
242
|
+
|
243
|
+
def filter_date_lt(scope, attribute, value)
|
244
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_date_lt)
|
245
|
+
end
|
246
|
+
|
247
|
+
def filter_date_lte(scope, attribute, value)
|
248
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_date_lte)
|
249
|
+
end
|
250
|
+
|
251
|
+
def filter_boolean_eq(scope, attribute, value)
|
252
|
+
raise Errors::AdapterNotImplemented.new(self, attribute, :filter_boolean_eq)
|
253
|
+
end
|
254
|
+
|
255
|
+
def base_scope(model)
|
256
|
+
raise 'you must override #base_scope in an adapter subclass'
|
90
257
|
end
|
91
258
|
|
92
259
|
# @param scope The scope object we are chaining
|
@@ -211,30 +378,19 @@ module JsonapiCompliable
|
|
211
378
|
scope
|
212
379
|
end
|
213
380
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
#
|
221
|
-
# child.send(:"#{association_name}=", parent)
|
222
|
-
# end
|
223
|
-
# end
|
224
|
-
#
|
225
|
-
# +association_name+ and +association_type+ come from your sideload
|
226
|
-
# configuration:
|
227
|
-
#
|
228
|
-
# allow_sideload :the_name, type: the_type do
|
229
|
-
# # ... code.
|
230
|
-
# end
|
231
|
-
#
|
232
|
-
# @param parent The parent object (via the JSONAPI 'relationships' graph)
|
233
|
-
# @param child The child object (via the JSONAPI 'relationships' graph)
|
234
|
-
# @param association_name The 'relationships' key we are processing
|
235
|
-
# @param association_type The Sideload type (see Sideload#type). Usually :has_many/:belongs_to/etc
|
381
|
+
def associate_all(parent, children, association_name, association_type)
|
382
|
+
children.each do |c|
|
383
|
+
associate(parent, c, association_name, association_type)
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
# Probably want to override
|
236
388
|
def associate(parent, child, association_name, association_type)
|
237
|
-
|
389
|
+
if [:has_many, :many_to_many].include?(association_type)
|
390
|
+
parent.send(:"#{association_name}") << child
|
391
|
+
else
|
392
|
+
parent.send(:"#{association_name}=", child)
|
393
|
+
end
|
238
394
|
end
|
239
395
|
|
240
396
|
# Remove the association without destroying objects
|
@@ -277,17 +433,18 @@ module JsonapiCompliable
|
|
277
433
|
raise 'you must override #disassociate in an adapter subclass'
|
278
434
|
end
|
279
435
|
|
280
|
-
#
|
281
|
-
#
|
282
|
-
#
|
283
|
-
#
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
436
|
+
# You want to override this!
|
437
|
+
# Map of association_type => sideload_class
|
438
|
+
# e.g.
|
439
|
+
# { has_many: Adapters::ActiveRecord::HasManySideload }
|
440
|
+
def sideloading_classes
|
441
|
+
{
|
442
|
+
has_many: ::JsonapiCompliable::Sideload::HasMany,
|
443
|
+
belongs_to: ::JsonapiCompliable::Sideload::BelongsTo,
|
444
|
+
has_one: ::JsonapiCompliable::Sideload::HasOne,
|
445
|
+
many_to_many: ::JsonapiCompliable::Sideload::ManyToMany,
|
446
|
+
polymorphic_belongs_to: ::JsonapiCompliable::Sideload::PolymorphicBelongsTo
|
447
|
+
}
|
291
448
|
end
|
292
449
|
|
293
450
|
# @param [Class] model_class The configured model class (see Resource.model)
|