jsonapi_compliable 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|