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.
Files changed (51) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +643 -1
  3. data/bin/dk +7 -0
  4. data/dk.gemspec +7 -3
  5. data/lib/dk/ansi.rb +98 -0
  6. data/lib/dk/cli.rb +173 -0
  7. data/lib/dk/config.rb +217 -0
  8. data/lib/dk/config_runner.rb +24 -0
  9. data/lib/dk/dk_runner.rb +13 -0
  10. data/lib/dk/dry_runner.rb +43 -0
  11. data/lib/dk/has_set_param.rb +42 -0
  12. data/lib/dk/has_ssh_opts.rb +36 -0
  13. data/lib/dk/has_the_runs.rb +23 -0
  14. data/lib/dk/has_the_stubs.rb +116 -0
  15. data/lib/dk/local.rb +84 -0
  16. data/lib/dk/null_logger.rb +13 -0
  17. data/lib/dk/remote.rb +132 -0
  18. data/lib/dk/runner.rb +202 -0
  19. data/lib/dk/task.rb +266 -0
  20. data/lib/dk/task_run.rb +17 -0
  21. data/lib/dk/test_runner.rb +54 -0
  22. data/lib/dk/tree_runner.rb +64 -0
  23. data/lib/dk/version.rb +1 -1
  24. data/lib/dk.rb +23 -1
  25. data/test/helper.rb +6 -1
  26. data/test/support/config/dk.rb +7 -0
  27. data/test/support/config/task_defs.rb +10 -0
  28. data/test/support/factory.rb +38 -0
  29. data/test/support/log/.gitkeep +0 -0
  30. data/test/system/has_the_stubs_tests.rb +355 -0
  31. data/test/system/runner_tests.rb +222 -0
  32. data/test/unit/ansi_tests.rb +40 -0
  33. data/test/unit/cli_tests.rb +317 -0
  34. data/test/unit/config_runner_tests.rb +60 -0
  35. data/test/unit/config_tests.rb +427 -0
  36. data/test/unit/dk_runner_tests.rb +34 -0
  37. data/test/unit/dk_tests.rb +49 -0
  38. data/test/unit/dry_runner_tests.rb +71 -0
  39. data/test/unit/has_set_param_tests.rb +46 -0
  40. data/test/unit/has_ssh_opts_tests.rb +81 -0
  41. data/test/unit/has_the_runs_tests.rb +37 -0
  42. data/test/unit/has_the_stubs_tests.rb +279 -0
  43. data/test/unit/local_tests.rb +174 -0
  44. data/test/unit/null_logger_tests.rb +17 -0
  45. data/test/unit/remote_tests.rb +330 -0
  46. data/test/unit/runner_tests.rb +398 -0
  47. data/test/unit/task_run_tests.rb +40 -0
  48. data/test/unit/task_tests.rb +943 -0
  49. data/test/unit/test_runner_tests.rb +189 -0
  50. data/test/unit/tree_runner_tests.rb +152 -0
  51. 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