s3_multi_upload 0.0.2 → 0.0.4

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/bin/s3_multi_upload CHANGED
@@ -11,8 +11,9 @@ module S3_Multi_Upload
11
11
  method_option :bucket, :required => true
12
12
  method_option :file, :required => true
13
13
  method_option :threads, :required => true, :type => :numeric, :default => 5
14
- method_option :chunk_size, :required => true, :type => :hash, :default => {10 => :mb}
14
+ method_option :chunk_size, :required => true, :type => :hash, :default => {10 => 'mb'}
15
15
  method_option :progress_bar, :type => :boolean, :default => true
16
+ method_option :checksum, :type => :boolean, :default => true
16
17
  method_option :key, :desc => 's3 object key (default: file name)'
17
18
 
18
19
  def upload
@@ -1,10 +1,11 @@
1
1
  require 'pathname'
2
2
  require 'aws-sdk'
3
3
  require 'progressbar'
4
+ require 'base64'
4
5
 
5
6
  module S3_Multi_Upload
6
7
  class Upload
7
- attr_accessor :options, :file, :s3, :bucket, :object, :progress
8
+ attr_accessor :options, :file, :queue, :mutex, :s3, :bucket, :object, :progress
8
9
 
9
10
  def initialize options
10
11
 
@@ -13,6 +14,8 @@ module S3_Multi_Upload
13
14
 
14
15
  @options = options
15
16
  @file = Pathname.new options[:file]
17
+ @queue = Queue.new
18
+ @mutex = Mutex.new
16
19
 
17
20
  @s3 = AWS::S3.new
18
21
  @bucket = @s3.buckets.create options[:bucket]
@@ -38,10 +41,6 @@ module S3_Multi_Upload
38
41
  normalize *options[:chunk_size].first
39
42
  end
40
43
 
41
- def queue
42
- @queue ||= Queue.new
43
- end
44
-
45
44
  def enqueue
46
45
  (file.size.to_f / chunk_size).ceil.times do |index|
47
46
  queue << [chunk_size * index, index + 1]
@@ -50,24 +49,35 @@ module S3_Multi_Upload
50
49
 
51
50
  def upload
52
51
  object.multipart_upload do |upload|
53
- threads = []
54
-
55
- options[:threads].times do
56
- threads << Thread.new do
52
+ options[:threads].times.collect do
53
+ Thread.new do
57
54
  until queue.empty?
58
55
  offset, index = queue.deq :asynchronously rescue nil
59
56
 
60
57
  unless offset.nil?
61
- upload.add_part :data => file.read(chunk_size, offset),
62
- :part_number => index
58
+ upload_parameters = {
59
+ :data => file.read(chunk_size, offset),
60
+ :part_number => index,
61
+ }
62
+
63
+ if options[:checksum]
64
+ digest = Digest::MD5.digest(upload_parameters[:data])
65
+ encoded_digest = Base64.encode64(digest).strip
63
66
 
64
- progress.inc if options[:progress_bar]
67
+ upload_parameters[:content_md5] = encoded_digest
68
+ end
69
+
70
+ upload.add_part upload_parameters
71
+
72
+ if options[:progress_bar]
73
+ mutex.synchronize do
74
+ progress.inc
75
+ end
76
+ end
65
77
  end
66
78
  end
67
79
  end
68
- end
69
-
70
- threads.each &:join
80
+ end.each(&:join)
71
81
  end
72
82
  end
73
83
 
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3_multi_upload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - dallas marlow
9
+ - michael pilat
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-08-03 00:00:00.000000000 Z
13
+ date: 2013-01-20 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: aws-sdk
@@ -62,6 +63,7 @@ dependencies:
62
63
  description:
63
64
  email:
64
65
  - dallasmarlow@gmail.com
66
+ - mike@mikepilat.com
65
67
  executables:
66
68
  - s3_multi_upload
67
69
  extensions: []
@@ -89,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
91
  version: '0'
90
92
  requirements: []
91
93
  rubyforge_project:
92
- rubygems_version: 1.8.24
94
+ rubygems_version: 1.8.23
93
95
  signing_key:
94
96
  specification_version: 3
95
97
  summary: s3 multipart uploads in parallel