graphlyte 0.3.0 → 0.3.1

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
  SHA256:
3
- metadata.gz: 97c3b9e1d17580b4d94cf3ffaa9f7291d8ff10c9441a9c2270a378daad39f977
4
- data.tar.gz: f3586e4ea3a92e0ac462b92a17115a81a8c64e6643c296861072a23543ae2b92
3
+ metadata.gz: 62efb09535601a1ef60cd1f6d24108a32c954382a8e2f280e8e570bf8d14d0e2
4
+ data.tar.gz: 9098e5efe7b6344f1bff6effddd660de3e4d6632ec5d8c7b18516cdc7d522a4e
5
5
  SHA512:
6
- metadata.gz: a4dd27faa45576150659090362b94f30297faad8a1a1d5758480e63359bd74e92a30960e70fad8aa446c60e1540dd384458590d5f6cc00eb49c9aa09b44d6659
7
- data.tar.gz: 1887884979b8f92cc8c1b145c782363b7be9e907fc3541cee5e103a4e901d07261f1a6f69aa0aafcce337efda5e5de4a3950fa4803f17a074f4cc6bbd0555ace
6
+ metadata.gz: 2577fa1470f54149841295630b98b865f44b2cc5059c67a34bdea735dfb10b0da8bedfd325567577b7e0d6b900f9cc5004e4cf7d4b7fe8e6ac801ea491487e49
7
+ data.tar.gz: b319c1970a99b031e13df0b33c74a5687490e423c4d141016cb01edf1fb0e2a5a17474ed19bea4b4db709715a883fb3148fac8414a1da1d293fca52d355d5c7c
@@ -62,27 +62,17 @@ module Graphlyte
62
62
  end
63
63
 
64
64
  def expand_arguments(data)
65
- data.inject({}) do |memo, (k, v)|
66
- if v.is_a?(Array)
67
- memo[k] = v.map do |item|
68
- if item.is_a?(Value)
69
- item
70
- else
71
- Value.new(item)
72
- end
73
- end
74
- elsif v.is_a?(Hash)
75
- memo[k] = Set.new(v)
65
+ data.transform_values do |value|
66
+ case value
67
+ when Array
68
+ value.map { |item| Value.from(item) }
69
+ when Hash
70
+ Set.new(value)
76
71
  else
77
- if v.is_a?(Value)
78
- memo[k] = v
79
- else
80
- memo[k] = Value.new(v)
81
- end
72
+ Value.from(value)
82
73
  end
83
- memo
84
74
  end
85
75
  end
86
76
  end
87
77
  end
88
- end
78
+ end
@@ -11,6 +11,12 @@ module Graphlyte
11
11
  @value = value
12
12
  end
13
13
 
14
+ def self.from(value)
15
+ return value if value.is_a? self
16
+
17
+ new(value)
18
+ end
19
+
14
20
  def symbol?
15
21
  value.is_a? Symbol
16
22
  end
@@ -18,7 +18,13 @@ module Graphlyte
18
18
 
19
19
  def remove(field_symbol)
20
20
  @fields.reject! do |field|
21
- field.name == field_symbol.to_s
21
+ field.class == Fragment ? false : field.name == field_symbol.to_s
22
+ end
23
+
24
+ @fields.select { |field| field.class == Fragment }.each do |fragment|
25
+ fragment.fields.reject! do |field|
26
+ field.name == field_symbol.to_s
27
+ end
22
28
  end
23
29
  end
24
30
 
@@ -9,10 +9,14 @@ module Graphlyte
9
9
  @inputs = Arguments::Set.new(hargs)
10
10
  end
11
11
 
12
- def inflate(indent, string, field: nil)
12
+ def inflate(indent, string, field: nil, args: nil)
13
13
  # add directive after fieldname?
14
- string += ' ' * indent
15
- string += "#{field} " if field
14
+ string += ' ' * indent unless indent.nil?
15
+ if !args.nil? && args.to_s.empty?
16
+ string += "#{field} " if field
17
+ else
18
+ string += "#{field}#{args.to_s} "
19
+ end
16
20
  string += "@#{name}"
17
21
  string += @inputs.to_s unless @inputs.to_s.empty?
18
22
  string
@@ -43,7 +43,7 @@ module Graphlyte
43
43
  str += "#{actual_indent}#{@alias}: #{name}"
