graphql 2.0.26 → 2.0.27

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b25908e65f82d9c17e76e1f38b874e882c124b7102dc7ae2cb3caf4e819aa370
4
- data.tar.gz: d3933abea4a559db3767c6a1ea3f37401432a7fd67842df6c9bd3e28e4034a8d
3
+ metadata.gz: e62749a86dd0b2913ebcb9a8be343d7f0eb7199f1e301bc6b584227ddfa6bdec
4
+ data.tar.gz: d9de79c247f14d316741a66162c3ff96d5621dd689ab837f488277d53701d66d
5
5
  SHA512:
6
- metadata.gz: a8a85cb8ee54143b1ed00b6aa030479a1b48e164142e93e6b1e95f0f8cb44da36fcd1f3b53470f8edb783f43d469fd4e2dafa505217440832eb0d92165107239
7
- data.tar.gz: dc61c951d84cc9199910145230cf55691d4fdb3a8f243b0e9f5dd9ee78c498a739de3d0bb72a65ade0cab07a9310a072dc7855ad5943425e778bd9b79f182e67
6
+ metadata.gz: 11adf0c6bf4279b840b2b5ba1627ec11f4cca4d08957faac1956b261d01b914e7f8c9cc9a737c4ce02fb404bb3abac1904c9fe74255ecf367b7b88dc64133fcf
7
+ data.tar.gz: b04cfe4e331da788f7c5706671e53fd2f0bfae680da896198a3d127922f6b92609cd6f720e98d7d2fb03cdea532b5a4f1536fd1bd6e154c5beb98b010dcedce5
@@ -6,7 +6,24 @@ module Graphql
6
6
  # Add Node, `node(id:)`, and `nodes(ids:)`
7
7
  template("node_type.erb", "#{options[:directory]}/types/node_type.rb")
8
8
  in_root do
9
- fields = " # Add `node(id: ID!) and `nodes(ids: [ID!]!)`\n include GraphQL::Types::Relay::HasNodeField\n include GraphQL::Types::Relay::HasNodesField\n\n"
9
+ fields = <<-RUBY
10
+ field :node, Types::NodeType, null: true, description: "Fetches an object given its ID." do
11
+ argument :id, ID, required: true, description: "ID of the object."
12
+ end
13
+
14
+ def node(id:)
15
+ context.schema.object_from_id(id, context)
16
+ end
17
+
18
+ field :nodes, [Types::NodeType, null: true], null: true, description: "Fetches a list of objects given a list of IDs." do
19
+ argument :ids, [ID], required: true, description: "IDs of the objects."
20
+ end
21
+
22
+ def nodes(ids:)
23
+ ids.map { |id| context.schema.object_from_id(id, context) }
24
+ end
25
+
26
+ RUBY
10
27
  inject_into_file "#{options[:directory]}/types/query_type.rb", fields, after: /class .*QueryType\s*<\s*[^\s]+?\n/m, force: false
11
28
  end
12
29
 
@@ -4,7 +4,7 @@ require "strscan"
4
4
 
5
5
  module GraphQL
6
6
  module Language
7
- module Lexer
7
+ class Lexer
8
8
  IDENTIFIER = /[_A-Za-z][_0-9A-Za-z]*/
9
9
  NEWLINE = /[\c\r\n]/
10
10
  BLANK = /[, \t]+/
@@ -87,60 +87,81 @@ module GraphQL
87
87
  # # catch-all for anything else. must be at the bottom for precedence.
88
88
  UNKNOWN_CHAR = /./
89
89
 
90
- def self.tokenize string
91
- meta = {
92
- line: 1,
93
- col: 1,
94
- tokens: [],
95
- previous_token: nil,
96
- }
90
+ def initialize(value)
91
+ @line = 1
92
+ @col = 1
93
+ @previous_token = nil
97
94
 
95
+ @scan = scanner value
96
+ end
97
+
98
+ class BadEncoding < Lexer # :nodoc:
99
+ def scanner(value)
100
+ [emit(:BAD_UNICODE_ESCAPE, 0, 0, value)]
101
+ end
102
+
103
+ def next_token
104
+ @scan.pop
105
+ end
106
+ end
107
+
108
+ def self.tokenize(string)
98
109
  value = string.dup.force_encoding(Encoding::UTF_8)
99
110
 
100
- unless value.valid_encoding?
101
- emit(:BAD_UNICODE_ESCAPE, 0, 0, meta, value)
102
- return meta[:tokens]
111
+ scanner = if value.valid_encoding?
112
+ new value
113
+ else
114
+ BadEncoding.new value
103
115
  end
104
116
 
