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,177 +0,0 @@
1
- require 'boxen/test'
2
- require 'boxen/config'
3
- require 'boxen/preflight/creds'
4
-
5
- class BoxenPreflightCredsTest < Boxen::Test
6
- # Make a struct to use for stubbing out authorization objects.
7
- Struct.new("Authorization", :id, :note, :fingerprint, :token)
8
-
9
- def setup
10
- @config = Boxen::Config.new do |c|
11
- c.user = 'mojombo'
12
- c.token = 'sekr3t!'
13
- end
14
- ENV.delete("BOXEN_GITHUB_LOGIN")
15
- ENV.delete("BOXEN_GITHUB_PASSWORD")
16
- end
17
-
18
- def test_basic
19
- preflight = Boxen::Preflight::Creds.new @config
20
-
21
- error = Octokit::Unauthorized.new
22
- @config.api.stubs(:user).raises(error)
23
-
24
- refute preflight.ok?
25
- end
26
-
27
- def test_basic_with_otp_challenge
28
- preflight = Boxen::Preflight::Creds.new @config
29
-
30
- blank_opt = {:headers => {}}
31
- good_otp = {:headers => {"X-GitHub-OTP" => "123456"}}
32
-
33
- error = Octokit::OneTimePasswordRequired.new
34
- error.stubs(:message).returns("OTP")
35
-
36
- preflight.tmp_api.expects(:authorizations).with(blank_opt).raises(error)
37
- preflight.tmp_api.expects(:authorizations).with(good_otp).returns([])
38
- preflight.tmp_api.expects(:create_authorization).raises(error)
39
-
40
- preflight.expects(:warn)
41
- HighLine.any_instance.expects(:ask).returns("123456")
42
-
43
- preflight.get_tokens
44
- assert_equal "123456", preflight.otp
45
- end
46
-
47
- def test_fetch_login_and_password_when_nothing_is_given_in_env
48
- # fetches login and password by asking
49
- preflight = Boxen::Preflight::Creds.new @config
50
- HighLine.any_instance.expects(:ask).with("GitHub login: ").returns "l"
51
- HighLine.any_instance.expects(:ask).with("GitHub password: ").returns "p"
52
- preflight.send(:fetch_login_and_password)
53
-
54
- assert_equal "l", @config.login
55
- assert_equal "p", preflight.instance_variable_get(:@password)
56
- end
57
-
58
- def test_fetch_password_when_login_is_given_in_env
59
- # fetches only password by asking
60
- ENV["BOXEN_GITHUB_LOGIN"] = "l"
61
- preflight = Boxen::Preflight::Creds.new @config
62
- preflight.expects(:warn)
63
- HighLine.any_instance.expects(:ask).with("GitHub login: ").never
64
- HighLine.any_instance.expects(:ask).with("GitHub password: ").returns "p"
65
- preflight.send(:fetch_login_and_password)
66
-
67
- assert_equal "l", @config.login
68
- assert_equal "p", preflight.instance_variable_get(:@password)
69
- end
70
-
71
- def test_fetch_login_when_password_is_given_in_env
72
- # fetches only login by asking
73
- ENV["BOXEN_GITHUB_PASSWORD"] = "p"
74
- preflight = Boxen::Preflight::Creds.new @config
75
- preflight.expects(:warn)
76
- HighLine.any_instance.expects(:ask).with("GitHub login: ").returns "l"
77
- HighLine.any_instance.expects(:ask).with("GitHub password: ").never
78
- preflight.send(:fetch_login_and_password)
79
-
80
- assert_equal "l", @config.login
81
- assert_equal "p", preflight.instance_variable_get(:@password)
82
- end
83
-
84
- def test_run_with_existing_token
85
- preflight = Boxen::Preflight::Creds.new @config
86
- note = "App1"
87
- fingerprint = "Fingerprint1"
88
- existing_token = Struct::Authorization.new(1, note, fingerprint, "Token1")
89
-
90
- preflight.stubs(:fetch_login_and_password).returns("")
91
- preflight.stubs(:get_tokens).returns([existing_token])
92
- preflight.stubs(:note).returns(note)
93
- preflight.stubs(:fingerprint).returns(fingerprint)
94
- preflight.stubs(:ok?).returns(true)
95
- preflight.tmp_api.expects(:delete_authorization).with(existing_token.id, :headers => {})
96
- preflight.tmp_api.expects(:create_authorization).with(
97
- :note => note,
98
- :fingerprint => fingerprint,
99
- :scopes => %w(repo user),
100
- :headers => {}
101
- ).returns(existing_token)
102
-
103
- preflight.run
104
- end
105
-
106
- def test_run_with_no_existing_token
107
- preflight = Boxen::Preflight::Creds.new @config
108
- note = "App1"
109
- fingerprint = "Fingerprint1"
110
- new_token = Struct::Authorization.new(1, note, fingerprint, "Token1")
111
-
112
- preflight.stubs(:fetch_login_and_password).returns("")
113
- preflight.stubs(:get_tokens).returns([])
114
- preflight.stubs(:note).returns(note)
115
- preflight.stubs(:fingerprint).returns(fingerprint)
116
- preflight.stubs(:ok?).returns(true)
117
- preflight.tmp_api.expects(:delete_authorization).never
118
- preflight.tmp_api.expects(:create_authorization).with(
119
- :note => note,
120
- :fingerprint => fingerprint,
121
- :scopes => %w(repo user),
122
- :headers => {}
123
- ).returns(new_token)
124
-
125
- preflight.run
126
- end
127
-
128
- def test_run_does_not_delete_unrelated_tokens
129
- preflight = Boxen::Preflight::Creds.new @config
130
- note = "App1"
131
- fingerprint = "Fingerprint1"
132
- new_token = Struct::Authorization.new(1, note, fingerprint, "Token1")
133
- unrelated_token = Struct::Authorization.new(2, "App2", fingerprint, "Token2")
134
- unrelated_token_with_fingerprint = Struct::Authorization.new(3, "App3", "Fingerprint3", "Token3")
135
-
136
- preflight.stubs(:fetch_login_and_password).returns("")
137
- preflight.stubs(:get_tokens).returns(
138
- [unrelated_token, unrelated_token_with_fingerprint]
139
- )
140
- preflight.stubs(:note).returns(note)
141
- preflight.stubs(:fingerprint).returns(fingerprint)
142
- preflight.stubs(:ok?).returns(true)
143
- preflight.tmp_api.expects(:delete_authorization).never
144
- preflight.tmp_api.expects(:create_authorization).with(
145
- :note => note,
146
- :fingerprint => fingerprint,
147
- :scopes => %w(repo user),
148
- :headers => {}
149
- ).returns(new_token)
150
-
151
- preflight.run
152
- end
153
-
154
- def test_run_does_delete_legacy_token
155
- preflight = Boxen::Preflight::Creds.new @config
156
- note = "App1"
157
- fingerprint = "Fingerprint1"
158
- existing_token = Struct::Authorization.new(1, note, fingerprint, "Token1")
159
- legacy_token = Struct::Authorization.new(2, "Boxen", nil, "Token2")
160
-
161
- preflight.stubs(:fetch_login_and_password).returns("")
162
- preflight.stubs(:get_tokens).returns([existing_token, legacy_token])
163
- preflight.stubs(:note).returns(note)
164
- preflight.stubs(:fingerprint).returns(fingerprint)
165
- preflight.stubs(:ok?).returns(true)
166
- preflight.tmp_api.expects(:delete_authorization).with(2, :headers => {})
167
- preflight.tmp_api.expects(:delete_authorization).with(1, :headers => {})
168
- preflight.tmp_api.expects(:create_authorization).with(
169
- :note => note,
170
- :fingerprint => fingerprint,
171
- :scopes => %w(repo user),
172
- :headers => {}
173
- ).returns(existing_token)
174
-
175
- preflight.run
176
- end
177
- end
@@ -1,101 +0,0 @@
1
- require "boxen/test"
2
- require "boxen/puppeteer"
3
-
4
- class BoxenPuppeteerTest < Boxen::Test
5
- def test_initialize
6
- puppet = Boxen::Puppeteer.new :config
7
- assert_equal :config, puppet.config
8
- end
9
-
10
- def test_flags
11
- config = stub do
12
- stubs(:homedir).returns "homedir"
13
- stubs(:logfile).returns "logfile"
14
- stubs(:profile?).returns true
15
- stubs(:future_parser?).returns true
16
- stubs(:puppetdir).returns "puppetdir"
17
- stubs(:repodir).returns "repodir"
18
- stubs(:debug?).returns true
19
- stubs(:pretend?).returns true
20
- stubs(:report?).returns false
21
- stubs(:graph?).returns false
22
- stubs(:color?).returns false
23
- end
24
-
25
- puppet = Boxen::Puppeteer.new config
26
- flags = puppet.flags
27
-
28
- assert_flag "--debug", flags
29
- assert_flag "--detailed-exitcodes", flags
30
- assert_flag "--evaltrace", flags
31
- assert_flag "--no-report", flags
32
- assert_flag "--noop", flags
33
- assert_flag "--summarize", flags
34
- assert_flag "--color=false", flags
35
- assert_flag "--parser=future", flags
36
-
37
- assert_flag_value "--confdir", :anything, flags
38
- assert_flag_value "--group", "admin", flags
39
- assert_flag_value "--vardir", :anything, flags
40
- assert_flag_value "--libdir", :anything, flags
41
- assert_flag_value "--manifestdir", :anything, flags
42
- assert_flag_value "--modulepath", :anything, flags
43
-
44
- assert_flag_value "--hiera_config", "/dev/null", flags
45
-
46
- assert_flag_value "--logdest", "logfile", flags
47
- assert_flag_value "--logdest", "console", flags
48
- end
49
-
50
- def test_run
51
- config = stub do
52
- stubs(:debug?).returns false
53
- stubs(:homedir).returns "homedir"
54
- stubs(:logfile).returns "logfile"
55
- stubs(:pretend?).returns false
56
- stubs(:profile?).returns false
57
- stubs(:future_parser?).returns false
58
- stubs(:report?).returns false
59
- stubs(:graph?).returns false
60
- stubs(:puppetdir).returns "puppetdir"
61
- stubs(:repodir).returns "test/fixtures/repo"
62
- stubs(:color?).returns true
63
- end
64
-
65
- puppet = Boxen::Puppeteer.new config
66
-
67
- FileUtils.expects(:rm_f).with config.logfile
68
- FileUtils.expects(:touch).with config.logfile
69
- FileUtils.expects(:mkdir_p).with File.dirname(config.logfile)
70
- FileUtils.expects(:mkdir_p).with config.puppetdir
71
- Boxen::Util.expects(:sudo).with *puppet.command
72
-
73
- puppet.run
74
- end
75
-
76
- def assert_flag(flag, flags)
77
- assert flags.include?(flag), "Flags must include #{flag}."
78
- end
79
-
80
- def assert_flag_value(flag, value, flags)
81
- pair = [flag, value]
82
-
83
- found = (0..flags.size).detect do |i|
84
- candidate = flags[i, pair.size]
85
- value == :anything ? candidate.size == pair.size : candidate == pair
86
- end
87
-
88
- assert found, "Flags must include #{flag} #{value}."
89
- end
90
-
91
- def test_status
92
- status = Boxen::Puppeteer::Status.new(0)
93
- assert status.success?
94
-
95
- status = Boxen::Puppeteer::Status.new(2)
96
- assert status.success?
97
-
98
- status = Boxen::Puppeteer::Status.new(1)
99
- refute status.success?
100
- end
101
- end
@@ -1,171 +0,0 @@
1
- require "boxen/test"
2
- require "boxen/runner"
3
-
4
- class BoxenRunnerTest < Boxen::Test
5
- def setup
6
- @config = Boxen::Config.new
7
- @flags = Boxen::Flags.new
8
- @runner = Boxen::Runner.new(@config, @flags)
9
-
10
- $stdout.stubs(:puts).returns(true)
11
- $stdout.stubs(:write).returns(true)
12
- end
13
-
14
- def test_initialize
15
- config = Boxen::Config.new
16
- flags = Boxen::Flags.new
17
-
18
- runner = Boxen::Runner.new(config, flags)
19
-
20
- assert_equal config, runner.config
21
- assert_equal flags, runner.flags
22
- assert_equal config, runner.puppet.config
23
- end
24
-
25
- HookYes = Struct.new(:config, :checkout, :puppet, :result)
26
- HookNo = Struct.new(:config, :checkout, :puppet, :result)
27
- def test_report
28
- runner = Boxen::Runner.new(@config, @flags)
29
- runner.stubs(:hooks).returns([HookYes, HookNo])
30
-
31
- hook_yes = stub('HookYes')
32
- hook_no = stub('HookNo')
33
-
34
- HookYes.stubs(:new).returns(hook_yes)
35
- HookNo.stubs(:new).returns(hook_no)
36
-
37
- hook_yes.expects(:run).once
38
- hook_no.expects(:run).once
39
-
40
- runner.report(stub('result'))
41
- end
42
-
43
- def test_disable_service
44
- config = Boxen::Config.new
45
- flags = Boxen::Flags.new('--disable-service', 'test')
46
- runner = Boxen::Runner.new config, flags
47
-
48
- service = mock('service', :disable => true)
49
- Boxen::Service.stubs(:new).returns(service)
50
-
51
- assert_raises(SystemExit) do
52
- runner.process
53
- end
54
- end
55
-
56
- def test_enable_service
57
- config = Boxen::Config.new
58
- flags = Boxen::Flags.new('--enable-service', 'test')
59
- runner = Boxen::Runner.new config, flags
60
-
61
- service = mock('service', :enable => true)
62
- Boxen::Service.stubs(:new).returns(service)
63
-
64
- assert_raises(SystemExit) do
65
- runner.process
66
- end
67
- end
68
-
69
- def test_restart_service
70
- config = Boxen::Config.new
71
- flags = Boxen::Flags.new('--restart-service', 'test')
72
- runner = Boxen::Runner.new config, flags
73
-
74
- service = mock('service')
75
- service.expects(:disable).once
76
- service.expects(:enable).once
77
-
78
- Boxen::Service.stubs(:new).returns(service)
79
-
80
- assert_raises(SystemExit) do
81
- runner.process
82
- end
83
- end
84
-
85
- def test_disable_services
86
- config = Boxen::Config.new
87
- flags = Boxen::Flags.new('--disable-services')
88
- runner = Boxen::Runner.new config, flags
89
-
90
- services = Array.new(3) { mock('service', :disable => true) }
91
- Boxen::Service.stubs(:list).returns(services)
92
-
93
- assert_raises(SystemExit) do
94
- runner.process
95
- end
96
- end
97
-
98
- def test_enable_services
99
- config = Boxen::Config.new
100
- flags = Boxen::Flags.new('--enable-services')
101
- runner = Boxen::Runner.new config, flags
102
-
103
- services = Array.new(3) { mock('service', :enable => true) }
104
- Boxen::Service.stubs(:list).returns(services)
105
-
106
- assert_raises(SystemExit) do
107
- runner.process
108
- end
109
- end
110
-
111
- def test_restart_services
112
- config = Boxen::Config.new
113
- flags = Boxen::Flags.new('--restart-services')
114
- runner = Boxen::Runner.new config, flags
115
-
116
- services = Array.new(3) { mock('service') }
117
- services.each do |service|
118
- service.expects(:disable).once
119
- service.expects(:enable).once
120
- end
121
- Boxen::Service.stubs(:list_enabled).returns(services)
122
-
123
- assert_raises(SystemExit) do
124
- runner.process
125
- end
126
- end
127
-
128
- def test_list_services
129
- config = Boxen::Config.new
130
- flags = Boxen::Flags.new('--list-services')
131
- runner = Boxen::Runner.new config, flags
132
-
133
- Boxen::Service.expects(:list).returns(%w[a list of services])
134
-
135
- assert_raises(SystemExit) do
136
- runner.process
137
- end
138
- end
139
-
140
- def test_specify_project
141
- skip "busted and probably due to be replaced if @jbarnette can fix it"
142
- fact = 'cli_boxen_projects'
143
- refute Facter.value(fact)
144
-
145
- project = 'some_project'
146
- flags = Boxen::Flags.new(project)
147
-
148
- runner = Boxen::Runner.new(@config, flags)
149
- runner.puppet.expects(:run).with().returns(true)
150
- runner.process
151
- assert_equal project, Facter.value(fact)
152
-
153
-
154
- project = 'other_project'
155
- flags = Boxen::Flags.new('--debug', project)
156
-
157
- runner = Boxen::Runner.new(@config, flags)
158
- runner.puppet.expects(:run).with().returns(true)
159
- runner.process
160
- assert_equal project, Facter.value(fact)
161
-
162
-
163
- projects = %w[my cool projects]
164
- flags = Boxen::Flags.new('--noop', *projects)
165
-
166
- runner = Boxen::Runner.new(@config, flags)
167
- runner.puppet.expects(:run).with().returns(true)
168
- runner.process
169
- assert_equal projects.join(','), Facter.value(fact)
170
- end
171
- end