graphql-result_cache 0.1.5 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6cae5e83e05f6aae4a8ac2c26a6d2077d25c7fa32176234f347b0e8273a6ee3e
4
- data.tar.gz: 77fb9355094bb37c82991a935e2f91058b7e2b7f93510c8037665a1f88df13d3
3
+ metadata.gz: 535b29453885101a889e6228ded5fd20a83dd6e09f104fc3e9f369e1324b2d28
4
+ data.tar.gz: e8bad278755e2357bd12aa64ecf3e6078f307ede91625e21ed6794f5e6731144
5
5
  SHA512:
6
- metadata.gz: caf21c2c2c7f4bdf29f714376f4867390f3b8f8ff894692d918574a300820abead72a13c8e321c67097381d5ffabc0b6c6de8bbfe95bb7d136e4d0fbd43e0c49
7
- data.tar.gz: 35677cba82ea49aaf9bd94aa059249f80d6ef9caf35476a6edc418012d7467f1f53d52b0bd48ca3a73d428d4be362473f8cf05cec98d660f1f4b3a2d47fc5ffd
6
+ metadata.gz: 329163b7405a290722f3e594548eaebf459dbfd01d0a5727030b6272043088dc99b2a3acf455b9f40fa4174084b4f37bb17db3da767862ef457ef7a6d8fe2592
7
+ data.tar.gz: 34dcf33d3e285be6f08c94eba94ea10845f7204eb3fc6247744e16c0377c6ff6f13d75c83f79d17bc247094fc1cf468492a21432f1c72e246e82dc660165d6cd
@@ -0,0 +1,31 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on: [push, pull_request]
11
+
12
+ jobs:
13
+ test:
14
+
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ matrix:
18
+ ruby-version: ['2.5', '2.6', '2.7']
19
+
20
+ steps:
21
+ - uses: actions/checkout@v2
22
+ - name: Set up Ruby
23
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
24
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
25
+ # uses: ruby/setup-ruby@v1
26
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
27
+ with:
28
+ ruby-version: ${{ matrix.ruby-version }}
29
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
30
+ - name: Run tests
31
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -6,5 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /tags
9
10
 
10
- /.idea/
11
+ /.idea/
12
+ /graphql-result_cache-*.gem
data/Gemfile.lock CHANGED
@@ -1,37 +1,37 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- graphql-result_cache (0.1.4)
5
- graphql (~> 1.9)
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.3)
11
- graphql (1.9.9)
12
- rake (10.5.0)
13
- rspec (3.8.0)
14
- rspec-core (~> 3.8.0)
15
- rspec-expectations (~> 3.8.0)
16
- rspec-mocks (~> 3.8.0)
17
- rspec-core (3.8.2)
18
- rspec-support (~> 3.8.0)
19
- rspec-expectations (3.8.4)
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.8.0)
22
- rspec-mocks (3.8.1)
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.8.0)
25
- rspec-support (3.8.2)
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 (~> 1.16)
31
+ bundler (~> 2.2, >= 2.2.10)
32
32
  graphql-result_cache!
33
- rake (~> 10.0)
34
- rspec (~> 3.0)
33
+ rake (~> 12.3, >= 12.3.3)
34
+ rspec (~> 3.10)
35
35
 
36
36
  BUNDLED WITH
37
- 1.17.3
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` metadata.
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 with `result_cache` definition.
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
@@ -105,6 +99,7 @@ GraphQL::ResultCache.configure do |config|
105
99
  config.namespace = "GraphQL:Result" # Cache key namespace
106
100
  config.expires_in = 1.hour # Expire time for the cache, default to 1.hour
107
101
  config.client_hash = -> { Rails.cache.read(:deploy_version) } # GraphQL client package hash key, used in cache key generation, default to nil
102
+ config.except = ->(ctx) { !ctx[:result_cacheable] } # Exception rule, skip the cache while evaluated as true, default to nil
108
103
  config.cache = Rails.cache # The cache object, default to Rails.cache in Rails
109
104
  config.logger = Rails.logger # The Logger, default to Rails.logger in Rails
110
105
  end
@@ -113,7 +108,7 @@ end
113
108
  When using with introspection, you need to assign custom introspection to avoid getting the nullable type for a non-null type.
114
109
  ```ruby
115
110
  class MySchema < GraphQL::Schema
116
- introspection ::GraphQL::ResultCache::Introspection
111
+ introspection GraphQL::ResultCache::Introspection
117
112
  end
