jeff 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c7dc14e469ed9bff6b7b93326df76629ee207ff
4
- data.tar.gz: a2a4c1e52d690d4bb8d21a10bfdac7d5a1b6d144
3
+ metadata.gz: 2acf8a725f47146cc30fbae49e80c7b264596681
4
+ data.tar.gz: 76ae8492c0281afdbd8b5b48c213a65abe774b22
5
5
  SHA512:
6
- metadata.gz: 22f4c89066d57d64575ce4940b444a4de9b958aaaa1227892f75cda23c0add9226cba2be7c204e00078fdc26debd44cc71b518f7a4dfee5ea4334b9459f5941d
7
- data.tar.gz: ca9944259a9f2f7a2156ba0677145031eacaa090ec851df55df69015f08a40ce714a3f88c1e33dd7f9c31b264e77e47630a0a2b6284e1fba08414042f2913da2
6
+ metadata.gz: 664387a93beb1ba57352c12fd1937952a7f6ddca07118a3ab7bc114737b69f59108c7e2603fa31a1b38cfe5573a931eb113f17c7719f25aa9d0d14cf2e325b98
7
+ data.tar.gz: 0644c4f20f9a14ef53ca6c618534569c8e88277d177c136460dbfa3352b104122d53c475c2cc9e73b4f8fe6ddb7f7b7dd5923a2da844530bf644df1a058586e5
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  Gemfile.lock
2
+ .bundle
2
3
  bin
3
4
  pkg
@@ -1,5 +1,6 @@
1
1
  rvm:
2
2
  - 1.9.3
3
3
  - 2.0.0
4
+ - 2.1.0
4
5
  - jruby-19mode
5
- - rbx-2.1.1
6
+ - rbx-2
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
  gemspec
3
- gem 'jruby-openssl', platform: :jruby
3
+
4
+ gem "jruby-openssl", platform: :jruby
5
+ gem "rubysl", platform: :rbx
data/README.md CHANGED
@@ -1,14 +1,8 @@
1
1
  # Jeff
2
2
 
3
- Jeff [signs requests][signature] to some Amazon Web Services.
3
+ Jeff is a small mixin that [signs requests][signature] to some Amazon Web Services. My gems [Vacuum][vacuum] and [Peddler][peddler] build on Jeff.
4
4
 
5
- [Vacuum][vacuum] and [Peddler][peddler] mix in Jeff.
6
-
7
- ## Usage
8
-
9
- <img src="http://f.cl.ly/items/0q0X2f0U053F1U3h131N/jeff-2.jpg">
10
- <img src="http://f.cl.ly/items/0I1U1p3E3r1z2V2x3l35/jeff-1.jpg">
11
- <img src="http://f.cl.ly/items/161x3q280o0U3d3v352H/jeff-3.jpg">
5
+ <img src="http://cl.ly/XatM/jeff.gif" style="display: inline-block; max-width: 300px; margin: 1em auto;">
12
6
 
13
7
  [signature]: http://docs.amazonwebservices.com/general/latest/gr/signature-version-2.html
14
8
  [vacuum]: https://github.com/hakanensari/vacuum
data/Rakefile CHANGED
@@ -1,10 +1,9 @@
1
- require 'bundler/gem_tasks'
2
- require 'rake/testtask'
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
3
 
4
4
  Rake::TestTask.new do |t|
5
- t.libs.push 'lib'
6
- t.test_files = FileList['test/test_*.rb']
7
- t.verbose = true
5
+ t.libs.push "lib"
6
+ t.test_files = FileList["test/test_*.rb"]
8
7
  end
9
8
 
10
- task :default => [:test]
9
+ task default: :test
@@ -1,23 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path('../lib', __FILE__)
3
- require File.expand_path('../lib/jeff/version.rb', __FILE__)
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require File.expand_path("../lib/jeff/version.rb", __FILE__)
4
4
 
5
5
  Gem::Specification.new do |gem|
6
- gem.authors = ['Hakan Ensari']
7
- gem.email = ['hakan.ensari@papercavalier.com']
6
+ gem.authors = ["Hakan Ensari"]
7
+ gem.email = ["me@hakanensari.com"]
8
8
  gem.description = %q{An Amazon Web Services client}
