graphlyte 0.1.6 → 0.2.0

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
  SHA256:
3
- metadata.gz: 6daff225ff526c8866c59601de914bbf7cac87c0393d5a3918a16f78c249eaa7
4
- data.tar.gz: 104deccd41d6dc5fd2be8a263f8549e5190f088717737fed61b9ae9da78aca6d
3
+ metadata.gz: 1fb8e6d42096e7e5c6e90a08a6c41e3cf3e149ecea8be199b13b22e7d23f5ba9
4
+ data.tar.gz: 14f1a49e6137b351abad7905f6a404cfb7d8185e8e9737eb461f7585493f29fd
5
5
  SHA512:
6
- metadata.gz: 539c3dfd3b611f79341f32b8eb61db2c76d0c92fd3e2e3d7312dd6d1946ec51463ac7f7f8db09e663a8681e9afc065f5cf0b7a5788d5129ca6e08d5b4870ce28
7
- data.tar.gz: 642ca3c211d11e1b6613a6910ed618685d9a87ae3057438f7f5ab3ccc63dba26041691a4a81309b77e41b682b86ad4aefe6789631fd3b0ddccb11b882d959947
6
+ metadata.gz: 25307883854658ec75267848491b2e76fa1ded6af1f0b8fee7b6315627c9adc7183ebe1d863efd1759c67f1d4241cc2677cfef23219c2add4526e9af28d282e5
7
+ data.tar.gz: 87bc35ce7157b1f53f59b23f389c7be03db2fec9c883e6db05c0a8f8e5799f00dc6b048174ef1f8f7ff7e480615d0cc0a171d8e2b339ab3da55a3774874641f2
@@ -16,6 +16,7 @@ module Graphlyte
16
16
  values&.each do |key, value|
17
17
  if value.is_a?(Set)
18
18
  variables.concat extract_variables(value.values)
19
+ elsif value.is_a?(Array)
19
20
  elsif value.symbol?
20
21
  variables << value
21
22
  elsif value.formal?
@@ -60,12 +61,20 @@ module Graphlyte
60
61
  data.inject({}) do |memo, (k, v)|
61
62
  if v.is_a?(Array)
62
63
  memo[k] = v.map do |item|
63
- Value.new(item)
64
+ if item.is_a?(Value)
65
+ item
66
+ else
67
+ Value.new(item)
68
+ end
64
69
  end
65
70
  elsif v.is_a?(Hash)
66
71
  memo[k] = Set.new(v)
67
72
  else
68
- memo[k] = Value.new(v)
73
+ if v.is_a?(Value)
74
+ memo[k] = v
75
+ else
76
+ memo[k] = Value.new(v)
77
+ end
69
78
  end
70
79
  memo
71
80
  end
@@ -4,11 +4,17 @@ module Graphlyte
4
4
  class Value
5
5
  using Refinements::StringRefinement
6
6
 
7
- attr_reader :value
7
+ attr_reader :value, :default
8
8
 
9
- def initialize(value)
9
+ def initialize(value, default = nil)
10
10
  raise ArgumentError, "Hash not allowed in this context" if value.is_a? Hash
11
- @value = value
11
+ if value.is_a?(Value)
12
+ @value = value.value
13
+ @default = value.default
14
+ else
15
+ @value = value
16
+ @default = default
17
+ end
12
18
  end
13
19
 
14
20
  def symbol?
@@ -17,7 +17,7 @@ module Graphlyte
17
17
  end
18
18
 
19
19
  def method_missing(method, fieldset_or_hargs=nil, hargs={}, &block)
20
- # todo: camel case method
20
+ # todo: camel case method
21
21
 
22
22
  # hack for ruby bug in lower versions
23
23
  if [Fieldset, Fragment].include?(fieldset_or_hargs.class)
@@ -31,6 +31,10 @@ module Graphlyte
31
31
  field
32
32
  end
33
33
 
34
+ def respond_to_missing
35
+ true
36
+ end
37
+
34
38
  # for internal use only
35
39
  def >>
36
40
  @fields
@@ -1,26 +1,36 @@
1
1
  require_relative "./refinements/string_refinement"
2
+ require "json"
2
3
  module Graphlyte
3
4
  class Query < Fieldset
4
5
  using Refinements::StringRefinement
5
6
  attr_reader :name, :type