118
113
  ```
119
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 = 'A result caching plugin for graphql-ruby'
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', '~> 1.16'
23
- spec.add_development_dependency 'rake', '~> 10.0'
24
- spec.add_development_dependency 'rspec', '~> 3.0'
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.9'
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 obj:, args:, ctx:, value:
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 result_hash
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 #{@ctx.path.join('.')}")
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
@@ -9,15 +9,23 @@ module GraphQL
9
9
  end
10
10
 
11
11
  def true?
12
+ return false if except?
12
13
  case @if
13
- when Symbol
14
- @obj.send(@if)
15
- when Proc
16
- @if.call(@obj, @args, @ctx)
17
- else
18
- true
14
+ when Symbol
15
+ @obj.send(@if)
16
+ when Proc
17
+ @if.call(@obj, @args, @ctx)
18
+ else
19
+ true
19
20
  end
20
21
  end
22
+
23
+ private
24
+
25
+ def except?
26
+ except = ::GraphQL::ResultCache.except
27
+ except.is_a?(Proc) ? except.call(@ctx) : except
28
+ end
21
29
  end
22
30
  end
23
31
  end
@@ -8,16 +8,16 @@ module GraphQL
8
8
  @value = {}
9
9
  end
10
10
 
11
- def add context:, key:, after_process: nil
12
- @value[context.query] ||= []
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: context.path, key: key }
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[context.query] << config_value
20
+ @value[query] << config_value
21
21
  cached
22
22
  end
23
23
 
@@ -39,7 +39,7 @@ module GraphQL
39
39
  def cache_or_amend_result result, config_of_query
40
40
  config_of_query.each do |config|
41
41
  if config[:result].nil?
42
- cache.write config[:key], result.dig('data', *config[:path]), cache_write_options.merge(expires_in: expires_in)
42
+ cache.write config[:key], dig(result, 'data', *config[:path]), cache_write_options.merge(expires_in: expires_in)
43
43
  else
44
44
  # result already got from cache, need to amend to response
45
45
  result_hash = result.to_h
@@ -4,7 +4,8 @@ module GraphQL
4
4
  class FieldType < ::GraphQL::Introspection::FieldType
5
5
 
6
6
  def type
7
- @object.metadata[:original_non_null] && !@object.type.non_null? ? @object.type.to_non_null_type : @object.type
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 obj:, args:, ctx:, key: nil
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.path.join('.')
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
- @value = process_with_result_cache
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.map { |result| process_each(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
- blank?(result_cache_config) ? result : result_cache_config.process(result)
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
@@ -0,0 +1,15 @@
1
+ module GraphQL
2
+ module ResultCache
3
+ module Schema
4
+ module QueryInstrument
5
+ module_function
6
+
7
+ def before_query(_query) end
8
+
9
+ def after_query(query)
10
+ GraphQL::ResultCache::Result.new(query.result).process!
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  module GraphQL
2
2
  module ResultCache
3
- VERSION = '0.1.5'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
@@ -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/field_instrument'
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
@@ -18,6 +19,9 @@ module GraphQL
18
19
  # c.client_hash = -> { Rails.cache.read(:deploy_version) }
19
20
  attr_accessor :client_hash
20
21
 
22
+ # global condition, skip the cache when the value is true, should be a proc.
23
+ attr_accessor :except
24
+
21
25
  # ```
22
26
  # GraphQL::ResultCache.configure do |c|
23
27
  # c.namespace = "GraphQL:Result"
@@ -28,16 +32,19 @@ module GraphQL
28
32
  def configure
29
33
  yield self
30
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
31
40
  end
32
41
 
33
42
  # Default configuration
34
- @expires_in = 3600 # 1.hour
43
+ @expires_in = 3600 # 1.hour
35
44
  @namespace = 'GraphQL:Result'
36
-
37
- def self.use(schema_def, options: {})
38
- schema_def.instrument(:field, ::GraphQL::ResultCache::FieldInstrument.new)
39
- end
40
45
  end
41
46
  end
42
47
 
48
+ GraphQL::Schema::Field.accepts_definition(:result_cache)
49
+
43
50
  require 'graphql/result_cache/rails' if defined?(::Rails::Engine)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-result_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ying Fu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-14 00:00:00.000000000 Z
11
+ date: 2021-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,63 +16,76 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: '2.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.2.10
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: '1.16'
29
+ version: '2.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.2.10
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '10.0'
39
+ version: '12.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 12.3.3
34
43
  type: :development
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
47
  - - "~>"
39
48
  - !ruby/object:Gem::Version
40
- version: '10.0'
49
+ version: '12.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 12.3.3
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: rspec
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - "~>"
46
58
  - !ruby/object:Gem::Version
47
- version: '3.0'
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.0'
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.9'
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.9'
69
- description: A result caching plugin for graphql-ruby
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:
88
+ - ".github/workflows/ruby.yml"
76
89
  - ".gitignore"
77
90
  - ".rspec"
78
91
  - CODE_OF_CONDUCT.md
@@ -88,13 +101,14 @@ files:
88
101
  - lib/graphql/result_cache/callback.rb
89
102
  - lib/graphql/result_cache/condition.rb
90
103
  - lib/graphql/result_cache/context_config.rb
91
- - lib/graphql/result_cache/field.rb
92
- - lib/graphql/result_cache/field_instrument.rb
93
104
  - lib/graphql/result_cache/introspection.rb
94
105
  - lib/graphql/result_cache/introspection/field_type.rb
95
106
  - lib/graphql/result_cache/key.rb
96
107
  - lib/graphql/result_cache/rails.rb
97
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
98
112
  - lib/graphql/result_cache/version.rb
99
113
  homepage: https://github.com/saharaying/graphql-result_cache
100
114
  licenses:
@@ -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