boxen 3.0.0.beta1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +0 -1
  3. data/README.md +1 -1
  4. data/boxen.gemspec +13 -13
  5. data/lib/boxen/check.rb +39 -8
  6. data/lib/boxen/cli.rb +45 -19
  7. data/lib/boxen/config.rb +61 -43
  8. data/lib/boxen/flags.rb +282 -0
  9. data/lib/boxen/hook.rb +8 -15
  10. data/lib/boxen/hook/github_issue.rb +120 -0
  11. data/lib/boxen/hook/web.rb +56 -0
  12. data/lib/boxen/keychain.rb +1 -1
  13. data/lib/boxen/postflight/env.rb +1 -1
  14. data/lib/boxen/preflight.rb +7 -4
  15. data/lib/boxen/preflight/creds.rb +47 -8
  16. data/lib/boxen/preflight/identity.rb +0 -2
  17. data/lib/boxen/preflight/os.rb +6 -2
  18. data/lib/boxen/puppeteer.rb +121 -0
  19. data/lib/boxen/runner.rb +149 -0
  20. data/script/bootstrap +1 -1
  21. data/script/tests +0 -1
  22. data/test/boxen/test.rb +1 -1
  23. data/test/boxen_check_test.rb +55 -0
  24. data/test/boxen_cli_test.rb +31 -8
  25. data/test/boxen_config_test.rb +31 -1
  26. data/test/boxen_directories_test.rb +4 -4
  27. data/test/boxen_flags_test.rb +217 -0
  28. data/test/{postflight/boxen_postflight_github_issue_test.rb → boxen_hook_github_issue_test.rb} +82 -72
  29. data/test/{postflight/boxen_postflight_web_hook_test.rb → boxen_hook_web_test.rb} +11 -12
  30. data/test/{postflight/boxen_postflight_active_test.rb → boxen_postflight_active_test.rb} +3 -3
  31. data/test/{postflight/boxen_postflight_env_test.rb → boxen_postflight_env_test.rb} +0 -0
  32. data/test/boxen_preflight_creds_test.rb +177 -0
  33. data/test/{preflight/boxen_preflight_etc_my_cnf_test.rb → boxen_preflight_etc_my_cnf_test.rb} +1 -1
  34. data/test/{preflight/boxen_preflight_rvm_test.rb → boxen_preflight_rvm_test.rb} +1 -1
  35. data/test/boxen_puppeteer_test.rb +101 -0
  36. data/test/boxen_runner_test.rb +171 -0
  37. metadata +172 -251
  38. data/lib/boxen/command.rb +0 -142
  39. data/lib/boxen/command/help.rb +0 -40
  40. data/lib/boxen/command/preflight.rb +0 -38
  41. data/lib/boxen/command/project.rb +0 -49
  42. data/lib/boxen/command/project/install.rb +0 -33
  43. data/lib/boxen/command/run.rb +0 -199
  44. data/lib/boxen/command/service.rb +0 -61
  45. data/lib/boxen/command/service/disable.rb +0 -15
  46. data/lib/boxen/command/service/enable.rb +0 -15
  47. data/lib/boxen/command/service/restart.rb +0 -24
  48. data/lib/boxen/command/version.rb +0 -29
  49. data/lib/boxen/command_status.rb +0 -15
  50. data/lib/boxen/postflight/github_issue.rb +0 -124
  51. data/lib/boxen/postflight/hooks.rb +0 -16
  52. data/lib/boxen/postflight/web_hook.rb +0 -63
  53. data/lib/boxen/preflight/facts.rb +0 -36
  54. data/lib/boxen/preflight/homebrew.rb +0 -13
  55. data/lib/boxen/preflight/offline.rb +0 -33
  56. data/lib/boxen/preflight/update.rb +0 -109
  57. data/lib/boxen/util/logging.rb +0 -59
  58. data/lib/boxen/version.rb +0 -3
  59. data/lib/system_timer.rb +0 -13
  60. data/test/boxen_command_test.rb +0 -93
  61. data/test/boxen_hook_test.rb +0 -25
  62. data/test/command/help_test.rb +0 -49
  63. data/test/command/project/install_test.rb +0 -34
  64. data/test/command/project_test.rb +0 -32
  65. data/test/command/run_test.rb +0 -21
  66. data/test/command/service/disable_test.rb +0 -49
  67. data/test/command/service/enable_test.rb +0 -49
  68. data/test/command/service/restart_test.rb +0 -53
  69. data/test/command/service_test.rb +0 -55
  70. data/test/command/version_test.rb +0 -15
  71. data/test/preflight/boxen_preflight_creds_test.rb +0 -82
  72. data/test/preflight/boxen_preflight_homebrew_test.rb +0 -10
  73. data/test/system_timer.rb +0 -10
