boxen 2.9.0 → 3.0.0.beta1

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 (69) hide show
  1. data/boxen.gemspec +12 -12
  2. data/lib/boxen/check.rb +8 -39
  3. data/lib/boxen/cli.rb +19 -45
  4. data/lib/boxen/command.rb +142 -0
  5. data/lib/boxen/command/help.rb +40 -0
  6. data/lib/boxen/command/preflight.rb +38 -0
  7. data/lib/boxen/command/project.rb +49 -0
  8. data/lib/boxen/command/project/install.rb +33 -0
  9. data/lib/boxen/command/run.rb +199 -0
  10. data/lib/boxen/command/service.rb +61 -0
  11. data/lib/boxen/command/service/disable.rb +15 -0
  12. data/lib/boxen/command/service/enable.rb +15 -0
  13. data/lib/boxen/command/service/restart.rb +24 -0
  14. data/lib/boxen/command/version.rb +29 -0
  15. data/lib/boxen/command_status.rb +15 -0
  16. data/lib/boxen/config.rb +43 -61
  17. data/lib/boxen/hook.rb +15 -8
  18. data/lib/boxen/keychain.rb +1 -1
  19. data/lib/boxen/postflight/env.rb +1 -1
  20. data/lib/boxen/postflight/github_issue.rb +124 -0
  21. data/lib/boxen/postflight/hooks.rb +16 -0
  22. data/lib/boxen/postflight/web_hook.rb +63 -0
  23. data/lib/boxen/preflight.rb +4 -7
  24. data/lib/boxen/preflight/creds.rb +8 -47
  25. data/lib/boxen/preflight/facts.rb +36 -0
  26. data/lib/boxen/preflight/homebrew.rb +13 -0
  27. data/lib/boxen/preflight/identity.rb +2 -0
  28. data/lib/boxen/preflight/offline.rb +33 -0
  29. data/lib/boxen/preflight/os.rb +1 -1
  30. data/lib/boxen/preflight/update.rb +109 -0
  31. data/lib/boxen/util/logging.rb +59 -0
  32. data/lib/boxen/version.rb +3 -0
  33. data/script/bootstrap +1 -1
  34. data/script/tests +1 -0
  35. data/test/boxen/test.rb +1 -1
  36. data/test/boxen_cli_test.rb +8 -31
  37. data/test/boxen_command_test.rb +93 -0
  38. data/test/boxen_config_test.rb +1 -31
  39. data/test/boxen_directories_test.rb +4 -4
  40. data/test/boxen_hook_test.rb +25 -0
  41. data/test/command/help_test.rb +49 -0
  42. data/test/command/project/install_test.rb +34 -0
  43. data/test/command/project_test.rb +32 -0
  44. data/test/command/run_test.rb +21 -0
  45. data/test/command/service/disable_test.rb +49 -0
  46. data/test/command/service/enable_test.rb +49 -0
  47. data/test/command/service/restart_test.rb +53 -0
  48. data/test/command/service_test.rb +55 -0
  49. data/test/command/version_test.rb +15 -0
  50. data/test/{boxen_postflight_active_test.rb → postflight/boxen_postflight_active_test.rb} +3 -3
  51. data/test/{boxen_postflight_env_test.rb → postflight/boxen_postflight_env_test.rb} +0 -0
  52. data/test/{boxen_hook_github_issue_test.rb → postflight/boxen_postflight_github_issue_test.rb} +72 -82
  53. data/test/{boxen_hook_web_test.rb → postflight/boxen_postflight_web_hook_test.rb} +12 -11
  54. data/test/preflight/boxen_preflight_creds_test.rb +82 -0
  55. data/test/{boxen_preflight_etc_my_cnf_test.rb → preflight/boxen_preflight_etc_my_cnf_test.rb} +1 -1
  56. data/test/preflight/boxen_preflight_homebrew_test.rb +10 -0
  57. data/test/{boxen_preflight_rvm_test.rb → preflight/boxen_preflight_rvm_test.rb} +1 -1
  58. metadata +247 -171
  59. checksums.yaml +0 -7
  60. data/lib/boxen/flags.rb +0 -282
  61. data/lib/boxen/hook/github_issue.rb +0 -120
  62. data/lib/boxen/hook/web.rb +0 -56
  63. data/lib/boxen/puppeteer.rb +0 -121
  64. data/lib/boxen/runner.rb +0 -149
  65. data/test/boxen_check_test.rb +0 -55
  66. data/test/boxen_flags_test.rb +0 -217
  67. data/test/boxen_preflight_creds_test.rb +0 -177
  68. data/test/boxen_puppeteer_test.rb +0 -101
  69. data/test/boxen_runner_test.rb +0 -171
