s3up 0.1.0

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.
Files changed (3) hide show
  1. data/bin/s3up +28 -0
  2. data/lib/s3up.rb +78 -0
  3. metadata +104 -0
data/bin/s3up ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'trollop'
5
+ require 's3up'
6
+
7
+ options = Trollop::options do
8
+ opt :verbose, "verbose logging"
9
+ opt :'generate-manifest', "create a json manifest file"
10
+ opt :dump, "show the manifest output"
11
+ opt :folder, "folders to include", :default => '**'
12
+ opt :types, "file types to include", :default => 'jpg,mp3'
13
+ opt :manifest, 'specify file name for the json manifest', :default => 'manifest.json', :type => :string
14
+ opt :bucket, 'destination bucket', :type => :string
15
+ opt :prefix, 'destination key prefix', :type => :string
16
+ opt :id, 'aws access key id', :type => :string
17
+ opt :key, 'aws secret access key', :type => :string
18
+ opt :threads, 'number of upload threads', :default => 5, :type => :int
19
+ opt :force, 'force upload'
20
+ end
21
+
22
+ s3up = S3up.new( options )
23
+
24
+ if options[ :'generate-manifest' ]
25
+ s3up.generate_manifest
26
+ else
27
+ s3up.upload
28
+ end
data/lib/s3up.rb ADDED
@@ -0,0 +1,78 @@
1
+ require 'rubygems'
2
+ require 'aws'
3
+ require 'work_queue'
4
+ require 'mime/types'
5
+ require 'json'
6
+ require 'yaml'
7
+
8
+ class S3up
9
+
10
+ def initialize( options = {} )
11
+ setup_options( options )
12
+ @work_queue = WorkQueue.new( @options[ :threads ] )
13
+ glob = "#{ @options[ :folder ] }/*.{#{ @options[ :types ] }}"
14
+ @files = Dir.glob( glob, File::FNM_CASEFOLD )
15
+ end
16
+
17
+ def overwrite_options( options )
18
+ options.each { | key, value | @options[ key.to_sym ] = value if value }
19
+ end
20
+
21
+ def load_options( file )
22
+ if File.exists?( File.expand_path( file ) )
23
+ options = YAML.load_file( File.expand_path( file ) )
24
+ overwrite_options( options )
25
+ end
26
+ end
27
+
28
+ def setup_options( options )
29
+ @options = {}
30
+ load_options( '~/.s3uprc' )
31
+ load_options( './.s3uprc' )
32
+ overwrite_options( options )
33
+ puts @options if @options[ :verbose ]
34
+ end
35
+
36
+ def upload_file( bucket_name, filename, key_name = filename )
37
+ s3 = Aws::S3.new( @options[ :id ], @options[ :key ], :connection_mode => :per_thread )
38
+ bucket = s3.bucket( bucket_name )
39
+ key = Aws::S3::Key.create( bucket ,key_name )
40
+ key.put( File.open( filename ).read, 'public-read' )
41
+ puts "uploaded: #{ key.full_name }" if @options[ :verbose ]
42
+ rescue Exception => e
43
+ puts e
44
+ end
45
+
46
+ def create_bucket( bucket_name )
47
+ s3 = Aws::S3.new( @options[ :id ], @options[ :key ] )
48
+ bucket = s3.bucket( bucket_name, true, 'public-read' )
49
+ rescue Exception => e
50
+ puts e
51
+ end
52
+
53
+ def upload
54
+ create_bucket( @options[ :bucket ] )
55
+ @files.each do | file |
56
+ @work_queue.enqueue_b {
57
+ dest_key = "#{ @options[ :prefix ] }#{ file }"
58
+ upload_file( @options[ :bucket ], file, dest_key )
59
+ }
60
+ end
61
+ @work_queue.join
62
+ end
63
+
64
+ def generate_manifest
65
+ items = @files.map do | file |
66
+ stat = File.stat( file )
67
+ {
68
+ :uri => "http://#{ @options[ :bucket ] }.s3.amazonaws.com/#{ @options[ :prefix ] }#{ file }",
69
+ :size => stat.size,
70
+ :type => MIME::Types.of( file ).first
71
+ }
72
+ end
73
+ File.open( @options[ :manifest ], 'w' ) do | file |
74
+ file.puts( JSON.pretty_generate( { :objects => items } ) )
75
+ end
76
+ end
77
+
78
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s3up
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - James Prudente
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-01-11 00:00:00.000000000 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: trollop
17
+ requirement: &2153277080 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2153277080
26
+ - !ruby/object:Gem::Dependency
27
+ name: work_queue
28
+ requirement: &2153276520 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *2153276520
37
+ - !ruby/object:Gem::Dependency
38
+ name: aws
39
+ requirement: &2153275920 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *2153275920
48
+ - !ruby/object:Gem::Dependency
49
+ name: mime-types
50
+ requirement: &2153275360 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *2153275360
59
+ - !ruby/object:Gem::Dependency
60
+ name: json
61
+ requirement: &2153274720 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: *2153274720
70
+ description: Directory recursive multithreaded s3 uploader
71
+ email: opensource@dashwire.com
72
+ executables:
73
+ - s3up
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - lib/s3up.rb
78
+ - bin/s3up
79
+ has_rdoc: true
80
+ homepage: http://rubygems.org/gems/s3up
81
+ licenses: []
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 1.6.2
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: S3 uploader
104
+ test_files: []