6
7
 
7
8
  def initialize(query_name=nil, type=:query, **hargs)
8
- @name = query_name
9
+ @name = query_name || "anonymousQuery"
9
10
  @type = type
10
11
  super(**hargs)
11
12
  end
12
13
 
13
14
  def placeholders
14
15
  flatten_variables(builder.>>).map do |value|
15
- ":#{value.value.placeholder} of #{value.value.name}"
16
+ unless value.formal?
17
+ str = ":#{value.value.to_sym.inspect} of unknown"
18
+ else
19
+ str = ":#{value.value.placeholder} of #{value.value.name}"
20
+ end
21
+
22
+ if value.default
23
+ str += " with default #{value.default.to_s}"
24
+ end
25
+ str
16
26
  end.join("\n")
17
27
  end
18
28
 
19
- def to_json(name="anonymousQuery", **hargs)
29
+ def to_json(query_name=name, **hargs)
20
30
  variables = flatten_variables(builder.>>).uniq { |v| v.value }
21
31
  types = merge_variable_types(variables, hargs)
22
32
 
23
- str = "#{type} #{name}"
33
+ str = "#{type} #{query_name}"
24
34
  unless types.empty?
25
35
  type_new = types.map do |type_arr|
26
36
  "$#{type_arr[0].to_camel_case}: #{type_arr[1]}"
