elementary-rpc 1.2.0 → 2.0.0

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: 56fcda60e0f593913eeafcab46d20825dd8e8e20
4
- data.tar.gz: a75f8e552bde90fc53250b704107da1ed4ae07e7
3
+ metadata.gz: 9bcc7e0abcf56202698d9b852c208a0fe8e5bf24
4
+ data.tar.gz: a7c0bcba0eee1e4a21bde6c30a9fa05fb6b68200
5
5
  SHA512:
6
- metadata.gz: ec48386473339fefb812d282caef334ca3d139f172b2e38c3fe0427e3241fc3666920168334c31a8b3ece8fa7eacf34d627ab9e37a7fd4fb52be908fbb264635
7
- data.tar.gz: 199316aa44f9d82c1845f8cfc7cfc28062073c74c6c604b4b45d2f1f037a6e1db7629f7926e1958543f9b5c0ca112369897932075ee90cf919a8d938b7036ae9
6
+ metadata.gz: 16397a5bece8062d1de4189cdb8355e8379aca6bdf6d2b4c6fbf799700cb5758fb452b3b241cbbe59256b60f3c4202115cb696f4555bc2d26cec49705db07cdb
7
+ data.tar.gz: 976eccc0b54ad4f07f6a607b05ef173f0fdb53bda76427c61e31d21dc835cea5da2ddd842358d47e206554267ad763f2f6c5542207d52c4be2c0af7475b7d493
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'rack'
7
- gem 'protobuf', :github => 'lookout/protobuffy'
7
+ gem 'protobuffy', :github => 'lookout/protobuffy'
8
8
 
9
9
  group :test do
10
10
  gem 'rspec'
data/README.md CHANGED
@@ -46,8 +46,12 @@ Elementary.use(Elementary::Middleware::Statsd, :client => Statsd.instance)
46
46
 
47
47
  # Create our Connection object that knows about our Protobuf service
48
48
  # definition
49
- c = Elementary::Connection.new(Echoserv::Simple, :hosts => hosts)
49
+ def connection
50
+ return @connection if @connection
50
51
 
52
+ @connection = Elementary::Connection.new(Echoserv::Simple,
53
+ :hosts => hosts)
54
+ end
51
55
  # Create a Protobuf message to send over RPC
52
56
  msg = Echoserv::String.new(:data => str)
53
57
 
@@ -91,4 +95,57 @@ TODO: Write usage instructions here
91
95
 
92
96
  ### Testing
93
97
 
98
+ Install ha-proxy for your OS
99
+ For Mac OSX, good reference source is http://nepalonrails.tumblr.com/post/9674428224/setup-haproxy-for-development-environment-on-mac
100
+ Sample ha-proxy config
101
+
102
+ cat /etc/haproxy.conf
103
+ global
104
+ maxconn 4096
105
+ pidfile ~/tmp/haproxy-queue.pid
106
+ log /tmp/haproxy/log local0
107
+ log /tmp/haproxy/log local1 notice
108
+
109
+ defaults
110
+ log global
111
+ mode http
112
+ timeout connect 300000
113
+ timeout client 300000
114
+ timeout server 300000
115
+ maxconn 2000
116
+ option redispatch
117
+ retries 3
118
+ option httpclose
119
+ option httplog
120
+ option forwardfor
121
+ option httpchk HEAD / HTTP/1.0
122
+
123
+ frontend http-farm-1
124
+ bind :8080
125
+ default_backend app1latest
126
+
127
+ frontend http-farm-2
128
+ bind :8070
129
+ default_backend app2latest
130
+
131
+ backend app1latest
132
+ balance roundrobin
133
+ server localhost_8000 localhost:8000
134
+
135
+ backend app2latest
136
+ balance roundrobin
137
+
138
+ listen haproxyapp_admin:9100 127.0.0.1:9100
139
+ mode http
140
+ stats uri /
141
+
142
+ Start ha-proxy listener
143
+ haproxy -f /etc/haproxy.conf
144
+
145
+ Start the server hosting the rpc as below:
94
146
  `bundle exec rpc_server start ./spec/support/simpleservice.rb -p 8000 --http`
