graphql-fragment_cache 1.7.0 → 1.10.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: f193c09fd4f7682db9677d754964852e63b7541f2f2fa6d52ea81c8ee8b894fd
4
- data.tar.gz: 328017637ba3c31c9c9af6c6beacdb63e696b13d6065c12d73b02874fb2e29d5
3
+ metadata.gz: 9c0987cb1e081b19356cfd389164150d7678c2fff2a479986f56e157ac485e79
4
+ data.tar.gz: 72cc6cf9a79c003be0c83dc60447840128ba1d8395e60171ce26a5eaf8190f2b
5
5
  SHA512:
6
- metadata.gz: 9fd90630bd8a8505e2fe1a1277b621d22e2c62a23270a87a5487b56fdde57b980859611f80bfeb956915b581e396ee89a75da11548edebddf321ba45a0640e6c
7
- data.tar.gz: 43fa3b1709999e950b8002f7764e0e63bdacd9aa32db644ead959e6cc12c0df8d92c26423300af4aad59139a8a30290a2c82cfe0cc4ff412656c20d4c64919e4
6
+ metadata.gz: 78be339e321b1c76066e63960d615d85fc286531ba663eef4af3c62baee8b3d598867047cf1c52ca6085b7fca3cbd86ec0038718548e014aff5c8273740a3c9a
7
+ data.tar.gz: 005efd512fba6e4f91ba5aec08637ce058217f7c2e580ef4afa8c6323fef035a70c72a5abd74d418892f02b607b6e5fff288adfb9830ee9125985b852153775e
data/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.10.0 (2022-01-30)
6
+
7
+ - [PR#77](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/77) Drop Ruby 2.5 support, add Ruby 3.0 ([@DmitryTsepelev][])
8
+
9
+ ## 1.9.1 (2021-11-28)
10
+
11
+ - [PR#76](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/76) Freeze parser version ([@DmitryTsepelev][])
12
+
13
+ ## 1.9.0 (2021-08-19)
14
+
15
+ - [PR#71](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/71) Add selection alias to cache keys ([@mretzak][])
16
+
17
+ ## 1.8.0 (2021-05-13)
18
+
19
+ - [PR#65](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/65) Add default options ([@jeromedalbert][])
20
+
5
21
  ## 1.7.0 (2021-04-30)
6
22
 
7
23
  - [PR#62](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/62) Add a way to force a cache miss ([@jeromedalbert][])
@@ -107,3 +123,4 @@
107
123
  [@reabiliti]: https://github.com/reabiliti
108
124
  [@bbugh]: https://github.com/bbugh
109
125
  [@jeromedalbert]: https://github.com/jeromedalbert
126
+ [@mretzak]: https://github.com/mretzak
data/README.md CHANGED
@@ -314,6 +314,20 @@ field :post, PostType, cache_fragment: {if: -> { current_user.nil? }} do
314
314
  end
315
315
  ```
316
316
 
317
+ ## Default options
318
+
319
+ You can configure default options that will be passed to all `cache_fragment`
320
+ calls and `cache_fragment:` configurations. For example:
321
+
322
+ ```ruby
323
+ GraphQL::FragmentCache.configure do |config|
324
+ config.default_options = {
325
+ expires_in: 1.hour, # Expire cache keys after 1 hour
326
+ schema_cache_key: nil # Do not clear the cache on each schema change
327
+ }
328
+ end
329
+ ```
330
+
317
331
  ## Renewing the cache
318
332
 
319
333
  You can force the cache to renew during query execution by adding
@@ -22,6 +22,8 @@ module GraphQL
22
22
  children = val.selections.empty? ? "" : "[#{val.selections.to_selections_key}]"
23
23
 
24
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?
25
27
 
26
28
  unless val.arguments.empty?
27
29
  args = val.arguments.map { "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
@@ -28,7 +28,8 @@ module GraphQL
28
28
  end
29
29
 
30
30
  def initialize(options:, **_rest)
31
- @cache_options = options || {}
31
+ @cache_options = GraphQL::FragmentCache.default_options.merge(options || {})
32
+ @cache_options[:default_options_merged] = true
32
33
 
33
34
  @context_key = @cache_options.delete(:context_key)
34
35
  @cache_key = @cache_options.delete(:cache_key)
@@ -25,6 +25,10 @@ module GraphQL
25
25
  def cache_fragment(object_to_cache = NO_OBJECT, **options, &block)
26
26
  raise ArgumentError, "Block or argument must be provided" unless block_given? || object_to_cache != NO_OBJECT
27
27
 
28
+ unless options.delete(:default_options_merged)
29
+ options = GraphQL::FragmentCache.default_options.merge(options)
30
+ end
31
+
28
32
  if options.key?(:if) || options.key?(:unless)
29
33
  disabled = options.key?(:if) ? !options.delete(:if) : options.delete(:unless)
30
34
  if disabled
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module FragmentCache
5
- VERSION = "1.7.0"
5
+ VERSION = "1.10.0"
6
6
  end
7
7
  end
@@ -22,6 +22,7 @@ module GraphQL
22
22
  class << self
23
23
  attr_reader :cache_store
24
24
  attr_accessor :namespace
25
+ attr_accessor :default_options
25
26
 
26
27
  def use(schema_defn, options = {})
27
28
  verify_interpreter_and_analysis!(schema_defn)
@@ -81,6 +82,7 @@ module GraphQL
81
82
  end
82
83
 
83
84
  self.cache_store = MemoryStore.new
85
+ self.default_options = {}
84
86
  end
85
87
  end
86
88
 
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.7.0
4
+ version: 1.10.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: 2021-04-30 00:00:00.000000000 Z
11
+ date: 2022-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: parser
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 3.0.2.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 3.0.2.0
167
181
  description: Fragment cache for graphql-ruby
168
182
  email:
169
183
  - dmitry.a.tsepelev@gmail.com
@@ -176,10 +190,6 @@ files:
176
190
  - README.md
177
191
  - bin/console
178
192
  - bin/setup
179
- - lib/.rbnext/2.3/graphql/fragment_cache/cache_key_builder.rb
180
- - lib/.rbnext/2.3/graphql/fragment_cache/memory_store.rb
181
- - lib/.rbnext/2.7/graphql/fragment_cache/cache_key_builder.rb
182
- - lib/.rbnext/2.7/graphql/fragment_cache/ext/graphql_cache_key.rb
183
193
  - lib/graphql-fragment_cache.rb
184
194
  - lib/graphql/fragment_cache.rb
185
195
  - lib/graphql/fragment_cache/cache_key_builder.rb
@@ -205,7 +215,7 @@ metadata:
205
215
  homepage_uri: https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache
206
216
  source_code_uri: https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache
207
217
  changelog_uri: https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/CHANGELOG.md
208
- post_install_message:
218
+ post_install_message:
209
219
  rdoc_options: []
210
220
  require_paths:
211
221
  - lib
@@ -213,15 +223,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
223
  requirements:
214
224
  - - ">="
215
225
  - !ruby/object:Gem::Version
216
- version: '2.5'
226
+ version: '2.6'
217
227
  required_rubygems_version: !ruby/object:Gem::Requirement
218
228
  requirements:
219
229
  - - ">="
220
230
  - !ruby/object:Gem::Version
221
231
  version: '0'
222
232
  requirements: []
223
- rubygems_version: 3.1.2
224
- signing_key:
233
+ rubygems_version: 3.0.3.1
234
+ signing_key:
225
235
  specification_version: 4
226
236
  summary: Fragment cache for graphql-ruby
227
237
  test_files: []
@@ -1,196 +0,0 @@
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
-
26
- unless val.arguments.empty?
27
- args = val.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
28
- field_name += "(#{args})"
29
- end
30
-
31
- "#{field_name}#{children}"
32
- }.join(".")
33
- end
34
- end
35
-
36
- refine ::GraphQL::Language::Nodes::AbstractNode do
37
- def alias?(_)
38
- false
39
- end
40
- end
41
-
42
- refine ::GraphQL::Language::Nodes::Field do
43
- def alias?(val)
44
- self.alias == val
45
- end
46
- end
47
-
48
- refine ::GraphQL::Execution::Lookahead do
49
- def selection_with_alias(name, **kwargs)
50
- return selection(name, **kwargs) if selects?(name, **kwargs)
51
- alias_selection(name, **kwargs)
52
- end
53
-
54
- def alias_selection(name, selected_type: @selected_type, arguments: nil)
55
- return alias_selections[name] if alias_selections.key?(name)
56
-
57
- alias_node = lookup_alias_node(ast_nodes, name)
58
- return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
59
-
60
- next_field_name = alias_node.name
61
-
62
- # From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
63
- next_field_defn = get_class_based_field(selected_type, next_field_name)
64
-
65
- alias_selections[name] =
66
- if next_field_defn
67
- next_nodes = []
68
- arguments = @query.arguments_for(alias_node, next_field_defn)
69
- arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
70
- @ast_nodes.each do |ast_node|
71
- ast_node.selections.each do |selection|
72
- find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
73
- end
74
- end
75
-
76
- if next_nodes.any?
77
- ::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
78
- else
79
- ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
80
- end
81
- else
82
- ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
83
- end
84
- end
85
-
86
- def alias_selections
87
- return @alias_selections if defined?(@alias_selections)
88
- @alias_selections ||= {}
89
- end
90
-
91
- def lookup_alias_node(nodes, name)
92
- return if nodes.empty?
93
-
94
- nodes.find do |node|
95
- if node.is_a?(GraphQL::Language::Nodes::FragmentSpread)
96
- node = @query.fragments[node.name]
97
- raise("Invariant: Can't look ahead to nonexistent fragment #{node.name} (found: #{@query.fragments.keys})") unless node
98
- end
99
-
100
- return node if node.alias?(name)
101
- child = lookup_alias_node(node.children, name)
102
- return child if child
103
- end
104
- end
105
- end
106
- })
107
-
108
- # Builds cache key for fragment
109
- class CacheKeyBuilder
110
- using RubyNext
111
-
112
- class << self
113
- def call(**options)
114
- new(**options).build
115
- end
116
- end
117
-
118
- attr_reader :query, :path, :object, :schema
119
-
120
- def initialize(object: nil, query:, path:, **options)
121
- @object = object
122
- @query = query
123
- @schema = query.schema
124
- @path = path
125
- @options = options
126
- end
127
-
128
- def build
129
- [
130
- GraphQL::FragmentCache.namespace,
131
- implicit_cache_key,
132
- object_cache_key
133
- ].compact.join("/")
134
- end
135
-
136
- private
137
-
138
- def implicit_cache_key
139
- Digest::SHA1.hexdigest("#{schema_cache_key}/#{query_cache_key}")
140
- end
141
-
142
- def schema_cache_key
143
- @options.fetch(:schema_cache_key) { schema.schema_cache_key }
144
- end
145
-
146
- def query_cache_key
147
- @options.fetch(:query_cache_key) { "#{path_cache_key}[#{selections_cache_key}]" }
148
- end
149
-
150
- def selections_cache_key
151
- current_root =
152
- path.reduce(query.lookahead) { |lkhd, field_name|
153
- # Handle cached fields inside collections:
154
- next lkhd if field_name.is_a?(Integer)
155
-
156
- lkhd.selection_with_alias(field_name)
157
- }
158
-
159
- current_root.selections.to_selections_key
160
- end
161
-
162
- def path_cache_key
163
- @options.fetch(:path_cache_key) do
164
- lookahead = query.lookahead
165
-
166
- path.map { |field_name|
167
- # Handle cached fields inside collections:
168
- next field_name if field_name.is_a?(Integer)
169
-
170
- lookahead = lookahead.selection_with_alias(field_name)
171
- raise "Failed to look ahead the field: #{field_name}" if lookahead.is_a?(::GraphQL::Execution::Lookahead::NullLookahead)
172
-
173
- next lookahead.field.name if lookahead.arguments.empty?
174
-
175
- args = lookahead.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
176
- "#{lookahead.field.name}(#{args})"
177
- }.join("/")
178
- end
179
- end
180
-
181
- def traverse_argument(argument)
182
- return argument unless argument.is_a?(GraphQL::Schema::InputObject)
183
-
184
- "{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
185
- end
186
-
187
- def object_cache_key
188
- @options[:object_cache_key] || object_key(object)
189
- end
190
-
191
- def object_key(obj)
192
- ((!obj.nil?) || nil) && obj._graphql_cache_key
193
- end
194
- end
195
- end
196
- end
@@ -1,64 +0,0 @@
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
@@ -1,196 +0,0 @@
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
-
26
- unless val.arguments.empty?
27
- args = val.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
28
- field_name += "(#{args})"
29
- end
30
-
31
- "#{field_name}#{children}"
32
- }.join(".")
33
- end
34
- end
35
-
36
- refine ::GraphQL::Language::Nodes::AbstractNode do
37
- def alias?(_)
38
- false
39
- end
40
- end
41
-
42
- refine ::GraphQL::Language::Nodes::Field do
43
- def alias?(val)
44
- self.alias == val
45
- end
46
- end
47
-
48
- refine ::GraphQL::Execution::Lookahead do
49
- def selection_with_alias(name, **kwargs)
50
- return selection(name, **kwargs) if selects?(name, **kwargs)
51
- alias_selection(name, **kwargs)
52
- end
53
-
54
- def alias_selection(name, selected_type: @selected_type, arguments: nil)
55
- return alias_selections[name] if alias_selections.key?(name)
56
-
57
- alias_node = lookup_alias_node(ast_nodes, name)
58
- return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
59
-
60
- next_field_name = alias_node.name
61
-
62
- # From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
63
- next_field_defn = get_class_based_field(selected_type, next_field_name)
64
-
65
- alias_selections[name] =
66
- if next_field_defn
67
- next_nodes = []
68
- arguments = @query.arguments_for(alias_node, next_field_defn)
69
- arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
70
- @ast_nodes.each do |ast_node|
71
- ast_node.selections.each do |selection|
72
- find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
73
- end
74
- end
75
-
76
- if next_nodes.any?
77
- ::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
78
- else
79
- ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
80
- end
81
- else
82
- ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
83
- end
84
- end
85
-
86
- def alias_selections
87
- return @alias_selections if defined?(@alias_selections)
88
- @alias_selections ||= {}
89
- end
90
-
91
- def lookup_alias_node(nodes, name)
92
- return if nodes.empty?
93
-
94
- nodes.find do |node|
95
- if node.is_a?(GraphQL::Language::Nodes::FragmentSpread)
96
- node = @query.fragments[node.name]
97
- raise("Invariant: Can't look ahead to nonexistent fragment #{node.name} (found: #{@query.fragments.keys})") unless node
98
- end
99
-
100
- return node if node.alias?(name)
101
- child = lookup_alias_node(node.children, name)
102
- return child if child
103
- end
104
- end
105
- end
106
- })
107
-
108
- # Builds cache key for fragment
109
- class CacheKeyBuilder
110
- using RubyNext
111
-
112
- class << self
113
- def call(**options)
114
- new(**options).build
115
- end
116
- end
117
-
118
- attr_reader :query, :path, :object, :schema
119
-
120
- def initialize(object: nil, query:, path:, **options)
121
- @object = object
122
- @query = query
123
- @schema = query.schema
124
- @path = path
125
- @options = options
126
- end
127
-
128
- def build
129
- [
130
- GraphQL::FragmentCache.namespace,
131
- implicit_cache_key,
132
- object_cache_key
133
- ].compact.join("/")
134
- end
135
-
136
- private
137
-
138
- def implicit_cache_key
139
- Digest::SHA1.hexdigest("#{schema_cache_key}/#{query_cache_key}")
140
- end
141
-
142
- def schema_cache_key
143
- @options.fetch(:schema_cache_key) { schema.schema_cache_key }
144
- end
145
-
146
- def query_cache_key
147
- @options.fetch(:query_cache_key) { "#{path_cache_key}[#{selections_cache_key}]" }
148
- end
149
-
150
- def selections_cache_key
151
- current_root =
152
- path.reduce(query.lookahead) { |lkhd, field_name|
153
- # Handle cached fields inside collections:
154
- next lkhd if field_name.is_a?(Integer)
155
-
156
- lkhd.selection_with_alias(field_name)
157
- }
158
-
159
- current_root.selections.to_selections_key
160
- end
161
-
162
- def path_cache_key
163
- @options.fetch(:path_cache_key) do
164
- lookahead = query.lookahead
165
-
166
- path.map { |field_name|
167
- # Handle cached fields inside collections:
168
- next field_name if field_name.is_a?(Integer)
169
-
170
- lookahead = lookahead.selection_with_alias(field_name)
171
- raise "Failed to look ahead the field: #{field_name}" if lookahead.is_a?(::GraphQL::Execution::Lookahead::NullLookahead)
172
-
173
- next lookahead.field.name if lookahead.arguments.empty?
174
-
175
- args = lookahead.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
176
- "#{lookahead.field.name}(#{args})"
177
- }.join("/")
178
- end
179
- end
180
-
181
- def traverse_argument(argument)
182
- return argument unless argument.is_a?(GraphQL::Schema::InputObject)
183
-
184
- "{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
185
- end
186
-
187
- def object_cache_key
188
- @options[:object_cache_key] || object_key(object)
189
- end
190
-
191
- def object_key(obj)
192
- obj&._graphql_cache_key
193
- end
194
- end
195
- end
196
- end
@@ -1,93 +0,0 @@
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