graphlyte 0.3.0 → 0.3.1

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