graphql-fragment_cache 1.21.0 → 1.22.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a13fb7ec2904be7d61b8f2ff020cc131d794f77cda87f9ea0cca5a71850055d8
4
- data.tar.gz: 4c04a9f8aed82998a96c28334b6fc0a3dc06de61d8c0d9e6eb7287dc8b378076
3
+ metadata.gz: c2f7385deb55dd824ed24ca60059bba372ad645bd2d1a183dee49089b2788648
4
+ data.tar.gz: 991e976fc7d2a6451e7362e6d899829511d4979544aaf2f01cff25b210782f47
5
5
  SHA512:
6
- metadata.gz: 4347bed71acb7657604b0ede1bccf075fffc00429697dc6c05cd26fa169ed19e58325f542a94b964f2129b4b25c3656c74d4e567440cfd848f5514e3ed1dd9c0
7
- data.tar.gz: 42f0f52fe8d48d386c1bbc4a931eb3ff08d63164f2fd18f10d77830f044df496c27702f2af383117f685ae3eda1df7717f948d978ba42cb5fa812931a827147d
6
+ metadata.gz: 07ac9a5d1ba73da5561a7c433499486986ccbc9b70c07ea2aaf22b4781d331cd16ca8e9e05005cea2031d5955a188cb5d96431d04439ae229ad97441d913627c
7
+ data.tar.gz: b9fb29e2a1d1a3bf24808b6186802d4c093764d11a5b80b07e6db8cb97c9454dbff6b878bd5c3767288ff551ee560573ce8ec3834fb01375a3a24aee312bad1c
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.22.0 (2025-02-20)
6
+
7
+ - [PR#134](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/134) Add possibility to include and exclude arguments from generated cache key ([@mgruner][])
8
+
5
9
  ## 1.21.0 (2025-02-01)
6
10
 
7
11
  - [PR#130](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/130) Dataloader support ([@DmitryTsepelev][])
@@ -217,3 +221,4 @@
217
221
  [@noma4i]: https://github.com/noma4i
218
222
  [@Drowze]: https://github.com/Drowze
219
223
  [@danielhartnell]: https://github.com/danielhartnell
224
+ [@mgruner]: https://github.com/mgruner
data/README.md CHANGED
@@ -147,6 +147,34 @@ class QueryType < BaseObject
147
147
  end
148
148
  ```
149
149
 
150
+ ### Query arguments processing
151
+
152
+ You can influence the way that graphql arguments are include in the cache key.
153
+
154
+ A use case might be a `:renew_cache` parameter that can be used to force a cache rewrite,
155
+ but should not be included with the cache key itself. Use `cache_key: { exclude_arguments: […]}`
156
+ to specify a list of arguments to be excluded from the implicit cache key.
157
+
158
+ ```ruby
159
+ class QueryType < BaseObject
160
+ field :post, PostType, null: true do
161
+ argument :id, ID, required: true
162
+ argument :renew_cache, Boolean, required: false
163
+ end
164
+
165
+ def post(id:, renew_cache: false)
166
+ if renew_cache
167
+ context.scoped_set!(:renew_cache, true)
168
+ end
169
+ cache_fragment(cache_key: {exclude_arguments: [:renew_cache]}) { Post.find(id) }
170
+ end
171
+ end
172
+ ```
173
+
174
+ Likewise, you can use `cache_key: { include_arguments: […] }` to specify an allowlist of arguments
175
+ to be included in the cache key. In this case all arguments for the cache key must be specified, including
176
+ parent arguments of nested fields.
177
+
150
178
  ### User-provided cache key (custom key)
151
179
 
152
180
  In most cases you want your cache key to depend on the resolved object (say, `ActiveRecord` model). You can do that by passing an argument to the `#cache_fragment` method in a similar way to Rails views [`#cache` method](https://guides.rubyonrails.org/caching_with_rails.html#fragment-caching):
@@ -130,16 +130,26 @@ module GraphQL
130
130
 
131
131
  next lookahead.field.name if lookahead.arguments.empty?
132
132
 
133
- args = lookahead.arguments.map { "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
133
+ args = lookahead.arguments.select { include_argument?(_1) }.map { "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
134
134
  "#{lookahead.field.name}(#{args})"
135
135
  }.join("/")
136
136
  end
137
137
  end
138
138
 
139
+ def include_argument?(argument_name)
140
+ exclude_arguments = @options.dig(:cache_key, :exclude_arguments)
141
+ return false if exclude_arguments&.include?(argument_name)
142
+
143
+ include_arguments = @options.dig(:cache_key, :include_arguments)
144
+ return false if include_arguments && !include_arguments.include?(argument_name)
145
+
146
+ true
147
+ end
148
+
139
149
  def traverse_argument(argument)
140
150
  return argument unless argument.is_a?(GraphQL::Schema::InputObject)
141
151
 
142
- "{#{argument.map { "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
152
+ "{#{argument.map { include_argument?(_1) ? "#{_1}:#{traverse_argument(_2)}" : nil }.compact.sort.join(",")}}"
143
153
  end
144
154
 
145
155
  def object_cache_key
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module FragmentCache
5
- VERSION = "1.21.0"
5
+ VERSION = "1.22.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-fragment_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.21.0
4
+ version: 1.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DmitryTsepelev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-01 00:00:00.000000000 Z
11
+ date: 2025-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql