uber-s3 0.1.1 → 0.1.2
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/README.md +33 -1
- data/lib/uber-s3/bucket.rb +1 -1
- data/lib/uber-s3/connection/em_http_fibered.rb +5 -3
- data/lib/uber-s3/connection/net_http.rb +2 -1
- data/lib/uber-s3/connection.rb +7 -3
- data/lib/uber-s3/object.rb +1 -2
- data/lib/uber-s3/version.rb +1 -1
- data/lib/uber-s3.rb +1 -0
- metadata +46 -44
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
A simple, but very fast, S3 client written in Ruby supporting
|
4
4
|
synchronous and asynchronous HTTP communication.
|
5
5
|
|
6
|
+
|
6
7
|
## Examples
|
7
8
|
|
8
9
|
```ruby
|
@@ -24,6 +25,7 @@ s3 = UberS3.new({
|
|
24
25
|
##########################################################################
|
25
26
|
# Saving objects
|
26
27
|
s3.store('/test.txt', 'Look ma no hands')
|
28
|
+
s3.store('test2.txt', 'Hey hey', :access => :public_read)
|
27
29
|
|
28
30
|
o = s3.object('/test.txt')
|
29
31
|
o.value = 'Look ma no hands'
|
@@ -31,7 +33,7 @@ o.save
|
|
31
33
|
|
32
34
|
# or..
|
33
35
|
|
34
|
-
o = UberS3::Object.new(
|
36
|
+
o = UberS3::Object.new(s3.bucket, '/test.txt', 'heyo')
|
35
37
|
o.save # => true
|
36
38
|
|
37
39
|
|
@@ -116,7 +118,37 @@ s3.objects('/path').each {|obj| puts obj }
|
|
116
118
|
* Query string authentication -- neat feature for providing temporary public access to a private object
|
117
119
|
* Object versioning support
|
118
120
|
|
121
|
+
## Benchmarks
|
122
|
+
|
123
|
+
Benchmarks were run with a speedy MBP on a 10Mbit connection
|
124
|
+
|
125
|
+
### Saving lots of 1KB files
|
126
|
+
|
127
|
+
<pre>
|
128
|
+
user system total real
|
129
|
+
saving 100x1024 byte objects (net-http) 0.160000 0.080000 0.240000 ( 26.128499)
|
130
|
+
saving 100x1024 byte objects (em-http-fibered) 0.080000 0.030000 0.110000 ( 0.917334)
|
131
|
+
</pre>
|
132
|
+
|
133
|
+
### Saving lots of 500KB files
|
134
|
+
|
135
|
+
<pre>
|
136
|
+
user system total real
|
137
|
+
saving 100x512000 byte objects (net-http) 0.190000 0.740000 0.930000 ( 91.559123)
|
138
|
+
saving 100x512000 byte objects (em-http-fibered) 0.230000 0.700000 0.930000 ( 45.119033)
|
139
|
+
</pre>
|
140
|
+
|
141
|
+
### Conclusion
|
142
|
+
|
143
|
+
Yea... async adapter dominates. The 100x1KB files were 29x faster to upload, and the 100x500KB files were only 2x faster, but that is because my upload bandwidth was tapped.
|
144
|
+
|
145
|
+
|
119
146
|
## S3 API Docs
|
120
147
|
|
121
148
|
- S3 REST API: http://docs.amazonwebservices.com/AmazonS3/latest/API/
|
122
149
|
- S3 Request Authorization: http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html
|
150
|
+
|
151
|
+
|
152
|
+
## License
|
153
|
+
|
154
|
+
MIT License - Copyright (c) 2011 Nulayer Inc.
|
data/lib/uber-s3/bucket.rb
CHANGED
@@ -56,7 +56,7 @@ class UberS3
|
|
56
56
|
# response = bucket.connection.get("/?prefix=#{CGI.escape(key)}&marker=#{marker}&max-keys=2")
|
57
57
|
|
58
58
|
if response[:status] != 200
|
59
|
-
raise UberS3Error
|
59
|
+
raise UberS3Error, response.inspect
|
60
60
|
else
|
61
61
|
@objects = parse_contents(response[:body])
|
62
62
|
end
|
@@ -10,13 +10,15 @@ module UberS3::Connection
|
|
10
10
|
params = {}
|
11
11
|
params[:head] = headers
|
12
12
|
params[:body] = body if body
|
13
|
-
|
13
|
+
# params[:keepalive] = true if persistent # causing issues ...?
|
14
|
+
|
14
15
|
r = EM::HttpRequest.new(url).send(verb, params)
|
15
|
-
|
16
|
+
|
16
17
|
{
|
17
18
|
:status => r.response_header.status,
|
18
19
|
:header => r.response_header,
|
19
|
-
:body => r.response
|
20
|
+
:body => r.response,
|
21
|
+
:raw => r
|
20
22
|
}
|
21
23
|
end
|
22
24
|
|
data/lib/uber-s3/connection.rb
CHANGED
@@ -17,13 +17,14 @@ class UberS3
|
|
17
17
|
|
18
18
|
class Adapter
|
19
19
|
|
20
|
-
attr_accessor :client, :access_key, :secret_access_key, :persistent
|
20
|
+
attr_accessor :client, :access_key, :secret_access_key, :persistent, :defaults
|
21
21
|
|
22
22
|
def initialize(client, options={})
|
23
23
|
self.client = client
|
24
24
|
self.access_key = options[:access_key]
|
25
25
|
self.secret_access_key = options[:secret_access_key]
|
26
26
|
self.persistent = options[:persistent] || true
|
27
|
+
self.defaults = options[:defaults] || {}
|
27
28
|
end
|
28
29
|
|
29
30
|
[:get, :post, :put, :delete, :head].each do |verb|
|
@@ -35,10 +36,13 @@ class UberS3
|
|
35
36
|
# Default headers
|
36
37
|
headers['Date'] = Time.now.httpdate if !headers.keys.include?('Date')
|
37
38
|
headers['User-Agent'] ||= "UberS3 v#{UberS3::VERSION}"
|
38
|
-
headers['Connection'] = (persistent ? 'keep-alive' : 'close')
|
39
|
+
# headers['Connection'] = (persistent ? 'keep-alive' : 'close')
|
39
40
|
|
40
41
|
if body
|
41
|
-
|
42
|
+
mime_type = MIME::Types.type_for(path).first
|
43
|
+
|
44
|
+
headers['Content-Type'] ||= mime_type.content_type if mime_type
|
45
|
+
headers['Content-Type'] ||= 'binary/octet-stream'
|
42
46
|
headers['Content-Length'] ||= body.bytesize.to_s
|
43
47
|
end
|
44
48
|
|
data/lib/uber-s3/object.rb
CHANGED
@@ -19,7 +19,7 @@ class UberS3
|
|
19
19
|
self.key = key
|
20
20
|
self.value = value
|
21
21
|
|
22
|
-
options.each {|k,v| self.send((k.to_s+'=').to_sym, v) }
|
22
|
+
bucket.connection.defaults.merge(options).each {|k,v| self.send((k.to_s+'=').to_sym, v) }
|
23
23
|
end
|
24
24
|
|
25
25
|
def to_s
|
@@ -43,7 +43,6 @@ class UberS3
|
|
43
43
|
headers['Content-Disposition'] = content_disposition
|
44
44
|
headers['Content-Encoding'] = content_encoding
|
45
45
|
headers['Content-Length'] = size.to_s
|
46
|
-
headers['Content-MD5'] = content_md5
|
47
46
|
headers['Content-Type'] = content_type
|
48
47
|
headers['Expires'] = expires
|
49
48
|
|
data/lib/uber-s3/version.rb
CHANGED
data/lib/uber-s3.rb
CHANGED
metadata
CHANGED
@@ -1,50 +1,56 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: uber-s3
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Peter Kieltyka
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
date: 2011-10-17 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mime-types
|
16
|
+
requirement: &70154944646920 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.16'
|
22
|
+
type: :runtime
|
18
23
|
prerelease: false
|
19
|
-
|
24
|
+
version_requirements: *70154944646920
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70154944646480 !ruby/object:Gem::Requirement
|
20
28
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
25
33
|
type: :development
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
34
|
prerelease: false
|
30
|
-
|
35
|
+
version_requirements: *70154944646480
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70154944645900 !ruby/object:Gem::Requirement
|
31
39
|
none: false
|
32
|
-
requirements:
|
40
|
+
requirements:
|
33
41
|
- - ~>
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: 2.
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.7.0
|
36
44
|
type: :development
|
37
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70154944645900
|
38
47
|
description: A simple & very fast S3 client supporting sync and async communication
|
39
|
-
email:
|
48
|
+
email:
|
40
49
|
- peter@nulayer.com
|
41
50
|
executables: []
|
42
|
-
|
43
51
|
extensions: []
|
44
|
-
|
45
52
|
extra_rdoc_files: []
|
46
|
-
|
47
|
-
files:
|
53
|
+
files:
|
48
54
|
- README.md
|
49
55
|
- lib/uber-s3/authorization.rb
|
50
56
|
- lib/uber-s3/bucket.rb
|
@@ -67,33 +73,29 @@ files:
|
|
67
73
|
- lib/uber-s3/util/xml_document.rb
|
68
74
|
- lib/uber-s3/version.rb
|
69
75
|
- lib/uber-s3.rb
|
70
|
-
has_rdoc: true
|
71
76
|
homepage: http://github.com/nulayer/uber-s3
|
72
77
|
licenses: []
|
73
|
-
|
74
78
|
post_install_message:
|
75
79
|
rdoc_options: []
|
76
|
-
|
77
|
-
require_paths:
|
80
|
+
require_paths:
|
78
81
|
- lib
|
79
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
83
|
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version:
|
85
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
89
|
none: false
|
87
|
-
requirements:
|
88
|
-
- -
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
90
93
|
version: 1.3.6
|
91
94
|
requirements: []
|
92
|
-
|
93
95
|
rubyforge_project:
|
94
|
-
rubygems_version: 1.
|
96
|
+
rubygems_version: 1.8.11
|
95
97
|
signing_key:
|
96
98
|
specification_version: 3
|
97
99
|
summary: A simple & very fast S3 client supporting sync and async communication
|
98
100
|
test_files: []
|
99
|
-
|
101
|
+
has_rdoc:
|