dk 0.0.1 → 0.1.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.
- checksums.yaml +5 -5
- data/README.md +643 -1
- data/bin/dk +7 -0
- data/dk.gemspec +7 -3
- data/lib/dk/ansi.rb +98 -0
- data/lib/dk/cli.rb +173 -0
- data/lib/dk/config.rb +217 -0
- data/lib/dk/config_runner.rb +24 -0
- data/lib/dk/dk_runner.rb +13 -0
- data/lib/dk/dry_runner.rb +43 -0
- data/lib/dk/has_set_param.rb +42 -0
- data/lib/dk/has_ssh_opts.rb +36 -0
- data/lib/dk/has_the_runs.rb +23 -0
- data/lib/dk/has_the_stubs.rb +116 -0
- data/lib/dk/local.rb +84 -0
- data/lib/dk/null_logger.rb +13 -0
- data/lib/dk/remote.rb +132 -0
- data/lib/dk/runner.rb +202 -0
- data/lib/dk/task.rb +266 -0
- data/lib/dk/task_run.rb +17 -0
- data/lib/dk/test_runner.rb +54 -0
- data/lib/dk/tree_runner.rb +64 -0
- data/lib/dk/version.rb +1 -1
- data/lib/dk.rb +23 -1
- data/test/helper.rb +6 -1
- data/test/support/config/dk.rb +7 -0
- data/test/support/config/task_defs.rb +10 -0
- data/test/support/factory.rb +38 -0
- data/test/support/log/.gitkeep +0 -0
- data/test/system/has_the_stubs_tests.rb +355 -0
- data/test/system/runner_tests.rb +222 -0
- data/test/unit/ansi_tests.rb +40 -0
- data/test/unit/cli_tests.rb +317 -0
- data/test/unit/config_runner_tests.rb +60 -0
- data/test/unit/config_tests.rb +427 -0
- data/test/unit/dk_runner_tests.rb +34 -0
- data/test/unit/dk_tests.rb +49 -0
- data/test/unit/dry_runner_tests.rb +71 -0
- data/test/unit/has_set_param_tests.rb +46 -0
- data/test/unit/has_ssh_opts_tests.rb +81 -0
- data/test/unit/has_the_runs_tests.rb +37 -0
- data/test/unit/has_the_stubs_tests.rb +279 -0
- data/test/unit/local_tests.rb +174 -0
- data/test/unit/null_logger_tests.rb +17 -0
- data/test/unit/remote_tests.rb +330 -0
- data/test/unit/runner_tests.rb +398 -0
- data/test/unit/task_run_tests.rb +40 -0
- data/test/unit/task_tests.rb +943 -0
- data/test/unit/test_runner_tests.rb +189 -0
- data/test/unit/tree_runner_tests.rb +152 -0
- metadata +106 -9
@@ -0,0 +1,317 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'dk/cli'
|
3
|
+
|
4
|
+
require 'dk/config'
|
5
|
+
require 'dk/dk_runner'
|
6
|
+
require 'dk/dry_runner'
|
7
|
+
require 'dk/null_logger'
|
8
|
+
require 'dk/task'
|
9
|
+
require 'dk/tree_runner'
|
10
|
+
require 'dk/version'
|
11
|
+
|
12
|
+
class Dk::CLI
|
13
|
+
|
14
|
+
class UnitTests < Assert::Context
|
15
|
+
desc "Dk::CLI"
|
16
|
+
setup do
|
17
|
+
@cli_class = Dk::CLI
|
18
|
+
end
|
19
|
+
subject{ @cli_class }
|
20
|
+
|
21
|
+
should have_imeths :run
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class InitTests < UnitTests
|
26
|
+
desc "when init"
|
27
|
+
setup do
|
28
|
+
@kernel_spy = KernelSpy.new
|
29
|
+
|
30
|
+
Dk.reset
|
31
|
+
ENV['DK_CONFIG'] = ROOT_PATH.join('test/support/config/dk.rb').to_s
|
32
|
+
@cli = Dk::CLI.new(@kernel_spy)
|
33
|
+
|
34
|
+
null_logger = Dk::NullLogger.new
|
35
|
+
Assert.stub(Dk.config, :dk_logger){ null_logger }
|
36
|
+
end
|
37
|
+
teardown do
|
38
|
+
Dk.reset
|
39
|
+
end
|
40
|
+
subject{ @cli }
|
41
|
+
|
42
|
+
should have_readers :clirb
|
43
|
+
should have_imeths :run
|
44
|
+
|
45
|
+
should "know its clirb" do
|
46
|
+
assert_instance_of Dk::CLIRB, subject.clirb
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
class RunTests < InitTests
|
52
|
+
desc "and run with a configured task name"
|
53
|
+
setup do
|
54
|
+
@runner_init_with = nil
|
55
|
+
@log_cli_run_called_with = nil
|
56
|
+
@log_cli_task_runs = []
|
57
|
+
@runner_runs = []
|
58
|
+
Assert.stub(Dk::DkRunner, :new) do |*args|
|
59
|
+
@runner_init_with = args
|
60
|
+
|
61
|
+
runner = Assert.stub_send(Dk::DkRunner, :new, *args)
|
62
|
+
Assert.stub(runner, :run){ |*args| @runner_runs << args }
|
63
|
+
Assert.stub(runner, :log_cli_run) do |*args, &block|
|
64
|
+
@log_cli_run_called_with = args
|
65
|
+
block.call
|
66
|
+
end
|
67
|
+
Assert.stub(runner, :log_cli_task_run) do |*args, &block|
|
68
|
+
@log_cli_task_runs << args
|
69
|
+
block.call
|
70
|
+
end
|
71
|
+
runner
|
72
|
+
end
|
73
|
+
@cli_args = ['cli-test-task', 'cli-other-task']
|
74
|
+
@cli.run(*@cli_args)
|
75
|
+
end
|
76
|
+
|
77
|
+
should "build a live runner, log the CLI args, run the named tasks and exit" do
|
78
|
+
assert_equal [Dk.config], @runner_init_with
|
79
|
+
assert_equal [@cli_args.join(' ')], @log_cli_run_called_with
|
80
|
+
|
81
|
+
assert_equal 2, @log_cli_task_runs.size
|
82
|
+
assert_equal [@cli_args.first], @log_cli_task_runs.first
|
83
|
+
assert_equal [@cli_args.last], @log_cli_task_runs.last
|
84
|
+
|
85
|
+
assert_equal 2, @runner_runs.size
|
86
|
+
assert_equal [CLITestTask], @runner_runs.first
|
87
|
+
assert_equal [CLIOtherTask], @runner_runs.last
|
88
|
+
|
89
|
+
assert_equal 0, @kernel_spy.exit_status
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
class RunWithDryRunFlagTests < InitTests
|
95
|
+
desc "and run with the --dry-run flag"
|
96
|
+
setup do
|
97
|
+
@runner_init_with = nil
|
98
|
+
@runner_run_with = nil
|
99
|
+
Assert.stub(Dk::DryRunner, :new) do |*args|
|
100
|
+
@runner_init_with = args
|
101
|
+
|
102
|
+
runner = Assert.stub_send(Dk::DryRunner, :new, *args)
|
103
|
+
Assert.stub(runner, :run){ |*args| @runner_run_with = args }
|
104
|
+
runner
|
105
|
+
end
|
106
|
+
@cli.run('cli-test-task', '--dry-run')
|
107
|
+
end
|
108
|
+
|
109
|
+
should "build dry runner and run the named task and exit" do
|
110
|
+
assert_equal [Dk.config], @runner_init_with
|
111
|
+
assert_equal [CLITestTask], @runner_run_with
|
112
|
+
|
113
|
+
assert_equal 0, @kernel_spy.exit_status
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
class RunWithTreeFlagTests < InitTests
|
119
|
+
desc "and run with the --tree flag"
|
120
|
+
setup do
|
121
|
+
@runner_init_with = nil
|
122
|
+
@runner_run_with = nil
|
123
|
+
Assert.stub(Dk::TreeRunner, :new) do |*args|
|
124
|
+
@runner_init_with = args
|
125
|
+
|
126
|
+
runner = Assert.stub_send(Dk::TreeRunner, :new, *args)
|
127
|
+
Assert.stub(runner, :run){ |*args| @runner_run_with = args }
|
128
|
+
runner
|
129
|
+
end
|
130
|
+
@cli.run('cli-test-task', '--tree')
|
131
|
+
end
|
132
|
+
|
133
|
+
should "build tree runner and run the named task and exit" do
|
134
|
+
assert_equal [Dk.config, @kernel_spy], @runner_init_with
|
135
|
+
assert_equal [CLITestTask], @runner_run_with
|
136
|
+
|
137
|
+
assert_equal 0, @kernel_spy.exit_status
|
138
|
+
assert_match /^building task tree\.\.\./, @kernel_spy.output
|
139
|
+
|
140
|
+
kernel_spy = KernelSpy.new
|
141
|
+
cli = Dk::CLI.new(kernel_spy)
|
142
|
+
cli.run('cli-test-task', 'cli-test-task', '--tree')
|
143
|
+
assert_match /^building task trees\.\.\./, kernel_spy.output
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
class RunWithDashTFlagTests < InitTests
|
149
|
+
desc "and run with the -T flag"
|
150
|
+
setup do
|
151
|
+
@cli.run(['-T', '--list-tasks'].sample)
|
152
|
+
end
|
153
|
+
|
154
|
+
should "list out the callable task details and exit" do
|
155
|
+
max = Dk.config.tasks.keys.map(&:size).max
|
156
|
+
tasks = Dk.config.tasks.map do |(name, task_class)|
|
157
|
+
"#{name.ljust(max)} # #{task_class.description}"
|
158
|
+
end
|
159
|
+
|
160
|
+
exp = "#{tasks.sort.join("\n")}\n"
|
161
|
+
assert_equal exp, @kernel_spy.output
|
162
|
+
assert_equal 0, @kernel_spy.exit_status
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
class RunWithVerboseFlagTests < InitTests
|
168
|
+
desc "and run with the --verbose flag"
|
169
|
+
setup do
|
170
|
+
@cli.run('--verbose')
|
171
|
+
end
|
172
|
+
|
173
|
+
should "set the stdout log level to 'debug'" do
|
174
|
+
assert_equal 'debug', Dk.config.stdout_log_level
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
class RunWithHelpFlagTests < InitTests
|
180
|
+
desc "and run with the --help flag"
|
181
|
+
setup do
|
182
|
+
@cli.run('--help')
|
183
|
+
end
|
184
|
+
|
185
|
+
should "print some help info and exit" do
|
186
|
+
max = Dk.config.tasks.keys.map(&:size).max
|
187
|
+
tasks = Dk.config.tasks.map do |(name, task_class)|
|
188
|
+
" #{name.ljust(max)} # #{task_class.description}"
|
189
|
+
end
|
190
|
+
|
191
|
+
exp = "Usage: dk [TASKS] [options]\n\n" \
|
192
|
+
"Tasks:\n" \
|
193
|
+
"#{tasks.sort.join("\n")}\n\n" \
|
194
|
+
"Options: #{subject.clirb.to_s}"
|
195
|
+
assert_equal exp, @kernel_spy.output
|
196
|
+
assert_equal 0, @kernel_spy.exit_status
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
class RunWithVersionFlagTests < InitTests
|
202
|
+
desc "and run with the --version flag"
|
203
|
+
setup do
|
204
|
+
@cli.run('--version')
|
205
|
+
end
|
206
|
+
|
207
|
+
should "print some help info and exit" do
|
208
|
+
exp = "#{Dk::VERSION}\n"
|
209
|
+
assert_equal exp, @kernel_spy.output
|
210
|
+
assert_equal 0, @kernel_spy.exit_status
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
class RunWithUnknownTaskTests < InitTests
|
216
|
+
desc "and run with an unknown task(s)"
|
217
|
+
setup do
|
218
|
+
@task_names = Factory.integer(3).times.map{ Factory.string }
|
219
|
+
@cli.run(*@task_names)
|
220
|
+
end
|
221
|
+
|
222
|
+
should "output to the user that the task is not known and exit" do
|
223
|
+
exp = "No task named #{@task_names.map{ |n| "`#{n}`"}.join(', ')}"
|
224
|
+
assert_includes exp, @kernel_spy.output
|
225
|
+
assert_equal 1, @kernel_spy.exit_status
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
class RunWithInvalidOptionTests < InitTests
|
231
|
+
desc "and run with an invalid option"
|
232
|
+
setup do
|
233
|
+
@option_name = "--#{Factory.string}"
|
234
|
+
@cli.run(@option_name)
|
235
|
+
end
|
236
|
+
|
237
|
+
should "output to the user that the option is invalid and exit" do
|
238
|
+
exp = "invalid option: #{@option_name}"
|
239
|
+
assert_includes exp, @kernel_spy.output
|
240
|
+
assert_equal 1, @kernel_spy.exit_status
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
class RunWithNoticeErrorTests < InitTests
|
246
|
+
desc "and run with an error notification"
|
247
|
+
setup do
|
248
|
+
@exception = nil
|
249
|
+
Assert.stub(subject.clirb, :parse!) do
|
250
|
+
begin
|
251
|
+
raise Dk::NoticeError, Factory.string
|
252
|
+
rescue Dk::NoticeError => err
|
253
|
+
@exception = err
|
254
|
+
raise @exception
|
255
|
+
end
|
256
|
+
end
|
257
|
+
@cli.run
|
258
|
+
end
|
259
|
+
|
260
|
+
should "output the error and exit" do
|
261
|
+
exp = "\n\n#{@exception.message}\n\n#{@exception.backtrace.first}\n"
|
262
|
+
assert_includes exp, @kernel_spy.output
|
263
|
+
assert_equal 1, @kernel_spy.exit_status
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
|
268
|
+
class RunWithAnErrorTests < InitTests
|
269
|
+
desc "and run with an error"
|
270
|
+
setup do
|
271
|
+
Assert.stub(subject.clirb, :parse!){ raise StandardError, 'test' }
|
272
|
+
@exception = nil
|
273
|
+
Assert.stub(subject.clirb, :parse!) do
|
274
|
+
begin
|
275
|
+
raise StandardError, Factory.string
|
276
|
+
rescue StandardError => err
|
277
|
+
@exception = err
|
278
|
+
raise @exception
|
279
|
+
end
|
280
|
+
end
|
281
|
+
@cli.run
|
282
|
+
end
|
283
|
+
|
284
|
+
should "output the error and exit" do
|
285
|
+
exp = "\n\nStandardError: #{@exception.message}\n" \
|
286
|
+
"#{@exception.backtrace.join("\n")}"
|
287
|
+
assert_includes exp, @kernel_spy.output
|
288
|
+
assert_equal 1, @kernel_spy.exit_status
|
289
|
+
end
|
290
|
+
|
291
|
+
end
|
292
|
+
|
293
|
+
class KernelSpy
|
294
|
+
def initialize
|
295
|
+
@output = StringIO.new
|
296
|
+
@exit_statuses = []
|
297
|
+
end
|
298
|
+
|
299
|
+
def output
|
300
|
+
@output.rewind
|
301
|
+
@output.read
|
302
|
+
end
|
303
|
+
|
304
|
+
def puts(message)
|
305
|
+
@output.puts(message)
|
306
|
+
end
|
307
|
+
|
308
|
+
def exit(code)
|
309
|
+
@exit_statuses << code
|
310
|
+
end
|
311
|
+
|
312
|
+
def exit_status
|
313
|
+
@exit_statuses.first
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'dk/config_runner'
|
3
|
+
|
4
|
+
require 'dk/config'
|
5
|
+
require 'dk/runner'
|
6
|
+
|
7
|
+
class Dk::ConfigRunner
|
8
|
+
|
9
|
+
class UnitTests < Assert::Context
|
10
|
+
desc "Dk::ConfigRunner"
|
11
|
+
setup do
|
12
|
+
@runner_class = Dk::ConfigRunner
|
13
|
+
end
|
14
|
+
subject{ @runner_class }
|
15
|
+
|
16
|
+
should "be a Dk::Runner" do
|
17
|
+
assert_true subject < Dk::Runner
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
class InitTests < UnitTests
|
23
|
+
desc "when init"
|
24
|
+
setup do
|
25
|
+
@name = ['before', 'after'].sample
|
26
|
+
@task_class = Factory.string
|
27
|
+
@callbacks = Factory.integer(3).times.map{ Factory.string }
|
28
|
+
|
29
|
+
@config = Dk::Config.new
|
30
|
+
|
31
|
+
@callbacks.each do |callback_task_class|
|
32
|
+
@config.send(@name, @task_class, callback_task_class)
|
33
|
+
@config.send("prepend_#{@name}", @task_class, callback_task_class)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
should "initialize using the config's values" do
|
38
|
+
runner = @runner_class.new(@config)
|
39
|
+
|
40
|
+
assert_equal @config.params, runner.params
|
41
|
+
assert_equal @config.ssh_hosts, runner.ssh_hosts
|
42
|
+
assert_equal @config.ssh_args, runner.ssh_args
|
43
|
+
assert_equal @config.host_ssh_args, runner.host_ssh_args
|
44
|
+
assert_equal @config.dk_logger, runner.logger
|
45
|
+
|
46
|
+
exp = @callbacks
|
47
|
+
assert_equal exp, runner.task_callbacks(@name, @task_class).map(&:task_class)
|
48
|
+
exp = @callbacks.reverse
|
49
|
+
assert_equal exp, runner.task_callbacks("prepend_#{@name}", @task_class).map(&:task_class)
|
50
|
+
end
|
51
|
+
|
52
|
+
should "honor any custom logger option" do
|
53
|
+
logger = Factory.string
|
54
|
+
runner = @runner_class.new(@config, :logger => logger)
|
55
|
+
assert_equal logger, runner.logger
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|