graphql-result_cache 0.1.8 → 1.0.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 +4 -4
- data/Gemfile.lock +19 -19
- data/README.md +18 -24
- data/graphql-result_cache.gemspec +5 -5
- data/lib/graphql/result_cache/callback.rb +9 -3
- data/lib/graphql/result_cache/context_config.rb +4 -4
- data/lib/graphql/result_cache/introspection/field_type.rb +2 -1
- data/lib/graphql/result_cache/key.rb +5 -4
- data/lib/graphql/result_cache/result.rb +6 -9
- data/lib/graphql/result_cache/schema/field.rb +19 -0
- data/lib/graphql/result_cache/schema/field_extension.rb +58 -0
- data/lib/graphql/result_cache/schema/query_instrument.rb +15 -0
- data/lib/graphql/result_cache/version.rb +1 -1
- data/lib/graphql/result_cache.rb +9 -7
- metadata +21 -9
- data/.github/workflows/gem-push.yml +0 -45
- data/lib/graphql/result_cache/field.rb +0 -17
- data/lib/graphql/result_cache/field_instrument.rb +0 -37
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 535b29453885101a889e6228ded5fd20a83dd6e09f104fc3e9f369e1324b2d28
|
|
4
|
+
data.tar.gz: e8bad278755e2357bd12aa64ecf3e6078f307ede91625e21ed6794f5e6731144
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 329163b7405a290722f3e594548eaebf459dbfd01d0a5727030b6272043088dc99b2a3acf455b9f40fa4174084b4f37bb17db3da767862ef457ef7a6d8fe2592
|
|
7
|
+
data.tar.gz: 34dcf33d3e285be6f08c94eba94ea10845f7204eb3fc6247744e16c0377c6ff6f13d75c83f79d17bc247094fc1cf468492a21432f1c72e246e82dc660165d6cd
|
data/Gemfile.lock
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
graphql-result_cache (0.
|
|
5
|
-
graphql (~> 1.
|
|
4
|
+
graphql-result_cache (1.0.0)
|
|
5
|
+
graphql (~> 1.10)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
diff-lcs (1.
|
|
11
|
-
graphql (1.
|
|
12
|
-
rake (
|
|
13
|
-
rspec (3.
|
|
14
|
-
rspec-core (~> 3.
|
|
15
|
-
rspec-expectations (~> 3.
|
|
16
|
-
rspec-mocks (~> 3.
|
|
17
|
-
rspec-core (3.
|
|
18
|
-
rspec-support (~> 3.
|
|
19
|
-
rspec-expectations (3.
|
|
10
|
+
diff-lcs (1.4.4)
|
|
11
|
+
graphql (1.12.20)
|
|
12
|
+
rake (12.3.3)
|
|
13
|
+
rspec (3.10.0)
|
|
14
|
+
rspec-core (~> 3.10.0)
|
|
15
|
+
rspec-expectations (~> 3.10.0)
|
|
16
|
+
rspec-mocks (~> 3.10.0)
|
|
17
|
+
rspec-core (3.10.1)
|
|
18
|
+
rspec-support (~> 3.10.0)
|
|
19
|
+
rspec-expectations (3.10.1)
|
|
20
20
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
21
|
-
rspec-support (~> 3.
|
|
22
|
-
rspec-mocks (3.
|
|
21
|
+
rspec-support (~> 3.10.0)
|
|
22
|
+
rspec-mocks (3.10.2)
|
|
23
23
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
24
|
-
rspec-support (~> 3.
|
|
25
|
-
rspec-support (3.
|
|
24
|
+
rspec-support (~> 3.10.0)
|
|
25
|
+
rspec-support (3.10.3)
|
|
26
26
|
|
|
27
27
|
PLATFORMS
|
|
28
28
|
ruby
|
|
29
29
|
|
|
30
30
|
DEPENDENCIES
|
|
31
|
-
bundler (>= 2.2.10)
|
|
31
|
+
bundler (~> 2.2, >= 2.2.10)
|
|
32
32
|
graphql-result_cache!
|
|
33
|
-
rake (>= 12.3.3)
|
|
34
|
-
rspec (~> 3.
|
|
33
|
+
rake (~> 12.3, >= 12.3.3)
|
|
34
|
+
rspec (~> 3.10)
|
|
35
35
|
|
|
36
36
|
BUNDLED WITH
|
|
37
37
|
2.2.31
|
data/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
This gem is to cache the json result, instead of resolved object.
|
|
4
4
|
|
|
5
|
+
If you are using `graphql < 1.10.0` or without `GraphQL::Execution::Interpreter`, please [read this](https://github.com/saharaying/graphql-result_cache/wiki/GraphQL::ResultCache-(v0.1.x)).
|
|
6
|
+
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
9
|
Add this line to your application's Gemfile:
|
|
@@ -21,65 +23,57 @@ Or install it yourself as:
|
|
|
21
23
|
## Usage
|
|
22
24
|
|
|
23
25
|
1. Use `GraphQL::ResultCache` as a plugin in your schema.
|
|
24
|
-
|
|
26
|
+
|
|
25
27
|
```ruby
|
|
26
28
|
class MySchema < GraphQL::Schema
|
|
29
|
+
# Default value for graphql v1.12.x
|
|
30
|
+
use GraphQL::Execution::Interpreter
|
|
31
|
+
use GraphQL::Analysis::AST
|
|
32
|
+
|
|
33
|
+
introspection GraphQL::ResultCache::Introspection
|
|
34
|
+
|
|
27
35
|
mutation Types::MutationType
|
|
28
36
|
query Types::QueryType
|
|
29
|
-
|
|
37
|
+
|
|
30
38
|
use GraphQL::ResultCache
|
|
31
39
|
end
|
|
32
40
|
```
|
|
33
41
|
|
|
34
|
-
2. Add the custom field class to accept `result_cache`
|
|
42
|
+
2. Add the custom field class to accept `result_cache` definition.
|
|
35
43
|
|
|
36
44
|
```ruby
|
|
37
45
|
module Types
|
|
38
46
|
class BaseObject < GraphQL::Schema::Object
|
|
39
|
-
field_class GraphQL::ResultCache::Field
|
|
47
|
+
field_class GraphQL::ResultCache::Schema::Field
|
|
40
48
|
end
|
|
41
49
|
end
|
|
42
50
|
```
|
|
43
51
|
|
|
44
|
-
3. Config the fields which need to be cached
|
|
52
|
+
3. Config the fields which need to be cached.
|
|
45
53
|
|
|
46
54
|
```ruby
|
|
47
55
|
field :theme, Types::ThemeType, null: false, result_cache: true
|
|
48
56
|
```
|
|
49
57
|
|
|
50
|
-
4. Wrap query result with `GraphQL::ResultCache::Result`.
|
|
51
|
-
|
|
52
|
-
```ruby
|
|
53
|
-
class GraphqlController < ApplicationController
|
|
54
|
-
def execute
|
|
55
|
-
# ...
|
|
56
|
-
result = if params[:_json]
|
|
57
|
-
multiple_execute(params[:_json], context: context)
|
|
58
|
-
else
|
|
59
|
-
execute_query(context: context)
|
|
60
|
-
end
|
|
61
|
-
render json: GraphQL::ResultCache::Result.new(result)
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
```
|
|
65
|
-
|
|
66
58
|
## Result Cache Customization
|
|
67
59
|
|
|
68
60
|
### Cache condition
|
|
69
61
|
|
|
62
|
+
The `if` condition can be either a Symbol or a Proc.
|
|
63
|
+
|
|
70
64
|
```ruby
|
|
71
65
|
field :theme, Types::ThemeType, null: false, result_cache: { if: :published? }
|
|
72
66
|
```
|
|
73
|
-
The `if` condition can be either a Symbol or a Proc.
|
|
74
67
|
|
|
75
68
|
### Customized cache key
|
|
76
69
|
|
|
77
|
-
By default, `GraphQL::ResultCache` will generate a cache key combining the field path, arguments and object.
|
|
70
|
+
By default, `GraphQL::ResultCache` will generate a cache key combining the field path, arguments and object.
|
|
78
71
|
But you can customize the object clause by specify the `key` option.
|
|
79
72
|
|
|
80
73
|
```ruby
|
|
81
74
|
field :theme, Types::ThemeType, null: false, result_cache: { key: :theme_cache_key }
|
|
82
75
|
```
|
|
76
|
+
|
|
83
77
|
The `key` can be either a Symbol or a Proc.
|
|
84
78
|
|
|
85
79
|
### Callback after cached result applied
|
|
@@ -114,7 +108,7 @@ end
|
|
|
114
108
|
When using with introspection, you need to assign custom introspection to avoid getting the nullable type for a non-null type.
|
|
115
109
|
```ruby
|
|
116
110
|
class MySchema < GraphQL::Schema
|
|
117
|
-
introspection
|
|
111
|
+
introspection GraphQL::ResultCache::Introspection
|
|
118
112
|
end
|
|
119
113
|
```
|
|
120
114
|
|
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
|
10
10
|
spec.email = ['saharaying@gmail.com']
|
|
11
11
|
|
|
12
12
|
spec.summary = 'A result caching plugin for graphql-ruby'
|
|
13
|
-
spec.description = '
|
|
13
|
+
spec.description = 'This gem is to cache the json result, instead of resolved object.'
|
|
14
14
|
spec.homepage = 'https://github.com/saharaying/graphql-result_cache'
|
|
15
15
|
spec.license = 'MIT'
|
|
16
16
|
|
|
@@ -19,11 +19,11 @@ Gem::Specification.new do |spec|
|
|
|
19
19
|
end
|
|
20
20
|
spec.require_paths = ['lib']
|
|
21
21
|
|
|
22
|
-
spec.add_development_dependency 'bundler', '>= 2.2.10'
|
|
23
|
-
spec.add_development_dependency 'rake', '>= 12.3.3'
|
|
24
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
|
22
|
+
spec.add_development_dependency 'bundler', '~> 2.2', '>= 2.2.10'
|
|
23
|
+
spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
|
|
24
|
+
spec.add_development_dependency 'rspec', '~> 3.10'
|
|
25
25
|
|
|
26
|
-
spec.add_dependency 'graphql', '~> 1.
|
|
26
|
+
spec.add_dependency 'graphql', '~> 1.10'
|
|
27
27
|
|
|
28
28
|
# graphql v1.9 requires ruby >= 2.2.0
|
|
29
29
|
spec.required_ruby_version = '>= 2.2.0'
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
module GraphQL
|
|
2
2
|
module ResultCache
|
|
3
3
|
class Callback
|
|
4
|
-
def initialize
|
|
4
|
+
def initialize(obj:, args:, ctx:, value:)
|
|
5
5
|
@obj = obj
|
|
6
6
|
@args = args
|
|
7
7
|
@ctx = ctx
|
|
8
8
|
@value = value
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def call
|
|
11
|
+
def call(result_hash)
|
|
12
12
|
case @value
|
|
13
13
|
when Symbol
|
|
14
14
|
@obj.public_send(@value, result_hash)
|
|
15
15
|
when Proc
|
|
16
16
|
@value.call(result_hash, @obj, @args, @ctx)
|
|
17
17
|
end
|
|
18
|
-
::GraphQL::ResultCache.logger && ::GraphQL::ResultCache.logger.debug("GraphQL result cache callback called for #{
|
|
18
|
+
::GraphQL::ResultCache.logger && ::GraphQL::ResultCache.logger.debug("GraphQL result cache callback called for #{ctx_path}")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def ctx_path
|
|
24
|
+
@ctx.namespace(:interpreter)[:current_path].join('.')
|
|
19
25
|
end
|
|
20
26
|
end
|
|
21
27
|
end
|
|
@@ -8,16 +8,16 @@ module GraphQL
|
|
|
8
8
|
@value = {}
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def add
|
|
12
|
-
@value[
|
|
11
|
+
def add query:, path:, key:, after_process: nil
|
|
12
|
+
@value[query] ||= []
|
|
13
13
|
cached = cache.exist? key
|
|
14
14
|
logger && logger.info("GraphQL result cache key #{cached ? 'hit' : 'miss'}: #{key}")
|
|
15
|
-
config_value = { path:
|
|
15
|
+
config_value = { path: path, key: key }
|
|
16
16
|
if cached
|
|
17
17
|
config_value[:result] = cache.read(key)
|
|
18
18
|
config_value[:after_process] = after_process if after_process
|
|
19
19
|
end
|
|
20
|
-
@value[
|
|
20
|
+
@value[query] << config_value
|
|
21
21
|
cached
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -4,7 +4,8 @@ module GraphQL
|
|
|
4
4
|
class FieldType < ::GraphQL::Introspection::FieldType
|
|
5
5
|
|
|
6
6
|
def type
|
|
7
|
-
@object.
|
|
7
|
+
return @object.type unless @object.respond_to?(:original_return_type_not_null)
|
|
8
|
+
@object.original_return_type_not_null && !@object.type.non_null? ? @object.type.to_non_null_type : @object.type
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
end
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module GraphQL
|
|
2
4
|
module ResultCache
|
|
3
5
|
class Key
|
|
4
|
-
def initialize
|
|
6
|
+
def initialize(obj:, args:, ctx: nil, key: nil)
|
|
5
7
|
@obj = obj
|
|
6
8
|
@args = args
|
|
7
9
|
@ctx = ctx
|
|
@@ -21,7 +23,7 @@ module GraphQL
|
|
|
21
23
|
private
|
|
22
24
|
|
|
23
25
|
def path_clause
|
|
24
|
-
@ctx.
|
|
26
|
+
@ctx.namespace(:interpreter)[:current_path].join('.') unless @ctx.nil?
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
def args_clause
|
|
@@ -53,7 +55,6 @@ module GraphQL
|
|
|
53
55
|
return object.id if object.respond_to?(:id)
|
|
54
56
|
object.object_id
|
|
55
57
|
end
|
|
56
|
-
|
|
57
58
|
end
|
|
58
59
|
end
|
|
59
|
-
end
|
|
60
|
+
end
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
module GraphQL
|
|
2
2
|
module ResultCache
|
|
3
3
|
class Result
|
|
4
|
-
extend Forwardable
|
|
5
|
-
|
|
6
|
-
attr_reader :value
|
|
7
|
-
|
|
8
|
-
def_delegators :@value, :to_json, :as_json
|
|
9
|
-
|
|
10
4
|
def initialize query_result
|
|
11
5
|
@_result = query_result
|
|
12
|
-
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def process!
|
|
9
|
+
process_with_result_cache
|
|
13
10
|
end
|
|
14
11
|
|
|
15
12
|
private
|
|
16
13
|
|
|
17
14
|
def process_with_result_cache
|
|
18
15
|
return process_each(@_result) unless @_result.is_a?(Array)
|
|
19
|
-
@_result.
|
|
16
|
+
@_result.each { |result| process_each(result) }
|
|
20
17
|
end
|
|
21
18
|
|
|
22
19
|
def process_each result
|
|
23
20
|
result_cache_config = result.query.context[:result_cache]
|
|
24
|
-
|
|
21
|
+
result_cache_config.process(result) unless blank?(result_cache_config)
|
|
25
22
|
end
|
|
26
23
|
|
|
27
24
|
def blank? obj
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module GraphQL
|
|
2
|
+
module ResultCache
|
|
3
|
+
module Schema
|
|
4
|
+
class Field < ::GraphQL::Schema::Field
|
|
5
|
+
attr_reader :original_return_type_not_null
|
|
6
|
+
|
|
7
|
+
def initialize(*args, result_cache: nil, **kwargs, &block)
|
|
8
|
+
super(*args, **kwargs, &block)
|
|
9
|
+
return unless result_cache
|
|
10
|
+
unless @return_type_null
|
|
11
|
+
@original_return_type_not_null = true
|
|
12
|
+
@return_type_null = true
|
|
13
|
+
end
|
|
14
|
+
extension FieldExtension, result_cache
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'graphql/result_cache/condition'
|
|
4
|
+
require 'graphql/result_cache/context_config'
|
|
5
|
+
require 'graphql/result_cache/key'
|
|
6
|
+
require 'graphql/result_cache/callback'
|
|
7
|
+
|
|
8
|
+
module GraphQL
|
|
9
|
+
module ResultCache
|
|
10
|
+
module Schema
|
|
11
|
+
class FieldExtension < GraphQL::Schema::FieldExtension
|
|
12
|
+
def resolve(object:, arguments:, context:)
|
|
13
|
+
cache_config = options.respond_to?(:to_h) ? options.to_h : {}
|
|
14
|
+
|
|
15
|
+
if Condition.new(cache_config, obj: object, args: arguments, ctx: context).true?
|
|
16
|
+
context[:result_cache] ||= ContextConfig.new
|
|
17
|
+
cached = add_to_context_result_cache(context, object, arguments, cache_config)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
yield(object, arguments) unless cached
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def add_to_context_result_cache(context, object, arguments, cache_config)
|
|
26
|
+
cache_key = key(object, arguments, context, cache_config)
|
|
27
|
+
after_process = after_process(object, arguments, context, cache_config)
|
|
28
|
+
context[:result_cache].add(
|
|
29
|
+
query: context.query,
|
|
30
|
+
path: context.namespace(:interpreter)[:current_path],
|
|
31
|
+
key: cache_key.to_s,
|
|
32
|
+
after_process: after_process
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def key(object, arguments, context, config)
|
|
37
|
+
Key.new(
|
|
38
|
+
obj: object,
|
|
39
|
+
args: arguments,
|
|
40
|
+
ctx: context,
|
|
41
|
+
key: config[:key]
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def after_process(object, arguments, context, config)
|
|
46
|
+
return unless config[:after_process]
|
|
47
|
+
|
|
48
|
+
Callback.new(
|
|
49
|
+
obj: object,
|
|
50
|
+
args: arguments,
|
|
51
|
+
ctx: context,
|
|
52
|
+
value: config[:after_process]
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
data/lib/graphql/result_cache.rb
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
require 'graphql'
|
|
2
2
|
require 'graphql/result_cache/version'
|
|
3
|
-
require 'graphql/result_cache/field'
|
|
4
3
|
require 'graphql/result_cache/result'
|
|
5
|
-
require 'graphql/result_cache/
|
|
4
|
+
require 'graphql/result_cache/schema/field'
|
|
5
|
+
require 'graphql/result_cache/schema/field_extension'
|
|
6
|
+
require 'graphql/result_cache/schema/query_instrument'
|
|
6
7
|
require 'graphql/result_cache/introspection'
|
|
7
8
|
|
|
8
9
|
module GraphQL
|
|
@@ -31,15 +32,16 @@ module GraphQL
|
|
|
31
32
|
def configure
|
|
32
33
|
yield self
|
|
33
34
|
end
|
|
35
|
+
|
|
36
|
+
def use(schema_def)
|
|
37
|
+
return schema_def.instrument(:query, Schema::QueryInstrument) if schema_def.interpreter?
|
|
38
|
+
raise 'Please use the graphql gem version >= 1.10 with GraphQL::Execution::Interpreter'
|
|
39
|
+
end
|
|
34
40
|
end
|
|
35
41
|
|
|
36
42
|
# Default configuration
|
|
37
|
-
@expires_in = 3600
|
|
43
|
+
@expires_in = 3600 # 1.hour
|
|
38
44
|
@namespace = 'GraphQL:Result'
|
|
39
|
-
|
|
40
|
-
def self.use(schema_def, options: {})
|
|
41
|
-
schema_def.instrument(:field, ::GraphQL::ResultCache::FieldInstrument.new)
|
|
42
|
-
end
|
|
43
45
|
end
|
|
44
46
|
end
|
|
45
47
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: graphql-result_cache
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ying Fu
|
|
@@ -14,6 +14,9 @@ dependencies:
|
|
|
14
14
|
name: bundler
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.2'
|
|
17
20
|
- - ">="
|
|
18
21
|
- !ruby/object:Gem::Version
|
|
19
22
|
version: 2.2.10
|
|
@@ -21,6 +24,9 @@ dependencies:
|
|
|
21
24
|
prerelease: false
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
26
|
requirements:
|
|
27
|
+
- - "~>"
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '2.2'
|
|
24
30
|
- - ">="
|
|
25
31
|
- !ruby/object:Gem::Version
|
|
26
32
|
version: 2.2.10
|
|
@@ -28,6 +34,9 @@ dependencies:
|
|
|
28
34
|
name: rake
|
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
|
30
36
|
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '12.3'
|
|
31
40
|
- - ">="
|
|
32
41
|
- !ruby/object:Gem::Version
|
|
33
42
|
version: 12.3.3
|
|
@@ -35,6 +44,9 @@ dependencies:
|
|
|
35
44
|
prerelease: false
|
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
46
|
requirements:
|
|
47
|
+
- - "~>"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: '12.3'
|
|
38
50
|
- - ">="
|
|
39
51
|
- !ruby/object:Gem::Version
|
|
40
52
|
version: 12.3.3
|
|
@@ -44,36 +56,35 @@ dependencies:
|
|
|
44
56
|
requirements:
|
|
45
57
|
- - "~>"
|
|
46
58
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '3.
|
|
59
|
+
version: '3.10'
|
|
48
60
|
type: :development
|
|
49
61
|
prerelease: false
|
|
50
62
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
63
|
requirements:
|
|
52
64
|
- - "~>"
|
|
53
65
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '3.
|
|
66
|
+
version: '3.10'
|
|
55
67
|
- !ruby/object:Gem::Dependency
|
|
56
68
|
name: graphql
|
|
57
69
|
requirement: !ruby/object:Gem::Requirement
|
|
58
70
|
requirements:
|
|
59
71
|
- - "~>"
|
|
60
72
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '1.
|
|
73
|
+
version: '1.10'
|
|
62
74
|
type: :runtime
|
|
63
75
|
prerelease: false
|
|
64
76
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
77
|
requirements:
|
|
66
78
|
- - "~>"
|
|
67
79
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '1.
|
|
69
|
-
description:
|
|
80
|
+
version: '1.10'
|
|
81
|
+
description: This gem is to cache the json result, instead of resolved object.
|
|
70
82
|
email:
|
|
71
83
|
- saharaying@gmail.com
|
|
72
84
|
executables: []
|
|
73
85
|
extensions: []
|
|
74
86
|
extra_rdoc_files: []
|
|
75
87
|
files:
|
|
76
|
-
- ".github/workflows/gem-push.yml"
|
|
77
88
|
- ".github/workflows/ruby.yml"
|
|
78
89
|
- ".gitignore"
|
|
79
90
|
- ".rspec"
|
|
@@ -90,13 +101,14 @@ files:
|
|
|
90
101
|
- lib/graphql/result_cache/callback.rb
|
|
91
102
|
- lib/graphql/result_cache/condition.rb
|
|
92
103
|
- lib/graphql/result_cache/context_config.rb
|
|
93
|
-
- lib/graphql/result_cache/field.rb
|
|
94
|
-
- lib/graphql/result_cache/field_instrument.rb
|
|
95
104
|
- lib/graphql/result_cache/introspection.rb
|
|
96
105
|
- lib/graphql/result_cache/introspection/field_type.rb
|
|
97
106
|
- lib/graphql/result_cache/key.rb
|
|
98
107
|
- lib/graphql/result_cache/rails.rb
|
|
99
108
|
- lib/graphql/result_cache/result.rb
|
|
109
|
+
- lib/graphql/result_cache/schema/field.rb
|
|
110
|
+
- lib/graphql/result_cache/schema/field_extension.rb
|
|
111
|
+
- lib/graphql/result_cache/schema/query_instrument.rb
|
|
100
112
|
- lib/graphql/result_cache/version.rb
|
|
101
113
|
homepage: https://github.com/saharaying/graphql-result_cache
|
|
102
114
|
licenses:
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
name: Ruby Gem
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ master ]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [ master ]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
build:
|
|
11
|
-
name: Build + Publish
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
permissions:
|
|
14
|
-
contents: read
|
|
15
|
-
packages: write
|
|
16
|
-
|
|
17
|
-
steps:
|
|
18
|
-
- uses: actions/checkout@v2
|
|
19
|
-
- name: Set up Ruby 2.6
|
|
20
|
-
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
|
21
|
-
with:
|
|
22
|
-
ruby-version: 2.6.6
|
|
23
|
-
|
|
24
|
-
- name: Publish to GPR
|
|
25
|
-
run: |
|
|
26
|
-
mkdir -p $HOME/.gem
|
|
27
|
-
touch $HOME/.gem/credentials
|
|
28
|
-
chmod 0600 $HOME/.gem/credentials
|
|
29
|
-
printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
|
30
|
-
gem build *.gemspec
|
|
31
|
-
gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
|
|
32
|
-
env:
|
|
33
|
-
GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
|
|
34
|
-
OWNER: ${{ github.repository_owner }}
|
|
35
|
-
|
|
36
|
-
- name: Publish to RubyGems
|
|
37
|
-
run: |
|
|
38
|
-
mkdir -p $HOME/.gem
|
|
39
|
-
touch $HOME/.gem/credentials
|
|
40
|
-
chmod 0600 $HOME/.gem/credentials
|
|
41
|
-
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
|
42
|
-
gem build *.gemspec
|
|
43
|
-
gem push *.gem
|
|
44
|
-
env:
|
|
45
|
-
GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module GraphQL
|
|
2
|
-
module ResultCache
|
|
3
|
-
class Field < ::GraphQL::Schema::Field
|
|
4
|
-
def initialize(*args, result_cache: nil, **kwargs, &block)
|
|
5
|
-
@result_cache_config = result_cache
|
|
6
|
-
super(*args, **kwargs, &block)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def to_graphql
|
|
10
|
-
field_defn = super # Returns a GraphQL::Field
|
|
11
|
-
field_defn.metadata[:result_cache] = @result_cache_config
|
|
12
|
-
field_defn.metadata[:original_non_null] = true if @result_cache_config && field_defn.type.non_null?
|
|
13
|
-
field_defn
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
require 'graphql/result_cache/condition'
|
|
2
|
-
require 'graphql/result_cache/context_config'
|
|
3
|
-
require 'graphql/result_cache/key'
|
|
4
|
-
require 'graphql/result_cache/callback'
|
|
5
|
-
|
|
6
|
-
module GraphQL
|
|
7
|
-
module ResultCache
|
|
8
|
-
class FieldInstrument
|
|
9
|
-
def instrument _type, field
|
|
10
|
-
return field unless field.metadata[:result_cache]
|
|
11
|
-
|
|
12
|
-
cached_resolve_proc = cached_resolve(field)
|
|
13
|
-
field.redefine do
|
|
14
|
-
resolve(cached_resolve_proc)
|
|
15
|
-
type(field.type.of_type) if field.type.non_null?
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
def cached_resolve field
|
|
22
|
-
old_resolve_proc = field.resolve_proc
|
|
23
|
-
cache_config = field.metadata[:result_cache]
|
|
24
|
-
cache_config = {} unless cache_config.is_a?(Hash)
|
|
25
|
-
lambda do |obj, args, ctx|
|
|
26
|
-
if Condition.new(cache_config, obj: obj, args: args, ctx: ctx).true?
|
|
27
|
-
ctx[:result_cache] ||= ContextConfig.new
|
|
28
|
-
cache_key = Key.new(obj: obj, args: args, ctx: ctx, key: cache_config[:key])
|
|
29
|
-
after_process = Callback.new(obj: obj, args: args, ctx: ctx, value: cache_config[:after_process]) if cache_config[:after_process]
|
|
30
|
-
cached = ctx[:result_cache].add context: ctx, key: cache_key.to_s, after_process: after_process
|
|
31
|
-
end
|
|
32
|
-
old_resolve_proc.call(obj, args, ctx) unless cached
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|