44
44
  str += inputs.to_s.empty? ? "()" : inputs.to_s
45
45
  elsif @directive
46
- str = @directive.inflate(indent * 2, str, field: name)
46
+ str = @directive.inflate(indent * 2, str, field: name, args: inputs)
47
47
  else
48
48
  str += "#{actual_indent}#{name}#{inputs.to_s}"
49
49
  end
@@ -15,10 +15,10 @@ module Graphlyte
15
15
 
16
16
  def to_s(indent=0)
17
17
  actual_indent = ("\s" * indent) * 2
18
- string = '... '
19
- string += "on #{model_name}" if model_name
18
+ string = '...'
19
+ string += " on #{model_name}" if model_name
20
20
  inflate_indent = model_name ? 1 : 0
21
- string = directive.inflate(inflate_indent, string) if directive
21
+ string = directive.inflate(0, string) if directive
22
22
  string += " {\n"
23
23
  string += super(indent + 1)
24
24
  string += "\n#{actual_indent}}"
@@ -11,6 +11,8 @@ module Graphlyte
11
11
 
12
12
  if token == '*'
13
13
  fields.each do |field|
14
+ next if field.class == Fragment
15
+
14
16
  modify(field.fieldset.fields, [token], &block)
15
17
  field.fieldset.builder.instance_eval(&block) unless field.fieldset.fields.empty?
16
18
  end
@@ -95,7 +97,7 @@ module Graphlyte
95
97
  elsif hargs[var.value].is_a? Integer
96
98
  memo << [var.value, "Int"]
97
99
  elsif hargs[var.value].is_a? Array
98
- memo << "[#{merge_variable_types(var.value, hargs).first}]"
100
+ memo << "[#{merge_variable_types(var.value, hargs).first}]"
99
101
  end
100
102
  else
101
103
  memo << [var.value.placeholder, var.value.name, var.value.default]
@@ -117,7 +119,7 @@ module Graphlyte
117
119
  def flatten_variables(fields, variables=[])
118
120
  fields.each do |field|
119
121
  variables.concat field.inputs.extract_variables unless [InlineFragment, Fragment].include? field.class
120
- variables.concat field.directive.inputs.extract_variables if field.class == InlineFragment && field.directive
122
+ variables.concat field.directive.inputs.extract_variables if field.respond_to?(:directive) && field.directive
121
123
  if [InlineFragment, Fragment].include? field.class
122
124
  flatten_variables(field.fields, variables)
123
125
  else
@@ -92,24 +92,31 @@ module Graphlyte
92
92
 
93
93
  def parse_arg
94
94
  if (token = expect(:ARG_KEY)) && (value = parse_value)
95
- defaults = parse_default
95
+ parse_default
96
96
  key = token[0][1]
97
- hash = {}
98
- hash[key] = value
99
- hash
100
- elsif (token = expect(:SPECIAL_ARG_KEY)) && (value = parse_value)
101
- defaults = parse_default
102
- @special_args ||= {}
103
97
  arg = {}
104
- if [Array, Hash].include?(value.class)
105
- arg[token[0][1]] = value
106
- else
107
- new_val = Schema::Types::Base.new(value, token[0][1], defaults)
108
- arg[token[0][1]] = new_val
109
- end
110
- @special_args.merge!(arg)
111
- arg
98
+ arg[key] = value
99
+ elsif (token = expect(:SPECIAL_ARG_KEY)) && (value = parse_value)
100
+ arg = expect_and_inflate_special_args(token, value)
101
+ end
102
+
103
+ arg
104
+ end
105
+
106
+ def expect_and_inflate_special_args(token, value)
107
+ return { token[0][1] => value } if value.class == Schema::Types::Base
108
+
109
+ defaults = parse_default
110
+ @special_args ||= {}
111
+ arg = {}
112
+ if [Array, Hash].include?(value.class)
113
+ arg[token[0][1]] = value
114
+ else
115
+ new_val = Schema::Types::Base.new(value, token[0][1], defaults)
116
+ arg[token[0][1]] = new_val
112
117
  end
118
+ @special_args.merge!(arg)
119
+ arg
113
120
  end
114
121
 
115
122
  def parse_value
@@ -206,40 +213,24 @@ module Graphlyte
206
213
  end
207
214
  end
208
215
 