147
+
148
+ Run the tests
149
+ `bundle exec rspec spec`
150
+
151
+
@@ -17,7 +17,7 @@ module Elementary
17
17
  # @param [Hash] opts
18
18
  # @options opts [Symbol] :transport Defaults to :http, must map to a class
19
19
  # in the +Elementary::Transport+ module
20
- # @optiosn opts [Array] :hosts An array of {:host => 'localhost', :port =>
20
+ # @options opts [Array] :hosts An array of {:host => 'localhost', :port =>
21
21
  # 8080} hashes to instruct the connection
22
22
  # @option opts [Hash] :transport_options A +Hash+ of request options that
23
23
  # will be passed down to the transport layer. This will depend on what
@@ -0,0 +1,89 @@
1
+ require 'faraday'
2
+
3
+ module Elementary
4
+ module Middleware
5
+ class HttpStatusError < StandardError; end
6
+ ##
7
+ # Raise an exception for certain HTTP response status codes
8
+ #
9
+ # Examples
10
+ #
11
+ # Faraday.new do |conn|
12
+ # conn.request :raise_on_status
13
+ # conn.adapter ...
14
+ # end
15
+ #
16
+ # The above example will raise an HttpStatusError if the response
17
+ # contains a code in the range 300 through 600.
18
+ #
19
+ # You can also pair this with the retry middleware to attempt
20
+ # to recover from intermittent failures...
21
+ #
22
+ # Faraday.new do |conn|
23
+ # conn.request :retry, max: 2, interval: 0.05,
24
+ # interval_randomness: 0.5, backoff_factor: 2
25
+ # exceptions: [Faraday::TimeoutError, SecurityEvents::HttpStatusError]
26
+ # conn.request :raise_on_status
27
+ # conn.adapter ...
28
+ # end
29
+ #
30
+ # This example will do the same as the first, but the exception
31
+ # will be caught by the retry middleware and the request will be
32
+ # executed up to two more times before raising.
33
+ # NOTE: Middleware order matters here!
34
+ #
35
+ class RaiseOnStatus < Faraday::Middleware
36
+
37
+ DEFAULT_STATUS_ARRAY = [300..600]
38
+ ERROR_HEADER_MSG = 'x-protobuf-error'
39
+ ERROR_HEADER_CODE = 'x-protobuf-error-reason'
40
+
41
+ dependency do
42
+ require 'set'
43
+ end
44
+
45
+ # Public: Initialize middleware
46
+ def initialize(app)
47
+ super(app)
48
+ status_array ||= DEFAULT_STATUS_ARRAY
49
+ @status_set = status_option_array_to_set(status_array)
50
+ end
51
+
52
+ def call(request_env)
53
+ begin
54
+ @app.call(request_env).on_complete do |response_env|
55
+ status = response_env[:status]
56
+ if @status_set.include? status
57
+ error_msg = response_env[:response_headers][ERROR_HEADER_MSG]
58
+ error_code = response_env[:response_headers][ERROR_HEADER_CODE]
59
+ if error_msg
60
+ raise Elementary::Errors::RPCFailure, "Error #{error_code}: #{error_msg}"
61
+ else
62
+ method = response_env.method.to_s.upcase
63
+ url = response_env.url.to_s
64
+ raise HttpStatusError, "#{method} #{url} returned an HTTP response status of #{status}, so an exception was raised."
65
+ end
66
+ end
67
+ end
68
+ rescue Faraday::ClientError => e
69
+ raise HttpStatusError, "#{e.message}"
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ # Private: Construct a set of status codes.
76
+ #
77
+ # Accepts an array of Numeric and Enumerable objects which are added or merged to form a set.
78
+ def status_option_array_to_set(status_array)
79
+ set = Set.new
80
+ status_array.each do |item|
81
+ set.add item if item.is_a? Numeric
82
+ set.merge item if item.is_a? Enumerable
83
+ end
84
+ set
85
+ end
86
+ end
87
+ Faraday::Request.register_middleware :raise_on_status => lambda { RaiseOnStatus }
88
+ end
89
+ end
@@ -2,15 +2,12 @@ require 'rubygems'
2
2
  require 'cgi'
