thrifter 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +78 -44
- data/lib/thrifter.rb +31 -13
- data/lib/thrifter/{ping.rb → extensions/ping.rb} +0 -0
- data/lib/thrifter/{queueing.rb → extensions/queueing.rb} +0 -0
- data/lib/thrifter/{retry.rb → extensions/retriable.rb} +0 -0
- data/lib/thrifter/{error_wrapping_middleware.rb → middleware/error_wrapping.rb} +1 -1
- data/lib/thrifter/{statsd_middleware.rb → middleware/metrics.rb} +1 -1
- data/lib/thrifter/middleware/validation.rb +34 -0
- data/lib/thrifter/version.rb +1 -1
- data/script/monkey-client +1 -1
- data/test/acceptance_test.rb +20 -0
- data/test/{ping_test.rb → extensions/ping_test.rb} +1 -1
- data/test/{queuing_test.rb → extensions/queueing_test.rb} +1 -1
- data/test/{retry_test.rb → extensions/retry_test.rb} +1 -1
- data/test/{error_wrapping_middleware_test.rb → middleware/error_wrapping_test.rb} +6 -6
- data/test/{statsd_middleware_test.rb → middleware/metrics_test.rb} +8 -8
- data/test/middleware/validation_test.rb +57 -0
- data/test/test_helper.rb +1 -1
- data/thrifter.gemspec +1 -0
- metadata +33 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d17b3472039110ba6cb2226fb72e0ed490f3a0a9
|
4
|
+
data.tar.gz: 0dc804e6e5de0d3e3107961d5841ca834db39d29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce63b7eae7e10ad4caa724be4ef43082b0673ebe54c734cd95f3a273fbae579b694769b9c377ad3671fd33b77dd31d7b5d81da15bc84d9399a20ed8df9f45d11
|
7
|
+
data.tar.gz: 7d8f048ee242cf2dcdf03a4091f0ed3694e6b5a14fdaf0fed0019031ab0aee03cde8d0a2cc566921879c9a70ea4c7002452238fb2e14df704633d1a0fafb5e7d
|
data/README.md
CHANGED
@@ -81,37 +81,19 @@ class MyClient < Thrifer.build(MyService::Client)
|
|
81
81
|
config.uri = 'tcp://foo:2383'
|
82
82
|
end
|
83
83
|
|
84
|
-
#The common block form is supported as well
|
84
|
+
# The common block form is supported as well
|
85
85
|
MyClient.configure do |config|
|
86
86
|
# ... same as above
|
87
87
|
end
|
88
88
|
```
|
89
89
|
|
90
|
-
###
|
90
|
+
### Extensions
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
interface. `Thrifter` emits the following metrics:
|
96
|
-
|
97
|
-
* time on each rpc calls
|
98
|
-
* number of `Thrift::TransportException`
|
99
|
-
* number of `Thrift::ProtocolExeption`
|
100
|
-
* number of `Thrift::ApplicationExeption`
|
101
|
-
* number of `Timeout::Error`
|
102
|
-
* number of generic errors (e.g. none of the above known errors)
|
103
|
-
|
104
|
-
It's recommended that the `statsd` object do namespacing
|
105
|
-
(statsd-ruby has it built in). This ensures client metrics don't
|
106
|
-
get intermingled with wider application metrics. Here's an example:
|
107
|
-
|
108
|
-
```ruby
|
109
|
-
ServiceClient = Thrifter.build(MyService::Client)
|
110
|
-
# Now in production.rb
|
111
|
-
ServiceClient.config.statsd = Statsd.new namespace: 'my_service'
|
112
|
-
```
|
92
|
+
Extensions add functionality to the client itself. They do not effect
|
93
|
+
the request/response cycle in anyway. `Thrifter` includes a few
|
94
|
+
extensions by default. This section covers each included extension.
|
113
95
|
|
114
|
-
|
96
|
+
#### Queuing
|
115
97
|
|
116
98
|
Certain systems may need to queue RPCs to other systems. This is only
|
117
99
|
useful for `void` RPCs or for when an outside system may be flaky.
|
@@ -119,8 +101,13 @@ Assume `MyService` has a `logStats` RPC. Your application is producing
|
|
119
101
|
stats that should make it upstream, but there are intermitent network
|
120
102
|
problems effeciting stats collection. Include `Thrift::Queueing` and
|
121
103
|
any RPC will automatically be sent to sidekiq for eventual processing.
|
104
|
+
`sidekiq` must be available. This is an **opt-in** dependency, of if
|
105
|
+
you want this funtionality, add `sidekiq` and
|
106
|
+
`sidekiq-thrift_arguments` to your `Gemfile`.
|
122
107
|
|
123
108
|
```ruby
|
109
|
+
require 'thrifter/extensions/queueing'
|
110
|
+
|
124
111
|
class ServiceClient < Thrifter.build(MyService::Client)
|
125
112
|
include Thrifter::Queuing
|
126
113
|
end
|
@@ -144,7 +131,7 @@ end
|
|
144
131
|
All RPCs will be sent to the `thrift` sidekiq queue. They will follow
|
145
132
|
default sidekiq retry backoff and the like.
|
146
133
|
|
147
|
-
|
134
|
+
#### Retry Support
|
148
135
|
|
149
136
|
Systems have syncrhonous RPCs. Unfortunately sometimes these don't
|
150
137
|
work for whatever reason. It's good practice to retry these RPCs
|
@@ -178,13 +165,40 @@ end
|
|
178
165
|
Look into something like [retriable][] if you want a more robust
|
179
166
|
solution for different use cases.
|
180
167
|
|
168
|
+
#### Pinging
|
169
|
+
|
170
|
+
Components in a system may need to inquire if other systems are
|
171
|
+
available before continuing. `Thrifer::Ping` is just that.
|
172
|
+
`Thrifter::Ping` assumes the service has a `ping` RPC. If your
|
173
|
+
service does not have one (or is named differently) simply implement
|
174
|
+
the `ping` method on the class. Any successful response will count as
|
175
|
+
up, anything else will not.
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
class MyService < Thrifer.build(MyService::Client)
|
179
|
+
include Thrifer::Ping
|
180
|
+
|
181
|
+
# Define a ping method if the service does not have one
|
182
|
+
def ping
|
183
|
+
my_other_rpc
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
# my_service.up? # => true
|
188
|
+
```
|
189
|
+
|
181
190
|
### Middleware
|
182
191
|
|
183
192
|
The middleware approach is great for providing a flexible extension
|
184
193
|
points to hook into the RPC process. `Thrifter::Client` provides a
|
185
194
|
middleware implementation to common to many other ruby libraries.
|
186
|
-
|
187
|
-
|
195
|
+
Unlike extensions, middleware modify the request/response cycle. They
|
196
|
+
do not modify the client class directly. `Thrifter` includes a few
|
197
|
+
helpful middlware which are documented below.
|
198
|
+
|
199
|
+
#### Using Middleware
|
200
|
+
|
201
|
+
Here's the most simple middlware example:
|
188
202
|
|
189
203
|
```ruby
|
190
204
|
class MyClient < Thrifter.build(MyService::Client)
|
@@ -218,7 +232,31 @@ class LoggingMiddleware
|
|
218
232
|
end
|
219
233
|
```
|
220
234
|
|
221
|
-
|
235
|
+
#### Metrics
|
236
|
+
|
237
|
+
Statsd metrics are **opt-in**. By default, `Thrifter` sets the statsd
|
238
|
+
client to a null implementation. If you want metrics, set
|
239
|
+
`config.statsd` to an object that implements the [statsd-ruby][]
|
240
|
+
interface. `Thrifter` emits the following metrics:
|
241
|
+
|
242
|
+
* time on each rpc calls
|
243
|
+
* number of `Thrift::TransportException`
|
244
|
+
* number of `Thrift::ProtocolExeption`
|
245
|
+
* number of `Thrift::ApplicationExeption`
|
246
|
+
* number of `Timeout::Error`
|
247
|
+
* number of generic errors (e.g. none of the above known errors)
|
248
|
+
|
249
|
+
It's recommended that the `statsd` object do namespacing
|
250
|
+
(statsd-ruby has it built in). This ensures client metrics don't
|
251
|
+
get intermingled with wider application metrics. Here's an example:
|
252
|
+
|
253
|
+
```ruby
|
254
|
+
ServiceClient = Thrifter.build(MyService::Client)
|
255
|
+
# Now in production.rb
|
256
|
+
ServiceClient.config.statsd = Statsd.new namespace: 'my_service'
|
257
|
+
```
|
258
|
+
|
259
|
+
#### Error Wrapping
|
222
260
|
|
223
261
|
A lot of things can go wrong in the thrift stack. This means the
|
224
262
|
caller may need to deal with a large amount of different exceptions.
|
@@ -249,26 +287,22 @@ end
|
|
249
287
|
Note, `Thrifter` will still count individual errors as described in
|
250
288
|
the metrics section.
|
251
289
|
|
252
|
-
|
290
|
+
#### Protocol Validation
|
253
291
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
292
|
+
Thrift requires that client & server communicate with the exact things
|
293
|
+
specified in the protocol. Unfortunately ruby does not prevent us from
|
294
|
+
making mistakes. It's possible to forget setting required members or
|
295
|
+
assigning symbol instead of a string. Luckily ruby's dynamic traits
|
296
|
+
make it possible to implement compiler like validation. `Thrifter`
|
297
|
+
includes a middlware that will checkout incoming & outgoing objects so
|
298
|
+
that they're valid protocol message. [thrift-validator][] does all the
|
299
|
+
heavy lifing here. Use `Thrifter::Validation` in the test
|
300
|
+
environment to make sure things are correct. Here's an example.
|
260
301
|
|
261
302
|
```ruby
|
262
|
-
class MyService <
|
263
|
-
|
264
|
-
|
265
|
-
# Define a ping method if the service does not have one
|
266
|
-
def ping
|
267
|
-
my_other_rpc
|
268
|
-
end
|
303
|
+
class MyService < Thrifter.build(MyService::Client)
|
304
|
+
use Thrifter::Validation
|
269
305
|
end
|
270
|
-
|
271
|
-
# my_service.up? # => true
|
272
306
|
```
|
273
307
|
|
274
308
|
## Contributing
|
data/lib/thrifter.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'thrifter/version'
|
2
2
|
|
3
3
|
require 'forwardable'
|
4
|
+
require 'delegate'
|
4
5
|
require 'uri'
|
5
6
|
require 'tnt'
|
6
7
|
require 'concord'
|
7
8
|
require 'thrift'
|
8
9
|
require 'thrift-base64'
|
10
|
+
require 'thrift-validator'
|
9
11
|
require 'middleware'
|
10
12
|
require 'connection_pool'
|
11
13
|
|
@@ -84,6 +86,14 @@ module Thrifter
|
|
84
86
|
end
|
85
87
|
end
|
86
88
|
|
89
|
+
class DirectDispatcher
|
90
|
+
include Concord.new(:app, :client)
|
91
|
+
|
92
|
+
def call(rpc)
|
93
|
+
client.send rpc.name, *rpc.args
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
87
97
|
class << self
|
88
98
|
extend Forwardable
|
89
99
|
|
@@ -115,12 +125,14 @@ module Thrifter
|
|
115
125
|
end
|
116
126
|
end
|
117
127
|
|
118
|
-
def initialize
|
119
|
-
|
128
|
+
def initialize(client = nil)
|
129
|
+
if client.nil?
|
130
|
+
fail ArgumentError, 'config.uri not set!' unless config.uri
|
120
131
|
|
121
|
-
|
132
|
+
uri = URI(config.uri)
|
122
133
|
|
123
|
-
|
134
|
+
fail ArgumentError, 'URI did not contain port' unless uri.port
|
135
|
+
end
|
124
136
|
|
125
137
|
@pool = ConnectionPool.new size: config.pool_size.to_i, timeout: config.pool_timeout.to_f do
|
126
138
|
stack = MiddlewareStack.new
|
@@ -130,13 +142,17 @@ module Thrifter
|
|
130
142
|
# Insert metrics here so metrics are as close to the network
|
131
143
|
# as possible. This excludes time in any middleware an
|
132
144
|
# application may have configured.
|
133
|
-
stack.use
|
145
|
+
stack.use Metrics, config.statsd
|
134
146
|
|
135
|
-
|
136
|
-
|
137
|
-
|
147
|
+
if client.nil?
|
148
|
+
socket = Thrift::Socket.new uri.host, uri.port, config.rpc_timeout.to_f
|
149
|
+
transport = config.transport.new socket
|
150
|
+
protocol = config.protocol.new transport
|
138
151
|
|
139
|
-
|
152
|
+
stack.use Dispatcher, transport, client_class.new(protocol)
|
153
|
+
else
|
154
|
+
stack.use DirectDispatcher, client
|
155
|
+
end
|
140
156
|
|
141
157
|
stack.finalize!
|
142
158
|
end
|
@@ -160,7 +176,9 @@ module Thrifter
|
|
160
176
|
end
|
161
177
|
end
|
162
178
|
|
163
|
-
require_relative 'thrifter/
|
164
|
-
require_relative 'thrifter/
|
165
|
-
|
166
|
-
require_relative 'thrifter/
|
179
|
+
require_relative 'thrifter/extensions/ping'
|
180
|
+
require_relative 'thrifter/extensions/retriable'
|
181
|
+
|
182
|
+
require_relative 'thrifter/middleware/error_wrapping'
|
183
|
+
require_relative 'thrifter/middleware/validation'
|
184
|
+
require_relative 'thrifter/middleware/metrics'
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Thrifter
|
2
|
+
ValidationError = Tnt.boom do |rpc, ex|
|
3
|
+
"Invalid data in RPC #{rpc.name}! #{ex.message}"
|
4
|
+
end
|
5
|
+
|
6
|
+
class Validation
|
7
|
+
include Concord.new(:app)
|
8
|
+
|
9
|
+
def call(rpc)
|
10
|
+
validate rpc, rpc.args
|
11
|
+
response = app.call rpc
|
12
|
+
|
13
|
+
validate rpc, Array(response)
|
14
|
+
|
15
|
+
response
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def validate(rpc, objects)
|
21
|
+
objects.each do |item|
|
22
|
+
if item.is_a? Thrift::Struct
|
23
|
+
begin
|
24
|
+
Thrift::Validator.new.validate(item)
|
25
|
+
rescue Thrift::ProtocolException => ex
|
26
|
+
raise ValidationError.new(rpc, ex)
|
27
|
+
end
|
28
|
+
else
|
29
|
+
next
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/thrifter/version.rb
CHANGED
data/script/monkey-client
CHANGED
data/test/acceptance_test.rb
CHANGED
@@ -190,6 +190,26 @@ class AcceptanceTest < MiniTest::Unit::TestCase
|
|
190
190
|
assert_match /testing/, result.message, 'Middleware not called'
|
191
191
|
end
|
192
192
|
|
193
|
+
def test_implementation_maybe_given_at_instantation_time
|
194
|
+
implementation = stub echo: :stubbed_response
|
195
|
+
|
196
|
+
client = Thrifter.build TestClient
|
197
|
+
client.config.uri = uri
|
198
|
+
|
199
|
+
thrifter = client.new implementation
|
200
|
+
assert_equal :stubbed_response, thrifter.echo(:request)
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_does_not_require_uri_when_providing_an_implementation
|
204
|
+
implementation = stub echo: :stubbed_response
|
205
|
+
|
206
|
+
client = Thrifter.build TestClient
|
207
|
+
client.config.uri = nil
|
208
|
+
|
209
|
+
thrifter = client.new implementation
|
210
|
+
assert_equal :stubbed_response, thrifter.echo(:request)
|
211
|
+
end
|
212
|
+
|
193
213
|
def test_close_the_transport_on_successful_rpc
|
194
214
|
transport = mock
|
195
215
|
client = Thrifter.build TestClient
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative '../test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class ErrorWrappingTest < MiniTest::Unit::TestCase
|
4
4
|
TestError = Class.new StandardError
|
5
5
|
|
6
6
|
attr_reader :rpc
|
7
7
|
|
8
8
|
def known_errors
|
9
|
-
Thrifter::
|
9
|
+
Thrifter::ErrorWrapping.wrapped
|
10
10
|
end
|
11
11
|
|
12
12
|
def setup
|
@@ -19,7 +19,7 @@ class ErrorWrappingMiddlewareTest < MiniTest::Unit::TestCase
|
|
19
19
|
app = stub
|
20
20
|
app.stubs(:call).with(rpc).raises(known_errors.first)
|
21
21
|
|
22
|
-
middleware = Thrifter::
|
22
|
+
middleware = Thrifter::ErrorWrapping.new app
|
23
23
|
|
24
24
|
assert_raises Thrifter::ClientError do
|
25
25
|
middleware.call rpc
|
@@ -30,7 +30,7 @@ class ErrorWrappingMiddlewareTest < MiniTest::Unit::TestCase
|
|
30
30
|
app = stub
|
31
31
|
app.stubs(:call).with(rpc).raises(TestError)
|
32
32
|
|
33
|
-
middleware = Thrifter::
|
33
|
+
middleware = Thrifter::ErrorWrapping.new app, [ TestError ]
|
34
34
|
|
35
35
|
assert_raises Thrifter::ClientError do
|
36
36
|
middleware.call rpc
|
@@ -41,7 +41,7 @@ class ErrorWrappingMiddlewareTest < MiniTest::Unit::TestCase
|
|
41
41
|
app = stub
|
42
42
|
app.stubs(:call).with(rpc).raises(TestError.new('testing 123'))
|
43
43
|
|
44
|
-
middleware = Thrifter::
|
44
|
+
middleware = Thrifter::ErrorWrapping.new app, [ TestError ]
|
45
45
|
|
46
46
|
error = assert_raises Thrifter::ClientError do
|
47
47
|
middleware.call rpc
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative '../test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class MetricsTest < MiniTest::Unit::TestCase
|
4
4
|
attr_reader :rpc
|
5
5
|
|
6
6
|
def setup
|
@@ -16,7 +16,7 @@ class StatsdMiddlewareTest < MiniTest::Unit::TestCase
|
|
16
16
|
statsd = mock
|
17
17
|
statsd.expects(:time).with(rpc.name).yields.returns(:response)
|
18
18
|
|
19
|
-
middleware = Thrifter::
|
19
|
+
middleware = Thrifter::Metrics.new app, statsd
|
20
20
|
result = middleware.call rpc
|
21
21
|
|
22
22
|
assert :response == result, 'Return value incorrect'
|
@@ -30,7 +30,7 @@ class StatsdMiddlewareTest < MiniTest::Unit::TestCase
|
|
30
30
|
statsd.expects(:time).yields
|
31
31
|
statsd.expects(:increment).with('errors.transport')
|
32
32
|
|
33
|
-
middleware = Thrifter::
|
33
|
+
middleware = Thrifter::Metrics.new app, statsd
|
34
34
|
|
35
35
|
assert_raises Thrift::TransportException do
|
36
36
|
middleware.call rpc
|
@@ -45,7 +45,7 @@ class StatsdMiddlewareTest < MiniTest::Unit::TestCase
|
|
45
45
|
statsd.expects(:time).yields
|
46
46
|
statsd.expects(:increment).with('errors.protocol')
|
47
47
|
|
48
|
-
middleware = Thrifter::
|
48
|
+
middleware = Thrifter::Metrics.new app, statsd
|
49
49
|
|
50
50
|
assert_raises Thrift::ProtocolException do
|
51
51
|
middleware.call rpc
|
@@ -60,7 +60,7 @@ class StatsdMiddlewareTest < MiniTest::Unit::TestCase
|
|
60
60
|
statsd.expects(:time).yields
|
61
61
|
statsd.expects(:increment).with('errors.application')
|
62
62
|
|
63
|
-
middleware = Thrifter::
|
63
|
+
middleware = Thrifter::Metrics.new app, statsd
|
64
64
|
|
65
65
|
assert_raises Thrift::ApplicationException do
|
66
66
|
middleware.call rpc
|
@@ -75,7 +75,7 @@ class StatsdMiddlewareTest < MiniTest::Unit::TestCase
|
|
75
75
|
statsd.expects(:time).yields
|
76
76
|
statsd.expects(:increment).with('errors.timeout')
|
77
77
|
|
78
|
-
middleware = Thrifter::
|
78
|
+
middleware = Thrifter::Metrics.new app, statsd
|
79
79
|
|
80
80
|
assert_raises Timeout::Error do
|
81
81
|
middleware.call rpc
|
@@ -90,7 +90,7 @@ class StatsdMiddlewareTest < MiniTest::Unit::TestCase
|
|
90
90
|
statsd.expects(:time).yields
|
91
91
|
statsd.expects(:increment).with('errors.other')
|
92
92
|
|
93
|
-
middleware = Thrifter::
|
93
|
+
middleware = Thrifter::Metrics.new app, statsd
|
94
94
|
|
95
95
|
assert_raises StandardError do
|
96
96
|
middleware.call rpc
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class ValidationTest < MiniTest::Unit::TestCase
|
4
|
+
attr_reader :rpc, :invalid_struct, :valid_struct
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
|
9
|
+
@rpc = Thrifter::RPC.new :echo
|
10
|
+
|
11
|
+
@invalid_struct = TestMessage.new
|
12
|
+
@valid_struct = TestMessage.new message: 'testing'
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_fails_if_args_contains_invalid_structs
|
16
|
+
rpc.args = [ invalid_struct ]
|
17
|
+
|
18
|
+
client = stub call: valid_struct
|
19
|
+
|
20
|
+
middleware = Thrifter::Validation.new client
|
21
|
+
|
22
|
+
assert_raises Thrifter::ValidationError do
|
23
|
+
middleware.call rpc
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_does_not_validate_primitive_request_values
|
28
|
+
rpc.args = [ 1, 2, 3 ]
|
29
|
+
|
30
|
+
client = stub call: valid_struct
|
31
|
+
|
32
|
+
middleware = Thrifter::Validation.new client
|
33
|
+
|
34
|
+
assert_equal valid_struct, middleware.call(rpc)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_fails_if_repsonse_contains_invalid_structs
|
38
|
+
rpc.args = [ valid_struct ]
|
39
|
+
|
40
|
+
client = stub call: invalid_struct
|
41
|
+
|
42
|
+
middleware = Thrifter::Validation.new client
|
43
|
+
|
44
|
+
assert_raises Thrifter::ValidationError do
|
45
|
+
middleware.call rpc
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_does_not_validate_primitive_response_values
|
50
|
+
rpc.args = [ valid_struct ]
|
51
|
+
|
52
|
+
client = stub call: [ 1, 2 ]
|
53
|
+
|
54
|
+
middleware = Thrifter::Validation.new client
|
55
|
+
assert_equal [ 1,2 ], middleware.call(rpc)
|
56
|
+
end
|
57
|
+
end
|
data/test/test_helper.rb
CHANGED
data/thrifter.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thrifter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ahawkins
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thrift-validator
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: statsd-ruby
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,21 +224,23 @@ files:
|
|
210
224
|
- Vagrantfile
|
211
225
|
- circle.yml
|
212
226
|
- lib/thrifter.rb
|
213
|
-
- lib/thrifter/
|
214
|
-
- lib/thrifter/
|
215
|
-
- lib/thrifter/
|
216
|
-
- lib/thrifter/
|
217
|
-
- lib/thrifter/
|
227
|
+
- lib/thrifter/extensions/ping.rb
|
228
|
+
- lib/thrifter/extensions/queueing.rb
|
229
|
+
- lib/thrifter/extensions/retriable.rb
|
230
|
+
- lib/thrifter/middleware/error_wrapping.rb
|
231
|
+
- lib/thrifter/middleware/metrics.rb
|
232
|
+
- lib/thrifter/middleware/validation.rb
|
218
233
|
- lib/thrifter/version.rb
|
219
234
|
- script/monkey-client
|
220
235
|
- script/server
|
221
236
|
- test.thrift
|
222
237
|
- test/acceptance_test.rb
|
223
|
-
- test/
|
224
|
-
- test/
|
225
|
-
- test/
|
226
|
-
- test/
|
227
|
-
- test/
|
238
|
+
- test/extensions/ping_test.rb
|
239
|
+
- test/extensions/queueing_test.rb
|
240
|
+
- test/extensions/retry_test.rb
|
241
|
+
- test/middleware/error_wrapping_test.rb
|
242
|
+
- test/middleware/metrics_test.rb
|
243
|
+
- test/middleware/validation_test.rb
|
228
244
|
- test/test_helper.rb
|
229
245
|
- thrifter.gemspec
|
230
246
|
- vendor/gen-rb/test_constants.rb
|
@@ -256,9 +272,10 @@ specification_version: 4
|
|
256
272
|
summary: Production ready Thrift client with improved semantics
|
257
273
|
test_files:
|
258
274
|
- test/acceptance_test.rb
|
259
|
-
- test/
|
260
|
-
- test/
|
261
|
-
- test/
|
262
|
-
- test/
|
263
|
-
- test/
|
275
|
+
- test/extensions/ping_test.rb
|
276
|
+
- test/extensions/queueing_test.rb
|
277
|
+
- test/extensions/retry_test.rb
|
278
|
+
- test/middleware/error_wrapping_test.rb
|
279
|
+
- test/middleware/metrics_test.rb
|
280
|
+
- test/middleware/validation_test.rb
|
264
281
|
- test/test_helper.rb
|