209
- def take_fragments
210
- aggregate = @tokens.inject({taking: false, idx: 0, fragments: []}) do |memo, token_arr|
211
- if token_arr[0] == :END_FIELDSET
212
- memo[:fragments][memo[:idx]] << token_arr
213
- memo[:taking] = false
214
- memo[:idx] += 1
215
- elsif token_arr[0] === :FRAGMENT
216
- memo[:fragments][memo[:idx]] = [token_arr]
217
- memo[:taking] = true
218
- elsif memo[:taking]
219
- memo[:fragments][memo[:idx]] << token_arr
220
- end
221
- memo
222
- end
223
- aggregate[:fragments]
224
- end
225
-
216
+ # Select the fragments tokens as an array of arrays
217
+ # @return Array [[[:FRAGMENT, 'foo', bar], [:FIELDSET], [:END_FIELDSET]], [[:FRAGMENT 'buzz', 'bazz']...
226
218
  def fetch_fragments(tokens = @tokens.dup, fragment_tokens = [], memo = { active: false, starts: 0, ends: 0, idx: 0 })
227
219
  token_arr = tokens.shift
228
220
  return fragment_tokens if token_arr.nil?
229
221
 
230
-
231
222
  if memo[:active] == true
232
223
  fragment_tokens[memo[:idx]] << token_arr
233
224
  end
234
225
 
235
226
  if token_arr[0] == :END_FIELDSET && memo[:active] == true
236
227
  memo[:ends] += 1
237
- fragment_tokens[memo[:idx]] << token_arr if memo[:starts] == memo[:ends]
238
-
239
- memo[:active] = false
240
- memo[:ends] = 0
241
- memo[:starts] = 0
242
- memo[:idx] += 1
228
+ if memo[:starts] == memo[:ends] + 1
229
+ memo[:active] = false
230
+ memo[:ends] = 0
231
+ memo[:starts] = 0
232
+ memo[:idx] += 1
233
+ end
243
234
  elsif token_arr[0] == :FRAGMENT
244
235
  memo[:active] = true
245
236
  memo[:starts] += 1
@@ -248,7 +239,6 @@ module Graphlyte
248
239
  memo[:starts] += 1
249
240
  end
250
241
 
251
-
252
242
  fetch_fragments(tokens, fragment_tokens, memo)
253
243
  end
254
244
  end
@@ -363,10 +353,11 @@ module Graphlyte
363
353
  push_state :arguments
364
354
  end
365
355
  elsif scanner.check /\{/
356
+ @tokens << [:EXPRESSION, 'query', nil] if get_context == :default
366
357
  push_context :fieldset
367
358
 
368
359
  tokenize_fieldset
369
- elsif scanner.scan %r{^(\w+) (\w+)}
360
+ elsif scanner.scan %r{^(\w+) (\w+)?}
370
361
  @tokens << [:EXPRESSION, scanner[1], scanner[2]]
371
362
  push_context :expression
372
363
  # check for a fieldset
@@ -391,7 +382,7 @@ module Graphlyte
391
382
  when :arguments
392
383
  tokenize_arguments
393
384
  when :argument_defaults
394
- tokenize_shared_arguments
385
+ tokenize_argument_defaults
395
386
  when :hash_arguments
396
387
  tokenize_hash_arguments
397
388
  when :array_arguments
@@ -434,31 +425,22 @@ module Graphlyte
434
425
  scanner.scan /\s*\}/
435
426
  @tokens << [:END_FIELDSET]
436
427
  pop_state
428
+ pop_context if state == :default
437
429
  end
438
430
 
439
431
  def end_arguments
440
432
  scanner.scan /\s*\)/
441
433
  @tokens << [:END_ARGS]
442
434
  pop_state
443
- end
444
-
445
- def end_fragment
446
- scanner.scan /\s*\}/
447
- @tokens << [:END_FRAGMENT]
448
- pop_state
449
- pop_context
450
- end
451
-
452
- def end_expression
453
- scanner.scan /\s*\}/
454
- @tokens << [:END_EXPRESSION]
455
- pop_state
456
- pop_context
435
+ end_fieldset while check_for_last && state == :fieldset
457
436
  end
458
437
 
459
438
  # to tired to figure out why this is right now
460
439
  def tokenize_argument_defaults