3
3
  require 'faraday'
4
4
  require 'socket'
5
-
6
5
  require 'elementary/errors'
7
6
  require 'elementary/future'
8
7
 
9
8
  module Elementary
10
9
  module Transport
11
10
  class HTTP
12
- ERROR_HEADER_MSG = 'x-protobuf-error'
13
- ERROR_HEADER_CODE = 'x-protobuf-error-reason'
14
11
 
15
12
  # Create a HTTP transport object for sending protobuf objects to the
16
13
  # service host names enumerated in +hosts+
@@ -24,6 +21,7 @@ module Elementary
24
21
  end
25
22
 
26
23
  def call(service, rpc_method, *params)
24
+
27
25
  begin
28
26
  response = client.post do |h|
29
27
  path = "#{CGI.escape(service.name)}/#{rpc_method.method}"
@@ -31,16 +29,8 @@ module Elementary
31
29
  h.body = params[0].encode
32
30
  end
33
31
 
34
- error_msg = response.headers[ERROR_HEADER_MSG]
35
- error_code = response.headers[ERROR_HEADER_CODE]
36
-
37
- if error_msg
38
- raise Elementary::Errors::RPCFailure, "Error #{error_code}: #{error_msg}"
39
- end
40
-
41
32
  return rpc_method[:response_type].decode(response.body)
42
33
  rescue StandardError => e
43
- #puts "EXCEPTION #{e.inspect}"
44
34
  raise
45
35
  end
46
36
  end
@@ -60,10 +50,10 @@ module Elementary
60
50
 
61
51
  faraday_options = @options.merge({:url => host_url})
62
52
  @client = Faraday.new(faraday_options) do |f|
53
+ f.request :raise_on_status
63
54
  f.response :logger
64
55
  f.adapter :net_http_persistent
65
56
  end
66
-
67
57
  return @client
68
58
  end
69
59
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Elementary
3
- VERSION = "1.2.0"
3
+ VERSION = "2.0.0"
4
4
  end
@@ -81,7 +81,6 @@ describe Elementary::Connection do
81
81
  end
82
82
  end
83
83
 
84
-
85
84
  describe 'an error request', :type => :integration do
86
85
  describe 'rpc' do
87
86
  describe '#error' do
@@ -105,26 +104,39 @@ describe Elementary::Connection do
105
104
  describe 'rpc' do
106
105
  describe '#echo' do
107
106
  let(:request) { Elementary::Rspec::String.new(:data => 'rspec') }
108
- subject(:response) { connection.rpc.echo(request) }
109
-
110
- before :each do
111
- Elementary.use Elementary::Middleware::Dummy, :rspec => true
112
- expect_any_instance_of(Elementary::Middleware::Dummy).to \
113
- receive(:call).and_call_original
107
+ context 'with http connection failure due to haproxy resolving service to wrong host or port' do
108
+ let(:opts) { { 'hosts' => [{'host' => 'localhost', 'port' => '8090'}] } }
109
+ subject(:response) { connection.rpc.echo(request) }
110
+
111
+ before :each do
112
+ response.value
113
+ end
114
+
115
+ it { should be_rejected }
116
+ it { should be_instance_of Elementary::Future }
117
+ it 'should have a connection refused reason' do
118
+ expect(response.reason).not_to be_nil
119
+ expect(response.reason.to_s).to eq("connection refused: localhost:8090")
120
+ end
114
121
  end
