s33r 0.5.3 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/cli/instant_download_server.rb +1 -1
- data/examples/fores33r/app/controllers/browser_controller.rb +1 -1
- data/examples/fores33r/app/views/browser/_upload.rhtml +1 -1
- data/examples/fores33r/config/environment.rb +5 -4
- data/examples/fores33r/log/development.log +8074 -0
- data/examples/fores33r/log/mongrel.log +573 -0
- data/examples/fores33r/log/production.log +1 -0
- data/examples/fores33r/tmp/fores33r.pid +1 -0
- data/examples/fores33r/tmp/sessions/ruby_sess.0c2698596752188b +0 -0
- data/examples/fores33r/tmp/sessions/ruby_sess.4a48fe4b3d99901d +0 -0
- data/examples/fores33r/tmp/sessions/ruby_sess.987bf5655d8a4d9b +0 -0
- data/examples/fores33r/tmp/sessions/ruby_sess.aa26883a8a59649a +0 -0
- data/examples/fores33r/tmp/sessions/ruby_sess.edee8583e9baf769 +0 -0
- data/lib/s33r/bucket.rb +6 -1
- data/lib/s33r/bucket_listing.rb +1 -1
- data/lib/s33r/client.rb +10 -3
- data/lib/s33r/networking.rb +6 -3
- data/lib/s33r/s33r_http.rb +4 -3
- data/lib/s33r/s3_logging.rb +2 -2
- data/lib/s33r/utility.rb +11 -6
- data/test/cases/spec_acl.rb +5 -5
- data/test/cases/spec_bucket_listing.rb +9 -9
- data/test/cases/spec_logging.rb +5 -5
- data/test/cases/spec_s3_object.rb +1 -17
- data/test/cases/spec_utility.rb +16 -16
- data/test/cases/spec_xml.rb +2 -2
- data/test/test_setup.rb +1 -2
- metadata +150 -134
@@ -0,0 +1 @@
|
|
1
|
+
# Logfile created on Thu Feb 01 10:15:18 +0000 2007 by logger.rb/1.5.2.9
|
@@ -0,0 +1 @@
|
|
1
|
+
5232
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/s33r/bucket.rb
CHANGED
data/lib/s33r/bucket_listing.rb
CHANGED
data/lib/s33r/client.rb
CHANGED
@@ -10,6 +10,9 @@ module S33r
|
|
10
10
|
|
11
11
|
# Use SSL for requests.
|
12
12
|
attr_accessor :use_ssl
|
13
|
+
|
14
|
+
# Use subdomains (set on host header)
|
15
|
+
attr_accessor :subdomain
|
13
16
|
|
14
17
|
# Default expiry for authenticated URLs.
|
15
18
|
attr_accessor :expires
|
@@ -24,6 +27,7 @@ module S33r
|
|
24
27
|
def request_defaults
|
25
28
|
defaults = {}
|
26
29
|
defaults[:use_ssl] = @use_ssl
|
30
|
+
defaults[:subdomain] = @subdomain
|
27
31
|
defaults[:expires] = @expires
|
28
32
|
defaults[:access] = @access
|
29
33
|
defaults[:secret] = @secret
|
@@ -63,6 +67,7 @@ module S33r
|
|
63
67
|
# option when generating authenticated URLs. Should be parseable by S33r.parse_expiry.
|
64
68
|
# * <tt>:canned_acl => 'public-read'</tt>: set a default canned acl to apply to all put
|
65
69
|
# requests.
|
70
|
+
# * <tt>:subdomain => false</tt>: set to true to use subdomains in URLs
|
66
71
|
#
|
67
72
|
# These options change the behaviour of the HTTP client which actually sends the request:
|
68
73
|
# * <tt>:chunk_size => Integer</tt>: use a non-standard chunk size;
|
@@ -74,6 +79,8 @@ module S33r
|
|
74
79
|
# General client options.
|
75
80
|
@access = options[:access]
|
76
81
|
@secret = options[:secret]
|
82
|
+
@subdomain = false
|
83
|
+
@subdomain = true if (true == options[:subdomain])
|
77
84
|
@use_ssl = true
|
78
85
|
@use_ssl = false if (false == options[:use_ssl])
|
79
86
|
@expires = options[:expires] || 'never'
|
@@ -190,7 +197,7 @@ module S33r
|
|
190
197
|
end
|
191
198
|
|
192
199
|
options[:querystring] = querystring
|
193
|
-
|
200
|
+
|
194
201
|
resp = do_get(options)
|
195
202
|
|
196
203
|
if resp.ok?
|
@@ -375,7 +382,7 @@ module S33r
|
|
375
382
|
# otherwise 'log-<bucket name>-' is used
|
376
383
|
def logs_to(target_bucket, options={})
|
377
384
|
target_bucket_name = target_bucket.is_a?(Bucket) ? target_bucket.name : target_bucket
|
378
|
-
log_prefix = options[:prefix] || "log-#{
|
385
|
+
log_prefix = options[:prefix] || "log-#{target_bucket_name}-"
|
379
386
|
options[:bucket] ||= options[:for_bucket]
|
380
387
|
|
381
388
|
target_bucket_acl = get_acl(:bucket => target_bucket_name)
|
@@ -397,4 +404,4 @@ module S33r
|
|
397
404
|
put(LoggingResource.new, options)
|
398
405
|
end
|
399
406
|
end
|
400
|
-
end
|
407
|
+
end
|
data/lib/s33r/networking.rb
CHANGED
@@ -72,8 +72,11 @@ module S33r
|
|
72
72
|
# Generate the S3 authorization header if the client has
|
73
73
|
# the appropriate instance variable getters.
|
74
74
|
unless (false == url_options[:authenticated])
|
75
|
+
subdomain = nil
|
76
|
+
subdomain = url_options[:bucket] if url_options[:subdomain]
|
77
|
+
|
75
78
|
headers['Authorization'] = generate_auth_header_value(method, path, headers,
|
76
|
-
url_options[:access], url_options[:secret])
|
79
|
+
url_options[:access], url_options[:secret], subdomain)
|
77
80
|
end
|
78
81
|
|
79
82
|
# Insert the headers into the request object.
|
@@ -106,7 +109,7 @@ module S33r
|
|
106
109
|
data = nil
|
107
110
|
end
|
108
111
|
|
109
|
-
puts req.
|
112
|
+
puts req.dump(uri.host) if @dump_requests
|
110
113
|
|
111
114
|
# Set up the request.
|
112
115
|
### <snip> start shameless stealing from Marcel Molina
|
@@ -180,4 +183,4 @@ module S33r
|
|
180
183
|
do_request('HEAD', options, headers)
|
181
184
|
end
|
182
185
|
end
|
183
|
-
end
|
186
|
+
end
|
data/lib/s33r/s33r_http.rb
CHANGED
@@ -54,10 +54,10 @@ class Net::HTTPGenericRequest
|
|
54
54
|
#
|
55
55
|
# Switch on request debugging by passing <tt>:dump_requests => true</tt> to S33r::Client
|
56
56
|
# constructor.
|
57
|
-
def
|
57
|
+
def dump(host)
|
58
58
|
str = "*******\n" +
|
59
59
|
"#{self.class::METHOD} #{@path} HTTP/1.1\n" +
|
60
|
-
"Host: #{
|
60
|
+
"Host: #{host}\n"
|
61
61
|
|
62
62
|
self.each_capitalized do |key, value|
|
63
63
|
str += "#{key}: #{value}\n"
|
@@ -84,8 +84,9 @@ class Net::HTTPGenericRequest
|
|
84
84
|
sock.write "0\r\n\r\n"
|
85
85
|
else
|
86
86
|
while s = f.read(@chunk_size)
|
87
|
+
puts "Writing " + @chunk_size.to_s + " bytes to network stream"
|
87
88
|
sock.write s
|
88
89
|
end
|
89
90
|
end
|
90
91
|
end
|
91
|
-
end
|
92
|
+
end
|
data/lib/s33r/s3_logging.rb
CHANGED
@@ -10,7 +10,7 @@ module S33r
|
|
10
10
|
# To set a Bucket up for logging, create a LoggingResource with the correct log_target and
|
11
11
|
# log_prefix settings and put that to the ?logging URL for a bucket.
|
12
12
|
class LoggingResource
|
13
|
-
|
13
|
+
attr_accessor :log_target, :log_prefix
|
14
14
|
|
15
15
|
# +log_target+ is the bucket to put logs into.
|
16
16
|
# +log_prefix+ is the prefix for log files put into the +log_target+ bucket.
|
@@ -109,4 +109,4 @@ module S33r
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
112
|
-
end
|
112
|
+
end
|
data/lib/s33r/utility.rb
CHANGED
@@ -99,7 +99,8 @@ module S33r
|
|
99
99
|
# * +headers+ is a hash of headers which are going to be sent with the request.
|
100
100
|
# * +expires+ is the expiry time set in the querystring for authenticated URLs:
|
101
101
|
# if supplied, it is used for the +date+ header.
|
102
|
-
|
102
|
+
# * +subdomain+ is the bucket name if using "virtual hosts"
|
103
|
+
def generate_canonical_string(method, path, headers={}, expires=nil, subdomain=nil)
|
103
104
|
interesting_headers = {}
|
104
105
|
headers.each do |key, value|
|
105
106
|
lk = key.downcase
|
@@ -117,7 +118,9 @@ module S33r
|
|
117
118
|
interesting_headers['date'] = expires
|
118
119
|
end
|
119
120
|
|
120
|
-
buf =
|
121
|
+
buf = ''
|
122
|
+
|
123
|
+
buf << "#{method}\n"
|
121
124
|
interesting_headers.sort { |a, b| a[0] <=> b[0] }.each do |key, value|
|
122
125
|
if key =~ /^#{AWS_HEADER_PREFIX}/o
|
123
126
|
buf << "#{key}:#{value}\n"
|
@@ -126,6 +129,8 @@ module S33r
|
|
126
129
|
end
|
127
130
|
end
|
128
131
|
|
132
|
+
buf << '/' + subdomain unless subdomain.nil?
|
133
|
+
|
129
134
|
# Ignore everything after the question mark...
|
130
135
|
buf << path.gsub(/\?.*$/, '')
|
131
136
|
|
@@ -142,7 +147,7 @@ module S33r
|
|
142
147
|
end
|
143
148
|
|
144
149
|
# Get the value for the AWS authentication header.
|
145
|
-
def generate_auth_header_value(method, path, headers, aws_access_key, aws_secret_access_key)
|
150
|
+
def generate_auth_header_value(method, path, headers, aws_access_key, aws_secret_access_key, subdomain)
|
146
151
|
raise MethodNotAllowed, "Method %s not available" % method if !METHOD_VERBS.include?(method)
|
147
152
|
|
148
153
|
# check the headers needed for authentication have been set
|
@@ -156,7 +161,7 @@ module S33r
|
|
156
161
|
if aws_access_key.nil? or aws_secret_access_key.nil?
|
157
162
|
|
158
163
|
# get the AWS header
|
159
|
-
canonical_string = generate_canonical_string(method, path, headers)
|
164
|
+
canonical_string = generate_canonical_string(method, path, headers, nil, subdomain)
|
160
165
|
signature = generate_signature(aws_secret_access_key, canonical_string)
|
161
166
|
AWS_AUTH_HEADER_VALUE % [aws_access_key, signature]
|
162
167
|
end
|
@@ -367,7 +372,7 @@ module S33r
|
|
367
372
|
path = options[:path]
|
368
373
|
path ||= s3_path(options)
|
369
374
|
host = HOST
|
370
|
-
host = (options[:bucket] + "." + host ) if options[:subdomain]
|
375
|
+
host = (options[:bucket] + "." + host ) if options[:subdomain] and options[:bucket]
|
371
376
|
"#{scheme}://" + host + path
|
372
377
|
end
|
373
378
|
|
@@ -439,4 +444,4 @@ module S33r
|
|
439
444
|
namespace = S33r::RESPONSE_NAMESPACE_URI.gsub('/', '\/')
|
440
445
|
xml_in.gsub(/ xmlns="#{namespace}"/, '')
|
441
446
|
end
|
442
|
-
end
|
447
|
+
end
|
data/test/cases/spec_acl.rb
CHANGED
@@ -68,12 +68,12 @@ context 'S33r ACL functions' do
|
|
68
68
|
specify 'needs equality method for grantees' do
|
69
69
|
test_grantee = Group.new(:all_users)
|
70
70
|
test_grantee.should == @group_grantee
|
71
|
-
test_grantee.
|
71
|
+
test_grantee.should_not equal @amazon_grantee
|
72
72
|
end
|
73
73
|
|
74
74
|
specify 'should only accept valid permission specifiers' do
|
75
|
-
lambda { Grant.new(@group_grantee, nil) }.should
|
76
|
-
lambda { Grant.new(@group_grantee, :broken) }.should
|
75
|
+
lambda { Grant.new(@group_grantee, nil) }.should raise_error InvalidPermission
|
76
|
+
lambda { Grant.new(@group_grantee, :broken) }.should raise_error InvalidPermission
|
77
77
|
end
|
78
78
|
|
79
79
|
specify 'should correctly create AmazonCustomer grantee from XML node' do
|
@@ -111,6 +111,6 @@ context 'S33r ACL functions' do
|
|
111
111
|
@full_acl_doc.grants.each do |g|
|
112
112
|
acl_doc_from_xml.grants = acl_doc_from_xml.grants.delete_if { |i| i == g }
|
113
113
|
end
|
114
|
-
acl_doc_from_xml.grants.should
|
114
|
+
acl_doc_from_xml.grants.size.should == 0
|
115
115
|
end
|
116
|
-
end
|
116
|
+
end
|
@@ -15,15 +15,15 @@ context 'S33r bucket listing' do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
specify 'can only be created if bucket listing XML supplied' do
|
18
|
-
lambda { BucketListing.new }.should
|
18
|
+
lambda { BucketListing.new }.should raise_error ArgumentError
|
19
19
|
end
|
20
20
|
|
21
21
|
specify 'cannot be created from invalid XML' do
|
22
|
-
lambda { BucketListing.new(nil) }.should
|
22
|
+
lambda { BucketListing.new(nil) }.should raise_error S3Exception::InvalidBucketListing
|
23
23
|
end
|
24
24
|
|
25
25
|
specify 'should recover gracefully from broken bucket listing XML' do
|
26
|
-
lambda { BucketListing.new(@with_broken_bucket_listing_xml) }.should
|
26
|
+
lambda { BucketListing.new(@with_broken_bucket_listing_xml) }.should raise_error S3Exception::InvalidBucketListing
|
27
27
|
end
|
28
28
|
|
29
29
|
specify 'should cope if bucket is empty (i.e. no <Contents> elements)' do
|
@@ -40,7 +40,7 @@ context 'S33r bucket listing' do
|
|
40
40
|
@bucket_listing.marker.should ==('')
|
41
41
|
@bucket_listing.max_keys.should ==(1000)
|
42
42
|
@bucket_listing.is_truncated.should ==(false)
|
43
|
-
@bucket_listing.delimiter.should
|
43
|
+
@bucket_listing.delimiter.should be nil
|
44
44
|
end
|
45
45
|
|
46
46
|
specify 'when listing XML is reset, should update all properties correctly' do
|
@@ -63,16 +63,16 @@ context 'S33r bucket listing' do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
specify 'should store resources (<Contents> elements) in a hash' do
|
66
|
-
@bucket_listing.size.
|
66
|
+
@bucket_listing.size.should be 10
|
67
67
|
first_obj = @bucket_listing['/home/ell/dir1/four.txt']
|
68
|
-
first_obj.
|
68
|
+
first_obj.should be_instance_of S3Object
|
69
69
|
end
|
70
70
|
|
71
71
|
# attempting to fix ListBucketResult errors reported by Alex Payne
|
72
72
|
specify 'should handle suspect bucket listing' do
|
73
73
|
puts @with_suspect_bl_xml
|
74
74
|
bl = BucketListing.new(@with_suspect_bl_xml)
|
75
|
-
bl.size.
|
76
|
-
bl.keys.should
|
75
|
+
bl.size.should be 1
|
76
|
+
bl.keys.should include 'orly.jpg'
|
77
77
|
end
|
78
|
-
end
|
78
|
+
end
|
data/test/cases/spec_logging.rb
CHANGED
@@ -29,19 +29,19 @@ context 'S33r logging' do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
specify 'should represent LogDelivery grants so buckets can act as logging targets' do
|
32
|
-
@logging_acl_doc.grants.should
|
33
|
-
@logging_acl_doc.grants.should
|
32
|
+
@logging_acl_doc.grants.should include @log_delivery_write
|
33
|
+
@logging_acl_doc.grants.should include @log_delivery_read_acl
|
34
34
|
end
|
35
35
|
|
36
36
|
specify 'should be able to report whether an ACL indicates bucket is a logging target' do
|
37
|
-
@logging_acl_doc.log_targetable?.should
|
37
|
+
@logging_acl_doc.log_targetable?.should be true
|
38
38
|
|
39
39
|
# check the variant where the grants have been removed
|
40
|
-
@logging_acl_doc_no_grants.log_targetable?.should
|
40
|
+
@logging_acl_doc_no_grants.log_targetable?.should be false
|
41
41
|
end
|
42
42
|
|
43
43
|
specify 'should be able to simply add logging target grants to an ACL' do
|
44
44
|
@logging_acl_doc_no_grants.add_log_target_grants
|
45
45
|
clean_xml(@logging_acl_doc_no_grants.to_xml).should == @logging_acl_xml
|
46
46
|
end
|
47
|
-
end
|
47
|
+
end
|
@@ -34,27 +34,11 @@ context 'S3 object' do
|
|
34
34
|
@s3obj2.bucket.name.should == 'quotes'
|
35
35
|
end
|
36
36
|
|
37
|
-
specify 'can be created from a file' do
|
38
|
-
todo
|
39
|
-
end
|
40
|
-
|
41
37
|
specify 'should treat the owner as an object in his/her own right' do
|
42
38
|
[@s3obj.owner.user_id, @s3obj.owner.display_name].should == \
|
43
39
|
['56efddfead5aa65da942f156fb2b294f44d78fd932d701331edc5fba19620fd4', 'elliotsmith3']
|
44
40
|
@s3obj.owner.should_be_instance_of S3ACL::CanonicalUser
|
45
41
|
end
|
46
|
-
|
47
|
-
specify 'can be saved' do
|
48
|
-
todo
|
49
|
-
end
|
50
|
-
|
51
|
-
specify 'can be renamed' do
|
52
|
-
todo
|
53
|
-
end
|
54
|
-
|
55
|
-
specify 'can be deleted' do
|
56
|
-
todo
|
57
|
-
end
|
58
42
|
|
59
43
|
specify 'should return authenticated URL' do
|
60
44
|
@s3obj2.url(:authenticated => true, :expires => 1141889120).should == @correct_authenticated_url
|
@@ -71,4 +55,4 @@ context 'S3 object' do
|
|
71
55
|
specify 'should optionally return URL with domain name set to bucket name' do
|
72
56
|
@s3obj2.url(:subdomain => true).should == @correct_public_url_with_subdomain
|
73
57
|
end
|
74
|
-
end
|
58
|
+
end
|
data/test/cases/spec_utility.rb
CHANGED
@@ -63,7 +63,7 @@ context 'S33r utility' do
|
|
63
63
|
config, options = S33r.load_config(@yaml_file)
|
64
64
|
options[:email_to].should == Testing::EMAIL
|
65
65
|
# Make sure the 'options' section has not been included in the general config..
|
66
|
-
config.keys.
|
66
|
+
config.keys.should_not include :options
|
67
67
|
end
|
68
68
|
|
69
69
|
specify 'should generate correct canonical strings' do
|
@@ -78,17 +78,17 @@ context 'S33r utility' do
|
|
78
78
|
|
79
79
|
specify 'should generate correct auth headers' do
|
80
80
|
generate_auth_header_value(@for_request_method, @for_request_path, @for_request_headers,
|
81
|
-
Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY).should == @correct_auth_header
|
81
|
+
Testing::ACCESS_KEY, Testing::SECRET_ACCESS_KEY, nil).should == @correct_auth_header
|
82
82
|
end
|
83
83
|
|
84
84
|
specify 'should not generate auth header if bad HTTP method passed' do
|
85
|
-
lambda { generate_auth_header_value('duff', nil, nil, nil, nil) }.should
|
85
|
+
lambda { generate_auth_header_value('duff', nil, nil, nil, nil, nil) }.should raise_error \
|
86
86
|
MethodNotAllowed
|
87
87
|
end
|
88
88
|
|
89
89
|
specify 'should not generate auth header if required headers missing' do
|
90
90
|
lambda { generate_auth_header_value('PUT', '/', @for_incomplete_headers,
|
91
|
-
nil, nil) }.should
|
91
|
+
nil, nil, nil) }.should raise_error MissingRequiredHeaders
|
92
92
|
end
|
93
93
|
|
94
94
|
specify 'when generating auth header, should allow addition of Date and Content-Type headers' do
|
@@ -104,28 +104,28 @@ context 'S33r utility' do
|
|
104
104
|
specify 'should generate correct x-amz-meta- headers from a hash' do
|
105
105
|
meta = {'myname' => 'elliot', 'myage' => 36}
|
106
106
|
headers = metadata_headers(meta)
|
107
|
-
headers.should
|
108
|
-
headers.should
|
107
|
+
headers.should include 'x-amz-meta-myname'
|
108
|
+
headers.should include 'x-amz-meta-myage'
|
109
109
|
headers['x-amz-meta-myname'].should == 'elliot'
|
110
110
|
headers['x-amz-meta-myage'].should == '36'
|
111
111
|
end
|
112
112
|
|
113
113
|
specify 'should not generate canned ACL header if invalid canned ACL supplied' do
|
114
|
-
lambda { canned_acl_header('duff') }.should
|
114
|
+
lambda { canned_acl_header('duff') }.should raise_error \
|
115
115
|
UnsupportedCannedACL
|
116
116
|
end
|
117
117
|
|
118
118
|
specify 'should correctly add canned ACL headers' do
|
119
119
|
new_headers = canned_acl_header('private')
|
120
|
-
new_headers.should
|
121
|
-
new_headers.keys.should
|
120
|
+
new_headers.should have(1).keys
|
121
|
+
new_headers.keys.should include 'x-amz-acl'
|
122
122
|
new_headers['x-amz-acl'].should == 'private'
|
123
123
|
end
|
124
124
|
|
125
125
|
specify 'should set sensible defaults for missing Content-Type and Date headers' do
|
126
126
|
fixed_headers = default_headers(@for_incomplete_headers)
|
127
127
|
fixed_headers['Content-Type'].should == ''
|
128
|
-
fixed_headers.include?('Date').
|
128
|
+
fixed_headers.include?('Date').should_not === nil
|
129
129
|
end
|
130
130
|
|
131
131
|
specify 'should default to text/plain mimetype for unknown file types' do
|
@@ -144,9 +144,9 @@ context 'S33r utility' do
|
|
144
144
|
end
|
145
145
|
|
146
146
|
specify 'should recognise invalid bucket names' do
|
147
|
-
lambda { bucket_name_valid?(@with_invalid_bucket_name) }.should
|
147
|
+
lambda { bucket_name_valid?(@with_invalid_bucket_name) }.should raise_error \
|
148
148
|
MalformedBucketName
|
149
|
-
lambda { bucket_name_valid?(@with_invalid_bucket_name2) }.should
|
149
|
+
lambda { bucket_name_valid?(@with_invalid_bucket_name2) }.should raise_error \
|
150
150
|
MalformedBucketName
|
151
151
|
end
|
152
152
|
|
@@ -234,14 +234,14 @@ context 'S33r utility' do
|
|
234
234
|
expected_expiry = Time.now.to_i + DEFAULT_EXPIRY_SECS
|
235
235
|
expires = S33r.parse_expiry
|
236
236
|
expires.should == expected_expiry
|
237
|
-
expires.
|
237
|
+
expires.class.should == Bignum
|
238
238
|
|
239
239
|
# If :far_flung_future is passed, default to 20 years from now.
|
240
240
|
expected_expiry = Time.now.to_i +
|
241
241
|
(60 * 60 * 24 * 365.25 * 20).to_i
|
242
242
|
expires = S33r.parse_expiry(:far_flung_future)
|
243
243
|
expires.should == expected_expiry
|
244
|
-
expires.
|
244
|
+
expires.class.should == Bignum
|
245
245
|
|
246
246
|
class Time
|
247
247
|
remove_method(:to_i)
|
@@ -254,7 +254,7 @@ context 'S33r utility' do
|
|
254
254
|
expected_expiry = Time.parse(datetime_str).to_i
|
255
255
|
expires = S33r.parse_expiry(datetime_str)
|
256
256
|
expires.should == expected_expiry
|
257
|
-
expires.
|
257
|
+
expires.class.should == Bignum
|
258
258
|
end
|
259
259
|
|
260
260
|
specify 'should provide a method for converting string keys of a hash into symbols' do
|
@@ -268,4 +268,4 @@ context 'S33r utility' do
|
|
268
268
|
s3_url(:bucket => 'quotes', :key => 'some key').should == @url_with_unescaped_key
|
269
269
|
end
|
270
270
|
|
271
|
-
end
|
271
|
+
end
|