rack-graphql 2.3.0 → 2.6.0
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/.github/workflows/auto-merge.yml +19 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +19 -1
- data/Gemfile.lock +34 -33
- data/README.md +42 -6
- data/lib/rack_graphql.rb +7 -3
- data/lib/rack_graphql/application.rb +2 -0
- data/lib/rack_graphql/middleware.rb +24 -4
- data/lib/rack_graphql/version.rb +1 -1
- data/rack-graphql.gemspec +2 -1
- metadata +6 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 845b505da7e26dbe5a9e5065514f0420de0c0394f09692afb6d49a134a35dcc2
|
|
4
|
+
data.tar.gz: 570b9ce45188d4371f18dd371468f77341535e54f574e06cc184e4e2aaf97adc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cbc0bbdad9edd52702b4bf7ad70dc46cf592a39e5a47fdb4031f87d1fcb29ca846555a8e05fa0e9620eb198f30212a17169444c6fe53be0a7083941bb8563a83
|
|
7
|
+
data.tar.gz: 11e95a8121612f0cd206cea8ac3109e02c5cc30a24524b1032b9d378926e0314a8c474b49e6c494a26d489e14f1e444b240c1f61ee330d5784d1d7c29639846e
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: automerge
|
|
2
|
+
on:
|
|
3
|
+
pull_request_review:
|
|
4
|
+
types:
|
|
5
|
+
- submitted
|
|
6
|
+
check_suite:
|
|
7
|
+
types:
|
|
8
|
+
- completed
|
|
9
|
+
status: {}
|
|
10
|
+
jobs:
|
|
11
|
+
automerge:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- name: automerge
|
|
15
|
+
uses: "pascalgn/automerge-action@v0.12.0"
|
|
16
|
+
env:
|
|
17
|
+
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
|
18
|
+
MERGE_METHOD: squash
|
|
19
|
+
MERGE_DELETE_BRANCH: true
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 2.6.0 - 2021-01-14
|
|
4
|
+
|
|
5
|
+
- Add ability to re-raise exception (`re_raise_exceptions` option)
|
|
6
|
+
|
|
7
|
+
## 2.5.1 - 2020-11-19
|
|
8
|
+
|
|
9
|
+
- respond with http status `400` when UTF null byte is passed as a part of the input
|
|
10
|
+
|
|
11
|
+
## 2.5.0 - 2020-11-18
|
|
12
|
+
|
|
13
|
+
- make `log_exception_backtrace` false by default and allow to be controlled by `RACK_GRAPHQL_LOG_EXCEPTION_BACKTRACE` env var
|
|
14
|
+
|
|
15
|
+
## 2.4.0 - 2020-09-39
|
|
16
|
+
|
|
17
|
+
- Use `http_status` from `ExecutionError` for http response
|
|
18
|
+
|
|
3
19
|
## 2.3.0 - 2020-09-39
|
|
4
20
|
|
|
5
|
-
- Add `error_status_code_map` option to `RackGraphql::Application`.
|
|
21
|
+
- Add `error_status_code_map` option to `RackGraphql::Application`.
|
|
22
|
+
|
|
23
|
+
`error_status_code_map` allows for return custom http code when specific errors are raised.
|
|
6
24
|
|
|
7
25
|
## 2.2.1 - 2020-09-14
|
|
8
26
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rack-graphql (2.
|
|
4
|
+
rack-graphql (2.6.0)
|
|
5
5
|
graphql (~> 1.11)
|
|
6
6
|
oj
|
|
7
7
|
rack (~> 2.2)
|
|
@@ -13,11 +13,11 @@ GEM
|
|
|
13
13
|
awesome_print (1.8.0)
|
|
14
14
|
coderay (1.1.3)
|
|
15
15
|
diff-lcs (1.4.4)
|
|
16
|
-
graphql (1.11.
|
|
16
|
+
graphql (1.11.6)
|
|
17
17
|
method_source (1.0.0)
|
|
18
|
-
oj (3.
|
|
19
|
-
parallel (1.
|
|
20
|
-
parser (
|
|
18
|
+
oj (3.11.0)
|
|
19
|
+
parallel (1.20.1)
|
|
20
|
+
parser (3.0.0.0)
|
|
21
21
|
ast (~> 2.4.1)
|
|
22
22
|
pry (0.13.1)
|
|
23
23
|
coderay (~> 1.1)
|
|
@@ -26,43 +26,44 @@ GEM
|
|
|
26
26
|
rack-test (1.1.0)
|
|
27
27
|
rack (>= 1.0, < 3)
|
|
28
28
|
rainbow (3.0.0)
|
|
29
|
-
rake (13.0.
|
|
30
|
-
regexp_parser (
|
|
29
|
+
rake (13.0.3)
|
|
30
|
+
regexp_parser (2.0.3)
|
|
31
31
|
rexml (3.2.4)
|
|
32
|
-
rspec (3.
|
|
33
|
-
rspec-core (~> 3.
|
|
34
|
-
rspec-expectations (~> 3.
|
|
35
|
-
rspec-mocks (~> 3.
|
|
36
|
-
rspec-core (3.
|
|
37
|
-
rspec-support (~> 3.
|
|
38
|
-
rspec-expectations (3.
|
|
32
|
+
rspec (3.10.0)
|
|
33
|
+
rspec-core (~> 3.10.0)
|
|
34
|
+
rspec-expectations (~> 3.10.0)
|
|
35
|
+
rspec-mocks (~> 3.10.0)
|
|
36
|
+
rspec-core (3.10.1)
|
|
37
|
+
rspec-support (~> 3.10.0)
|
|
38
|
+
rspec-expectations (3.10.1)
|
|
39
39
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
40
|
-
rspec-support (~> 3.
|
|
41
|
-
rspec-mocks (3.
|
|
40
|
+
rspec-support (~> 3.10.0)
|
|
41
|
+
rspec-mocks (3.10.1)
|
|
42
42
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
43
|
-
rspec-support (~> 3.
|
|
44
|
-
rspec-support (3.
|
|
45
|
-
rubocop (
|
|
43
|
+
rspec-support (~> 3.10.0)
|
|
44
|
+
rspec-support (3.10.1)
|
|
45
|
+
rubocop (1.8.0)
|
|
46
46
|
parallel (~> 1.10)
|
|
47
|
-
parser (>=
|
|
47
|
+
parser (>= 3.0.0.0)
|
|
48
48
|
rainbow (>= 2.2.2, < 4.0)
|
|
49
|
-
regexp_parser (>= 1.
|
|
49
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
50
50
|
rexml
|
|
51
|
-
rubocop-ast (>=
|
|
51
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
|
52
52
|
ruby-progressbar (~> 1.7)
|
|
53
|
-
unicode-display_width (>= 1.4.0, <
|
|
54
|
-
rubocop-ast (
|
|
53
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
54
|
+
rubocop-ast (1.4.0)
|
|
55
55
|
parser (>= 2.7.1.5)
|
|
56
|
-
rubocop-
|
|
57
|
-
rubocop
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
rubocop (
|
|
61
|
-
ruby-progressbar (1.
|
|
62
|
-
unicode-display_width (
|
|
56
|
+
rubocop-rake (0.5.1)
|
|
57
|
+
rubocop
|
|
58
|
+
rubocop-rspec (2.1.0)
|
|
59
|
+
rubocop (~> 1.0)
|
|
60
|
+
rubocop-ast (>= 1.1.0)
|
|
61
|
+
ruby-progressbar (1.11.0)
|
|
62
|
+
unicode-display_width (2.0.0)
|
|
63
63
|
|
|
64
64
|
PLATFORMS
|
|
65
65
|
ruby
|
|
66
|
+
x86_64-linux
|
|
66
67
|
|
|
67
68
|
DEPENDENCIES
|
|
68
69
|
awesome_print
|
|
@@ -73,8 +74,8 @@ DEPENDENCIES
|
|
|
73
74
|
rake
|
|
74
75
|
rspec
|
|
75
76
|
rubocop
|
|
76
|
-
rubocop-
|
|
77
|
+
rubocop-rake
|
|
77
78
|
rubocop-rspec
|
|
78
79
|
|
|
79
80
|
BUNDLED WITH
|
|
80
|
-
2.
|
|
81
|
+
2.2.4
|
data/README.md
CHANGED
|
@@ -23,12 +23,15 @@ Add following to your `config.ru` file:
|
|
|
23
23
|
|
|
24
24
|
```ruby
|
|
25
25
|
run RackGraphql::Application.call(
|
|
26
|
-
schema: YourGraqphqlSchema,
|
|
27
|
-
app_name: 'your-service-name',
|
|
28
|
-
context_handler: YourGraphqlContextHandler,
|
|
29
|
-
log_exception_backtrace: !A9n.env.production?,
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
schema: YourGraqphqlSchema, # required
|
|
27
|
+
app_name: 'your-service-name', # optional, used for health endpoint content
|
|
28
|
+
context_handler: YourGraphqlContextHandler, # optional, empty `proc` by default
|
|
29
|
+
log_exception_backtrace: !A9n.env.production?, # optional, `false` default
|
|
30
|
+
# `true` when `RACK_GRAPHQL_LOG_EXCEPTION_BACKTRACE` env var is set to `'1'` or `'true'`
|
|
31
|
+
health_route: true, # optional, true by default
|
|
32
|
+
logger: A9n.logger, # optional, not set by default
|
|
33
|
+
error_status_code_map: { IamTeapotError => 418 }, # optional
|
|
34
|
+
re_raise_exceptions: true, # optional, false by default
|
|
32
35
|
)
|
|
33
36
|
```
|
|
34
37
|
|
|
@@ -79,6 +82,39 @@ RackGraphql catches all errors and respond with 500 code. By default it adds exc
|
|
|
79
82
|
RackGraphql.log_exception_backtrace = false
|
|
80
83
|
```
|
|
81
84
|
|
|
85
|
+
### Error tracking/reporting
|
|
86
|
+
|
|
87
|
+
To respect the graphql spec, all errors need to be returned as json and `rack-graphql` catches all exceptions and does NOT re-raise them. You can change this behavior via `re_raise_exceptions` argument.
|
|
88
|
+
Because of this, using error tracking middleware (`use Sentry::Rack::CaptureExceptions`, `use Raven::Rack`) does not take any effect for graphql requests.
|
|
89
|
+
|
|
90
|
+
To use Sentry or other reporting tool for graphql queries, you can use `GraphQL::Schema` middleware:
|
|
91
|
+
|
|
92
|
+
```ruby
|
|
93
|
+
class GraphqlErrorTrackerMiddleware
|
|
94
|
+
def self.call(parent_type, parent_object, field_definition, field_args, query_context)
|
|
95
|
+
yield
|
|
96
|
+
rescue StandardError => e
|
|
97
|
+
extra = {
|
|
98
|
+
parent_type: parent_type.inspect,
|
|
99
|
+
parent_object: parent_object.inspect,
|
|
100
|
+
field_definition: field_definition.to_s,
|
|
101
|
+
field_args: field_args&.to_h,
|
|
102
|
+
query_context: query_context&.to_h
|
|
103
|
+
}
|
|
104
|
+
Sentry.capture_exception(e, extra: extra)
|
|
105
|
+
raise
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# MySchema.middleware GraphqlErrorTrackerMiddleware
|
|
110
|
+
# or
|
|
111
|
+
# GraphQL::Schema.middleware GraphqlErrorTrackerMiddleware
|
|
112
|
+
# or
|
|
113
|
+
# class MySchema < GraphQL::Schema
|
|
114
|
+
# middleware GraphqlErrorTrackerMiddleware
|
|
115
|
+
# end
|
|
116
|
+
```
|
|
117
|
+
|
|
82
118
|
## Contributing
|
|
83
119
|
|
|
84
120
|
Bug reports and pull requests are welcome on GitHub at https://github.com/RenoFi/rack-graphql. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
data/lib/rack_graphql.rb
CHANGED
|
@@ -10,8 +10,12 @@ require 'rack_graphql/application'
|
|
|
10
10
|
|
|
11
11
|
module RackGraphql
|
|
12
12
|
class << self
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
def log_exception_backtrace
|
|
14
|
+
return @log_exception_backtrace unless @log_exception_backtrace.nil?
|
|
15
|
+
|
|
16
|
+
%w[1 true].include?(ENV['RACK_GRAPHQL_LOG_EXCEPTION_BACKTRACE'].to_s)
|
|
17
|
+
end
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
attr_writer :log_exception_backtrace
|
|
20
|
+
end
|
|
17
21
|
end
|
|
@@ -5,6 +5,7 @@ module RackGraphql
|
|
|
5
5
|
app_name: 'rack-graphql-service',
|
|
6
6
|
logger: nil,
|
|
7
7
|
context_handler: nil,
|
|
8
|
+
re_raise_exceptions: false,
|
|
8
9
|
log_exception_backtrace: RackGraphql.log_exception_backtrace,
|
|
9
10
|
health_route: true,
|
|
10
11
|
health_response_builder: RackGraphql::HealthResponseBuilder,
|
|
@@ -17,6 +18,7 @@ module RackGraphql
|
|
|
17
18
|
app_name: app_name,
|
|
18
19
|
schema: schema,
|
|
19
20
|
context_handler: context_handler,
|
|
21
|
+
re_raise_exceptions: re_raise_exceptions,
|
|
20
22
|
logger: logger,
|
|
21
23
|
log_exception_backtrace: log_exception_backtrace,
|
|
22
24
|
error_status_code_map: error_status_code_map,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module RackGraphql
|
|
2
2
|
class Middleware
|
|
3
|
+
DEFAULT_STATUS_CODE = 200
|
|
3
4
|
DEFAULT_ERROR_STATUS_CODE = 500
|
|
5
|
+
NULL_BYTE = '\u0000'.freeze
|
|
4
6
|
|
|
5
7
|
def initialize(
|
|
6
8
|
schema:,
|
|
@@ -8,6 +10,7 @@ module RackGraphql
|
|
|
8
10
|
context_handler: nil,
|
|
9
11
|
logger: nil,
|
|
10
12
|
log_exception_backtrace: RackGraphql.log_exception_backtrace,
|
|
13
|
+
re_raise_exceptions: false,
|
|
11
14
|
error_status_code_map: {}
|
|
12
15
|
)
|
|
13
16
|
|
|
@@ -16,6 +19,7 @@ module RackGraphql
|
|
|
16
19
|
@context_handler = context_handler || ->(_) {}
|
|
17
20
|
@logger = logger
|
|
18
21
|
@log_exception_backtrace = log_exception_backtrace
|
|
22
|
+
@re_raise_exceptions = re_raise_exceptions
|
|
19
23
|
@error_status_code_map = error_status_code_map
|
|
20
24
|
end
|
|
21
25
|
|
|
@@ -34,7 +38,7 @@ module RackGraphql
|
|
|
34
38
|
result = execute(params: params, operation_name: operation_name, variables: variables, context: context)
|
|
35
39
|
|
|
36
40
|
[
|
|
37
|
-
|
|
41
|
+
response_status(result),
|
|
38
42
|
response_headers(result),
|
|
39
43
|
[response_body(result)]
|
|
40
44
|
]
|
|
@@ -50,9 +54,14 @@ module RackGraphql
|
|
|
50
54
|
]
|
|
51
55
|
rescue StandardError, LoadError, SyntaxError => e
|
|
52
56
|
# To respect the graphql spec, all errors need to be returned as json.
|
|
53
|
-
#
|
|
57
|
+
# By default exceptions are not re-raised,
|
|
58
|
+
# so they cannot be caught by error tracking rack middlewares.
|
|
59
|
+
# You can change this behavior via `re_raise_exceptions` argument.
|
|
54
60
|
exception_string = dump_exception(e)
|
|
55
61
|
log(exception_string)
|
|
62
|
+
|
|
63
|
+
raise e if re_raise_exceptions
|
|
64
|
+
|
|
56
65
|
env[Rack::RACK_ERRORS].puts(exception_string)
|
|
57
66
|
env[Rack::RACK_ERRORS].flush
|
|
58
67
|
[
|
|
@@ -66,14 +75,18 @@ module RackGraphql
|
|
|
66
75
|
|
|
67
76
|
private
|
|
68
77
|
|
|
69
|
-
attr_reader :schema, :app_name, :logger, :context_handler,
|
|
78
|
+
attr_reader :schema, :app_name, :logger, :context_handler,
|
|
79
|
+
:log_exception_backtrace, :error_status_code_map, :re_raise_exceptions
|
|
70
80
|
|
|
71
81
|
def post_request?(env)
|
|
72
82
|
env['REQUEST_METHOD'] == 'POST'
|
|
73
83
|
end
|
|
74
84
|
|
|
75
85
|
def post_data(env)
|
|
76
|
-
|
|
86
|
+
payload = env['rack.input'].read.to_s
|
|
87
|
+
return nil if payload.index(NULL_BYTE)
|
|
88
|
+
|
|
89
|
+
::Oj.load(payload)
|
|
77
90
|
rescue Oj::ParseError
|
|
78
91
|
nil
|
|
79
92
|
end
|
|
@@ -136,6 +149,13 @@ module RackGraphql
|
|
|
136
149
|
end
|
|
137
150
|
end
|
|
138
151
|
|
|
152
|
+
def response_status(result)
|
|
153
|
+
return DEFAULT_STATUS_CODE if result.is_a?(Array)
|
|
154
|
+
|
|
155
|
+
errors = result.to_h["errors"] || []
|
|
156
|
+
errors.map { |e| e["http_status"] }.compact.first || DEFAULT_STATUS_CODE
|
|
157
|
+
end
|
|
158
|
+
|
|
139
159
|
def response_body(result = nil)
|
|
140
160
|
if result_subscription?(result)
|
|
141
161
|
body = result.to_h
|
data/lib/rack_graphql/version.rb
CHANGED
data/rack-graphql.gemspec
CHANGED
|
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
|
14
14
|
|
|
15
15
|
spec.metadata['homepage_uri'] = 'https://github.com/RenoFi/rack-graphql'
|
|
16
16
|
spec.metadata['source_code_uri'] = 'https://github.com/RenoFi/rack-graphql'
|
|
17
|
+
spec.metadata['changelog_uri'] = 'https://github.com/RenoFi/rack-graphql/blob/master/CHANGELOG.md'
|
|
17
18
|
|
|
18
19
|
spec.files = Dir.chdir(__dir__) do
|
|
19
20
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(bin/|spec/|\.rub)}) }
|
|
@@ -35,6 +36,6 @@ Gem::Specification.new do |spec|
|
|
|
35
36
|
spec.add_development_dependency 'rake'
|
|
36
37
|
spec.add_development_dependency 'rspec'
|
|
37
38
|
spec.add_development_dependency 'rubocop'
|
|
38
|
-
spec.add_development_dependency 'rubocop-
|
|
39
|
+
spec.add_development_dependency 'rubocop-rake'
|
|
39
40
|
spec.add_development_dependency 'rubocop-rspec'
|
|
40
41
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rack-graphql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Krzysztof Knapik
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2021-01-14 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: graphql
|
|
@@ -152,7 +152,7 @@ dependencies:
|
|
|
152
152
|
- !ruby/object:Gem::Version
|
|
153
153
|
version: '0'
|
|
154
154
|
- !ruby/object:Gem::Dependency
|
|
155
|
-
name: rubocop-
|
|
155
|
+
name: rubocop-rake
|
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
|
157
157
|
requirements:
|
|
158
158
|
- - ">="
|
|
@@ -193,6 +193,7 @@ files:
|
|
|
193
193
|
- ".github/ISSUE_TEMPLATE/story.md"
|
|
194
194
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
|
195
195
|
- ".github/workflows/auto-approve.yml"
|
|
196
|
+
- ".github/workflows/auto-merge.yml"
|
|
196
197
|
- ".gitignore"
|
|
197
198
|
- ".rspec"
|
|
198
199
|
- ".travis.yml"
|
|
@@ -216,6 +217,7 @@ licenses:
|
|
|
216
217
|
metadata:
|
|
217
218
|
homepage_uri: https://github.com/RenoFi/rack-graphql
|
|
218
219
|
source_code_uri: https://github.com/RenoFi/rack-graphql
|
|
220
|
+
changelog_uri: https://github.com/RenoFi/rack-graphql/blob/master/CHANGELOG.md
|
|
219
221
|
post_install_message:
|
|
220
222
|
rdoc_options: []
|
|
221
223
|
require_paths:
|
|
@@ -231,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
231
233
|
- !ruby/object:Gem::Version
|
|
232
234
|
version: '0'
|
|
233
235
|
requirements: []
|
|
234
|
-
rubygems_version: 3.
|
|
236
|
+
rubygems_version: 3.2.3
|
|
235
237
|
signing_key:
|
|
236
238
|
specification_version: 4
|
|
237
239
|
summary: Rack middleware implementing graphql endpoint.
|