115
-
116
- it 'should have a value containing the echoed string' do
117
- puts "Sending req #{Time.now.to_f}"
118
- expect(response).to be_instance_of Elementary::Future
119
-
120
- puts "Waiting for future #{Time.now.to_f}"
121
- value = response.value # Wait on the future
122
- puts "Future responded: #{Time.now.to_f}"
123
-
124
- expect(response).not_to be_rejected
125
- expect(value.data).to eql('rspec')
122
+ context 'with http connection success' do
123
+ let(:opts) { { 'hosts' => [{'host' => 'localhost', 'port' => '8000'}] } }
124
+ subject(:response) { connection.rpc.echo(request) }
125
+
126
+ before :each do
127
+ Elementary.use Elementary::Middleware::Dummy, :rspec => true
128
+ expect_any_instance_of(Elementary::Middleware::Dummy).to \
129
+ receive(:call).and_call_original
130
+ end
131
+
132
+ it 'should have a value containing the echoed string' do
133
+ expect(response).to be_instance_of Elementary::Future
134
+ value = response.value # Wait on the future
135
+ expect(response).not_to be_rejected
136
+ expect(value.data).to eql('rspec')
137
+ end
126
138
  end
127
- end
139
+ end
128
140
  end
129
141
  end
130
142
  end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'support/clients/base_elementary_client'
3
+ require 'support/clients/elementary_client_using_anti_pattern'
4
+
5
+ def sendAndVerify(msg)
6
+ response = client.invoke_echo_service(Elementary::Rspec::String.new(:data => msg))
7
+ expect(response).to be_rejected
8
+ expect(response.reason.class).to be Elementary::Middleware::HttpStatusError
9
+ expect(response.reason.message).to include("connection refused: localhost:8090")
10
+ end
11
+
12
+ # This test requires that no process be listening at localhost:8090
13
+ describe ElementaryClientUsingAntiPattern, "http connection returning error code 503", :type => :integration do
14
+ subject (:client) {ElementaryClientUsingAntiPattern.new()}
15
+ describe "#initialize" do
16
+ it "creates a connection" do
17
+ expect(client.connection).not_to be_nil
18
+ end
19
+ end
20
+ describe "#invoke_service" do
21
+ context 'with http connection returning error connection refused' do
22
+ it "invokes echo service" do
23
+ sendAndVerify('rspec1')
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+ require 'support/clients/base_elementary_client'
3
+ require 'support/clients/sample_elementary_client'
4
+
5
+ def send_and_verify_http_error_503(msg)
6
+ response = client.invoke_error_service(Elementary::Rspec::String.new(:data => msg))
7
+ expect(response).to be_rejected
8
+ expect(response.reason.class).to be Elementary::Middleware::HttpStatusError
9
+ expect(response.reason.message).to include("returned an HTTP response status of 503, so an exception was raised.")
10
+ end
11
+
12
+ def send_and_verify_http_error_500(msg)
13
+ response = client.invoke_error_service(Elementary::Rspec::String.new(:data => msg))
14
+ expect(response).to be_rejected
15
+ expect(response.reason.class).to be Elementary::Errors::RPCFailure
16
+ expect(response.reason.message).to include("sample failure")
17
+ end
18
+
19
+ def send_and_verify_http_error_400(msg)
20
+ response = client.invoke_bad_request_data_service(Elementary::Rspec::String.new(:data => msg))
21
+ expect(response).to be_rejected
22
+ expect(response.reason.class).to be Elementary::Errors::RPCFailure
23
+ expect(response.reason.message).to include("sample bad request data failure")
24
+ end
25
+
26
+ def send_and_verify_http_error_404(msg)
27
+ response = client.invoke_service_not_found_service(Elementary::Rspec::String.new(:data => msg))
28
+ expect(response).to be_rejected
29
+ expect(response.reason.class).to be Elementary::Errors::RPCFailure
30
+ expect(response.reason.message).to include("sample service not found failure")
31
+ end
32
+
33
+ def send_and_verify_connection_refused(msg)
34
+ response = client.invoke_error_service(Elementary::Rspec::String.new(:data => msg))
35
+ expect(response).to be_rejected
36
+ expect(response.reason.class).to be Elementary::Middleware::HttpStatusError
37
+ expect(response.reason.message).to include("connection refused: localhost:8090")
38
+ end
39
+
40
+ # This test requires ha-proxy to be listening at localhost:8080, but no real rpc to be available
41
+ describe SampleElementaryClient, "http connection returning error code 503", :type => :integration do
42
+ subject (:client) {SampleElementaryClient.new(8070)}
43
+ describe "#initialize" do
44
+ it "creates a connection" do
45
+ expect(client.connection).not_to be_nil
46
+ end
47
+ end
48
+ describe "#invoke_error_service" do
49
+ context 'with http connection returning error code 503' do
50
+ it "invokes error service" do
51
+ send_and_verify_http_error_503('rspec1')
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ # This test requires that no process be listening at localhost:8090
58
+ describe SampleElementaryClient, "http connection returning connection refused error", :type => :integration do
59
+ subject (:client) {SampleElementaryClient.new(8090)}
60
+ describe "#initialize" do
61
+ it "creates a connection" do
62
+ expect(client.connection).not_to be_nil
63
+ end
64
+ end
65
+ describe "#invoke_error_service" do
66
+ context 'with http connection failed' do
67
+ it "invokes error service" do
68
+ send_and_verify_connection_refused('rspec1')
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ # These tests requires ha-proxy to be listening at localhost:8080 routing requests to online rpc server
75
+ describe SampleElementaryClient, "rpc requests returning non-connection related errors", :type => :integration do
76
+ subject (:client) {SampleElementaryClient.new(8080)}
77
+ describe "#initialize" do
78
+ it "creates a connection" do
79
+ expect(client.connection).not_to be_nil
80
+ end
81
+ end
82
+ describe "#invoke_bad_request_data_service", "handles http error 400" do
83
+ it "invokes bad request data service" do
84
+ send_and_verify_http_error_400('rspec1')
85
+ end
86
+ end
87
+ describe "#invoke_service_not_found_service", "handles http error 404" do
88
+ it "invokes service not found service" do
89
+ send_and_verify_http_error_404('rspec1')
90
+ end
91
+ end
92
+ describe "#invoke_service_returning_failure", "handles http error 500" do
93
+ it "invokes service returning failure" do
94
+ send_and_verify_http_error_500('rspec1')
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,31 @@
1
+ require 'elementary'
2
+
3
+ class BaseElementaryClient
4
+ attr_accessor :connection
5
+
6
+ def invoke_error_service(request)
7
+ result = connection.rpc.error(request)
8
+ return handle(result)
9
+ end
10
+
11
+ def invoke_bad_request_data_service(request)
12
+ result = connection.rpc.bad_request_data_method(request)
13
+ return handle(result)
14
+ end
15
+
16
+ def invoke_service_not_found_service(request)
17
+ result = connection.rpc.service_not_found_method(request)
18
+ return handle(result)
19
+ end
20
+
21
+ def invoke_echo_service(request)
22
+ result = connection.rpc.echo(request)
23
+ return handle(result)
24
+ end
25
+
26
+ def handle(result)
27
+ result.value
28
+ return result
29
+ end
30
+
31
+ end
@@ -0,0 +1,13 @@
1
+ require 'elementary'
2
+
3
+ class ElementaryClientUsingAntiPattern < BaseElementaryClient
4
+ # This class demonstrates an anti-pattern of creating connection
5
+ # at initialization only. Although it works mostly, this pattern should not be used,
6
+ # since the connection should be re-established any time the connection object becomes nil.
7
+
8
+ def initialize
9
+ @connection = Elementary::Connection.new(Elementary::Rspec::Simple,
10
+ :hosts => [{'host' => 'localhost', 'port' => '8090'}])
11
+ end
12
+ end
13
+
@@ -0,0 +1,12 @@
1
+ require 'elementary'
2
+
3
+ class SampleElementaryClient < BaseElementaryClient
4
+ def initialize(port)
5
+ @port = port
6
+ end
7
+ def connection
8
+ return @connection if @connection
9
+ @connection = Elementary::Connection.new(Elementary::Rspec::Simple,
10
+ :hosts => [{'host' => 'localhost', 'port' => @port}])
11
+ end
12
+ end
@@ -9,4 +9,6 @@ message String {
9
9
  service Simple {
10
10
  rpc Echo (String) returns (String);
11
11
  rpc Error (String) returns (String);
12
+ rpc BadRequestDataMethod (String) returns (String);
13
+ rpc ServiceNotFoundMethod (String) returns (String);
12
14
  }
@@ -28,6 +28,8 @@ module Elementary
28
28
  class Simple < ::Protobuf::Rpc::Service
29
29
  rpc :echo, ::Elementary::Rspec::String, ::Elementary::Rspec::String
30
30
  rpc :error, ::Elementary::Rspec::String, ::Elementary::Rspec::String
31
+ rpc :bad_request_data_method, ::Elementary::Rspec::String, ::Elementary::Rspec::String
32
+ rpc :service_not_found_method, ::Elementary::Rspec::String, ::Elementary::Rspec::String
31
33
  end
32
34
 
33
35
  end
@@ -1,4 +1,5 @@
1
1
  require './spec/support/simpleservice.pb'
2
+ require 'protobuf/rpc/error'
2
3
 
3
4
  module Elementary
4
5
  module Rspec
@@ -13,6 +14,14 @@ module Elementary
13
14
  def error
14
15
  rpc_failed 'sample failure'
15
16
  end
17
+
18
+ def bad_request_data_method
19
+ fail ::Protobuf::Rpc::BadRequestData, 'sample bad request data failure'
20
+ end
21
+
22
+ def service_not_found_method
23
+ fail ::Protobuf::Rpc::ServiceNotFound, 'sample service not found failure'
24
+ end
16
25
  end
17
26
  end
18
27
  end
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elementary-rpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - R. Tyler Croy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-10 00:00:00.000000000 Z
11
+ date: 2015-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ~>
18
17
  - !ruby/object:Gem::Version
19
18
  version: '1.6'
20
- type: :development
19
+ name: bundler
21
20
  prerelease: false
21
+ type: :development
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - ">="
30
+ - - '>='
32
31
  - !ruby/object:Gem::Version
33
32
  version: '0'
34
- type: :development
33
+ name: rake
35
34
  prerelease: false
35
+ type: :development
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: concurrent-ruby
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
- - - "~>"
44
+ - - ~>
46
45
  - !ruby/object:Gem::Version
47
46
  version: 0.7.0
48
- type: :runtime
47
+ name: concurrent-ruby
49
48
  prerelease: false
49
+ type: :runtime
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.7.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: faraday
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
- - - "~>"
58
+ - - ~>
60
59
  - !ruby/object:Gem::Version
61
60
  version: 0.9.0
62
- type: :runtime
61
+ name: faraday
63
62
  prerelease: false
63
+ type: :runtime
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.9.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: net-http-persistent
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
- - - "~>"
72
+ - - ~>
74
73
  - !ruby/object:Gem::Version
75
74
  version: 2.9.4
76
- type: :runtime
75
+ name: net-http-persistent
77
76
  prerelease: false
77
+ type: :runtime
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: 2.9.4
83
83
  - !ruby/object:Gem::Dependency
84
- name: lookout-statsd
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
- - - "~>"
86
+ - - ~>
88
87
  - !ruby/object:Gem::Version
89
88
  version: 0.9.0
90
- type: :runtime
89
+ name: lookout-statsd
91
90
  prerelease: false
91
+ type: :runtime
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.9.0
97
97
  - !ruby/object:Gem::Dependency
98
- name: hashie
99
98
  requirement: !ruby/object:Gem::Requirement
100
99
  requirements:
101
- - - ">="
100
+ - - '>='
102
101
  - !ruby/object:Gem::Version
103
102
  version: '0'
104
- type: :runtime
103
+ name: hashie
105
104
  prerelease: false
105
+ type: :runtime
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  description: BLANK
@@ -115,8 +115,8 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
- - ".gitignore"
119
- - ".rspec"
118
+ - .gitignore
119
+ - .rspec
120
120
  - Gemfile
121
121
  - LICENSE.txt
122
122
  - README.md
@@ -129,16 +129,22 @@ files:
129
129
  - lib/elementary/future.rb
130
130
  - lib/elementary/middleware.rb
131
131
  - lib/elementary/middleware/dummy.rb
132
+ - lib/elementary/middleware/raise_on_status.rb
132
133
  - lib/elementary/middleware/statsd.rb
133
134
  - lib/elementary/transport.rb
134
135
  - lib/elementary/transport/http.rb
135
136
  - lib/elementary/version.rb
136
137
  - spec/connection_spec.rb
138
+ - spec/elementary_client_using_anti_pattern_spec.rb
137
139
  - spec/elementary_spec.rb
138
140
  - spec/executor_spec.rb
139
141
  - spec/future_spec.rb
140
142
  - spec/middleware/statsd_spec.rb
143
+ - spec/sample_elementary_client_spec.rb
141
144
  - spec/spec_helper.rb
145
+ - spec/support/clients/base_elementary_client.rb
146
+ - spec/support/clients/elementary_client_using_anti_pattern.rb
147
+ - spec/support/clients/sample_elementary_client.rb
142
148
  - spec/support/proto/simpleservice.proto
143
149
  - spec/support/simpleservice.pb.rb
144
150
  - spec/support/simpleservice.rb
@@ -147,33 +153,38 @@ homepage: ''
147
153
  licenses:
148
154
  - MIT
149
155
  metadata: {}
150
- post_install_message:
156
+ post_install_message:
151
157
  rdoc_options: []
152
158
  require_paths:
153
159
  - lib
154
160
  required_ruby_version: !ruby/object:Gem::Requirement
155
161
  requirements:
156
- - - ">="
162
+ - - '>='
157
163
  - !ruby/object:Gem::Version
158
164
  version: '0'
159
165
  required_rubygems_version: !ruby/object:Gem::Requirement
160
166
  requirements:
161
- - - ">="
167
+ - - '>='
162
168
  - !ruby/object:Gem::Version
163
169
  version: '0'
164
170
  requirements: []
165
- rubyforge_project:
166
- rubygems_version: 2.2.2
167
- signing_key:
171
+ rubyforge_project:
172
+ rubygems_version: 2.4.5
173
+ signing_key:
168
174
  specification_version: 4
169
175
  summary: Gem supporting Protobuf RPC in a simple way
170
176
  test_files:
171
177
  - spec/connection_spec.rb
178
+ - spec/elementary_client_using_anti_pattern_spec.rb
172
179
  - spec/elementary_spec.rb
173
180
  - spec/executor_spec.rb
174
181
  - spec/future_spec.rb
175
182
  - spec/middleware/statsd_spec.rb
183
+ - spec/sample_elementary_client_spec.rb
176
184
  - spec/spec_helper.rb
185
+ - spec/support/clients/base_elementary_client.rb
186
+ - spec/support/clients/elementary_client_using_anti_pattern.rb
187
+ - spec/support/clients/sample_elementary_client.rb
177
188
  - spec/support/proto/simpleservice.proto
178
189
  - spec/support/simpleservice.pb.rb
179
190
  - spec/support/simpleservice.rb