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.
@@ -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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module CParser
5
- VERSION = "1.0.8"
5
+ VERSION = "1.1.1"
6
6
  end
7
7
  end
@@ -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
- parser = Parser.new(query_str, filename, trace)
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, parser.query_string, filename: parser.filename)
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, parser.query_string, filename: parser.filename)
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
- tokenize_with_c(graphql_string)
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 initialize(query_string, filename, trace)
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.0.8
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-02-20 00:00:00.000000000 Z
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: 2.4.0
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.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