graphql-cache 0.1.1 → 0.1.2

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: e370da35845b17ceb823cbecbe884402b22b3c17851526ffe8c5d7a554bba809
4
- data.tar.gz: 27ff23e0626a5177b9bfbbb78e120b42a0c8c9918f745b4a2af59eee0e77fd45
3
+ metadata.gz: d858418f7a97b6b74af740be3e490d56da27e8a0aec2aea48b69b1cf1abc728e
4
+ data.tar.gz: '0281225dfc87aee0914b580b0fed83c57f3b42838ffe01c19778f91784f2b49d'
5
5
  SHA512:
6
- metadata.gz: 9312f9098b10047fe1d7678f36d34952c6b65668d3f45e79e2a858fb6855897d3e79927326090856c9020ded4983671c5d853509b47118a8ada13426832e626b
7
- data.tar.gz: 16256ba378a5205db079042268caa80871fdcc2539165f75e6f12a8c6de9d2e22bee2c71a100c7e9523b4c956c40c22f6256e2574d754e5c33b2419d975c3a01
6
+ metadata.gz: '0942c0baac595bdfbb336d253653e4343d7f0c6d14b6ffe87a06e9632d475fa3b67d7e613dafe8aac8ef5e14cb81cf952dccdd322a3383f60eac5ee81a5b39e5'
7
+ data.tar.gz: 9fc08f962f99cef760c95fd8bb1e8389cc1b20222f4c6a7bf53afddefd455597504fcb839f40b5b282edc5c873b0334af329b44c389c10f122cc1782fa28a98e
@@ -0,0 +1,11 @@
1
+ Problem
2
+ -------
3
+
4
+ Cause (for defects/bugs)
5
+ ------------------------
6
+
7
+ Solution
8
+ --------
9
+
10
+ Notes
11
+ -----
@@ -2,4 +2,11 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.5.0
5
- before_install: gem install bundler -v 1.16.1
5
+ before_script:
6
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
7
+ - chmod +x ./cc-test-reporter
8
+ - ./cc-test-reporter before-build
9
+ - gem install bundler -v 1.16.1
10
+ script: bundle exec rspec
11
+ after_script:
12
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -0,0 +1,23 @@
1
+ ## How to contribute to GraphQL Cache
2
+
3
+ #### **Did you find a bug?**
4
+
5
+ * **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/Leanstack/graphql-cache/issues).
6
+
7
+ * If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/Leanstack/graphql-cache/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring.
8
+
9
+ #### **Did you write a patch that fixes a bug?**
10
+
11
+ * Open a new GitHub pull request with the patch.
12
+
13
+ * Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable.
14
+
15
+ #### **Do you intend to add a new feature or change an existing one?**
16
+
17
+ * Open an issue on GitHub and label it "Enhancement" so that the community can comment on the feature
18
+
19
+ * If you have code, by all means, open a pull request!
20
+
21
+ Thanks again for contirbuting to GraphQL Cache! :tada:
22
+
23
+ The StackShare Team
@@ -1,14 +1,23 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- graphql-cache (0.1.0)
5
- graphql (= 1.8.0.pre11)
4
+ graphql-cache (0.1.1)
5
+ graphql (~> 1.8.0.pre10)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ codeclimate-test-reporter (0.6.0)
11
+ simplecov (>= 0.7.1, < 1.0.0)
12
+ coderay (1.1.2)
10
13
  diff-lcs (1.3)
14
+ docile (1.3.0)
11
15
  graphql (1.8.0.pre11)
16
+ json (2.1.0)
17
+ method_source (0.9.0)
18
+ pry (0.11.3)
19
+ coderay (~> 1.1.0)
20
+ method_source (~> 0.9.0)
12
21
  rake (10.5.0)
13
22
  rspec (3.7.0)
14
23
  rspec-core (~> 3.7.0)
@@ -23,15 +32,23 @@ GEM
23
32
  diff-lcs (>= 1.2.0, < 2.0)
24
33
  rspec-support (~> 3.7.0)
25
34
  rspec-support (3.7.1)
