graphql-fragment_cache 0.1.1 → 0.1.6
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/CHANGELOG.md +22 -0
- data/README.md +9 -4
- data/lib/.rbnext/2.7/graphql/fragment_cache/cache_key_builder.rb +85 -5
- data/lib/graphql-fragment_cache.rb +1 -1
- data/lib/graphql/fragment_cache.rb +2 -1
- data/lib/graphql/fragment_cache/cache_key_builder.rb +85 -5
- data/lib/graphql/fragment_cache/field_extension.rb +7 -3
- data/lib/graphql/fragment_cache/fragment.rb +4 -2
- data/lib/graphql/fragment_cache/object_helpers.rb +57 -2
- data/lib/graphql/fragment_cache/railtie.rb +4 -0
- data/lib/graphql/fragment_cache/version.rb +1 -1
- metadata +37 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d83b3ff9d3e9cc91b6f013214d2cc4d97c6d2fc8bd377bf38d1f68dd7f935c23
|
4
|
+
data.tar.gz: d349157e8c6856c06b5a3ae76915399ae77fc04153093ef9551bb75b45629cb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 759813c8b9ae4373d9890519aa88573eb9a504771eca25ea7d7ddc2a35b972f172e1fb7e86bbd2f52447886e3c781178cfc7491c9a7257ce436ae411a32395fb
|
7
|
+
data.tar.gz: 78c75d761fc3154dd4a4622a36c5b0f7bbc4b26c31eb4bf3e3c6be4423be8ae64923d7207f02217142c213fa80e039410e2d079403c0258efd82543d9866e41d
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,28 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.1.6 (2020-05-30)
|
6
|
+
|
7
|
+
- [PR#22](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/22) Properly cache entites inside collections ([@DmitryTsepelev][])
|
8
|
+
|
9
|
+
## 0.1.5 (2020-04-28)
|
10
|
+
|
11
|
+
- [PR#19](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/19) Add connections support ([@DmitryTsepelev][])
|
12
|
+
- [PR#18](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/18) Support aliases in cache key generation ([@palkan][], [@DmitryTsepelev][])
|
13
|
+
|
14
|
+
## 0.1.4 (2020-04-25)
|
15
|
+
|
16
|
+
- Fix railtie to set up null store for tests ([@DmitryTsepelev][])
|
17
|
+
|
18
|
+
## 0.1.3 (2020-04-24)
|
19
|
+
|
20
|
+
- [PR#17](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/17) Properly build cache keys based on input arguments ([@DmitryTsepelev][])
|
21
|
+
|
22
|
+
## 0.1.2 (2020-04-24)
|
23
|
+
|
24
|
+
- [PR#16](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/16) Railtie turns off caching in test environment ([@DmitryTsepelev][])
|
25
|
+
- [PR#15](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/15) Avoid extra resolving when resolved_value is not used for building cache key ([@DmitryTsepelev][])
|
26
|
+
|
5
27
|
## 0.1.1 (2020-04-15)
|
6
28
|
|
7
29
|
- Fix using passed object as a cache key ([@palkan][])
|
data/README.md
CHANGED
@@ -61,6 +61,15 @@ class QueryType < BaseObject
|
|
61
61
|
end
|
62
62
|
```
|
63
63
|
|
64
|
+
If you use [connections](https://graphql-ruby.org/pagination/connection_concepts.html) and plan to cache them—please turn on [brand new](https://github.com/rmosolgo/graphql-ruby/blob/master/lib/graphql/pagination/connections.rb#L5) connections hierarchy in your schema:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
class GraphqSchema < GraphQL::Schema
|
68
|
+
# ...
|
69
|
+
use GraphQL::Pagination::Connections
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
64
73
|
## Cache key generation
|
65
74
|
|
66
75
|
Cache keys consist of implicit and explicit (provided by user) parts.
|
@@ -266,10 +275,6 @@ class QueryType < BaseObject
|
|
266
275
|
end
|
267
276
|
```
|
268
277
|
|
269
|
-
## Limitations
|
270
|
-
|
271
|
-
- [Field aliases](https://spec.graphql.org/June2018/#sec-Field-Alias) are not currently supported (take a look at the failing spec [here](https://github.com/DmitryTsepelev/graphql-ruby-fragment_cache/pull/7))
|
272
|
-
|
273
278
|
## Credits
|
274
279
|
|
275
280
|
Based on the original [gist](https://gist.github.com/palkan/faad9f6ff1db16fcdb1c071ec50e4190) by [@palkan](https://github.com/palkan) and [@ssnickolay](https://github.com/ssnickolay).
|
@@ -18,6 +18,71 @@ module GraphQL
|
|
18
18
|
}.join(".")
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
refine ::GraphQL::Language::Nodes::AbstractNode do
|
23
|
+
def alias?(_)
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
refine ::GraphQL::Language::Nodes::Field do
|
29
|
+
def alias?(val)
|
30
|
+
self.alias == val
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
refine ::GraphQL::Execution::Lookahead do
|
35
|
+
def selection_with_alias(name, **kwargs)
|
36
|
+
return selection(name, **kwargs) if selects?(name, **kwargs)
|
37
|
+
alias_selection(name, **kwargs)
|
38
|
+
end
|
39
|
+
|
40
|
+
def alias_selection(name, selected_type: @selected_type, arguments: nil)
|
41
|
+
return alias_selections[name] if alias_selections.key?(name)
|
42
|
+
|
43
|
+
alias_node = lookup_alias_node(ast_nodes, name)
|
44
|
+
return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
|
45
|
+
|
46
|
+
next_field_name = alias_node.name
|
47
|
+
|
48
|
+
# From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
|
49
|
+
next_field_defn = get_class_based_field(selected_type, next_field_name)
|
50
|
+
|
51
|
+
alias_selections[name] =
|
52
|
+
if next_field_defn
|
53
|
+
next_nodes = []
|
54
|
+
arguments = @query.arguments_for(alias_node, next_field_defn)
|
55
|
+
arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
|
56
|
+
@ast_nodes.each do |ast_node|
|
57
|
+
ast_node.selections.each do |selection|
|
58
|
+
find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if next_nodes.any?
|
63
|
+
::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
|
64
|
+
else
|
65
|
+
::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
|
66
|
+
end
|
67
|
+
else
|
68
|
+
::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def alias_selections
|
73
|
+
return @alias_selections if defined?(@alias_selections)
|
74
|
+
@alias_selections ||= {}
|
75
|
+
end
|
76
|
+
|
77
|
+
def lookup_alias_node(nodes, name)
|
78
|
+
return if nodes.empty?
|
79
|
+
nodes.find do |node|
|
80
|
+
return node if node.alias?(name)
|
81
|
+
child = lookup_alias_node(node.children, name)
|
82
|
+
return child if child
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
21
86
|
})
|
22
87
|
|
23
88
|
# Builds cache key for fragment
|
@@ -59,7 +124,12 @@ module GraphQL
|
|
59
124
|
|
60
125
|
def selections_cache_key
|
61
126
|
current_root =
|
62
|
-
path.reduce(query.lookahead) { |lkhd,
|
127
|
+
path.reduce(query.lookahead) { |lkhd, field_name|
|
128
|
+
# Handle cached fields inside collections:
|
129
|
+
next lkhd if field_name.is_a?(Integer)
|
130
|
+
|
131
|
+
lkhd.selection_with_alias(field_name)
|
132
|
+
}
|
63
133
|
|
64
134
|
current_root.selections.to_selections_key
|
65
135
|
end
|
@@ -68,15 +138,25 @@ module GraphQL
|
|
68
138
|
lookahead = query.lookahead
|
69
139
|
|
70
140
|
path.map { |field_name|
|
71
|
-
|
141
|
+
# Handle cached fields inside collections:
|
142
|
+
next field_name if field_name.is_a?(Integer)
|
143
|
+
|
144
|
+
lookahead = lookahead.selection_with_alias(field_name)
|
145
|
+
raise "Failed to look ahead the field: #{field_name}" if lookahead.is_a?(::GraphQL::Execution::Lookahead::NullLookahead)
|
72
146
|
|
73
|
-
next
|
147
|
+
next lookahead.field.name if lookahead.arguments.empty?
|
74
148
|
|
75
|
-
args = lookahead.arguments.map { |_1, _2| "#{_1}:#{_2}" }.sort.join(",")
|
76
|
-
"#{
|
149
|
+
args = lookahead.arguments.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
|
150
|
+
"#{lookahead.field.name}(#{args})"
|
77
151
|
}.join("/")
|
78
152
|
end
|
79
153
|
|
154
|
+
def traverse_argument(argument)
|
155
|
+
return argument unless argument.is_a?(GraphQL::Schema::InputObject)
|
156
|
+
|
157
|
+
"{#{argument.map { |_1, _2| "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
|
158
|
+
end
|
159
|
+
|
80
160
|
def object_key(obj)
|
81
161
|
obj._graphql_cache_key
|
82
162
|
end
|
@@ -12,7 +12,6 @@ require "graphql/fragment_cache/instrumentation"
|
|
12
12
|
require "graphql/fragment_cache/memory_store"
|
13
13
|
|
14
14
|
require "graphql/fragment_cache/version"
|
15
|
-
require "graphql/fragment_cache/railtie" if defined?(Rails::Railtie)
|
16
15
|
|
17
16
|
module GraphQL
|
18
17
|
# Plugin definition
|
@@ -57,3 +56,5 @@ module GraphQL
|
|
57
56
|
self.cache_store = MemoryStore.new
|
58
57
|
end
|
59
58
|
end
|
59
|
+
|
60
|
+
require "graphql/fragment_cache/railtie" if defined?(Rails::Railtie)
|
@@ -18,6 +18,71 @@ module GraphQL
|
|
18
18
|
}.join(".")
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
refine ::GraphQL::Language::Nodes::AbstractNode do
|
23
|
+
def alias?(_)
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
refine ::GraphQL::Language::Nodes::Field do
|
29
|
+
def alias?(val)
|
30
|
+
self.alias == val
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
refine ::GraphQL::Execution::Lookahead do
|
35
|
+
def selection_with_alias(name, **kwargs)
|
36
|
+
return selection(name, **kwargs) if selects?(name, **kwargs)
|
37
|
+
alias_selection(name, **kwargs)
|
38
|
+
end
|
39
|
+
|
40
|
+
def alias_selection(name, selected_type: @selected_type, arguments: nil)
|
41
|
+
return alias_selections[name] if alias_selections.key?(name)
|
42
|
+
|
43
|
+
alias_node = lookup_alias_node(ast_nodes, name)
|
44
|
+
return ::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD unless alias_node
|
45
|
+
|
46
|
+
next_field_name = alias_node.name
|
47
|
+
|
48
|
+
# From https://github.com/rmosolgo/graphql-ruby/blob/1a9a20f3da629e63ea8e5ee8400be82218f9edc3/lib/graphql/execution/lookahead.rb#L91
|
49
|
+
next_field_defn = get_class_based_field(selected_type, next_field_name)
|
50
|
+
|
51
|
+
alias_selections[name] =
|
52
|
+
if next_field_defn
|
53
|
+
next_nodes = []
|
54
|
+
arguments = @query.arguments_for(alias_node, next_field_defn)
|
55
|
+
arguments = arguments.is_a?(::GraphQL::Execution::Interpreter::Arguments) ? arguments.keyword_arguments : arguments
|
56
|
+
@ast_nodes.each do |ast_node|
|
57
|
+
ast_node.selections.each do |selection|
|
58
|
+
find_selected_nodes(selection, next_field_name, next_field_defn, arguments: arguments, matches: next_nodes)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if next_nodes.any?
|
63
|
+
::GraphQL::Execution::Lookahead.new(query: @query, ast_nodes: next_nodes, field: next_field_defn, owner_type: selected_type)
|
64
|
+
else
|
65
|
+
::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
|
66
|
+
end
|
67
|
+
else
|
68
|
+
::GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def alias_selections
|
73
|
+
return @alias_selections if defined?(@alias_selections)
|
74
|
+
@alias_selections ||= {}
|
75
|
+
end
|
76
|
+
|
77
|
+
def lookup_alias_node(nodes, name)
|
78
|
+
return if nodes.empty?
|
79
|
+
nodes.find do |node|
|
80
|
+
return node if node.alias?(name)
|
81
|
+
child = lookup_alias_node(node.children, name)
|
82
|
+
return child if child
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
21
86
|
})
|
22
87
|
|
23
88
|
# Builds cache key for fragment
|
@@ -59,7 +124,12 @@ module GraphQL
|
|
59
124
|
|
60
125
|
def selections_cache_key
|
61
126
|
current_root =
|
62
|
-
path.reduce(query.lookahead) { |lkhd,
|
127
|
+
path.reduce(query.lookahead) { |lkhd, field_name|
|
128
|
+
# Handle cached fields inside collections:
|
129
|
+
next lkhd if field_name.is_a?(Integer)
|
130
|
+
|
131
|
+
lkhd.selection_with_alias(field_name)
|
132
|
+
}
|
63
133
|
|
64
134
|
current_root.selections.to_selections_key
|
65
135
|
end
|
@@ -68,15 +138,25 @@ module GraphQL
|
|
68
138
|
lookahead = query.lookahead
|
69
139
|
|
70
140
|
path.map { |field_name|
|
71
|
-
|
141
|
+
# Handle cached fields inside collections:
|
142
|
+
next field_name if field_name.is_a?(Integer)
|
143
|
+
|
144
|
+
lookahead = lookahead.selection_with_alias(field_name)
|
145
|
+
raise "Failed to look ahead the field: #{field_name}" if lookahead.is_a?(::GraphQL::Execution::Lookahead::NullLookahead)
|
72
146
|
|
73
|
-
next
|
147
|
+
next lookahead.field.name if lookahead.arguments.empty?
|
74
148
|
|
75
|
-
args = lookahead.arguments.map { "#{_1}:#{_2}" }.sort.join(",")
|
76
|
-
"#{
|
149
|
+
args = lookahead.arguments.map { "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")
|
150
|
+
"#{lookahead.field.name}(#{args})"
|
77
151
|
}.join("/")
|
78
152
|
end
|
79
153
|
|
154
|
+
def traverse_argument(argument)
|
155
|
+
return argument unless argument.is_a?(GraphQL::Schema::InputObject)
|
156
|
+
|
157
|
+
"{#{argument.map { "#{_1}:#{traverse_argument(_2)}" }.sort.join(",")}}"
|
158
|
+
end
|
159
|
+
|
80
160
|
def object_key(obj)
|
81
161
|
obj._graphql_cache_key
|
82
162
|
end
|
@@ -34,20 +34,24 @@ module GraphQL
|
|
34
34
|
@cache_key = @cache_options.delete(:cache_key)
|
35
35
|
end
|
36
36
|
|
37
|
+
NOT_RESOLVED = Object.new
|
38
|
+
|
37
39
|
def resolve(object:, arguments:, **_options)
|
38
|
-
resolved_value =
|
40
|
+
resolved_value = NOT_RESOLVED
|
39
41
|
|
40
42
|
object_for_key = if @context_key
|
41
43
|
Array(@context_key).map { |key| object.context[key] }
|
42
44
|
elsif @cache_key == :object
|
43
45
|
object.object
|
44
46
|
elsif @cache_key == :value
|
45
|
-
resolved_value
|
47
|
+
resolved_value = yield(object, arguments)
|
46
48
|
end
|
47
49
|
|
48
50
|
cache_fragment_options = @cache_options.merge(object: object_for_key)
|
49
51
|
|
50
|
-
object.cache_fragment(cache_fragment_options)
|
52
|
+
object.cache_fragment(cache_fragment_options) do
|
53
|
+
resolved_value == NOT_RESOLVED ? yield(object, arguments) : resolved_value
|
54
|
+
end
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
@@ -6,7 +6,9 @@ module GraphQL
|
|
6
6
|
module FragmentCache
|
7
7
|
# Represents a single fragment to cache
|
8
8
|
class Fragment
|
9
|
-
attr_reader :options, :path, :context
|
9
|
+
attr_reader :options, :path, :context, :raw_connection
|
10
|
+
|
11
|
+
attr_writer :raw_connection
|
10
12
|
|
11
13
|
def initialize(context, **options)
|
12
14
|
@context = context
|
@@ -19,7 +21,7 @@ module GraphQL
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def persist(final_value)
|
22
|
-
value = resolve(final_value)
|
24
|
+
value = raw_connection || resolve(final_value)
|
23
25
|
FragmentCache.cache_store.write(cache_key, value, **options)
|
24
26
|
end
|
25
27
|
|
@@ -6,23 +6,78 @@ module GraphQL
|
|
6
6
|
module FragmentCache
|
7
7
|
using Ext
|
8
8
|
|
9
|
+
RawConnection = Struct.new(:items, :nodes, :paged_nodes_offset, :has_previous_page, :has_next_page)
|
10
|
+
|
9
11
|
# Adds #cache_fragment method
|
10
12
|
module ObjectHelpers
|
13
|
+
extend Forwardable
|
14
|
+
|
11
15
|
NO_OBJECT = Object.new
|
12
16
|
|
17
|
+
def_delegator :field, :connection?
|
18
|
+
|
13
19
|
def cache_fragment(object_to_cache = NO_OBJECT, **options, &block)
|
14
20
|
raise ArgumentError, "Block or argument must be provided" unless block_given? || object_to_cache != NO_OBJECT
|
15
21
|
|
16
22
|
options[:object] = object_to_cache if object_to_cache != NO_OBJECT
|
23
|
+
|
17
24
|
fragment = Fragment.new(context, options)
|
18
25
|
|
19
26
|
if (cached = fragment.read)
|
20
|
-
return
|
27
|
+
return restore_cached_value(cached)
|
28
|
+
end
|
29
|
+
|
30
|
+
(block_given? ? block.call : object_to_cache).tap do |resolved_value|
|
31
|
+
cache_value(resolved_value, fragment)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def restore_cached_value(cached)
|
38
|
+
connection? ? restore_cached_connection(cached) : raw_value(cached)
|
39
|
+
end
|
40
|
+
|
41
|
+
def cache_value(resolved_value, fragment)
|
42
|
+
if connection?
|
43
|
+
unless context.schema.new_connections?
|
44
|
+
raise StandardError,
|
45
|
+
"GraphQL::Pagination::Connections should be enabled for connection caching"
|
46
|
+
end
|
47
|
+
|
48
|
+
connection = wrap_connection(resolved_value)
|
49
|
+
|
50
|
+
fragment.raw_connection = RawConnection.new(
|
51
|
+
connection.items,
|
52
|
+
connection.nodes,
|
53
|
+
connection.instance_variable_get(:@paged_nodes_offset),
|
54
|
+
connection.has_previous_page,
|
55
|
+
connection.has_next_page
|
56
|
+
)
|
21
57
|
end
|
22
58
|
|
23
59
|
context.fragments << fragment
|
60
|
+
end
|
61
|
+
|
62
|
+
def field
|
63
|
+
interpreter_context[:current_field]
|
64
|
+
end
|
65
|
+
|
66
|
+
def interpreter_context
|
67
|
+
@interpreter_context ||= context.namespace(:interpreter)
|
68
|
+
end
|
69
|
+
|
70
|
+
def restore_cached_connection(raw_connection)
|
71
|
+
wrap_connection(raw_connection.items).tap do |connection|
|
72
|
+
connection.instance_variable_set(:@nodes, raw_connection.nodes)
|
73
|
+
connection.instance_variable_set(:@paged_nodes_offset, raw_connection.paged_nodes_offset)
|
74
|
+
connection.instance_variable_set(:@has_previous_page, raw_connection.has_previous_page)
|
75
|
+
connection.instance_variable_set(:@has_next_page, raw_connection.has_next_page)
|
76
|
+
end
|
77
|
+
end
|
24
78
|
|
25
|
-
|
79
|
+
def wrap_connection(object)
|
80
|
+
context.schema.connections.wrap(field, object, interpreter_context[:current_arguments], context)
|
26
81
|
end
|
27
82
|
end
|
28
83
|
end
|
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: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DmitryTsepelev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.10.
|
19
|
+
version: 1.10.8
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.10.
|
26
|
+
version: 1.10.8
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: ruby-next
|
28
|
+
name: ruby-next
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.7.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.7.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: combustion
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activerecord
|
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: sqlite3
|
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'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +128,14 @@ dependencies:
|
|
100
128
|
requirements:
|
101
129
|
- - ">="
|
102
130
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
131
|
+
version: '0.6'
|
104
132
|
type: :development
|
105
133
|
prerelease: false
|
106
134
|
version_requirements: !ruby/object:Gem::Requirement
|
107
135
|
requirements:
|
108
136
|
- - ">="
|
109
137
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
138
|
+
version: '0.6'
|
111
139
|
description: Fragment cache for graphql-ruby
|
112
140
|
email:
|
113
141
|
- dmitry.a.tsepelev@gmail.com
|