elementary-rpc 1.2.0 → 2.0.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 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