grpc-rest 0.1.21 → 0.1.22
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/CHANGELOG +3 -0
- data/README.md +16 -1
- data/lib/base_interceptor.rb +45 -0
- data/lib/grpc_rest/version.rb +1 -1
- data/spec/base_interceptor_spec.rb +30 -0
- data/spec/spec_helper.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 47964383a0aa5a5835edd72fae78e2febe1364fdd13f598a588dc3702f5f882b
|
|
4
|
+
data.tar.gz: 14255db74de1d544d8964f3bb3b2e5515f6a25d50ab54bd0e00e6eb550ec9309
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8d85e2f3169ec0dedff6f49e193ac1208caeee918c54b99ab3ee18f05973defad99edb8587fab5fe89cdbfb89d44278eda50f329e00e1bb304722ef10ef7c693
|
|
7
|
+
data.tar.gz: 7ab65c78dc7aadac67a325705d28a3b79873ce24562fa02f1e4f71500536612d49c58806259ed8340b65bd53b3f2f64bf9946b597751d4ff67ae29b086856d63
|
data/CHANGELOG
CHANGED
|
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## UNRELEASED
|
|
9
9
|
|
|
10
|
+
# 0.1.22 - 2024-10-31
|
|
11
|
+
- Fix: calling `fail!` in gruf Interceptors was failing with an unrelated exception.
|
|
12
|
+
|
|
10
13
|
# 0.1.21 - 2024-09-12
|
|
11
14
|
- Feature: Support gruf Interceptors.
|
|
12
15
|
|
data/README.md
CHANGED
|
@@ -154,9 +154,24 @@ service MyService {
|
|
|
154
154
|
|
|
155
155
|
## Gruf Interceptors
|
|
156
156
|
|
|
157
|
-
grpc-rest supports [gruf](https://github.com/bigcommerce/gruf) Interceptors. As long as you're not using a custom interceptor
|
|
157
|
+
grpc-rest supports [gruf](https://github.com/bigcommerce/gruf) Interceptors through a custom `GrpcRest::BaseInterceptor` class. As long as you're not using a custom interceptor
|
|
158
158
|
registry, your interceptors will be called normally around the controller.
|
|
159
159
|
|
|
160
|
+
```ruby
|
|
161
|
+
require 'grpc_rest/base_interceptor'
|
|
162
|
+
|
|
163
|
+
module Interceptors
|
|
164
|
+
# Interceptor for catching errors from controllers
|
|
165
|
+
class ErrorInterceptor < GrpcRest::BaseInterceptor
|
|
166
|
+
|
|
167
|
+
def call
|
|
168
|
+
# Your code here
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
```
|
|
174
|
+
|
|
160
175
|
## To Do
|
|
161
176
|
|
|
162
177
|
* Replace Go implementation with Ruby (+ executable)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'gruf'
|
|
4
|
+
|
|
5
|
+
module GrpcRest
|
|
6
|
+
# Fixes an issue with the fail! method since the active call is not instantiated yet.
|
|
7
|
+
# Overloads https://github.com/bigcommerce/gruf/blob/main/lib/gruf/errors/helpers.rb#L34
|
|
8
|
+
class BaseInterceptor < ::Gruf::Interceptors::ServerInterceptor
|
|
9
|
+
def fail!(error_code, _app_code, message = 'unknown error', metadata = {})
|
|
10
|
+
raise grpc_error(error_code, message.to_s, metadata)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
# Ported from https://github.com/flipp-oss/grpc-rest/blob/main/lib/grpc_rest.rb#L142
|
|
16
|
+
def grpc_error(error_code, message, metadata)
|
|
17
|
+
case error_code
|
|
18
|
+
when :ok
|
|
19
|
+
GRPC::Ok.new(message, metadata)
|
|
20
|
+
when 499
|
|
21
|
+
GRPC::Cancelled.new(message, metadata)
|
|
22
|
+
when :bad_request, :invalid_argument
|
|
23
|
+
GRPC::InvalidArgument.new(message, metadata)
|
|
24
|
+
when :gateway_timeout
|
|
25
|
+
GRPC::DeadlineExceeded.new(message, metadata)
|
|
26
|
+
when :not_found
|
|
27
|
+
GRPC::NotFound.new(message, metadata)
|
|
28
|
+
when :conflict
|
|
29
|
+
GRPC::AlreadyExists.new(message, metadata)
|
|
30
|
+
when :forbidden
|
|
31
|
+
GRPC::PermissionDenied.new(message, metadata)
|
|
32
|
+
when :unauthorized
|
|
33
|
+
GRPC::Unauthenticated.new(message, metadata)
|
|
34
|
+
when :too_many_requests
|
|
35
|
+
GRPC::ResourceExhausted.new(message, metadata)
|
|
36
|
+
when :not_implemented
|
|
37
|
+
GRPC::Unimplemented.new(message, metadata)
|
|
38
|
+
when :service_unavailable
|
|
39
|
+
GRPC::Unavailable.new(message, metadata)
|
|
40
|
+
else
|
|
41
|
+
GRPC::Internal.new(message, metadata)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/grpc_rest/version.rb
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative './spec_helper'
|
|
4
|
+
require 'src/proto/grpc/testing/test_services_pb'
|
|
5
|
+
|
|
6
|
+
RSpec.describe GrpcRest::BaseInterceptor, type: :class do
|
|
7
|
+
let(:rpc_service) { Grpc::Testing::TestService::Service.new }
|
|
8
|
+
let(:rpc_desc) { Grpc::Testing::TestService::Service.rpc_descs.values.first}
|
|
9
|
+
let(:message) { Grpc::Testing::SimpleRequest.new }
|
|
10
|
+
|
|
11
|
+
describe '#fail!' do
|
|
12
|
+
let(:error_message) { 'some message' }
|
|
13
|
+
let(:error_code) { :invalid_argument }
|
|
14
|
+
|
|
15
|
+
it 'intercepts and raises the error' do
|
|
16
|
+
request = Gruf::Controllers::Request.new(
|
|
17
|
+
method_key: :UnaryCall,
|
|
18
|
+
service: rpc_service,
|
|
19
|
+
rpc_desc: rpc_desc,
|
|
20
|
+
active_call: nil,
|
|
21
|
+
message: message)
|
|
22
|
+
interceptor = GrpcRest::BaseInterceptor.new(request, Gruf::Error.new)
|
|
23
|
+
|
|
24
|
+
expect{ interceptor.fail!(error_code, error_code, error_message) }.to raise_error(GRPC::InvalidArgument) do |error|
|
|
25
|
+
expect(error.message).to match(error_message)
|
|
26
|
+
expect(error.code).to eq(GRPC::Core::StatusCodes::INVALID_ARGUMENT)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -17,6 +17,7 @@ loader.inflector.inflect('protoc-gen-openapiv2' => 'ProtocGenOpenapiv2')
|
|
|
17
17
|
loader.ignore("#{Rails.root}/spec/test_service_pb.rb")
|
|
18
18
|
loader.setup
|
|
19
19
|
require "#{Rails.root}/spec/test_service_pb.rb"
|
|
20
|
+
require "#{Rails.root}/lib/base_interceptor.rb"
|
|
20
21
|
|
|
21
22
|
$LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
|
22
23
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: grpc-rest
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.22
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Orner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-10-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: grpc
|
|
@@ -81,6 +81,7 @@ files:
|
|
|
81
81
|
- Gemfile.lock
|
|
82
82
|
- README.md
|
|
83
83
|
- grpc-rest.gemspec
|
|
84
|
+
- lib/base_interceptor.rb
|
|
84
85
|
- lib/grpc_rest.rb
|
|
85
86
|
- lib/grpc_rest/version.rb
|
|
86
87
|
- protoc-gen-rails/.goreleaser.yml
|
|
@@ -101,6 +102,7 @@ files:
|
|
|
101
102
|
- protoc-gen-rails/testdata/no_service/.keep
|
|
102
103
|
- protoc-gen-rails/testdata/test.proto
|
|
103
104
|
- protoc-gen-rails/testdata/test_service.proto
|
|
105
|
+
- spec/base_interceptor_spec.rb
|
|
104
106
|
- spec/grpc_rest_spec.rb
|
|
105
107
|
- spec/gruf_spec.rb
|
|
106
108
|
- spec/protoc-gen-openapiv2/options/annotations_pb.rb
|
|
@@ -132,6 +134,7 @@ signing_key:
|
|
|
132
134
|
specification_version: 4
|
|
133
135
|
summary: Generate Rails controllers and routes from gRPC definitions.
|
|
134
136
|
test_files:
|
|
137
|
+
- spec/base_interceptor_spec.rb
|
|
135
138
|
- spec/grpc_rest_spec.rb
|
|
136
139
|
- spec/gruf_spec.rb
|
|
137
140
|
- spec/protoc-gen-openapiv2/options/annotations_pb.rb
|