@@ -1,7 +1,7 @@
1
1
  require "boxen/preflight"
2
2
 
3
3
  class Boxen::Preflight::OS < Boxen::Preflight
4
- SUPPORTED_RELEASES = %w(10.8 10.9 10.10 10.11 10.12)
4
+ SUPPORTED_RELEASES = %w(10.8 10.9)
5
5
 
6
6
  def ok?
7
7
  osx? && supported_release?
@@ -0,0 +1,109 @@
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
@@ -0,0 +1,59 @@
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
@@ -0,0 +1,3 @@
1
+ module Boxen
2
+ VERSION = "3.0.0.beta1"
3
+ end
@@ -4,4 +4,4 @@
4
4
  cd "$(dirname $0)"/..
5
5
 
6
6
  rm -f .bundle/config
7
- bundle install --binstubs bin --path .bundle --quiet
7
+ bundle install --binstubs .bundle/bin --path .bundle --quiet
@@ -6,5 +6,6 @@ cd "$(dirname $0)"/..
6
6
  script/bootstrap &&
7
7
  ruby -rubygems -Ilib:test \
8
8
  -e 'require "bundler/setup"' \
9
+ -e 'require "minitest/autorun"' \
9
10
  -e 'tests = ARGV.empty? ? Dir["test/**/*_test.rb"] : ARGV' \
10
11
  -e 'tests.each { |f| load f }' "$@"
@@ -2,6 +2,6 @@ require "minitest/autorun"
2
2
  require "mocha/setup"
3
3
 
4
4
  module Boxen
5
- class Test < MiniTest::Unit::TestCase
5
+ class Test < MiniTest::Test
6
6
  end
7
7
  end
@@ -1,39 +1,16 @@
1
- require "boxen/test"
2
1
  require "boxen/cli"
3
2
 
4
- class BoxenCLITest < Boxen::Test
5
- def setup
6
- @config = Boxen::Config.new
7
- @flags = Boxen::Flags.new
8
- @cli = Boxen::CLI.new(@config, @flags)
9
- end
10
-
11
- def test_initialize
12
- config = Boxen::Config.new
13
- flags = Boxen::Flags.new
14
-
15
- cli = Boxen::CLI.new config, flags
3
+ require "boxen/command_status"
16
4
 
17
- assert_equal config, cli.config
18
- assert_equal flags, cli.flags
5
+ describe Boxen::CLI do
19
6
 
20
- assert_equal config, cli.runner.config
21
- assert_equal flags, cli.runner.flags
22
- end
7
+ it "is a fancy way of reinvoking commands at this time" do
8
+ config = mock("config")
9
+ Boxen::Config.expects(:load).returns(config)
10
+ Boxen::Command.expects(:invoke).with("foo", config).
11
+ returns(Boxen::CommandStatus.new(0))
23
12
 
24
- def test_run
25
- @cli.runner.expects(:run)
26
- @cli.run
13
+ Boxen::CLI.run("foo")
27
14
  end
28
15
 
29
- def test_help
30
- $stdout.stubs(:write)
31
-
32
- flags = Boxen::Flags.new('--help')
33
- cli = Boxen::CLI.new(@config, flags)
34
- cli.runner.expects(:run).never
35
- assert_raises SystemExit do
36
- cli.run
37
- end
38
- end
39
16
  end
@@ -0,0 +1,93 @@
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
@@ -7,13 +7,6 @@ class BoxenConfigTest < Boxen::Test
7
7
  @config.repodir = "test/fixtures/repo"
8
8
  end
9
9
 
10
- def test_debug?
11
- refute @config.debug?
12
-
13
- @config.debug = true
14
- assert @config.debug?
15
- end
16
-
17
10
  def test_email
18
11
  assert_nil @config.email
19
12
 
@@ -96,27 +89,6 @@ class BoxenConfigTest < Boxen::Test
96
89
  assert_equal "foo", @config.name
97
90
  end
98
91
 
99
- def test_pretend?
100
- refute @config.pretend?
101
-
102
- @config.pretend = true
103
- assert @config.pretend?
104
- end
105
-
106
- def test_profile?
107
- refute @config.profile?
108
-
109
- @config.profile = true
110
- assert @config.profile?
111
- end
112
-
113
- def test_future_parser?
114
- refute @config.future_parser?
115
-
116
- @config.future_parser = true
117
- assert @config.future_parser?
118
- end
119
-
120
92
  def test_projects
121
93
  files = Dir["#{@config.repodir}/modules/projects/manifests/*.pp"]
122
94
  assert_equal files.size, @config.projects.size
@@ -324,8 +296,6 @@ class BoxenConfigTest < Boxen::Test
324
296
  end
325
297
 
326
298
  def test_token
327
- assert_nil @config.token
328
-
329
299
  @config.token = "foo"
330
300
  assert_equal "foo", @config.token
331
301
  end
@@ -382,7 +352,7 @@ class BoxenConfigTest < Boxen::Test
382
352
  ENV["BOXEN_S3_BUCKET"] = val
383
353
  end
384
354
 
385
- def test_s3host_env_var
355
+ def test_s3bucket_env_var
386
356
  val = ENV["BOXEN_S3_BUCKET"]
387
357
 
388
358
  ENV["BOXEN_S3_BUCKET"] = "my-bucket"
@@ -12,25 +12,25 @@ class BoxenPreflightDirectoriesTest < Boxen::Test
12
12
  end
13
13
 
14
14
  def test_not_okay_if_homedir_group_wrong
15
- directories = Boxen::Preflight::Directories.new(@config)
15
+ directories = Boxen::Preflight::Directories.new(@config, :command)
16
16
  directories.stubs(:homedir_group).returns(false)
17
17
  refute directories.ok?
18
18
  end
19
19
 
20
20
  def test_not_okay_if_homedir_owner_wrong
21
- directories = Boxen::Preflight::Directories.new(@config)
21
+ directories = Boxen::Preflight::Directories.new(@config, :command)
22
22
  directories.stubs(:homedir_owner).returns(false)
23
23
  refute directories.ok?
24
24
  end
25
25
 
26
26
  def test_not_okay_unless_homedir_exists
27
- directories = Boxen::Preflight::Directories.new(@config)
27
+ directories = Boxen::Preflight::Directories.new(@config, :command)
28
28
  directories.stubs(:homedir_directory_exists?).returns(false)
29
29
  refute directories.ok?
30
30
  end
31
31
 
32
32
  def test_okay_if_allchecks_fine
33
- directories = Boxen::Preflight::Directories.new(@config)
33
+ directories = Boxen::Preflight::Directories.new(@config, :command)
34
34
  directories.stubs(:homedir_directory_exists?).returns(true)
35
35
  directories.stubs(:homedir_owner).returns("foobar")
36
36
  directories.stubs(:homedir_group).returns("staff")
@@ -0,0 +1,25 @@
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