hobo-inviqa 0.0.6 → 0.0.7.pre.rc1
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.
- checksums.yaml +15 -0
- data/.editorconfig +10 -0
- data/Gemfile.lock +7 -3
- data/Guardfile +2 -2
- data/Hobofile +5 -1
- data/bin/hobo +12 -18
- data/hobo.gemspec +2 -0
- data/lib/hobo.rb +8 -1
- data/lib/hobo/cli.rb +14 -4
- data/lib/hobo/config/file.rb +1 -1
- data/lib/hobo/error_handlers/debug.rb +5 -2
- data/lib/hobo/error_handlers/exit_code_map.rb +16 -0
- data/lib/hobo/error_handlers/friendly.rb +13 -8
- data/lib/hobo/errors.rb +11 -1
- data/lib/hobo/helper/http_download.rb +41 -0
- data/lib/hobo/helper/shell.rb +21 -5
- data/lib/hobo/helper/vm_command.rb +127 -17
- data/lib/hobo/lib/host_check.rb +20 -6
- data/lib/hobo/lib/host_check/deps.rb +22 -4
- data/lib/hobo/lib/host_check/git.rb +41 -17
- data/lib/hobo/lib/host_check/ruby.rb +30 -20
- data/lib/hobo/lib/host_check/vagrant.rb +37 -6
- data/lib/hobo/lib/s3sync.rb +23 -40
- data/lib/hobo/lib/seed/project.rb +8 -1
- data/lib/hobo/lib/seed/seed.rb +15 -3
- data/lib/hobo/patches/slop.rb +21 -2
- data/lib/hobo/tasks/assets.rb +32 -20
- data/lib/hobo/tasks/config.rb +15 -0
- data/lib/hobo/tasks/deps.rb +29 -4
- data/lib/hobo/tasks/seed.rb +1 -1
- data/lib/hobo/tasks/system.rb +15 -0
- data/lib/hobo/tasks/system/completions.rb +76 -0
- data/lib/hobo/tasks/tools.rb +10 -6
- data/lib/hobo/tasks/vm.rb +74 -6
- data/lib/hobo/ui.rb +27 -10
- data/lib/hobo/util.rb +36 -2
- data/lib/hobo/version.rb +2 -2
- data/spec/hobo/asset_applicator_spec.rb +2 -2
- data/spec/hobo/cli_spec.rb +35 -24
- data/spec/hobo/config/file_spec.rb +1 -3
- data/spec/hobo/error_handlers/debug_spec.rb +39 -5
- data/spec/hobo/error_handlers/friendly_spec.rb +38 -21
- data/spec/hobo/help_formatter_spec.rb +3 -3
- data/spec/hobo/helpers/file_locator_spec.rb +2 -2
- data/spec/hobo/helpers/shell_spec.rb +2 -2
- data/spec/hobo/helpers/vm_command_spec.rb +36 -24
- data/spec/hobo/lib/s3sync_spec.rb +6 -3
- data/spec/hobo/lib/seed/project_spec.rb +2 -3
- data/spec/hobo/lib/seed/replacer_spec.rb +1 -2
- data/spec/hobo/lib/seed/seed_spec.rb +2 -3
- data/spec/hobo/logging_spec.rb +2 -2
- data/spec/hobo/metadata_spec.rb +2 -2
- data/spec/hobo/null_spec.rb +2 -2
- data/spec/hobo/paths_spec.rb +1 -2
- data/spec/hobo/ui_spec.rb +104 -20
- data/spec/hobo/util_spec.rb +75 -0
- data/spec/spec_helper.rb +1 -0
- metadata +43 -49
- data/lib/hobo/tasks/console.rb +0 -18
- data/lib/hobo/tasks/host.rb +0 -17
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTQyNTI3MmQxMzNjZTg3YjE5NmE5ZTkxZDk5NzE3NGEzZGZiN2UzNw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MGFlMTE4MTY2NTcxMWQwMDdmMzE1ODgwOTY5ODUxNTBiMmRhM2VlOA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjY3YjkzODRjOGE2ODJkZmE2MTUxMWEyMWQ0YzEyMjM5MTIxZGM3NjkyYzRm
|
10
|
+
YzRiMjQzNjAzODk0ZGM1YzcxODBhNGUyNjcxMTRlYzIwMWZhNjQzM2IxMzZl
|
11
|
+
YmZmMjliOTZlYzRlNTg5NGRlOGFiZWY4YTQ0ZGQxNTI1OTRiMTA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MTVhZjRjMDI2N2RmMjJjN2ZiODFmMjNhNmRiOGFkZDg2YTZlNWUwNGIxNzZi
|
14
|
+
YzEwMjA1YzNlZjYyNzEwOGU4YTExMTMyYTYxMjUzM2FiY2M2OTRjZmIxMmNl
|
15
|
+
MTViMWU2MDAzZDAwOTI3ZmQ0NTM4NjZlMjA0NDc3ZmNhODkxZjg=
|
data/.editorconfig
ADDED
data/Gemfile.lock
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
hobo-inviqa (0.0.
|
4
|
+
hobo-inviqa (0.0.7.pre.rc1)
|
5
5
|
aws-sdk (~> 1.34.0)
|
6
6
|
bundler (~> 1.5.2)
|
7
7
|
deepstruct (~> 0.0.5)
|
8
8
|
highline (~> 1.6.20)
|
9
|
+
os (~> 0.9.6)
|
9
10
|
rake (~> 10.1.1)
|
10
11
|
rake-hooks (~> 1.2.3)
|
11
12
|
ruby-progressbar (~> 1.4.1)
|
12
13
|
semantic (~> 1.3.0)
|
13
14
|
slop (~> 3.4.7)
|
15
|
+
teerb (~> 0.0.1)
|
14
16
|
|
15
17
|
GEM
|
16
18
|
remote: https://rubygems.org/
|
@@ -19,7 +21,7 @@ GEM
|
|
19
21
|
childprocess (>= 0.3.6)
|
20
22
|
cucumber (>= 1.1.1)
|
21
23
|
rspec-expectations (>= 2.7.0)
|
22
|
-
aws-sdk (1.34.
|
24
|
+
aws-sdk (1.34.1)
|
23
25
|
json (~> 1.4)
|
24
26
|
nokogiri (>= 1.4.4)
|
25
27
|
uuidtools (~> 2.1)
|
@@ -57,7 +59,7 @@ GEM
|
|
57
59
|
guard-rspec (4.2.6)
|
58
60
|
guard (~> 2.1)
|
59
61
|
rspec (>= 2.14, < 4.0)
|
60
|
-
highline (1.6.
|
62
|
+
highline (1.6.21)
|
61
63
|
json (1.8.1)
|
62
64
|
listen (2.5.0)
|
63
65
|
celluloid (>= 0.15.2)
|
@@ -72,6 +74,7 @@ GEM
|
|
72
74
|
nio4r (1.0.0)
|
73
75
|
nokogiri (1.6.1)
|
74
76
|
mini_portile (~> 0.5.0)
|
77
|
+
os (0.9.6)
|
75
78
|
pry (0.9.12.6)
|
76
79
|
coderay (~> 1.0)
|
77
80
|
method_source (~> 0.8)
|
@@ -94,6 +97,7 @@ GEM
|
|
94
97
|
ruby-progressbar (1.4.1)
|
95
98
|
semantic (1.3.0)
|
96
99
|
slop (3.4.7)
|
100
|
+
teerb (0.0.1)
|
97
101
|
thor (0.18.1)
|
98
102
|
timers (1.1.0)
|
99
103
|
uuidtools (2.1.4)
|
data/Guardfile
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
guard :rspec do
|
5
5
|
watch(%r{^spec/.+_spec\.rb$})
|
6
|
-
watch(%r{^lib/(.+)\.rb$}) { |m| "spec
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
7
|
watch('spec/spec_helper.rb') { "spec" }
|
8
8
|
end
|
9
9
|
|
@@ -11,4 +11,4 @@ guard 'cucumber' do
|
|
11
11
|
watch(%r{^features/.+\.feature$})
|
12
12
|
watch(%r{^features/support/.+$}) { 'features' }
|
13
13
|
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
|
14
|
-
end
|
14
|
+
end
|
data/Hobofile
CHANGED
data/bin/hobo
CHANGED
@@ -5,29 +5,21 @@ $:.push File.expand_path(File.join("..", "..", "lib"), __FILE__)
|
|
5
5
|
|
6
6
|
require 'hobo'
|
7
7
|
require 'slop'
|
8
|
+
require 'teerb'
|
9
|
+
require 'tmpdir'
|
8
10
|
|
9
11
|
error_handler = Hobo::ErrorHandlers::Friendly.new
|
12
|
+
|
10
13
|
Hobo.ui = Hobo::Ui.new
|
11
14
|
Hobo.logger = Logger.new(STDOUT)
|
12
15
|
Hobo.logger.level = Logger::WARN
|
13
|
-
Hobo.logger.formatter = proc do |severity, datetime, progname, msg|
|
14
|
-
"#{datetime.strftime("%Y-%m-%d %H:%M:%S")}: #{severity}: #{msg}\n"
|
15
|
-
end
|
16
|
-
|
17
|
-
# win32console unfortunately has issues with Open3
|
18
|
-
# Simply disabling color for now; --ansi can be explicitly passed if required
|
19
|
-
# We also take the opportunity to disable ansi for pipes
|
20
|
-
Hobo.ui.use_color false if Gem.win_platform? || !STDOUT.tty?
|
21
|
-
|
22
|
-
# win32console unfortunately has issues with Open3
|
23
|
-
# Simply disabling color for now; --ansi can be explicitly passed if required
|
24
|
-
# We also take the opportunity to disable ansi for pipes
|
25
|
-
Hobo.ui.use_color false if Gem.win_platform? || !STDOUT.tty?
|
26
16
|
|
27
17
|
# Options parsed here will be hidden from the main app
|
28
18
|
slop = Slop.parse! do
|
29
19
|
on '--debug', 'Enable debugging' do
|
30
20
|
error_handler = Hobo::ErrorHandlers::Debug.new
|
21
|
+
debug_log = File.open(File.join(Dir.tmpdir, 'hobo_debug.log'), 'w+')
|
22
|
+
Hobo.logger = Logger.new(TeeRb::IODelegate.new(STDOUT, debug_log))
|
31
23
|
Hobo.logger.level = Logger::DEBUG
|
32
24
|
end
|
33
25
|
|
@@ -39,14 +31,16 @@ slop = Slop.parse! do
|
|
39
31
|
level = self.to_hash[:'log-level'].upcase
|
40
32
|
Hobo.logger.level = Logger.const_get(level) if [ 'DEBUG', 'INFO' ].include? level
|
41
33
|
end
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
end
|
36
|
+
Hobo.logger.formatter = proc do |severity, datetime, progname, msg|
|
37
|
+
"#{datetime.strftime("%Y-%m-%d %H:%M:%S")}: #{severity}: #{msg}\n"
|
46
38
|
end
|
47
39
|
|
48
40
|
begin
|
49
|
-
Hobo::
|
41
|
+
Hobo::Lib::HostCheck.check(:filter => /not_using_system_ruby/)
|
42
|
+
Hobo.cli = Hobo::Cli.new(slop: slop)
|
43
|
+
Hobo.cli.start
|
50
44
|
rescue Exception => error
|
51
45
|
exit error_handler.handle(error)
|
52
|
-
end
|
46
|
+
end
|
data/hobo.gemspec
CHANGED
@@ -27,6 +27,8 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency "semantic", "~> 1.3.0"
|
28
28
|
spec.add_dependency "aws-sdk", "~> 1.34.0"
|
29
29
|
spec.add_dependency "ruby-progressbar", "~> 1.4.1"
|
30
|
+
spec.add_dependency "teerb", "~> 0.0.1"
|
31
|
+
spec.add_dependency "os", "~> 0.9.6"
|
30
32
|
|
31
33
|
spec.add_development_dependency "aruba", "~> 0.5.4"
|
32
34
|
spec.add_development_dependency "rspec", "~> 2.14.1"
|
data/lib/hobo.rb
CHANGED
@@ -4,6 +4,7 @@ require 'rake/hooks'
|
|
4
4
|
require 'tempfile'
|
5
5
|
require 'shellwords'
|
6
6
|
require 'deepstruct'
|
7
|
+
require 'os'
|
7
8
|
|
8
9
|
# DSL enhancements
|
9
10
|
require 'hobo/metadata'
|
@@ -16,9 +17,11 @@ require 'hobo/version'
|
|
16
17
|
require 'hobo/null'
|
17
18
|
require 'hobo/paths'
|
18
19
|
require 'hobo/errors'
|
20
|
+
require 'hobo/logging'
|
19
21
|
require 'hobo/ui'
|
20
22
|
require 'hobo/util'
|
21
23
|
require 'hobo/help_formatter'
|
24
|
+
require 'hobo/error_handlers/exit_code_map'
|
22
25
|
require 'hobo/error_handlers/debug'
|
23
26
|
require 'hobo/error_handlers/friendly'
|
24
27
|
require 'hobo/config/file'
|
@@ -26,10 +29,14 @@ require 'hobo/logging'
|
|
26
29
|
require 'hobo/config'
|
27
30
|
require 'hobo/asset_applicator'
|
28
31
|
|
32
|
+
# Asset sync
|
33
|
+
require 'hobo/lib/s3sync'
|
34
|
+
|
29
35
|
# Task helpers
|
30
36
|
require 'hobo/helper/shell'
|
31
37
|
require 'hobo/helper/file_locator'
|
32
38
|
require 'hobo/helper/vm_command'
|
39
|
+
require 'hobo/helper/http_download'
|
33
40
|
|
34
41
|
# Libs
|
35
42
|
require 'hobo/lib/seed/project'
|
@@ -44,4 +51,4 @@ require 'hobo/lib/host_check/deps'
|
|
44
51
|
require 'hobo/lib/host_check'
|
45
52
|
|
46
53
|
# App
|
47
|
-
require 'hobo/cli'
|
54
|
+
require 'hobo/cli'
|
data/lib/hobo/cli.rb
CHANGED
@@ -3,6 +3,10 @@ require 'deepstruct'
|
|
3
3
|
|
4
4
|
module Hobo
|
5
5
|
|
6
|
+
class << self
|
7
|
+
attr_accessor :cli
|
8
|
+
end
|
9
|
+
|
6
10
|
class Halt < Error
|
7
11
|
end
|
8
12
|
|
@@ -19,6 +23,7 @@ module Hobo
|
|
19
23
|
end
|
20
24
|
|
21
25
|
def start args = ARGV
|
26
|
+
|
22
27
|
load_user_config
|
23
28
|
load_builtin_tasks
|
24
29
|
load_hobofiles
|
@@ -31,6 +36,9 @@ module Hobo
|
|
31
36
|
# Parse out global args first
|
32
37
|
@slop.parse! args
|
33
38
|
opts = @slop.to_hash
|
39
|
+
|
40
|
+
Hobo::Lib::HostCheck.check(:filter => /vagrant.*|.*present/, :raise => true) unless opts[:'skip-host-checks']
|
41
|
+
|
34
42
|
@help_opts[:all] = opts[:all]
|
35
43
|
Hobo.ui.interactive = !(opts[:'non-interactive'] == true)
|
36
44
|
|
@@ -63,10 +71,11 @@ module Hobo
|
|
63
71
|
|
64
72
|
def load_builtin_tasks
|
65
73
|
require 'hobo/tasks/assets'
|
66
|
-
require 'hobo/tasks/
|
74
|
+
require 'hobo/tasks/config'
|
67
75
|
require 'hobo/tasks/debug'
|
68
76
|
require 'hobo/tasks/deps'
|
69
|
-
require 'hobo/tasks/
|
77
|
+
require 'hobo/tasks/system'
|
78
|
+
require 'hobo/tasks/system/completions'
|
70
79
|
require 'hobo/tasks/seed'
|
71
80
|
require 'hobo/tasks/vm'
|
72
81
|
require 'hobo/tasks/tools'
|
@@ -100,6 +109,7 @@ module Hobo
|
|
100
109
|
slop.on '-a', '--all', 'Show hidden commands'
|
101
110
|
slop.on '-h', '--help', 'Display help'
|
102
111
|
slop.on '--non-interactive', 'Run non-interactively. Defaults will be automatically used where possible.'
|
112
|
+
slop.on '--skip-host-checks', 'Skip host checks'
|
103
113
|
|
104
114
|
slop.on '-v', '--version', 'Print version information' do
|
105
115
|
Hobo.ui.info "Hobo version #{Hobo::VERSION}"
|
@@ -179,7 +189,7 @@ module Hobo
|
|
179
189
|
run do |opts, args|
|
180
190
|
Dir.chdir Hobo.project_path if Hobo.in_project?
|
181
191
|
raise ::Hobo::ProjectOnlyError.new if opts.project_only && !Hobo.in_project?
|
182
|
-
task.opts = opts.to_hash
|
192
|
+
task.opts = opts.to_hash.merge({:_unparsed => hobo.slop.unparsed})
|
183
193
|
raise ::Hobo::MissingArgumentsError.new(name, args, hobo) if args && task.arg_names.length > args.length
|
184
194
|
task.invoke *args
|
185
195
|
args.pop(task.arg_names.size)
|
@@ -205,4 +215,4 @@ module Hobo
|
|
205
215
|
out
|
206
216
|
end
|
207
217
|
end
|
208
|
-
end
|
218
|
+
end
|
data/lib/hobo/config/file.rb
CHANGED
@@ -5,7 +5,7 @@ module Hobo
|
|
5
5
|
module Config
|
6
6
|
class File
|
7
7
|
def self.save(file, config)
|
8
|
-
config = config.unwrap if config.
|
8
|
+
config = config.unwrap if config.public_methods.include? :unwrap
|
9
9
|
dir = ::File.dirname file
|
10
10
|
FileUtils.mkdir_p dir unless ::File.exists? dir
|
11
11
|
::File.open(file, 'w+') do |f|
|
@@ -1,9 +1,12 @@
|
|
1
1
|
module Hobo
|
2
2
|
module ErrorHandlers
|
3
3
|
class Debug
|
4
|
+
include Hobo::ErrorHandlers::ExitCodeMap
|
5
|
+
|
4
6
|
def handle error
|
5
|
-
|
7
|
+
Hobo.ui.error "\n(#{error.class}) #{error.message}\n\n#{(error.backtrace || []).join("\n")}"
|
8
|
+
return EXIT_CODES[error.class.to_s] || DEFAULT_EXIT_CODE
|
6
9
|
end
|
7
10
|
end
|
8
11
|
end
|
9
|
-
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Hobo
|
2
|
+
module ErrorHandlers
|
3
|
+
module ExitCodeMap
|
4
|
+
DEFAULT_EXIT_CODE = 128
|
5
|
+
EXIT_CODES = {
|
6
|
+
'Interrupt' => 1,
|
7
|
+
'Hobo::ExternalCommandError' => 3,
|
8
|
+
'Hobo::InvalidCommandOrOpt' => 4,
|
9
|
+
'Hobo::MissingArgumentsError' => 5,
|
10
|
+
'Hobo::UserError' => 6,
|
11
|
+
'Hobo::ProjectOnlyError' => 7,
|
12
|
+
'Hobo::HostCheckError' => 8
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -3,6 +3,8 @@ require 'tmpdir' # Needed for Dir.tmpdir
|
|
3
3
|
module Hobo
|
4
4
|
module ErrorHandlers
|
5
5
|
class Friendly
|
6
|
+
include Hobo::ErrorHandlers::ExitCodeMap
|
7
|
+
|
6
8
|
def handle error
|
7
9
|
log_file = File.join(Dir.tmpdir, 'hobo_error.log')
|
8
10
|
|
@@ -10,9 +12,13 @@ module Hobo
|
|
10
12
|
case error.class.to_s
|
11
13
|
when "Interrupt"
|
12
14
|
Hobo.ui.warning "\n\nCaught Interrupt. Aborting\n"
|
13
|
-
return 1
|
14
15
|
when "Hobo::ExternalCommandError"
|
15
16
|
FileUtils.cp error.output.path, log_file
|
17
|
+
|
18
|
+
File.open(log_file, "a") do |file|
|
19
|
+
file.write "\n(#{error.class}) #{error.message}\n\n#{error.backtrace.join("\n")}"
|
20
|
+
end
|
21
|
+
|
16
22
|
Hobo.ui.error <<-ERROR
|
17
23
|
|
18
24
|
The following external command appears to have failed (exit status #{error.exit_code}):
|
@@ -20,21 +26,19 @@ module Hobo
|
|
20
26
|
|
21
27
|
The output of the command has been logged to #{log_file}
|
22
28
|
ERROR
|
23
|
-
return 3
|
24
29
|
when "Hobo::InvalidCommandOrOpt"
|
25
30
|
Hobo.ui.error "\n#{error.message}"
|
26
31
|
Hobo.ui.info error.cli.help_formatter.help if error.cli
|
27
|
-
return 4
|
28
32
|
when "Hobo::MissingArgumentsError"
|
29
33
|
Hobo.ui.error "\n#{error.message}"
|
30
34
|
Hobo.ui.info error.cli.help_formatter.help(target: error.command) if error.cli
|
31
|
-
return 5
|
32
35
|
when "Hobo::UserError"
|
33
36
|
Hobo.ui.error "\n#{error.message}\n"
|
34
|
-
return 6
|
35
37
|
when "Hobo::ProjectOnlyError"
|
36
38
|
Hobo.ui.error "\nHobo requires you to be in a project directory for this command!\n"
|
37
|
-
|
39
|
+
when "Hobo::HostCheckError"
|
40
|
+
Hobo.ui.error "\nHobo has detected a problem with your system configuration:\n"
|
41
|
+
Hobo.ui.warning error.advice.gsub(/^/, ' ')
|
38
42
|
else
|
39
43
|
File.write(log_file, "(#{error.class}) #{error.message}\n\n#{error.backtrace.join("\n")}")
|
40
44
|
Hobo.ui.error <<-ERROR
|
@@ -44,9 +48,10 @@ module Hobo
|
|
44
48
|
|
45
49
|
The backtrace has been logged to #{log_file}
|
46
50
|
ERROR
|
47
|
-
return 128
|
48
51
|
end
|
52
|
+
|
53
|
+
return EXIT_CODES[error.class.to_s] || DEFAULT_EXIT_CODE
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
52
|
-
end
|
57
|
+
end
|
data/lib/hobo/errors.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Hobo
|
2
2
|
class Error < StandardError
|
3
|
+
attr_reader :exit_code
|
3
4
|
end
|
4
5
|
|
5
6
|
class RubyVersionError < Error
|
@@ -64,4 +65,13 @@ module Hobo
|
|
64
65
|
super("A tool that hobo depends on could not be detected (#{dep})")
|
65
66
|
end
|
66
67
|
end
|
67
|
-
|
68
|
+
|
69
|
+
class HostCheckError < Error
|
70
|
+
attr_accessor :summary, :advice
|
71
|
+
def initialize summary, advice
|
72
|
+
@summary = summary
|
73
|
+
@advice = advice
|
74
|
+
super("Host check failed: #{summary}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Hobo
|
5
|
+
module Helper
|
6
|
+
def http_download url, target_file, opts = {}
|
7
|
+
opts = { :progress => Hobo.method(:progress) }.merge(opts)
|
8
|
+
uri = URI.parse(url)
|
9
|
+
size = 0
|
10
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
11
|
+
http.use_ssl = uri.scheme == 'https'
|
12
|
+
|
13
|
+
# TODO: May want to verify SSL validity...
|
14
|
+
# http://notetoself.vrensk.com/2008/09/verified-https-in-ruby/#comment-22252
|
15
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
16
|
+
|
17
|
+
http.start do
|
18
|
+
begin
|
19
|
+
file = open(target_file, 'wb+')
|
20
|
+
http.request_get(uri.path) do |response|
|
21
|
+
size = response.content_length
|
22
|
+
response.read_body do |chunk|
|
23
|
+
file.write(chunk)
|
24
|
+
opts[:progress].call(
|
25
|
+
target_file,
|
26
|
+
chunk.length,
|
27
|
+
size,
|
28
|
+
:update
|
29
|
+
) if opts[:progress]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
ensure
|
33
|
+
opts[:progress].call(target_file, 0, size, :finsh) if opts[:progress]
|
34
|
+
file.close
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
include Hobo::Helper
|