hobo-inviqa 0.0.6 → 0.0.7.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|