105
- scan = StringScanner.new value
106
-
107
- while !scan.eos?
108
- pos = scan.pos
109
-
110
- case
111
- when str = scan.scan(FLOAT) then emit(:FLOAT, pos, scan.pos, meta, str)
112
- when str = scan.scan(INT) then emit(:INT, pos, scan.pos, meta, str)
113
- when str = scan.scan(LIT) then emit(LIT_NAME_LUT[str], pos, scan.pos, meta, -str)
114
- when str = scan.scan(IDENTIFIER) then emit(:IDENTIFIER, pos, scan.pos, meta, str)
115
- when str = scan.scan(BLOCK_STRING) then emit_block(pos, scan.pos, meta, str.gsub(/^#{BLOCK_QUOTE}|#{BLOCK_QUOTE}$/, ''))
116
- when str = scan.scan(QUOTED_STRING) then emit_string(pos, scan.pos, meta, str.gsub(/^"|"$/, ''))
117
- when str = scan.scan(COMMENT) then record_comment(pos, scan.pos, meta, str)
118
- when str = scan.scan(NEWLINE)
119
- meta[:line] += 1
120
- meta[:col] = 1
121
- when scan.scan(BLANK)
122
- meta[:col] += scan.pos - pos
123
- when str = scan.scan(UNKNOWN_CHAR) then emit(:UNKNOWN_CHAR, pos, scan.pos, meta, str)
124
- else
125
- # This should never happen since `UNKNOWN_CHAR` ensures we make progress
126
- raise "Unknown string?"
127
- end
117
+ toks = []
118
+
119
+ while tok = scanner.next_token
120
+ toks << tok
128
121
  end
129
122
 
130
- meta[:tokens]
123
+ toks
124
+ end
125
+
126
+ def next_token
127
+ return if @scan.eos?
128
+
129
+ pos = @scan.pos
130
+
131
+ case
132
+ when str = @scan.scan(FLOAT) then emit(:FLOAT, pos, @scan.pos, str)
133
+ when str = @scan.scan(INT) then emit(:INT, pos, @scan.pos, str)
134
+ when str = @scan.scan(LIT) then emit(LIT_NAME_LUT[str], pos, @scan.pos, -str)
135
+ when str = @scan.scan(IDENTIFIER) then emit(:IDENTIFIER, pos, @scan.pos, str)
136
+ when str = @scan.scan(BLOCK_STRING) then emit_block(pos, @scan.pos, str.gsub(/\A#{BLOCK_QUOTE}|#{BLOCK_QUOTE}\z/, ''))
137
+ when str = @scan.scan(QUOTED_STRING) then emit_string(pos, @scan.pos, str.gsub(/^"|"$/, ''))
138
+ when str = @scan.scan(COMMENT) then record_comment(pos, @scan.pos, str)
139
+ when str = @scan.scan(NEWLINE)
140
+ @line += 1
141
+ @col = 1
142
+ next_token
143
+ when @scan.scan(BLANK)
144
+ @col += @scan.pos - pos
145
+ next_token
146
+ when str = @scan.scan(UNKNOWN_CHAR) then emit(:UNKNOWN_CHAR, pos, @scan.pos, str)
147
+ else
148
+ # This should never happen since `UNKNOWN_CHAR` ensures we make progress
149
+ raise "Unknown string?"
150
+ end
131
151
  end
132
152
 
133
- def self.emit(token_name, ts, te, meta, token_value)
134
- meta[:tokens] << token = [
153
+ def emit(token_name, ts, te, token_value)
154
+ token = [
135
155
  token_name,
136
- meta[:line],
137
- meta[:col],
156
+ @line,
157
+ @col,
138
158
  token_value,
139
- meta[:previous_token],
159
+ @previous_token,
140
160
  ]
141
- meta[:previous_token] = token
161
+ @previous_token = token
142
162
  # Bump the column counter for the next token
143
- meta[:col] += te - ts
163
+ @col += te - ts
164
+ token
144
165
  end
145
166
 
146
167
  # Replace any escaped unicode or whitespace with the _actual_ characters
@@ -169,18 +190,19 @@ module GraphQL
169
190
  nil
170
191
  end
171
192
 
172
- def self.record_comment(ts, te, meta, str)
193
+ def record_comment(ts, te, str)
173
194
  token = [
174
195
  :COMMENT,
175
- meta[:line],
176
- meta[:col],
196
+ @line,
197
+ @col,
177
198
  str,
178
- meta[:previous_token],
199
+ @previous_token,
179
200
  ]
180
201
 
181
- meta[:previous_token] = token
202
+ @previous_token = token
182
203
 
183
- meta[:col] += te - ts
204
+ @col += te - ts
205
+ next_token
184
206
  end
185
207
 
186
208
  ESCAPES = /\\["\\\/bfnrt]/
@@ -197,26 +219,34 @@ module GraphQL
197
219
  UTF_8 = /\\u(?:([\dAa-f]{4})|\{([\da-f]{4,})\})(?:\\u([\dAa-f]{4}))?/i
198
220
  VALID_STRING = /\A(?:[^\\]|#{ESCAPES}|#{UTF_8})*\z/o
199
221
 
200
- def self.emit_block(ts, te, meta, value)
222
+ def emit_block(ts, te, value)
201
223
  line_incr = value.count("\n")
202
224
  value = GraphQL::Language::BlockString.trim_whitespace(value)
203
- emit_string(ts, te, meta, value)
204
- meta[:line] += line_incr
225
+ tok = emit_string(ts, te, value)
226
+ @line += line_incr
227
+ tok
205
228
  end
206
229
 
207
- def self.emit_string(ts, te, meta, value)
230
+ def emit_string(ts, te, value)
208
231
  if !value.valid_encoding? || !value.match?(VALID_STRING)
209
- emit(:BAD_UNICODE_ESCAPE, ts, te, meta, value)
232
+ emit(:BAD_UNICODE_ESCAPE, ts, te, value)
210
233
  else
211
- replace_escaped_characters_in_place(value)
234
+ self.class.replace_escaped_characters_in_place(value)
212
235
 
213
236
  if !value.valid_encoding?
214
- emit(:BAD_UNICODE_ESCAPE, ts, te, meta, value)
237
+ emit(:BAD_UNICODE_ESCAPE, ts, te, value)
215
238
  else
216
- emit(:STRING, ts, te, meta, value)
239
+ emit(:STRING, ts, te, value)
217
240
  end
218
241
  end
219
242
  end
243
+
244
+ private
245
+
246
+ def scanner(value)
247
+ StringScanner.new value
248
+ end
249
+
220
250
  end
221
251
  end
222
252
  end