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.
@@ -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