s3 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +4 -1
- data/extra/s3_paperclip.rb +1 -0
- data/lib/s3.rb +0 -1
- data/lib/s3/bucket.rb +23 -8
- data/lib/s3/connection.rb +1 -4
- data/lib/s3/parser.rb +4 -0
- data/lib/s3/service.rb +2 -6
- data/lib/s3/signature.rb +1 -3
- data/lib/s3/version.rb +1 -1
- data/s3.gemspec +1 -0
- metadata +26 -20
- data/lib/s3/request.rb +0 -31
data/Gemfile.lock
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
s3 (0.3.
|
4
|
+
s3 (0.3.6)
|
5
|
+
http_connection
|
5
6
|
proxies
|
6
7
|
|
7
8
|
GEM
|
8
9
|
remote: http://rubygems.org/
|
9
10
|
specs:
|
11
|
+
http_connection (1.3.1)
|
10
12
|
mocha (0.9.8)
|
11
13
|
rake
|
12
14
|
proxies (0.2.1)
|
@@ -18,6 +20,7 @@ PLATFORMS
|
|
18
20
|
|
19
21
|
DEPENDENCIES
|
20
22
|
bundler (>= 1.0.0)
|
23
|
+
http_connection
|
21
24
|
mocha
|
22
25
|
proxies
|
23
26
|
s3!
|
data/extra/s3_paperclip.rb
CHANGED
data/lib/s3.rb
CHANGED
data/lib/s3/bucket.rb
CHANGED
@@ -57,10 +57,16 @@ module S3
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
# Saves the newly built bucket.
|
61
|
-
#
|
62
|
-
|
63
|
-
|
60
|
+
# Saves the newly built bucket.
|
61
|
+
#
|
62
|
+
# ==== Options
|
63
|
+
# * <tt>:location</tt> - location of the bucket
|
64
|
+
# (<tt>:eu</tt> or <tt>us</tt>)
|
65
|
+
# * Any other options are passed through to
|
66
|
+
# Connection#request
|
67
|
+
def save(options = {})
|
68
|
+
options = {:location => options} unless options.is_a?(Hash)
|
69
|
+
create_bucket_configuration(options)
|
64
70
|
true
|
65
71
|
end
|
66
72
|
|
@@ -97,13 +103,22 @@ module S3
|
|
97
103
|
attr_writer :service
|
98
104
|
|
99
105
|
def location_constraint
|
100
|
-
response = bucket_request(:get, :params => {
|
106
|
+
response = bucket_request(:get, :params => {:location => nil})
|
101
107
|
parse_location_constraint(response.body)
|
102
108
|
end
|
103
109
|
|
104
110
|
def list_bucket(options = {})
|
105
111
|
response = bucket_request(:get, :params => options)
|
106
112
|
objects_attributes = parse_list_bucket_result(response.body)
|
113
|
+
|
114
|
+
# If there are more than 1000 objects S3 truncates listing
|
115
|
+
# and we need to request another listing for the remaining objects.
|
116
|
+
while parse_is_truncated(response.body)
|
117
|
+
marker = objects_attributes.last[:key]
|
118
|
+
response = bucket_request(:get, :params => options.merge(:marker => marker))
|
119
|
+
objects_attributes += parse_list_bucket_result(response.body)
|
120
|
+
end
|
121
|
+
|
107
122
|
objects_attributes.map { |object_attributes| Object.send(:new, self, object_attributes) }
|
108
123
|
end
|
109
124
|
|
@@ -117,9 +132,9 @@ module S3
|
|
117
132
|
end
|
118
133
|
end
|
119
134
|
|
120
|
-
def create_bucket_configuration(
|
121
|
-
location = location.to_s.upcase if location
|
122
|
-
options
|
135
|
+
def create_bucket_configuration(options = {})
|
136
|
+
location = options[:location].to_s.upcase if options[:location]
|
137
|
+
options[:headers] ||= {}
|
123
138
|
if location and location != "US"
|
124
139
|
options[:body] = "<CreateBucketConfiguration><LocationConstraint>#{location}</LocationConstraint></CreateBucketConfiguration>"
|
125
140
|
options[:headers][:content_type] = "application/xml"
|
data/lib/s3/connection.rb
CHANGED
@@ -21,8 +21,6 @@ module S3
|
|
21
21
|
# * <tt>:proxy</tt> - Hash for Net::HTTP Proxy settings
|
22
22
|
# { :host => "proxy.mydomain.com", :port => "80, :user => "user_a", :password => "secret" }
|
23
23
|
# * <tt>:proxy</tt> - Hash for Net::HTTP Proxy settings
|
24
|
-
# * <tt>:chunk_size</tt> - Size of a chunk when streaming
|
25
|
-
# (1048576 (1 MiB) by default)
|
26
24
|
def initialize(options = {})
|
27
25
|
@access_key_id = options.fetch(:access_key_id)
|
28
26
|
@secret_access_key = options.fetch(:secret_access_key)
|
@@ -30,7 +28,6 @@ module S3
|
|
30
28
|
@debug = options.fetch(:debug, false)
|
31
29
|
@timeout = options.fetch(:timeout, 60)
|
32
30
|
@proxy = options.fetch(:proxy, nil)
|
33
|
-
@chunk_size = options.fetch(:chunk_size, 1048576)
|
34
31
|
end
|
35
32
|
|
36
33
|
# Makes request with given HTTP method, sets missing parameters,
|
@@ -67,7 +64,7 @@ module S3
|
|
67
64
|
end
|
68
65
|
|
69
66
|
path = URI.escape(path)
|
70
|
-
request =
|
67
|
+
request = Net::HTTPGenericRequest.new(method.to_s.upcase, !!body, true, path)
|
71
68
|
|
72
69
|
headers = self.class.parse_headers(headers)
|
73
70
|
headers.each do |key, value|
|
data/lib/s3/parser.rb
CHANGED
data/lib/s3/service.rb
CHANGED
@@ -22,15 +22,12 @@ module S3
|
|
22
22
|
# (false by default)
|
23
23
|
# * <tt>:timeout</tt> - Timeout to use by the Net::HTTP object
|
24
24
|
# (60 by default)
|
25
|
-
# * <tt>:chunk_size</tt> - Size of a chunk when streaming
|
26
|
-
# (1048576 (1 MiB) by default)
|
27
25
|
def initialize(options)
|
28
26
|
@access_key_id = options.fetch(:access_key_id)
|
29
27
|
@secret_access_key = options.fetch(:secret_access_key)
|
30
28
|
@use_ssl = options.fetch(:use_ssl, false)
|
31
29
|
@timeout = options.fetch(:timeout, 60)
|
32
30
|
@debug = options.fetch(:debug, false)
|
33
|
-
@chunk_size = options.fetch(:chunk_size, 1048576)
|
34
31
|
|
35
32
|
raise ArgumentError, "Missing proxy settings. Must specify at least :host." if options[:proxy] && !options[:proxy][:host]
|
36
33
|
@proxy = options.fetch(:proxy, nil)
|
@@ -39,7 +36,7 @@ module S3
|
|
39
36
|
# Returns all buckets in the service and caches the result (see
|
40
37
|
# +reload+)
|
41
38
|
def buckets
|
42
|
-
Proxy.new(lambda { list_all_my_buckets}, :owner => self, :extend => BucketsExtension)
|
39
|
+
Proxy.new(lambda { list_all_my_buckets }, :owner => self, :extend => BucketsExtension)
|
43
40
|
end
|
44
41
|
|
45
42
|
# Returns "http://" or "https://", depends on <tt>:use_ssl</tt>
|
@@ -77,8 +74,7 @@ module S3
|
|
77
74
|
:use_ssl => @use_ssl,
|
78
75
|
:timeout => @timeout,
|
79
76
|
:debug => @debug,
|
80
|
-
:proxy => @proxy
|
81
|
-
:chunk_size => @chunk_size)
|
77
|
+
:proxy => @proxy)
|
82
78
|
end
|
83
79
|
@connection
|
84
80
|
end
|
data/lib/s3/signature.rb
CHANGED
@@ -25,9 +25,7 @@ module S3
|
|
25
25
|
request = options[:request]
|
26
26
|
access_key_id = options[:access_key_id]
|
27
27
|
|
28
|
-
options.merge!(:headers => request,
|
29
|
-
:method => request.method,
|
30
|
-
:resource => request.path)
|
28
|
+
options.merge!(:headers => request, :method => request.method, :resource => request.path)
|
31
29
|
|
32
30
|
signature = canonicalized_signature(options)
|
33
31
|
|
data/lib/s3/version.rb
CHANGED
data/s3.gemspec
CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.rubyforge_project = "s3"
|
17
17
|
|
18
18
|
s.add_dependency "proxies"
|
19
|
+
s.add_dependency "http_connection"
|
19
20
|
s.add_development_dependency "test-unit", ">= 2.0"
|
20
21
|
s.add_development_dependency "mocha"
|
21
22
|
s.add_development_dependency "bundler", ">= 1.0.0"
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 25
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
8
|
+
- 6
|
9
|
+
version: 0.3.6
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- "Jakub Ku\xC5\xBAma"
|
@@ -15,68 +14,77 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-09 00:00:00 +02:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
21
|
+
name: proxies
|
22
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
23
|
none: false
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
hash: 3
|
28
27
|
segments:
|
29
28
|
- 0
|
30
29
|
version: "0"
|
31
30
|
type: :runtime
|
32
|
-
name: proxies
|
33
31
|
prerelease: false
|
34
32
|
version_requirements: *id001
|
35
33
|
- !ruby/object:Gem::Dependency
|
34
|
+
name: http_connection
|
36
35
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
36
|
none: false
|
38
37
|
requirements:
|
39
38
|
- - ">="
|
40
39
|
- !ruby/object:Gem::Version
|
41
|
-
hash: 3
|
42
40
|
segments:
|
43
|
-
- 2
|
44
41
|
- 0
|
45
|
-
version: "
|
46
|
-
type: :
|
47
|
-
name: test-unit
|
42
|
+
version: "0"
|
43
|
+
type: :runtime
|
48
44
|
prerelease: false
|
49
45
|
version_requirements: *id002
|
50
46
|
- !ruby/object:Gem::Dependency
|
47
|
+
name: test-unit
|
51
48
|
requirement: &id003 !ruby/object:Gem::Requirement
|
52
49
|
none: false
|
53
50
|
requirements:
|
54
51
|
- - ">="
|
55
52
|
- !ruby/object:Gem::Version
|
56
|
-
hash: 3
|
57
53
|
segments:
|
54
|
+
- 2
|
58
55
|
- 0
|
59
|
-
version: "0"
|
56
|
+
version: "2.0"
|
60
57
|
type: :development
|
61
|
-
name: mocha
|
62
58
|
prerelease: false
|
63
59
|
version_requirements: *id003
|
64
60
|
- !ruby/object:Gem::Dependency
|
61
|
+
name: mocha
|
65
62
|
requirement: &id004 !ruby/object:Gem::Requirement
|
66
63
|
none: false
|
67
64
|
requirements:
|
68
65
|
- - ">="
|
69
66
|
- !ruby/object:Gem::Version
|
70
|
-
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: *id004
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: bundler
|
75
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
71
80
|
segments:
|
72
81
|
- 1
|
73
82
|
- 0
|
74
83
|
- 0
|
75
84
|
version: 1.0.0
|
76
85
|
type: :development
|
77
|
-
name: bundler
|
78
86
|
prerelease: false
|
79
|
-
version_requirements: *
|
87
|
+
version_requirements: *id005
|
80
88
|
description: "S3 library provides access to Amazon's Simple Storage Service. It supports both: European and US buckets through REST API."
|
81
89
|
email:
|
82
90
|
- qoobaa@gmail.com
|
@@ -103,7 +111,6 @@ files:
|
|
103
111
|
- lib/s3/object.rb
|
104
112
|
- lib/s3/objects_extension.rb
|
105
113
|
- lib/s3/parser.rb
|
106
|
-
- lib/s3/request.rb
|
107
114
|
- lib/s3/service.rb
|
108
115
|
- lib/s3/signature.rb
|
109
116
|
- lib/s3/version.rb
|
@@ -128,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
135
|
requirements:
|
129
136
|
- - ">="
|
130
137
|
- !ruby/object:Gem::Version
|
131
|
-
hash:
|
138
|
+
hash: 4530267442220315944
|
132
139
|
segments:
|
133
140
|
- 0
|
134
141
|
version: "0"
|
@@ -137,7 +144,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
144
|
requirements:
|
138
145
|
- - ">="
|
139
146
|
- !ruby/object:Gem::Version
|
140
|
-
hash: 23
|
141
147
|
segments:
|
142
148
|
- 1
|
143
149
|
- 3
|
data/lib/s3/request.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module S3
|
2
|
-
# Class responsible for sending chunked requests
|
3
|
-
# properly. Net::HTTPGenericRequest has hardcoded chunk_size, so we
|
4
|
-
# inherit the class and override chunk_size.
|
5
|
-
class Request < Net::HTTPGenericRequest
|
6
|
-
def initialize(chunk_size, m, reqbody, resbody, path, initheader = nil)
|
7
|
-
@chunk_size = chunk_size
|
8
|
-
super(m, reqbody, resbody, path, initheader)
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def send_request_with_body_stream(sock, ver, path, f)
|
14
|
-
unless content_length() or chunked?
|
15
|
-
raise ArgumentError, "Content-Length not given and Transfer-Encoding is not `chunked'"
|
16
|
-
end
|
17
|
-
supply_default_content_type
|
18
|
-
write_header sock, ver, path
|
19
|
-
if chunked?
|
20
|
-
while s = f.read(@chunk_size)
|
21
|
-
sock.write(sprintf("%x\r\n", s.length) << s << "\r\n")
|
22
|
-
end
|
23
|
-
sock.write "0\r\n\r\n"
|
24
|
-
else
|
25
|
-
while s = f.read(@chunk_size)
|
26
|
-
sock.write s
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|