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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fd99b7900e55cc7abcfe145198cb184b4dd27d28
4
- data.tar.gz: b5aeb9adef656c411b43327a619496f0dd46b429
3
+ metadata.gz: d17b3472039110ba6cb2226fb72e0ed490f3a0a9
4
+ data.tar.gz: 0dc804e6e5de0d3e3107961d5841ca834db39d29
5
5
  SHA512:
6
- metadata.gz: 30d3d385ef740047a5dae0b0f704518a5e9c77e551bd29d7cf991a65b33fb5255a4b246571e6088ae36a457bb5ca37a9d90dda2c949efd50f3bfcb7431ce09be
7
- data.tar.gz: c0c644e11697991a4f2187dd505906a53de4829d74f7653b7f65ef25965ddf6649a78caca0f5d5e05a64ab9385d805f6c981a6cadbc380c43b898391f73711e0
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
- ### RPC Metrics with Statsd
90
+ ### Extensions
91
91
 
92
- Statsd metrics are **opt-in**. By default, `Thrifter` sets the statsd
93
- client to a null implementation. If you want metrics, set
94
- `config.statsd` to an object that implements the [statsd-ruby][]
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
- ### RPC Queuing
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
- ### RPC Retrying
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
- Middleware can only be customized at the class level. This ensures
187
- middleware applies when used in extensions.
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
- ### Error Wrapping
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
- ### Pinging
290
+ #### Protocol Validation
253
291
 
254
- Components in a system may need to inquire if other systems are
255
- available before continuing. `Thrifer::Ping` is just that.
256
- `Thrifter::Ping` assumes the service has a `ping` RPC. If your
257
- service does not have one (or is named differently) simply implement
258
- the `ping` method on the class. Any successful response will count as
259
- up, anything else will not.
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 < Thrifer.build(MyService::Client)
263
- include Thrifer::Ping
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
@@ -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
- fail ArgumentError, 'config.uri not set!' unless config.uri
128
+ def initialize(client = nil)
129
+ if client.nil?
130
+ fail ArgumentError, 'config.uri not set!' unless config.uri
120
131
 
121
- uri = URI(config.uri)
132
+ uri = URI(config.uri)
122
133
 
123
- fail ArgumentError, 'URI did not contain port' unless uri.port
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 StatsdMiddleware, config.statsd
145
+ stack.use Metrics, config.statsd
134
146
 
135
- socket = Thrift::Socket.new uri.host, uri.port, config.rpc_timeout.to_f
136
- transport = config.transport.new socket
137
- protocol = config.protocol.new transport
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
- stack.use Dispatcher, transport, client_class.new(protocol)
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/statsd_middleware'
164
- require_relative 'thrifter/ping'
165
- require_relative 'thrifter/error_wrapping_middleware'
166
- require_relative 'thrifter/retry'
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'
@@ -3,7 +3,7 @@ module Thrifter
3
3
  "#{ex.class}: #{ex.message}"
4
4
  end
5
5
 
6
- class ErrorWrappingMiddleware
6
+ class ErrorWrapping
7
7
  WRAP = [
8
8
  Thrift::TransportException,
9
9
  Thrift::ProtocolException,
@@ -1,5 +1,5 @@
1
1
  module Thrifter
2
- class StatsdMiddleware
2
+ class Metrics
3
3
  include Concord.new(:app, :statsd)
4
4
 
5
5
  def call(rpc)
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Thrifter
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  require 'bundler/setup'
13
13
  require 'thrifter'
14
- require 'thrifter/queueing'
14
+ require 'thrifter/extensions/queueing'
15
15
  require 'securerandom'
16
16
 
17
17
  require 'eventmachine'
@@ -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,4 +1,4 @@
1
- require_relative './test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
3
  class PingTest < MiniTest::Unit::TestCase
4
4
  def test_returns_false_if_anything_goes_wrong
@@ -1,4 +1,4 @@
1
- require_relative 'test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
3
  class QueuingTest < MiniTest::Unit::TestCase
4
4
  class TestClient < TestService::Client
@@ -1,4 +1,4 @@
1
- require_relative 'test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
3
  class RetryTest < MiniTest::Unit::TestCase
4
4
  JunkError = Class.new StandardError
@@ -1,12 +1,12 @@
1
- require_relative './test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
- class ErrorWrappingMiddlewareTest < MiniTest::Unit::TestCase
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::ErrorWrappingMiddleware.wrapped
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::ErrorWrappingMiddleware.new app
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::ErrorWrappingMiddleware.new app, [ TestError ]
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::ErrorWrappingMiddleware.new app, [ TestError ]
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 './test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
- class StatsdMiddlewareTest < MiniTest::Unit::TestCase
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::StatsdMiddleware.new app, statsd
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::StatsdMiddleware.new app, statsd
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::StatsdMiddleware.new app, statsd
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::StatsdMiddleware.new app, statsd
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::StatsdMiddleware.new app, statsd
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::StatsdMiddleware.new app, statsd
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
@@ -1,6 +1,6 @@
1
1
  require 'bundler/setup'
2
2
  require 'thrifter'
3
- require 'thrifter/queueing'
3
+ require 'thrifter/extensions/queueing'
4
4
 
5
5
  root = File.expand_path '../..', __FILE__
6
6
  $LOAD_PATH << "#{root}/vendor/gen-rb"
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "thrift"
22
22
  spec.add_dependency "thrift-base64"
23
+ spec.add_dependency "thrift-validator"
23
24
  spec.add_dependency "statsd-ruby"
24
25
  spec.add_dependency "concord"
25
26
  spec.add_dependency "middleware"
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.0
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/error_wrapping_middleware.rb
214
- - lib/thrifter/ping.rb
215
- - lib/thrifter/queueing.rb
216
- - lib/thrifter/retry.rb
217
- - lib/thrifter/statsd_middleware.rb
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/error_wrapping_middleware_test.rb
224
- - test/ping_test.rb
225
- - test/queuing_test.rb
226
- - test/retry_test.rb
227
- - test/statsd_middleware_test.rb
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/error_wrapping_middleware_test.rb
260
- - test/ping_test.rb
261
- - test/queuing_test.rb
262
- - test/retry_test.rb
263
- - test/statsd_middleware_test.rb
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