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.
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