boxen 2.9.0 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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