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,121 +0,0 @@
1
- require "fileutils"
2
- require "boxen/util"
3
-
4
- module Boxen
5
-
6
- # Manages an invocation of puppet.
7
-
8
- class Puppeteer
9
-
10
- class Status < Struct.new(:code)
11
- # Puppet's detailed exit codes reserves 2 for a successful run with changes
12
- def success?
13
- [0,2].include?(code)
14
- end
15
- end
16
-
17
- attr_reader :config
18
-
19
- def initialize(config)
20
- @config = config
21
- end
22
-
23
- def command
24
- manifestdir = "#{config.repodir}/manifests"
25
- puppet = "#{config.repodir}/bin/puppet"
26
-
27
- [puppet, "apply", flags, manifestdir].flatten
28
- end
29
-
30
- def hiera_config
31
- if File.exist? "#{config.repodir}/config/hiera.yaml"
32
- "#{config.repodir}/config/hiera.yaml"
33
- else
34
- "/dev/null"
35
- end
36
- end
37
-
38
- def flags
39
- flags = []
40
- root = File.expand_path "../../..", __FILE__
41
-
42
- flags << ["--group", "admin"]
43
- flags << ["--confdir", "#{config.puppetdir}/conf"]
44
- flags << ["--vardir", "#{config.puppetdir}/var"]
45
- flags << ["--libdir", "#{config.repodir}/lib"]#:#{root}/lib"]
46
- flags << ["--libdir", "#{root}/lib"]
47
- flags << ["--modulepath", "#{config.repodir}/modules:#{config.repodir}/shared"]
48
-
49
- # Don't ever complain about Hiera to me
50
- flags << ["--hiera_config", hiera_config]
51
-
52
- # Log to both the console and a file.
53
-
54
- flags << ["--logdest", config.logfile]
55
- flags << ["--logdest", "console"]
56
-
57
- # For some reason Puppet tries to set up a bunch of rrd stuff
58
- # (user, group) unless reports are completely disabled.
59
-
60
- flags << "--no-report" unless config.report?
61
- flags << "--detailed-exitcodes"
62
-
63
- flags << "--graph" if config.graph?
64
-
65
- flags << "--show_diff"
66
-
67
- if config.profile?
68
- flags << "--evaltrace"
69
- flags << "--summarize"
70
- end
71
-
72
- if config.future_parser?
73
- flags << "--parser=future"
74
- end
75
-
76
- flags << "--debug" if config.debug?
77
- flags << "--noop" if config.pretend?
78
-
79
- flags << "--color=false" unless config.color?
80
-
81
- flags.flatten
82
- end
83
-
84
- def run
85
- FileUtils.mkdir_p config.puppetdir
86
-
87
- FileUtils.rm_f config.logfile
88
-
89
- FileUtils.rm_rf "#{config.puppetdir}/var/reports" if config.report?
90
-
91
- FileUtils.rm_rf "#{config.puppetdir}/var/state/graphs" if config.graph?
92
-
93
- FileUtils.mkdir_p File.dirname config.logfile
94
- FileUtils.touch config.logfile
95
-
96
- if File.file? "Puppetfile"
97
- librarian = "#{config.repodir}/bin/librarian-puppet"
98
-
99
- unless config.enterprise?
100
- # Set an environment variable for librarian-puppet's
101
- # github_tarball source strategy.
102
- ENV["GITHUB_API_TOKEN"] = config.token
103
- end
104
-
105
- librarian_command = [librarian, "install", "--path=#{config.repodir}/shared"]
106
- librarian_command << "--verbose" if config.debug?
107
-
108
- warn librarian_command.join(" ") if config.debug?
109
- unless system *librarian_command
110
- abort "Can't run Puppet, fetching dependencies with librarian failed."
111
- end
112
- end
113
-
114
- warn command.join(" ") if config.debug?
115
-
116
- Boxen::Util.sudo *command
117
-
118
- Status.new($?.exitstatus)
119
- end
120
- end
121
- end
@@ -1,149 +0,0 @@
1
- require "boxen/checkout"
2
- require "boxen/config"
3
- require "boxen/hook"
4
- require "boxen/flags"
5
- require "boxen/puppeteer"
6
- require "boxen/service"
7
- require "boxen/util"
8
- require "facter"
9
-
10
- module Boxen
11
- class Runner
12
- attr_reader :config
13
- attr_reader :flags
14
- attr_reader :puppet
15
- attr_reader :checkout
16
- attr_reader :hooks
17
-
18
- def initialize(config, flags)
19
- @config = config
20
- @flags = flags
21
- @puppet = Boxen::Puppeteer.new(@config)
22
- @checkout = Boxen::Checkout.new(@config)
23
- @hooks = Boxen::Hook.all
24
- end
25
-
26
- def process
27
- # --env prints out the current BOXEN_ env vars.
28
-
29
- exec "env | grep ^BOXEN_ | sort" if flags.env?
30
-
31
- process_flags
32
-
33
- process_args
34
-
35
- # Actually run Puppet and return its result
36
-
37
- puppet.run
38
- end
39
-
40
- def run
41
- report(process)
42
- end
43
-
44
- def report(result)
45
- hooks.each { |hook| hook.new(config, checkout, puppet, result).run }
46
-
47
- result
48
- end
49
-
50
- def process_flags
51
-
52
- # --projects prints a list of available projects and exits.
53
-
54
- if flags.projects?
55
- puts "You can install any of these projects with `#{$0} <project-name>`:\n"
56
-
57
- config.projects.each do |project|
58
- puts " #{project.name}"
59
- end
60
-
61
- exit
62
- end
63
-
64
- # --disable-services stops all services
65
-
66
- if flags.disable_services?
67
- Boxen::Service.list.each do |service|
68
- puts "Disabling #{service}..."
69
- service.disable
70
- end
71
-
72
- exit
73
- end
74
-
75
- # --enable-services starts all services
76
-
77
- if flags.enable_services?
78
- Boxen::Service.list.each do |service|
79
- puts "Enabling #{service}..."
80
- service.enable
81
- end
82
-
83
- exit
84
- end
85
-
86
- # --disable-service [name] stops a service
87
-
88
- if flags.disable_service?
89
- service = Boxen::Service.new(flags.disable_service)
90
- puts "Disabling #{service}..."
91
- service.disable
92
-
93
- exit
94
- end
95
-
96
- # --enable-service [name] starts a service
97
-
98
- if flags.enable_service?
99
- service = Boxen::Service.new(flags.enable_service)
100
- puts "Enabling #{service}..."
101
- service.enable
102
-
103
- exit
104
- end
105
-
106
- # --restart-service [name] starts a service
107
-
108
- if flags.restart_service?
109
- service = Boxen::Service.new(flags.restart_service)
110
- puts "Restarting #{service}..."
111
- service.disable
112
- service.enable
113
-
114
- exit
115
- end
116
-
117
- # --list-services lists all services
118
-
119
- if flags.list_services?
120
- Boxen::Service.list.each do |service|
121
- puts service
122
- end
123
-
124
- exit
125
- end
126
-
127
- # --restart-services restarts all services
128
-
129
- if flags.restart_services?
130
- Boxen::Service.list_enabled.each do |service|
131
- puts "Restarting #{service}..."
132
- service.disable
133
- service.enable
134
- end
135
-
136
- exit
137
- end
138
-
139
- end
140
-
141
- def process_args
142
- projects = flags.args.join(',')
143
- File.open("#{config.repodir}/.projects", "w+") do |f|
144
- f.truncate 0
145
- f.write projects
146
- end
147
- end
148
- end
149
- end
@@ -1,55 +0,0 @@
1
- require "boxen/test"
2
- require "boxen/check"
3
-
4
- class BoxenCheckTest < Boxen::Test
5
- def test_initialize
6
- check = Boxen::Check.new :config
7
- assert_equal :config, check.config
8
- end
9
-
10
- def test_ok?
11
- ex = assert_raises RuntimeError do
12
- Boxen::Check.new(:config).ok?
13
- end
14
-
15
- assert_match "must implement", ex.message
16
- end
17
-
18
- def test_run
19
- ex = assert_raises RuntimeError do
20
- Boxen::Check.new(:config).run
21
- end
22
-
23
- assert_match "must implement", ex.message
24
- end
25
-
26
- def test_self_checks
27
- subclass = Class.new Boxen::Check
28
- Boxen::Check.const_set :TestCheck, subclass
29
-
30
- assert Boxen::Check.checks(:config).any? { |c| subclass === c },
31
- "an instance of TestCheck exists in checks"
32
- end
33
-
34
- def test_self_checks_subclasses
35
- klass = Struct.new :config
36
- Boxen::Check.const_set :TestBadCheck, klass
37
-
38
- refute Boxen::Check.checks(:config).any? { |c| klass === c },
39
- "checks are subclasses of Boxen::Check"
40
- end
41
-
42
- def test_self_run
43
- willrun = mock do
44
- expects(:ok?).returns false
45
- expects(:run)
46
- end
47
-
48
- wontrun = mock do
49
- expects(:ok?).returns true
50
- end
51
-
52
- Boxen::Check.expects(:checks).with(:config).returns [willrun, wontrun]
53
- Boxen::Check.run :config
54
- end
55
- end
@@ -1,217 +0,0 @@
1
- require "boxen/test"
2
- require "boxen/flags"
3
-
4
- class BoxenFlagsTest < Boxen::Test
5
- def test_apply
6
- config = mock do
7
- expects(:debug=).with true
8
-
9
- stubs(:fde?).returns true
10
- expects(:fde=).with false
11
-
12
- expects(:homedir=).with "homedir"
13
- expects(:logfile=).with "logfile"
14
- expects(:login=).with "login"
15
- expects(:token=).with "token"
16
- expects(:pretend=).with true
17
- expects(:profile=).with true
18
- expects(:future_parser=).with true
19
- expects(:report=).with true
20
- expects(:graph=).with true
21
- expects(:srcdir=).with "srcdir"
22
- expects(:stealth=).with true
23
- expects(:user=).with "user"
24
- expects(:color=).with true
25
- end
26
-
27
- # Do our best to frob every switch.
28
-
29
- flags = Boxen::Flags.new "--debug", "--help", "--login", "login",
30
- "--no-fde", "--no-pull", "--no-issue", "--noop",
31
- "--pretend", "--profile", "--future-parser", "--report", "--graph", "--projects",
32
- "--user", "user", "--homedir", "homedir", "--srcdir", "srcdir",
33
- "--logfile", "logfile", "--token", "token"
34
-
35
- assert_same config, flags.apply(config)
36
- end
37
-
38
- def test_args
39
- config = flags "--debug", "foo"
40
- assert_equal %w(foo), config.args
41
- end
42
-
43
- def test_debug
44
- refute flags.debug?
45
- assert flags("--debug").debug?
46
- end
47
-
48
- def test_env?
49
- refute flags.env?
50
- assert flags("--env").env?
51
- end
52
-
53
- def test_help
54
- refute flags.help?
55
-
56
- %w(--help -h -?).each do |flag|
57
- assert flags(flag).help?
58
- end
59
- end
60
-
61
- def test_disable_services?
62
- refute flags.disable_services?
63
- assert flags("--disable-services").disable_services?
64
- end
65
-
66
- def test_enable_services?
67
- refute flags.enable_services?
68
- assert flags("--enable-services").enable_services?
69
- end
70
-
71
- def test_list_services?
72
- refute flags.list_services?
73
- assert flags("--list-services").list_services?
74
- end
75
-
76
- def test_homedir
77
- assert_nil flags.homedir
78
- assert_equal "foo", flags("--homedir", "foo").homedir
79
- end
80
-
81
- def test_initialize_bad_option
82
- ex = assert_raises Boxen::Error do
83
- flags "--bad-option"
84
- end
85
-
86
- assert_match "invalid option", ex.message
87
- assert_match "--bad-option", ex.message
88
- end
89
-
90
- def test_initialize_dups
91
- args = %w(foo)
92
- config = flags args
93
-
94
- assert_equal args, config.args
95
- refute_same args, config.args
96
- end
97
-
98
- def test_initialize_empty
99
- config = flags
100
- assert_equal [], config.args
101
- end
102
-
103
- def test_initialize_flattens
104
- config = flags "foo", ["bar"]
105
- assert_equal %w(foo bar), config.args
106
- end
107
-
108
- def test_initialize_nils
109
- config = flags "foo", nil, "bar"
110
- assert_equal %w(foo bar), config.args
111
- end
112
-
113
- def test_initialize_strings
114
- config = flags :foo, [:bar]
115
- assert_equal %w(foo bar), config.args
116
- end
117
-
118
- def test_logfile
119
- assert_nil flags.logfile
120
- assert_equal "foo", flags("--logfile", "foo").logfile
121
- end
122
-
123
- def test_login
124
- assert_nil flags.login
125
- assert_equal "jbarnette", flags("--login", "jbarnette").login
126
- end
127
-
128
- def test_no_fde
129
- assert flags.fde?
130
- refute flags("--no-fde").fde?
131
- end
132
-
133
- def test_no_pull_is_a_noop
134
- flags "--no-pull"
135
- end
136
-
137
- def test_parse
138
- config = flags
139
- config.parse "--debug", "foo"
140
-
141
- assert config.debug?
142
- assert_equal %w(foo), config.args
143
- end
144
-
145
- def test_token
146
- assert_nil flags.token
147
- assert_equal "foo", flags("--token", "foo").token
148
- end
149
-
150
- def test_token_missing_value
151
- ex = assert_raises Boxen::Error do
152
- flags "--token"
153
- end
154
-
155
- assert_match "missing argument", ex.message
156
- end
157
-
158
- def test_pretend
159
- refute flags.pretend?
160
- assert flags("--noop").pretend?
161
- assert flags("--pretend").pretend?
162
- end
163
-
164
- def test_profile
165
- refute flags.profile?
166
- assert flags("--profile").profile?
167
- end
168
-
169
- def test_future_parser
170
- refute flags.future_parser?
171
- assert flags("--future-parser").future_parser?
172
- end
173
-
174
- def test_report
175
- refute flags.report?
176
- assert flags("--report").report?
177
- end
178
-
179
- def test_graph
180
- refute flags.graph?
181
- assert flags("--graph").graph?
182
- end
183
-
184
- def test_projects
185
- refute flags.projects?
186
- assert flags("--projects").projects?
187
- end
188
-
189
- def test_srcdir
190
- assert_nil flags.srcdir
191
- assert_equal "foo", flags("--srcdir", "foo").srcdir
192
- end
193
-
194
- def test_stealth
195
- refute flags.stealth?
196
- assert flags("--no-issue").stealth?
197
- assert flags("--stealth").stealth?
198
- end
199
-
200
- def test_user
201
- assert_equal "jbarnette", flags("--user", "jbarnette").user
202
- end
203
-
204
- def test_user_missing_value
205
- ex = assert_raises Boxen::Error do
206
- flags "--user"
207
- end
208
-
209
- assert_match "missing argument", ex.message
210
- end
211
-
212
- # Create an instance of Boxen::Flags with optional `args`.
213
-
214
- def flags(*args)
215
- Boxen::Flags.new *args
216
- end
217
- end