uber-s3 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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(client.bucket, '/test.txt', 'heyo')
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.
@@ -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
 
@@ -15,7 +15,8 @@ module UberS3::Connection
15
15
  {
16
16
  :status => r.code.to_i,
17
17
  :header => r.header.to_hash,
18
- :body => r.body
18
+ :body => r.body,
19
+ :raw => r
19
20
  }
20
21
  end
21
22
 
@@ -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
- headers['Content-Type'] ||= 'application/octet-stream'
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
 
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  class UberS3
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
data/lib/uber-s3.rb CHANGED
@@ -4,6 +4,7 @@ require 'openssl'
4
4
  require 'forwardable'
5
5
  require 'base64'
6
6
  require 'digest/md5'
7
+ require 'mime/types'
7
8
 
8
9
  class UberS3
9
10
  extend Forwardable
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
- date: 2011-06-01 00:00:00 -04:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: rake
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
- requirement: &id001 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id002 !ruby/object:Gem::Requirement
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.6.0
42
+ - !ruby/object:Gem::Version
43
+ version: 2.7.0
36
44
  type: :development
37
- version_requirements: *id002
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: "0"
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.6.2
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: