cacheql 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: edd0f07beea907b403ceae1832e967d3f1a01aee
4
- data.tar.gz: b3cae9fa387ee21cd4ea3349e843bc2eea1a314f
3
+ metadata.gz: 4b63b557dc02328918c18828fc532653ff77096d
4
+ data.tar.gz: 9309e2b0986da06f49a2ce6ad90fb88928d2a57e
5
5
  SHA512:
6
- metadata.gz: ef17ab966525e39a38e8c4968d99e44541d4e6fd0cea8735f6abf5279b40b7129af6a74c7be510654f1f7c6316684046c81f416a40965c6a95125b02e7a6670b
7
- data.tar.gz: 3065ca7f8150a353a7895c528494dcee87283a2c3687f4903930e45c10c42d820437b4d6edaa9a0ef3ee86c78f28e34b61316ee64c878bb693e908856e764992
6
+ metadata.gz: cfd0715295b686bebf91fddd605e1c1193a7ca2fc0ec9bbb63559231c9f1a274bf169f18571caa481e417c9b909ae79a41033cc1b13e1314cafeac00f9dcaf22
7
+ data.tar.gz: 0cf778191eb26d2bb6af7a1ec8978fbebc608101fd40dc15d50d92cf5ccce20c4ecc6c5d029c7e1588880cfcb4ddcf8f54e82077844e27dcdba0fea5bd32bca2
data/README.md CHANGED
@@ -1,8 +1,11 @@
1
1
  # CacheQL
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/cacheql`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Need to cache and instrument your GraphQL code in Ruby? Look no further!
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ This is a collection of utilities for [graphql-ruby](http://graphql-ruby.org)
6
+ that were collected from various places on GitHub + docs.
7
+
8
+ This code was extracted from [Chatterbug](https://chatterbug.com). Check out the talk from [Railsconf 2018](https://speakerdeck.com/qrush/the-graphql-way-a-new-path-for-json-apis) about this gem!
6
9
 
7
10
  ## Installation
8
11
 
@@ -22,7 +25,127 @@ Or install it yourself as:
22
25
 
23
26
  ## Usage
24
27
 
25
- TODO: Write usage instructions here
28
+ There's four major parts to this gem:
29
+
30
+ ### Cache helpers
31
+
32
+ Need to cache a single resolve function? Wrap it in `CacheQL`:
33
+
34
+ ``` ruby
35
+ resolve CacheQL -> (obj, args, ctx) {
36
+ # run expensive operation
37
+ # this resolve function's result will be cached on obj.cache_key
38
+ }
39
+ ```
40
+
41
+ Want to cache the entire response after GraphQL has generated it? Try this in
42
+ your controller:
43
+
44
+ ``` ruby
45
+ def execute
46
+ # other graphql stuff...
47
+
48
+ FIELDS = %w(users curriculum)
49
+ render json: CacheQL.fetch(FIELDS, query, variables) { |document|
50
+ YourSchema.execute(
51
+ document: document,
52
+ variables: variables,
53
+ context: { },
54
+ operation_name: params[:operationName]).to_h
55
+ }
56
+ end
57
+ ```
58
+
59
+ This will cache the entire response when the query includes `FIELDS`.
60
+
61
+ ### Loaders
62
+
63
+ These are all based off of community-written examples using [graphql-batch](https://github.com/Shopify/graphql-batch).
64
+ These will reduce N+1 queries in your GraphQL code.
65
+
66
+ Before using loaders, you'll have to [use `GraphQL::Batch`](https://github.com/Shopify/graphql-batch#basic-usage) as a plugin in your schema:
67
+
68
+ ``` ruby
69
+ YourSchema = GraphQL::Schema.define do
70
+ query YourQueryType
71
+
72
+ use GraphQL::Batch
73
+ end
74
+ ```
75
+
76
+ Batch up `belongs_to` calls:
77
+
78
+ ``` ruby
79
+ # when obj has a belongs_to :language
80
+
81
+ resolve -> (obj, args, ctx) {
82
+ CacheQL::RecordLoader.for(Language).load(obj.language_id)
83
+ }
84
+ ```
85
+
86
+ Batch up `belongs_to polymorphic: true` calls:
87
+
88
+ ``` ruby
89
+ # when obj has a belongs_to :respondable, polymorphic: true
90
+
91
+ resolve -> (obj, args, ctx) {
92
+ CacheQL::PolymorphicKeyLoader.for(Response, :respondable).load(obj.respondable)
93
+ }
94
+ ```
95
+
96
+ Batch up entire associations:
97
+
98
+ ``` ruby
99
+ # when obj has_many :clozes
100
+
101
+ resolve -> (obj, args, ctx) {
102
+ CacheQL::AssociationLoader.for(obj.class, :clozes).load(obj)
103
+ }
104
+ ```
105
+
106
+ ### Logging
107
+
108
+ Want to get your GraphQL fields logging locally? In your controller, add:
109
+
110
+
111
+ ``` ruby
112
+ around_action :log_field_instrumentation
113
+
114
+ private
115
+
116
+ def log_field_instrumentation(&block)
117
+ CacheQL::FieldInstrumentation.log(&block)
118
+ end
119
+ ```
120
+
121
+ This will then spit out timing logs for each field run during each request.
122
+ For example:
123
+
124
+ ```
125
+ [CacheQL::Tracing] User.displayLanguage took 7.591ms
126
+ [CacheQL::Tracing] User.createdAt took 0.117ms
127
+ [CacheQL::Tracing] User.intercomHash took 0.095ms
128
+ [CacheQL::Tracing] User.id took 0.09ms
129
+ [CacheQL::Tracing] User.friendlyTimezone took 0.087ms
130
+ [CacheQL::Tracing] User.utmContent took 0.075ms
131
+ [GraphQL::Tracing] User.timezone took 0.048ms
132
+ [CacheQL::Tracing] User.email took 0.046ms
133
+ [CacheQL::Tracing] User.name took 0.042ms
134
+ [CacheQL::Tracing] Query.currentUser took 0.041ms
135
+ ```
136
+
137
+ ### Instrumentation
138
+
139
+ This gem includes an instrumenter for [Scout](https://scoutapp.com) that will
140
+ show the timing breakdown of each field in your metrics. Assuming you have Scout
141
+ setup, add to your schema:
142
+
143
+
144
+ ``` ruby
145
+ YourSchema = GraphQL::Schema.define do
146
+ instrument :field, CacheQL::FieldInstrumentation.new(ScoutApm::Tracer)
147
+ end
148
+ ```
26
149
 
27
150
  ## Development
28
151
 
data/cacheql.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = %q{Various GraphQL caching / instrumentation tools}
13
13
  spec.description = spec.summary
14
- spec.homepage = "https://github.com/chatterbug/cacheql"
14
+ spec.homepage = "https://github.com/chatterbugapp/cacheql"
15
15
  spec.license = "MIT"
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -1,3 +1,3 @@
1
1
  module CacheQL
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cacheql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Quaranto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
11
+ date: 2018-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql-batch
@@ -133,7 +133,7 @@ files:
133
133
  - lib/cacheql/record_loader.rb
134
134
  - lib/cacheql/resolve_wrapper.rb
135
135
  - lib/cacheql/version.rb
136
- homepage: https://github.com/chatterbug/cacheql
136
+ homepage: https://github.com/chatterbugapp/cacheql
137
137
  licenses:
138
138
  - MIT
139
139
  metadata: {}