9
9
  gem.summary = %q{An AWS client}
10
- gem.homepage = 'https://github.com/papercavalier/jeff'
10
+ gem.homepage = "https://github.com/hakanensari/jeff"
11
11
 
12
12
  gem.files = `git ls-files`.split($\)
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = 'jeff'
15
- gem.require_paths = ['lib']
14
+ gem.name = "jeff"
15
+ gem.require_paths = ["lib"]
16
16
  gem.version = Jeff::VERSION
17
17
 
18
- gem.add_dependency 'excon', '>= 0.22.1'
19
- gem.add_development_dependency 'minitest'
20
- gem.add_development_dependency 'rake'
18
+ gem.add_dependency "excon", ">= 0.22.1"
19
+ gem.add_development_dependency "minitest"
20
+ gem.add_development_dependency "rake"
21
21
 
22
- gem.required_ruby_version = '>= 1.9'
22
+ gem.required_ruby_version = ">= 1.9"
23
23
  end
@@ -1,12 +1,12 @@
1
- # Jeff's only external dependency.
2
- require 'excon'
1
+ # Jeff"s only external dependency.
2
+ require "excon"
3
3
 
4
4
  # Standard library dependencies.
5
- require 'base64'
6
- require 'openssl'
7
- require 'time'
5
+ require "base64"
6
+ require "openssl"
7
+ require "time"
8
8
 
9
- require 'jeff/version'
9
+ require "jeff/version"
10
10
 
11
11
  # Jeff mixes in client behaviour for Amazon Web Services (AWS) that require
12
12
  # Signature version 2 authentication.
@@ -20,7 +20,7 @@ module Jeff
20
20
  end
21
21
 
22
22
  def to_s
23
- values.sort.map { |k, v| "#{k}=#{ Utils.escape(v) }" }.join('&')
23
+ values.sort.map { |k, v| "#{k}=#{ Utils.escape(v) }" }.join("&")
24
24
  end
25
25
  end
26
26
 
@@ -70,26 +70,21 @@ module Jeff
70
70
  end
71
71
 
72
72
  def secret
73
- @secret or raise ArgumentError.new('Missing secret')
73
+ @secret or raise ArgumentError.new("Missing secret")
74
74
  end
75
75
  end
76
76
 
77
- # Because Ruby's CGI escapes tilde, use a custom escape.
77
+ # Because Ruby"s CGI escapes tilde, use a custom escape.
78
78
  module Utils
79
79
  UNRESERVED = /([^\w.~-]+)/
80
80
 
81
81
  def self.escape(val)
82
82
  val.to_s.gsub(UNRESERVED) do
83
- '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
83
+ "%" + $1.unpack("H2" * $1.bytesize).join("%").upcase
84
84
  end
85
85
  end
86
86
  end
87
87
 
88
- # Amazon recommends to include a User-Agent header with every request to
89
- # identify the application, its version number, programming language, and
90
- # host.
91
- USER_AGENT = "Jeff/#{VERSION} (Language=Ruby; #{`hostname`.chomp})"
92
-
93
88
  def self.included(base)
94
89
  base.extend(ClassMethods)
95
90
 
@@ -98,17 +93,17 @@ module Jeff
98
93
  # Add other common parameters using `Jeff.params` if required in your
99
94
  # implementation.
100
95
  base.params(
101
- 'AWSAccessKeyId' => -> { aws_access_key_id },
102
- 'SignatureVersion' => '2',
103
- 'SignatureMethod' => 'HmacSHA256',
104
- 'Timestamp' => -> { Time.now.utc.iso8601 }
96
+ "AWSAccessKeyId" => -> { aws_access_key_id },
97
+ "SignatureVersion" => "2",
98
+ "SignatureMethod" => "HmacSHA256",
99
+ "Timestamp" => -> { Time.now.utc.iso8601 }
105
100
  )
106
101
  end
107
102
 
108
103
  # A reusable HTTP connection.
109
104
  def connection
110
105
  @connection ||= Excon.new(aws_endpoint,
111
- headers: { 'User-Agent' => USER_AGENT },
106
+ headers: { "User-Agent" => self.class.user_agent },
112
107
  expects: 200,
113
108
  omit_default_port: true
114
109
  )
