jsonapi_compliable 0.9.2 → 0.10.0
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/docs/Jsonapi/ResourceGenerator.html +1 -1
- data/docs/Jsonapi.html +1 -1
- data/docs/JsonapiCompliable/Adapters/Abstract.html +1 -1
- data/docs/JsonapiCompliable/Adapters/ActiveRecord.html +1 -1
- data/docs/JsonapiCompliable/Adapters/ActiveRecordSideloading.html +1 -1
- data/docs/JsonapiCompliable/Adapters/Null.html +1 -1
- data/docs/JsonapiCompliable/Adapters.html +1 -1
- data/docs/JsonapiCompliable/Base.html +389 -62
- data/docs/JsonapiCompliable/Deserializer.html +1 -1
- data/docs/JsonapiCompliable/Errors/BadFilter.html +1 -1
- data/docs/JsonapiCompliable/Errors/StatNotFound.html +1 -1
- data/docs/JsonapiCompliable/Errors/UnsupportedPageSize.html +1 -1
- data/docs/JsonapiCompliable/Errors/ValidationError.html +1 -1
- data/docs/JsonapiCompliable/Errors.html +1 -1
- data/docs/JsonapiCompliable/Extensions/BooleanAttribute/ClassMethods.html +1 -1
- data/docs/JsonapiCompliable/Extensions/BooleanAttribute.html +1 -1
- data/docs/JsonapiCompliable/Extensions/ExtraAttribute/ClassMethods.html +1 -1
- data/docs/JsonapiCompliable/Extensions/ExtraAttribute.html +1 -1
- data/docs/JsonapiCompliable/Extensions.html +1 -1
- data/docs/JsonapiCompliable/Query.html +27 -21
- data/docs/JsonapiCompliable/Rails.html +1 -1
- data/docs/JsonapiCompliable/Resource.html +189 -572
- data/docs/JsonapiCompliable/Scope.html +1 -1
- data/docs/JsonapiCompliable/Scoping/Base.html +1 -1
- data/docs/JsonapiCompliable/Scoping/DefaultFilter.html +1 -1
- data/docs/JsonapiCompliable/Scoping/ExtraFields.html +1 -1
- data/docs/JsonapiCompliable/Scoping/Filter.html +1 -1
- data/docs/JsonapiCompliable/Scoping/Filterable.html +1 -1
- data/docs/JsonapiCompliable/Scoping/Paginate.html +1 -1
- data/docs/JsonapiCompliable/Scoping/Sort.html +1 -1
- data/docs/JsonapiCompliable/Scoping.html +1 -1
- data/docs/JsonapiCompliable/SerializableTempId.html +1 -1
- data/docs/JsonapiCompliable/Sideload.html +164 -384
- data/docs/JsonapiCompliable/Stats/DSL.html +1 -1
- data/docs/JsonapiCompliable/Stats/Payload.html +1 -1
- data/docs/JsonapiCompliable/Stats.html +1 -1
- data/docs/JsonapiCompliable/Util/FieldParams.html +1 -1
- data/docs/JsonapiCompliable/Util/Hash.html +1 -1
- data/docs/JsonapiCompliable/Util/IncludeParams.html +1 -1
- data/docs/JsonapiCompliable/Util/Persistence.html +1 -1
- data/docs/JsonapiCompliable/Util/RelationshipPayload.html +1 -1
- data/docs/JsonapiCompliable/Util/RenderOptions.html +1 -1
- data/docs/JsonapiCompliable/Util/ValidationResponse.html +1 -1
- data/docs/JsonapiCompliable/Util.html +1 -1
- data/docs/JsonapiCompliable.html +2 -2
- data/docs/_index.html +1 -1
- data/docs/file.README.html +1 -1
- data/docs/index.html +1 -1
- data/docs/method_list.html +191 -215
- data/docs/top-level-namespace.html +1 -1
- data/lib/jsonapi_compliable/base.rb +43 -1
- data/lib/jsonapi_compliable/query.rb +8 -5
- data/lib/jsonapi_compliable/resource.rb +2 -90
- data/lib/jsonapi_compliable/scope.rb +2 -4
- data/lib/jsonapi_compliable/sideload.rb +7 -59
- data/lib/jsonapi_compliable/version.rb +1 -1
- metadata +2 -2
@@ -100,7 +100,7 @@
|
|
100
100
|
</div>
|
101
101
|
|
102
102
|
<div id="footer">
|
103
|
-
Generated on
|
103
|
+
Generated on Tue Oct 3 09:22:25 2017 by
|
104
104
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
105
105
|
0.9.9 (ruby-2.3.0).
|
106
106
|
</div>
|
@@ -7,12 +7,13 @@ module JsonapiCompliable
|
|
7
7
|
|
8
8
|
included do
|
9
9
|
class << self
|
10
|
-
attr_accessor :_jsonapi_compliable
|
10
|
+
attr_accessor :_jsonapi_compliable, :_sideload_whitelist
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.inherited(klass)
|
14
14
|
super
|
15
15
|
klass._jsonapi_compliable = Class.new(_jsonapi_compliable)
|
16
|
+
klass._sideload_whitelist = _sideload_whitelist.dup if _sideload_whitelist
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -52,6 +53,47 @@ module JsonapiCompliable
|
|
52
53
|
|
53
54
|
self._jsonapi_compliable.class_eval(&blk) if blk
|
54
55
|
end
|
56
|
+
|
57
|
+
# Set the sideload whitelist. You may want to omit sideloads for
|
58
|
+
# security or performance reasons.
|
59
|
+
#
|
60
|
+
# Uses JSONAPI::IncludeDirective from {{http://jsonapi-rb.org jsonapi-rb}}
|
61
|
+
#
|
62
|
+
# @example Whitelisting Relationships
|
63
|
+
# # Given the following whitelist
|
64
|
+
# class PostsController < ApplicationResource
|
65
|
+
# jsonapi resource: MyResource
|
66
|
+
#
|
67
|
+
# sideload_whitelist({
|
68
|
+
# index: [:blog],
|
69
|
+
# show: [:blog, { comments: :author }]
|
70
|
+
# })
|
71
|
+
#
|
72
|
+
# # ... code ...
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# # A request to sideload 'tags'
|
76
|
+
# #
|
77
|
+
# # GET /posts/1?include=tags
|
78
|
+
# #
|
79
|
+
# # ...will silently fail.
|
80
|
+
# #
|
81
|
+
# # A request for comments and tags:
|
82
|
+
# #
|
83
|
+
# # GET /posts/1?include=tags,comments
|
84
|
+
# #
|
85
|
+
# # ...will only sideload comments
|
86
|
+
#
|
87
|
+
# @param [Hash, Array, Symbol] whitelist
|
88
|
+
# @see Query#include_hash
|
89
|
+
def sideload_whitelist(hash)
|
90
|
+
self._sideload_whitelist = JSONAPI::IncludeDirective.new(hash).to_hash
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# @api private
|
95
|
+
def sideload_whitelist
|
96
|
+
self.class._sideload_whitelist || {}
|
55
97
|
end
|
56
98
|
|
57
99
|
# Returns an instance of the associated Resource
|
@@ -49,12 +49,15 @@ module JsonapiCompliable
|
|
49
49
|
# @return [Hash] the scrubbed include directive as a hash
|
50
50
|
def include_hash
|
51
51
|
@include_hash ||= begin
|
52
|
-
requested
|
53
|
-
all_allowed = resource.sideloading.to_hash[:base]
|
54
|
-
whitelist = resource.sideload_whitelist.values.reduce(:merge)
|
55
|
-
allowed = whitelist ? Util::IncludeParams.scrub(all_allowed, whitelist) : all_allowed
|
52
|
+
requested = include_directive.to_hash
|
56
53
|
|
57
|
-
|
54
|
+
whitelist = nil
|
55
|
+
if resource.context
|
56
|
+
whitelist = resource.context.sideload_whitelist
|
57
|
+
whitelist = whitelist[resource.context_namespace] if whitelist
|
58
|
+
end
|
59
|
+
|
60
|
+
whitelist ? Util::IncludeParams.scrub(requested, whitelist) : requested
|
58
61
|
end
|
59
62
|
end
|
60
63
|
|
@@ -132,36 +132,6 @@ module JsonapiCompliable
|
|
132
132
|
@sideloading ||= Sideload.new(:base, resource: self)
|
133
133
|
end
|
134
134
|
|
135
|
-
# Set the sideload whitelist. You may want to omit sideloads for
|
136
|
-
# security or performance reasons.
|
137
|
-
#
|
138
|
-
# Uses JSONAPI::IncludeDirective from {{http://jsonapi-rb.org jsonapi-rb}}
|
139
|
-
#
|
140
|
-
# @example Whitelisting Relationships
|
141
|
-
# # Given the following whitelist
|
142
|
-
# class PostResource < ApplicationResource
|
143
|
-
# # ... code ...
|
144
|
-
# sideload_whitelist([:blog, { comments: :author }])
|
145
|
-
# end
|
146
|
-
#
|
147
|
-
# # A request to sideload 'tags'
|
148
|
-
# #
|
149
|
-
# # GET /posts?include=tags
|
150
|
-
# #
|
151
|
-
# # ...will silently fail.
|
152
|
-
# #
|
153
|
-
# # A request for comments and tags:
|
154
|
-
# #
|
155
|
-
# # GET /posts?include=tags,comments
|
156
|
-
# #
|
157
|
-
# # ...will only sideload comments
|
158
|
-
#
|
159
|
-
# @param [Hash, Array, Symbol] whitelist
|
160
|
-
# @see Query#include_hash
|
161
|
-
def self.sideload_whitelist(whitelist)
|
162
|
-
config[:sideload_whitelist] = JSONAPI::IncludeDirective.new(whitelist).to_hash
|
163
|
-
end
|
164
|
-
|
165
135
|
# Whitelist a filter
|
166
136
|
#
|
167
137
|
# @example Basic Filtering
|
@@ -413,7 +383,6 @@ module JsonapiCompliable
|
|
413
383
|
def self.config
|
414
384
|
@config ||= begin
|
415
385
|
{
|
416
|
-
sideload_whitelist: {},
|
417
386
|
filters: {},
|
418
387
|
default_filters: {},
|
419
388
|
extra_fields: {},
|
@@ -568,60 +537,9 @@ module JsonapiCompliable
|
|
568
537
|
persistence.run
|
569
538
|
end
|
570
539
|
|
571
|
-
#
|
572
|
-
#
|
573
|
-
# { comments: { author: {} } }
|
574
|
-
#
|
575
|
-
# Becomes
|
576
|
-
#
|
577
|
-
# [:comments, :author]
|
578
|
-
#
|
579
|
-
# @see Sideload#to_hash
|
580
|
-
# @return [Array<Symbol>] the list of association names
|
540
|
+
# @see Sideload#association_names
|
581
541
|
def association_names
|
582
|
-
|
583
|
-
if sideloading
|
584
|
-
Util::Hash.keys(sideloading.to_hash[:base])
|
585
|
-
else
|
586
|
-
[]
|
587
|
-
end
|
588
|
-
end
|
589
|
-
end
|
590
|
-
|
591
|
-
# An Include Directive Hash of all possible sideloads for the current
|
592
|
-
# context namespace, taking into account the sideload whitelist.
|
593
|
-
#
|
594
|
-
# In other words, say we have this resource:
|
595
|
-
#
|
596
|
-
# class PostResource < ApplicationResource
|
597
|
-
# sideload_whitelist({
|
598
|
-
# index: :comments,
|
599
|
-
# show: { comments: :author }
|
600
|
-
# })
|
601
|
-
# end
|
602
|
-
#
|
603
|
-
# Expected behavior:
|
604
|
-
#
|
605
|
-
# allowed_sideloads(:index) # => { comments: {} }
|
606
|
-
# allowed_sideloads(:show) # => { comments: { author: {} }
|
607
|
-
#
|
608
|
-
# instance.with_context({}, :index) do
|
609
|
-
# instance.allowed_sideloads # => { comments: {} }
|
610
|
-
# end
|
611
|
-
#
|
612
|
-
# @see Util::IncludeParams.scrub
|
613
|
-
# @see #with_context
|
614
|
-
# @param [Symbol] namespace Can be :index/:show/etc - The current context namespace will be used by default.
|
615
|
-
# @return [Hash] the scrubbed include directive
|
616
|
-
def allowed_sideloads(namespace = nil)
|
617
|
-
return {} unless sideloading
|
618
|
-
|
619
|
-
namespace ||= context_namespace
|
620
|
-
sideloads = sideloading.to_hash[:base]
|
621
|
-
if !sideload_whitelist.empty? && namespace
|
622
|
-
sideloads = Util::IncludeParams.scrub(sideloads, sideload_whitelist[namespace])
|
623
|
-
end
|
624
|
-
sideloads
|
542
|
+
sideloading.association_names
|
625
543
|
end
|
626
544
|
|
627
545
|
# The relevant proc for the given attribute and calculation.
|
@@ -710,12 +628,6 @@ module JsonapiCompliable
|
|
710
628
|
self.class.config[:extra_fields]
|
711
629
|
end
|
712
630
|
|
713
|
-
# @see .sideload_whitelist
|
714
|
-
# @api private
|
715
|
-
def sideload_whitelist
|
716
|
-
self.class.config[:sideload_whitelist]
|
717
|
-
end
|
718
|
-
|
719
631
|
# @see .default_filter
|
720
632
|
# @api private
|
721
633
|
def default_filters
|
@@ -80,10 +80,8 @@ module JsonapiCompliable
|
|
80
80
|
return if results == []
|
81
81
|
|
82
82
|
includes.each_pair do |name, nested|
|
83
|
-
|
84
|
-
|
85
|
-
sideload.resolve(results, @query)
|
86
|
-
end
|
83
|
+
sideload = @resource.sideload(name)
|
84
|
+
sideload.resolve(results, @query)
|
87
85
|
end
|
88
86
|
end
|
89
87
|
|
@@ -43,21 +43,6 @@ module JsonapiCompliable
|
|
43
43
|
extend @resource_class.config[:adapter].sideloading_module
|
44
44
|
end
|
45
45
|
|
46
|
-
# @api private
|
47
|
-
def self.max_recursion
|
48
|
-
@max_recursion || 2
|
49
|
-
end
|
50
|
-
|
51
|
-
# Set maximum levels of sideload recursion
|
52
|
-
# /authors?comments.authors would be one level
|
53
|
-
# /authors?comments.authors.comments.authors would be two levels
|
54
|
-
# etc
|
55
|
-
#
|
56
|
-
# Default max recursion is 2
|
57
|
-
def self.max_recursion=(val)
|
58
|
-
@max_recursion = val
|
59
|
-
end
|
60
|
-
|
61
46
|
# @see #resource_class
|
62
47
|
# @return [Resource] an instance of +#resource_class+
|
63
48
|
def resource
|
@@ -359,44 +344,15 @@ module JsonapiCompliable
|
|
359
344
|
end
|
360
345
|
end
|
361
346
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
# class BarResource < ApplicationResource
|
368
|
-
# allow_sideload :baz do
|
369
|
-
# end
|
370
|
-
# end
|
371
|
-
#
|
372
|
-
# class PostResource < ApplicationResource
|
373
|
-
# allow_sideload :foo do
|
374
|
-
# allow_sideload :bar, resource: BarResource do
|
375
|
-
# end
|
376
|
-
# end
|
377
|
-
# end
|
378
|
-
#
|
379
|
-
# +post_resource.sideloading.to_hash+ would return
|
380
|
-
#
|
381
|
-
# { base: { foo: { bar: { baz: {} } } } }
|
382
|
-
#
|
383
|
-
# @return [Hash] The nested include hash
|
384
|
-
# @api private
|
385
|
-
def to_hash(recursion_chain = [], parent = nil)
|
386
|
-
recursing = ->(arr) { arr == [parent.object_id, self.object_id] }
|
387
|
-
recursions = recursion_chain.select(&recursing).length
|
388
|
-
return {} if recursions >= self.class.max_recursion
|
389
|
-
|
390
|
-
unless (parent && parent.name == :base) || name == :base
|
391
|
-
recursion_chain += [[parent.object_id, self.object_id]]
|
392
|
-
end
|
393
|
-
|
394
|
-
{ name => {} }.tap do |hash|
|
395
|
-
all_sideloads.each_pair do |key, sl|
|
396
|
-
sideload_hash = sl.to_hash(recursion_chain, self)
|
397
|
-
hash[name].merge!(sideload_hash)
|
347
|
+
def association_names(memo = [])
|
348
|
+
all_sideloads.each_pair do |name, sl|
|
349
|
+
unless memo.include?(sl.name)
|
350
|
+
memo << sl.name
|
351
|
+
memo |= sl.association_names(memo)
|
398
352
|
end
|
399
353
|
end
|
354
|
+
|
355
|
+
memo
|
400
356
|
end
|
401
357
|
|
402
358
|
# @api private
|
@@ -417,14 +373,6 @@ module JsonapiCompliable
|
|
417
373
|
|
418
374
|
private
|
419
375
|
|
420
|
-
def nested_sideload_hash(sideload, processed)
|
421
|
-
{}.tap do |hash|
|
422
|
-
if sideloading = sideload.resource_class.sideloading
|
423
|
-
hash.merge!(sideloading.to_hash(processed)[:base])
|
424
|
-
end
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
376
|
def polymorphic_grouper(grouping_field)
|
429
377
|
lambda do |record|
|
430
378
|
if record.is_a?(Hash)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi_compliable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-10-
|
12
|
+
date: 2017-10-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jsonapi-serializable
|