@@ -0,0 +1,517 @@
1
+ require "strscan"
2
+ require_relative "../fieldset"
3
+ require_relative "../query"
4
+ require_relative "../fragment"
5
+ require_relative "../schema_query"
6
+ require_relative "../types"
7
+
8
+ module Graphlyte
9
+ module Schema
10
+ module ParserHelpers
11
+ def parse_fields
12
+ fields = repeat(:parse_field)
13
+ fields
14
+ end
15
+
16
+ def parse_field
17
+ alias_field = expect(:ALIAS)
18
+ if token = expect(:FRAGMENT_REF)
19
+ raise "Can't find fragment #{token[0][1]}" unless fragments_dictionary[token[0][1]]
20
+ fragments_dictionary[token[0][1]]
21
+ elsif field = expect(:FIELD_NAME)
22
+ args = parse_args
23
+ if fieldset = parse_fieldset
24
+ need(:END_FIELD)
25
+ field = Field.new(field[0][1], fieldset, args)
26
+ else
27
+ field = Field.new(field[0][1], Fieldset.empty, args)
28
+ end
29
+
30
+ if alias_field
31
+ field.alias(alias_field[0][1])
32
+ end
33
+
34
+ field
35
+ end
36
+ end
37
+
38
+ def parse_fieldset
39
+ if expect(:START_FIELD)
40
+ fields = parse_fields
41
+ Fieldset.new(builder: Builder.new(fields))
42
+ end
43
+ end
44
+
45
+ def parse_args
46
+ if expect(:START_ARGS)
47
+ args = repeat(:parse_arg).inject(&:merge)
48
+ need(:END_ARGS)
49
+ args
50
+ end
51
+ end
52
+
53
+ def parse_default
54
+ if expect(:START_DEFAULT_VALUE)
55
+ value = parse_value
56
+ need(:END_DEFAULT_VALUE)
57
+ value
58
+ end
59
+ end
60
+
61
+ def parse_arg
62
+ if (token = expect(:ARG_KEY)) && (value = parse_value)
63
+ defaults = parse_default
64
+ key = token[0][1]
65
+ hash = {}
66
+ if [Array, Hash].include?(value.class)
67
+ hash[key] = value
68
+ else
69
+ hash[key] = Graphlyte::Arguments::Value.new(value, defaults)
70
+ end
71
+ hash
72
+ elsif (token = expect(:SPECIAL_ARG_KEY)) && (value = parse_value)
73
+ defaults = parse_default
74
+ @special_args ||= {}
75
+ arg = {}
76
+ if [Array, Hash].include?(value.class)
77
+ arg[token[0][1]] = value
78
+ else
79
+ arg[token[0][1]] = Graphlyte::Arguments::Value.new(value, defaults)
80
+ end
81
+ @special_args.merge!(arg)
82
+ arg
83
+ end
84
+ end
85
+
86
+ def parse_value
87
+ if token = expect(:ARG_NUM_VALUE) || expect(:ARG_STRING_VALUE) || expect(:ARG_BOOL_VALUE) || expect(:ARG_FLOAT_VALUE)
88
+ token[0][1]
89
+ elsif token = expect(:SPECIAL_ARG_REF)
90
+ ref = token[0][1]
91
+ raise "Can't find ref $#{ref}" unless @special_args[ref]
92
+ value = @special_args[ref]
93
+ Arguments::Value.new(Graphlyte::TYPES.send(value.value, ref.to_sym), value.default)
94
+ elsif token = expect(:SPECIAL_ARG_VAL)
95
+ token[0][1]
96
+ elsif token = expect(:ARG_HASH_START)
97
+ parse_arg_hash
98
+ elsif expect(:ARG_ARRAY_START)
99
+ parse_arg_array
100
+ end
101
+ end
102
+
103
+ def parse_arg_array
104
+ args = repeat(:parse_value)
105
+ need(:ARG_ARRAY_END)
106
+ args
107
+ end
108
+
109
+ def parse_arg_hash
110
+ if (key = expect(:ARG_KEY)) && (value = parse_value)
111
+ need(:ARG_HASH_END)
112
+ hash = {}
113
+ hash[key[0][1]] = value
114
+ hash
115
+ end
116
+ end
117
+
118
+ def repeat(method)
119
+ results = []
120
+
121
+ while result = send(method)
122
+ results << result
123
+ end
124
+
125
+ results
126
+ end
127
+
128
+ def expect(*expected_tokens)
129
+ upcoming = tokens[position, expected_tokens.size]
130
+ if upcoming.map(&:first) == expected_tokens
131
+ advance(expected_tokens.size)
132
+ upcoming
133
+ end
134
+ end
135
+
136
+ def need(*required_tokens)
137
+ upcoming = tokens[position, required_tokens.size]
138
+ expect(*required_tokens) or raise "Unexpected tokens. Expected #{required_tokens.inspect} but got #{upcoming.inspect}"
139
+ end
140
+
141
+ def advance(offset = 1)
142
+ @position += offset
143
+ end
144
+
145
+ def sort_fragments(sorted = [], fragments)
146
+ return sorted if !fragments || fragments.empty?
147
+ fragment_tokens = fragments.shift
148
+
149
+ current_ref = fragment_tokens.find do |token|
150
+ token[0] == :FRAGMENT_REF
151
+ end
152
+
153
+ if current_ref
154
+ exists = sorted.any? do |frags|
155
+ frags.find do |el|
156
+ el[0] == :START_FRAGMENT && el[1] == current_ref[1]
157
+ end
158
+ end
159
+ if exists
160
+ sorted << fragment_tokens
161
+ sort_fragments(sorted, fragments)
162
+ else
163
+ fragments.push fragment_tokens
164
+ sort_fragments(sorted, fragments)
165
+ end
166
+ else
167
+ sorted << fragment_tokens
168
+ sort_fragments(sorted, fragments)
169
+ end
170
+ end
171
+
172
+ def take_fragments
173
+ aggregate = @tokens.inject({taking: false, idx: 0, fragments: []}) do |memo, token_arr|
174
+ if token_arr[0] == :END_FRAGMENT
175
+ memo[:fragments][memo[:idx]] << token_arr
176
+ memo[:taking] = false
177
+ memo[:idx] += 1
178
+ elsif token_arr[0] === :START_FRAGMENT
179
+ memo[:fragments][memo[:idx]] = [token_arr]
180
+ memo[:taking] = true
181
+ elsif memo[:taking]
182
+ memo[:fragments][memo[:idx]] << token_arr
183
+ end
184
+ memo
185
+ end
186
+ aggregate[:fragments]
187
+ end
188
+ end
189
+
190
+ class FragmentParser
191
+ attr_reader :tokens, :position, :fragments_dictionary
192
+
193
+ include ParserHelpers
194
+
195
+ def initialize(tokens)
196
+ @tokens = tokens.flatten(1)
197
+ @position = 0
198
+ @fragments_dictionary = {}
199
+ end
200
+
201
+ def parse_fragments
202
+ repeat(:parse_fragment)
203
+ fragments_dictionary
204
+ end
205
+
206
+ def parse_fragment
207
+ if token = expect(:START_FRAGMENT)
208
+ builder = Builder.new parse_fields
209
+ fragment = Fragment.new(token[0][1], token[0][2], builder: builder)
210
+ @fragments_dictionary[token[0][1]] = fragment
211
+ need(:END_FRAGMENT)
212
+ end
213
+ end
214
+ end
215
+
216
+ class Parser
217
+ attr_reader :tokens, :position, :fragments_dictionary
218
+
219
+ include ParserHelpers
220
+
221
+ def self.parse(gql)
222
+ obj = new Lexer.new(gql).tokenize
223
+ obj.parse
224
+ end
225
+
226
+ def initialize(tokens)
227
+ @tokens = tokens
228
+ @fragment_tokens = sort_fragments([], take_fragments)
229
+ @fragments_dictionary = {}
230
+ @fragments_dictionary = @fragment_tokens.any? ? FragmentParser.new(@fragment_tokens).parse_fragments : {}
231
+ @position = 0
232
+ end
233
+
234
+ def parse
235
+ if token = expect(:START_QUERY)
236
+ parse_query(token[0][1])
237
+ elsif token = expect(:START_MUTATION)
238
+ parse_mutation(token[1])
239
+ else
240
+ raise "INVALID"
241
+ end
242
+ end
243
+
244
+ def parse_query(name)
245
+ parse_args
246
+ builder = Builder.new parse_fields
247
+ query = Query.new(name, :query, builder: builder)
248
+ need(:END_QUERY)
249
+ query
250
+ end
251
+
252
+ def parse_mutation(name)
253
+ builder = Builder.new parse_fields
254
+ mutation = Query.new(name, :mutation, builder: builder)
255
+ need(:END_MUTATION)
256
+ mutation
257
+ end
258
+ end
259
+
260
+ class Lexer
261
+ attr_reader :stack, :scanner
262
+
263
+ def initialize(gql, scanner: StringScanner.new(gql))
264
+ @original_string = gql
265
+ @scanner = scanner
266
+ @tokens = []
267
+ end
268
+
269
+ SPECIAL_ARG_REGEX = /^\s*(?:(?<![\"\{]))([\w\!\[\]]+)(?:(?![\"\}]))/
270
+ SIMPLE_EXPRESSION = /(query|mutation|fragment)\s*\w+\s*on\w*.*\{\s*\n*[.|\w\s]*\}/
271
+ START_MAP = {
272
+ 'query' => :START_QUERY,
273
+ 'mutation' => :START_MUTATION,
274
+ 'fragment' => :START_FRAGMENT
275
+ }
276
+
277
+ def tokenize
278
+ until scanner.eos?
279
+ case state
280
+ when :default
281
+ if scanner.scan /^query (\w+)/
282
+ @tokens << [:START_QUERY, scanner[1]]
283
+ push_state :query
284
+ elsif scanner.scan /^mutation (\w+)/
285
+ @tokens << [:START_MUTATION, scanner[1]]
286
+ push_state :mutation
287
+ elsif scanner.scan /\s*fragment\s*(\w+)\s*on\s*(\w+)/
288
+ @tokens << [:START_FRAGMENT, scanner[1], scanner[2]]
289
+ push_state :fragment
290
+ elsif scanner.scan /\s*{\s*/
291
+ @tokens << [:START_FIELD]
292
+ push_state :field
293
+ elsif scanner.scan /\s*}\s*/
294
+ @tokens << [:END_EXPRESSION_SHOULDNT_GET_THIS]
295
+ else
296
+ advance
297
+ end
298
+ when :fragment
299
+ if scanner.scan /\s*\}\s*/
300
+ @tokens << [:END_FRAGMENT]
301
+ pop_state
302
+ pop_context
303
+ elsif scanner.check /^\s*\{\s*$/
304
+ if get_context == :field
305
+ push_state :field
306
+ push_context :field
307
+ else
308
+ scanner.scan /^\s*\{\s*$/
309
+ push_context :field
310
+ end
311
+ else
312
+ handle_field
313
+ end
314
+ when :mutation
315
+ if scanner.scan /\}/
316
+ @tokens << [:END_MUTATION]
317
+ pop_state
318
+ pop_context
319
+ elsif scanner.check /^\s*\{\s*$/
320
+ if get_context == :field
321
+ push_state :field
322
+ else
323
+ scanner.scan /^\s*\{\s*$/
324
+ push_context :field
325
+ end
326
+ else
327
+ handle_field
328
+ end
329
+ when :query
330
+ if scanner.scan /\}/
331
+ @tokens << [:END_QUERY]
332
+ pop_state
333
+ pop_context
334
+ elsif scanner.check /^\s*\{\s*$/
335
+ if get_context == :field
336
+ push_state :field
337
+ push_context :field
338
+ else
339
+ scanner.scan /^\s*\{\s*$/
340
+ push_context :field
341
+ end
342
+ else
343
+ handle_field
344
+ end
345
+ when :field
346
+ if scanner.check /\s*\}\s*/
347
+ if get_context == :field
348
+ scanner.scan /\s*\}\s*/
349
+ @tokens << [:END_FIELD]
350
+ pop_state
351
+ else
352
+ pop_state
353
+ end
354
+ else
355
+ handle_field
356
+ end
357
+ when :hash_arguments
358
+ handle_hash_arguments
359
+ when :array_arguments
360
+ handle_array_arguments
361
+ when :arguments
362
+ if scanner.scan /\s*\)\s*/
363
+ @tokens << [:END_ARGS]
364
+ pop_state
365
+ elsif scanner.scan /\=/
366
+ @tokens << [:START_DEFAULT_VALUE]
367
+ push_state :argument_defaults
368
+ elsif scanner.scan /,/
369
+ #
370
+ else
371
+ handle_shared_arguments
372
+ end
373
+ when :argument_defaults
374
+ if @stack.reverse.take(2).eql?([:argument_defaults, :argument_defaults])
375
+ @tokens << [:END_DEFAULT_VALUE]
376
+ pop_state
377
+ pop_state
378
+ else
379
+ push_state :argument_defaults
380
+ handle_shared_arguments
381
+ end
382
+ when :special_args
383
+ handle_special_args
384
+ end
385
+ end
386
+ @tokens
387
+ end
388
+
389
+ private
390
+
391
+ def handle_field
392
+ if scanner.scan /\s*\{\s*/
393
+ @context = :field
394
+ @tokens << [:START_FIELD]
395
+ push_state :field
396
+ elsif scanner.check /\.{3}(\w+)\s*\}/
397
+ scanner.scan /\.{3}(\w+)/
398
+ @tokens << [:FRAGMENT_REF, scanner[1]]
399
+ pop_context
400
+ pop_state if scanner.check /\s*\}\s*\}/
401
+ elsif scanner.scan /\.{3}(\w+)/
402
+ @tokens << [:FRAGMENT_REF, scanner[1]]
403
+ elsif scanner.scan /\s*(\w+):\s*/
404
+ @tokens << [:ALIAS, scanner[1]]
405
+ elsif scanner.check /\s*(\w+)\s*\}/
406
+ scanner.scan /\s*(\w+)\s*/
407
+ @tokens << [:FIELD_NAME, scanner[1]]
408
+ pop_context
409
+ pop_state if scanner.check /\s*\}\s*\}/
410
+ elsif scanner.scan /\s*(\w+)\s*/
411
+ @tokens << [:FIELD_NAME, scanner[1]]
412
+ elsif scanner.scan /^\s*\(/
413
+ @tokens << [:START_ARGS]
414
+ push_state :arguments
415
+ else
416
+ advance
417
+ end
418
+ end
419
+
420
+ def handle_shared_arguments
421
+ if scanner.scan /^(\w+):/
422
+ @tokens << [:ARG_KEY, scanner[1]]
423
+ elsif scanner.scan /^\s*\{\s*?/
424
+ @tokens << [:ARG_HASH_START]
425
+ push_state :hash_arguments
426
+ elsif scanner.scan /\s*\[\s*/
427
+ @tokens << [:ARG_ARRAY_START]
428
+ push_state :array_arguments
429
+ elsif scanner.scan /\s?\"([\w\s]+)\"/
430
+ @tokens << [:ARG_STRING_VALUE, scanner[1]]
431
+ elsif scanner.scan /\s?(\d+\.\d+)/
432
+ @tokens << [:ARG_FLOAT_VALUE, scanner[1].to_f]
433
+ elsif scanner.scan /\s?(\d+)/
434
+ @tokens << [:ARG_NUM_VALUE, scanner[1].to_i]
435
+ elsif scanner.scan /\s?(true|false)\s?/
436
+ bool = scanner[1] == "true"
437
+ @tokens << [:ARG_BOOL_VALUE, bool]
438
+ elsif scanner.scan /\$(\w+):/
439
+ @tokens << [:SPECIAL_ARG_KEY, scanner[1]]
440
+ push_state :special_args
441
+ elsif scanner.scan /\$(\w+)/
442
+ @tokens << [:SPECIAL_ARG_REF, scanner[1]]
443
+ else
444
+ advance
445
+ end
446
+ end
447
+
448
+ def handle_special_args
449
+ if scanner.check SPECIAL_ARG_REGEX
450
+ scanner.scan SPECIAL_ARG_REGEX
451
+ @tokens << [:SPECIAL_ARG_VAL, scanner[1]]
452
+ pop_state
453
+ else
454
+ pop_state
455
+ end
456
+ end
457
+
458
+ def handle_hash_arguments
459
+ if scanner.scan /\}/
460
+ @tokens << [:ARG_HASH_END]
461
+ pop_state
462
+ else
463
+ handle_shared_arguments
464
+ end
465
+ end
466
+
467
+ def handle_array_arguments
468
+ if scanner.scan /\s*\]\s*/
469
+ @tokens << [:ARG_ARRAY_END]
470
+ pop_state
471
+ else
472
+ handle_shared_arguments
473
+ end
474
+ end
475
+
476
+ def env
477
+ @ctx ||= []
478
+ end
479
+
480
+ def get_context
481
+ env.last || :default
482
+ end
483
+
484
+ def push_context(context)
485
+ env << context
486
+ end
487
+
488
+ def pop_context
489
+ env.pop
490
+ end
491
+
492
+ def rewind
493
+ scanner.pos = scanner.pos - 1
494
+ end
495
+
496
+ def advance
497
+ scanner.pos = scanner.pos + 1
498
+ end
499
+
500
+ def stack
501
+ @stack ||= []
502
+ end
503
+
504
+ def state
505
+ stack.last || :default
506
+ end
507
+
508
+ def push_state(state)
509
+ stack << state
510
+ end
511
+
512
+ def pop_state
513
+ stack.pop
514
+ end
515
+ end
516
+ end
517
+ end
data/lib/graphlyte.rb CHANGED
@@ -4,12 +4,17 @@ require_relative "./graphlyte/query"
4
4
  require_relative "./graphlyte/fragment"
5
5
  require_relative "./graphlyte/schema_query"
6
6
  require_relative "./graphlyte/types"
7
+ require_relative "./graphlyte/schema/parser"
7
8
 
8
9
  module Graphlyte
9
10
  extend SchemaQuery
10
11
 
11
12
  TYPES = Types.new
12
13
 
14
+ def self.parse(gql)
15
+ Graphlyte::Schema::Parser.parse(gql)
16
+ end
17
+
13
18
  def self.query(name = nil, &block)
14
19
  Query.new(name, :query, builder: build(&block))
15
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphlyte
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Gregory
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-06 00:00:00.000000000 Z
11
+ date: 2021-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -53,6 +53,7 @@ files:
53
53
  - lib/graphlyte/fragment.rb
54
54
  - lib/graphlyte/query.rb
55
55
  - lib/graphlyte/refinements/string_refinement.rb
56
+ - lib/graphlyte/schema/parser.rb
56
57
  - lib/graphlyte/schema/types/base.rb
57
58
  - lib/graphlyte/schema_query.rb
58
59
  - lib/graphlyte/types.rb
@@ -60,8 +61,8 @@ homepage: https://rubygems.org/gems/graphlyte
60
61
  licenses:
61
62
  - MIT
62
63
  metadata:
63
- source_code_uri: https://github.com/skinnyjames/graphlyte
64
- post_install_message:
64
+ source_code_uri: https://gitlab.com/seanchristophergregory/graphlyte
65
+ post_install_message:
65
66
  rdoc_options: []
66
67
  require_paths:
67
68
  - lib
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
78
  version: '0'
78
79
  requirements: []
79
80
  rubygems_version: 3.2.22
80
- signing_key:
81
+ signing_key:
81
82
  specification_version: 4
82
83
  summary: craft graphql queries with ruby
83
84
  test_files: []