rails_twirp 0.7.2 → 0.10.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/.ruby-version +1 -0
- data/Gemfile +9 -0
- data/README.md +15 -0
- data/lib/rails_twirp/base.rb +7 -4
- data/lib/rails_twirp/exception_handling.rb +26 -0
- data/lib/rails_twirp/log_subscriber.rb +3 -1
- data/lib/rails_twirp/route_set.rb +3 -1
- data/lib/rails_twirp/testing/integration_test.rb +1 -1
- data/lib/rails_twirp/version.rb +1 -1
- data/rails_twirp.gemspec +1 -0
- data/test/dummy/app/controllers/dummy_controller.rb +5 -0
- data/test/dummy/app/views/dummy/rpc_name_check.pb.pbbuilder +1 -0
- data/test/dummy/config/twirp/routes.rb +1 -0
- data/test/dummy/proto/api.proto +6 -0
- data/test/dummy/proto/api_pb.rb +7 -0
- data/test/dummy/proto/api_twirp.rb +2 -1
- data/test/dummy_test.rb +10 -0
- data/test/ping_controller_test.rb +33 -1
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e2d7bf09840bf1a4d5aef432df4a47d50e653fe618781324d535c382b222cd9
|
4
|
+
data.tar.gz: 7481248258f806ea042f16bd12e09822be2f3d0abcd80c864ab0328572f428ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed132bcafa1a4801ad6196bb26c76e11dbee3ec64a672363eaf46583189fdc58a6fcc515d5bc4525c5125f6ce06b11a00ac914dbfcc4252c93abedc89a58f4f1
|
7
|
+
data.tar.gz: 2469cfc961274f0cac6938951723e425f182becba4b95349c70c981e93f197551068b5124cf3afe687d1f537a3355787b3621275506650c02f5ac1c1c914530e
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.0.3
|
data/Gemfile
CHANGED
@@ -7,3 +7,12 @@ gem "sqlite3"
|
|
7
7
|
gem "pbbuilder", "~> 0.10.0"
|
8
8
|
gem "standard"
|
9
9
|
gem "pry"
|
10
|
+
|
11
|
+
# HACK(bouk): Overwrite Bundler's platform matcher to ignore universal CPU
|
12
|
+
# The protobuf and gRPC 'universal' macOS gems break on M1
|
13
|
+
module Bundler::MatchPlatform
|
14
|
+
def match_platform(p)
|
15
|
+
return false if ::Gem::Platform === platform && platform.cpu == "universal"
|
16
|
+
Bundler::MatchPlatform.platforms_match?(platform, p)
|
17
|
+
end
|
18
|
+
end
|
data/README.md
CHANGED
@@ -21,6 +21,21 @@ Or install it yourself as:
|
|
21
21
|
$ gem install rails_twirp
|
22
22
|
```
|
23
23
|
|
24
|
+
## Installing correct protobuf version for M1 Mac Chips
|
25
|
+
|
26
|
+
If you run into an issue with protobuf universal-darwin version, please paste this in your Gemfile as recommended by @bouke :
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
# HACK(bouk): Overwrite Bundler's platform matcher to ignore universal CPU
|
30
|
+
# The protobuf and gRPC 'universal' macOS gems break on M1
|
31
|
+
module Bundler::MatchPlatform
|
32
|
+
def match_platform(p)
|
33
|
+
return false if ::Gem::Platform === platform && platform.cpu == "universal"
|
34
|
+
Bundler::MatchPlatform.platforms_match?(platform, p)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
24
39
|
## Contributing
|
25
40
|
Contribution directions go here.
|
26
41
|
|
data/lib/rails_twirp/base.rb
CHANGED
@@ -12,6 +12,7 @@ require "rails_twirp/rescue"
|
|
12
12
|
require "rails_twirp/url_for"
|
13
13
|
require "rails_twirp/implicit_render"
|
14
14
|
require "rails_twirp/instrumentation"
|
15
|
+
require "rails_twirp/exception_handling"
|
15
16
|
|
16
17
|
module RailsTwirp
|
17
18
|
class Base < AbstractController::Base
|
@@ -36,8 +37,9 @@ module RailsTwirp
|
|
36
37
|
include AbstractController::Callbacks
|
37
38
|
include Rescue
|
38
39
|
include Instrumentation
|
40
|
+
include ExceptionHandling
|
39
41
|
|
40
|
-
attr_internal :request, :env, :response_class
|
42
|
+
attr_internal :request, :env, :response_class, :rpc_name
|
41
43
|
def initialize
|
42
44
|
@_request = nil
|
43
45
|
@_env = nil
|
@@ -49,10 +51,11 @@ module RailsTwirp
|
|
49
51
|
@_http_request ||= ActionDispatch::Request.new(env[:rack_env])
|
50
52
|
end
|
51
53
|
|
52
|
-
def dispatch(action, request, response_class, env = {})
|
54
|
+
def dispatch(action, request, response_class, rpc_name, env = {})
|
53
55
|
self.request = request
|
54
56
|
self.env = env
|
55
57
|
self.response_class = response_class
|
58
|
+
self.rpc_name = rpc_name
|
56
59
|
|
57
60
|
http_request.controller_instance = self
|
58
61
|
|
@@ -61,8 +64,8 @@ module RailsTwirp
|
|
61
64
|
response_body
|
62
65
|
end
|
63
66
|
|
64
|
-
def self.dispatch(action, request, response_class, env = {})
|
65
|
-
new.dispatch(action, request, response_class, env)
|
67
|
+
def self.dispatch(action, request, response_class, rpc_name, env = {})
|
68
|
+
new.dispatch(action, request, response_class, rpc_name, env)
|
66
69
|
end
|
67
70
|
|
68
71
|
# Used by the template renderer to figure out which template to use
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "twirp/error"
|
2
|
+
|
3
|
+
module RailsTwirp
|
4
|
+
module ExceptionHandling
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
include AbstractController::Logger
|
8
|
+
|
9
|
+
def process_action(*)
|
10
|
+
super
|
11
|
+
rescue Exception => e
|
12
|
+
# We adopt the same error handling logic as Rails' standard middlewares:
|
13
|
+
# 1. When we 'show exceptions' we make the exception bubble up—this is useful for testing
|
14
|
+
raise e unless http_request.show_exceptions?
|
15
|
+
|
16
|
+
# 2. When we want to show detailed exceptions we include the exception message in the error
|
17
|
+
if http_request.get_header("action_dispatch.show_detailed_exceptions")
|
18
|
+
self.response_body = Twirp::Error.internal_with(e)
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
22
|
+
# 3. Otherwise we just return a vague internal error message
|
23
|
+
self.response_body = Twirp::Error.internal("Internal error")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -17,7 +17,9 @@ module RailsTwirp
|
|
17
17
|
info do
|
18
18
|
code = payload.fetch(:code, :internal)
|
19
19
|
|
20
|
-
message = +"Completed #{code}
|
20
|
+
message = +"Completed #{code}"
|
21
|
+
message << ": #{payload[:msg]}" if payload[:msg]
|
22
|
+
message << " in #{event.duration.round}ms (Allocations: #{event.allocations})"
|
21
23
|
message << "\n\n" if defined?(Rails.env) && Rails.env.development?
|
22
24
|
|
23
25
|
message
|
@@ -29,6 +29,8 @@ module RailsTwirp
|
|
29
29
|
|
30
30
|
def initialize(service_class)
|
31
31
|
@service_class = service_class
|
32
|
+
@service_class.raise_exceptions = true
|
33
|
+
|
32
34
|
@rpcs = {}
|
33
35
|
end
|
34
36
|
|
@@ -57,7 +59,7 @@ module RailsTwirp
|
|
57
59
|
controller_name = mapping.controller.underscore
|
58
60
|
const_name = controller_name.camelize << "Controller"
|
59
61
|
controller_class = const_name.constantize
|
60
|
-
controller_class.dispatch(action_name, req, response_class, env)
|
62
|
+
controller_class.dispatch(action_name, req, response_class, name, env)
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
data/lib/rails_twirp/version.rb
CHANGED
data/rails_twirp.gemspec
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
pb.rpc_name @rpc_name
|
@@ -9,6 +9,7 @@ Rails.application.twirp.routes.draw do
|
|
9
9
|
rpc "RaiseError", to: "pings#raise_error"
|
10
10
|
rpc "UncaughtError", to: "pings#uncaught_raise"
|
11
11
|
rpc "BeforeError", to: "pings#before_error"
|
12
|
+
rpc "RpcNameCheck", to: "dummy#rpc_name_check"
|
12
13
|
end
|
13
14
|
|
14
15
|
scope module: :testmod do
|
data/test/dummy/proto/api.proto
CHANGED
@@ -13,6 +13,7 @@ service Dummy {
|
|
13
13
|
rpc UncaughtError(PingRequest) returns (PingResponse);
|
14
14
|
rpc BeforeError(PingRequest) returns (PingResponse);
|
15
15
|
rpc Nested(PingRequest) returns (PingResponse);
|
16
|
+
rpc RpcNameCheck(RpcNameCheckRequest) returns (RpcNameCheckResponse);
|
16
17
|
}
|
17
18
|
|
18
19
|
message PingRequest {
|
@@ -22,3 +23,8 @@ message PingRequest {
|
|
22
23
|
message PingResponse {
|
23
24
|
string double_name = 2;
|
24
25
|
}
|
26
|
+
|
27
|
+
message RpcNameCheckRequest{}
|
28
|
+
message RpcNameCheckResponse{
|
29
|
+
string rpc_name = 1;
|
30
|
+
}
|
data/test/dummy/proto/api_pb.rb
CHANGED
@@ -11,6 +11,11 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
11
11
|
add_message "dummy.api.PingResponse" do
|
12
12
|
optional :double_name, :string, 2
|
13
13
|
end
|
14
|
+
add_message "dummy.api.RpcNameCheckRequest" do
|
15
|
+
end
|
16
|
+
add_message "dummy.api.RpcNameCheckResponse" do
|
17
|
+
optional :rpc_name, :string, 1
|
18
|
+
end
|
14
19
|
end
|
15
20
|
end
|
16
21
|
|
@@ -18,5 +23,7 @@ module RPC
|
|
18
23
|
module DummyAPI
|
19
24
|
PingRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dummy.api.PingRequest").msgclass
|
20
25
|
PingResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dummy.api.PingResponse").msgclass
|
26
|
+
RpcNameCheckRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dummy.api.RpcNameCheckRequest").msgclass
|
27
|
+
RpcNameCheckResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("dummy.api.RpcNameCheckResponse").msgclass
|
21
28
|
end
|
22
29
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Code generated by protoc-gen-twirp_ruby 1.
|
1
|
+
# Code generated by protoc-gen-twirp_ruby 1.8.0, DO NOT EDIT.
|
2
2
|
require 'twirp'
|
3
3
|
require_relative 'api_pb.rb'
|
4
4
|
|
@@ -15,6 +15,7 @@ module RPC
|
|
15
15
|
rpc :UncaughtError, PingRequest, PingResponse, :ruby_method => :uncaught_error
|
16
16
|
rpc :BeforeError, PingRequest, PingResponse, :ruby_method => :before_error
|
17
17
|
rpc :Nested, PingRequest, PingResponse, :ruby_method => :nested
|
18
|
+
rpc :RpcNameCheck, RpcNameCheckRequest, RpcNameCheckResponse, :ruby_method => :rpc_name_check
|
18
19
|
end
|
19
20
|
|
20
21
|
class DummyClient < Twirp::Client
|
data/test/dummy_test.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DummyControllerTest < RailsTwirp::IntegrationTest
|
4
|
+
test "controller gets rpc name" do
|
5
|
+
req = RPC::DummyAPI::RpcNameCheckRequest.new
|
6
|
+
rpc RPC::DummyAPI::DummyService, "RpcNameCheck", req
|
7
|
+
assert_instance_of RPC::DummyAPI::RpcNameCheckResponse, response
|
8
|
+
assert_equal "RpcNameCheck", response.rpc_name
|
9
|
+
end
|
10
|
+
end
|
@@ -46,12 +46,38 @@ class PingControllerTest < RailsTwirp::IntegrationTest
|
|
46
46
|
assert_equal :not_found, response.code
|
47
47
|
end
|
48
48
|
|
49
|
-
test "uncaught
|
49
|
+
test "uncaught errors should bubble up to the test" do
|
50
|
+
req = RPC::DummyAPI::PingRequest.new
|
51
|
+
assert_raises StandardError, "Uncaught" do
|
52
|
+
rpc RPC::DummyAPI::DummyService, "UncaughtError", req
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
test "uncaught errors should return an internal error with details if show_exceptions is true" do
|
57
|
+
Rails.application.env_config["action_dispatch.show_exceptions"] = true
|
58
|
+
|
50
59
|
req = RPC::DummyAPI::PingRequest.new
|
51
60
|
rpc RPC::DummyAPI::DummyService, "UncaughtError", req
|
52
61
|
assert_instance_of Twirp::Error, response
|
62
|
+
assert_equal :internal, response.code
|
53
63
|
assert_equal "Uncaught", response.msg
|
64
|
+
assert_equal "StandardError", response.meta["cause"]
|
65
|
+
ensure
|
66
|
+
Rails.application.env_config["action_dispatch.show_exceptions"] = false
|
67
|
+
end
|
68
|
+
|
69
|
+
test "uncaught errors should return an internal error without if show_exceptions is true and show_detailed_exceptions is false" do
|
70
|
+
Rails.application.env_config["action_dispatch.show_exceptions"] = true
|
71
|
+
Rails.application.env_config["action_dispatch.show_detailed_exceptions"] = false
|
72
|
+
|
73
|
+
req = RPC::DummyAPI::PingRequest.new
|
74
|
+
rpc RPC::DummyAPI::DummyService, "UncaughtError", req
|
75
|
+
assert_instance_of Twirp::Error, response
|
54
76
|
assert_equal :internal, response.code
|
77
|
+
assert_equal "Internal error", response.msg
|
78
|
+
ensure
|
79
|
+
Rails.application.env_config["action_dispatch.show_detailed_exceptions"] = true
|
80
|
+
Rails.application.env_config["action_dispatch.show_exceptions"] = false
|
55
81
|
end
|
56
82
|
|
57
83
|
test "before error" do
|
@@ -61,4 +87,10 @@ class PingControllerTest < RailsTwirp::IntegrationTest
|
|
61
87
|
assert_equal "yOuR ReQuEsT Is mAlFoRmEd", response.msg
|
62
88
|
assert_equal :malformed, response.code
|
63
89
|
end
|
90
|
+
|
91
|
+
test "controller is set to the controller that handled the request" do
|
92
|
+
req = RPC::DummyAPI::PingRequest.new(name: "Bouke")
|
93
|
+
rpc RPC::DummyAPI::DummyService, "Ping", req
|
94
|
+
assert_instance_of PingsController, controller
|
95
|
+
end
|
64
96
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_twirp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bouke van der Bijl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -47,6 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- ".github/workflows/test.yml"
|
49
49
|
- ".gitignore"
|
50
|
+
- ".ruby-version"
|
50
51
|
- ".standard.yml"
|
51
52
|
- Gemfile
|
52
53
|
- MIT-LICENSE
|
@@ -59,6 +60,7 @@ files:
|
|
59
60
|
- lib/rails_twirp/base.rb
|
60
61
|
- lib/rails_twirp/engine.rb
|
61
62
|
- lib/rails_twirp/errors.rb
|
63
|
+
- lib/rails_twirp/exception_handling.rb
|
62
64
|
- lib/rails_twirp/implicit_render.rb
|
63
65
|
- lib/rails_twirp/instrumentation.rb
|
64
66
|
- lib/rails_twirp/log_subscriber.rb
|
@@ -79,6 +81,7 @@ files:
|
|
79
81
|
- test/dummy/app/controllers/application_controller.rb
|
80
82
|
- test/dummy/app/controllers/application_twirp_controller.rb
|
81
83
|
- test/dummy/app/controllers/concerns/.keep
|
84
|
+
- test/dummy/app/controllers/dummy_controller.rb
|
82
85
|
- test/dummy/app/controllers/pings_controller.rb
|
83
86
|
- test/dummy/app/controllers/testmod/nested/other_controller.rb
|
84
87
|
- test/dummy/app/helpers/application_helper.rb
|
@@ -88,6 +91,7 @@ files:
|
|
88
91
|
- test/dummy/app/mailers/application_mailer.rb
|
89
92
|
- test/dummy/app/models/application_record.rb
|
90
93
|
- test/dummy/app/models/concerns/.keep
|
94
|
+
- test/dummy/app/views/dummy/rpc_name_check.pb.pbbuilder
|
91
95
|
- test/dummy/app/views/layouts/application.html.erb
|
92
96
|
- test/dummy/app/views/layouts/mailer.html.erb
|
93
97
|
- test/dummy/app/views/layouts/mailer.text.erb
|
@@ -131,6 +135,7 @@ files:
|
|
131
135
|
- test/dummy/public/apple-touch-icon-precomposed.png
|
132
136
|
- test/dummy/public/apple-touch-icon.png
|
133
137
|
- test/dummy/public/favicon.ico
|
138
|
+
- test/dummy_test.rb
|
134
139
|
- test/other_controller_test.rb
|
135
140
|
- test/ping_controller_test.rb
|
136
141
|
- test/rails_twirp_test.rb
|
@@ -147,14 +152,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
147
152
|
requirements:
|
148
153
|
- - ">="
|
149
154
|
- !ruby/object:Gem::Version
|
150
|
-
version: '
|
155
|
+
version: '3'
|
151
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
157
|
requirements:
|
153
158
|
- - ">="
|
154
159
|
- !ruby/object:Gem::Version
|
155
160
|
version: '0'
|
156
161
|
requirements: []
|
157
|
-
rubygems_version: 3.2.
|
162
|
+
rubygems_version: 3.2.32
|
158
163
|
signing_key:
|
159
164
|
specification_version: 4
|
160
165
|
summary: Integrate Twirp into Rails
|
@@ -168,6 +173,7 @@ test_files:
|
|
168
173
|
- test/dummy/app/controllers/application_controller.rb
|
169
174
|
- test/dummy/app/controllers/application_twirp_controller.rb
|
170
175
|
- test/dummy/app/controllers/concerns/.keep
|
176
|
+
- test/dummy/app/controllers/dummy_controller.rb
|
171
177
|
- test/dummy/app/controllers/pings_controller.rb
|
172
178
|
- test/dummy/app/controllers/testmod/nested/other_controller.rb
|
173
179
|
- test/dummy/app/helpers/application_helper.rb
|
@@ -177,6 +183,7 @@ test_files:
|
|
177
183
|
- test/dummy/app/mailers/application_mailer.rb
|
178
184
|
- test/dummy/app/models/application_record.rb
|
179
185
|
- test/dummy/app/models/concerns/.keep
|
186
|
+
- test/dummy/app/views/dummy/rpc_name_check.pb.pbbuilder
|
180
187
|
- test/dummy/app/views/layouts/application.html.erb
|
181
188
|
- test/dummy/app/views/layouts/mailer.html.erb
|
182
189
|
- test/dummy/app/views/layouts/mailer.text.erb
|
@@ -220,6 +227,7 @@ test_files:
|
|
220
227
|
- test/dummy/public/apple-touch-icon-precomposed.png
|
221
228
|
- test/dummy/public/apple-touch-icon.png
|
222
229
|
- test/dummy/public/favicon.ico
|
230
|
+
- test/dummy_test.rb
|
223
231
|
- test/other_controller_test.rb
|
224
232
|
- test/ping_controller_test.rb
|
225
233
|
- test/rails_twirp_test.rb
|