graphql-c_parser 1.0.8 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/graphql_c_parser_ext/graphql_c_parser_ext.c +3 -3
- data/ext/graphql_c_parser_ext/graphql_c_parser_ext.h +1 -0
- data/ext/graphql_c_parser_ext/lexer.c +372 -317
- data/ext/graphql_c_parser_ext/lexer.h +1 -1
- data/lib/graphql/c_parser/version.rb +1 -1
- data/lib/graphql/c_parser.rb +40 -9
- metadata +4 -4
@@ -1,6 +1,6 @@
|
|
1
1
|
#ifndef Graphql_lexer_h
|
2
2
|
#define Graphql_lexer_h
|
3
3
|
#include <ruby.h>
|
4
|
-
VALUE tokenize(VALUE query_rbstr);
|
4
|
+
VALUE tokenize(VALUE query_rbstr, int fstring_identifiers, int reject_numbers_followed_by_names, int max_tokens);
|
5
5
|
void setup_static_token_variables();
|
6
6
|
#endif
|
data/lib/graphql/c_parser.rb
CHANGED
@@ -6,9 +6,8 @@ require "graphql/graphql_c_parser_ext"
|
|
6
6
|
|
7
7
|
module GraphQL
|
8
8
|
module CParser
|
9
|
-
def self.parse(query_str, filename: nil, trace: GraphQL::Tracing::NullTrace)
|
10
|
-
|
11
|
-
parser.result
|
9
|
+
def self.parse(query_str, filename: nil, trace: GraphQL::Tracing::NullTrace, max_tokens: nil)
|
10
|
+
Parser.parse(query_str, filename: filename, trace: trace, max_tokens: max_tokens)
|
12
11
|
end
|
13
12
|
|
14
13
|
def self.parse_file(filename)
|
@@ -16,9 +15,16 @@ module GraphQL
|
|
16
15
|
parse(contents, filename: filename)
|
17
16
|
end
|
18
17
|
|
18
|
+
def self.tokenize_with_c(str)
|
19
|
+
reject_numbers_followed_by_names = GraphQL.respond_to?(:reject_numbers_followed_by_names) && GraphQL.reject_numbers_followed_by_names
|
20
|
+
tokenize_with_c_internal(str, false, reject_numbers_followed_by_names)
|
21
|
+
end
|
22
|
+
|
19
23
|
def self.prepare_parse_error(message, parser)
|
24
|
+
query_str = parser.query_string
|
25
|
+
filename = parser.filename
|
20
26
|
if message.start_with?("memory exhausted")
|
21
|
-
return GraphQL::ParseError.new("This query is too large to execute.", nil, nil,
|
27
|
+
return GraphQL::ParseError.new("This query is too large to execute.", nil, nil, query_str, filename: filename)
|
22
28
|
end
|
23
29
|
token = parser.tokens[parser.next_token_index - 1]
|
24
30
|
if token
|
@@ -37,7 +43,11 @@ module GraphQL
|
|
37
43
|
end
|
38
44
|
end
|
39
45
|
|
40
|
-
GraphQL::ParseError.new(message, line, col,
|
46
|
+
GraphQL::ParseError.new(message, line, col, query_str, filename: filename)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.prepare_number_name_parse_error(line, col, query_str, number_part, name_part)
|
50
|
+
raise GraphQL::ParseError.new("Name after number is not allowed (in `#{number_part}#{name_part}`)", line, col, query_str)
|
41
51
|
end
|
42
52
|
|
43
53
|
def self.prepare_bad_unicode_error(parser)
|
@@ -54,7 +64,7 @@ module GraphQL
|
|
54
64
|
end
|
55
65
|
|
56
66
|
module Lexer
|
57
|
-
def self.tokenize(graphql_string)
|
67
|
+
def self.tokenize(graphql_string, intern_identifiers: false, max_tokens: nil)
|
58
68
|
if !(graphql_string.encoding == Encoding::UTF_8 || graphql_string.ascii_only?)
|
59
69
|
graphql_string = graphql_string.dup.force_encoding(Encoding::UTF_8)
|
60
70
|
end
|
@@ -70,12 +80,24 @@ module GraphQL
|
|
70
80
|
]
|
71
81
|
]
|
72
82
|
end
|
73
|
-
|
83
|
+
reject_numbers_followed_by_names = GraphQL.respond_to?(:reject_numbers_followed_by_names) && GraphQL.reject_numbers_followed_by_names
|
84
|
+
# -1 indicates that there is no limit
|
85
|
+
lexer_max_tokens = max_tokens.nil? ? -1 : max_tokens
|
86
|
+
tokenize_with_c_internal(graphql_string, intern_identifiers, reject_numbers_followed_by_names, lexer_max_tokens)
|
74
87
|
end
|
75
88
|
end
|
76
89
|
|
77
90
|
class Parser
|
78
|
-
def
|
91
|
+
def self.parse(query_str, filename: nil, trace: GraphQL::Tracing::NullTrace, max_tokens: nil)
|
92
|
+
self.new(query_str, filename, trace, max_tokens).result
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.parse_file(filename)
|
96
|
+
contents = File.read(filename)
|
97
|
+
parse(contents, filename: filename)
|
98
|
+
end
|
99
|
+
|
100
|
+
def initialize(query_string, filename, trace, max_tokens)
|
79
101
|
if query_string.nil?
|
80
102
|
raise GraphQL::ParseError.new("No query string was present", nil, nil, query_string)
|
81
103
|
end
|
@@ -85,12 +107,14 @@ module GraphQL
|
|
85
107
|
@next_token_index = 0
|
86
108
|
@result = nil
|
87
109
|
@trace = trace
|
110
|
+
@intern_identifiers = false
|
111
|
+
@max_tokens = max_tokens
|
88
112
|
end
|
89
113
|
|
90
114
|
def result
|
91
115
|
if @result.nil?
|
92
116
|
@tokens = @trace.lex(query_string: @query_string) do
|
93
|
-
GraphQL::CParser::Lexer.tokenize(@query_string)
|
117
|
+
GraphQL::CParser::Lexer.tokenize(@query_string, intern_identifiers: @intern_identifiers, max_tokens: @max_tokens)
|
94
118
|
end
|
95
119
|
@trace.parse(query_string: @query_string) do
|
96
120
|
c_parse
|
@@ -102,6 +126,13 @@ module GraphQL
|
|
102
126
|
|
103
127
|
attr_reader :tokens, :next_token_index, :query_string, :filename
|
104
128
|
end
|
129
|
+
|
130
|
+
class SchemaParser < Parser
|
131
|
+
def initialize(*args)
|
132
|
+
super
|
133
|
+
@intern_identifiers = true
|
134
|
+
end
|
135
|
+
end
|
105
136
|
end
|
106
137
|
|
107
138
|
def self.scan_with_c(graphql_string)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-c_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
@@ -59,14 +59,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 3.0.0
|
63
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - ">="
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '0'
|
68
68
|
requirements: []
|
69
|
-
rubygems_version: 3.5.
|
69
|
+
rubygems_version: 3.5.3
|
70
70
|
signing_key:
|
71
71
|
specification_version: 4
|
72
72
|
summary: A parser for GraphQL, implemented as a C extension
|