graphql-c_parser 1.0.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 +7 -0
- data/ext/graphql_c_parser_ext/extconf.rb +4 -0
- data/ext/graphql_c_parser_ext/graphql_c_parser_ext.c +22 -0
- data/ext/graphql_c_parser_ext/graphql_c_parser_ext.h +7 -0
- data/ext/graphql_c_parser_ext/lexer.c +2020 -0
- data/ext/graphql_c_parser_ext/lexer.h +6 -0
- data/ext/graphql_c_parser_ext/lexer.rl +403 -0
- data/ext/graphql_c_parser_ext/parser.c +3311 -0
- data/ext/graphql_c_parser_ext/parser.h +5 -0
- data/ext/graphql_c_parser_ext/parser.y +942 -0
- data/lib/graphql/c_parser/version.rb +7 -0
- data/lib/graphql/c_parser.rb +89 -0
- data/lib/graphql-c_parser.rb +2 -0
- metadata +75 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "graphql"
|
4
|
+
require "graphql/c_parser/version"
|
5
|
+
require "graphql/graphql_c_parser_ext"
|
6
|
+
|
7
|
+
module GraphQL
|
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
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.parse_file(filename)
|
15
|
+
contents = File.read(filename)
|
16
|
+
parse(contents, filename: filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.prepare_parse_error(message, parser)
|
20
|
+
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)
|
22
|
+
end
|
23
|
+
token = parser.tokens[parser.next_token_index - 1]
|
24
|
+
if token
|
25
|
+
# There might not be a token if it's a comments-only string
|
26
|
+
line = token[1]
|
27
|
+
col = token[2]
|
28
|
+
if line && col
|
29
|
+
location_str = " at [#{line}, #{col}]"
|
30
|
+
if !message.include?(location_str)
|
31
|
+
message += location_str
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if !message.include?("end of file")
|
36
|
+
message.sub!(/, unexpected ([a-zA-Z ]+)(,| at)/, ", unexpected \\1 (#{token[3].inspect})\\2")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
GraphQL::ParseError.new(message, line, col, parser.query_string, filename: parser.filename)
|
41
|
+
end
|
42
|
+
|
43
|
+
class Parser
|
44
|
+
def initialize(query_string, filename, trace)
|
45
|
+
if query_string.nil?
|
46
|
+
raise GraphQL::ParseError.new("No query string was present", nil, nil, query_string)
|
47
|
+
end
|
48
|
+
@query_string = query_string
|
49
|
+
@filename = filename
|
50
|
+
@tokens = nil
|
51
|
+
@next_token_index = 0
|
52
|
+
@result = nil
|
53
|
+
@trace = trace
|
54
|
+
end
|
55
|
+
|
56
|
+
def result
|
57
|
+
if @result.nil?
|
58
|
+
@tokens = @trace.lex(query_string: @query_string) do
|
59
|
+
GraphQL::CParser::Lexer.tokenize(@query_string)
|
60
|
+
end
|
61
|
+
@trace.parse(query_string: @query_string) do
|
62
|
+
c_parse
|
63
|
+
@result
|
64
|
+
end
|
65
|
+
end
|
66
|
+
@result
|
67
|
+
end
|
68
|
+
|
69
|
+
attr_reader :tokens, :next_token_index, :query_string, :filename
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.scan_with_c(graphql_string)
|
74
|
+
GraphQL::CParser::Lexer.tokenize(graphql_string)
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.parse_with_c(string, filename: nil, trace: GraphQL::Tracing::NullTrace)
|
78
|
+
if string.nil?
|
79
|
+
raise GraphQL::ParseError.new("No query string was present", nil, nil, string)
|
80
|
+
end
|
81
|
+
document = GraphQL::CParser.parse(string, filename: filename, trace: trace)
|
82
|
+
if document.definitions.size == 0
|
83
|
+
raise GraphQL::ParseError.new("Unexpected end of document", 1, 1, string)
|
84
|
+
end
|
85
|
+
document
|
86
|
+
end
|
87
|
+
|
88
|
+
self.default_parser = GraphQL::CParser
|
89
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: graphql-c_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Robert Mosolgo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-04-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: graphql
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- rdmosolgo@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions:
|
32
|
+
- ext/graphql_c_parser_ext/extconf.rb
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- ext/graphql_c_parser_ext/extconf.rb
|
36
|
+
- ext/graphql_c_parser_ext/graphql_c_parser_ext.c
|
37
|
+
- ext/graphql_c_parser_ext/graphql_c_parser_ext.h
|
38
|
+
- ext/graphql_c_parser_ext/lexer.c
|
39
|
+
- ext/graphql_c_parser_ext/lexer.h
|
40
|
+
- ext/graphql_c_parser_ext/lexer.rl
|
41
|
+
- ext/graphql_c_parser_ext/parser.c
|
42
|
+
- ext/graphql_c_parser_ext/parser.h
|
43
|
+
- ext/graphql_c_parser_ext/parser.y
|
44
|
+
- lib/graphql-c_parser.rb
|
45
|
+
- lib/graphql/c_parser.rb
|
46
|
+
- lib/graphql/c_parser/version.rb
|
47
|
+
homepage: https://github.com/rmosolgo/graphql-ruby
|
48
|
+
licenses:
|
49
|
+
- MIT
|
50
|
+
metadata:
|
51
|
+
homepage_uri: https://graphql-ruby.org
|
52
|
+
changelog_uri: https://github.com/rmosolgo/graphql-ruby/blob/master/graphql-c_parser/CHANGELOG.md
|
53
|
+
source_code_uri: https://github.com/rmosolgo/graphql-ruby
|
54
|
+
bug_tracker_uri: https://github.com/rmosolgo/graphql-ruby/issues
|
55
|
+
mailing_list_uri: https://tinyletter.com/graphql-ruby
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 2.4.0
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubygems_version: 3.4.1
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: A parser for GraphQL, implemented as a C extension
|
75
|
+
test_files: []
|