graphql-c_parser 1.0.8 → 1.1.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/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
|