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 +4 -4
- data/lib/graphlyte/arguments/set.rb +8 -18
- data/lib/graphlyte/arguments/value.rb +6 -0
- data/lib/graphlyte/builder.rb +7 -1
- data/lib/graphlyte/directive.rb +7 -3
- data/lib/graphlyte/field.rb +1 -1
- data/lib/graphlyte/inline_fragment.rb +3 -3
- data/lib/graphlyte/query.rb +4 -2
- data/lib/graphlyte/schema/parser.rb +56 -73
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62efb09535601a1ef60cd1f6d24108a32c954382a8e2f280e8e570bf8d14d0e2
|
4
|
+
data.tar.gz: 9098e5efe7b6344f1bff6effddd660de3e4d6632ec5d8c7b18516cdc7d522a4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
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
|
data/lib/graphlyte/builder.rb
CHANGED
@@ -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
|
|
data/lib/graphlyte/directive.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/graphlyte/field.rb
CHANGED
@@ -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(
|
21
|
+
string = directive.inflate(0, string) if directive
|
22
22
|
string += " {\n"
|
23
23
|
string += super(indent + 1)
|
24
24
|
string += "\n#{actual_indent}}"
|
data/lib/graphlyte/query.rb
CHANGED
@@ -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 <<
|
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.
|
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
|
-
|
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
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
-
|
210
|
-
|
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
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
535
|
+
pop_argument_state
|
547
536
|
elsif scanner.scan /(\d+\.\d+)/
|
548
537
|
@tokens << [:ARG_FLOAT_VALUE, scanner[1].to_f]
|
549
538
|
|
550
|
-
|
539
|
+
pop_argument_state
|
551
540
|
elsif scanner.scan /(\d+)/
|
552
541
|
@tokens << [:ARG_NUM_VALUE, scanner[1].to_i]
|
553
542
|
|
554
|
-
|
543
|
+
pop_argument_state
|
555
544
|
elsif scanner.scan /(true|false)/
|
556
545
|
@tokens << [:ARG_BOOL_VALUE, (scanner[1] == 'true')]
|
557
546
|
|
558
|
-
|
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
|
-
|
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
|
-
|
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(
|
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.
|
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-
|
11
|
+
date: 2022-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|