@@ -119,11 +114,11 @@ module Jeff
119
114
  attr_writer :aws_access_key_id, :aws_secret_access_key
120
115
 
121
116
  def aws_access_key_id
122
- @aws_access_key_id || ENV['AWS_ACCESS_KEY_ID']
117
+ @aws_access_key_id || ENV["AWS_ACCESS_KEY_ID"]
123
118
  end
124
119
 
125
120
  def aws_secret_access_key
126
- @aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY']
121
+ @aws_secret_access_key || ENV["AWS_SECRET_ACCESS_KEY"]
127
122
  end
128
123
 
129
124
  # Generate HTTP request verb methods.
@@ -142,7 +137,7 @@ module Jeff
142
137
  # Add Content-MD5 header if uploading a file.
143
138
  if options.has_key?(:body)
144
139
  md5 = Content.new(options[:body]).md5
145
- (options[:headers] ||= {}).store('Content-MD5', md5)
140
+ (options[:headers] ||= {}).store("Content-MD5", md5)
146
141
  end
147
142
 
148
143
  # Build query string.
@@ -169,5 +164,23 @@ module Jeff
169
164
  def params(hsh = {})
170
165
  (@params ||= {}).update(hsh)
171
166
  end
167
+
168
+ def user_agent
169
+ @user_agent ||= default_user_agent
170
+
171
+ end
172
+
173
+ def user_agent=(user_agent)
174
+ @user_agent = user_agent
175
+ end
176
+
177
+ private
178
+
179
+ # Amazon recommends to include a User-Agent header with every request to
180
+ # identify the application, its version number, programming language, and
181
+ # host.
182
+ def default_user_agent
183
+ "Jeff/#{VERSION} (Language=Ruby; #{`hostname`.chomp})"
184
+ end
172
185
  end
173
186
  end
@@ -1,3 +1,3 @@
1
1
  module Jeff
2
- VERSION = '1.0.1'
2
+ VERSION = "1.1.0"
3
3
  end
@@ -1,8 +1,6 @@
1
- require 'minitest/autorun'
2
- require 'minitest/pride'
3
- require 'jeff'
4
-
5
- Excon.defaults[:mock] = true
1
+ require "minitest/autorun"
2
+ require "minitest/pride"
3
+ require_relative "../lib/jeff"
6
4
 
7
5
  class TestJeff < Minitest::Test
8
6
  def setup
@@ -10,7 +8,7 @@ class TestJeff < Minitest::Test
10
8
  end
11
9
 
12
10
  def test_delegates_unset_aws_credential_to_env_vars
13
- key = '123456'
11
+ key = "123456"
14
12
  client = @klass.new
15
13
  %w(aws_access_key_id aws_secret_access_key).each do |attr|
16
14
  ENV[attr.upcase] = key
@@ -28,48 +26,68 @@ class TestJeff < Minitest::Test
28
26
 
29
27
  def test_configures_request_query_parameters
30
28
  @klass.instance_eval do
31
- params 'Foo' => 'bar'
29
+ params "Foo" => "bar"
32
30
  end
33
- assert @klass.params.has_key?('Foo')
31
+ assert @klass.params.has_key?("Foo")
34
32
  end
35
33
 
36
34
  def test_requires_signature
37
35
  signature = Jeff::Signature.new(nil)
38
- assert_raises(ArgumentError) { signature.sign('foo') }
36
+ assert_raises(ArgumentError) { signature.sign("foo") }
39
37
  end
40
38
 
41
39
  def test_sorts_request_query_parameters_lexicographically
42
- query = Jeff::Query.new('A10' => 1, 'A1' => 1)
43
- assert_equal 'A1=1&A10=1', query.to_s
40
+ query = Jeff::Query.new("A10" => 1, "A1" => 1)
41
+ assert_equal "A1=1&A10=1", query.to_s
44
42
  end
45
43
 
46
44
  def test_sets_user_agent_header
47
45
  client = @klass.new
