boxen 0.2.4 → 0.3.0
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.
- data/boxen.gemspec +1 -1
- data/lib/boxen/checkout.rb +25 -0
- data/lib/boxen/cli.rb +32 -5
- data/lib/boxen/config.rb +21 -10
- data/lib/boxen/postflight/env.rb +1 -1
- data/lib/boxen/reporter.rb +90 -0
- data/lib/system_timer.rb +13 -0
- data/script/release +2 -1
- data/script/sync-puppet +1 -0
- data/test/boxen_checkout_test.rb +42 -0
- data/test/boxen_cli_test.rb +91 -2
- data/test/boxen_config_test.rb +90 -9
- data/test/boxen_reporter_test.rb +183 -0
- metadata +155 -138
data/boxen.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = "boxen"
|
5
|
-
gem.version = "0.
|
5
|
+
gem.version = "0.3.0"
|
6
6
|
gem.authors = ["John Barnette", "Will Farrington"]
|
7
7
|
gem.email = ["jbarnette@github.com", "wfarr@github.com"]
|
8
8
|
gem.description = "Manage Mac development boxes with love (and Puppet)."
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Boxen
|
2
|
+
class Checkout
|
3
|
+
attr_reader :config
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
@config = config
|
7
|
+
end
|
8
|
+
|
9
|
+
def sha
|
10
|
+
Dir.chdir(config.repodir) { `git rev-parse HEAD`.strip }
|
11
|
+
end
|
12
|
+
|
13
|
+
def master?
|
14
|
+
Dir.chdir(config.repodir) { `git symbolic-ref HEAD`.strip == 'refs/heads/master' }
|
15
|
+
end
|
16
|
+
|
17
|
+
def dirty?
|
18
|
+
!changes.empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
def changes
|
22
|
+
Dir.chdir(config.repodir) { `git status --porcelain`.strip }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/boxen/cli.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
require "boxen/checkout"
|
1
2
|
require "boxen/config"
|
2
3
|
require "boxen/flags"
|
3
4
|
require "boxen/postflight"
|
4
5
|
require "boxen/preflight"
|
5
6
|
require "boxen/puppeteer"
|
7
|
+
require "boxen/reporter"
|
6
8
|
require "boxen/util"
|
7
9
|
|
8
10
|
module Boxen
|
@@ -10,15 +12,18 @@ module Boxen
|
|
10
12
|
attr_reader :config
|
11
13
|
attr_reader :flags
|
12
14
|
attr_reader :puppet
|
15
|
+
attr_reader :checkout
|
16
|
+
attr_reader :reporter
|
13
17
|
|
14
18
|
def initialize(config, flags)
|
15
19
|
@config = config
|
16
20
|
@flags = flags
|
17
21
|
@puppet = Boxen::Puppeteer.new @config
|
22
|
+
@checkout = Boxen::Checkout.new(@config)
|
23
|
+
@reporter = Boxen::Reporter.new(@config, @checkout, @puppet)
|
18
24
|
end
|
19
25
|
|
20
|
-
def
|
21
|
-
|
26
|
+
def process
|
22
27
|
# --env prints out the current BOXEN_ env vars.
|
23
28
|
|
24
29
|
exec "env | grep ^BOXEN_ | sort" if flags.env?
|
@@ -38,10 +43,26 @@ module Boxen
|
|
38
43
|
exit
|
39
44
|
end
|
40
45
|
|
41
|
-
# Actually run Puppet and return its exit code.
|
42
|
-
# where we'll reintegrate automatic error reporting.
|
46
|
+
# Actually run Puppet and return its exit code.
|
43
47
|
|
44
|
-
|
48
|
+
puppet.run
|
49
|
+
end
|
50
|
+
|
51
|
+
def run
|
52
|
+
report(process)
|
53
|
+
end
|
54
|
+
|
55
|
+
def report(result)
|
56
|
+
return result unless issues?
|
57
|
+
|
58
|
+
if result.zero?
|
59
|
+
reporter.close_failures
|
60
|
+
else
|
61
|
+
warn "Sorry! Creating an issue on #{config.reponame}."
|
62
|
+
reporter.record_failure
|
63
|
+
end
|
64
|
+
|
65
|
+
result
|
45
66
|
end
|
46
67
|
|
47
68
|
# Run Boxen by wiring together the command-line flags, config,
|
@@ -82,5 +103,11 @@ module Boxen
|
|
82
103
|
|
83
104
|
return status
|
84
105
|
end
|
106
|
+
|
107
|
+
# Should the result of this run have any effect on GitHub issues?
|
108
|
+
|
109
|
+
def issues?
|
110
|
+
!config.stealth? && !config.pretend? && checkout.master?
|
111
|
+
end
|
85
112
|
end
|
86
113
|
end
|
data/lib/boxen/config.rb
CHANGED
@@ -54,6 +54,7 @@ module Boxen
|
|
54
54
|
:name => config.name,
|
55
55
|
:puppetdir => config.puppetdir,
|
56
56
|
:repodir => config.repodir,
|
57
|
+
:reponame => config.reponame,
|
57
58
|
:srcdir => config.srcdir,
|
58
59
|
:token => config.token,
|
59
60
|
:user => config.user
|
@@ -100,10 +101,6 @@ module Boxen
|
|
100
101
|
|
101
102
|
attr_writer :debug
|
102
103
|
|
103
|
-
def dirty?
|
104
|
-
`git status --porcelain`.strip.empty?
|
105
|
-
end
|
106
|
-
|
107
104
|
# A GitHub user's public email.
|
108
105
|
|
109
106
|
attr_accessor :email
|
@@ -151,12 +148,6 @@ module Boxen
|
|
151
148
|
@login = login
|
152
149
|
end
|
153
150
|
|
154
|
-
# Is Boxen running on the `master` branch?
|
155
|
-
|
156
|
-
def master?
|
157
|
-
`git symbolic-ref HEAD`.chomp == "refs/heads/master"
|
158
|
-
end
|
159
|
-
|
160
151
|
# A GitHub user's profile name.
|
161
152
|
|
162
153
|
attr_accessor :name
|
@@ -223,6 +214,26 @@ module Boxen
|
|
223
214
|
|
224
215
|
attr_writer :repodir
|
225
216
|
|
217
|
+
# The repo on GitHub to use for error reports and automatic
|
218
|
+
# updates, in `owner/repo` format. Default is the `origin` of a
|
219
|
+
# Git repo in `repodir`, if it exists and points at GitHub.
|
220
|
+
# Respects the `BOXEN_REPO_NAME` environment variable.
|
221
|
+
|
222
|
+
def reponame
|
223
|
+
override = @reponame || ENV["BOXEN_REPO_NAME"]
|
224
|
+
return override unless override.nil?
|
225
|
+
|
226
|
+
if File.directory? repodir
|
227
|
+
url = Dir.chdir(repodir) { `git config remote.origin.url`.strip }
|
228
|
+
|
229
|
+
if $?.success? && %r|github\.com[/:]([^/]+/[^/]+)| =~ url
|
230
|
+
@reponame = $1.sub /\.git$/, ""
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
attr_writer :reponame
|
236
|
+
|
226
237
|
# The directory where repos live. Default is
|
227
238
|
# `"/Users/#{user}/src"`.
|
228
239
|
|
data/lib/boxen/postflight/env.rb
CHANGED
@@ -7,7 +7,7 @@ class Boxen::Postflight::Env < Boxen::Postflight
|
|
7
7
|
def self.checksum
|
8
8
|
|
9
9
|
# We can't get this from config 'cause it's static (gotta happen
|
10
|
-
# on load), and
|
10
|
+
# on load), and BOXEN_HOME might not be set.
|
11
11
|
|
12
12
|
home = ENV["BOXEN_HOME"] || "/opt/boxen"
|
13
13
|
return unless File.file? "#{home}/env.sh"
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Boxen
|
2
|
+
class Reporter
|
3
|
+
attr_reader :config
|
4
|
+
attr_reader :checkout
|
5
|
+
attr_reader :puppet
|
6
|
+
|
7
|
+
def initialize(config, checkout, puppet)
|
8
|
+
@config = config
|
9
|
+
@checkout = checkout
|
10
|
+
@puppet = puppet
|
11
|
+
end
|
12
|
+
|
13
|
+
def compare_url
|
14
|
+
return unless config.reponame
|
15
|
+
"https://github.com/#{config.reponame}/compare/#{checkout.sha}...master"
|
16
|
+
end
|
17
|
+
|
18
|
+
def hostname
|
19
|
+
`hostname`.strip
|
20
|
+
end
|
21
|
+
|
22
|
+
def os
|
23
|
+
`sw_vers -productVersion`.strip
|
24
|
+
end
|
25
|
+
|
26
|
+
def shell
|
27
|
+
ENV["SHELL"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def log
|
31
|
+
File.read config.logfile
|
32
|
+
end
|
33
|
+
|
34
|
+
def record_failure
|
35
|
+
title = "Failed for #{config.user}"
|
36
|
+
config.api.create_issue(config.reponame, title, failure_details,
|
37
|
+
:labels => [failure_label])
|
38
|
+
end
|
39
|
+
|
40
|
+
def close_failures
|
41
|
+
comment = "Succeeded at version #{checkout.sha}."
|
42
|
+
failures.each do |issue|
|
43
|
+
config.api.add_comment(config.reponame, issue.number, comment)
|
44
|
+
config.api.close_issue(config.reponame, issue.number)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def failures
|
49
|
+
issues = config.api.list_issues(config.reponame, :state => 'open',
|
50
|
+
:labels => failure_label, :creator => config.login)
|
51
|
+
issues.reject! {|i| i.labels.collect(&:name).include?(ongoing_label)}
|
52
|
+
issues
|
53
|
+
end
|
54
|
+
|
55
|
+
def failure_details
|
56
|
+
body = ''
|
57
|
+
body << "Running on `#{hostname}` (OS X #{os}) under `#{shell}`, "
|
58
|
+
body << "version #{checkout.sha} ([compare to master](#{compare_url}))."
|
59
|
+
body << "\n\n"
|
60
|
+
|
61
|
+
if checkout.dirty?
|
62
|
+
body << "### Changes"
|
63
|
+
body << "\n\n"
|
64
|
+
body << "```\n#{checkout.changes}\n```"
|
65
|
+
body << "\n\n"
|
66
|
+
end
|
67
|
+
|
68
|
+
body << "### Puppet Command"
|
69
|
+
body << "\n\n"
|
70
|
+
body << "```\n#{puppet.command.join(' ')}\n```"
|
71
|
+
body << "\n\n"
|
72
|
+
|
73
|
+
body << "### Output (from #{config.logfile})"
|
74
|
+
body << "\n\n"
|
75
|
+
body << "```\n#{log}\n```\n"
|
76
|
+
|
77
|
+
body
|
78
|
+
end
|
79
|
+
|
80
|
+
def failure_label
|
81
|
+
@failure_label ||= 'failure'
|
82
|
+
end
|
83
|
+
attr_writer :failure_label
|
84
|
+
|
85
|
+
def ongoing_label
|
86
|
+
@ongoing_label ||= 'ongoing'
|
87
|
+
end
|
88
|
+
attr_writer :ongoing_label
|
89
|
+
end
|
90
|
+
end
|
data/lib/system_timer.rb
ADDED
@@ -0,0 +1,13 @@
|
|
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
|
data/script/release
CHANGED
data/script/sync-puppet
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require "boxen/test"
|
2
|
+
require "boxen/checkout"
|
3
|
+
|
4
|
+
class BoxenCheckoutTest < Boxen::Test
|
5
|
+
def setup
|
6
|
+
@config = Boxen::Config.new { |c| c.repodir = 'test/fixtures/repo' }
|
7
|
+
@checkout = Boxen::Checkout.new @config
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_initialize
|
11
|
+
checkout = Boxen::Checkout.new :config
|
12
|
+
assert_equal :config, checkout.config
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_sha
|
16
|
+
sha = 'deadbeef'
|
17
|
+
@checkout.expects(:"`").with("git rev-parse HEAD").returns("#{sha}\n")
|
18
|
+
assert_equal sha, @checkout.sha
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_master?
|
22
|
+
@checkout.stubs(:"`").with("git symbolic-ref HEAD").returns("refs/heads/topic\n")
|
23
|
+
assert !@checkout.master?
|
24
|
+
|
25
|
+
@checkout.stubs(:"`").with("git symbolic-ref HEAD").returns("refs/heads/master\n")
|
26
|
+
assert @checkout.master?
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_changes
|
30
|
+
changes = ' maybe a bunch of stuff happened '
|
31
|
+
@checkout.expects(:"`").with("git status --porcelain").returns(changes)
|
32
|
+
assert_equal changes.strip, @checkout.changes
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_dirty?
|
36
|
+
@checkout.stubs(:changes).returns('stuff happened')
|
37
|
+
assert @checkout.dirty?
|
38
|
+
|
39
|
+
@checkout.stubs(:changes).returns('')
|
40
|
+
assert !@checkout.dirty?
|
41
|
+
end
|
42
|
+
end
|
data/test/boxen_cli_test.rb
CHANGED
@@ -2,14 +2,103 @@ require "boxen/test"
|
|
2
2
|
require "boxen/cli"
|
3
3
|
|
4
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
|
+
|
5
11
|
def test_initialize
|
6
|
-
config =
|
7
|
-
flags =
|
12
|
+
config = Boxen::Config.new
|
13
|
+
flags = Boxen::Flags.new
|
8
14
|
|
9
15
|
cli = Boxen::CLI.new config, flags
|
10
16
|
|
11
17
|
assert_equal config, cli.config
|
12
18
|
assert_equal flags, cli.flags
|
13
19
|
assert_equal config, cli.puppet.config
|
20
|
+
|
21
|
+
assert_equal config, cli.reporter.config
|
22
|
+
assert_equal config, cli.reporter.checkout.config
|
23
|
+
assert_equal cli.checkout, cli.reporter.checkout
|
24
|
+
assert_equal cli.puppet, cli.reporter.puppet
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_issues?
|
28
|
+
@config.stealth = true
|
29
|
+
@config.pretend = true
|
30
|
+
@cli.checkout.stubs(:master?).returns(false)
|
31
|
+
assert !@cli.issues?
|
32
|
+
|
33
|
+
@config.stealth = false
|
34
|
+
@config.pretend = true
|
35
|
+
@cli.checkout.stubs(:master?).returns(false)
|
36
|
+
assert !@cli.issues?
|
37
|
+
|
38
|
+
@config.stealth = true
|
39
|
+
@config.pretend = false
|
40
|
+
@cli.checkout.stubs(:master?).returns(false)
|
41
|
+
assert !@cli.issues?
|
42
|
+
|
43
|
+
@config.stealth = true
|
44
|
+
@config.pretend = true
|
45
|
+
@cli.checkout.stubs(:master?).returns(true)
|
46
|
+
assert !@cli.issues?
|
47
|
+
|
48
|
+
@config.stealth = false
|
49
|
+
@config.pretend = true
|
50
|
+
@cli.checkout.stubs(:master?).returns(true)
|
51
|
+
assert !@cli.issues?
|
52
|
+
|
53
|
+
@config.stealth = true
|
54
|
+
@config.pretend = false
|
55
|
+
@cli.checkout.stubs(:master?).returns(true)
|
56
|
+
assert !@cli.issues?
|
57
|
+
|
58
|
+
@config.stealth = false
|
59
|
+
@config.pretend = false
|
60
|
+
@cli.checkout.stubs(:master?).returns(true)
|
61
|
+
assert @cli.issues?
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_report_failure
|
65
|
+
@cli.stubs(:issues?).returns(true)
|
66
|
+
@cli.stubs(:process).returns(1)
|
67
|
+
@cli.stubs(:warn)
|
68
|
+
|
69
|
+
@cli.reporter.expects(:record_failure)
|
70
|
+
@cli.reporter.expects(:close_failures).never
|
71
|
+
|
72
|
+
@cli.run
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_run_success
|
76
|
+
@cli.stubs(:issues?).returns(true)
|
77
|
+
@cli.stubs(:process).returns(0)
|
78
|
+
|
79
|
+
@cli.reporter.expects(:record_failure).never
|
80
|
+
@cli.reporter.expects(:close_failures)
|
81
|
+
|
82
|
+
@cli.run
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_run_failure_no_issues
|
86
|
+
@cli.stubs(:issues?).returns(false)
|
87
|
+
@cli.stubs(:process).returns(1)
|
88
|
+
|
89
|
+
@cli.reporter.expects(:record_failure).never
|
90
|
+
@cli.reporter.expects(:close_failures).never
|
91
|
+
|
92
|
+
@cli.run
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_run_success_no_issues
|
96
|
+
@cli.stubs(:issues?).returns(false)
|
97
|
+
@cli.stubs(:process).returns(0)
|
98
|
+
|
99
|
+
@cli.reporter.expects(:record_failure).never
|
100
|
+
@cli.reporter.expects(:close_failures).never
|
101
|
+
|
102
|
+
@cli.run
|
14
103
|
end
|
15
104
|
end
|
data/test/boxen_config_test.rb
CHANGED
@@ -4,6 +4,7 @@ require "boxen/config"
|
|
4
4
|
class BoxenConfigTest < Boxen::Test
|
5
5
|
def setup
|
6
6
|
@config = Boxen::Config.new
|
7
|
+
@config.repodir = "test/fixtures/repo"
|
7
8
|
end
|
8
9
|
|
9
10
|
def test_debug?
|
@@ -28,8 +29,12 @@ class BoxenConfigTest < Boxen::Test
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def test_fde_env_var
|
31
|
-
ENV
|
32
|
+
val = ENV['BOXEN_NO_FDE']
|
33
|
+
|
34
|
+
ENV['BOXEN_NO_FDE'] = '1'
|
32
35
|
refute @config.fde?
|
36
|
+
|
37
|
+
ENV['BOXEN_NO_FDE'] = val
|
33
38
|
end
|
34
39
|
|
35
40
|
def test_homedir
|
@@ -40,8 +45,12 @@ class BoxenConfigTest < Boxen::Test
|
|
40
45
|
end
|
41
46
|
|
42
47
|
def test_homedir_env_var_boxen_home
|
43
|
-
ENV
|
48
|
+
val = ENV['BOXEN_NO_FDE']
|
49
|
+
|
50
|
+
ENV['BOXEN_HOME'] = 'foo'
|
44
51
|
assert_equal "foo", @config.homedir
|
52
|
+
|
53
|
+
ENV['BOXEN_HOME'] = val
|
45
54
|
end
|
46
55
|
|
47
56
|
def test_initialize
|
@@ -60,8 +69,12 @@ def test_initialize
|
|
60
69
|
end
|
61
70
|
|
62
71
|
def test_logfile_env_var
|
63
|
-
ENV
|
72
|
+
val = ENV['BOXEN_LOG_FILE']
|
73
|
+
|
74
|
+
ENV['BOXEN_LOG_FILE'] = 'foo'
|
64
75
|
assert_equal "foo", @config.logfile
|
76
|
+
|
77
|
+
ENV['BOXEN_LOG_FILE'] = val
|
65
78
|
end
|
66
79
|
|
67
80
|
def test_login
|
@@ -100,8 +113,6 @@ def test_initialize
|
|
100
113
|
end
|
101
114
|
|
102
115
|
def test_projects
|
103
|
-
@config.repodir = "test/fixtures/repo"
|
104
|
-
|
105
116
|
files = Dir["#{@config.repodir}/modules/projects/manifests/*.pp"]
|
106
117
|
assert_equal files.size, @config.projects.size
|
107
118
|
end
|
@@ -111,11 +122,16 @@ def test_initialize
|
|
111
122
|
end
|
112
123
|
|
113
124
|
def test_puppetdir_env_var
|
114
|
-
ENV
|
125
|
+
val = ENV['BOXEN_PUPPET_DIR']
|
126
|
+
|
127
|
+
ENV['BOXEN_PUPPET_DIR'] = 'foo'
|
115
128
|
assert_equal "foo", @config.puppetdir
|
129
|
+
|
130
|
+
ENV['BOXEN_PUPPET_DIR'] = val
|
116
131
|
end
|
117
132
|
|
118
133
|
def test_repodir
|
134
|
+
@config.repodir = nil
|
119
135
|
assert_equal Dir.pwd, @config.repodir
|
120
136
|
|
121
137
|
@config.repodir = "foo"
|
@@ -123,8 +139,58 @@ def test_initialize
|
|
123
139
|
end
|
124
140
|
|
125
141
|
def test_repodir_env_var
|
126
|
-
|
142
|
+
@config.repodir = nil
|
143
|
+
|
144
|
+
val = ENV['BOXEN_REPO_DIR']
|
145
|
+
|
146
|
+
ENV['BOXEN_REPO_DIR'] = 'foo'
|
127
147
|
assert_equal "foo", @config.repodir
|
148
|
+
|
149
|
+
ENV['BOXEN_REPO_DIR'] = val
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_reponame
|
153
|
+
@config.reponame = "something/explicit"
|
154
|
+
assert_equal "something/explicit", @config.reponame
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_reponame_env_var
|
158
|
+
val = ENV['BOXEN_REPO_NAME']
|
159
|
+
|
160
|
+
ENV['BOXEN_REPO_NAME'] = 'env/var'
|
161
|
+
assert_equal "env/var", @config.reponame
|
162
|
+
|
163
|
+
ENV['BOXEN_REPO_NAME'] = val
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_reponame_git_config
|
167
|
+
@config.expects(:"`").with("git config remote.origin.url").
|
168
|
+
returns "https://github.com/some-org/our-boxen\n"
|
169
|
+
|
170
|
+
assert_equal "some-org/our-boxen", @config.reponame
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_reponame_git_config_bad_exit
|
174
|
+
@config.expects(:"`").with("git config remote.origin.url").returns ""
|
175
|
+
$?.expects(:success?).returns false
|
176
|
+
|
177
|
+
assert_nil @config.reponame
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_reponame_git_config_bad_url
|
181
|
+
@config.expects(:"`").with("git config remote.origin.url").
|
182
|
+
returns "https://spumco.com/some-org/our-boxen\n"
|
183
|
+
$?.expects(:success?).returns true
|
184
|
+
|
185
|
+
assert_nil @config.reponame
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_reponame_git_config_git_extension
|
189
|
+
@config.expects(:"`").with("git config remote.origin.url").
|
190
|
+
returns "https://github.com/some-org/our-boxen.git\n"
|
191
|
+
$?.expects(:success?).returns true
|
192
|
+
|
193
|
+
assert_equal "some-org/our-boxen", @config.reponame
|
128
194
|
end
|
129
195
|
|
130
196
|
def test_srcdir
|
@@ -143,8 +209,12 @@ def test_initialize
|
|
143
209
|
end
|
144
210
|
|
145
211
|
def test_stealth_env_var
|
146
|
-
ENV
|
212
|
+
val = ENV['BOXEN_NO_ISSUE']
|
213
|
+
|
214
|
+
ENV['BOXEN_NO_ISSUE'] = '1'
|
147
215
|
assert @config.stealth?
|
216
|
+
|
217
|
+
ENV['BOXEN_NO_ISSUE'] = val
|
148
218
|
end
|
149
219
|
|
150
220
|
def test_token
|
@@ -155,10 +225,21 @@ def test_initialize
|
|
155
225
|
end
|
156
226
|
|
157
227
|
def test_user
|
158
|
-
ENV
|
228
|
+
ENV['USER'] = 'foo'
|
159
229
|
assert_equal "foo", @config.user
|
160
230
|
|
161
231
|
@config.user = "bar"
|
162
232
|
assert_equal "bar", @config.user
|
163
233
|
end
|
234
|
+
|
235
|
+
def test_api
|
236
|
+
@config.login = login = 'someuser'
|
237
|
+
@config.password = pass = 's3kr!7'
|
238
|
+
|
239
|
+
api = Object.new
|
240
|
+
Octokit::Client.expects(:new).with(:login => login, :password => pass).once.returns(api)
|
241
|
+
|
242
|
+
assert_equal api, @config.api
|
243
|
+
assert_equal api, @config.api # This extra call plus the `once` on the expectation is for the ivar cache.
|
244
|
+
end
|
164
245
|
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
require "boxen/test"
|
2
|
+
require "boxen/reporter"
|
3
|
+
|
4
|
+
class Boxen::Config
|
5
|
+
attr_writer :api
|
6
|
+
end
|
7
|
+
|
8
|
+
class BoxenReporterTest < Boxen::Test
|
9
|
+
def setup
|
10
|
+
@config = Boxen::Config.new
|
11
|
+
@checkout = Boxen::Checkout.new(@config)
|
12
|
+
@puppet = mock 'puppeteer'
|
13
|
+
@reporter = Boxen::Reporter.new @config, @checkout, @puppet
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_compare_url
|
17
|
+
@config.reponame = repo = 'org/repo'
|
18
|
+
sha = 'deadbeef'
|
19
|
+
@checkout.expects(:sha).returns(sha)
|
20
|
+
|
21
|
+
expected = "https://github.com/#{repo}/compare/#{sha}...master"
|
22
|
+
assert_equal expected, @reporter.compare_url
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_hostname
|
26
|
+
@reporter.expects(:"`").with("hostname").returns "whatevs.local\n"
|
27
|
+
assert_equal "whatevs.local", @reporter.hostname
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_initialize
|
31
|
+
reporter = Boxen::Reporter.new :config, :checkout, :puppet
|
32
|
+
assert_equal :config, reporter.config
|
33
|
+
assert_equal :checkout, reporter.checkout
|
34
|
+
assert_equal :puppet, reporter.puppet
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_os
|
38
|
+
@reporter.expects(:"`").with("sw_vers -productVersion").returns "11.1.1\n"
|
39
|
+
assert_equal "11.1.1", @reporter.os
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_shell
|
43
|
+
val = ENV['SHELL']
|
44
|
+
|
45
|
+
ENV['SHELL'] = '/bin/crush'
|
46
|
+
assert_equal "/bin/crush", @reporter.shell
|
47
|
+
|
48
|
+
ENV['SHELL'] = val
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_record_failure
|
52
|
+
details = 'Everything went wrong.'
|
53
|
+
@reporter.stubs(:failure_details).returns(details)
|
54
|
+
|
55
|
+
@config.reponame = repo = 'some/repo'
|
56
|
+
@config.user = user = 'hapless'
|
57
|
+
|
58
|
+
@reporter.failure_label = label = 'boom'
|
59
|
+
|
60
|
+
@config.api = api = mock('api')
|
61
|
+
api.expects(:create_issue).with(repo, "Failed for #{user}", details, :labels => [label])
|
62
|
+
|
63
|
+
@reporter.record_failure
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_failure_label
|
67
|
+
default = 'failure'
|
68
|
+
assert_equal default, @reporter.failure_label
|
69
|
+
|
70
|
+
@reporter.failure_label = label = 'oops'
|
71
|
+
assert_equal label, @reporter.failure_label
|
72
|
+
|
73
|
+
@reporter.failure_label = nil
|
74
|
+
assert_equal default, @reporter.failure_label
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_ongoing_label
|
78
|
+
default = 'ongoing'
|
79
|
+
assert_equal default, @reporter.ongoing_label
|
80
|
+
|
81
|
+
@reporter.ongoing_label = label = 'checkit'
|
82
|
+
assert_equal label, @reporter.ongoing_label
|
83
|
+
|
84
|
+
@reporter.ongoing_label = nil
|
85
|
+
assert_equal default, @reporter.ongoing_label
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_failure_details
|
89
|
+
sha = 'decafbad'
|
90
|
+
@checkout.stubs(:sha).returns(sha)
|
91
|
+
hostname = 'cools.local'
|
92
|
+
@reporter.stubs(:hostname).returns(hostname)
|
93
|
+
shell = '/bin/ksh'
|
94
|
+
@reporter.stubs(:shell).returns(shell)
|
95
|
+
os = '11.1.1'
|
96
|
+
@reporter.stubs(:os).returns(os)
|
97
|
+
log = "so\nmany\nthings\nto\nreport"
|
98
|
+
@reporter.stubs(:log).returns(log)
|
99
|
+
|
100
|
+
@config.reponame = repo = 'some/repo'
|
101
|
+
compare = @reporter.compare_url
|
102
|
+
changes = 'so many changes'
|
103
|
+
@checkout.stubs(:changes).returns(changes)
|
104
|
+
|
105
|
+
commands = %w[/path/to/puppet apply stuff_and_things]
|
106
|
+
@puppet.stubs(:command).returns(commands)
|
107
|
+
command = commands.join(' ')
|
108
|
+
|
109
|
+
@config.logfile = logfile = '/path/to/logfile.txt'
|
110
|
+
|
111
|
+
details = @reporter.failure_details
|
112
|
+
|
113
|
+
assert_match sha, details
|
114
|
+
assert_match hostname, details
|
115
|
+
assert_match shell, details
|
116
|
+
assert_match os, details
|
117
|
+
assert_match compare, details
|
118
|
+
assert_match changes, details
|
119
|
+
assert_match command, details
|
120
|
+
assert_match logfile, details
|
121
|
+
assert_match log, details
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_log
|
125
|
+
@config.logfile = logfile = '/path/to/logfile.txt'
|
126
|
+
|
127
|
+
log = 'a bunch of log data'
|
128
|
+
File.expects(:read).with(logfile).returns(log)
|
129
|
+
|
130
|
+
assert_equal log, @reporter.log
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
Issue = Struct.new(:number, :labels) do
|
135
|
+
def labels
|
136
|
+
self[:labels] || []
|
137
|
+
end
|
138
|
+
end
|
139
|
+
Label = Struct.new(:name)
|
140
|
+
|
141
|
+
def test_close_failures
|
142
|
+
@config.reponame = repo = 'some/repo'
|
143
|
+
|
144
|
+
issues = Array.new(3) { |i| Issue.new(i*2 + 2) }
|
145
|
+
@reporter.stubs(:failures).returns(issues)
|
146
|
+
|
147
|
+
sha = 'decafbad'
|
148
|
+
@checkout.stubs(:sha).returns(sha)
|
149
|
+
|
150
|
+
@config.api = api = mock('api')
|
151
|
+
issues.each do |issue|
|
152
|
+
api.expects(:add_comment).with(repo, issue.number, "Succeeded at version #{sha}.")
|
153
|
+
api.expects(:close_issue).with(repo, issue.number)
|
154
|
+
end
|
155
|
+
|
156
|
+
@reporter.close_failures
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_failures
|
160
|
+
@config.reponame = repo = 'some/repo'
|
161
|
+
@config.login = user = 'hapless'
|
162
|
+
|
163
|
+
@reporter.failure_label = fail_label = 'ouch'
|
164
|
+
@reporter.ongoing_label = goon_label = 'goon'
|
165
|
+
|
166
|
+
fail_l = Label.new(fail_label)
|
167
|
+
goon_l = Label.new(goon_label)
|
168
|
+
pop_l = Label.new('popcorn')
|
169
|
+
|
170
|
+
issues = [
|
171
|
+
Issue.new(0, [fail_l]),
|
172
|
+
Issue.new(1, [fail_l, pop_l]),
|
173
|
+
Issue.new(2, [fail_l, goon_l]),
|
174
|
+
Issue.new(3, [fail_l, Label.new('bang')]),
|
175
|
+
Issue.new(4, [fail_l, goon_l, pop_l]),
|
176
|
+
]
|
177
|
+
|
178
|
+
@config.api = api = mock('api')
|
179
|
+
api.expects(:list_issues).with(repo, :state => 'open', :labels => fail_label, :creator => user).returns(issues)
|
180
|
+
|
181
|
+
assert_equal issues.values_at(0,1,3), @reporter.failures
|
182
|
+
end
|
183
|
+
end
|
metadata
CHANGED
@@ -1,159 +1,176 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: boxen
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 2
|
8
|
-
- 4
|
9
|
-
version: 0.2.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- John Barnette
|
13
9
|
- Will Farrington
|
14
10
|
autorequire:
|
15
11
|
bindir: bin
|
16
12
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2012-10-05 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: ansi
|
23
|
-
|
24
|
-
|
25
|
-
requirements:
|
26
|
-
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 1
|
30
|
-
- 4
|
31
|
-
version: "1.4"
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.4'
|
32
23
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: hiera
|
36
24
|
prerelease: false
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '1.4'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: hiera
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
45
38
|
version: 1.0.0
|
46
39
|
type: :runtime
|
47
|
-
version_requirements: *id002
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: highline
|
50
40
|
prerelease: false
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: highline
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.6'
|
59
55
|
type: :runtime
|
60
|
-
version_requirements: *id003
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: json_pure
|
63
56
|
prerelease: false
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '1.6'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: json_pure
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ~>
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1.7'
|
72
71
|
type: :runtime
|
73
|
-
version_requirements: *id004
|
74
|
-
- !ruby/object:Gem::Dependency
|
75
|
-
name: librarian-puppet
|
76
72
|
prerelease: false
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '1.7'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: librarian-puppet
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ~>
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0.9'
|
85
87
|
type: :runtime
|
86
|
-
version_requirements: *id005
|
87
|
-
- !ruby/object:Gem::Dependency
|
88
|
-
name: octokit
|
89
88
|
prerelease: false
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ~>
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0.9'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: octokit
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.15'
|
98
103
|
type: :runtime
|
99
|
-
version_requirements: *id006
|
100
|
-
- !ruby/object:Gem::Dependency
|
101
|
-
name: puppet
|
102
104
|
prerelease: false
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.15'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: puppet
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '3.0'
|
111
119
|
type: :runtime
|
112
|
-
version_requirements: *id007
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
|
-
name: minitest
|
115
120
|
prerelease: false
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '3.0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: minitest
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - '='
|
133
|
+
- !ruby/object:Gem::Version
|
124
134
|
version: 3.5.0
|
125
135
|
type: :development
|
126
|
-
version_requirements: *id008
|
127
|
-
- !ruby/object:Gem::Dependency
|
128
|
-
name: mocha
|
129
136
|
prerelease: false
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - '='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 3.5.0
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: mocha
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ~>
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0.12'
|
138
151
|
type: :development
|
139
|
-
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ~>
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0.12'
|
140
159
|
description: Manage Mac development boxes with love (and Puppet).
|
141
|
-
email:
|
160
|
+
email:
|
142
161
|
- jbarnette@github.com
|
143
162
|
- wfarr@github.com
|
144
163
|
executables: []
|
145
|
-
|
146
164
|
extensions: []
|
147
|
-
|
148
165
|
extra_rdoc_files: []
|
149
|
-
|
150
|
-
files:
|
166
|
+
files:
|
151
167
|
- .gitignore
|
152
168
|
- Gemfile
|
153
169
|
- LICENSE
|
154
170
|
- README.md
|
155
171
|
- boxen.gemspec
|
156
172
|
- lib/boxen/check.rb
|
173
|
+
- lib/boxen/checkout.rb
|
157
174
|
- lib/boxen/cli.rb
|
158
175
|
- lib/boxen/config.rb
|
159
176
|
- lib/boxen/error.rb
|
@@ -171,14 +188,17 @@ files:
|
|
171
188
|
- lib/boxen/preflight/rvm.rb
|
172
189
|
- lib/boxen/project.rb
|
173
190
|
- lib/boxen/puppeteer.rb
|
191
|
+
- lib/boxen/reporter.rb
|
174
192
|
- lib/boxen/util.rb
|
175
193
|
- lib/facter/boxen.rb
|
194
|
+
- lib/system_timer.rb
|
176
195
|
- script/bootstrap
|
177
196
|
- script/release
|
178
197
|
- script/sync-puppet
|
179
198
|
- script/tests
|
180
199
|
- test/boxen/test.rb
|
181
200
|
- test/boxen_check_test.rb
|
201
|
+
- test/boxen_checkout_test.rb
|
182
202
|
- test/boxen_cli_test.rb
|
183
203
|
- test/boxen_config_test.rb
|
184
204
|
- test/boxen_flags_test.rb
|
@@ -189,43 +209,39 @@ files:
|
|
189
209
|
- test/boxen_preflight_rvm_test.rb
|
190
210
|
- test/boxen_project_test.rb
|
191
211
|
- test/boxen_puppeteer_test.rb
|
212
|
+
- test/boxen_reporter_test.rb
|
192
213
|
- test/boxen_util_test.rb
|
193
214
|
- test/fixtures/repo/modules/projects/manifests/first-project.pp
|
194
215
|
- test/fixtures/repo/modules/projects/manifests/second-project.pp
|
195
216
|
- test/system_timer.rb
|
196
|
-
has_rdoc: true
|
197
217
|
homepage: https://github.com/boxen/boxen
|
198
218
|
licenses: []
|
199
|
-
|
200
219
|
post_install_message:
|
201
220
|
rdoc_options: []
|
202
|
-
|
203
|
-
require_paths:
|
221
|
+
require_paths:
|
204
222
|
- lib
|
205
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
requirements:
|
214
|
-
- -
|
215
|
-
- !ruby/object:Gem::Version
|
216
|
-
|
217
|
-
- 0
|
218
|
-
version: "0"
|
223
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
224
|
+
none: false
|
225
|
+
requirements:
|
226
|
+
- - ! '>='
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: '0'
|
229
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
|
+
none: false
|
231
|
+
requirements:
|
232
|
+
- - ! '>='
|
233
|
+
- !ruby/object:Gem::Version
|
234
|
+
version: '0'
|
219
235
|
requirements: []
|
220
|
-
|
221
236
|
rubyforge_project:
|
222
|
-
rubygems_version: 1.
|
237
|
+
rubygems_version: 1.8.23
|
223
238
|
signing_key:
|
224
239
|
specification_version: 3
|
225
240
|
summary: You know, for laptops and stuff.
|
226
|
-
test_files:
|
241
|
+
test_files:
|
227
242
|
- test/boxen/test.rb
|
228
243
|
- test/boxen_check_test.rb
|
244
|
+
- test/boxen_checkout_test.rb
|
229
245
|
- test/boxen_cli_test.rb
|
230
246
|
- test/boxen_config_test.rb
|
231
247
|
- test/boxen_flags_test.rb
|
@@ -236,6 +252,7 @@ test_files:
|
|
236
252
|
- test/boxen_preflight_rvm_test.rb
|
237
253
|
- test/boxen_project_test.rb
|
238
254
|
- test/boxen_puppeteer_test.rb
|
255
|
+
- test/boxen_reporter_test.rb
|
239
256
|
- test/boxen_util_test.rb
|
240
257
|
- test/fixtures/repo/modules/projects/manifests/first-project.pp
|
241
258
|
- test/fixtures/repo/modules/projects/manifests/second-project.pp
|