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.
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module CParser
5
- VERSION = "1.1.0"
5
+ VERSION = "1.1.2"
6
6
  end
7
7
  end
@@ -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
- tokenize_with_c_internal(str, false)
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, parser.query_string, filename: parser.filename)
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, 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)
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
- tokenize_with_c_internal(graphql_string, intern_identifiers)
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.0
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-04-15 00:00:00.000000000 Z
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.3
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