sml-aws-s3 0.5.1.1225474505
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 +19 -0
- data/INSTALL +55 -0
- data/README +545 -0
- data/Rakefile +334 -0
- data/bin/s3sh +6 -0
- data/bin/setup.rb +10 -0
- data/lib/aws/s3/acl.rb +636 -0
- data/lib/aws/s3/authentication.rb +221 -0
- data/lib/aws/s3/base.rb +236 -0
- data/lib/aws/s3/bittorrent.rb +58 -0
- data/lib/aws/s3/bucket.rb +319 -0
- data/lib/aws/s3/connection.rb +323 -0
- data/lib/aws/s3/error.rb +69 -0
- data/lib/aws/s3/exceptions.rb +133 -0
- data/lib/aws/s3/extensions.rb +324 -0
- data/lib/aws/s3/logging.rb +311 -0
- data/lib/aws/s3/object.rb +628 -0
- data/lib/aws/s3/owner.rb +44 -0
- data/lib/aws/s3/parsing.rb +99 -0
- data/lib/aws/s3/response.rb +180 -0
- data/lib/aws/s3/service.rb +51 -0
- data/lib/aws/s3/version.rb +12 -0
- data/lib/aws/s3.rb +61 -0
- data/test/acl_test.rb +254 -0
- data/test/authentication_test.rb +114 -0
- data/test/base_test.rb +136 -0
- data/test/bucket_test.rb +74 -0
- data/test/connection_test.rb +216 -0
- data/test/error_test.rb +70 -0
- data/test/extensions_test.rb +331 -0
- data/test/fixtures.rb +89 -0
- data/test/logging_test.rb +89 -0
- data/test/object_test.rb +205 -0
- data/test/parsing_test.rb +66 -0
- data/test/response_test.rb +68 -0
- data/test/service_test.rb +23 -0
- data/test/test_helper.rb +107 -0
- metadata +121 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class TypecastingTest < Test::Unit::TestCase
|
4
|
+
# Make it easier to call methods in tests
|
5
|
+
Parsing::Typecasting.public_instance_methods.each do |method|
|
6
|
+
Parsing::Typecasting.send(:module_function, method)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_array_with_one_element_that_is_a_hash
|
10
|
+
value = [{'Available' => 'true'}]
|
11
|
+
assert_equal [{'available' => true}], Parsing::Typecasting.typecast(value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_hash_with_one_key_whose_value_is_an_array
|
15
|
+
value = {
|
16
|
+
'Bucket' =>
|
17
|
+
[
|
18
|
+
{'Available' => 'true'}
|
19
|
+
]
|
20
|
+
}
|
21
|
+
|
22
|
+
expected = {
|
23
|
+
'bucket' =>
|
24
|
+
[
|
25
|
+
{'available' => true}
|
26
|
+
]
|
27
|
+
}
|
28
|
+
assert_equal expected, Parsing::Typecasting.typecast(value)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class XmlParserTest < Test::Unit::TestCase
|
34
|
+
def test_bucket_is_always_forced_to_be_an_array_unless_empty
|
35
|
+
one_bucket = Parsing::XmlParser.new(Fixtures::Buckets.bucket_list_with_one_bucket)
|
36
|
+
more_than_one = Parsing::XmlParser.new(Fixtures::Buckets.bucket_list_with_more_than_one_bucket)
|
37
|
+
|
38
|
+
[one_bucket, more_than_one].each do |bucket_list|
|
39
|
+
assert_kind_of Array, bucket_list['buckets']['bucket']
|
40
|
+
end
|
41
|
+
|
42
|
+
no_buckets = Parsing::XmlParser.new(Fixtures::Buckets.empty_bucket_list)
|
43
|
+
assert no_buckets.has_key?('buckets')
|
44
|
+
assert_nil no_buckets['buckets']
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_bucket_contents_are_forced_to_be_an_array_unless_empty
|
48
|
+
one_key = Parsing::XmlParser.new(Fixtures::Buckets.bucket_with_one_key)
|
49
|
+
more_than_one = Parsing::XmlParser.new(Fixtures::Buckets.bucket_with_more_than_one_key)
|
50
|
+
[one_key, more_than_one].each do |bucket_with_contents|
|
51
|
+
assert_kind_of Array, bucket_with_contents['contents']
|
52
|
+
end
|
53
|
+
|
54
|
+
no_keys = Parsing::XmlParser.new(Fixtures::Buckets.empty_bucket)
|
55
|
+
assert !no_keys.has_key?('contents')
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_policy_grants_are_always_an_array
|
59
|
+
policy = Parsing::XmlParser.new(Fixtures::Policies.policy_with_one_grant)
|
60
|
+
assert_kind_of Array, policy['access_control_list']['grant']
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_empty_xml_response_is_not_parsed
|
64
|
+
assert_equal({}, Parsing::XmlParser.new(''))
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
class BaseResponseTest < Test::Unit::TestCase
|
3
|
+
def setup
|
4
|
+
@headers = {'content-type' => 'text/plain', 'date' => Time.now}
|
5
|
+
@response = FakeResponse.new()
|
6
|
+
@base_response = Base::Response.new(@response)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_status_predicates
|
10
|
+
response = Proc.new {|code| Base::Response.new(FakeResponse.new(:code => code))}
|
11
|
+
assert response[200].success?
|
12
|
+
assert response[300].redirect?
|
13
|
+
assert response[400].client_error?
|
14
|
+
assert response[500].server_error?
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_headers_passed_along_from_original_response
|
18
|
+
assert_equal @response.headers, @base_response.headers
|
19
|
+
assert_equal @response['date'], @base_response['date']
|
20
|
+
original_headers, new_headers = {}, {}
|
21
|
+
@response.headers.each {|k,v| original_headers[k] = v}
|
22
|
+
@base_response.each {|k,v| new_headers[k] = v}
|
23
|
+
assert_equal original_headers, new_headers
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ErrorResponseTest < Test::Unit::TestCase
|
28
|
+
def test_error_responses_are_always_in_error
|
29
|
+
assert Error::Response.new(FakeResponse.new).error?
|
30
|
+
assert Error::Response.new(FakeResponse.new(:code => 200)).error?
|
31
|
+
assert Error::Response.new(FakeResponse.new(:headers => {'content-type' => 'text/plain'})).error?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class S3ObjectResponseTest < Test::Unit::TestCase
|
36
|
+
def test_etag_extracted
|
37
|
+
mock_connection_for(S3Object, :returns => {:headers => {"etag" => %("acbd18db4cc2f85cedef654fccc4a4d8")}}).once
|
38
|
+
object_response = S3Object.create('name_does_not_matter', 'data does not matter', 'bucket does not matter')
|
39
|
+
assert_equal "acbd18db4cc2f85cedef654fccc4a4d8", object_response.etag
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class ResponseClassFinderTest < Test::Unit::TestCase
|
44
|
+
class CampfireBucket < Bucket
|
45
|
+
end
|
46
|
+
|
47
|
+
class BabyBase < Base
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_on_base
|
51
|
+
assert_equal Base::Response, FindResponseClass.for(Base)
|
52
|
+
assert_equal Base::Response, FindResponseClass.for(AWS::S3::Base)
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_on_subclass_with_corresponding_response_class
|
57
|
+
assert_equal Bucket::Response, FindResponseClass.for(Bucket)
|
58
|
+
assert_equal Bucket::Response, FindResponseClass.for(AWS::S3::Bucket)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_on_subclass_with_intermediary_parent_that_has_corresponding_response_class
|
62
|
+
assert_equal Bucket::Response, FindResponseClass.for(CampfireBucket)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_on_subclass_with_no_corresponding_response_class_and_no_intermediary_parent
|
66
|
+
assert_equal Base::Response, FindResponseClass.for(BabyBase)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class ServiceTest < Test::Unit::TestCase
|
4
|
+
def test_bucket_list_with_empty_bucket_list
|
5
|
+
mock_connection_for(Service, :returns => {:body => Fixtures::Buckets.empty_bucket_list, :code => 200})
|
6
|
+
list = Service.buckets(:reload)
|
7
|
+
assert_equal [], list
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_bucket_list_with_bucket_list_containing_one_bucket
|
11
|
+
mock_connection_for(Service, :returns => {:body => Fixtures::Buckets.bucket_list_with_one_bucket, :code => 200})
|
12
|
+
list = Service.buckets(:reload)
|
13
|
+
assert_equal 1, list.size
|
14
|
+
assert_equal 'marcel_molina', list.first.name
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_bucket_list_with_bucket_list_containing_more_than_one_bucket
|
18
|
+
mock_connection_for(Service, :returns => {:body => Fixtures::Buckets.bucket_list_with_more_than_one_bucket, :code => 200})
|
19
|
+
list = Service.buckets(:reload)
|
20
|
+
assert_equal 2, list.size
|
21
|
+
assert_equal %w(marcel_molina marcel_molina_jr), list.map {|bucket| bucket.name}.sort
|
22
|
+
end
|
23
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
+
require 'aws/s3'
|
4
|
+
require File.dirname(__FILE__) + '/mocks/fake_response'
|
5
|
+
require File.dirname(__FILE__) + '/fixtures'
|
6
|
+
require_library_or_gem 'ruby-debug'
|
7
|
+
require_library_or_gem 'flexmock'
|
8
|
+
require_library_or_gem 'flexmock/test_unit'
|
9
|
+
|
10
|
+
|
11
|
+
# Data copied from http://docs.amazonwebservices.com/AmazonS3/2006-03-01/RESTAuthentication.html
|
12
|
+
module AmazonDocExampleData
|
13
|
+
module Example1
|
14
|
+
module_function
|
15
|
+
|
16
|
+
def request
|
17
|
+
request = Net::HTTP::Put.new('/quotes/nelson')
|
18
|
+
request['Content-Md5'] = 'c8fdb181845a4ca6b8fec737b3581d76'
|
19
|
+
request['Content-Type'] = 'text/html'
|
20
|
+
request['Date'] = 'Thu, 17 Nov 2005 18:49:58 GMT'
|
21
|
+
request['X-Amz-Meta-Author'] = 'foo@bar.com'
|
22
|
+
request['X-Amz-Magic'] = 'abracadabra'
|
23
|
+
request
|
24
|
+
end
|
25
|
+
|
26
|
+
def canonical_string
|
27
|
+
"PUT\nc8fdb181845a4ca6b8fec737b3581d76\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic:abracadabra\nx-amz-meta-author:foo@bar.com\n/quotes/nelson"
|
28
|
+
end
|
29
|
+
|
30
|
+
def access_key_id
|
31
|
+
'44CF9590006BF252F707'
|
32
|
+
end
|
33
|
+
|
34
|
+
def secret_access_key
|
35
|
+
'OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV'
|
36
|
+
end
|
37
|
+
|
38
|
+
def signature
|
39
|
+
'jZNOcbfWmD/A/f3hSvVzXZjM2HU='
|
40
|
+
end
|
41
|
+
|
42
|
+
def authorization_header
|
43
|
+
'AWS 44CF9590006BF252F707:jZNOcbfWmD/A/f3hSvVzXZjM2HU='
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Example3
|
48
|
+
module_function
|
49
|
+
|
50
|
+
def request
|
51
|
+
request = Net::HTTP::Get.new('/quotes/nelson')
|
52
|
+
request['Date'] = date
|
53
|
+
request
|
54
|
+
end
|
55
|
+
|
56
|
+
def date
|
57
|
+
'Thu Mar 9 01:24:20 CST 2006'
|
58
|
+
end
|
59
|
+
|
60
|
+
def access_key_id
|
61
|
+
Example1.access_key_id
|
62
|
+
end
|
63
|
+
|
64
|
+
def secret_access_key
|
65
|
+
Example1.secret_access_key
|
66
|
+
end
|
67
|
+
|
68
|
+
def expires
|
69
|
+
1141889120
|
70
|
+
end
|
71
|
+
|
72
|
+
def query_string
|
73
|
+
'AWSAccessKeyId=44CF9590006BF252F707&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D'
|
74
|
+
end
|
75
|
+
|
76
|
+
def canonical_string
|
77
|
+
"GET\n\n\n1141889120\n/quotes/nelson"
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Test::Unit::TestCase
|
84
|
+
include AWS::S3
|
85
|
+
|
86
|
+
def sample_proxy_settings
|
87
|
+
{:host => 'http://google.com', :port => 8080, :user => 'marcel', :password => 'secret'}
|
88
|
+
end
|
89
|
+
|
90
|
+
def mock_connection_for(klass, options = {})
|
91
|
+
data = options[:returns]
|
92
|
+
return_values = case data
|
93
|
+
when Hash
|
94
|
+
FakeResponse.new(data)
|
95
|
+
when Array
|
96
|
+
data.map {|hash| FakeResponse.new(hash)}
|
97
|
+
else
|
98
|
+
abort "Response data for mock connection must be a Hash or an Array. Was #{data.inspect}."
|
99
|
+
end
|
100
|
+
|
101
|
+
connection = flexmock('Mock connection') do |mock|
|
102
|
+
mock.should_receive(:request).and_return(*return_values).at_least.once
|
103
|
+
end
|
104
|
+
|
105
|
+
flexmock(klass).should_receive(:connection).and_return(connection)
|
106
|
+
end
|
107
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sml-aws-s3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.1.1225474505
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Marcel Molina Jr.
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-10-27 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: xml-simple
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: builder
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "0"
|
32
|
+
version:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: mime-types
|
35
|
+
version_requirement:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: "0"
|
41
|
+
version:
|
42
|
+
description: Client library for Amazon's Simple Storage Service's REST API
|
43
|
+
email: marcel@vernix.org
|
44
|
+
executables:
|
45
|
+
- s3sh
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README
|
50
|
+
- COPYING
|
51
|
+
- INSTALL
|
52
|
+
files:
|
53
|
+
- Rakefile
|
54
|
+
- lib/aws/s3.rb
|
55
|
+
- lib/aws/s3/acl.rb
|
56
|
+
- lib/aws/s3/authentication.rb
|
57
|
+
- lib/aws/s3/base.rb
|
58
|
+
- lib/aws/s3/bittorrent.rb
|
59
|
+
- lib/aws/s3/bucket.rb
|
60
|
+
- lib/aws/s3/connection.rb
|
61
|
+
- lib/aws/s3/error.rb
|
62
|
+
- lib/aws/s3/exceptions.rb
|
63
|
+
- lib/aws/s3/extensions.rb
|
64
|
+
- lib/aws/s3/logging.rb
|
65
|
+
- lib/aws/s3/object.rb
|
66
|
+
- lib/aws/s3/owner.rb
|
67
|
+
- lib/aws/s3/parsing.rb
|
68
|
+
- lib/aws/s3/response.rb
|
69
|
+
- lib/aws/s3/service.rb
|
70
|
+
- lib/aws/s3/version.rb
|
71
|
+
- bin/setup.rb
|
72
|
+
- bin/s3sh
|
73
|
+
- README
|
74
|
+
- COPYING
|
75
|
+
- INSTALL
|
76
|
+
has_rdoc: true
|
77
|
+
homepage: http://amazon.rubyforge.org
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options:
|
80
|
+
- --title
|
81
|
+
- AWS::S3 -- Support for Amazon S3's REST api
|
82
|
+
- --main
|
83
|
+
- README
|
84
|
+
- --line-numbers
|
85
|
+
- --inline-source
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: "0"
|
93
|
+
version:
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: "0"
|
99
|
+
version:
|
100
|
+
requirements: []
|
101
|
+
|
102
|
+
rubyforge_project: amazon
|
103
|
+
rubygems_version: 1.2.0
|
104
|
+
signing_key:
|
105
|
+
specification_version: 2
|
106
|
+
summary: Client library for Amazon's Simple Storage Service's REST API
|
107
|
+
test_files:
|
108
|
+
- test/acl_test.rb
|
109
|
+
- test/authentication_test.rb
|
110
|
+
- test/base_test.rb
|
111
|
+
- test/bucket_test.rb
|
112
|
+
- test/connection_test.rb
|
113
|
+
- test/error_test.rb
|
114
|
+
- test/extensions_test.rb
|
115
|
+
- test/fixtures.rb
|
116
|
+
- test/logging_test.rb
|
117
|
+
- test/object_test.rb
|
118
|
+
- test/parsing_test.rb
|
119
|
+
- test/response_test.rb
|
120
|
+
- test/service_test.rb
|
121
|
+
- test/test_helper.rb
|