35
+ simplecov (0.16.1)
36
+ docile (~> 1.1)
37
+ json (>= 1.8, < 3)
38
+ simplecov-html (~> 0.10.0)
39
+ simplecov-html (0.10.2)
26
40
 
27
41
  PLATFORMS
28
42
  ruby
29
43
 
30
44
  DEPENDENCIES
31
45
  bundler (~> 1.16)
46
+ codeclimate-test-reporter
32
47
  graphql-cache!
48
+ pry
33
49
  rake (~> 10.0)
34
50
  rspec (~> 3.0)
51
+ simplecov
35
52
 
36
53
  BUNDLED WITH
37
54
  1.16.1
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Graphql Cache
1
+ # Graphql Cache [![Build Status](https://travis-ci.org/Leanstack/graphql-cache.svg?branch=master)](https://travis-ci.org/Leanstack/graphql-cache) [![Test Coverage](https://api.codeclimate.com/v1/badges/c8560834b10db0618175/test_coverage)](https://codeclimate.com/github/Leanstack/graphql-cache/test_coverage) [![Maintainability](https://api.codeclimate.com/v1/badges/c8560834b10db0618175/maintainability)](https://codeclimate.com/github/Leanstack/graphql-cache/maintainability)
2
2
 
3
3
  GraphQL Cache is a custom middleware for graphql-ruby providing field-level caching
4
4
 
@@ -39,7 +39,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
39
39
 
40
40
  ## Contributing
41
41
 
42
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/graphql-cache. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
42
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Leanstack/graphql-cache. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
43
43
 
44
44
  ## License
45
45
 
@@ -47,4 +47,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
47
47
 
48
48
  ## Code of Conduct
49
49
 
50
- Everyone interacting in the Graphql::Cache project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/graphql-cache/blob/master/CODE_OF_CONDUCT.md).
50
+ Everyone interacting in the Graphql::Cache project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/Leanstack/graphql-cache/blob/master/CODE_OF_CONDUCT.md).
@@ -3,25 +3,29 @@ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require "graphql/cache/version"
5
5
 
6
- Gem::Specification.new do |spec|
7
- spec.name = "graphql-cache"
8
- spec.version = GraphQL::Cache::VERSION
9
- spec.authors = ["Michael Kelly"]
10
- spec.email = ["michaelkelly322@gmail.com"]
6
+ Gem::Specification.new do |s|
7
+ s.name = "graphql-cache"
8
+ s.version = GraphQL::Cache::VERSION
9
+ s.authors = ["Michael Kelly"]
10
+ s.email = ["michaelkelly322@gmail.com"]
11
11
 
12
- spec.summary = %q{Caching middleware for graphql-ruby}
13
- spec.description = %q{Provides middleware field-level caching for graphql-ruby}
14
- spec.homepage = "https://github.com/Leanstack/graphql-cache"
15
- spec.license = "MIT"
12
+ s.summary = %q{Caching middleware for graphql-ruby}
13
+ s.description = %q{Provides middleware field-level caching for graphql-ruby}
14
+ s.homepage = "https://github.com/Leanstack/graphql-cache"
15
+ s.license = "MIT"
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
18
18
  f.match(%r{^(test|spec|features)/})
19
19
  end
20
- spec.require_paths = ["lib"]
20
+ s.require_paths = ["lib"]
21
+ s.required_ruby_version = ">= 2.2.0" # bc graphql-ruby requires >= 2.2.0
21
22
 
22
- spec.add_development_dependency "bundler", "~> 1.16"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec", "~> 3.0"
23
+ s.add_development_dependency "bundler", "~> 1.16"
24
+ s.add_development_dependency "rake", "~> 10.0"
25
+ s.add_development_dependency "rspec", "~> 3.0"
26
+ s.add_development_dependency "simplecov"
27
+ s.add_development_dependency "codeclimate-test-reporter"
28
+ s.add_development_dependency "pry"
25
29
 
26
- spec.add_dependency 'graphql', '~> 1.8.0.pre10'
30
+ s.add_dependency 'graphql', '~> 1.8.0.pre10'
27
31
  end
@@ -1,6 +1,7 @@
1
1
  require 'graphql/cache/version'
2
2
  require 'graphql/cache/middleware'
3
3
  require 'graphql/cache/field'
4
+ require 'graphql/cache/marshal'
4
5
 
5
6
  module GraphQL
6
7
  module Cache
@@ -26,10 +27,6 @@ module GraphQL
26
27
  def self.logger; @@logger; end
27
28
  def self.logger=(obj); @@logger=obj; end
28
29
 
29
- @@log_level = nil
30
- def self.log_level; @@log_level; end
31
- def self.log_level=(obj); @@log_level=obj; @@logger.try(:level=, obj); end
32
-
33
30
  def self.configure
34
31
  yield self
35
32
  end
@@ -37,61 +34,7 @@ module GraphQL
37
34
  def self.fetch(key, config: {}, &block)
38
35
  return block.call unless config[:cache]
39
36
 
40
- cached = cache.read(key)
41
-
42
- if cached.nil?
43
- logger.debug "Cache miss: (#{key})"
44
- marshal_to_cache(key, config, &block)
45
- else
46
- logger.debug "Cache hit: (#{key})"
47
- marshal_from_cache(cached, config)
48
- end
49
- end
50
-
51
- def self.marshal_to_cache(key, config, &block)
52
- raw = block.call
53
-
54
- marshaled = case raw.class.name
55
- when 'Array'
56
- raw.map(&:object)
57
- when 'GraphQL::Relay::RelationConnection'
58
- raw.nodes
59
- else
60
- raw.try(:object) || raw
61
- end
62
-
63
- cache.write(key, marshaled, expires_in: config[:expiry] || GraphQL::Cache.expiry)
64
- raw
65
- end
66
-
67
- def self.marshal_from_cache(cached, config = {})
68
- case cached.class.name
69
- when 'Array'
70
- cached.map do |raw|
71
- config[:field_definition].type.unwrap.graphql_definition.metadata[:type_class].new(
72
- raw,
73
- config[:query_context]
74
- )
75
- end
76
- when 'ActiveRecord::Associations::CollectionProxy'
77
- GraphQL::Relay::RelationConnection.new(
78
- cached,
79
- config[:field_args],
80
- field: config[:query_context].field,
81
- parent: config[:parent_object].object,
82
- context: config[:query_context]
83
- )
84
- else
85
- klass = config[:field_definition].type.unwrap.graphql_definition.metadata[:type_class]
86
- if klass
87
- new(
88
- cached,
89
- config[:query_context]
90
- )
91
- else
92
- cached
93
- end
94
- end
37
+ Marshal[key].read(config, &block)
95
38
  end
96
39
  end
97
40
  end
@@ -0,0 +1,95 @@
1
+ module GraphQL
2
+ module Cache
3
+ class Builder
4
+ attr_accessor :raw, :method, :config
5
+
6
+ def self.[](raw)
7
+ build_method = namify(raw.class.name)
8
+ new(raw, build_method)
9
+ end
10
+
11
+ def self.namify(str)
12
+ str.split('::').last.downcase
13
+ end
14
+
15
+ def initialize(raw, method)
16
+ self.raw = raw
17
+ self.method = method
18
+ end
19
+
20
+ def build(config)
21
+ self.config = config
22
+
23
+ return build_array if method == 'array'
24
+ return build_relation if method == 'collectionproxy' || method == 'relation'
25
+ build_object
26
+ end
27
+
28
+ def deconstruct
29
+ case self.class.namify(raw.class.name)
30
+ when 'array'
31
+ deconstruct_array(raw)
32
+ when 'relationconnection'
33
+ raw.nodes
34
+ else
35
+ deconstruct_object(raw)
36
+ end
37
+ end
38
+
39
+ def deconstruct_object(raw)
40
+ if raw.respond_to?(:object)
41
+ raw.object
42
+ else
43
+ raw
44
+ end
45
+ end
46
+
47
+ def deconstruct_array(raw)
48
+ return [] if raw.empty?
49
+
50
+ if raw.first.class.ancestors.include? GraphQL::Schema::Object
51
+ raw.map(&:object)
52
+ else
53
+ raw
54
+ end
55
+ end
56
+
57
+ def build_relation
58
+ GraphQL::Relay::RelationConnection.new(
59
+ raw,
60
+ config[:field_args],
61
+ field: config[:query_context].field,
62
+ parent: config[:parent_object].object,
63
+ context: config[:query_context]
64
+ )
65
+ end
66
+
67
+ def build_array
68
+ gql_def = config[:field_definition].type.unwrap.graphql_definition
69
+
70
+ raw.map do |item|
71
+ if gql_def.kind.name == 'OBJECT'
72
+ config[:field_definition].type.unwrap.graphql_definition.metadata[:type_class].new(
73
+ item,
74
+ config[:query_context]
75
+ )
76
+ else
77
+ item
78
+ end
79
+ end
80
+ end
81
+
82
+ def build_object
83
+ klass = config[:field_definition].type.unwrap.graphql_definition.metadata[:type_class]
84
+ if klass
85
+ klass.new(
86
+ raw,
87
+ config[:query_context]
88
+ )
89
+ else
90
+ raw
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -1,6 +1,8 @@
1
+ require 'graphql'
2
+
1
3
  module GraphQL
