jeff 0.7.1 → 0.7.2
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 +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
|