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