batch-loader 2.0.1 → 2.0.2
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/.github/workflows/tests.yml +27 -0
- data/CHANGELOG.md +5 -1
- data/README.md +35 -4
- data/graphql-latest.gemfile +1 -1
- data/lib/batch_loader/version.rb +1 -1
- data/lib/batch_loader.rb +4 -4
- metadata +4 -4
- data/.travis.yml +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b25f607d37b2fec3d406a5f3451647a9c66e1f6ec061467c3b293ade83d1df06
|
4
|
+
data.tar.gz: ec1ea4291bf48e05ff606ce6de70908b70275c36a39016c361cc7303a33ebf79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31e92589ff20dc24ca93a4d2e3dece6b0dabd42114988e0ddcdea6f49c58f639656ab66219923bdc26e5673c5878e4b95b347d6844f4ec50d5fbf799b8d1e9e1
|
7
|
+
data.tar.gz: e88f2da06cbd50ba0a92c1327a0d4c4193e7656cc48dac405429c34a4f2e66bce67bbd0c1dffab95e53c04ad741eb33f4a35799fe9dc9cfd214f09fdf4d6f95d
|
@@ -0,0 +1,27 @@
|
|
1
|
+
name: Run tests
|
2
|
+
on:
|
3
|
+
- push
|
4
|
+
jobs:
|
5
|
+
run-tests:
|
6
|
+
strategy:
|
7
|
+
fail-fast: false
|
8
|
+
matrix:
|
9
|
+
version:
|
10
|
+
- 3.2.2
|
11
|
+
- 3.1.4
|
12
|
+
- 3.0.6
|
13
|
+
- 2.7.8
|
14
|
+
runs-on: ubuntu-latest
|
15
|
+
env:
|
16
|
+
CI: true
|
17
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/graphql-latest.gemfile
|
18
|
+
steps:
|
19
|
+
- name: Checkout a commit
|
20
|
+
uses: actions/checkout@v4
|
21
|
+
- name: Set up Ruby
|
22
|
+
uses: ruby/setup-ruby@v1
|
23
|
+
with:
|
24
|
+
ruby-version: ${{ matrix.version }}
|
25
|
+
bundler-cache: true
|
26
|
+
- name: Run tests
|
27
|
+
run: bundle exec rspec
|
data/CHANGELOG.md
CHANGED
@@ -8,10 +8,14 @@ one of the following labels: `Added`, `Changed`, `Deprecated`,
|
|
8
8
|
to manage the versions of this gem so
|
9
9
|
that you can set version constraints properly.
|
10
10
|
|
11
|
-
#### [Unreleased](https://github.com/exAspArk/batch-loader/compare/v2.0.
|
11
|
+
#### [Unreleased](https://github.com/exAspArk/batch-loader/compare/v2.0.2...HEAD)
|
12
12
|
|
13
13
|
* WIP
|
14
14
|
|
15
|
+
#### [v2.0.2](https://github.com/exAspArk/batch-loader/compare/v2.0.1...v2.0.2) - 2023-11-22
|
16
|
+
|
17
|
+
* `Fixed`: Compatibility with Ruby 3 kwargs. [#80](https://github.com/exAspArk/batch-loader/pull/80)
|
18
|
+
|
15
19
|
#### [v2.0.1](https://github.com/exAspArk/batch-loader/compare/v2.0.0...v2.0.1) - 2021-02-18
|
16
20
|
|
17
21
|
* `Fixed`: Compatibility with GraphQL and Ruby 3. [#71](https://github.com/exAspArk/batch-loader/pull/71)
|
data/README.md
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# BatchLoader
|
2
2
|
|
3
|
-
[](https://travis-ci.org/exAspArk/batch-loader)
|
4
3
|
[](https://coveralls.io/github/exAspArk/batch-loader)
|
5
4
|
[](https://codeclimate.com/github/exAspArk/batch-loader/maintainability)
|
6
5
|
[](https://rubygems.org/gems/batch-loader)
|
@@ -256,7 +255,7 @@ module Types
|
|
256
255
|
field :user, UserType, null: false
|
257
256
|
|
258
257
|
def user
|
259
|
-
|
258
|
+
object.user # N+1 queries
|
260
259
|
end
|
261
260
|
end
|
262
261
|
end
|
@@ -295,7 +294,7 @@ module Types
|
|
295
294
|
field :user, UserType, null: false
|
296
295
|
|
297
296
|
def user
|
298
|
-
BatchLoader::GraphQL.for(
|
297
|
+
BatchLoader::GraphQL.for(object.user_id).batch do |user_ids, loader|
|
299
298
|
User.where(id: user_ids).each { |user| loader.call(user.id, user) }
|
300
299
|
end
|
301
300
|
end
|
@@ -312,7 +311,39 @@ class MyProjectSchema < GraphQL::Schema
|
|
312
311
|
end
|
313
312
|
```
|
314
313
|
|
315
|
-
|
314
|
+
---
|
315
|
+
|
316
|
+
If you need to use BatchLoader with ActiveRecord in multiple places, you can use this `preload:` helper shared by [Aha!](https://www.aha.io/engineering/articles/automatically-avoiding-graphql-n-1s):
|
317
|
+
|
318
|
+
```rb
|
319
|
+
field :user, UserType, null: false, preload: :user
|
320
|
+
# ^^^^^^^^^^^^^^
|
321
|
+
# Simply add this instead of defining custom `user` method with BatchLoader
|
322
|
+
```
|
323
|
+
|
324
|
+
And add this custom field resolver that uses ActiveRecord's preload functionality with BatchLoader:
|
325
|
+
|
326
|
+
```rb
|
327
|
+
# app/graphql/types/base_object.rb
|
328
|
+
field_class Types::PreloadableField
|
329
|
+
|
330
|
+
# app/graphql/types/preloadable_field.rb
|
331
|
+
class Types::PreloadableField < Types::BaseField
|
332
|
+
def initialize(*args, preload: nil, **kwargs, &block)
|
333
|
+
@preloads = preload
|
334
|
+
super(*args, **kwargs, &block)
|
335
|
+
end
|
336
|
+
|
337
|
+
def resolve(type, args, ctx)
|
338
|
+
return super unless @preloads
|
339
|
+
|
340
|
+
BatchLoader::GraphQL.for(type).batch(key: self) do |records, loader|
|
341
|
+
ActiveRecord::Associations::Preloader.new.preload(records.map(&:object), @preloads)
|
342
|
+
records.each { |r| loader.call(r, super(r, args, ctx)) }
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|
346
|
+
```
|
316
347
|
|
317
348
|
### Loading multiple items
|
318
349
|
|
data/graphql-latest.gemfile
CHANGED
data/lib/batch_loader/version.rb
CHANGED
data/lib/batch_loader.rb
CHANGED
@@ -69,8 +69,8 @@ class BatchLoader
|
|
69
69
|
@cache ? @loaded_value : result
|
70
70
|
end
|
71
71
|
|
72
|
-
def method_missing(method_name, *args, &block)
|
73
|
-
__sync!.public_send(method_name, *args, &block)
|
72
|
+
def method_missing(method_name, *args, **kwargs, &block)
|
73
|
+
__sync!.public_send(method_name, *args, **kwargs, &block)
|
74
74
|
end
|
75
75
|
|
76
76
|
def __sync!
|
@@ -120,8 +120,8 @@ class BatchLoader
|
|
120
120
|
def __replace_with!(value)
|
121
121
|
__singleton_class.class_eval do
|
122
122
|
(value.methods - LEFT_INSTANCE_METHODS).each do |method_name|
|
123
|
-
define_method(method_name) do |*args, &block|
|
124
|
-
value.public_send(method_name, *args, &block)
|
123
|
+
define_method(method_name) do |*args, **kwargs, &block|
|
124
|
+
value.public_send(method_name, *args, **kwargs, &block)
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: batch-loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- exAspArk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -115,9 +115,9 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
+
- ".github/workflows/tests.yml"
|
118
119
|
- ".gitignore"
|
119
120
|
- ".rspec"
|
120
|
-
- ".travis.yml"
|
121
121
|
- CHANGELOG.md
|
122
122
|
- CODE_OF_CONDUCT.md
|
123
123
|
- Gemfile
|
@@ -154,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
154
|
- !ruby/object:Gem::Version
|
155
155
|
version: '0'
|
156
156
|
requirements: []
|
157
|
-
rubygems_version: 3.
|
157
|
+
rubygems_version: 3.4.19
|
158
158
|
signing_key:
|
159
159
|
specification_version: 4
|
160
160
|
summary: Powerful tool to avoid N+1 DB or HTTP queries
|