graphql-client 0.0.9 → 0.0.10
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/lib/graphql/client.rb +50 -39
- data/lib/graphql/language/operation_slice.rb +3 -1
- metadata +12 -8
- data/lib/graphql/language/mutator.rb +0 -35
- data/lib/graphql/relay/parser.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4e9abe01489f5224ba5c84893f5ea903b005f60
|
4
|
+
data.tar.gz: 713e06fac524292c381d2b83a9addb10cae3d3f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38e2dd21778105c39cc58efcbf5799bb9bfb72b8243e827057794aeeec39966cca2ff2ad1b9f7c2b8b7facd109cb71e23c511fa1c2e1eb7a63c8ff351bcb339d
|
7
|
+
data.tar.gz: b941fac81280d251fb0a8156917ff7cdb2e0179c95f935fe203c8336f671a396d398c29cae96b16dd6061846a190a3c6c3e21886cdc4cad9e191d05f9449c4df
|
data/lib/graphql/client.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
require "active_support/inflector"
|
2
2
|
require "graphql"
|
3
3
|
require "graphql/client/query_result"
|
4
|
-
require "graphql/language/mutator"
|
5
4
|
require "graphql/language/nodes/deep_freeze_ext"
|
6
5
|
require "graphql/language/operation_slice"
|
7
|
-
require "graphql/relay/parser"
|
8
6
|
|
9
7
|
module GraphQL
|
10
8
|
class Client
|
@@ -15,14 +13,24 @@ module GraphQL
|
|
15
13
|
|
16
14
|
def initialize(schema:)
|
17
15
|
@schema = schema
|
18
|
-
@
|
19
|
-
@document = GraphQL::Language::Nodes::Document.new(definitions: @definitions)
|
20
|
-
@document_slices = {}
|
16
|
+
@document = GraphQL::Language::Nodes::Document.new(definitions: [])
|
21
17
|
end
|
22
18
|
|
23
19
|
class Definition < Module
|
24
|
-
def
|
20
|
+
def self.for(node:, **kargs)
|
21
|
+
case node
|
22
|
+
when Language::Nodes::OperationDefinition
|
23
|
+
OperationDefinition.new(node: node, **kargs)
|
24
|
+
when Language::Nodes::FragmentDefinition
|
25
|
+
FragmentDefinition.new(node: node, **kargs)
|
26
|
+
else
|
27
|
+
raise TypeError, "expected node to be a definition type, but was #{node.class}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(node:, document:)
|
25
32
|
@definition_node = node
|
33
|
+
@document = document
|
26
34
|
end
|
27
35
|
|
28
36
|
# Internal: Get underlying operation or fragment defintion AST node for
|
@@ -49,6 +57,13 @@ module GraphQL
|
|
49
57
|
@definition_name ||= name.gsub("::", "__").freeze
|
50
58
|
end
|
51
59
|
|
60
|
+
# Public: Get document with only the definitions needed to perform this
|
61
|
+
# operation.
|
62
|
+
#
|
63
|
+
# Returns GraphQL::Language::Nodes::Document with one OperationDefinition
|
64
|
+
# and any FragmentDefinition dependencies.
|
65
|
+
attr_reader :document
|
66
|
+
|
52
67
|
def new(*args)
|
53
68
|
query_result_class.new(*args)
|
54
69
|
end
|
@@ -60,38 +75,21 @@ module GraphQL
|
|
60
75
|
end
|
61
76
|
|
62
77
|
class OperationDefinition < Definition
|
63
|
-
def initialize(document:, **kargs)
|
64
|
-
@document = document
|
65
|
-
super(**kargs)
|
66
|
-
end
|
67
|
-
|
68
78
|
# Public: Alias for definition name.
|
69
79
|
alias_method :operation_name, :definition_name
|
70
|
-
|
71
|
-
# Public: Owner document of operation definition.
|
72
|
-
#
|
73
|
-
# Returns GraphQL::Language::Nodes::Document of all registered
|
74
|
-
# definitions.
|
75
|
-
attr_reader :document
|
76
|
-
|
77
|
-
# Public: Get document with only the definitions needed to perform this
|
78
|
-
# operation.
|
79
|
-
#
|
80
|
-
# Returns GraphQL::Language::Nodes::Document with one OperationDefinition
|
81
|
-
# and any FragmentDefinition dependencies.
|
82
|
-
def operation_document
|
83
|
-
@operation_document ||= Language::OperationSlice.slice(document, operation_name).deep_freeze
|
84
|
-
end
|
85
80
|
end
|
86
81
|
|
87
82
|
class FragmentDefinition < Definition
|
88
83
|
end
|
89
84
|
|
90
85
|
def parse(str)
|
86
|
+
definition_dependencies = Set.new
|
87
|
+
|
91
88
|
str = str.gsub(/\.\.\.([a-zA-Z0-9_]+(::[a-zA-Z0-9_]+)+)/) { |m|
|
92
89
|
const_name = $1
|
93
90
|
case fragment = ActiveSupport::Inflector.safe_constantize(const_name)
|
94
91
|
when FragmentDefinition
|
92
|
+
definition_dependencies.merge(fragment.document.definitions)
|
95
93
|
"...#{fragment.definition_name}"
|
96
94
|
when nil
|
97
95
|
raise NameError, "uninitialized constant #{const_name}\n#{str}"
|
@@ -100,23 +98,29 @@ module GraphQL
|
|
100
98
|
end
|
101
99
|
}
|
102
100
|
|
103
|
-
doc = GraphQL
|
101
|
+
doc = GraphQL.parse(str)
|
104
102
|
|
105
|
-
|
103
|
+
definition_dependencies.merge(doc.definitions)
|
104
|
+
document_dependencies = Language::Nodes::Document.new(definitions: definition_dependencies.to_a)
|
106
105
|
|
107
|
-
definitions
|
106
|
+
definitions = {}
|
108
107
|
doc.definitions.each do |node|
|
109
|
-
|
110
|
-
definition =
|
111
|
-
|
112
|
-
OperationDefinition.new(document: self.document, node: node)
|
113
|
-
when Language::Nodes::FragmentDefinition
|
114
|
-
FragmentDefinition.new(node: node)
|
115
|
-
end
|
116
|
-
definitions[local_name] = definition
|
117
|
-
renames[local_name] = -> { definition.definition_name }
|
108
|
+
sliced_document = Language::OperationSlice.slice(document_dependencies, node.name)
|
109
|
+
definition = Definition.for(node: node, document: sliced_document)
|
110
|
+
definitions[node.name] = definition
|
118
111
|
end
|
119
|
-
|
112
|
+
|
113
|
+
rename_node = -> (node, parent) {
|
114
|
+
if definition = definitions[node.name]
|
115
|
+
node.extend(LazyName)
|
116
|
+
node.name = -> { definition.definition_name }
|
117
|
+
end
|
118
|
+
}
|
119
|
+
visitor = Language::Visitor.new(doc)
|
120
|
+
visitor[Language::Nodes::FragmentDefinition].leave << rename_node
|
121
|
+
visitor[Language::Nodes::OperationDefinition].leave << rename_node
|
122
|
+
visitor[Language::Nodes::FragmentSpread].leave << rename_node
|
123
|
+
visitor.visit
|
120
124
|
|
121
125
|
doc.deep_freeze
|
122
126
|
|
@@ -147,5 +151,12 @@ module GraphQL
|
|
147
151
|
|
148
152
|
nil
|
149
153
|
end
|
154
|
+
|
155
|
+
private
|
156
|
+
module LazyName
|
157
|
+
def name
|
158
|
+
@name.call
|
159
|
+
end
|
160
|
+
end
|
150
161
|
end
|
151
162
|
end
|
@@ -16,7 +16,8 @@ module GraphQL
|
|
16
16
|
seen = Set.new([operation_name])
|
17
17
|
stack = [operation_name]
|
18
18
|
|
19
|
-
while
|
19
|
+
while stack.length > 0
|
20
|
+
name = stack.pop
|
20
21
|
names = find_definition_fragment_spreads(document, name)
|
21
22
|
seen.merge(names)
|
22
23
|
stack.concat(names.to_a)
|
@@ -27,6 +28,7 @@ module GraphQL
|
|
27
28
|
|
28
29
|
def self.find_definition_fragment_spreads(document, definition_name)
|
29
30
|
definition = document.definitions.find { |node| node.name == definition_name }
|
31
|
+
raise "missing definition: #{definition_name}" if !definition
|
30
32
|
spreads = Set.new
|
31
33
|
visitor = Visitor.new(definition)
|
32
34
|
visitor[Nodes::FragmentSpread].enter << -> (node, parent) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
|
+
- - "<="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,6 +27,9 @@ dependencies:
|
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '3.0'
|
30
|
+
- - "<="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: graphql
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,8 +72,8 @@ dependencies:
|
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
74
|
version: '11.2'
|
69
|
-
description:
|
70
|
-
email:
|
75
|
+
description: "???"
|
76
|
+
email: engineering@github.com
|
71
77
|
executables: []
|
72
78
|
extensions: []
|
73
79
|
extra_rdoc_files: []
|
@@ -75,11 +81,9 @@ files:
|
|
75
81
|
- LICENSE
|
76
82
|
- lib/graphql/client.rb
|
77
83
|
- lib/graphql/client/query_result.rb
|
78
|
-
- lib/graphql/language/mutator.rb
|
79
84
|
- lib/graphql/language/nodes/deep_freeze_ext.rb
|
80
85
|
- lib/graphql/language/operation_slice.rb
|
81
|
-
|
82
|
-
homepage:
|
86
|
+
homepage: https://github.com/github/graphql-client
|
83
87
|
licenses:
|
84
88
|
- MIT
|
85
89
|
metadata: {}
|
@@ -102,5 +106,5 @@ rubyforge_project:
|
|
102
106
|
rubygems_version: 2.4.5.1
|
103
107
|
signing_key:
|
104
108
|
specification_version: 4
|
105
|
-
summary:
|
109
|
+
summary: GraphQL Client
|
106
110
|
test_files: []
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require "graphql"
|
2
|
-
require "set"
|
3
|
-
|
4
|
-
module GraphQL
|
5
|
-
module Language
|
6
|
-
class Mutator
|
7
|
-
def initialize(document)
|
8
|
-
@document = document
|
9
|
-
end
|
10
|
-
|
11
|
-
module LazyName
|
12
|
-
def name
|
13
|
-
@name.call
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def rename_definitions(definitions)
|
18
|
-
rename_node = -> (node, parent) {
|
19
|
-
if name = definitions[node.name]
|
20
|
-
node.extend(LazyName) if name.is_a?(Proc)
|
21
|
-
node.name = name
|
22
|
-
end
|
23
|
-
}
|
24
|
-
|
25
|
-
visitor = Visitor.new(@document)
|
26
|
-
visitor[Nodes::FragmentDefinition].leave << rename_node
|
27
|
-
visitor[Nodes::OperationDefinition].leave << rename_node
|
28
|
-
visitor[Nodes::FragmentSpread].leave << rename_node
|
29
|
-
visitor.visit
|
30
|
-
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/graphql/relay/parser.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require "graphql"
|
2
|
-
|
3
|
-
module GraphQL
|
4
|
-
module Relay
|
5
|
-
module Parser
|
6
|
-
ANONYMOUS_SENTINEL = "__anonymous__".freeze
|
7
|
-
|
8
|
-
# Public: Extended GraphQL.parse that supports Relay style anonymous
|
9
|
-
# fragments.
|
10
|
-
#
|
11
|
-
# TODO: See about getting support for this upstreamed to the graphql-ruby
|
12
|
-
# gem.
|
13
|
-
#
|
14
|
-
# str - A GraphQL String
|
15
|
-
#
|
16
|
-
# Returns a GraphQL::Language::Nodes::Document.
|
17
|
-
def self.parse(str)
|
18
|
-
str = str.sub(/fragment on /, "fragment #{ANONYMOUS_SENTINEL} on ")
|
19
|
-
document = GraphQL.parse(str)
|
20
|
-
document.definitions.each do |node|
|
21
|
-
node.name = nil if node.name == ANONYMOUS_SENTINEL
|
22
|
-
end
|
23
|
-
document
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|