graphql-c_parser 1.1.0 → 1.1.2
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/ext/graphql_c_parser_ext/graphql_c_parser_ext.c +3 -3
- data/ext/graphql_c_parser_ext/lexer.c +149 -104
- data/ext/graphql_c_parser_ext/lexer.h +1 -1
- data/ext/graphql_c_parser_ext/parser.c +435 -428
- data/lib/graphql/c_parser/version.rb +1 -1
- data/lib/graphql/c_parser.rb +27 -12
- metadata +3 -3
data/lib/graphql/c_parser.rb
CHANGED
@@ -6,8 +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
|
-
Parser.parse(query_str, filename: filename, trace: trace)
|
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)
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.parse_file(filename)
|
@@ -16,12 +16,15 @@ module GraphQL
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.tokenize_with_c(str)
|
19
|
-
|
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)
|
20
21
|
end
|
21
22
|
|
22
23
|
def self.prepare_parse_error(message, parser)
|
24
|
+
query_str = parser.query_string
|
25
|
+
filename = parser.filename
|
23
26
|
if message.start_with?("memory exhausted")
|
24
|
-
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)
|
25
28
|
end
|
26
29
|
token = parser.tokens[parser.next_token_index - 1]
|
27
30
|
if token
|
@@ -40,7 +43,11 @@ module GraphQL
|
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
|
-
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)
|
44
51
|
end
|
45
52
|
|
46
53
|
def self.prepare_bad_unicode_error(parser)
|
@@ -57,7 +64,7 @@ module GraphQL
|
|
57
64
|
end
|
58
65
|
|
59
66
|
module Lexer
|
60
|
-
def self.tokenize(graphql_string, intern_identifiers: false)
|
67
|
+
def self.tokenize(graphql_string, intern_identifiers: false, max_tokens: nil)
|
61
68
|
if !(graphql_string.encoding == Encoding::UTF_8 || graphql_string.ascii_only?)
|
62
69
|
graphql_string = graphql_string.dup.force_encoding(Encoding::UTF_8)
|
63
70
|
end
|
@@ -68,18 +75,20 @@ module GraphQL
|
|
68
75
|
1,
|
69
76
|
1,
|
70
77
|
graphql_string,
|
71
|
-
nil, # prev token
|
72
78
|
241 # BAD_UNICODE_ESCAPE in lexer.rl
|
73
79
|
]
|
74
80
|
]
|
75
81
|
end
|
76
|
-
|
82
|
+
reject_numbers_followed_by_names = GraphQL.respond_to?(:reject_numbers_followed_by_names) && GraphQL.reject_numbers_followed_by_names
|
83
|
+
# -1 indicates that there is no limit
|
84
|
+
lexer_max_tokens = max_tokens.nil? ? -1 : max_tokens
|
85
|
+
tokenize_with_c_internal(graphql_string, intern_identifiers, reject_numbers_followed_by_names, lexer_max_tokens)
|
77
86
|
end
|
78
87
|
end
|
79
88
|
|
80
89
|
class Parser
|
81
|
-
def self.parse(query_str, filename: nil, trace: GraphQL::Tracing::NullTrace)
|
82
|
-
self.new(query_str, filename, trace).result
|
90
|
+
def self.parse(query_str, filename: nil, trace: GraphQL::Tracing::NullTrace, max_tokens: nil)
|
91
|
+
self.new(query_str, filename, trace, max_tokens).result
|
83
92
|
end
|
84
93
|
|
85
94
|
def self.parse_file(filename)
|
@@ -87,7 +96,7 @@ module GraphQL
|
|
87
96
|
parse(contents, filename: filename)
|
88
97
|
end
|
89
98
|
|
90
|
-
def initialize(query_string, filename, trace)
|
99
|
+
def initialize(query_string, filename, trace, max_tokens)
|
91
100
|
if query_string.nil?
|
92
101
|
raise GraphQL::ParseError.new("No query string was present", nil, nil, query_string)
|
93
102
|
end
|
@@ -98,12 +107,13 @@ module GraphQL
|
|
98
107
|
@result = nil
|
99
108
|
@trace = trace
|
100
109
|
@intern_identifiers = false
|
110
|
+
@max_tokens = max_tokens
|
101
111
|
end
|
102
112
|
|
103
113
|
def result
|
104
114
|
if @result.nil?
|
105
115
|
@tokens = @trace.lex(query_string: @query_string) do
|
106
|
-
GraphQL::CParser::Lexer.tokenize(@query_string, intern_identifiers: @intern_identifiers)
|
116
|
+
GraphQL::CParser::Lexer.tokenize(@query_string, intern_identifiers: @intern_identifiers, max_tokens: @max_tokens)
|
107
117
|
end
|
108
118
|
@trace.parse(query_string: @query_string) do
|
109
119
|
c_parse
|
@@ -113,6 +123,11 @@ module GraphQL
|
|
113
123
|
@result
|
114
124
|
end
|
115
125
|
|
126
|
+
def tokens_count
|
127
|
+
result
|
128
|
+
@tokens.length
|
129
|
+
end
|
130
|
+
|
116
131
|
attr_reader :tokens, :next_token_index, :query_string, :filename
|
117
132
|
end
|
118
133
|
|
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.1.
|
4
|
+
version: 1.1.2
|
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-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
@@ -66,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '0'
|
68
68
|
requirements: []
|
69
|
-
rubygems_version: 3.5.
|
69
|
+
rubygems_version: 3.5.12
|
70
70
|
signing_key:
|
71
71
|
specification_version: 4
|
72
72
|
summary: A parser for GraphQL, implemented as a C extension
|