jsonapi-resources 0.9.0 → 0.9.1.beta1
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 +4 -4
- data/lib/jsonapi/exceptions.rb +10 -13
- data/lib/jsonapi/include_directives.rb +1 -1
- data/lib/jsonapi/processor.rb +4 -3
- data/lib/jsonapi/relationship_builder.rb +2 -4
- data/lib/jsonapi/request_parser.rb +45 -37
- data/lib/jsonapi/resource.rb +10 -4
- data/lib/jsonapi/resources/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31f232713ef6f5199ccbc94bccf4a0135fc287ae
|
4
|
+
data.tar.gz: bb5a0238e1b0027b4224eda64624b10e8e71cd6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efb1ad213d3b6d67cf5d25c86a84a5cfa393fb7a4c69e6ad3249010bf21aae1b78941f575c4ee27a5fff2edb110edf43ebbcc8b65def43351a15b26f31cac23c
|
7
|
+
data.tar.gz: 1eef8ebb63b4bb177d327dc92a139fcc61728ff8955096af8e842341154bb5788ce09b7cedd484ee5b9f83a4a2316225f091034821770cf6261c590a2dc97d17
|
data/lib/jsonapi/exceptions.rb
CHANGED
@@ -364,24 +364,21 @@ module JSONAPI
|
|
364
364
|
end
|
365
365
|
end
|
366
366
|
|
367
|
-
class
|
368
|
-
attr_accessor :
|
367
|
+
class ParameterNotAllowed < Error
|
368
|
+
attr_accessor :param
|
369
369
|
|
370
|
-
def initialize(
|
371
|
-
@
|
370
|
+
def initialize(param, error_object_overrides = {})
|
371
|
+
@param = param
|
372
372
|
super(error_object_overrides)
|
373
373
|
end
|
374
374
|
|
375
375
|
def errors
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
default: "#{param} is not allowed.", param: param))
|
383
|
-
|
384
|
-
end
|
376
|
+
[create_error_object(code: JSONAPI::PARAM_NOT_ALLOWED,
|
377
|
+
status: :bad_request,
|
378
|
+
title: I18n.translate('jsonapi-resources.exceptions.parameter_not_allowed.title',
|
379
|
+
default: 'Param not allowed'),
|
380
|
+
detail: I18n.translate('jsonapi-resources.exceptions.parameter_not_allowed.detail',
|
381
|
+
default: "#{param} is not allowed.", param: param))]
|
385
382
|
end
|
386
383
|
end
|
387
384
|
|
@@ -52,7 +52,7 @@ module JSONAPI
|
|
52
52
|
current_relationship = current_resource_klass._relationships[fragment]
|
53
53
|
current_resource_klass = current_relationship.try(:resource_klass)
|
54
54
|
else
|
55
|
-
|
55
|
+
raise JSONAPI::Exceptions::InvalidInclude.new(current_resource_klass, current_path)
|
56
56
|
end
|
57
57
|
|
58
58
|
include_in_join = @force_eager_load || !current_relationship || current_relationship.eager_load_on_include
|
data/lib/jsonapi/processor.rb
CHANGED
@@ -100,7 +100,7 @@ module JSONAPI
|
|
100
100
|
end
|
101
101
|
|
102
102
|
if JSONAPI.configuration.top_level_links_include_pagination && paginator
|
103
|
-
page_options[:pagination_params] = paginator.links_page_params(page_options)
|
103
|
+
page_options[:pagination_params] = paginator.links_page_params(page_options.merge(fetched_resources: resource_records))
|
104
104
|
end
|
105
105
|
|
106
106
|
return JSONAPI::ResourcesOperationResult.new(:ok, resource_records, page_options)
|
@@ -166,9 +166,10 @@ module JSONAPI
|
|
166
166
|
include_directives = params[:include_directives]
|
167
167
|
|
168
168
|
source_resource ||= source_klass.find_by_key(source_id, context: context, fields: fields)
|
169
|
+
verified_filters = resource_klass.verify_filters(filters, context)
|
169
170
|
|
170
171
|
rel_opts = {
|
171
|
-
filters:
|
172
|
+
filters: verified_filters,
|
172
173
|
sort_criteria: sort_criteria,
|
173
174
|
paginator: paginator,
|
174
175
|
fields: fields,
|
@@ -209,7 +210,7 @@ module JSONAPI
|
|
209
210
|
pagination_params = if paginator && JSONAPI.configuration.top_level_links_include_pagination
|
210
211
|
page_options = {}
|
211
212
|
page_options[:record_count] = record_count if paginator.class.requires_record_count
|
212
|
-
paginator.links_page_params(page_options)
|
213
|
+
paginator.links_page_params(page_options.merge(fetched_resources: related_resources))
|
213
214
|
else
|
214
215
|
{}
|
215
216
|
end
|
@@ -66,10 +66,8 @@ module JSONAPI
|
|
66
66
|
end
|
67
67
|
|
68
68
|
sort_criteria = options.fetch(:sort_criteria, {})
|
69
|
-
|
70
|
-
|
71
|
-
records = resource_klass.apply_sort(records, order_options, @context)
|
72
|
-
end
|
69
|
+
order_options = relationship.resource_klass.construct_order_options(sort_criteria)
|
70
|
+
records = resource_klass.apply_sort(records, order_options, @context)
|
73
71
|
|
74
72
|
paginator = options[:paginator]
|
75
73
|
if paginator
|
@@ -170,13 +170,11 @@ module JSONAPI
|
|
170
170
|
end
|
171
171
|
type_resource = Resource.resource_for(@resource_klass.module_path + underscored_type.to_s)
|
172
172
|
rescue NameError
|
173
|
-
|
174
|
-
rescue JSONAPI::Exceptions::InvalidResource => e
|
175
|
-
@errors.concat(e.errors)
|
173
|
+
fail JSONAPI::Exceptions::InvalidResource.new(type)
|
176
174
|
end
|
177
175
|
|
178
176
|
if type_resource.nil?
|
179
|
-
|
177
|
+
fail JSONAPI::Exceptions::InvalidResource.new(type)
|
180
178
|
else
|
181
179
|
unless values.nil?
|
182
180
|
valid_fields = type_resource.fields.collect { |key| format_key(key) }
|
@@ -184,11 +182,11 @@ module JSONAPI
|
|
184
182
|
if valid_fields.include?(field)
|
185
183
|
extracted_fields[type].push unformat_key(field)
|
186
184
|
else
|
187
|
-
|
185
|
+
fail JSONAPI::Exceptions::InvalidField.new(type, field)
|
188
186
|
end
|
189
187
|
end
|
190
188
|
else
|
191
|
-
|
189
|
+
fail JSONAPI::Exceptions::InvalidField.new(type, 'nil')
|
192
190
|
end
|
193
191
|
end
|
194
192
|
end
|
@@ -205,8 +203,7 @@ module JSONAPI
|
|
205
203
|
check_include(Resource.resource_for(resource_klass.module_path + relationship.class_name.to_s.underscore), include_parts.last.partition('.'))
|
206
204
|
end
|
207
205
|
else
|
208
|
-
|
209
|
-
include_parts.first).errors)
|
206
|
+
fail JSONAPI::Exceptions::InvalidInclude.new(format_key(resource_klass._type), include_parts.first)
|
210
207
|
end
|
211
208
|
end
|
212
209
|
|
@@ -214,7 +211,7 @@ module JSONAPI
|
|
214
211
|
return unless raw_include
|
215
212
|
|
216
213
|
unless JSONAPI.configuration.allow_include
|
217
|
-
fail JSONAPI::Exceptions::
|
214
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:include)
|
218
215
|
end
|
219
216
|
|
220
217
|
included_resources = []
|
@@ -226,19 +223,24 @@ module JSONAPI
|
|
226
223
|
|
227
224
|
return if included_resources.empty?
|
228
225
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
226
|
+
begin
|
227
|
+
result = included_resources.compact.map do |included_resource|
|
228
|
+
check_include(@resource_klass, included_resource.partition('.'))
|
229
|
+
unformat_key(included_resource).to_s
|
230
|
+
end
|
233
231
|
|
234
|
-
|
232
|
+
@include_directives = JSONAPI::IncludeDirectives.new(@resource_klass, result)
|
233
|
+
rescue JSONAPI::Exceptions::InvalidInclude => e
|
234
|
+
@errors.concat(e.errors)
|
235
|
+
@include_directives = {}
|
236
|
+
end
|
235
237
|
end
|
236
238
|
|
237
239
|
def parse_filters(filters)
|
238
240
|
return unless filters
|
239
241
|
|
240
242
|
unless JSONAPI.configuration.allow_filter
|
241
|
-
fail JSONAPI::Exceptions::
|
243
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:filter)
|
242
244
|
end
|
243
245
|
|
244
246
|
unless filters.class.method_defined?(:each)
|
@@ -251,7 +253,7 @@ module JSONAPI
|
|
251
253
|
if @resource_klass._allowed_filter?(filter)
|
252
254
|
@filters[filter] = value
|
253
255
|
else
|
254
|
-
|
256
|
+
fail JSONAPI::Exceptions::FilterNotAllowed.new(filter)
|
255
257
|
end
|
256
258
|
end
|
257
259
|
end
|
@@ -267,7 +269,7 @@ module JSONAPI
|
|
267
269
|
return unless sort_criteria.present?
|
268
270
|
|
269
271
|
unless JSONAPI.configuration.allow_sort
|
270
|
-
fail JSONAPI::Exceptions::
|
272
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:sort)
|
271
273
|
end
|
272
274
|
|
273
275
|
sorts = []
|
@@ -296,9 +298,8 @@ module JSONAPI
|
|
296
298
|
sort_field = sort_criteria[:field]
|
297
299
|
sortable_fields = resource_klass.sortable_fields(context)
|
298
300
|
|
299
|
-
unless sortable_fields.include?
|
300
|
-
|
301
|
-
.new(format_key(resource_klass._type), sort_field).errors)
|
301
|
+
unless sortable_fields.include?sort_field.to_sym
|
302
|
+
fail JSONAPI::Exceptions::InvalidSortCriteria.new(format_key(resource_klass._type), sort_field)
|
302
303
|
end
|
303
304
|
end
|
304
305
|
|
@@ -473,7 +474,7 @@ module JSONAPI
|
|
473
474
|
|
474
475
|
unless links_object[:id].nil?
|
475
476
|
resource = self.resource_klass || Resource
|
476
|
-
relationship_resource = resource.resource_for(unformat_key(links_object[:type]).to_s)
|
477
|
+
relationship_resource = resource.resource_for(unformat_key(relationship.options[:class_name] || links_object[:type]).to_s)
|
477
478
|
relationship_id = relationship_resource.verify_key(links_object[:id], @context)
|
478
479
|
if relationship.polymorphic?
|
479
480
|
{ id: relationship_id, type: unformat_key(links_object[:type].to_s) }
|
@@ -528,8 +529,10 @@ module JSONAPI
|
|
528
529
|
when 'relationships'
|
529
530
|
value.keys.each do |links_key|
|
530
531
|
unless formatted_allowed_fields.include?(links_key.to_sym)
|
531
|
-
|
532
|
-
|
532
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
533
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(links_key)
|
534
|
+
else
|
535
|
+
params_not_allowed.push(links_key)
|
533
536
|
value.delete links_key
|
534
537
|
end
|
535
538
|
end
|
@@ -537,8 +540,10 @@ module JSONAPI
|
|
537
540
|
when 'attributes'
|
538
541
|
value.each do |attr_key, attr_value|
|
539
542
|
unless formatted_allowed_fields.include?(attr_key.to_sym)
|
540
|
-
|
541
|
-
|
543
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
544
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(attr_key)
|
545
|
+
else
|
546
|
+
params_not_allowed.push(attr_key)
|
542
547
|
value.delete attr_key
|
543
548
|
end
|
544
549
|
end
|
@@ -546,27 +551,30 @@ module JSONAPI
|
|
546
551
|
when 'type'
|
547
552
|
when 'id'
|
548
553
|
unless formatted_allowed_fields.include?(:id)
|
549
|
-
|
550
|
-
|
554
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
555
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:id)
|
556
|
+
else
|
557
|
+
params_not_allowed.push(:id)
|
551
558
|
params.delete :id
|
552
559
|
end
|
553
560
|
end
|
554
561
|
else
|
555
|
-
|
562
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
563
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(key)
|
564
|
+
else
|
565
|
+
params_not_allowed.push(key)
|
566
|
+
params.delete key
|
567
|
+
end
|
556
568
|
end
|
557
569
|
end
|
558
570
|
|
559
571
|
if params_not_allowed.length > 0
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
JSONAPI::Warning.new(code: JSONAPI::PARAM_NOT_ALLOWED,
|
565
|
-
title: 'Param not allowed',
|
566
|
-
detail: "#{key} is not allowed.")
|
567
|
-
end
|
568
|
-
self.warnings.concat(params_not_allowed_warnings)
|
572
|
+
params_not_allowed_warnings = params_not_allowed.map do |param|
|
573
|
+
JSONAPI::Warning.new(code: JSONAPI::PARAM_NOT_ALLOWED,
|
574
|
+
title: 'Param not allowed',
|
575
|
+
detail: "#{param} is not allowed.")
|
569
576
|
end
|
577
|
+
self.warnings.concat(params_not_allowed_warnings)
|
570
578
|
end
|
571
579
|
end
|
572
580
|
|
data/lib/jsonapi/resource.rb
CHANGED
@@ -453,7 +453,7 @@ module JSONAPI
|
|
453
453
|
|
454
454
|
def resource_for(type)
|
455
455
|
type = type.underscore
|
456
|
-
type_with_module = type.
|
456
|
+
type_with_module = type.start_with?(module_path) ? type : module_path + type
|
457
457
|
|
458
458
|
resource_name = _resource_name_from_type(type_with_module)
|
459
459
|
resource = resource_name.safe_constantize if resource_name
|
@@ -507,10 +507,12 @@ module JSONAPI
|
|
507
507
|
end
|
508
508
|
end
|
509
509
|
|
510
|
-
def attribute(
|
510
|
+
def attribute(attribute_name, options = {})
|
511
|
+
attr = attribute_name.to_sym
|
512
|
+
|
511
513
|
check_reserved_attribute_name(attr)
|
512
514
|
|
513
|
-
if (attr
|
515
|
+
if (attr == :id) && (options[:format].nil?)
|
514
516
|
ActiveSupport::Deprecation.warn('Id without format is no longer supported. Please remove ids from attributes, or specify a format.')
|
515
517
|
end
|
516
518
|
|
@@ -808,6 +810,9 @@ module JSONAPI
|
|
808
810
|
|
809
811
|
def verify_filters(filters, context = nil)
|
810
812
|
verified_filters = {}
|
813
|
+
|
814
|
+
return verified_filters if filters.nil?
|
815
|
+
|
811
816
|
filters.each do |filter, raw_value|
|
812
817
|
verified_filter = verify_filter(filter, raw_value, context)
|
813
818
|
verified_filters[verified_filter[0]] = verified_filter[1]
|
@@ -1038,7 +1043,8 @@ module JSONAPI
|
|
1038
1043
|
options = attrs.extract_options!
|
1039
1044
|
options[:parent_resource] = self
|
1040
1045
|
|
1041
|
-
attrs.each do |
|
1046
|
+
attrs.each do |name|
|
1047
|
+
relationship_name = name.to_sym
|
1042
1048
|
check_reserved_relationship_name(relationship_name)
|
1043
1049
|
check_duplicate_relationship_name(relationship_name)
|
1044
1050
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Gebhardt
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-05-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -212,12 +212,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
212
212
|
version: '2.1'
|
213
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
214
|
requirements:
|
215
|
-
- - "
|
215
|
+
- - ">"
|
216
216
|
- !ruby/object:Gem::Version
|
217
|
-
version:
|
217
|
+
version: 1.3.1
|
218
218
|
requirements: []
|
219
219
|
rubyforge_project:
|
220
|
-
rubygems_version: 2.5.
|
220
|
+
rubygems_version: 2.5.2
|
221
221
|
signing_key:
|
222
222
|
specification_version: 4
|
223
223
|
summary: Easily support JSON API in Rails.
|