jsonapi_compliable 0.4.0 → 0.5.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 +4 -4
- data/Appraisals +4 -0
- data/Gemfile +2 -2
- data/gemfiles/rails_4.gemfile +4 -3
- data/gemfiles/rails_4.gemfile.lock +27 -36
- data/gemfiles/rails_5.gemfile +4 -3
- data/gemfiles/rails_5.gemfile.lock +27 -37
- data/jsonapi_compliable.gemspec +3 -7
- data/lib/jsonapi_compliable/adapters/abstract.rb +25 -0
- data/lib/jsonapi_compliable/adapters/active_record.rb +47 -0
- data/lib/jsonapi_compliable/adapters/active_record_sideloading.rb +119 -0
- data/lib/jsonapi_compliable/adapters/null.rb +21 -0
- data/lib/jsonapi_compliable/base.rb +43 -50
- data/lib/jsonapi_compliable/deserializable.rb +9 -4
- data/lib/jsonapi_compliable/extensions/extra_attribute.rb +1 -5
- data/lib/jsonapi_compliable/query.rb +153 -0
- data/lib/jsonapi_compliable/rails.rb +14 -0
- data/lib/jsonapi_compliable/resource.rb +191 -0
- data/lib/jsonapi_compliable/scope.rb +57 -0
- data/lib/jsonapi_compliable/{scope → scoping}/base.rb +5 -6
- data/lib/jsonapi_compliable/{scope → scoping}/default_filter.rb +3 -3
- data/lib/jsonapi_compliable/scoping/extra_fields.rb +25 -0
- data/lib/jsonapi_compliable/{scope → scoping}/filter.rb +4 -4
- data/lib/jsonapi_compliable/{scope → scoping}/filterable.rb +4 -4
- data/lib/jsonapi_compliable/{scope → scoping}/paginate.rb +6 -6
- data/lib/jsonapi_compliable/scoping/sort.rb +33 -0
- data/lib/jsonapi_compliable/sideload.rb +95 -0
- data/lib/jsonapi_compliable/stats/dsl.rb +7 -16
- data/lib/jsonapi_compliable/stats/payload.rb +6 -14
- data/lib/jsonapi_compliable/util/field_params.rb +6 -8
- data/lib/jsonapi_compliable/util/hash.rb +14 -0
- data/lib/jsonapi_compliable/util/include_params.rb +7 -18
- data/lib/jsonapi_compliable/util/render_options.rb +25 -0
- data/lib/jsonapi_compliable/version.rb +1 -1
- data/lib/jsonapi_compliable.rb +22 -13
- metadata +34 -70
- data/gemfiles/rails_3.gemfile +0 -9
- data/lib/jsonapi_compliable/dsl.rb +0 -90
- data/lib/jsonapi_compliable/scope/extra_fields.rb +0 -35
- data/lib/jsonapi_compliable/scope/sideload.rb +0 -25
- data/lib/jsonapi_compliable/scope/sort.rb +0 -29
- data/lib/jsonapi_compliable/util/pagination.rb +0 -11
- data/lib/jsonapi_compliable/util/scoping.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 363fc9bc08c13030150de69edfaec4bbbbbdb03b
|
4
|
+
data.tar.gz: c7b39b7e43d39bb165c5eda6ae41e5be72f6532d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4284c0e7b12b594985925c4c30f74c911c526cfa6531ed0c5990069d9f8e148cde3f4162a89e0e5f5ad177c1ac9bd042daf9228c72e963efd62920d1b7fa4e4
|
7
|
+
data.tar.gz: 2b90de831bb4d5678bf996bfc1806f55ac9b6f99f4167d9e3b1de9c3ee9df96de068c2a53f5109cd88b7c5de1f23d5a723d0f4f7732879929532fed7e073ac25
|
data/Appraisals
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
appraise "rails-4" do
|
2
2
|
gem "rails", "~> 4.1"
|
3
|
+
gem 'jsonapi-rails', '~> 0.1', require: 'jsonapi/rails'
|
4
|
+
gem 'rspec-rails'
|
3
5
|
end
|
4
6
|
|
5
7
|
appraise "rails-5" do
|
6
8
|
gem "rails", "~> 5.0"
|
9
|
+
gem 'jsonapi-rails', '~> 0.1', require: 'jsonapi/rails'
|
10
|
+
gem 'rspec-rails'
|
7
11
|
end
|
data/Gemfile
CHANGED
data/gemfiles/rails_4.gemfile
CHANGED
@@ -2,15 +2,16 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "active_model_serializers", :git => "https://github.com/richmolj/active_model_serializers.git"
|
6
5
|
gem "rails", "~> 4.1"
|
6
|
+
gem "jsonapi-rails", "~> 0.1", :require => "jsonapi/rails"
|
7
|
+
gem "rspec-rails"
|
7
8
|
|
8
9
|
group :test do
|
10
|
+
gem "pry"
|
11
|
+
gem "pry-byebug", :platform => [:mri]
|
9
12
|
gem "appraisal"
|
10
13
|
gem "guard"
|
11
14
|
gem "guard-rspec"
|
12
|
-
gem "pry"
|
13
|
-
gem "pry-byebug"
|
14
15
|
end
|
15
16
|
|
16
17
|
gemspec :path => "../"
|
@@ -1,21 +1,8 @@
|
|
1
|
-
GIT
|
2
|
-
remote: https://github.com/richmolj/active_model_serializers.git
|
3
|
-
revision: 1dc2b74059731339f4df3e7882fd949e20433013
|
4
|
-
specs:
|
5
|
-
active_model_serializers (0.10.2)
|
6
|
-
actionpack (>= 4.1, < 6)
|
7
|
-
activemodel (>= 4.1, < 6)
|
8
|
-
jsonapi (~> 0.1.1.beta2)
|
9
|
-
railties (>= 4.1, < 6)
|
10
|
-
|
11
1
|
PATH
|
12
2
|
remote: ../
|
13
3
|
specs:
|
14
|
-
jsonapi_compliable (0.
|
15
|
-
|
16
|
-
jsonapi (~> 0.1.1.beta2)
|
17
|
-
jsonapi_ams_extensions (~> 0.1)
|
18
|
-
rails (>= 4.1, < 6)
|
4
|
+
jsonapi_compliable (0.4.0)
|
5
|
+
jsonapi-serializable (~> 0.1)
|
19
6
|
|
20
7
|
GEM
|
21
8
|
remote: https://rubygems.org/
|
@@ -61,9 +48,9 @@ GEM
|
|
61
48
|
thor (>= 0.14.0)
|
62
49
|
arel (6.0.3)
|
63
50
|
builder (3.2.2)
|
64
|
-
byebug (9.0.
|
51
|
+
byebug (9.0.6)
|
65
52
|
coderay (1.1.1)
|
66
|
-
concurrent-ruby (1.0.
|
53
|
+
concurrent-ruby (1.0.4)
|
67
54
|
database_cleaner (1.5.3)
|
68
55
|
diff-lcs (1.2.5)
|
69
56
|
erubis (2.7.0)
|
@@ -87,11 +74,17 @@ GEM
|
|
87
74
|
rspec (>= 2.99.0, < 4.0)
|
88
75
|
i18n (0.7.0)
|
89
76
|
json (1.8.3)
|
90
|
-
jsonapi (0.1.1
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
77
|
+
jsonapi-deserializable (0.1.1)
|
78
|
+
jsonapi-parser (= 0.1.1)
|
79
|
+
jsonapi-parser (0.1.1)
|
80
|
+
jsonapi-rails (0.1.1)
|
81
|
+
jsonapi-rb (= 0.1.1)
|
82
|
+
jsonapi-rb (0.1.1)
|
83
|
+
jsonapi-deserializable (= 0.1.1)
|
84
|
+
jsonapi-serializable (= 0.1.1)
|
85
|
+
jsonapi-renderer (0.1.1)
|
86
|
+
jsonapi-serializable (0.1.1)
|
87
|
+
jsonapi-renderer (= 0.1.1)
|
95
88
|
kaminari (0.17.0)
|
96
89
|
actionpack (>= 3.0.0)
|
97
90
|
activesupport (>= 3.0.0)
|
@@ -109,23 +102,21 @@ GEM
|
|
109
102
|
mime-types-data (~> 3.2015)
|
110
103
|
mime-types-data (3.2016.0521)
|
111
104
|
mini_portile2 (2.1.0)
|
112
|
-
minitest (5.
|
105
|
+
minitest (5.10.1)
|
113
106
|
nenv (0.3.0)
|
114
|
-
nokogiri (1.6.8)
|
107
|
+
nokogiri (1.6.8.1)
|
115
108
|
mini_portile2 (~> 2.1.0)
|
116
|
-
pkg-config (~> 1.1.7)
|
117
109
|
notiffany (0.1.1)
|
118
110
|
nenv (~> 0.1)
|
119
111
|
shellany (~> 0.0)
|
120
|
-
pkg-config (1.1.7)
|
121
112
|
pry (0.10.4)
|
122
113
|
coderay (~> 1.1.0)
|
123
114
|
method_source (~> 0.8.1)
|
124
115
|
slop (~> 3.4)
|
125
|
-
pry-byebug (3.4.
|
116
|
+
pry-byebug (3.4.2)
|
126
117
|
byebug (~> 9.0)
|
127
118
|
pry (~> 0.10)
|
128
|
-
rack (1.6.
|
119
|
+
rack (1.6.5)
|
129
120
|
rack-test (0.6.3)
|
130
121
|
rack (>= 1.0)
|
131
122
|
rails (4.2.7.1)
|
@@ -153,14 +144,14 @@ GEM
|
|
153
144
|
rake (>= 0.8.7)
|
154
145
|
thor (>= 0.18.1, < 2.0)
|
155
146
|
rake (10.5.0)
|
156
|
-
rb-fsevent (0.9.
|
147
|
+
rb-fsevent (0.9.8)
|
157
148
|
rb-inotify (0.9.7)
|
158
149
|
ffi (>= 0.5.0)
|
159
150
|
rspec (3.5.0)
|
160
151
|
rspec-core (~> 3.5.0)
|
161
152
|
rspec-expectations (~> 3.5.0)
|
162
153
|
rspec-mocks (~> 3.5.0)
|
163
|
-
rspec-core (3.5.
|
154
|
+
rspec-core (3.5.4)
|
164
155
|
rspec-support (~> 3.5.0)
|
165
156
|
rspec-expectations (3.5.0)
|
166
157
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -177,7 +168,7 @@ GEM
|
|
177
168
|
rspec-mocks (~> 3.5.0)
|
178
169
|
rspec-support (~> 3.5.0)
|
179
170
|
rspec-support (3.5.0)
|
180
|
-
ruby_dep (1.
|
171
|
+
ruby_dep (1.5.0)
|
181
172
|
shellany (0.0.1)
|
182
173
|
slop (3.6.0)
|
183
174
|
sprockets (3.7.0)
|
@@ -187,8 +178,8 @@ GEM
|
|
187
178
|
actionpack (>= 4.0)
|
188
179
|
activesupport (>= 4.0)
|
189
180
|
sprockets (>= 3.0.0)
|
190
|
-
sqlite3 (1.3.
|
191
|
-
thor (0.19.
|
181
|
+
sqlite3 (1.3.12)
|
182
|
+
thor (0.19.4)
|
192
183
|
thread_safe (0.3.5)
|
193
184
|
tzinfo (1.2.2)
|
194
185
|
thread_safe (~> 0.1)
|
@@ -197,14 +188,14 @@ PLATFORMS
|
|
197
188
|
ruby
|
198
189
|
|
199
190
|
DEPENDENCIES
|
200
|
-
|
191
|
+
activerecord (>= 4.1, < 6)
|
201
192
|
appraisal
|
202
193
|
bundler (~> 1.12)
|
203
194
|
database_cleaner
|
204
195
|
guard
|
205
196
|
guard-rspec
|
197
|
+
jsonapi-rails (~> 0.1)
|
206
198
|
jsonapi_compliable!
|
207
|
-
jsonapi_spec_helpers
|
208
199
|
kaminari
|
209
200
|
pry
|
210
201
|
pry-byebug
|
@@ -214,4 +205,4 @@ DEPENDENCIES
|
|
214
205
|
sqlite3
|
215
206
|
|
216
207
|
BUNDLED WITH
|
217
|
-
1.
|
208
|
+
1.13.6
|
data/gemfiles/rails_5.gemfile
CHANGED
@@ -2,15 +2,16 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "active_model_serializers", :git => "https://github.com/richmolj/active_model_serializers.git"
|
6
5
|
gem "rails", "~> 5.0"
|
6
|
+
gem "jsonapi-rails", "~> 0.1", :require => "jsonapi/rails"
|
7
|
+
gem "rspec-rails"
|
7
8
|
|
8
9
|
group :test do
|
10
|
+
gem "pry"
|
11
|
+
gem "pry-byebug", :platform => [:mri]
|
9
12
|
gem "appraisal"
|
10
13
|
gem "guard"
|
11
14
|
gem "guard-rspec"
|
12
|
-
gem "pry"
|
13
|
-
gem "pry-byebug"
|
14
15
|
end
|
15
16
|
|
16
17
|
gemspec :path => "../"
|
@@ -1,21 +1,8 @@
|
|
1
|
-
GIT
|
2
|
-
remote: https://github.com/richmolj/active_model_serializers.git
|
3
|
-
revision: 1dc2b74059731339f4df3e7882fd949e20433013
|
4
|
-
specs:
|
5
|
-
active_model_serializers (0.10.2)
|
6
|
-
actionpack (>= 4.1, < 6)
|
7
|
-
activemodel (>= 4.1, < 6)
|
8
|
-
jsonapi (~> 0.1.1.beta2)
|
9
|
-
railties (>= 4.1, < 6)
|
10
|
-
|
11
1
|
PATH
|
12
2
|
remote: ../
|
13
3
|
specs:
|
14
|
-
jsonapi_compliable (0.
|
15
|
-
|
16
|
-
jsonapi (~> 0.1.1.beta2)
|
17
|
-
jsonapi_ams_extensions (~> 0.1)
|
18
|
-
rails (>= 4.1, < 6)
|
4
|
+
jsonapi_compliable (0.4.0)
|
5
|
+
jsonapi-serializable (~> 0.1)
|
19
6
|
|
20
7
|
GEM
|
21
8
|
remote: https://rubygems.org/
|
@@ -61,11 +48,11 @@ GEM
|
|
61
48
|
bundler
|
62
49
|
rake
|
63
50
|
thor (>= 0.14.0)
|
64
|
-
arel (7.1.
|
51
|
+
arel (7.1.4)
|
65
52
|
builder (3.2.2)
|
66
|
-
byebug (9.0.
|
53
|
+
byebug (9.0.6)
|
67
54
|
coderay (1.1.1)
|
68
|
-
concurrent-ruby (1.0.
|
55
|
+
concurrent-ruby (1.0.4)
|
69
56
|
database_cleaner (1.5.3)
|
70
57
|
diff-lcs (1.2.5)
|
71
58
|
erubis (2.7.0)
|
@@ -88,12 +75,17 @@ GEM
|
|
88
75
|
guard-compat (~> 1.1)
|
89
76
|
rspec (>= 2.99.0, < 4.0)
|
90
77
|
i18n (0.7.0)
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
78
|
+
jsonapi-deserializable (0.1.1)
|
79
|
+
jsonapi-parser (= 0.1.1)
|
80
|
+
jsonapi-parser (0.1.1)
|
81
|
+
jsonapi-rails (0.1.1)
|
82
|
+
jsonapi-rb (= 0.1.1)
|
83
|
+
jsonapi-rb (0.1.1)
|
84
|
+
jsonapi-deserializable (= 0.1.1)
|
85
|
+
jsonapi-serializable (= 0.1.1)
|
86
|
+
jsonapi-renderer (0.1.1)
|
87
|
+
jsonapi-serializable (0.1.1)
|
88
|
+
jsonapi-renderer (= 0.1.1)
|
97
89
|
kaminari (0.17.0)
|
98
90
|
actionpack (>= 3.0.0)
|
99
91
|
activesupport (>= 3.0.0)
|
@@ -111,21 +103,19 @@ GEM
|
|
111
103
|
mime-types-data (~> 3.2015)
|
112
104
|
mime-types-data (3.2016.0521)
|
113
105
|
mini_portile2 (2.1.0)
|
114
|
-
minitest (5.
|
106
|
+
minitest (5.10.1)
|
115
107
|
nenv (0.3.0)
|
116
108
|
nio4r (1.2.1)
|
117
|
-
nokogiri (1.6.8)
|
109
|
+
nokogiri (1.6.8.1)
|
118
110
|
mini_portile2 (~> 2.1.0)
|
119
|
-
pkg-config (~> 1.1.7)
|
120
111
|
notiffany (0.1.1)
|
121
112
|
nenv (~> 0.1)
|
122
113
|
shellany (~> 0.0)
|
123
|
-
pkg-config (1.1.7)
|
124
114
|
pry (0.10.4)
|
125
115
|
coderay (~> 1.1.0)
|
126
116
|
method_source (~> 0.8.1)
|
127
117
|
slop (~> 3.4)
|
128
|
-
pry-byebug (3.4.
|
118
|
+
pry-byebug (3.4.2)
|
129
119
|
byebug (~> 9.0)
|
130
120
|
pry (~> 0.10)
|
131
121
|
rack (2.0.1)
|
@@ -155,14 +145,14 @@ GEM
|
|
155
145
|
rake (>= 0.8.7)
|
156
146
|
thor (>= 0.18.1, < 2.0)
|
157
147
|
rake (10.5.0)
|
158
|
-
rb-fsevent (0.9.
|
148
|
+
rb-fsevent (0.9.8)
|
159
149
|
rb-inotify (0.9.7)
|
160
150
|
ffi (>= 0.5.0)
|
161
151
|
rspec (3.5.0)
|
162
152
|
rspec-core (~> 3.5.0)
|
163
153
|
rspec-expectations (~> 3.5.0)
|
164
154
|
rspec-mocks (~> 3.5.0)
|
165
|
-
rspec-core (3.5.
|
155
|
+
rspec-core (3.5.4)
|
166
156
|
rspec-support (~> 3.5.0)
|
167
157
|
rspec-expectations (3.5.0)
|
168
158
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -179,7 +169,7 @@ GEM
|
|
179
169
|
rspec-mocks (~> 3.5.0)
|
180
170
|
rspec-support (~> 3.5.0)
|
181
171
|
rspec-support (3.5.0)
|
182
|
-
ruby_dep (1.
|
172
|
+
ruby_dep (1.5.0)
|
183
173
|
shellany (0.0.1)
|
184
174
|
slop (3.6.0)
|
185
175
|
sprockets (3.7.0)
|
@@ -189,8 +179,8 @@ GEM
|
|
189
179
|
actionpack (>= 4.0)
|
190
180
|
activesupport (>= 4.0)
|
191
181
|
sprockets (>= 3.0.0)
|
192
|
-
sqlite3 (1.3.
|
193
|
-
thor (0.19.
|
182
|
+
sqlite3 (1.3.12)
|
183
|
+
thor (0.19.4)
|
194
184
|
thread_safe (0.3.5)
|
195
185
|
tzinfo (1.2.2)
|
196
186
|
thread_safe (~> 0.1)
|
@@ -202,14 +192,14 @@ PLATFORMS
|
|
202
192
|
ruby
|
203
193
|
|
204
194
|
DEPENDENCIES
|
205
|
-
|
195
|
+
activerecord (>= 4.1, < 6)
|
206
196
|
appraisal
|
207
197
|
bundler (~> 1.12)
|
208
198
|
database_cleaner
|
209
199
|
guard
|
210
200
|
guard-rspec
|
201
|
+
jsonapi-rails (~> 0.1)
|
211
202
|
jsonapi_compliable!
|
212
|
-
jsonapi_spec_helpers
|
213
203
|
kaminari
|
214
204
|
pry
|
215
205
|
pry-byebug
|
@@ -219,4 +209,4 @@ DEPENDENCIES
|
|
219
209
|
sqlite3
|
220
210
|
|
221
211
|
BUNDLED WITH
|
222
|
-
1.
|
212
|
+
1.13.6
|
data/jsonapi_compliable.gemspec
CHANGED
@@ -17,16 +17,12 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency
|
20
|
+
spec.add_dependency 'jsonapi-serializable', '~> 0.1'
|
21
21
|
|
22
|
-
spec.
|
23
|
-
|
24
|
-
spec.add_development_dependency "kaminari"
|
25
|
-
spec.add_development_dependency "active_model_serializers"
|
26
|
-
spec.add_development_dependency "jsonapi_spec_helpers"
|
22
|
+
spec.add_development_dependency "activerecord", ['>= 4.1', '< 6']
|
23
|
+
spec.add_development_dependency "kaminari", '~> 0.17'
|
27
24
|
spec.add_development_dependency "bundler", "~> 1.12"
|
28
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
-
spec.add_development_dependency "rspec-rails"
|
30
26
|
spec.add_development_dependency "sqlite3"
|
31
27
|
spec.add_development_dependency "database_cleaner"
|
32
28
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module JsonapiCompliable
|
2
|
+
module Adapters
|
3
|
+
class Abstract
|
4
|
+
def filter(scope, attribute, value)
|
5
|
+
raise 'you must override #filter in an adapter subclass'
|
6
|
+
end
|
7
|
+
|
8
|
+
def order(scope, attribute, direction)
|
9
|
+
raise 'you must override #order in an adapter subclass'
|
10
|
+
end
|
11
|
+
|
12
|
+
def paginate(scope, number, size)
|
13
|
+
raise 'you must override #paginate in an adapter subclass'
|
14
|
+
end
|
15
|
+
|
16
|
+
def sideload(scope, includes)
|
17
|
+
raise 'you must override #sideload in an adapter subclass'
|
18
|
+
end
|
19
|
+
|
20
|
+
def sideloading_module
|
21
|
+
Module.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'jsonapi_compliable/adapters/active_record_sideloading'
|
2
|
+
|
3
|
+
module JsonapiCompliable
|
4
|
+
module Adapters
|
5
|
+
class ActiveRecord < Abstract
|
6
|
+
def filter(scope, attribute, value)
|
7
|
+
scope.where(attribute => value)
|
8
|
+
end
|
9
|
+
|
10
|
+
def order(scope, attribute, direction)
|
11
|
+
scope.order(attribute => direction)
|
12
|
+
end
|
13
|
+
|
14
|
+
def paginate(scope, current_page, per_page)
|
15
|
+
scope.page(current_page).per(per_page)
|
16
|
+
end
|
17
|
+
|
18
|
+
def sideload(scope, includes)
|
19
|
+
scope.includes(includes)
|
20
|
+
end
|
21
|
+
|
22
|
+
def count(scope, attr)
|
23
|
+
scope.count
|
24
|
+
end
|
25
|
+
|
26
|
+
def average(scope, attr)
|
27
|
+
scope.average(attr).to_f
|
28
|
+
end
|
29
|
+
|
30
|
+
def sum(scope, attr)
|
31
|
+
scope.sum(attr)
|
32
|
+
end
|
33
|
+
|
34
|
+
def maximum(scope, attr)
|
35
|
+
scope.maximum(attr)
|
36
|
+
end
|
37
|
+
|
38
|
+
def minimum(scope, attr)
|
39
|
+
scope.minimum(attr)
|
40
|
+
end
|
41
|
+
|
42
|
+
def sideloading_module
|
43
|
+
JsonapiCompliable::Adapters::ActiveRecordSideloading
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module JsonapiCompliable
|
2
|
+
module Adapters
|
3
|
+
module ActiveRecordSideloading
|
4
|
+
def has_many(association_name, scope:, resource:, foreign_key:, primary_key: :id, &blk)
|
5
|
+
_scope = scope
|
6
|
+
|
7
|
+
allow_sideload association_name, resource: resource do
|
8
|
+
scope do |parents|
|
9
|
+
parent_ids = parents.map { |p| p.send(primary_key) }
|
10
|
+
_scope.call.where(foreign_key => parent_ids)
|
11
|
+
end
|
12
|
+
|
13
|
+
assign do |parents, children|
|
14
|
+
parents.each do |parent|
|
15
|
+
parent.association(association_name).loaded!
|
16
|
+
relevant_children = children.select { |c| c.send(foreign_key) == parent.send(primary_key) }
|
17
|
+
relevant_children.each do |c|
|
18
|
+
parent.association(association_name).add_to_target(c, :skip_callbacks)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
instance_eval(&blk) if blk
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def belongs_to(association_name, scope:, resource:, foreign_key:, primary_key: :id, &blk)
|
28
|
+
_scope = scope
|
29
|
+
|
30
|
+
allow_sideload association_name, resource: resource do
|
31
|
+
scope do |parents|
|
32
|
+
parent_ids = parents.map { |p| p.send(foreign_key) }
|
33
|
+
_scope.call.where(primary_key => parent_ids)
|
34
|
+
end
|
35
|
+
|
36
|
+
assign do |parents, children|
|
37
|
+
parents.each do |parent|
|
38
|
+
relevant_child = children.find { |c| parent.send(foreign_key) == c.send(primary_key) }
|
39
|
+
parent.send(:"#{association_name}=", relevant_child)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
instance_eval(&blk) if blk
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_one(association_name, scope:, resource:, foreign_key:, primary_key: :id, &blk)
|
48
|
+
_scope = scope
|
49
|
+
|
50
|
+
allow_sideload association_name, resource: resource do
|
51
|
+
scope do |parents|
|
52
|
+
parent_ids = parents.map { |p| p.send(primary_key) }
|
53
|
+
_scope.call.where(foreign_key => parent_ids)
|
54
|
+
end
|
55
|
+
|
56
|
+
assign do |parents, children|
|
57
|
+
parents.each do |parent|
|
58
|
+
parent.association(association_name).loaded!
|
59
|
+
relevant_child = children.find { |c| c.send(foreign_key) == parent.send(primary_key) }
|
60
|
+
next unless relevant_child
|
61
|
+
parent.association(association_name).replace(relevant_child, false)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
instance_eval(&blk) if blk
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def has_and_belongs_to_many(association_name, scope:, resource:, foreign_key:, primary_key: :id, as: nil, &blk)
|
70
|
+
through = foreign_key.keys.first
|
71
|
+
fk = foreign_key.values.first
|
72
|
+
_scope = scope
|
73
|
+
|
74
|
+
allow_sideload association_name, resource: resource do
|
75
|
+
scope do |parents|
|
76
|
+
_scope.call.joins(through).where(through => { fk => parents.map { |p| p.send(primary_key) } })
|
77
|
+
end
|
78
|
+
|
79
|
+
assign do |parents, children|
|
80
|
+
parents.each do |parent|
|
81
|
+
parent.association(association_name).loaded!
|
82
|
+
relevant_children = children.select { |c| c.send(through).any? { |ct| ct.send(fk) == parent.send(primary_key) } }
|
83
|
+
relevant_children.each do |c|
|
84
|
+
parent.association(association_name).add_to_target(c, :skip_callbacks)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
instance_eval(&blk) if blk
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def polymorphic_belongs_to(association_name, group_by:, groups:, &blk)
|
94
|
+
allow_sideload association_name, polymorphic: true do
|
95
|
+
group_by(&group_by)
|
96
|
+
|
97
|
+
groups.each_pair do |type, config|
|
98
|
+
primary_key = config[:primary_key] || :id
|
99
|
+
foreign_key = config[:foreign_key]
|
100
|
+
|
101
|
+
allow_sideload type, resource: config[:resource] do
|
102
|
+
scope do |parents|
|
103
|
+
config[:scope].call.where(primary_key => parents.map { |p| p.send(foreign_key) })
|
104
|
+
end
|
105
|
+
|
106
|
+
assign do |parents, children|
|
107
|
+
parents.each do |parent|
|
108
|
+
parent.send(:"#{association_name}=", children.find { |c| c.send(primary_key) == parent.send(foreign_key) })
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
instance_eval(&blk) if blk
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module JsonapiCompliable
|
2
|
+
module Adapters
|
3
|
+
class Null < Abstract
|
4
|
+
def filter(scope, attribute, value)
|
5
|
+
scope
|
6
|
+
end
|
7
|
+
|
8
|
+
def order(scope, attribute, direction)
|
9
|
+
scope
|
10
|
+
end
|
11
|
+
|
12
|
+
def paginate(scope, number, size)
|
13
|
+
scope
|
14
|
+
end
|
15
|
+
|
16
|
+
def sideload(scope, includes)
|
17
|
+
scope
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|