sublimate 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ module Sublimate
2
+ #todo: This seems like it could just be IO objects that map to portions of a file
3
+ class ChunkedFile
4
+ def initialize(path, opts={})
5
+ @path = path
6
+ @chunk_size = opts[:chunk_size] || (1024 * 1024 * 6)
7
+ end
8
+
9
+ def each_chunk
10
+ counter = 0
11
+ offset = 0
12
+ file_size = File.size(@path)
13
+ while offset < file_size
14
+ data = IO.read(@path, @chunk_size, offset)
15
+ details = {:counter => counter }
16
+ yield(data, details)
17
+ offset += @chunk_size
18
+ counter += 1
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,63 @@
1
+ module Sublimate
2
+ class Uploader
3
+ def initialize(attrs)
4
+ @attrs = attrs
5
+
6
+ fog_attrs = attrs.clone
7
+ fog_attrs.delete(:auto_create_bucket)
8
+ fog_attrs.delete(:multipart_chunk_size)
9
+ fog_attrs.delete(:bucket)
10
+
11
+ @fog_storage = Fog::Storage.new(fog_attrs)
12
+ end
13
+
14
+ def storage
15
+ @fog_storage
16
+ end
17
+
18
+ def store_file(path, opts = {})
19
+ opts = {:key => path}.merge(opts)
20
+ size = File.size(path)
21
+
22
+ bucket = @fog_storage.directories.get(opts[:bucket])
23
+ if bucket.nil? && @attrs[:auto_create_bucket]
24
+ bucket = @fog_storage.directories.create(:key => opts[:bucket])
25
+ elsif bucket.nil?
26
+ raise "bucket not found"
27
+ end
28
+
29
+ m = "do_multi_#{@attrs[:provider].downcase}"
30
+ if respond_to?(m)
31
+ chunked = ChunkedFile.new(path, :chunk_size => @attrs[:multipart_chunk_size])
32
+ send(m, bucket, chunked, opts)
33
+ else
34
+ opts[:body] = File.open(path)
35
+ bucket.files.create(opts)
36
+ end
37
+ end
38
+
39
+ def do_multi_aws(bucket, chunked, opts)
40
+ multi = @fog_storage.initiate_multipart_upload(opts[:bucket], opts[:key])
41
+ upload_id = multi.body["UploadId"]
42
+ results = []
43
+ chunked.each_chunk do |data, details|
44
+ part = @fog_storage.upload_part(opts[:bucket], opts[:key], upload_id, details[:counter] + 1, data)
45
+ etag = part.headers['ETag']
46
+ results << etag
47
+ end
48
+
49
+ completed_upload = @fog_storage.complete_multipart_upload(opts[:bucket], opts[:key], upload_id, results)
50
+ end
51
+
52
+ def do_multi_rackspace(bucket, chunked, opts)
53
+ count = 1
54
+ chunked.each_chunk do |data, details|
55
+ key = opts[:key] + "/#{count}"
56
+ bucket.files.create(:key => key, :body => data)
57
+ count += 1
58
+ end
59
+ result = @fog_storage.put_object_manifest(bucket.identity, opts[:key])
60
+ end
61
+
62
+ end
63
+ end
data/lib/sublimate.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'fog'
2
+ # rackspace cloud: http://www.rackspace.com/knowledge_center/index.php/Does_Cloud_Files_support_large_file_transfer
3
+ # s3: https://gist.github.com/908875
4
+ # Google Storage apparently allows single PUTs up to 50GB
5
+ module Sublimate
6
+ end
7
+ require 'sublimate/chunked_file'
8
+ require 'sublimate/uploader'
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sublimate
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kurt Mackey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-26 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Store ginormous files on S3 or the Rackspace Cloud using this gem.
15
+ email: mrkurt@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/sublimate.rb
21
+ - lib/sublimate/chunked_file.rb
22
+ - lib/sublimate/uploader.rb
23
+ homepage: https://github.com/mrkurt/sublimate
24
+ licenses: []
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 1.8.10
44
+ signing_key:
45
+ specification_version: 3
46
+ summary: Fog with large files
47
+ test_files: []