graphql-fragment_cache 1.19.0 → 1.20.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4dd3472ddcbe18e4c306b81770b5a9fa2dbe306968d1e16f2d98e81630bfec8
4
- data.tar.gz: 96c8cd920f0e46041c803527bbe3679841daa169aae82db6d627747eaf4632b9
3
+ metadata.gz: 1290ae93c3ed819164a80214348eb8539ca1f502d66494c78b67a70442cc377f
4
+ data.tar.gz: 90bab17ae895c6164ae77da598d7afa3073ca0e0cb6b6f21f848fc4038d71a89
5
5
  SHA512:
6
- metadata.gz: c308ffcdfdb6fc7529ec3d094109cf7d21db8380b598435d6274e5b1f89a14110ece6fda565d9bc6429ae907066795597c8815f3e745c9a646033d246b2d1f2d
7
- data.tar.gz: 806ef15a72ca9eec45e4cde2e35ba43ceb29194c9ed23d77aa776bd3721a77f4d1b04ae8dc3d189e285be12a3cacd5dd1415faba7f57c745c55cb505eca6322e
6
+ metadata.gz: ae23bb92581ad0a5527516675ea08ad1668ea98dc6bf63e85411576f5e1321a5db679c0fe24111abdd1db8629577d67bfc5f2223f9cca69c7c94ca3f57cd779a
7
+ data.tar.gz: 07b1772b1862c3a7905894321b17ddf8b3beec3520565e654530b185d269746f8f94c3fa397fa9707bf41afbcb51cc5d6332b81fd2f571d492aab1d05c66529b
data/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.20.1 (2024-04-03)
6
+
7
+ - [PR#112](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/112) fix tracer deprecation warnings ([@diegofigueroa][])
8
+ - [PR#109](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/109) Remove `Lookahead` patch in modern versions of graphql-ruby ([@DmitryTsepelev][])
9
+
10
+ ## 1.20.0 (2024-03-02)
11
+
12
+ - [PR#108](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/108) Use trace_with instead of deprecated instrument method ([@camero2734][])
13
+
5
14
  ## 1.19.0 (2023-11-03)
6
15
 
7
16
  - [PR#104](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/104) Support graphql-ruby 2.1.4 ([@DmitryTsepelev][])
@@ -181,3 +190,5 @@
181
190
  [@frostmark]: https://github.com/frostmark
182
191
  [@KTSCode]: https://github.com/KTSCode
183
192
  [@rince]: https://github.com/rince
193
+ [@camero2734]: https://github.com/camero2734
194
+ [@diegofigueroa]: https://github.com/diegofigueroa
@@ -76,7 +76,7 @@ module GraphQL
76
76
  arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
77
77
  @ast_nodes.each do |ast_node|
78
78
  ast_node.selections.each do |selection|
79
- if GraphQL::FragmentCache.graphql_ruby_after_2_0_13?
79
+ if GraphQL::FragmentCache.graphql_ruby_after_2_0_13? && GraphQL::FragmentCache.graphql_ruby_before_2_1_4?
80
80
  find_selected_nodes(selection, next_field_defn, arguments: arguments, matches: next_nodes)
81
81
  else
82
82
  find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
@@ -212,7 +212,7 @@ module GraphQL
212
212
  end
213
213
 
214
214
  def object_key(obj)
215
- ((!obj.nil?) || nil) && obj._graphql_cache_key
215
+ ((((__safe_lvar__ = obj) || true) && (!__safe_lvar__.nil? || nil)) && __safe_lvar__._graphql_cache_key)
216
216
  end
217
217
  end
218
218
  end
@@ -33,13 +33,13 @@ module GraphQL
33
33
 
34
34
  def read(key)
35
35
  key = key.to_s
36
- ((!storage[key].nil?) || nil) && storage[key].then do |entry|
36
+ ((((__safe_lvar__ = storage[key]) || true) && (!__safe_lvar__.nil? || nil)) && __safe_lvar__.then { |entry|
37
37
  if entry.expired?
38
38
  delete(key)
39
39
  next
40
40
  end
41
41
  entry.value
42
- end
42
+ })
43
43
  end
44
44
 
45
45
  def write(key, value, options = {})
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module FragmentCache
5
+ using Ext
6
+
7
+ class WriteError < StandardError
8
+ attr_reader :key, :value, :original_error
9
+
10
+ def initialize(original_error, key, value)
11
+ @original_error = original_error
12
+ @key = key
13
+ @value = value
14
+
15
+ super(original_error.message)
16
+ end
17
+ end
18
+
19
+ class WriteMultiError < StandardError
20
+ attr_reader :values, :original_error
21
+
22
+ def initialize(original_error, values)
23
+ @original_error = original_error
24
+ @values = values
25
+
26
+ super(original_error.message)
27
+ end
28
+ end
29
+
30
+ # Saves resolved fragment values to cache store
31
+ module Cacher
32
+ class << self
33
+ def call(query)
34
+ return unless query.context.fragments?
35
+
36
+ if FragmentCache.cache_store.respond_to?(:write_multi)
37
+ batched_persist(query)
38
+ else
39
+ persist(query)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def batched_persist(query)
46
+ select_valid_fragments(query).group_by(&:options).each do |options, group|
47
+ hash = group.map { |fragment| [fragment.cache_key, fragment.value] }.to_h
48
+
49
+ begin
50
+ FragmentCache.cache_store.write_multi(hash, options)
51
+ rescue => e
52
+ raise WriteMultiError.new(e, hash)
53
+ end
54
+ end
55
+ end
56
+
57
+ def persist(query)
58
+ select_valid_fragments(query).each do |fragment|
59
+ begin;FragmentCache.cache_store.write(fragment.cache_key, fragment.value, fragment.options)
60
+ rescue => e
61
+ raise WriteError.new(e, fragment.cache_key, fragment.value), e;end
62
+ end
63
+ end
64
+
65
+ def select_valid_fragments(query)
66
+ query.context.fragments.select(&:with_final_value?)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -76,7 +76,7 @@ module GraphQL
76
76
  arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
77
77
  @ast_nodes.each do |ast_node|
78
78
  ast_node.selections.each do |selection|
79
- if GraphQL::FragmentCache.graphql_ruby_after_2_0_13?
79
+ if GraphQL::FragmentCache.graphql_ruby_after_2_0_13? && GraphQL::FragmentCache.graphql_ruby_before_2_1_4?
80
80
  find_selected_nodes(selection, next_field_defn, arguments: arguments, matches: next_nodes)
81
81
  else
82
82
  find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
@@ -53,64 +53,66 @@ module GraphQL
53
53
  alias_selection(name, **kwargs)
54
54
  end
55
55
 
56
- def alias_selection(name, selected_type: @selected_type, arguments: nil)
57
- return alias_selections[name] if alias_selections.key?(name)
56
+ if GraphRubyVersion.before_2_1_4?
57
+ def alias_selection(name, selected_type: @selected_type, arguments: nil)
58
+ return alias_selections[name] if alias_selections.key?(name)
58
59
 
59
- alias_node = lookup_alias_node(ast_nodes, name)
60
- return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
60
+ alias_node = lookup_alias_node(ast_nodes, name)
61
+ return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
61
62
 
62
- next_field_name = alias_node.name
63
+ next_field_name = alias_node.name
63
64
 
64
- # From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
65
- next_field_defn =
66
- if GraphQL::FragmentCache.graphql_ruby_before_2_0?
67
- get_class_based_field(selected_type, next_field_name)
68
- else
69
- @query.get_field(selected_type, next_field_name)
70
- end
65
+ # From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
66
+ next_field_defn =
67
+ if GraphRubyVersion.before_2_0?
68
+ get_class_based_field(selected_type, next_field_name)
69
+ else
70
+ @query.get_field(selected_type, next_field_name)
71
+ end
71
72
 
72
- alias_selections[name] =
73
- if next_field_defn
74
- next_nodes = []
75
- arguments = @query.arguments_for(alias_node, next_field_defn)
76
- arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
77
- @ast_nodes.each do |ast_node|
78
- ast_node.selections.each do |selection|
79
- if GraphQL::FragmentCache.graphql_ruby_after_2_0_13? && GraphQL::FragmentCache.graphql_ruby_before_2_1_4?
80
- find_selected_nodes(selection, next_field_defn, arguments: arguments, matches: next_nodes)
81
- else
82
- find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
73
+ alias_selections[name] =
74
+ if next_field_defn
75
+ next_nodes = []
76
+ arguments = @query.arguments_for(alias_node, next_field_defn)
77
+ arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
78
+ @ast_nodes.each do |ast_node|
79
+ ast_node.selections.each do |selection|
80
+ if GraphRubyVersion.after_2_0_13? && GraphRubyVersion.before_2_1_4?
81
+ find_selected_nodes(selection, next_field_defn, arguments: arguments, matches: next_nodes)
82
+ else
83
+ find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
84
+ end
83
85
  end
84
86
  end
85
- end
86
87
 
87
- if next_nodes.any?
88
- ::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
88
+ if next_nodes.any?
89
+ ::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
90
+ else
91
+ ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
92
+ end
89
93
  else
90
94
  ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
91
95
  end
92
- else
93
- ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
94
- end
95
- end
96
+ end
96
97
 
97
- def alias_selections
98
- return @alias_selections if defined?(@alias_selections)
99
- @alias_selections ||= {}
100
- end
98
+ def alias_selections
99
+ return @alias_selections if defined?(@alias_selections)
100
+ @alias_selections ||= {}
101
+ end
101
102
 
102
- def lookup_alias_node(nodes, name)
103
- return if nodes.empty?
103
+ def lookup_alias_node(nodes, name)
104
+ return if nodes.empty?
104
105
 
105
- nodes.find do |node|
106
- if node.is_a?(GraphQL::Language::Nodes::FragmentSpread)
107
- node = @query.fragments[node.name]
108
- raise("Invariant: Can't look ahead to nonexistent fragment #{node.name} (found: #{@query.fragments.keys})") unless node
109
- end
106
+ nodes.find do |node|
107
+ if node.is_a?(GraphQL::Language::Nodes::FragmentSpread)
108
+ node = @query.fragments[node.name]
109
+ raise("Invariant: Can't look ahead to nonexistent fragment #{node.name} (found: #{@query.fragments.keys})") unless node
110
+ end
110
111
 
111
- return node if node.alias?(name)
112
- child = lookup_alias_node(node.children, name)
113
- return child if child
112
+ return node if node.alias?(name)
113
+ child = lookup_alias_node(node.children, name)
114
+ return child if child
115
+ end
114
116
  end
115
117
  end
116
118
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ using RubyNext
4
+
5
+ module GraphQL
6
+ module FragmentCache
7
+ module GraphRubyVersion
8
+ module_function
9
+
10
+ def before_2_0?
11
+ check_graphql_version "< 2.0.0"
12
+ end
13
+
14
+ def after_2_0_13?
15
+ check_graphql_version "> 2.0.13"
16
+ end
17
+
18
+ def before_2_1_4?
19
+ check_graphql_version "< 2.1.4"
20
+ end
21
+
22
+ def after_2_2_5?
23
+ check_graphql_version "> 2.2.5"
24
+ end
25
+
26
+ def check_graphql_version(predicate)
27
+ Gem::Dependency.new("graphql", predicate).match?("graphql", GraphQL::VERSION)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module FragmentCache
5
- VERSION = "1.19.0"
5
+ VERSION = "1.20.1"
6
6
  end
7
7
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require "graphql"
4
4
 
5
+ require "graphql/fragment_cache/graphql_ruby_version"
6
+
5
7
  require "graphql/fragment_cache/ext/context_fragments"
6
8
  require "graphql/fragment_cache/ext/graphql_cache_key"
7
9
  require "graphql/fragment_cache/object"
@@ -31,8 +33,14 @@ module GraphQL
31
33
  def use(schema_defn, options = {})
32
34
  verify_interpreter_and_analysis!(schema_defn)
33
35
 
34
- schema_defn.tracer(Schema::Tracer)
35
- schema_defn.instrument(:query, Schema::Instrumentation)
36
+ if GraphRubyVersion.after_2_2_5?
37
+ schema_defn.trace_with(GraphQL::Tracing::LegacyHooksTrace)
38
+ schema_defn.instance_exec { own_instrumenters[:query] << Schema::Instrumentation }
39
+ else
40
+ schema_defn.tracer(Schema::Tracer)
41
+ schema_defn.instrument(:query, Schema::Instrumentation)
42
+ end
43
+
36
44
  schema_defn.extend(Schema::Patch)
37
45
  schema_defn.lazy_resolve(Schema::LazyCacheResolver, :resolve)
38
46
 
@@ -57,18 +65,6 @@ module GraphQL
57
65
 
58
66
  alias_method :skip_cache_when_query_has_errors?, :skip_cache_when_query_has_errors
59
67
 
60
- def graphql_ruby_before_2_0?
61
- check_graphql_version "< 2.0.0"
62
- end
63
-
64
- def graphql_ruby_after_2_0_13?
65
- check_graphql_version "> 2.0.13"
66
- end
67
-
68
- def graphql_ruby_before_2_1_4?
69
- check_graphql_version "< 2.1.4"
70
- end
71
-
72
68
  private
73
69
 
74
70
  def check_graphql_version(predicate)
@@ -76,7 +72,7 @@ module GraphQL
76
72
  end
77
73
 
78
74
  def verify_interpreter_and_analysis!(schema_defn)
79
- if graphql_ruby_before_2_0?
75
+ if GraphRubyVersion.before_2_0?
80
76
  unless schema_defn.interpreter?
81
77
  raise StandardError,
82
78
  "GraphQL::Execution::Interpreter should be enabled for fragment caching"
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.19.0
4
+ version: 1.20.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - DmitryTsepelev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-03 00:00:00.000000000 Z
11
+ date: 2024-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.10.0
33
+ version: 0.15.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.10.0
40
+ version: 0.15.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: combustion
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - '='
144
144
  - !ruby/object:Gem::Version
145
- version: 0.4.9
145
+ version: 0.6.0
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
- version: 0.4.9
152
+ version: 0.6.0
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: graphql-batch
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -168,16 +168,16 @@ dependencies:
168
168
  name: parser
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - '='
171
+ - - ">="
172
172
  - !ruby/object:Gem::Version
173
- version: 3.1.2.1
173
+ version: '0'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - '='
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
- version: 3.1.2.1
180
+ version: '0'
181
181
  description: Fragment cache for graphql-ruby
182
182
  email:
183
183
  - dmitry.a.tsepelev@gmail.com
@@ -192,6 +192,7 @@ files:
192
192
  - bin/setup
193
193
  - lib/.rbnext/2.3/graphql/fragment_cache/cache_key_builder.rb
194
194
  - lib/.rbnext/2.3/graphql/fragment_cache/memory_store.rb
195
+ - lib/.rbnext/2.5/graphql/fragment_cache/cacher.rb
195
196
  - lib/.rbnext/2.7/graphql/fragment_cache/cache_key_builder.rb
196
197
  - lib/.rbnext/2.7/graphql/fragment_cache/ext/graphql_cache_key.rb
197
198
  - lib/graphql-fragment_cache.rb
@@ -203,6 +204,7 @@ files:
203
204
  - lib/graphql/fragment_cache/ext/graphql_cache_key.rb
204
205
  - lib/graphql/fragment_cache/field_extension.rb
205
206
  - lib/graphql/fragment_cache/fragment.rb
207
+ - lib/graphql/fragment_cache/graphql_ruby_version.rb
206
208
  - lib/graphql/fragment_cache/memory_store.rb
207
209
  - lib/graphql/fragment_cache/object.rb
208
210
  - lib/graphql/fragment_cache/object_helpers.rb
@@ -228,7 +230,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
228
230
  requirements:
229
231
  - - ">="
230
232
  - !ruby/object:Gem::Version
231
- version: '2.6'
233
+ version: '3.0'
232
234
  required_rubygems_version: !ruby/object:Gem::Requirement
233
235
  requirements:
234
236
  - - ">="