qoobaa-s3 0.0.3
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/.document +5 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +58 -0
- data/VERSION +1 -0
- data/bin/s3cmd.rb +188 -0
- data/lib/s3.rb +23 -0
- data/lib/s3/bucket.rb +154 -0
- data/lib/s3/connection.rb +152 -0
- data/lib/s3/exceptions.rb +94 -0
- data/lib/s3/object.rb +153 -0
- data/lib/s3/roxy/moxie.rb +58 -0
- data/lib/s3/roxy/proxy.rb +72 -0
- data/lib/s3/service.rb +106 -0
- data/lib/s3/signature.rb +120 -0
- data/s3.gemspec +65 -0
- data/test/bucket_test.rb +22 -0
- data/test/connection_test.rb +164 -0
- data/test/s3_test.rb +5 -0
- data/test/service_test.rb +133 -0
- data/test/signature_test.rb +143 -0
- data/test/test_helper.rb +11 -0
- metadata +82 -0
data/test/s3_test.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ServiceTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@service_ok = S3::Service.new(
|
6
|
+
:access_key_id => "12345678901234567890",
|
7
|
+
:secret_access_key => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDF"
|
8
|
+
)
|
9
|
+
@connection_ok = S3::Connection.new
|
10
|
+
@response_ok = Net::HTTPOK.new("1.1", "200", "OK")
|
11
|
+
stub(@service_ok).connection { @connection_ok }
|
12
|
+
stub(@connection_ok).request { @response_ok } # redefine it if needed
|
13
|
+
|
14
|
+
@buckets_empty_list = []
|
15
|
+
@buckets_empty_list_body = <<-EOEmptyBuckets
|
16
|
+
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
|
17
|
+
<ListAllMyBucketsResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">
|
18
|
+
<Owner>
|
19
|
+
<ID>123u1odhkhfoadf</ID>
|
20
|
+
<DisplayName>JohnDoe</DisplayName>
|
21
|
+
</Owner>
|
22
|
+
<Buckets>
|
23
|
+
</Buckets>
|
24
|
+
</ListAllMyBucketsResult>
|
25
|
+
EOEmptyBuckets
|
26
|
+
|
27
|
+
@buckets_list = [
|
28
|
+
S3::Bucket.new(@service_ok, "data.example.com"),
|
29
|
+
S3::Bucket.new(@service_ok, "images")
|
30
|
+
]
|
31
|
+
@buckets_list_body = <<-EOBuckets
|
32
|
+
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
|
33
|
+
<ListAllMyBucketsResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">
|
34
|
+
<Owner>
|
35
|
+
<ID>123u1odhkhfoadf</ID>
|
36
|
+
<DisplayName>JohnDoe</DisplayName>
|
37
|
+
</Owner>
|
38
|
+
<Buckets>
|
39
|
+
<Bucket>
|
40
|
+
<Name>data.example.com</Name>
|
41
|
+
<CreationDate>2009-07-02T11:56:58.000Z</CreationDate>
|
42
|
+
</Bucket>
|
43
|
+
<Bucket>
|
44
|
+
<Name>images</Name>
|
45
|
+
<CreationDate>2009-06-05T12:26:33.000Z</CreationDate>
|
46
|
+
</Bucket>
|
47
|
+
</Buckets>
|
48
|
+
</ListAllMyBucketsResult>
|
49
|
+
EOBuckets
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_buckets_and_parse_buckets_empty
|
53
|
+
stub(@response_ok).body { @buckets_empty_list_body }
|
54
|
+
|
55
|
+
expected = @buckets_empty_list
|
56
|
+
actual = @service_ok.buckets
|
57
|
+
assert_equal expected.length, actual.length
|
58
|
+
assert_equal expected, actual
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_buckets_and_parse_buckets
|
62
|
+
stub(@response_ok).body { @buckets_list_body }
|
63
|
+
|
64
|
+
expected = @buckets_list
|
65
|
+
# ugly hack
|
66
|
+
actual = @service_ok.buckets(true).map { |obj| obj }
|
67
|
+
assert_equal expected, actual
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_buckets_reload
|
71
|
+
stub(@response_ok).body { @buckets_empty_list_body }
|
72
|
+
|
73
|
+
expected = @buckets_empty_list
|
74
|
+
assert @service_ok.buckets, "retrive buckets"
|
75
|
+
actual = @service_ok.buckets
|
76
|
+
assert_equal expected.length, actual.length, "deliver from cache"
|
77
|
+
|
78
|
+
stub(@response_ok).body { @buckets_list_body }
|
79
|
+
expected = @buckets_empty_list
|
80
|
+
actual = @service_ok.buckets
|
81
|
+
assert_equal expected.length, actual.length, "deliver from cache"
|
82
|
+
|
83
|
+
expected = @buckets_list
|
84
|
+
actual = @service_ok.buckets(true)
|
85
|
+
assert_equal expected.length, actual.length
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_buckets_build
|
89
|
+
stub(@connection_ok).request { flunk "should not connect to server" }
|
90
|
+
|
91
|
+
expected = "bucket_name"
|
92
|
+
actual = @service_ok.buckets.build("bucket_name")
|
93
|
+
assert_kind_of S3::Bucket, actual
|
94
|
+
assert_equal expected, actual.name
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_buckets_find_first
|
98
|
+
stub(@response_ok).body { @buckets_list_body }
|
99
|
+
|
100
|
+
assert_nothing_raised do
|
101
|
+
actual = @service_ok.buckets.find_first("data.example.com")
|
102
|
+
assert_equal "data.example.com", actual.name
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_buckets_find_first_fail
|
107
|
+
stub(@response_ok).body { @buckets_list_body }
|
108
|
+
|
109
|
+
assert_raises S3::Error::NoSuchBucket do
|
110
|
+
@service_ok.buckets.find_first("data2.example.com")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_buckets_find_all_on_empty_list
|
115
|
+
stub(@response_ok).body { @buckets_empty_list_body }
|
116
|
+
|
117
|
+
assert_nothing_raised do
|
118
|
+
expected = @buckets_empty_list
|
119
|
+
actual = @service_ok.buckets.find_all
|
120
|
+
assert_equal expected, actual
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_buckets_find_all
|
125
|
+
stub(@response_ok).body { @buckets_list_body }
|
126
|
+
|
127
|
+
assert_nothing_raised do
|
128
|
+
expected = @buckets_list
|
129
|
+
actual = @service_ok.buckets.find_all
|
130
|
+
assert_equal expected, actual
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SignatureTest < Test::Unit::TestCase
|
4
|
+
# from http://docs.amazonwebservices.com/AmazonS3/latest/RESTAuthentication.html
|
5
|
+
def test_signature_for_object_get
|
6
|
+
request = Net::HTTP::Get.new("/photos/puppy.jpg")
|
7
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
8
|
+
request["date"] = "Tue, 27 Mar 2007 19:36:42 +0000"
|
9
|
+
|
10
|
+
actual = S3::Signature.generate(
|
11
|
+
:host => request["host"],
|
12
|
+
:request => request,
|
13
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
14
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
15
|
+
)
|
16
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:xXjDGYUmKxnwqr5KXNPGldn5LbA="
|
17
|
+
assert_equal expected, actual
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_signature_for_object_put
|
21
|
+
request = Net::HTTP::Put.new("/photos/puppy.jpg");
|
22
|
+
request["content-type"] = "image/jpeg"
|
23
|
+
request["content-length"] = "94328"
|
24
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
25
|
+
request["date"] = "Tue, 27 Mar 2007 21:15:45 +0000"
|
26
|
+
|
27
|
+
actual = S3::Signature.generate(
|
28
|
+
:host => request["host"],
|
29
|
+
:request => request,
|
30
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
31
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
32
|
+
)
|
33
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:hcicpDDvL9SsO6AkvxqmIWkmOuQ="
|
34
|
+
assert_equal expected, actual
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_signature_for_list
|
38
|
+
request = Net::HTTP::Get.new("/?prefix=photos&max-keys=50&marker=puppy");
|
39
|
+
request["user-agent"] = "Mozilla/5.0"
|
40
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
41
|
+
request["date"] = "Tue, 27 Mar 2007 19:42:41 +0000"
|
42
|
+
|
43
|
+
actual = S3::Signature.generate(
|
44
|
+
:host => request["host"],
|
45
|
+
:request => request,
|
46
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
47
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
48
|
+
)
|
49
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:jsRt/rhG+Vtp88HrYL706QhE4w4="
|
50
|
+
assert_equal expected, actual
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_signature_for_fetch
|
54
|
+
request = Net::HTTP::Get.new("/?acl");
|
55
|
+
request["host"] = "johnsmith.s3.amazonaws.com"
|
56
|
+
request["date"] = "Tue, 27 Mar 2007 19:44:46 +0000"
|
57
|
+
|
58
|
+
actual = S3::Signature.generate(
|
59
|
+
:host => request["host"],
|
60
|
+
:request => request,
|
61
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
62
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
63
|
+
)
|
64
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:thdUi9VAkzhkniLj96JIrOPGi0g="
|
65
|
+
assert_equal expected, actual
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_signature_for_delete
|
69
|
+
request = Net::HTTP::Delete.new("/johnsmith/photos/puppy.jpg");
|
70
|
+
request["user-agent"] = "dotnet"
|
71
|
+
request["host"] = "s3.amazonaws.com"
|
72
|
+
request["date"] = "Tue, 27 Mar 2007 21:20:27 +0000"
|
73
|
+
request["x-amz-date"] = "Tue, 27 Mar 2007 21:20:26 +0000"
|
74
|
+
|
75
|
+
actual = S3::Signature.generate(
|
76
|
+
:host => request["host"],
|
77
|
+
:request => request,
|
78
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
79
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
80
|
+
)
|
81
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:k3nL7gH3+PadhTEVn5Ip83xlYzk="
|
82
|
+
assert_equal expected, actual
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_signature_for_upload
|
86
|
+
request = Net::HTTP::Put.new("/db-backup.dat.gz");
|
87
|
+
request["user-agent"] = "curl/7.15.5"
|
88
|
+
request["host"] = "static.johnsmith.net:8080"
|
89
|
+
request["date"] = "Tue, 27 Mar 2007 21:06:08 +0000"
|
90
|
+
request["x-amz-acl"] = "public-read"
|
91
|
+
request["content-type"] = "application/x-download"
|
92
|
+
request["content-MD5"] = "4gJE4saaMU4BqNR0kLY+lw=="
|
93
|
+
# TODO:
|
94
|
+
# was:
|
95
|
+
#request["x-amz-meta-reviewedby"] = "joe@johnsmith.net"
|
96
|
+
#request["x-amz-meta-reviewedby"] = "jane@johnsmith.net"
|
97
|
+
request["x-amz-meta-reviewedby"] = "joe@johnsmith.net,jane@johnsmith.net"
|
98
|
+
request["x-amz-meta-filechecksum"] = "0x02661779"
|
99
|
+
request["x-amz-meta-checksumalgorithm"] = "crc32"
|
100
|
+
request["content-disposition"] = "attachment; filename=database.dat"
|
101
|
+
request["content-encoding"] = "gzip"
|
102
|
+
request["content-length"] = "5913339"
|
103
|
+
|
104
|
+
actual = S3::Signature.generate(
|
105
|
+
:host => "static.johnsmith.net",
|
106
|
+
:request => request,
|
107
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
108
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
109
|
+
)
|
110
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:C0FlOtU8Ylb9KDTpZqYkZPX91iI="
|
111
|
+
assert_equal expected, actual
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_signature_for_list_all_my_buckets
|
115
|
+
request = Net::HTTP::Get.new("/");
|
116
|
+
request["host"] = "s3.amazonaws.com"
|
117
|
+
request["date"] = "Wed, 28 Mar 2007 01:29:59 +0000"
|
118
|
+
|
119
|
+
actual = S3::Signature.generate(
|
120
|
+
:host => request["host"],
|
121
|
+
:request => request,
|
122
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
123
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
124
|
+
)
|
125
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:Db+gepJSUbZKwpx1FR0DLtEYoZA="
|
126
|
+
assert_equal expected, actual
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_signature_for_unicode_keys
|
130
|
+
request = Net::HTTP::Get.new("/dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re");
|
131
|
+
request["host"] = "s3.amazonaws.com"
|
132
|
+
request["date"] = "Wed, 28 Mar 2007 01:49:49 +0000"
|
133
|
+
|
134
|
+
actual = S3::Signature.generate(
|
135
|
+
:host => request["host"],
|
136
|
+
:request => request,
|
137
|
+
:access_key_id => "0PN5J17HBGZHT7JJ3X82",
|
138
|
+
:secret_access_key => "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o"
|
139
|
+
)
|
140
|
+
expected = "AWS 0PN5J17HBGZHT7JJ3X82:dxhSBHoI6eVSPcXJqEghlUzZMnY="
|
141
|
+
assert_equal expected, actual
|
142
|
+
end
|
143
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: qoobaa-s3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- "Jakub Ku\xC5\xBAma"
|
8
|
+
- "Miros\xC5\x82aw Boruta"
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2009-07-03 00:00:00 -07:00
|
14
|
+
default_executable: s3cmd.rb
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description:
|
18
|
+
email: qoobaa@gmail.com
|
19
|
+
executables:
|
20
|
+
- s3cmd.rb
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files:
|
24
|
+
- LICENSE
|
25
|
+
- README.rdoc
|
26
|
+
files:
|
27
|
+
- .document
|
28
|
+
- .gitignore
|
29
|
+
- LICENSE
|
30
|
+
- README.rdoc
|
31
|
+
- Rakefile
|
32
|
+
- VERSION
|
33
|
+
- bin/s3cmd.rb
|
34
|
+
- lib/s3.rb
|
35
|
+
- lib/s3/bucket.rb
|
36
|
+
- lib/s3/connection.rb
|
37
|
+
- lib/s3/exceptions.rb
|
38
|
+
- lib/s3/object.rb
|
39
|
+
- lib/s3/roxy/moxie.rb
|
40
|
+
- lib/s3/roxy/proxy.rb
|
41
|
+
- lib/s3/service.rb
|
42
|
+
- lib/s3/signature.rb
|
43
|
+
- s3.gemspec
|
44
|
+
- test/bucket_test.rb
|
45
|
+
- test/connection_test.rb
|
46
|
+
- test/s3_test.rb
|
47
|
+
- test/service_test.rb
|
48
|
+
- test/signature_test.rb
|
49
|
+
- test/test_helper.rb
|
50
|
+
has_rdoc: false
|
51
|
+
homepage: http://github.com/qoobaa/s3
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options:
|
54
|
+
- --charset=UTF-8
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.2.0
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Library for accessing S3 objects and buckets, with command line tool
|
76
|
+
test_files:
|
77
|
+
- test/s3_test.rb
|
78
|
+
- test/bucket_test.rb
|
79
|
+
- test/service_test.rb
|
80
|
+
- test/signature_test.rb
|
81
|
+
- test/connection_test.rb
|
82
|
+
- test/test_helper.rb
|