graphql-client 0.0.9 → 0.0.10

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
  SHA1:
3
- metadata.gz: 8a60948e4ebebe634045e72a530fccc7e7447b40
4
- data.tar.gz: a1b16f7712be91dbe4bff628b4113b5d5d7ef39e
3
+ metadata.gz: e4e9abe01489f5224ba5c84893f5ea903b005f60
4
+ data.tar.gz: 713e06fac524292c381d2b83a9addb10cae3d3f7
5
5
  SHA512:
6
- metadata.gz: c69238f56d5a2a659e5400b669c4c6cf358ed8b967f8cb88e90c87c708d1cc3361fe4c1c6dcf34bdb94caff6fc87c24d964f5fecab38fc69987458964be63cec
7
- data.tar.gz: a2422fbb6cd197535d4c4ba51e26235b2906e6b00f78db4b08bf551f2c0c680a5d0231987c8bffcb2b5451ad29c284c851581511c1760fe8c9015387bc1acc8a
6
+ metadata.gz: 38e2dd21778105c39cc58efcbf5799bb9bfb72b8243e827057794aeeec39966cca2ff2ad1b9f7c2b8b7facd109cb71e23c511fa1c2e1eb7a63c8ff351bcb339d
7
+ data.tar.gz: b941fac81280d251fb0a8156917ff7cdb2e0179c95f935fe203c8336f671a396d398c29cae96b16dd6061846a190a3c6c3e21886cdc4cad9e191d05f9449c4df
@@ -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
- @definitions = []
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 initialize(node:)
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::Relay::Parser.parse(str)
101
+ doc = GraphQL.parse(str)
104
102
 
105
- mutator = GraphQL::Language::Mutator.new(doc)
103
+ definition_dependencies.merge(doc.definitions)
104
+ document_dependencies = Language::Nodes::Document.new(definitions: definition_dependencies.to_a)
106
105
 
107
- definitions, renames = {}, {}
106
+ definitions = {}
108
107
  doc.definitions.each do |node|
109
- local_name = node.name
110
- definition = case node
111
- when Language::Nodes::OperationDefinition
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
- mutator.rename_definitions(renames)
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 name = stack.pop
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.9
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-06 00:00:00.000000000 Z
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
- - lib/graphql/relay/parser.rb
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
@@ -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