aws-s3 0.4.0 → 0.5.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.
- data/COPYING +2 -2
- data/README +2 -2
- data/Rakefile +18 -12
- data/lib/aws/s3/authentication.rb +8 -5
- data/lib/aws/s3/base.rb +5 -1
- data/lib/aws/s3/bucket.rb +3 -4
- data/lib/aws/s3/connection.rb +18 -9
- data/lib/aws/s3/extensions.rb +5 -4
- data/lib/aws/s3/logging.rb +8 -3
- data/lib/aws/s3/object.rb +11 -9
- data/lib/aws/s3/version.rb +1 -1
- data/test/authentication_test.rb +19 -1
- data/test/base_test.rb +41 -48
- data/test/bucket_test.rb +44 -18
- data/test/connection_test.rb +42 -16
- data/test/error_test.rb +13 -18
- data/test/fixtures/buckets.yml +31 -0
- data/test/mocks/fake_response.rb +26 -0
- data/test/object_test.rb +69 -81
- data/test/remote/object_test.rb +2 -2
- data/test/response_test.rb +3 -5
- data/test/service_test.rb +11 -14
- data/test/test_helper.rb +23 -2
- metadata +87 -80
- data/test/mocks/base.rb +0 -89
data/COPYING
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c) 2006 Marcel Molina Jr. <marcel@vernix.org>
|
2
|
+
# Copyright (c) 2006-2008 Marcel Molina Jr. <marcel@vernix.org>
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
5
|
# this software and associated documentation files (the "Software"), to deal in the
|
@@ -16,4 +16,4 @@
|
|
16
16
|
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
17
|
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
18
18
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
19
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
19
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
CHANGED
@@ -128,7 +128,7 @@ You can store an object on S3 by specifying a key, its data and the name of the
|
|
128
128
|
S3Object.store('me.jpg', open('headshot.jpg'), 'photos')
|
129
129
|
|
130
130
|
The content type of the object will be inferred by its extension. If the appropriate content type can not be inferred, S3 defaults
|
131
|
-
to <tt>binary/
|
131
|
+
to <tt>binary/octet-stream</tt>.
|
132
132
|
|
133
133
|
If you want to override this, you can explicitly indicate what content type the object should have with the <tt>:content_type</tt> option:
|
134
134
|
|
@@ -202,7 +202,7 @@ A bevie of information about an object can be had using the <tt>about</tt> metho
|
|
202
202
|
|
203
203
|
pp song.about
|
204
204
|
{"last-modified" => "Sat, 28 Oct 2006 21:29:26 GMT",
|
205
|
-
"content-type" => "binary/
|
205
|
+
"content-type" => "binary/octet-stream",
|
206
206
|
"etag" => "\"dc629038ffc674bee6f62eb64ff3a\"",
|
207
207
|
"date" => "Sat, 28 Oct 2006 21:30:41 GMT",
|
208
208
|
"x-amz-request-id" => "B7BC68F55495B1C8",
|
data/Rakefile
CHANGED
@@ -111,22 +111,23 @@ namespace :dist do
|
|
111
111
|
|
112
112
|
desc 'Tag release'
|
113
113
|
task :tag do
|
114
|
-
|
115
|
-
sh
|
114
|
+
sh %(git tag -a '#{spec.version}-release' -m 'Tagging #{spec.version} release')
|
115
|
+
sh 'git push --tags'
|
116
116
|
end
|
117
117
|
|
118
118
|
desc 'Update changelog to include a release marker'
|
119
119
|
task :add_release_marker_to_changelog do
|
120
120
|
changelog = IO.read('CHANGELOG')
|
121
|
-
changelog.sub!(/^
|
121
|
+
changelog.sub!(/^head:/, "#{spec.version}:")
|
122
122
|
|
123
123
|
open('CHANGELOG', 'w') do |file|
|
124
|
-
file.write "
|
124
|
+
file.write "head:\n\n#{changelog}"
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
128
|
task :commit_changelog do
|
129
|
-
sh %(
|
129
|
+
sh %(git commit CHANGELOG -m "Bump changelog version marker for release")
|
130
|
+
sh 'git push'
|
130
131
|
end
|
131
132
|
|
132
133
|
package_name = lambda {|specification| File.join('pkg', "#{specification.name}-#{specification.version}")}
|
@@ -136,20 +137,25 @@ namespace :dist do
|
|
136
137
|
require 'rubyforge'
|
137
138
|
package = package_name[spec]
|
138
139
|
|
139
|
-
rubyforge = RubyForge.new
|
140
|
+
rubyforge = RubyForge.new.configure
|
140
141
|
rubyforge.login
|
141
|
-
|
142
|
+
|
143
|
+
user_config = rubyforge.userconfig
|
144
|
+
user_config['release_changes'] = YAML.load_file('CHANGELOG')[spec.version.to_s].join("\n")
|
145
|
+
|
142
146
|
version_already_released = lambda do
|
143
|
-
releases = rubyforge.
|
144
|
-
releases.has_key?(spec.name) && releases[spec.name][spec.version]
|
147
|
+
releases = rubyforge.autoconfig['release_ids']
|
148
|
+
releases.has_key?(spec.name) && releases[spec.name][spec.version.to_s]
|
145
149
|
end
|
146
150
|
|
147
151
|
abort("Release #{spec.version} already exists!") if version_already_released.call
|
148
152
|
|
149
|
-
|
150
|
-
rubyforge.
|
151
|
-
|
153
|
+
begin
|
154
|
+
rubyforge.add_release(spec.rubyforge_project, spec.name, spec.version, "#{package}.tar.gz", "#{package}.gem")
|
155
|
+
puts "Version #{spec.version} released!"
|
156
|
+
rescue Exception => exception
|
152
157
|
puts 'Release failed!'
|
158
|
+
raise
|
153
159
|
end
|
154
160
|
end
|
155
161
|
|
@@ -50,7 +50,7 @@ module AWS
|
|
50
50
|
# parameterize these computations and arrange them in a string form appropriate to how they are used, in one case a http request
|
51
51
|
# header value, and in the other case key/value query string parameter pairs.
|
52
52
|
class Signature < String #:nodoc:
|
53
|
-
attr_reader :request, :access_key_id, :secret_access_key
|
53
|
+
attr_reader :request, :access_key_id, :secret_access_key, :options
|
54
54
|
|
55
55
|
def initialize(request, access_key_id, secret_access_key, options = {})
|
56
56
|
super()
|
@@ -99,10 +99,9 @@ module AWS
|
|
99
99
|
# More details about the various authentication schemes can be found in the docs for its containing module, Authentication.
|
100
100
|
class QueryString < Signature #:nodoc:
|
101
101
|
constant :DEFAULT_EXPIRY, 300 # 5 minutes
|
102
|
-
|
103
102
|
def initialize(*args)
|
104
103
|
super
|
105
|
-
|
104
|
+
options[:url_encode] = true
|
106
105
|
self << build
|
107
106
|
end
|
108
107
|
|
@@ -115,8 +114,12 @@ module AWS
|
|
115
114
|
# the +:expires_in+ option
|
116
115
|
# 3) The current time in seconds since the epoch plus the default number of seconds (60 seconds)
|
117
116
|
def expires
|
118
|
-
return
|
119
|
-
date.to_i +
|
117
|
+
return options[:expires] if options[:expires]
|
118
|
+
date.to_i + expires_in
|
119
|
+
end
|
120
|
+
|
121
|
+
def expires_in
|
122
|
+
options.has_key?(:expires_in) ? Integer(options[:expires_in]) : DEFAULT_EXPIRY
|
120
123
|
end
|
121
124
|
|
122
125
|
# Keep in alphabetical order
|
data/lib/aws/s3/base.rb
CHANGED
@@ -225,7 +225,11 @@ module AWS #:nodoc:
|
|
225
225
|
end
|
226
226
|
|
227
227
|
def method_missing(method, *args, &block)
|
228
|
-
|
228
|
+
case
|
229
|
+
when attributes.has_key?(method.to_s): attributes[method.to_s]
|
230
|
+
when attributes.has_key?(method): attributes[method]
|
231
|
+
else super
|
232
|
+
end
|
229
233
|
end
|
230
234
|
end
|
231
235
|
end
|
data/lib/aws/s3/bucket.rb
CHANGED
@@ -157,11 +157,10 @@ module AWS
|
|
157
157
|
#
|
158
158
|
# Only the owner of a bucket can delete a bucket, regardless of the bucket's access control policy.
|
159
159
|
def delete(name = nil, options = {})
|
160
|
-
name = path(name)
|
161
160
|
find(name).delete_all if options[:force]
|
162
|
-
|
163
|
-
|
164
|
-
|
161
|
+
|
162
|
+
name = path(name)
|
163
|
+
Base.delete(name).success?
|
165
164
|
end
|
166
165
|
|
167
166
|
# List all your buckets. This is a convenient wrapper around AWS::S3::Service.buckets.
|
data/lib/aws/s3/connection.rb
CHANGED
@@ -27,18 +27,20 @@ module AWS
|
|
27
27
|
body.rewind if body.respond_to?(:rewind) unless attempts.zero?
|
28
28
|
|
29
29
|
requester = Proc.new do
|
30
|
-
path = self.class.prepare_path(path)
|
30
|
+
path = self.class.prepare_path(path) if attempts.zero? # Only escape the path once
|
31
31
|
request = request_method(verb).new(path, headers)
|
32
32
|
ensure_content_type!(request)
|
33
33
|
add_user_agent!(request)
|
34
34
|
authenticate!(request)
|
35
35
|
if body
|
36
36
|
if body.respond_to?(:read)
|
37
|
-
request.body_stream
|
38
|
-
request.content_length = body.respond_to?(:lstat) ? body.lstat.size : body.size
|
37
|
+
request.body_stream = body
|
39
38
|
else
|
40
39
|
request.body = body
|
41
|
-
end
|
40
|
+
end
|
41
|
+
request.content_length = body.respond_to?(:lstat) ? body.stat.size : body.size
|
42
|
+
else
|
43
|
+
request.content_length = 0
|
42
44
|
end
|
43
45
|
http.request(request, &block)
|
44
46
|
end
|
@@ -49,7 +51,7 @@ module AWS
|
|
49
51
|
else
|
50
52
|
http.start(&requester)
|
51
53
|
end
|
52
|
-
rescue Errno::EPIPE, Timeout::Error, Errno::
|
54
|
+
rescue Errno::EPIPE, Timeout::Error, Errno::EINVAL, EOFError
|
53
55
|
@http = create_connection
|
54
56
|
attempts == 3 ? raise : (attempts += 1; retry)
|
55
57
|
end
|
@@ -75,7 +77,14 @@ module AWS
|
|
75
77
|
end
|
76
78
|
|
77
79
|
def protocol(options = {})
|
78
|
-
|
80
|
+
# This always trumps http.use_ssl?
|
81
|
+
if options[:use_ssl] == false
|
82
|
+
'http://'
|
83
|
+
elsif options[:use_ssl] || http.use_ssl?
|
84
|
+
'https://'
|
85
|
+
else
|
86
|
+
'http://'
|
87
|
+
end
|
79
88
|
end
|
80
89
|
|
81
90
|
private
|
@@ -178,7 +187,7 @@ module AWS
|
|
178
187
|
# will be implicitly set to 443, unless specified otherwise. Defaults to false.
|
179
188
|
# * <tt>:persistent</tt> - Whether to use a persistent connection to the server. Having this on provides around a two fold
|
180
189
|
# performance increase but for long running processes some firewalls may find the long lived connection suspicious and close the connection.
|
181
|
-
# If you run into connection errors, try setting <tt>:persistent</tt> to false. Defaults to
|
190
|
+
# If you run into connection errors, try setting <tt>:persistent</tt> to false. Defaults to false.
|
182
191
|
# * <tt>:proxy</tt> - If you need to connect through a proxy, you can specify your proxy settings by specifying a <tt>:host</tt>, <tt>:port</tt>, <tt>:user</tt>, and <tt>:password</tt>
|
183
192
|
# with the <tt>:proxy</tt> option.
|
184
193
|
# The <tt>:host</tt> setting is required if specifying a <tt>:proxy</tt>.
|
@@ -278,7 +287,7 @@ module AWS
|
|
278
287
|
end
|
279
288
|
|
280
289
|
def extract_persistent!
|
281
|
-
self[:persistent] = options.has_key?(:persitent) ? options[:persitent] :
|
290
|
+
self[:persistent] = options.has_key?(:persitent) ? options[:persitent] : false
|
282
291
|
end
|
283
292
|
|
284
293
|
def extract_proxy_settings!
|
@@ -311,4 +320,4 @@ module AWS
|
|
311
320
|
end
|
312
321
|
end
|
313
322
|
end
|
314
|
-
end
|
323
|
+
end
|
data/lib/aws/s3/extensions.rb
CHANGED
@@ -42,9 +42,10 @@ class String
|
|
42
42
|
# ActiveSupport adds an underscore method to String so let's just use that one if
|
43
43
|
# we find that the method is already defined
|
44
44
|
def underscore
|
45
|
-
gsub(/
|
46
|
-
|
47
|
-
|
45
|
+
gsub(/::/, '/').
|
46
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
47
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
48
|
+
tr("-", "_").downcase
|
48
49
|
end unless public_method_defined? :underscore
|
49
50
|
|
50
51
|
def utf8?
|
@@ -102,7 +103,7 @@ end
|
|
102
103
|
module Kernel
|
103
104
|
def __method__(depth = 0)
|
104
105
|
caller[depth][/`([^']+)'/, 1]
|
105
|
-
end if RUBY_VERSION < '1.
|
106
|
+
end if RUBY_VERSION < '1.8.7'
|
106
107
|
|
107
108
|
def memoize(reload = false, storage = nil)
|
108
109
|
storage = "@#{storage || __method__(1)}"
|
data/lib/aws/s3/logging.rb
CHANGED
@@ -102,8 +102,12 @@ module AWS
|
|
102
102
|
end
|
103
103
|
memoized :lines
|
104
104
|
|
105
|
+
def path
|
106
|
+
log.path
|
107
|
+
end
|
108
|
+
|
105
109
|
def inspect #:nodoc:
|
106
|
-
"#<%s:0x%s '%s'>" % [self.class.name, object_id,
|
110
|
+
"#<%s:0x%s '%s'>" % [self.class.name, object_id, path]
|
107
111
|
end
|
108
112
|
|
109
113
|
private
|
@@ -154,9 +158,10 @@ module AWS
|
|
154
158
|
|
155
159
|
# Time.parse doesn't like %d/%B/%Y:%H:%M:%S %z so we have to transform it unfortunately
|
156
160
|
def typecast_time(datetime) #:nodoc:
|
157
|
-
month
|
161
|
+
month = datetime[/[a-z]+/i]
|
162
|
+
month_names = [nil, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
158
163
|
datetime.sub!(%r|^(\w{2})/(\w{3})|, '\2/\1')
|
159
|
-
datetime.sub!(month,
|
164
|
+
datetime.sub!(month, month_names.index(month).to_s)
|
160
165
|
datetime.sub!(':', ' ')
|
161
166
|
Time.parse(datetime)
|
162
167
|
end
|
data/lib/aws/s3/object.rb
CHANGED
@@ -8,7 +8,7 @@ module AWS
|
|
8
8
|
# S3Object.store('me.jpg', open('headshot.jpg'), 'photos')
|
9
9
|
#
|
10
10
|
# The content type of the object will be inferred by its extension. If the appropriate content type can not be inferred, S3 defaults
|
11
|
-
# to <tt>binary/
|
11
|
+
# to <tt>binary/octet-stream</tt>.
|
12
12
|
#
|
13
13
|
# If you want to override this, you can explicitly indicate what content type the object should have with the <tt>:content_type</tt> option:
|
14
14
|
#
|
@@ -82,7 +82,7 @@ module AWS
|
|
82
82
|
#
|
83
83
|
# pp song.about
|
84
84
|
# {"last-modified" => "Sat, 28 Oct 2006 21:29:26 GMT",
|
85
|
-
# "content-type" => "binary/
|
85
|
+
# "content-type" => "binary/octet-stream",
|
86
86
|
# "etag" => "\"dc629038ffc674bee6f62eb64ff3a\"",
|
87
87
|
# "date" => "Sat, 28 Oct 2006 21:30:41 GMT",
|
88
88
|
# "x-amz-request-id" => "B7BC68F55495B1C8",
|
@@ -178,13 +178,15 @@ module AWS
|
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
181
|
-
# Makes a copy of the object with <tt>key</tt> to <tt>
|
181
|
+
# Makes a copy of the object with <tt>key</tt> to <tt>copy_key</tt>, preserving the ACL of the existing object if the <tt>:copy_acl</tt> option is true (default false).
|
182
182
|
def copy(key, copy_key, bucket = nil, options = {})
|
183
183
|
bucket = bucket_name(bucket)
|
184
|
-
|
185
|
-
default_options = {
|
186
|
-
|
187
|
-
|
184
|
+
source_key = path!(bucket, key)
|
185
|
+
default_options = {'x-amz-copy-source' => source_key}
|
186
|
+
target_key = path!(bucket, copy_key)
|
187
|
+
returning put(target_key, default_options) do
|
188
|
+
acl(copy_key, bucket, acl(key, bucket)) if options[:copy_acl]
|
189
|
+
end
|
188
190
|
end
|
189
191
|
|
190
192
|
# Rename the object with key <tt>from</tt> to have key in <tt>to</tt>.
|
@@ -494,7 +496,7 @@ module AWS
|
|
494
496
|
# pp some_object.about
|
495
497
|
# {"last-modified" => "Sat, 28 Oct 2006 21:29:26 GMT",
|
496
498
|
# "x-amz-id-2" => "LdcQRk5qLwxJQiZ8OH50HhoyKuqyWoJ67B6i+rOE5MxpjJTWh1kCkL+I0NQzbVQn",
|
497
|
-
# "content-type" => "binary/
|
499
|
+
# "content-type" => "binary/octet-stream",
|
498
500
|
# "etag" => "\"dc629038ffc674bee6f62eb68454ff3a\"",
|
499
501
|
# "date" => "Sat, 28 Oct 2006 21:30:41 GMT",
|
500
502
|
# "x-amz-request-id" => "B7BC68F55495B1C8",
|
@@ -502,7 +504,7 @@ module AWS
|
|
502
504
|
# "content-length" => "3418766"}
|
503
505
|
#
|
504
506
|
# some_object.content_type
|
505
|
-
# # => "binary/
|
507
|
+
# # => "binary/octet-stream"
|
506
508
|
# some_object.content_type = 'audio/mpeg'
|
507
509
|
# some_object.content_type
|
508
510
|
# # => 'audio/mpeg'
|
data/lib/aws/s3/version.rb
CHANGED
data/test/authentication_test.rb
CHANGED
@@ -30,7 +30,25 @@ class QueryStringAuthenticationTest < Test::Unit::TestCase
|
|
30
30
|
query_string = Authentication::QueryString.new(request, key_id, secret, :expires => expires)
|
31
31
|
assert_equal expires, query_string.send(:canonical_string).instance_variable_get(:@options)[:expires]
|
32
32
|
assert_equal AmazonDocExampleData::Example3.query_string, query_string
|
33
|
-
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_expires_in_is_coerced_to_being_an_integer_in_case_it_is_a_special_integer_proxy
|
36
|
+
# References bug: http://rubyforge.org/tracker/index.php?func=detail&aid=17458&group_id=2409&atid=9356
|
37
|
+
integer_proxy = Class.new do
|
38
|
+
attr_reader :integer
|
39
|
+
def initialize(integer)
|
40
|
+
@integer = integer
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_int
|
44
|
+
integer
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
actual_integer = 25
|
49
|
+
query_string = Authentication::QueryString.new(request, key_id, secret, :expires_in => integer_proxy.new(actual_integer))
|
50
|
+
assert_equal actual_integer, query_string.send(:expires_in)
|
51
|
+
end
|
34
52
|
|
35
53
|
private
|
36
54
|
def request; AmazonDocExampleData::Example3.request end
|
data/test/base_test.rb
CHANGED
@@ -23,58 +23,52 @@ class BaseTest < Test::Unit::TestCase
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_request_tries_again_when_encountering_an_internal_error
|
26
|
-
Bucket
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
assert bucket.object_cache.empty?
|
39
|
-
end
|
26
|
+
mock_connection_for(Bucket, :returns => [
|
27
|
+
# First request is an internal error
|
28
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
29
|
+
# Second request is a success
|
30
|
+
{:body => Fixtures::Buckets.empty_bucket, :code => 200}
|
31
|
+
])
|
32
|
+
bucket = nil # Block scope hack
|
33
|
+
assert_nothing_raised do
|
34
|
+
bucket = Bucket.find('marcel')
|
35
|
+
end
|
36
|
+
# Don't call objects 'cause we don't want to make another request
|
37
|
+
assert bucket.object_cache.empty?
|
40
38
|
end
|
41
39
|
|
42
40
|
def test_request_tries_up_to_three_times
|
43
|
-
Bucket
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
bucket = Bucket.find('marcel')
|
57
|
-
end
|
58
|
-
# Don't call objects 'cause we don't want to make another request
|
59
|
-
assert bucket.object_cache.empty?
|
41
|
+
mock_connection_for(Bucket, :returns => [
|
42
|
+
# First request is an internal error
|
43
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
44
|
+
# Second request is also an internal error
|
45
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
46
|
+
# Ditto third
|
47
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
48
|
+
# Fourth works
|
49
|
+
{:body => Fixtures::Buckets.empty_bucket, :code => 200}
|
50
|
+
])
|
51
|
+
bucket = nil # Block scope hack
|
52
|
+
assert_nothing_raised do
|
53
|
+
bucket = Bucket.find('marcel')
|
60
54
|
end
|
55
|
+
# Don't call objects 'cause we don't want to make another request
|
56
|
+
assert bucket.object_cache.empty?
|
61
57
|
end
|
62
58
|
|
63
59
|
def test_request_tries_again_three_times_and_gives_up
|
64
|
-
Bucket
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
Bucket.find('marcel')
|
77
|
-
end
|
60
|
+
mock_connection_for(Bucket, :returns => [
|
61
|
+
# First request is an internal error
|
62
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
63
|
+
# Second request is also an internal error
|
64
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
65
|
+
# Ditto third
|
66
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
67
|
+
# Ditto fourth
|
68
|
+
{:body => Fixtures::Errors.internal_error, :code => 500, :error => true},
|
69
|
+
])
|
70
|
+
assert_raises(InternalError) do
|
71
|
+
Bucket.find('marcel')
|
78
72
|
end
|
79
73
|
end
|
80
74
|
end
|
@@ -87,9 +81,8 @@ class MultiConnectionsTest < Test::Unit::TestCase
|
|
87
81
|
def setup
|
88
82
|
Base.send(:connections).clear
|
89
83
|
end
|
90
|
-
alias_method :teardown, :setup
|
91
84
|
|
92
|
-
def test_default_connection_options_are_used_for_subsequent_connections
|
85
|
+
def test_default_connection_options_are_used_for_subsequent_connections
|
93
86
|
assert !Base.connected?
|
94
87
|
|
95
88
|
assert_raises(MissingAccessKey) do
|
@@ -113,7 +106,7 @@ class MultiConnectionsTest < Test::Unit::TestCase
|
|
113
106
|
end
|
114
107
|
|
115
108
|
# All subclasses are currently using the default connection
|
116
|
-
|
109
|
+
assert_equal Base.connection, Bucket.connection
|
117
110
|
|
118
111
|
# No need to pass in the required options. The default connection will supply them
|
119
112
|
assert_nothing_raised do
|