@@ -1,109 +0,0 @@
1
- require "boxen/preflight"
2
-
3
- class Boxen::Preflight::Update < Boxen::Preflight
4
- def ok?
5
- if config.offline?
6
- warn "Skipping update because we're offline."
7
-
8
- elsif no_pull?
9
- debug "Skipping update because we were asked to by the --no-pull flag"
10
-
11
- elsif !on_branch?
12
- warn "Boxen not on a branch (ref: #{ref}), cannot update!"
13
-
14
- elsif !on_master_branch?
15
- local_branch = current_branch.rpartition("/").last
16
- warn "Boxen on a non-master branch '#{local_branch}', cannot update!"
17
-
18
- elsif !fast_forwardable?
19
- warn "Boxen has unpushed changes, cannot update!"
20
-
21
- elsif !clean_tree?
22
- warn "Boxen repo has untracked or uncommitted changes, cannot update!"
23
-
24
- else
25
- update!
26
- end
27
-
28
- true
29
- end
30
-
31
- def run
32
- abort "Auto-update of Boxen FAILED, please fix manually."
33
- end
34
-
35
- private
36
-
37
- def ref
38
- %x(git log -1 --pretty=format:%h)
39
- end
40
-
41
- def fetch
42
- "git fetch --quiet origin"
43
- end
44
-
45
- def reset_hard
46
- "git reset --hard origin/master 2>&1 >/dev/null"
47
- end
48
-
49
- def clean
50
- "git clean -qdf"
51
- end
52
-
53
- def update_boxen_checkout
54
- %x(#{reset} && #{clean})
55
- $? == 0
56
- end
57
-
58
- def on_branch?
59
- !current_branch.empty?
60
- end
61
-
62
- def on_master_branch?
63
- current_branch == "refs/heads/master"
64
- end
65
-
66
- def clean_tree?
67
- %x(git status --porcelain).chomp.empty?
68
- end
69
-
70
- def upstream_changes?
71
- %x(git rev-list --count HEAD..origin/master).chomp != "0"
72
- end
73
-
74
- def no_pull?
75
- ARGV.any? { |arg| arg == "--no-pull" }
76
- end
77
-
78
- def fast_forwardable?
79
- %x(git rev-list --count origin/master..master).chomp == "0"
80
- end
81
-
82
- def current_branch
83
- @current_branch ||= %x(git symbolic-ref HEAD).chomp
84
- end
85
-
86
- def update!
87
- info "Updating boxen..."
88
- fetch
89
-
90
- if !upstream_changes?
91
- info "Boxen is up-to-date with origin/master"
92
-
93
- elsif update_boxen_checkout
94
- info "Successfully updated to #{ref}"
95
- rerun_boxen
96
-
97
- else
98
- warn "Failed to auto-update!"
99
- false
100
- end
101
- end
102
-
103
- def rerun_boxen
104
- command = "#{$0} #{ARGV.join ' '} --no-pull"
105
- debug "Re-running boxen:"
106
- debug " #{command.inspect}"
107
- exec command
108
- end
109
- end
@@ -1,59 +0,0 @@
1
- require "ansi"
2
-
3
- module Boxen
4
- module Util
5
- module Logging
6
-
7
- # A fancier `abort` and `warn`. This will probably really annoy
8
- # someone at some point because it's overriding a Kernel method,
9
- # but it's limited to checks.
10
-
11
- alias :fail :abort
12
-
13
- def abort(message, *extras)
14
- extras << { :color => :red, :stream => $stderr }
15
- log "FAIL: #{message}", *extras
16
- exit 1
17
- end
18
-
19
- def warn(message, *extras)
20
- extras << { :color => :yellow, :stream => $stderr }
21
- log "--> #{message}", *extras
22
- end
23
-
24
- def info(message, *extras)
25
- extras << { :color => :cyan }
26
- log "--> #{message}", *extras
27
- end
28
-
29
- def debug(message, *extras)
30
- if debug?
31
- extras << { :color => :white }
32
- log " DEBUG: #{message}", *extras
33
- end
34
- end
35
-
36
- def log(message, *extras)
37
- options = Hash === extras.last ? extras.pop : {}
38
-
39
- stream = options[:stream] || $stdout
40
-
41
- if color = options[:color]
42
- stream.puts ANSI.send(color) { message }
43
- else
44
- stream.puts message
45
- end
46
-
47
- unless extras.empty?
48
- extras.each { |line| stream.puts " #{line}" }
49
- end
50
- end
51
-
52
- def debug?
53
- false
54
- end
55
-
56
-
57
- end
58
- end
59
- end
@@ -1,3 +0,0 @@
1
- module Boxen
2
- VERSION = "3.0.0.beta1"
3
- end
@@ -1,13 +0,0 @@
1
- # Faraday helpfully reminds you to install `system_timer` if you're
2
- # running Ruby 1.8, since Timeout can give unreliable results. We
3
- # can't do this during first-time runs, since there's no C compiler
4
- # available.
5
- #
6
- # To squash the message and stop confusing people, this shim just
7
- # exposes Timeout as SystemTimer. I'm a bad person.
8
-
9
-
10
- if (!defined?(RUBY_ENGINE) || "ruby" == RUBY_ENGINE) && RUBY_VERSION < '1.9'
11
- require "timeout"
12
- SystemTimer = Timeout
13
- end
@@ -1,93 +0,0 @@
1
- require "boxen/command"
2
-
3
- class Failing < Boxen::Check
4
- def initialize(*args); end
5
- def ok?; false; end
6
- def run; warn "lol this fails in ur face"; end
7
- end
8
-
9
- class Boxen::Command::Foo < Boxen::Command
10
- def run
11
- puts "foo"
12
- Boxen::CommandStatus.new(0)
13
- end
14
- end
15
-
16
- class Boxen::Command::Barnette < Boxen::Command
17
- preflight Failing
18
-
19
- def run
20
- puts "bar"
21
- Boxen::CommandStatus.new(0)
22
- end
23
- end
24
-
25
- class Boxen::Command::Atmos < Boxen::Command
26
- postflight Failing
27
-
28
- def run
29
- puts "hello, cindarella"
30
- Boxen::CommandStatus.new(0)
31
- end
32
- end
33
-
34
- describe Boxen::Command do
35
- before do
36
- @config = Minitest::Mock.new
37
- def @config.debug?; false; end
38
- end
39
-
40
- it "registers commands and shoves them into a hash, and can invoke them" do
41
- Boxen::Command.register :foo, Boxen::Command::Foo
42
-
43
- stdout, _ = capture_io do
44
- Boxen::Command.invoke :foo, @config
45
- end
46
-
47
- assert_match "foo", stdout
48
- end
49
-
50
- it "fails with UnknownCommandError if the invoked command is not registered" do
51
- assert_raises Boxen::Command::UnknownCommandError do
52
- Boxen::Command.invoke :random_command
53
- end
54
- end
55
-
56
- it "fails with UnknownCommandError if the invoked command is nil" do
57
- assert_raises Boxen::Command::UnknownCommandError do
58
- Boxen::Command.invoke nil
59
- end
60
- end
61
-
62
- it "registers command aliases" do
63
- Boxen::Command.register :foo, Boxen::Command::Foo, :bar
64
-
65
- stdout, _ = capture_io do
66
- Boxen::Command.invoke :bar, @config
67
- end
68
-
69
- assert_match "foo", stdout
70
- end
71
-
72
- it "executes preflight hooks" do
73
- Boxen::Command.register :barnette, Boxen::Command::Barnette
74
-
75
- stdout, stderr = capture_io do
76
- Boxen::Command.invoke :barnette, @config
77
- end
78
-
79
- assert_match "lol this fails in ur face", stderr
80
- refute_match "bar", stdout
81
- end
82
-
83
- it "executes postflight hooks" do
84
- Boxen::Command.register :atmos, Boxen::Command::Atmos
85
-
86
- stdout, stderr = capture_io do
87
- Boxen::Command.invoke :atmos, @config
88
- end
89
-
90
- assert_match "lol this fails in ur face", stderr
91
- assert_match "hello, cindarella", stdout
92
- end
93
- end
@@ -1,25 +0,0 @@
1
- require "boxen/hook"
2
-
3
- class DatHook < Boxen::Hook
4
- def enabled?
5
- true
6
- end
7
-
8
- def run
9
- puts "yolo"
10
- end
11
- end
12
-
13
- describe Boxen::Hook do
14
-
15
- it "registers hooks and executes them" do
16
- Boxen::Hook.register DatHook
17
-
18
- stdout, _ = capture_io do
19
- Boxen::Hook.run
20
- end
21
-
22
- assert_equal "yolo\n", stdout
23
- end
24
-
25
- end
@@ -1,49 +0,0 @@
1
- require "boxen/command/help"
2
-
3
- class FooBar
4
- def self.detailed_help
5
- "okay fine I'll help you"
6
- end
7
-
8
- def self.help
9
- "help yourself"
10
- end
11
- end
12
-
13
- class BarBaz
14
- def self.help
15
- "no you"
16
- end
17
- end
18
-
19
- describe Boxen::Command::Help do
20
- before do
21
- @config = mock("config")
22
-
23
- Boxen::Command.reset!
24
- Boxen::Command.register :foo_bar, FooBar
25
- Boxen::Command.register :bar_baz, BarBaz
26
- Boxen::Command.register :help, Boxen::Command::Help
27
- end
28
-
29
- after do
30
- Boxen::Command.reset!
31
- end
32
-
33
- it "can write help for all commands" do
34
- stdout, _ = capture_io do
35
- Boxen::Command.invoke(:help, @config)
36
- end
37
-
38
- assert_match " foo_bar help yourself", stdout
39
- assert_match " bar_baz no you", stdout
40
- end
41
-
42
- it "can write detailed help for a single command" do
43
- stdout, _ = capture_io do
44
- Boxen::Command.invoke(:help, @config, "foo_bar")
45
- end
46
-
47
- assert_match "okay fine I'll help you", stdout
48
- end
49
- end
@@ -1,34 +0,0 @@
1
- require "boxen/command/project/install"
2
- require "tmpdir"
3
-
4
- describe Boxen::Command::Project::Install do
5
- before do
6
- @config = mock("config")
7
- end
8
-
9
- describe "#run" do
10
- before do
11
- Boxen::Command.expects(:invoke).with('run', @config)
12
- end
13
-
14
- it "installs a single project" do
15
- Dir.mktmpdir { |dir|
16
- @config.stubs(:repodir).returns(dir)
17
- Boxen::Command::Project::Install.new(@config, 'awesome-project').run
18
-
19
- projects = File.read("#{dir}/.projects")
20
- assert_equal projects, "awesome-project"
21
- }
22
- end
23
-
24
- it "installs multiple projects" do
25
- Dir.mktmpdir { |dir|
26
- @config.stubs(:repodir).returns(dir)
27
- Boxen::Command::Project::Install.new(@config, 'awesome-project', 'better-project').run
28
-
29
- projects = File.read("#{dir}/.projects")
30
- assert_equal projects, "awesome-project,better-project"
31
- }
32
- end
33
- end
34
- end
@@ -1,32 +0,0 @@
1
- require "boxen/command/project"
2
-
3
- describe Boxen::Command::Project do
4
- before do
5
- @config = mock("config")
6
- end
7
-
8
- describe "#run" do
9
- before do
10
- @config.stubs(:projects).returns([
11
- mock("project-a", :name => "puppet-boxen"),
12
- mock("project-b", :name => "puppet-ruby")
13
- ])
14
- end
15
-
16
- it "displays the projects we know about" do
17
- stdout, _ = capture_io do
18
- Boxen::Command::Project.new(@config).run
19
- end
20
-
21
- assert_equal stdout, <<-EOS
22
- Boxen knows about the following projects:
23
-
24
- puppet-boxen
25
- puppet-ruby
26
-
27
- You can install any of them by running \"boxen project:install <project>\"
28
-
29
- EOS
30
- end
31
- end
32
- end
@@ -1,21 +0,0 @@
1
- require "boxen/command/run"
2
-
3
- describe Boxen::Command::Run do
4
- before do
5
- @config = mock("config")
6
- end
7
-
8
- it "should enable puppet reports" do
9
- command = Boxen::Command::Run.new(@config, "--report")
10
- assert command.report?
11
- end
12
- it "should enable puppet profiling" do
13
- command = Boxen::Command::Run.new(@config, "--profile")
14
- assert command.profile?
15
- end
16
-
17
- it "should enable puppet's future parser" do
18
- command = Boxen::Command::Run.new(@config, "--future-parser")
19
- assert command.future_parser?
20
- end
21
- end