461
- if scanner.scan /\)/
440
+ if scanner.check /\)/
441
+ @tokens << [:END_DEFAULT_VALUE]
442
+ pop_state
443
+ elsif scanner.scan /[\n|,]/
462
444
  @tokens << [:END_DEFAULT_VALUE]
463
445
  pop_state
464
446
  else
@@ -509,6 +491,14 @@ module Graphlyte
509
491
  end
510
492
  end
511
493
 
494
+ def pop_argument_state
495
+ if check_for_last(/\s*\)/)
496
+ end_arguments
497
+ else
498
+ pop_state unless %i[argument_defaults hash_arguments array_arguments special_args arguments].include?(state)
499
+ end
500
+ end
501
+
512
502
  def tokenize_arguments
513
503
  # pop argument state if arguments are finished
514
504
  if scanner.scan %r{\)}
@@ -516,7 +506,6 @@ module Graphlyte
516
506
 
517
507
  pop_state
518
508
  # something(argument: $argument = true)
519
- # ^
520
509
  elsif scanner.scan %r{=}
521
510
  @tokens << [:DEFAULT_VALUE]
522
511
 
@@ -543,19 +532,19 @@ module Graphlyte
543
532
  elsif scanner.scan %r{"(.*?)"}
544
533
  @tokens << [:ARG_STRING_VALUE, scanner[1]]
545
534
 
546
- end_arguments if check_for_last(/\s*\)/)
535
+ pop_argument_state
547
536
  elsif scanner.scan /(\d+\.\d+)/
548
537
  @tokens << [:ARG_FLOAT_VALUE, scanner[1].to_f]
549
538
 
550
- end_arguments if check_for_last(/\s*\)/)
539
+ pop_argument_state
551
540
  elsif scanner.scan /(\d+)/
552
541
  @tokens << [:ARG_NUM_VALUE, scanner[1].to_i]
553
542
 
554
- end_arguments if check_for_last(/\s*\)/)
543
+ pop_argument_state
555
544
  elsif scanner.scan /(true|false)/
556
545
  @tokens << [:ARG_BOOL_VALUE, (scanner[1] == 'true')]
557
546
 
558
- end_arguments if check_for_last(/\s*\)/)
547
+ pop_argument_state
559
548
  elsif scanner.scan /\$(\w+):/
560
549
  @tokens << [:SPECIAL_ARG_KEY, scanner[1]]
561
550
 
@@ -563,7 +552,7 @@ module Graphlyte
563
552
  elsif scanner.scan /\$(\w+)/
564
553
  @tokens << [:SPECIAL_ARG_REF, scanner[1]]
565
554
 
566
- end_arguments if check_for_last(/\s*\)/)
555
+ pop_argument_state
567
556
  elsif scanner.scan /,/
568
557
  # no-op
569
558
  elsif check_for_last(/\s*\)/)
@@ -585,7 +574,9 @@ module Graphlyte
585
574
  # @directive
586
575
  elsif scanner.scan %r{@(\w+)}
587
576
  @tokens << [:DIRECTIVE, scanner[1]]
588
- # ...fragmentReference (check for last since it is a field literal)
577
+
578
+ end_fieldset while check_for_last && state == :fieldset
579
+ # ...fragmentReference (check for last since it is a field literal)
589
580
  elsif scanner.scan /\.{3}(\w+)/
590
581
  @tokens << [:FRAGMENT_REF, scanner[1]]
591
582
 
@@ -603,14 +594,6 @@ module Graphlyte
603
594
  @tokens << [:START_ARGS]
604
595
 
605
596
  push_state :arguments
606
- elsif check_for_final
607
- if get_context == :fragments
608
- end_fragment
609
- elsif get_context == :expression
610
- end_expression
611
- else
612
- advance
613
- end
614
597
  else
615
598
  advance
616
599
  end
@@ -648,7 +631,7 @@ module Graphlyte
648
631
 
649
632
  def advance
650
633
  unless scanner.check /\s/
651
- raise LexerError, "Unexpected Char: '#{scanner.peek(3)}'"
634
+ raise LexerError, "Unexpected Char: '#{scanner.peek(20)}'"
652
635
  end
653
636
 
654
637
  scanner.pos = scanner.pos + 1
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.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Gregory
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-26 00:00:00.000000000 Z
11
+ date: 2022-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec