endorser 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 08157f50cd6166fdac4c1963553e3194946a3322
4
+ data.tar.gz: fab80bd309b27b9bf427a76969eec0127a8bcca3
5
+ SHA512:
6
+ metadata.gz: cd1c3a31b36d39294410df7e9b7255c42a08c8a20dce31681c8157a2958250e2d7e12311e1c1e5ce7214065942e440b815904dd9aaca10eb263241aab6941137
7
+ data.tar.gz: 5887df3d9f83139e26a0f0fb48e8c8200a1b669f82ea454276951b912db8aa652fb25fd444abbe42179d3d3a166c57f4d9136e6bd9dd58cd314120708e1e9521
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ endorse
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in signed-rest-client.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
data/endorser.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'endorser/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "endorser"
8
+ spec.version = Endorser::VERSION
9
+ spec.authors = ["Matthew Johnston", "Graham Christensen"]
10
+ spec.email = ["matt@zippykid.com", "graham@zippykid.com"]
11
+ spec.description = %q{A small rest client library that signs the requests}
12
+ spec.summary = %q{A small rest client library that signs the requests}
13
+ spec.homepage = "https://github.com/zippykid/endorser"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency("rest-client", "~> 1.6")
22
+ spec.add_dependency("endorser-receipt", "~> 1.0.0")
23
+
24
+ spec.add_development_dependency("bundler", "~> 1.3")
25
+ spec.add_development_dependency("rake")
26
+ spec.add_development_dependency("rspec", "~> 2.14.0")
27
+ spec.add_development_dependency("simplecov")
28
+ end
@@ -0,0 +1,153 @@
1
+ module Endorser
2
+
3
+ class Client
4
+ attr_reader :key, :secret, :realm
5
+
6
+ def initialize(key, secret, realm)
7
+ @key = key
8
+ @secret = secret
9
+ @realm = realm
10
+ end
11
+
12
+ # @param [String] url
13
+ # @param [Hash] headers
14
+ # @raise [Sacred::Errors::Error] if an error is encountered with sacred
15
+ # @return [Hash]
16
+ def get(url, headers={})
17
+ execute({
18
+ method: :get,
19
+ url: url,
20
+ headers: headers
21
+ })
22
+ end
23
+
24
+ # @param [String] url
25
+ # @param [Hash] payload
26
+ # @param [Hash] headers
27
+ # @raise [Sacred::Errors::Error] if an error is encountered with sacred
28
+ # @return [Hash]
29
+ def post(url, payload={}, headers={})
30
+ execute({
31
+ method: :post,
32
+ url: url,
33
+ payload: payload,
34
+ headers: headers
35
+ })
36
+ end
37
+
38
+ # @param [String] url
39
+ # @param [Hash] payload
40
+ # @param [Hash] headers
41
+ # @raise [Sacred::Errors::Error] if an error is encountered with sacred
42
+ # @return [Hash]
43
+ def put(url, payload={}, headers={})
44
+ execute({
45
+ method: :put,
46
+ url: url,
47
+ payload: payload,
48
+ headers: headers
49
+ })
50
+ end
51
+
52
+ # @param [String] url
53
+ # @param [Hash] headers
54
+ # @raise [Sacred::Errors::Error] if an error is encountered with sacred
55
+ # @return [Hash]
56
+ def delete(url, headers={})
57
+ execute({
58
+ method: :delete,
59
+ url: url,
60
+ headers: headers
61
+ })
62
+ end
63
+
64
+ # Wrapper around RestClient::Request.execute method
65
+ #
66
+ # @param [Hash] args
67
+ # @raise [Sacred::Errors::Error] when the request fails
68
+ # @return [Hash]
69
+ def execute(args={})
70
+ RestClient::Request.execute(signed_request(args)) do |response, request, result, &block|
71
+ Endorser::Response.new(response, request)
72
+ end
73
+ rescue RestClient::Exception => error
74
+ raise Endorser::RequestError.new(error)
75
+ end
76
+
77
+ def signed_request(args={})
78
+ if args[:headers].nil?
79
+ args[:headers] = Hash.new
80
+ end
81
+
82
+ headers = args[:headers]
83
+ headers[:raw_response] = true
84
+ headers[:content_type] = "application/json;q=0.1;version=1, */*;q=0.0;version=1"
85
+
86
+ headers['ZK-Date'] = Time.now.httpdate
87
+ headers['ZK-Nonce'] = SecureRandom.uuid
88
+
89
+ receipt = build_receipt(args)
90
+
91
+ signable_headers(headers).each do |k,v|
92
+ receipt.headers[k] = v
93
+ end
94
+
95
+ digest = OpenSSL::Digest::Digest.new('sha1')
96
+ validation = OpenSSL::HMAC.hexdigest(digest, secret, receipt.to_s)
97
+
98
+ headers["Authorization"] = "#{realm} #{key}:#{validation}"
99
+
100
+ args
101
+ end
102
+
103
+ def build_receipt(args={})
104
+ headers = args[:headers]
105
+ method = args[:method].to_s
106
+ url = args[:url]
107
+
108
+ receipt = Endorser::Receipt.new
109
+ receipt.host = host(url)
110
+ receipt.uri = uri_path_and_query(url)
111
+ receipt.request_method = method
112
+ receipt.api_key = key
113
+ receipt.api_secret = secret
114
+ receipt.content_type = headers['Content-Type']
115
+ receipt.body = RestClient::Payload.generate(args[:payload]).to_s
116
+ receipt
117
+ end
118
+
119
+ def uri_path_and_query(url)
120
+ uri = URI(url)
121
+ if uri.query.nil?
122
+ uri.path
123
+ else
124
+ [uri.path, '?', uri.query].join
125
+ end
126
+ end
127
+
128
+ def host(url)
129
+ uri = URI(url)
130
+ value = [uri.scheme, '://', uri.host]
131
+
132
+ if include_port?(uri)
133
+ value += [':', uri.port.to_s]
134
+ end
135
+
136
+ value.join
137
+ end
138
+
139
+ def include_port?(uri)
140
+ (uri.scheme != 'http' || uri.port != 80) && (uri.scheme != 'https' || uri.port != 443)
141
+ end
142
+
143
+ def signable_headers(headers)
144
+ headers.select { |k,v|
145
+ k.downcase =~ /^zk-/
146
+ }.sort_by { |k,v|
147
+ k.to_s.downcase
148
+ }
149
+ end
150
+ end
151
+
152
+
153
+ end
@@ -0,0 +1,8 @@
1
+ module Endorser
2
+ module Errors
3
+
4
+ class RequestError < ::StandardError
5
+ end
6
+
7
+ end
8
+ end
@@ -0,0 +1,55 @@
1
+ module Endorser
2
+ class Response
3
+ attr_reader :request, :raw
4
+
5
+ def initialize(raw, request)
6
+ @raw = raw
7
+ @request = request
8
+ end
9
+
10
+ # @return [Hash]
11
+ def headers
12
+ raw.raw_headers
13
+ end
14
+
15
+ # @return [Hash]
16
+ def cookies
17
+ raw.cookies
18
+ end
19
+
20
+ # @return [String]
21
+ def body
22
+ raw.to_s
23
+ end
24
+
25
+ # @return [Integer]
26
+ def code
27
+ raw.code
28
+ end
29
+
30
+ # @return [Boolean]
31
+ def informational?
32
+ code.between?(100, 199)
33
+ end
34
+
35
+ # @return [Boolean]
36
+ def success?
37
+ code.between?(200, 299)
38
+ end
39
+
40
+ # @return [Boolean]
41
+ def redirection?
42
+ code.between?(300, 399)
43
+ end
44
+
45
+ # @return [Boolean]
46
+ def client_error?
47
+ code.between?(400, 499)
48
+ end
49
+
50
+ # @return [Boolean]
51
+ def server_error?
52
+ code.between?(500, 599)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,5 @@
1
+ module Endorser
2
+
3
+ VERSION = '1.3.0'
4
+
5
+ end
data/lib/endorser.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'openssl'
2
+ require 'time'
3
+ require 'securerandom'
4
+ require 'rest_client'
5
+
6
+ require 'endorser/version'
7
+
8
+ module Endorser
9
+
10
+ end
11
+
12
+ require 'endorser/errors/request_error'
13
+ require 'endorser/response'
14
+ require 'endorser/receipt'
15
+ require 'endorser/client'
@@ -0,0 +1,200 @@
1
+ require 'spec_helper'
2
+
3
+ describe Endorser::Client do
4
+ let(:client) { Endorser::Client.new('abc', '123', 'My Realm') }
5
+
6
+ describe '#initialize' do
7
+ subject { client }
8
+ its(:key) { should eq('abc') }
9
+ its(:secret) { should eq('123') }
10
+ end
11
+
12
+ describe '#get' do
13
+ it 'should execute a GET request' do
14
+ url = 'http://localhost:3000/'
15
+ headers = { data: 'headers' }
16
+ client.stub(execute: true)
17
+
18
+ client.get(url, headers)
19
+
20
+ expect(client).to have_received(:execute).with({
21
+ method: :get,
22
+ url: url,
23
+ headers: headers
24
+ })
25
+ end
26
+ end
27
+
28
+ describe '#put' do
29
+ it 'should execute a PUT request' do
30
+ url = 'http://localhost:3000/'
31
+ payload = { data: 'payload'}
32
+ headers = { data: 'headers' }
33
+ client.stub(execute: true)
34
+
35
+ client.put(url, payload, headers)
36
+
37
+ expect(client).to have_received(:execute).with({
38
+ method: :put,
39
+ url: url,
40
+ headers: headers,
41
+ payload: payload
42
+ })
43
+ end
44
+ end
45
+
46
+ describe '#post' do
47
+ it 'should execute a POST request' do
48
+ url = 'http://localhost:3000/'
49
+ payload = { data: 'payload'}
50
+ headers = { data: 'headers' }
51
+ client.stub(execute: true)
52
+
53
+ client.post(url, payload, headers)
54
+
55
+ expect(client).to have_received(:execute).with({
56
+ method: :post,
57
+ url: url,
58
+ headers: headers,
59
+ payload: payload
60
+ })
61
+ end
62
+ end
63
+
64
+ describe '#delete' do
65
+ it 'should execute a DELETE request' do
66
+ url = 'http://localhost:3000/'
67
+ headers = { data: 'headers' }
68
+ client.stub(execute: true)
69
+
70
+ client.delete(url, headers)
71
+
72
+ expect(client).to have_received(:execute).with({
73
+ method: :delete,
74
+ url: url,
75
+ headers: headers
76
+ })
77
+ end
78
+ end
79
+
80
+ describe '#signed_request' do
81
+ context 'when it is a GET request' do
82
+ it 'should sign the request' do
83
+ args = {
84
+ method: :get,
85
+ url: 'http://localhost:3000'
86
+ }
87
+ response = client.signed_request(args)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe '#uri_path_and_query' do
93
+ context 'when the url is "http://example.com:3000/"' do
94
+ let(:url) { "http://localhost:3000/" }
95
+ subject { client.uri_path_and_query(url) }
96
+ it { should eq("/")}
97
+ end
98
+
99
+ context 'when the url is "http://example.com/something/different"' do
100
+ let(:url) { "http://example.com/something/different" }
101
+ subject { client.uri_path_and_query(url) }
102
+ it { should eq("/something/different")}
103
+ end
104
+
105
+ context 'when the url is "http://example.com:3000/?q=abc"' do
106
+ let(:url) { "http://localhost:3000/?q=abc" }
107
+ subject { client.uri_path_and_query(url) }
108
+ it { should eq("/?q=abc")}
109
+ end
110
+
111
+ context 'when the url is "http://example.com/something/different?q=abc"' do
112
+ let(:url) { "http://example.com/something/different?q=abc" }
113
+ subject { client.uri_path_and_query(url) }
114
+ it { should eq("/something/different?q=abc")}
115
+ end
116
+ end
117
+
118
+ describe '#host' do
119
+ context 'when the url is "http://example.com:3000/"' do
120
+ let(:url) { "http://localhost:3000/" }
121
+ subject { client.host(url) }
122
+ it { should eq("http://localhost:3000")}
123
+ end
124
+
125
+ context 'when the url is "https://example.com/"' do
126
+ let(:url) { "https://example.com/" }
127
+ subject { client.host(url) }
128
+ it { should eq("https://example.com")}
129
+ end
130
+
131
+ context 'when the url is "http://example.com/something/different"' do
132
+ let(:url) { "http://example.com/something/different" }
133
+ subject { client.host(url) }
134
+ it { should eq("http://example.com")}
135
+ end
136
+
137
+ context 'when the url is "http://example.com:3000/something/different"' do
138
+ let(:url) { "http://example.com:3000/something/different" }
139
+ subject { client.host(url) }
140
+ it { should eq("http://example.com:3000")}
141
+ end
142
+ end
143
+
144
+ describe '#include_port?' do
145
+ context 'when the scheme is http' do
146
+ context 'and when the port is 80' do
147
+ let(:uri) { double('URI', scheme: 'http', port: 80)}
148
+ subject { client.include_port?(uri) }
149
+ it { should be_false }
150
+ end
151
+
152
+ context 'and when the port is 443' do
153
+ let(:uri) { double('URI', scheme: 'http', port: 443)}
154
+ subject { client.include_port?(uri) }
155
+ it { should be_true }
156
+ end
157
+ end
158
+
159
+ context 'when the scheme is https' do
160
+ context 'and when the port is 80' do
161
+ let(:uri) { double('URI', scheme: 'https', port: 80)}
162
+ subject { client.include_port?(uri) }
163
+ it { should be_true }
164
+ end
165
+
166
+ context 'and when the port is 443' do
167
+ let(:uri) { double('URI', scheme: 'https', port: 443)}
168
+ subject { client.include_port?(uri) }
169
+ it { should be_false }
170
+ end
171
+ end
172
+
173
+ context 'when the scheme is something' do
174
+ context 'and when the port is 80' do
175
+ let(:uri) { double('URI', scheme: 'something', port: 80)}
176
+ subject { client.include_port?(uri) }
177
+ it { should be_true }
178
+ end
179
+ end
180
+ end
181
+
182
+ describe '#build_receipt' do
183
+ def args
184
+ {
185
+ method: :post,
186
+ headers: {},
187
+ url: 'http://example.com',
188
+ payload: { data: 'here', another: 'set' }
189
+ }
190
+ end
191
+ subject { client.build_receipt(args) }
192
+
193
+ it { should be_a(Endorser::Receipt) }
194
+ its(:host) { should eq("http://example.com") }
195
+ its(:request_method) { should eq('POST') }
196
+ its(:body) { should eq('data=here&another=set') }
197
+ its(:body_md5) { should eq('f4a4a0348d64714e94a3360af1dc614c') }
198
+ end
199
+
200
+ end
@@ -0,0 +1,172 @@
1
+ require 'spec_helper'
2
+
3
+ describe Endorser::Response do
4
+
5
+ describe '#initialize' do
6
+ let(:raw) { double('RestClient::RawResponse') }
7
+ let(:request) { double('RestClient::Request') }
8
+
9
+ subject { Endorser::Response.new(raw, request) }
10
+
11
+ its(:raw) { should eq(raw) }
12
+ its(:request) { should eq(request) }
13
+ end
14
+
15
+ describe '#headers' do
16
+ let(:raw_headers) { double('Hash') }
17
+ let(:raw) { double('RestClient::RawResponse', raw_headers: raw_headers) }
18
+ let(:response) { Endorser::Response.new(raw, nil) }
19
+
20
+ subject { response.headers }
21
+ it { should eq(raw_headers) }
22
+ end
23
+
24
+ describe '#cookies' do
25
+ let(:cookies) { double('Hash') }
26
+ let(:raw) { double('RestClient::RawResponse', cookies: cookies) }
27
+ let(:response) { Endorser::Response.new(raw, nil) }
28
+
29
+ subject { response.cookies }
30
+ it { should eq(cookies) }
31
+ end
32
+
33
+ describe '#code' do
34
+ let(:raw) { double('RestClient::RawResponse', code: 200) }
35
+ let(:response) { Endorser::Response.new(raw, nil) }
36
+
37
+ subject { response.code }
38
+ it { should eq(200) }
39
+ end
40
+
41
+
42
+ describe '#informational?' do
43
+ let(:raw) { double('RestClient::RawResponse') }
44
+ let(:response) { Endorser::Response.new(raw, nil) }
45
+
46
+ context 'when the response code is 100' do
47
+ before { response.stub(code: 100) }
48
+ subject { response.informational? }
49
+ it { should be_true }
50
+ end
51
+ context 'when the response code is 199' do
52
+ before { response.stub(code: 199) }
53
+ subject { response.informational? }
54
+ it { should be_true }
55
+ end
56
+ context 'when the response code is 99' do
57
+ before { response.stub(code: 99) }
58
+ subject { response.informational? }
59
+ it { should be_false }
60
+ end
61
+ context 'when the response code is 200' do
62
+ before { response.stub(code: 200) }
63
+ subject { response.informational? }
64
+ it { should be_false }
65
+ end
66
+ end
67
+
68
+ describe '#success?' do
69
+ let(:raw) { double('RestClient::RawResponse') }
70
+ let(:response) { Endorser::Response.new(raw, nil) }
71
+
72
+ context 'when the response code is 200' do
73
+ before { response.stub(code: 200) }
74
+ subject { response.success? }
75
+ it { should be_true }
76
+ end
77
+ context 'when the response code is 299' do
78
+ before { response.stub(code: 299) }
79
+ subject { response.success? }
80
+ it { should be_true }
81
+ end
82
+ context 'when the response code is 199' do
83
+ before { response.stub(code: 199) }
84
+ subject { response.success? }
85
+ it { should be_false }
86
+ end
87
+ context 'when the response code is 300' do
88
+ before { response.stub(code: 300) }
89
+ subject { response.success? }
90
+ it { should be_false }
91
+ end
92
+ end
93
+
94
+ describe '#redirection?' do
95
+ let(:raw) { double('RestClient::RawResponse') }
96
+ let(:response) { Endorser::Response.new(raw, nil) }
97
+
98
+ context 'when the response code is 300' do
99
+ before { response.stub(code: 300) }
100
+ subject { response.redirection? }
101
+ it { should be_true }
102
+ end
103
+ context 'when the response code is 399' do
104
+ before { response.stub(code: 399) }
105
+ subject { response.redirection? }
106
+ it { should be_true }
107
+ end
108
+ context 'when the response code is 299' do
109
+ before { response.stub(code: 299) }
110
+ subject { response.redirection? }
111
+ it { should be_false }
112
+ end
113
+ context 'when the response code is 400' do
114
+ before { response.stub(code: 400) }
115
+ subject { response.redirection? }
116
+ it { should be_false }
117
+ end
118
+ end
119
+
120
+ describe '#client_error?' do
121
+ let(:raw) { double('RestClient::RawResponse') }
122
+ let(:response) { Endorser::Response.new(raw, nil) }
123
+
124
+ context 'when the response code is 400' do
125
+ before { response.stub(code: 400) }
126
+ subject { response.client_error? }
127
+ it { should be_true }
128
+ end
129
+ context 'when the response code is 499' do
130
+ before { response.stub(code: 499) }
131
+ subject { response.client_error? }
132
+ it { should be_true }
133
+ end
134
+ context 'when the response code is 399' do
135
+ before { response.stub(code: 399) }
136
+ subject { response.client_error? }
137
+ it { should be_false }
138
+ end
139
+ context 'when the response code is 500' do
140
+ before { response.stub(code: 500) }
141
+ subject { response.client_error? }
142
+ it { should be_false }
143
+ end
144
+ end
145
+
146
+ describe '#server_error?' do
147
+ let(:raw) { double('RestClient::RawResponse') }
148
+ let(:response) { Endorser::Response.new(raw, nil) }
149
+
150
+ context 'when the response code is 500' do
151
+ before { response.stub(code: 500) }
152
+ subject { response.server_error? }
153
+ it { should be_true }
154
+ end
155
+ context 'when the response code is 599' do
156
+ before { response.stub(code: 599) }
157
+ subject { response.server_error? }
158
+ it { should be_true }
159
+ end
160
+ context 'when the response code is 499' do
161
+ before { response.stub(code: 499) }
162
+ subject { response.server_error? }
163
+ it { should be_false }
164
+ end
165
+ context 'when the response code is 600' do
166
+ before { response.stub(code: 600) }
167
+ subject { response.server_error? }
168
+ it { should be_false }
169
+ end
170
+ end
171
+
172
+ end
@@ -0,0 +1,12 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start do
4
+ add_filter '/spec'
5
+ end
6
+
7
+ require 'rspec'
8
+ require 'endorser'
9
+
10
+ RSpec.configure do |config|
11
+ config.mock_with :rspec
12
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: endorser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Johnston
8
+ - Graham Christensen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.6'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.6'
28
+ - !ruby/object:Gem::Dependency
29
+ name: endorser-receipt
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 1.0.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: 1.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '1.3'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '1.3'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 2.14.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: 2.14.0
84
+ - !ruby/object:Gem::Dependency
85
+ name: simplecov
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: A small rest client library that signs the requests
99
+ email:
100
+ - matt@zippykid.com
101
+ - graham@zippykid.com
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - .gitignore
107
+ - .rspec
108
+ - .ruby-gemset
109
+ - .ruby-version
110
+ - .travis.yml
111
+ - Gemfile
112
+ - Rakefile
113
+ - endorser.gemspec
114
+ - lib/endorser.rb
115
+ - lib/endorser/client.rb
116
+ - lib/endorser/errors/request_error.rb
117
+ - lib/endorser/response.rb
118
+ - lib/endorser/version.rb
119
+ - spec/endorser/client_spec.rb
120
+ - spec/endorser/response_spec.rb
121
+ - spec/spec_helper.rb
122
+ homepage: https://github.com/zippykid/endorser
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.0.6
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: A small rest client library that signs the requests
146
+ test_files:
147
+ - spec/endorser/client_spec.rb
148
+ - spec/endorser/response_spec.rb
149
+ - spec/spec_helper.rb