endorser 1.3.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 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