2
4
  module Cache
3
- class Field < GraphQL::Schema::Field
5
+ class Field < ::GraphQL::Schema::Field
4
6
  # Override #initialize to take a new argument:
5
7
  def initialize(
6
8
  *args,
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql/cache/builder'
4
+
5
+ module GraphQL
6
+ module Cache
7
+ class Marshal
8
+ attr_accessor :key
9
+
10
+ def self.[](key)
11
+ new(key)
12
+ end
13
+
14
+ def initialize(key)
15
+ self.key = key.to_s
16
+ end
17
+
18
+ def read(config, &block)
19
+ cached = cache.read(key)
20
+
21
+ if cached.nil?
22
+ logger.debug "Cache miss: (#{key})"
23
+ write config, &block
24
+ else
25
+ logger.debug "Cache hit: (#{key})"
26
+ build cached, config
27
+ end
28
+ end
29
+
30
+ def write(config, &block)
31
+ resolved = block.call
32
+ expiry = config[:expiry] || GraphQL::Cache.expiry
33
+
34
+ document = Builder[resolved].deconstruct
35
+
36
+ cache.write(key, document, expires_in: expiry)
37
+ resolved
38
+ end
39
+
40
+
41
+ def build(cached, config)
42
+ Builder[cached].build(config)
43
+ end
44
+
45
+ def cache
46
+ GraphQL::Cache.cache
47
+ end
48
+
49
+ def logger
50
+ GraphQL::Cache.logger
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,5 +1,5 @@
1
1
  module GraphQL
2
2
  module Cache
3
- VERSION = "0.1.1"
3
+ VERSION = '0.1.2'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Kelly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-09 00:00:00.000000000 Z
11
+ date: 2018-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: graphql
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -73,10 +115,12 @@ executables: []
73
115
  extensions: []
74
116
  extra_rdoc_files: []
75
117
  files:
118
+ - ".github/PULL_REQUEST_TEMPLATE.md"
76
119
  - ".gitignore"
77
120
  - ".rspec"
78
121
  - ".travis.yml"
79
122
  - CODE_OF_CONDUCT.md
123
+ - CONTRIBUTING.md
80
124
  - Gemfile
81
125
  - Gemfile.lock
82
126
  - LICENSE.txt
@@ -86,7 +130,9 @@ files:
86
130
  - bin/setup
87
131
  - graphql-cache.gemspec
88
132
  - lib/graphql/cache.rb
133
+ - lib/graphql/cache/builder.rb
89
134
  - lib/graphql/cache/field.rb
135
+ - lib/graphql/cache/marshal.rb
90
136
  - lib/graphql/cache/middleware.rb
91
137
  - lib/graphql/cache/rails.rb
92
138
  - lib/graphql/cache/version.rb
@@ -102,7 +148,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
148
  requirements:
103
149
  - - ">="
104
150
  - !ruby/object:Gem::Version
105
- version: '0'
151
+ version: 2.2.0
106
152
  required_rubygems_version: !ruby/object:Gem::Requirement
107
153
  requirements:
108
154
  - - ">="