jeff 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +8 -4
- data/jeff.gemspec +1 -1
- data/lib/jeff.rb +53 -19
- data/lib/jeff/version.rb +1 -1
- data/spec/jeff_spec.rb +7 -7
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 531fd2a3ff845560616632dda4f42b79afafdd38
|
4
|
+
data.tar.gz: 058f220f25b627ee5d9343f396686922b2dc99f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cecaa486900adfbd6505e38ebb2b39a05846033be3fd12231997a7241948e145531278ecce7a63a5cb13480f2ace09c614afc8f07a1ab9dd4c5cf4e1a568ef5d
|
7
|
+
data.tar.gz: 5c46914754a2cd3f3efb4aeeb4da4941c744226bc443686bcf1c5f9162a798288130fdd1d5c67c684ae419ee984b04e66b840fce7e969d1ec176e6a73443f54a
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -13,17 +13,21 @@ A minimal example:
|
|
13
13
|
Request = Struct.new(:aws_access_key_id, :aws_secret_access_key) do
|
14
14
|
include Jeff
|
15
15
|
|
16
|
-
def aws_endpoint
|
16
|
+
def aws_endpoint
|
17
|
+
'https://mws.amazonservices.com/Products/2011-10-01'
|
18
|
+
end
|
17
19
|
end
|
18
20
|
|
19
|
-
req = Request.new('
|
21
|
+
req = Request.new('key', 'secret')
|
20
22
|
res = req.get(query: { 'Action' => 'GetServiceStatus' })
|
21
23
|
|
22
24
|
puts res.body.match(/Status>([^<]+)/)[1]
|
25
|
+
# => "GREEN"
|
23
26
|
```
|
24
27
|
|
25
|
-
[Vacuum][vac]
|
28
|
+
[Vacuum][vac] and [Peddler][ped] implement Jeff.
|
26
29
|
|
27
30
|
[sig]: http://docs.amazonwebservices.com/general/latest/gr/signature-version-2.html
|
28
|
-
[vac]: https://github.com/hakanensari/vacuum
|
29
31
|
[jef]: http://f.cl.ly/items/0a3R3J0k1R2f423k1q2l/jeff.jpg
|
32
|
+
[vac]: https://github.com/hakanensari/vacuum
|
33
|
+
[ped]: https://github.com/papercavalier/peddler
|
data/jeff.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ['lib']
|
16
16
|
gem.version = Jeff::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency 'excon', '~> 0.
|
18
|
+
gem.add_dependency 'excon', '~> 0.26.0'
|
19
19
|
gem.add_development_dependency 'minitest'
|
20
20
|
gem.add_development_dependency 'rake'
|
21
21
|
|
data/lib/jeff.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
#
|
2
|
-
# Ruby.
|
1
|
+
# The only external dependency.
|
3
2
|
require 'excon'
|
4
3
|
|
5
4
|
# Standard library dependencies.
|
@@ -15,22 +14,43 @@ require 'jeff/version'
|
|
15
14
|
# It's Jeff, as in Jeff Bezos.
|
16
15
|
module Jeff
|
17
16
|
# Converts a query value to a sorted query string.
|
18
|
-
Query
|
17
|
+
class Query
|
18
|
+
attr :values
|
19
|
+
|
20
|
+
def initialize(values)
|
21
|
+
@values = values
|
22
|
+
end
|
23
|
+
|
19
24
|
def to_s
|
20
25
|
values.sort.map { |k, v| "#{k}=#{ Utils.escape(v) }" }.join('&')
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
24
29
|
# Calculates an MD5sum for file being uploaded.
|
25
|
-
Content
|
30
|
+
class Content
|
31
|
+
attr :body
|
32
|
+
|
33
|
+
def initialize(body)
|
34
|
+
@body = body
|
35
|
+
end
|
36
|
+
|
26
37
|
def md5
|
27
38
|
Base64.encode64(OpenSSL::Digest::MD5.digest(body)).strip
|
28
39
|
end
|
29
40
|
end
|
30
41
|
|
31
42
|
# Signs an AWS request.
|
32
|
-
Request
|
33
|
-
|
43
|
+
class Request
|
44
|
+
attr :method, :host, :path, :query_string
|
45
|
+
|
46
|
+
def initialize(method, host, path, query_string)
|
47
|
+
@method = method
|
48
|
+
@host = host
|
49
|
+
@path = path
|
50
|
+
@query_string = query_string
|
51
|
+
end
|
52
|
+
|
53
|
+
def sign_with(aws_secret_access_key)
|
34
54
|
Signature.new(aws_secret_access_key).sign(string_to_sign)
|
35
55
|
end
|
36
56
|
|
@@ -52,7 +72,7 @@ module Jeff
|
|
52
72
|
end
|
53
73
|
|
54
74
|
def secret
|
55
|
-
@secret or raise ArgumentError
|
75
|
+
@secret or raise ArgumentError.new('Missing secret')
|
56
76
|
end
|
57
77
|
end
|
58
78
|
|
@@ -89,10 +109,9 @@ module Jeff
|
|
89
109
|
)
|
90
110
|
end
|
91
111
|
|
92
|
-
#
|
93
|
-
# is more performant!
|
112
|
+
# A reusable HTTP connection.
|
94
113
|
def connection
|
95
|
-
@connection ||= Excon.new(
|
114
|
+
@connection ||= Excon.new(aws_endpoint,
|
96
115
|
headers: { 'User-Agent' => USER_AGENT },
|
97
116
|
expects: 200,
|
98
117
|
omit_default_port: true
|
@@ -102,13 +121,28 @@ module Jeff
|
|
102
121
|
# Accessors for required AWS attributes.
|
103
122
|
attr_accessor :aws_endpoint, :aws_access_key_id, :aws_secret_access_key
|
104
123
|
|
105
|
-
#
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
124
|
+
# Keep these deprecated attribute accessors around for a while.
|
125
|
+
# TODO Remove when cutting v1.0.
|
126
|
+
%w(
|
127
|
+
endpoint aws_endpoint
|
128
|
+
endpoint= aws_endpoint=
|
129
|
+
key aws_access_key_id
|
130
|
+
key= aws_access_key_id=
|
131
|
+
secret aws_secret_access_key
|
132
|
+
secret= aws_secret_access_key=
|
133
|
+
).each_slice(2) do |old, new|
|
134
|
+
if old.end_with?('=')
|
135
|
+
define_method(old) do |value|
|
136
|
+
warn "[DEPRECATION] Use #{new}"
|
137
|
+
self.send(new, value)
|
138
|
+
end
|
139
|
+
else
|
140
|
+
define_method(old) do
|
141
|
+
warn "[DEPRECATION] Use #{new}"
|
142
|
+
self.send(new)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
112
146
|
|
113
147
|
# Generate HTTP request verb methods.
|
114
148
|
Excon::HTTP_VERBS.each do |method|
|
@@ -145,10 +179,10 @@ module Jeff
|
|
145
179
|
options[:path] || connection.data[:path],
|
146
180
|
query_string
|
147
181
|
)
|
148
|
-
.
|
182
|
+
.sign_with(aws_secret_access_key)
|
149
183
|
|
150
184
|
# Return options after appending an escaped signature to query.
|
151
|
-
options.
|
185
|
+
options.merge(query: "#{query_string}&Signature=#{Utils.escape(signature)}")
|
152
186
|
end
|
153
187
|
|
154
188
|
module ClassMethods
|
data/lib/jeff/version.rb
CHANGED
data/spec/jeff_spec.rb
CHANGED
@@ -35,7 +35,7 @@ describe Jeff do
|
|
35
35
|
|
36
36
|
it 'sets a User-Agent header for the client connection' do
|
37
37
|
client = @klass.new
|
38
|
-
client.
|
38
|
+
client.aws_endpoint = 'http://example.com/'
|
39
39
|
client.connection.data[:headers]['User-Agent'].wont_be_nil
|
40
40
|
end
|
41
41
|
|
@@ -43,9 +43,9 @@ describe Jeff do
|
|
43
43
|
it "makes a #{method.upcase} request" do
|
44
44
|
Excon.stub({ }, { status: 200 })
|
45
45
|
client = @klass.new
|
46
|
-
client.
|
47
|
-
client.
|
48
|
-
client.
|
46
|
+
client.aws_endpoint = 'http://example.com/'
|
47
|
+
client.aws_access_key_id = 'foo'
|
48
|
+
client.aws_secret_access_key = 'bar'
|
49
49
|
client.send(method).status.must_equal 200
|
50
50
|
Excon.stubs.clear
|
51
51
|
end
|
@@ -56,9 +56,9 @@ describe Jeff do
|
|
56
56
|
{ body: params[:headers]['Content-MD5'] }
|
57
57
|
end
|
58
58
|
client = @klass.new
|
59
|
-
client.
|
60
|
-
client.
|
61
|
-
client.
|
59
|
+
client.aws_endpoint = 'http://example.com/'
|
60
|
+
client.aws_access_key_id = 'foo'
|
61
|
+
client.aws_secret_access_key = 'bar'
|
62
62
|
client.post(body: 'foo').body.wont_be_empty
|
63
63
|
Excon.stubs.clear
|
64
64
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jeff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hakan Ensari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.26.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.26.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|