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 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