48
- client.aws_endpoint = 'http://example.com/'
49
- refute_nil client.connection.data[:headers]['User-Agent']
46
+ client.aws_endpoint = "http://example.com/"
47
+ assert_includes client.connection.data[:headers]["User-Agent"], "Jeff"
48
+ end
49
+
50
+ def test_allows_customizing_user_agent
51
+ @klass.user_agent = "CustomApp/1.0"
52
+ client = @klass.new
53
+ client.aws_endpoint = "http://example.com/"
54
+ assert_equal "CustomApp/1.0", client.connection.data[:headers]["User-Agent"]
55
+ end
56
+
57
+ def test_does_not_escape_tilde
58
+ assert_equal "~%2C", Jeff::Utils.escape("~,")
50
59
  end
51
60
 
52
61
  Excon::HTTP_VERBS.each do |method|
53
62
  define_method "test_makes_#{method}_request" do
54
63
  Excon.stub({ }, { status: 200 })
55
64
  client = @klass.new
56
- client.aws_endpoint = 'http://example.com/'
57
- client.aws_access_key_id = 'foo'
58
- client.aws_secret_access_key = 'bar'
59
- assert_equal 200, client.send(method).status
65
+ client.aws_endpoint = "http://example.com/"
66
+ client.aws_access_key_id = "foo"
67
+ client.aws_secret_access_key = "bar"
68
+ assert_equal 200, client.send(method, mock: true).status
60
69
  Excon.stubs.clear
61
70
  end
62
71
  end
63
72
 
64
- def test_adds_contet_md5_request_header_if_given_a_request_body
73
+ def test_adds_content_md5_request_header_if_given_a_request_body
65
74
  Excon.stub({ }) do |params|
66
- { body: params[:headers]['Content-MD5'] }
75
+ { body: params[:headers]["Content-MD5"] }
67
76
  end
68
77
  client = @klass.new
69
- client.aws_endpoint = 'http://example.com/'
70
- client.aws_access_key_id = 'foo'
71
- client.aws_secret_access_key = 'bar'
72
- refute_empty client.post(body: 'foo').body
78
+ client.aws_endpoint = "http://example.com/"
79
+ client.aws_access_key_id = "foo"
80
+ client.aws_secret_access_key = "bar"
81
+ refute_empty client.post(body: "foo", mock: true).body
73
82
  Excon.stubs.clear
74
83
  end
84
+
85
+ def test_integration
86
+ client = @klass.new
87
+ client.aws_access_key_id = "foo"
88
+ client.aws_secret_access_key = "bar"
89
+ client.aws_endpoint = "https://mws.amazonservices.com/Sellers/2011-07-01"
90
+ res = client.post(query: { "Action" => "GetServiceStatus"})
91
+ assert_equal 200, res.status
92
+ end
75
93
  end
metadata CHANGED
@@ -1,66 +1,66 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeff
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
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-12-18 00:00:00.000000000 Z
11
+ date: 2014-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.22.1
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
26
  version: 0.22.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
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
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: An Amazon Web Services client
56
56
  email:
57
- - hakan.ensari@papercavalier.com
57
+ - me@hakanensari.com
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
63
- - .travis.yml
62
+ - ".gitignore"
63
+ - ".travis.yml"
64
64
  - CHANGELOG.md
65
65
  - Gemfile
66
66
  - LICENSE
@@ -70,7 +70,7 @@ files:
70
70
  - lib/jeff.rb
71
71
  - lib/jeff/version.rb
72
72
  - test/test_jeff.rb
73
- homepage: https://github.com/papercavalier/jeff
73
+ homepage: https://github.com/hakanensari/jeff
74
74
  licenses: []
75
75
  metadata: {}
76
76
  post_install_message:
@@ -79,20 +79,19 @@ require_paths:
79
79
  - lib
80
80
  required_ruby_version: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - '>='
82
+ - - ">="
83
83
  - !ruby/object:Gem::Version
84
84
  version: '1.9'
85
85
  required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  requirements: []
91
91
  rubyforge_project:
92
- rubygems_version: 2.1.11
92
+ rubygems_version: 2.2.2
93
93
  signing_key:
94
94
  specification_version: 4
95
95
  summary: An AWS client
96
96
  test_files:
97
97
  - test/test_jeff.rb
98
- has_rdoc: