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 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: