graphql-fragment_cache 1.10.0 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c0987cb1e081b19356cfd389164150d7678c2fff2a479986f56e157ac485e79
4
- data.tar.gz: 72cc6cf9a79c003be0c83dc60447840128ba1d8395e60171ce26a5eaf8190f2b
3
+ metadata.gz: 66fc20ed7d15e85c1d4ce2890d6b28c368a75e3e06ef69ff186470b5a0953567
4
+ data.tar.gz: 4d0d3f12716b8d4d5be627411121cbdba2d067991ea1d6874f3b2891f2636a4a
5
5
  SHA512:
6
- metadata.gz: 78be339e321b1c76066e63960d615d85fc286531ba663eef4af3c62baee8b3d598867047cf1c52ca6085b7fca3cbd86ec0038718548e014aff5c8273740a3c9a
7
- data.tar.gz: 005efd512fba6e4f91ba5aec08637ce058217f7c2e580ef4afa8c6323fef035a70c72a5abd74d418892f02b607b6e5fff288adfb9830ee9125985b852153775e
6
+ metadata.gz: 5758f73fc04e6e63246b6d21899891220f4e7a7733561a72b6b652a26a6f7bd602425d95d14d2711f15a90865caf907d78244c253243541fd414fa59c93c4954
7
+ data.tar.gz: bea6d191cdaba4f7b5ed13250c1d5aaec02e0aafbd44cc8b9d29f5a8dba3718f43db62f683df01d3946ff611603f6dd5a6bba2001344ada4d29143c8aae8291a
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.11.0 (2022-02-26)
6
+
7
+ - [PR#79](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/79) Support graphql-ruby 2.0.0 ([@DmitryTsepelev][])
8
+
5
9
  ## 1.10.0 (2022-01-30)
6
10
 
7
11
  - [PR#77](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/77) Drop Ruby 2.5 support, add Ruby 3.0 ([@DmitryTsepelev][])
data/README.md CHANGED
@@ -17,13 +17,10 @@ end
17
17
 
18
18
  ## Getting started
19
19
 
20
- Add the gem to your Gemfile `gem 'graphql-fragment_cache'` and add the plugin to your schema class (make sure to turn interpreter mode on with AST analysis!):
20
+ Add the gem to your Gemfile `gem 'graphql-fragment_cache'` and add the plugin to your schema class:
21
21
 
22
22
  ```ruby
23
23
  class GraphqSchema < GraphQL::Schema
24
- use GraphQL::Execution::Interpreter
25
- use GraphQL::Analysis::AST
26
-
27
24
  use GraphQL::FragmentCache
28
25
 
29
26
  query QueryType
@@ -69,15 +66,6 @@ class QueryType < BaseObject
69
66
  end
70
67
  ```
71
68
 
72
- If you use [connections](https://graphql-ruby.org/pagination/connection_concepts.html) and plan to cache them—please turn on [brand new](https://github.com/rmosolgo/graphql-ruby/blob/master/lib/graphql/pagination/connections.rb#L5) connections hierarchy in your schema:
73
-
74
- ```ruby
75
- class GraphqSchema < GraphQL::Schema
76
- # ...
77
- use GraphQL::Pagination::Connections
78
- end
79
- ```
80
-
81
69
  ## Cache key generation
82
70
 
83
71
  Cache keys consist of the following parts: namespace, implicit key, and explicit key.
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "digest"
5
+
6
+ using RubyNext
7
+
8
+ module GraphQL
9
+ module FragmentCache
10
+ using Ext
11
+
12
+ using(Module.new {
13
+ refine Array do
14
+ def traverse_argument(argument)
15
+ return argument unless argument.is_a?(GraphQL::Schema::InputObject)
16
+
17
+ "{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
18
+ end
19
+
20
+ def to_selections_key
21
+ map { |val|
22
+ children = val.selections.empty? ? "" : "[#{val.selections.to_selections_key}]"
23
+
24
+ field_name = val.field.name
25
+ field_alias = val.ast_nodes.map(&:alias).join
26
+ field_name = "#{field_alias}:#{field_name}" unless field_alias.empty?
27
+
28
+ unless val.arguments.empty?
29
+ args = val.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
30
+ field_name += "(#{args})"
31
+ end
32
+
33
+ "#{field_name}#{children}"
34
+ }.join(".")
35
+ end
36
+ end
37
+
38
+ refine ::GraphQL::Language::Nodes::AbstractNode do
39
+ def alias?(_)
40
+ false
41
+ end
42
+ end
43
+
44
+ refine ::GraphQL::Language::Nodes::Field do
45
+ def alias?(val)
46
+ self.alias == val
47
+ end
48
+ end
49
+
50
+ refine ::GraphQL::Execution::Lookahead do
51
+ def selection_with_alias(name, **kwargs)
52
+ return selection(name, **kwargs) if selects?(name, **kwargs)
53
+ alias_selection(name, **kwargs)
54
+ end
55
+
56
+ def alias_selection(name, selected_type: @selected_type, arguments: nil)
57
+ return alias_selections[name] if alias_selections.key?(name)
58
+
59
+ alias_node = lookup_alias_node(ast_nodes, name)
60
+ return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
61
+
62
+ next_field_name = alias_node.name
63
+
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
71
+
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
+ find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
80
+ end
81
+ end
82
+
83
+ if next_nodes.any?
84
+ ::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
85
+ else
86
+ ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
87
+ end
88
+ else
89
+ ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
90
+ end
91
+ end
92
+
93
+ def alias_selections
94
+ return @alias_selections if defined?(@alias_selections)
95
+ @alias_selections ||= {}
96
+ end
97
+
98
+ def lookup_alias_node(nodes, name)
99
+ return if nodes.empty?
100
+
101
+ nodes.find do |node|
102
+ if node.is_a?(GraphQL::Language::Nodes::FragmentSpread)
103
+ node = @query.fragments[node.name]
104
+ raise("Invariant: Can't look ahead to nonexistent fragment #{node.name} (found: #{@query.fragments.keys})") unless node
105
+ end
106
+
107
+ return node if node.alias?(name)
108
+ child = lookup_alias_node(node.children, name)
109
+ return child if child
110
+ end
111
+ end
112
+ end
113
+ })
114
+
115
+ # Builds cache key for fragment
116
+ class CacheKeyBuilder
117
+ using RubyNext
118
+
119
+ class << self
120
+ def call(**options)
121
+ new(**options).build
122
+ end
123
+ end
124
+
125
+ attr_reader :query, :path, :object, :schema
126
+
127
+ def initialize(object: nil, query:, path:, **options)
128
+ @object = object
129
+ @query = query
130
+ @schema = query.schema
131
+ @path = path
132
+ @options = options
133
+ end
134
+
135
+ def build
136
+ [
137
+ GraphQL::FragmentCache.namespace,
138
+ implicit_cache_key,
139
+ object_cache_key
140
+ ].compact.join("/")
141
+ end
142
+
143
+ private
144
+
145
+ def implicit_cache_key
146
+ Digest::SHA1.hexdigest("#{schema_cache_key}/#{query_cache_key}")
147
+ end
148
+
149
+ def schema_cache_key
150
+ @options.fetch(:schema_cache_key) { schema.schema_cache_key }
151
+ end
152
+
153
+ def query_cache_key
154
+ @options.fetch(:query_cache_key) { "#{path_cache_key}[#{selections_cache_key}]" }
155
+ end
156
+
157
+ def selections_cache_key
158
+ current_root =
159
+ path.reduce(query.lookahead) { |lkhd, field_name|
160
+ # Handle cached fields inside collections:
161
+ next lkhd if field_name.is_a?(Integer)
162
+
163
+ lkhd.selection_with_alias(field_name)
164
+ }
165
+
166
+ current_root.selections.to_selections_key
167
+ end
168
+
169
+ def path_cache_key
170
+ @options.fetch(:path_cache_key) do
171
+ lookahead = query.lookahead
172
+
173
+ path.map { |field_name|
174
+ # Handle cached fields inside collections:
175
+ next field_name if field_name.is_a?(Integer)
176
+
177
+ lookahead = lookahead.selection_with_alias(field_name)
178
+ raise "Failed to look ahead the field: #{field_name}" if lookahead.is_a?(::GraphQL::Execution::Lookahead::NullLookahead)
179
+
180
+ next lookahead.field.name if lookahead.arguments.empty?
181
+
182
+ args = lookahead.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
183
+ "#{lookahead.field.name}(#{args})"
184
+ }.join("/")
185
+ end
186
+ end
187
+
188
+ def traverse_argument(argument)
189
+ return argument unless argument.is_a?(GraphQL::Schema::InputObject)
190
+
191
+ "{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
192
+ end
193
+
194
+ def object_cache_key
195
+ @options[:object_cache_key] || object_key(object)
196
+ end
197
+
198
+ def object_key(obj)
199
+ ((!obj.nil?) || nil) && obj._graphql_cache_key
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ using RubyNext
4
+
5
+ module GraphQL
6
+ module FragmentCache
7
+ # Memory adapter for storing cached fragments
8
+ class MemoryStore
9
+ using RubyNext
10
+
11
+ class Entry < Struct.new(:value, :expires_at, keyword_init: true)
12
+ def expired?
13
+ expires_at && expires_at < Time.now
14
+ end
15
+ end
16
+
17
+ attr_reader :default_expires_in
18
+
19
+ def initialize(expires_in: nil, **other)
20
+ raise ArgumentError, "Unsupported options: #{other.keys.join(",")}" unless other.empty?
21
+
22
+ @default_expires_in = expires_in
23
+ @storage = {}
24
+ end
25
+
26
+ def keys
27
+ storage.keys
28
+ end
29
+
30
+ def exist?(key)
31
+ storage.key?(key)
32
+ end
33
+
34
+ def read(key)
35
+ key = key.to_s
36
+ ((!storage[key].nil?) || nil) && storage[key].then do |entry|
37
+ if entry.expired?
38
+ delete(key)
39
+ next
40
+ end
41
+ entry.value
42
+ end
43
+ end
44
+
45
+ def write(key, value, expires_in: default_expires_in, **options)
46
+ key = key.to_s
47
+ @storage[key] = Entry.new(value: value, expires_at: expires_in ? Time.now + expires_in : nil)
48
+ end
49
+
50
+ def delete(key)
51
+ key = key.to_s
52
+ storage.delete(key)
53
+ end
54
+
55
+ def clear
56
+ storage.clear
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :storage
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "digest"
5
+
6
+ using RubyNext
7
+
8
+ module GraphQL
9
+ module FragmentCache
10
+ using Ext
11
+
12
+ using(Module.new {
13
+ refine Array do
14
+ def traverse_argument(argument)
15
+ return argument unless argument.is_a?(GraphQL::Schema::InputObject)
16
+
17
+ "{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
18
+ end
19
+
20
+ def to_selections_key
21
+ map { |val|
22
+ children = val.selections.empty? ? "" : "[#{val.selections.to_selections_key}]"
23
+
24
+ field_name = val.field.name
25
+ field_alias = val.ast_nodes.map(&:alias).join
26
+ field_name = "#{field_alias}:#{field_name}" unless field_alias.empty?
27
+
28
+ unless val.arguments.empty?
29
+ args = val.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
30
+ field_name += "(#{args})"
31
+ end
32
+
33
+ "#{field_name}#{children}"
34
+ }.join(".")
35
+ end
36
+ end
37
+
38
+ refine ::GraphQL::Language::Nodes::AbstractNode do
39
+ def alias?(_)
40
+ false
41
+ end
42
+ end
43
+
44
+ refine ::GraphQL::Language::Nodes::Field do
45
+ def alias?(val)
46
+ self.alias == val
47
+ end
48
+ end
49
+
50
+ refine ::GraphQL::Execution::Lookahead do
51
+ def selection_with_alias(name, **kwargs)
52
+ return selection(name, **kwargs) if selects?(name, **kwargs)
53
+ alias_selection(name, **kwargs)
54
+ end
55
+
56
+ def alias_selection(name, selected_type: @selected_type, arguments: nil)
57
+ return alias_selections[name] if alias_selections.key?(name)
58
+
59
+ alias_node = lookup_alias_node(ast_nodes, name)
60
+ return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
61
+
62
+ next_field_name = alias_node.name
63
+
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
71
+
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
+ find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
80
+ end
81
+ end
82
+
83
+ if next_nodes.any?
84
+ ::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
85
+ else
86
+ ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
87
+ end
88
+ else
89
+ ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
90
+ end
91
+ end
92
+
93
+ def alias_selections
94
+ return @alias_selections if defined?(@alias_selections)
95
+ @alias_selections ||= {}
96
+ end
97
+
98
+ def lookup_alias_node(nodes, name)
99
+ return if nodes.empty?
100
+
101
+ nodes.find do |node|
102
+ if node.is_a?(GraphQL::Language::Nodes::FragmentSpread)
103
+ node = @query.fragments[node.name]
104
+ raise("Invariant: Can't look ahead to nonexistent fragment #{node.name} (found: #{@query.fragments.keys})") unless node
105
+ end
106
+
107
+ return node if node.alias?(name)
108
+ child = lookup_alias_node(node.children, name)
109
+ return child if child
110
+ end
111
+ end
112
+ end
113
+ })
114
+
115
+ # Builds cache key for fragment
116
+ class CacheKeyBuilder
117
+ using RubyNext
118
+
119
+ class << self
120
+ def call(**options)
121
+ new(**options).build
122
+ end
123
+ end
124
+
125
+ attr_reader :query, :path, :object, :schema
126
+
127
+ def initialize(object: nil, query:, path:, **options)
128
+ @object = object
129
+ @query = query
130
+ @schema = query.schema
131
+ @path = path
132
+ @options = options
133
+ end
134
+
135
+ def build
136
+ [
137
+ GraphQL::FragmentCache.namespace,
138
+ implicit_cache_key,
139
+ object_cache_key
140
+ ].compact.join("/")
141
+ end
142
+
143
+ private
144
+
145
+ def implicit_cache_key
146
+ Digest::SHA1.hexdigest("#{schema_cache_key}/#{query_cache_key}")
147
+ end
148
+
149
+ def schema_cache_key
150
+ @options.fetch(:schema_cache_key) { schema.schema_cache_key }
151
+ end
152
+
153
+ def query_cache_key
154
+ @options.fetch(:query_cache_key) { "#{path_cache_key}[#{selections_cache_key}]" }
155
+ end
156
+
157
+ def selections_cache_key
158
+ current_root =
159
+ path.reduce(query.lookahead) { |lkhd, field_name|
160
+ # Handle cached fields inside collections:
161
+ next lkhd if field_name.is_a?(Integer)
162
+
163
+ lkhd.selection_with_alias(field_name)
164
+ }
165
+
166
+ current_root.selections.to_selections_key
167
+ end
168
+
169
+ def path_cache_key
170
+ @options.fetch(:path_cache_key) do
171
+ lookahead = query.lookahead
172
+
173
+ path.map { |field_name|
174
+ # Handle cached fields inside collections:
175
+ next field_name if field_name.is_a?(Integer)
176
+
177
+ lookahead = lookahead.selection_with_alias(field_name)
178
+ raise "Failed to look ahead the field: #{field_name}" if lookahead.is_a?(::GraphQL::Execution::Lookahead::NullLookahead)
179
+
180
+ next lookahead.field.name if lookahead.arguments.empty?
181
+
182
+ args = lookahead.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
183
+ "#{lookahead.field.name}(#{args})"
184
+ }.join("/")
185
+ end
186
+ end
187
+
188
+ def traverse_argument(argument)
189
+ return argument unless argument.is_a?(GraphQL::Schema::InputObject)
190
+
191
+ "{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
192
+ end
193
+
194
+ def object_cache_key
195
+ @options[:object_cache_key] || object_key(object)
196
+ end
197
+
198
+ def object_key(obj)
199
+ obj&._graphql_cache_key
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module FragmentCache
5
+ module Ext
6
+ # Adds #_graphql_cache_key method to Object,
7
+ # which just call #graphql_cache_key or #cache_key.
8
+ #
9
+ # For other core classes returns string representation.
10
+ #
11
+ # Raises ArgumentError otherwise.
12
+ #
13
+ # We use a refinement to avoid case/if statements for type checking
14
+ refine Object do
15
+ def _graphql_cache_key
16
+ return graphql_cache_key if respond_to?(:graphql_cache_key)
17
+ return cache_key if respond_to?(:cache_key)
18
+ return to_a._graphql_cache_key if respond_to?(:to_a)
19
+
20
+ to_s
21
+ end
22
+ end
23
+
24
+ refine Array do
25
+ def _graphql_cache_key
26
+ map { |_1| _1._graphql_cache_key }.join("/")
27
+ end
28
+ end
29
+
30
+ refine NilClass do
31
+ def _graphql_cache_key
32
+ ""
33
+ end
34
+ end
35
+
36
+ refine TrueClass do
37
+ def _graphql_cache_key
38
+ "t"
39
+ end
40
+ end
41
+
42
+ refine FalseClass do
43
+ def _graphql_cache_key
44
+ "f"
45
+ end
46
+ end
47
+
48
+ refine String do
49
+ def _graphql_cache_key
50
+ self
51
+ end
52
+ end
53
+
54
+ refine Symbol do
55
+ def _graphql_cache_key
56
+ to_s
57
+ end
58
+ end
59
+
60
+ if RUBY_PLATFORM.match?(/java/i)
61
+ refine Integer do
62
+ def _graphql_cache_key
63
+ to_s
64
+ end
65
+ end
66
+
67
+ refine Float do
68
+ def _graphql_cache_key
69
+ to_s
70
+ end
71
+ end
72
+ else
73
+ refine Numeric do
74
+ def _graphql_cache_key
75
+ to_s
76
+ end
77
+ end
78
+ end
79
+
80
+ refine Time do
81
+ def _graphql_cache_key
82
+ to_s
83
+ end
84
+ end
85
+
86
+ refine Module do
87
+ def _graphql_cache_key
88
+ name
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -62,7 +62,12 @@ module GraphQL
62
62
  next_field_name = alias_node.name
63
63
 
64
64
  # From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
65
- next_field_defn = get_class_based_field(selected_type, next_field_name)
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
66
71
 
67
72
  alias_selections[name] =
68
73
  if next_field_defn
@@ -23,7 +23,7 @@ module GraphQL
23
23
  end
24
24
 
25
25
  def verify_connections!(context)
26
- return if GraphQL::FragmentCache.graphql_ruby_1_12_or_later? || context.schema.new_connections?
26
+ return if context.schema.new_connections?
27
27
 
28
28
  raise StandardError,
29
29
  "GraphQL::Pagination::Connections should be enabled for connection caching"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module FragmentCache
5
- VERSION = "1.10.0"
5
+ VERSION = "1.11.0"
6
6
  end
7
7
  end
@@ -50,29 +50,20 @@ module GraphQL
50
50
  @cache_store = store
51
51
  end
52
52
 
53
- def graphql_ruby_1_12_or_later?
54
- Gem::Dependency.new("graphql", ">= 1.12.0").match?("graphql", GraphQL::VERSION)
53
+ def graphql_ruby_before_2_0?
54
+ Gem::Dependency.new("graphql", "< 2.0.0").match?("graphql", GraphQL::VERSION)
55
55
  end
56
56
 
57
57
  private
58
58
 
59
59
  def verify_interpreter_and_analysis!(schema_defn)
60
- if graphql_ruby_1_12_or_later?
61
- unless schema_defn.interpreter?
62
- raise StandardError,
63
- "GraphQL::Execution::Execute should not be enabled for fragment caching"
64
- end
65
-
66
- unless schema_defn.analysis_engine == GraphQL::Analysis::AST
67
- raise StandardError,
68
- "GraphQL::Analysis should not be enabled for fragment caching"
69
- end
70
- else
60
+ if graphql_ruby_before_2_0?
71
61
  unless schema_defn.interpreter?
72
62
  raise StandardError,
73
63
  "GraphQL::Execution::Interpreter should be enabled for fragment caching"
74
64
  end
75
65
 
66
+ puts "schema_defn.analysis_engine #{schema_defn.analysis_engine}"
76
67
  unless schema_defn.analysis_engine == GraphQL::Analysis::AST
77
68
  raise StandardError,
78
69
  "GraphQL::Analysis::AST 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.10.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DmitryTsepelev
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-30 00:00:00.000000000 Z
11
+ date: 2022-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.10.8
19
+ version: 1.12.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.10.8
26
+ version: 1.12.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ruby-next
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -190,6 +190,10 @@ files:
190
190
  - README.md
191
191
  - bin/console
192
192
  - bin/setup
193
+ - lib/.rbnext/2.3/graphql/fragment_cache/cache_key_builder.rb
194
+ - lib/.rbnext/2.3/graphql/fragment_cache/memory_store.rb
195
+ - lib/.rbnext/2.7/graphql/fragment_cache/cache_key_builder.rb
196
+ - lib/.rbnext/2.7/graphql/fragment_cache/ext/graphql_cache_key.rb
193
197
  - lib/graphql-fragment_cache.rb
194
198
  - lib/graphql/fragment_cache.rb
195
199
  - lib/graphql/fragment_cache/cache_key_builder.rb
@@ -215,7 +219,7 @@ metadata:
215
219
  homepage_uri: https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache
216
220
  source_code_uri: https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache
217
221
  changelog_uri: https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/CHANGELOG.md
218
- post_install_message:
222
+ post_install_message:
219
223
  rdoc_options: []
220
224
  require_paths:
221
225
  - lib
@@ -230,8 +234,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
234
  - !ruby/object:Gem::Version
231
235
  version: '0'
232
236
  requirements: []
233
- rubygems_version: 3.0.3.1
234
- signing_key:
237
+ rubygems_version: 3.3.7
238
+ signing_key:
235
239
  specification_version: 4
236
240
  summary: Fragment cache for graphql-ruby
237
241
  test_files: []