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.
Files changed (60) hide show
  1. checksums.yaml +15 -0
  2. data/.editorconfig +10 -0
  3. data/Gemfile.lock +7 -3
  4. data/Guardfile +2 -2
  5. data/Hobofile +5 -1
  6. data/bin/hobo +12 -18
  7. data/hobo.gemspec +2 -0
  8. data/lib/hobo.rb +8 -1
  9. data/lib/hobo/cli.rb +14 -4
  10. data/lib/hobo/config/file.rb +1 -1
  11. data/lib/hobo/error_handlers/debug.rb +5 -2
  12. data/lib/hobo/error_handlers/exit_code_map.rb +16 -0
  13. data/lib/hobo/error_handlers/friendly.rb +13 -8
  14. data/lib/hobo/errors.rb +11 -1
  15. data/lib/hobo/helper/http_download.rb +41 -0
  16. data/lib/hobo/helper/shell.rb +21 -5
  17. data/lib/hobo/helper/vm_command.rb +127 -17
  18. data/lib/hobo/lib/host_check.rb +20 -6
  19. data/lib/hobo/lib/host_check/deps.rb +22 -4
  20. data/lib/hobo/lib/host_check/git.rb +41 -17
  21. data/lib/hobo/lib/host_check/ruby.rb +30 -20
  22. data/lib/hobo/lib/host_check/vagrant.rb +37 -6
  23. data/lib/hobo/lib/s3sync.rb +23 -40
  24. data/lib/hobo/lib/seed/project.rb +8 -1
  25. data/lib/hobo/lib/seed/seed.rb +15 -3
  26. data/lib/hobo/patches/slop.rb +21 -2
  27. data/lib/hobo/tasks/assets.rb +32 -20
  28. data/lib/hobo/tasks/config.rb +15 -0
  29. data/lib/hobo/tasks/deps.rb +29 -4
  30. data/lib/hobo/tasks/seed.rb +1 -1
  31. data/lib/hobo/tasks/system.rb +15 -0
  32. data/lib/hobo/tasks/system/completions.rb +76 -0
  33. data/lib/hobo/tasks/tools.rb +10 -6
  34. data/lib/hobo/tasks/vm.rb +74 -6
  35. data/lib/hobo/ui.rb +27 -10
  36. data/lib/hobo/util.rb +36 -2
  37. data/lib/hobo/version.rb +2 -2
  38. data/spec/hobo/asset_applicator_spec.rb +2 -2
  39. data/spec/hobo/cli_spec.rb +35 -24
  40. data/spec/hobo/config/file_spec.rb +1 -3
  41. data/spec/hobo/error_handlers/debug_spec.rb +39 -5
  42. data/spec/hobo/error_handlers/friendly_spec.rb +38 -21
  43. data/spec/hobo/help_formatter_spec.rb +3 -3
  44. data/spec/hobo/helpers/file_locator_spec.rb +2 -2
  45. data/spec/hobo/helpers/shell_spec.rb +2 -2
  46. data/spec/hobo/helpers/vm_command_spec.rb +36 -24
  47. data/spec/hobo/lib/s3sync_spec.rb +6 -3
  48. data/spec/hobo/lib/seed/project_spec.rb +2 -3
  49. data/spec/hobo/lib/seed/replacer_spec.rb +1 -2
  50. data/spec/hobo/lib/seed/seed_spec.rb +2 -3
  51. data/spec/hobo/logging_spec.rb +2 -2
  52. data/spec/hobo/metadata_spec.rb +2 -2
  53. data/spec/hobo/null_spec.rb +2 -2
  54. data/spec/hobo/paths_spec.rb +1 -2
  55. data/spec/hobo/ui_spec.rb +104 -20
  56. data/spec/hobo/util_spec.rb +75 -0
  57. data/spec/spec_helper.rb +1 -0
  58. metadata +43 -49
  59. data/lib/hobo/tasks/console.rb +0 -18
  60. 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
@@ -0,0 +1,10 @@
1
+ ; EditorConfig is awesome: http://EditorConfig.org
2
+ root = true ; top-most EditorConfig file
3
+
4
+ [*]
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
data/Gemfile.lock CHANGED
@@ -1,16 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hobo-inviqa (0.0.6)
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.0)
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.20)
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/lib/#{m[1]}_spec.rb" }
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
@@ -31,4 +31,8 @@ namespace :test do
31
31
  task 'argument-test', [ :test ] do |task, args|
32
32
  Hobo.ui.info args[:test]
33
33
  end
34
- end
34
+
35
+ task 'unparsed' do |task|
36
+ Hobo.ui.info task.opts[:_unparsed]
37
+ end
38
+ end
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
- on '--ansi', 'Enable / disable ansi output' do |*args|
44
- Hobo.ui.use_color self.to_hash[:ansi]
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::Cli.new(slop: slop).start
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/console'
74
+ require 'hobo/tasks/config'
67
75
  require 'hobo/tasks/debug'
68
76
  require 'hobo/tasks/deps'
69
- require 'hobo/tasks/host'
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
@@ -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.respond_to? :unwrap
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
- raise error
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
- return 7
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
- end
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