graphql-sources 0.4.0 → 0.5.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/README.md +15 -1
- data/lib/graphql/sources/active_record_collection.rb +2 -0
- data/lib/graphql/sources/active_record_count.rb +2 -0
- data/lib/graphql/sources/active_record_object.rb +2 -0
- data/lib/graphql/sources/active_storage_has_many_attached.rb +2 -0
- data/lib/graphql/sources/active_storage_has_one_attached.rb +2 -0
- data/lib/graphql/sources/rails_cache.rb +26 -0
- data/lib/graphql/sources/version.rb +1 -1
- data/lib/graphql/sources.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e99e1d718952f3ee55b0a0b37c6f4f9f99789f4740243a6dd7995bee2b5fa6a4
|
4
|
+
data.tar.gz: 4f082d61109e02db43b06b2ff345dd2fdc697f8a6dc30336b7e6226e352a5e79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58202b58608b54a184ed5831672ebafbd39b216cee19908139b4c9ee6e2874197ed5609fcb2bcd592074e101e77ddce8b1e250db5777c55427a37e7f19abc7be
|
7
|
+
data.tar.gz: ee4949a68c77cf7ea0b945f4f79d4a5ba6de9e491c64abb472f8091b01c8181512beafbaa16ca66bbecd8cc64b33c8891d2b3d2589659610ad0149c29dfdf6e0
|
data/README.md
CHANGED
@@ -151,9 +151,23 @@ WHERE "likes"."post_id" IN (1, 2, 3, ...)
|
|
151
151
|
GROUP BY "likes"."post_id"
|
152
152
|
```
|
153
153
|
|
154
|
+
### Loading with `Rails.cache`
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
class UserType < GraphQL::Schema::Object
|
158
|
+
field :location, String, null: false
|
159
|
+
|
160
|
+
def location
|
161
|
+
dataloader
|
162
|
+
.with(GraphQL::Sources::RailsCache)
|
163
|
+
.load(key: "geocode:#{object.latest_ip}", fallback: -> { Geocode.for(object.latest_ip) })
|
164
|
+
end
|
165
|
+
end
|
166
|
+
```
|
167
|
+
|
154
168
|
## Status
|
155
169
|
|
156
|
-
[](https://circleci.com/gh/ksylvest/
|
170
|
+
[](https://circleci.com/gh/ksylvest/graphql-sources)
|
157
171
|
[](https://codeclimate.com/github/ksylvest/graphql-sources/maintainability)
|
158
172
|
[](https://codeclimate.com/github/ksylvest/graphql-sources/test_coverage)
|
159
173
|
|
@@ -31,6 +31,8 @@ module GraphQL
|
|
31
31
|
# WHERE "comments"."user_id" IN (...)
|
32
32
|
# ORDER BY "comments"."id"
|
33
33
|
class ActiveRecordCollection < ActiveRecordBase
|
34
|
+
# @param keys [Array] an array of keys
|
35
|
+
# @return [Array] grouped records mirroring the keys
|
34
36
|
def fetch(keys)
|
35
37
|
models = models(keys: keys).order(:id).load_async
|
36
38
|
dataloader.yield
|
@@ -31,6 +31,8 @@ module GraphQL
|
|
31
31
|
# WHERE "likes"."post_id" IN (1, 2, 3, ...)
|
32
32
|
# GROUP BY "likes"."post_id"
|
33
33
|
class ActiveRecordCount < ActiveRecordBase
|
34
|
+
# @param keys [Array] an array of keys
|
35
|
+
# @return [Array] grouped counts for the keys
|
34
36
|
def fetch(keys)
|
35
37
|
map = models(keys: keys).group(@key).count
|
36
38
|
keys.map { |key| map[key] || 0 }
|
@@ -31,6 +31,8 @@ module GraphQL
|
|
31
31
|
# WHERE "profiles"."user_id" IN (1, 2, 3, ...)
|
32
32
|
# ORDER BY "profiles"."id"
|
33
33
|
class ActiveRecordObject < ActiveRecordBase
|
34
|
+
# @param keys [Array] an array of keys
|
35
|
+
# @return [Array] indexed records mirroring the keys
|
34
36
|
def fetch(keys)
|
35
37
|
models = models(keys: keys).order(:id).load_async
|
36
38
|
dataloader.yield
|
@@ -28,6 +28,8 @@ module GraphQL
|
|
28
28
|
# AND "active_storage_attachments"."record_type" = 'User'
|
29
29
|
# AND "active_storage_attachments"."record_id" IN (...)
|
30
30
|
class ActiveStorageHasManyAttached < ActiveStorageBase
|
31
|
+
# @param records [Array<ActiveRecord::Base>] an array of records
|
32
|
+
# @return [Array] grouped attachments mirroring the keys
|
31
33
|
def fetch(records)
|
32
34
|
attachments = attachments(records: records).load_async
|
33
35
|
dataloader.yield
|
@@ -28,6 +28,8 @@ module GraphQL
|
|
28
28
|
# AND "active_storage_attachments"."record_type" = 'User'
|
29
29
|
# AND "active_storage_attachments"."record_id" IN (...)
|
30
30
|
class ActiveStorageHasOneAttached < ActiveStorageBase
|
31
|
+
# @param records [Array<ActiveRecord::Base>] an array of records
|
32
|
+
# @return [Array] indexed attachments mirroring the keys
|
31
33
|
def fetch(records)
|
32
34
|
attachments = attachments(records: records).load_async
|
33
35
|
dataloader.yield
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Sources
|
5
|
+
# A class for loading with Rails.cache.
|
6
|
+
#
|
7
|
+
# class UserType < GraphQL::Schema::Object
|
8
|
+
# field :location, String, null: false
|
9
|
+
#
|
10
|
+
# def location
|
11
|
+
# dataloader
|
12
|
+
# .with(GraphQL::Sources::RailsCache)
|
13
|
+
# .load(key: "geocode:#{object.latest_ip}", fallback: -> { Geocode.for(object.latest_ip) })
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
class RailsCache < GraphQL::Dataloader::Source
|
17
|
+
# @param operations [Array<Hash>] an array of key and fallback hashes
|
18
|
+
def fetch(operations)
|
19
|
+
keys = operations.pluck(:key)
|
20
|
+
fallbacks = operations.to_h { |operation| [operation[:key], operation[:fallback]] }
|
21
|
+
results = Rails.cache.fetch_multi(*keys) { |key| fallbacks[key].call }
|
22
|
+
keys.map { |key| results[key] }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/graphql/sources.rb
CHANGED
@@ -7,6 +7,7 @@ require_relative './sources/active_record_collection'
|
|
7
7
|
require_relative './sources/active_record_object'
|
8
8
|
require_relative './sources/active_storage_has_many_attached'
|
9
9
|
require_relative './sources/active_storage_has_one_attached'
|
10
|
+
require_relative './sources/rails_cache'
|
10
11
|
|
11
12
|
module GraphQL
|
12
13
|
# A collection of common GraphQL dataloader classes.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-sources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Sylvestre
|
@@ -182,6 +182,7 @@ files:
|
|
182
182
|
- lib/graphql/sources/active_storage_base.rb
|
183
183
|
- lib/graphql/sources/active_storage_has_many_attached.rb
|
184
184
|
- lib/graphql/sources/active_storage_has_one_attached.rb
|
185
|
+
- lib/graphql/sources/rails_cache.rb
|
185
186
|
- lib/graphql/sources/version.rb
|
186
187
|
homepage: https://github.com/ksylvest/graphql-sources
|
187
188
|
licenses:
|