ardb 0.26.0 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ardb.gemspec +1 -0
- data/bin/ardb +1 -1
- data/lib/ardb.rb +1 -1
- data/lib/ardb/adapter/base.rb +73 -66
- data/lib/ardb/adapter/sqlite.rb +1 -1
- data/lib/ardb/adapter_spy.rb +18 -5
- data/lib/ardb/cli.rb +239 -76
- data/lib/ardb/clirb.rb +58 -0
- data/lib/ardb/default_order_by.rb +59 -0
- data/lib/ardb/has_slug.rb +7 -6
- data/lib/ardb/migration.rb +42 -0
- data/lib/ardb/migration_helpers.rb +56 -53
- data/lib/ardb/record_spy.rb +5 -5
- data/lib/ardb/relation_spy.rb +13 -2
- data/lib/ardb/root_path.rb +7 -4
- data/lib/ardb/test_helpers.rb +56 -42
- data/lib/ardb/use_db_default.rb +8 -7
- data/lib/ardb/version.rb +1 -1
- data/test/support/factory.rb +5 -0
- data/test/unit/adapter/base_tests.rb +22 -5
- data/test/unit/adapter/mysql_tests.rb +1 -1
- data/test/unit/adapter/sqlite_tests.rb +2 -2
- data/test/unit/adapter_spy_tests.rb +19 -6
- data/test/unit/cli_tests.rb +610 -0
- data/test/unit/default_order_by_tests.rb +122 -0
- data/test/unit/has_slug_tests.rb +5 -0
- data/test/unit/migration_tests.rb +88 -0
- data/test/unit/record_spy_tests.rb +6 -0
- data/test/unit/test_helpers_tests.rb +26 -3
- data/test/unit/use_db_default_tests.rb +5 -0
- metadata +31 -25
- data/lib/ardb/runner.rb +0 -50
- data/lib/ardb/runner/connect_command.rb +0 -20
- data/lib/ardb/runner/create_command.rb +0 -25
- data/lib/ardb/runner/drop_command.rb +0 -25
- data/lib/ardb/runner/generate_command.rb +0 -64
- data/lib/ardb/runner/migrate_command.rb +0 -28
- data/test/unit/runner/connect_command_tests.rb +0 -17
- data/test/unit/runner/create_command_tests.rb +0 -67
- data/test/unit/runner/drop_command_tests.rb +0 -68
- data/test/unit/runner/generate_command_tests.rb +0 -46
- data/test/unit/runner/migrate_command_tests.rb +0 -96
- data/test/unit/runner_tests.rb +0 -69
data/lib/ardb/runner.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'ardb'
|
2
|
-
|
3
|
-
module Ardb; end
|
4
|
-
class Ardb::Runner
|
5
|
-
UnknownCmdError = Class.new(ArgumentError)
|
6
|
-
CmdError = Class.new(RuntimeError)
|
7
|
-
CmdFail = Class.new(RuntimeError)
|
8
|
-
|
9
|
-
attr_reader :cmd_name, :cmd_args, :opts
|
10
|
-
|
11
|
-
def initialize(args, opts)
|
12
|
-
@opts = opts
|
13
|
-
@cmd_name = args.shift || ""
|
14
|
-
@cmd_args = args
|
15
|
-
end
|
16
|
-
|
17
|
-
def run
|
18
|
-
$LOAD_PATH.push(Dir.pwd) unless $LOAD_PATH.include?(Dir.pwd)
|
19
|
-
Ardb.init(false) # don't establish a connection
|
20
|
-
|
21
|
-
case @cmd_name
|
22
|
-
when 'migrate'
|
23
|
-
require 'ardb/runner/migrate_command'
|
24
|
-
MigrateCommand.new.run
|
25
|
-
when 'generate'
|
26
|
-
require 'ardb/runner/generate_command'
|
27
|
-
GenerateCommand.new(@cmd_args).run
|
28
|
-
when 'create'
|
29
|
-
require 'ardb/runner/create_command'
|
30
|
-
CreateCommand.new.run
|
31
|
-
when 'drop'
|
32
|
-
require 'ardb/runner/drop_command'
|
33
|
-
DropCommand.new.run
|
34
|
-
when 'connect'
|
35
|
-
require 'ardb/runner/connect_command'
|
36
|
-
ConnectCommand.new.run
|
37
|
-
when 'null'
|
38
|
-
NullCommand.new.run
|
39
|
-
else
|
40
|
-
raise UnknownCmdError, "unknown command `#{@cmd_name}`"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class NullCommand
|
45
|
-
def run
|
46
|
-
# if this was a real command it would do something here
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'ardb/runner'
|
2
|
-
|
3
|
-
class Ardb::Runner::ConnectCommand
|
4
|
-
|
5
|
-
def run
|
6
|
-
begin
|
7
|
-
Ardb.init
|
8
|
-
ActiveRecord::Base.connection
|
9
|
-
$stdout.puts "connected to #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`"
|
10
|
-
rescue Ardb::Runner::CmdError => e
|
11
|
-
raise e
|
12
|
-
rescue Exception => e
|
13
|
-
$stderr.puts e, *e.backtrace
|
14
|
-
$stderr.puts "error connecting to #{Ardb.config.db.database.inspect} database"\
|
15
|
-
" with #{Ardb.config.db_settings.inspect}"
|
16
|
-
raise Ardb::Runner::CmdFail
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
require 'ardb/runner'
|
3
|
-
|
4
|
-
class Ardb::Runner::CreateCommand
|
5
|
-
|
6
|
-
def initialize(out_io = nil, err_io = nil)
|
7
|
-
@out_io = out_io || $stdout
|
8
|
-
@err_io = err_io || $stderr
|
9
|
-
@adapter = Ardb::Adapter.send(Ardb.config.db.adapter)
|
10
|
-
end
|
11
|
-
|
12
|
-
def run
|
13
|
-
begin
|
14
|
-
@adapter.create_db
|
15
|
-
@out_io.puts "created #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`"
|
16
|
-
rescue Ardb::Runner::CmdError => e
|
17
|
-
raise e
|
18
|
-
rescue StandardError => e
|
19
|
-
@err_io.puts e
|
20
|
-
@err_io.puts "error creating #{Ardb.config.db.database.inspect} database"
|
21
|
-
raise Ardb::Runner::CmdFail
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
require 'ardb/runner'
|
3
|
-
|
4
|
-
class Ardb::Runner::DropCommand
|
5
|
-
|
6
|
-
def initialize(out_io = nil, err_io = nil)
|
7
|
-
@out_io = out_io || $stdout
|
8
|
-
@err_io = err_io || $stderr
|
9
|
-
@adapter = Ardb::Adapter.send(Ardb.config.db.adapter)
|
10
|
-
end
|
11
|
-
|
12
|
-
def run
|
13
|
-
begin
|
14
|
-
@adapter.drop_db
|
15
|
-
@out_io.puts "dropped #{Ardb.config.db.adapter} db `#{Ardb.config.db.database}`"
|
16
|
-
rescue Ardb::Runner::CmdError => e
|
17
|
-
raise e
|
18
|
-
rescue StandardError => e
|
19
|
-
@err_io.puts e
|
20
|
-
@err_io.puts "error dropping #{Ardb.config.db.database.inspect} database"
|
21
|
-
raise Ardb::Runner::CmdFail
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'active_support/core_ext/string'
|
3
|
-
require 'ardb/runner'
|
4
|
-
|
5
|
-
class Ardb::Runner::GenerateCommand
|
6
|
-
|
7
|
-
def initialize(args)
|
8
|
-
@item = args.shift
|
9
|
-
@args = args
|
10
|
-
end
|
11
|
-
|
12
|
-
def run
|
13
|
-
if @item.nil?
|
14
|
-
raise Ardb::Runner::CmdError, "specify an item to generate"
|
15
|
-
end
|
16
|
-
if !self.respond_to?("#{@item}_cmd")
|
17
|
-
raise Ardb::Runner::CmdError, "can't generate #{@item}"
|
18
|
-
end
|
19
|
-
|
20
|
-
begin
|
21
|
-
self.send("#{@item}_cmd")
|
22
|
-
rescue Ardb::Runner::CmdError => e
|
23
|
-
raise e
|
24
|
-
rescue Exception => e
|
25
|
-
$stderr.puts e
|
26
|
-
$stderr.puts "error generating #{@item}."
|
27
|
-
raise Ardb::Runner::CmdFail
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def migration_cmd
|
32
|
-
MigrationCommand.new(@args.first).run
|
33
|
-
end
|
34
|
-
|
35
|
-
class MigrationCommand
|
36
|
-
attr_reader :identifier, :class_name, :file_name, :template
|
37
|
-
|
38
|
-
def initialize(identifier)
|
39
|
-
if identifier.nil?
|
40
|
-
raise Ardb::Runner::CmdError, "specify a name for the migration"
|
41
|
-
end
|
42
|
-
|
43
|
-
@identifier = identifier
|
44
|
-
@class_name = @identifier.classify.pluralize
|
45
|
-
@file_name = begin
|
46
|
-
"#{Time.now.strftime("%Y%m%d%H%M%S")}_#{@identifier.underscore}"
|
47
|
-
end
|
48
|
-
@template = "require 'ardb/migration_helpers'\n\n"\
|
49
|
-
"class #{@class_name} < ActiveRecord::Migration\n"\
|
50
|
-
" include Ardb::MigrationHelpers\n\n"\
|
51
|
-
" def change\n"\
|
52
|
-
" end\n\n"\
|
53
|
-
"end\n"
|
54
|
-
end
|
55
|
-
|
56
|
-
def run
|
57
|
-
FileUtils.mkdir_p Ardb.config.migrations_path
|
58
|
-
file_path = File.join(Ardb.config.migrations_path, "#{@file_name}.rb")
|
59
|
-
File.open(file_path, "w"){ |f| f.write(@template) }
|
60
|
-
$stdout.puts file_path
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'active_record'
|
3
|
-
require 'ardb/runner'
|
4
|
-
|
5
|
-
class Ardb::Runner::MigrateCommand
|
6
|
-
|
7
|
-
def initialize(out_io = nil, err_io = nil)
|
8
|
-
@out_io = out_io || $stdout
|
9
|
-
@err_io = err_io || $stderr
|
10
|
-
@adapter = Ardb::Adapter.send(Ardb.config.db.adapter)
|
11
|
-
end
|
12
|
-
|
13
|
-
def run
|
14
|
-
begin
|
15
|
-
Ardb.init
|
16
|
-
@adapter.migrate_db
|
17
|
-
@adapter.dump_schema unless ENV['ARDB_MIGRATE_NO_SCHEMA']
|
18
|
-
rescue Ardb::Runner::CmdError => e
|
19
|
-
raise e
|
20
|
-
rescue StandardError => e
|
21
|
-
@err_io.puts "error migrating #{Ardb.config.db.database.inspect} database"
|
22
|
-
@err_io.puts e
|
23
|
-
@err_io.puts e.backtrace
|
24
|
-
raise Ardb::Runner::CmdFail
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'ardb/runner/connect_command'
|
3
|
-
|
4
|
-
class Ardb::Runner::ConnectCommand
|
5
|
-
|
6
|
-
class UnitTests < Assert::Context
|
7
|
-
desc "Ardb::Runner::ConnectCommand"
|
8
|
-
setup do
|
9
|
-
@cmd = Ardb::Runner::ConnectCommand.new
|
10
|
-
end
|
11
|
-
subject{ @cmd }
|
12
|
-
|
13
|
-
should have_imeths :run
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'ardb/adapter_spy'
|
3
|
-
require 'ardb/runner/create_command'
|
4
|
-
|
5
|
-
class Ardb::Runner::CreateCommand
|
6
|
-
|
7
|
-
class UnitTests < Assert::Context
|
8
|
-
desc "Ardb::Runner::CreateCommand"
|
9
|
-
setup do
|
10
|
-
@command_class = Ardb::Runner::CreateCommand
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
class InitTests < UnitTests
|
16
|
-
desc "when init"
|
17
|
-
setup do
|
18
|
-
@adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
|
19
|
-
Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
|
20
|
-
|
21
|
-
# provide an output and error IO to avoid using $stdout/$stderr in tests
|
22
|
-
out_io = err_io = StringIO.new
|
23
|
-
@command = @command_class.new(out_io, err_io)
|
24
|
-
end
|
25
|
-
subject{ @command }
|
26
|
-
|
27
|
-
should have_imeths :run
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
class RunTests < InitTests
|
32
|
-
desc "and run"
|
33
|
-
setup do
|
34
|
-
@command.run
|
35
|
-
end
|
36
|
-
|
37
|
-
should "create the db via the adapter" do
|
38
|
-
assert_equal true, @adapter_spy.create_db_called?
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
class RunWithCmdErrorTests < InitTests
|
44
|
-
desc "and run with command errors"
|
45
|
-
setup do
|
46
|
-
Assert.stub(@adapter_spy, :create_db){ raise Ardb::Runner::CmdError.new }
|
47
|
-
end
|
48
|
-
|
49
|
-
should "not handle the error" do
|
50
|
-
assert_raises(Ardb::Runner::CmdError){ subject.run }
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
class RunWithUnspecifiedErrorTests < InitTests
|
56
|
-
desc "and run with a standard error"
|
57
|
-
setup do
|
58
|
-
Assert.stub(@adapter_spy, :create_db){ raise StandardError.new }
|
59
|
-
end
|
60
|
-
|
61
|
-
should "raise a CmdFail error" do
|
62
|
-
assert_raises(Ardb::Runner::CmdFail){ subject.run }
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'ardb/adapter_spy'
|
3
|
-
require 'ardb/runner/drop_command'
|
4
|
-
|
5
|
-
class Ardb::Runner::DropCommand
|
6
|
-
|
7
|
-
class UnitTests < Assert::Context
|
8
|
-
desc "Ardb::Runner::DropCommand"
|
9
|
-
setup do
|
10
|
-
@command_class = Ardb::Runner::DropCommand
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
class InitTests < UnitTests
|
16
|
-
desc "when init"
|
17
|
-
setup do
|
18
|
-
@adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
|
19
|
-
Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
|
20
|
-
|
21
|
-
# provide an output and error IO to avoid using $stdout/$stderr in tests
|
22
|
-
out_io = err_io = StringIO.new
|
23
|
-
@command = @command_class.new(out_io, err_io)
|
24
|
-
end
|
25
|
-
subject{ @command }
|
26
|
-
|
27
|
-
should have_imeths :run
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
class RunTests < InitTests
|
32
|
-
desc "and run"
|
33
|
-
setup do
|
34
|
-
@command.run
|
35
|
-
end
|
36
|
-
|
37
|
-
should "drop the db via the adapter" do
|
38
|
-
assert_equal true, @adapter_spy.drop_db_called?
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
class RunWithCmdErrorTests < InitTests
|
44
|
-
desc "and run with command errors"
|
45
|
-
setup do
|
46
|
-
Assert.stub(@adapter_spy, :drop_db){ raise Ardb::Runner::CmdError.new }
|
47
|
-
end
|
48
|
-
|
49
|
-
should "not handle the error" do
|
50
|
-
assert_raises(Ardb::Runner::CmdError){ subject.run }
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
class RunWithUnspecifiedErrorTests < InitTests
|
56
|
-
desc "and run with a standard error"
|
57
|
-
setup do
|
58
|
-
Assert.stub(@adapter_spy, :drop_db){ raise StandardError.new }
|
59
|
-
end
|
60
|
-
|
61
|
-
should "raise a CmdFail error" do
|
62
|
-
assert_raises(Ardb::Runner::CmdFail){ subject.run }
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'ardb/runner/generate_command'
|
3
|
-
|
4
|
-
class Ardb::Runner::GenerateCommand
|
5
|
-
|
6
|
-
class UnitTests < Assert::Context
|
7
|
-
desc "Ardb::Runner::GenerateCommand"
|
8
|
-
setup do
|
9
|
-
@cmd = Ardb::Runner::GenerateCommand.new(['something'])
|
10
|
-
end
|
11
|
-
subject{ @cmd }
|
12
|
-
|
13
|
-
should have_imeths :run, :migration_cmd
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
class MigrationTests < UnitTests
|
18
|
-
desc "Ardb::Runner::GenerateCommand::MigrationCommand"
|
19
|
-
setup do
|
20
|
-
@cmd = Ardb::Runner::GenerateCommand::MigrationCommand.new('a_migration')
|
21
|
-
end
|
22
|
-
|
23
|
-
should have_readers :identifier, :class_name, :file_name, :template
|
24
|
-
|
25
|
-
should "know its given identifier" do
|
26
|
-
assert_equal 'a_migration', subject.identifier
|
27
|
-
end
|
28
|
-
|
29
|
-
should "know its class name" do
|
30
|
-
assert_equal "AMigrations", subject.class_name
|
31
|
-
end
|
32
|
-
|
33
|
-
should "know its file name" do
|
34
|
-
assert_match /.+_a_migration$/, subject.file_name
|
35
|
-
end
|
36
|
-
|
37
|
-
should "know its template" do
|
38
|
-
assert_includes "require 'ardb/migration_helpers'", subject.template
|
39
|
-
assert_includes "class #{subject.class_name} < ActiveRecord::Migration", subject.template
|
40
|
-
assert_includes "include Ardb::MigrationHelpers", subject.template
|
41
|
-
assert_includes "def change", subject.template
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'assert'
|
2
|
-
require 'ardb/adapter_spy'
|
3
|
-
require 'ardb/runner/migrate_command'
|
4
|
-
|
5
|
-
class Ardb::Runner::MigrateCommand
|
6
|
-
|
7
|
-
class UnitTests < Assert::Context
|
8
|
-
desc "Ardb::Runner::MigrateCommand"
|
9
|
-
setup do
|
10
|
-
@command_class = Ardb::Runner::MigrateCommand
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
class InitTests < UnitTests
|
16
|
-
desc "when init"
|
17
|
-
setup do
|
18
|
-
@adapter_spy = Class.new{ include Ardb::AdapterSpy }.new
|
19
|
-
Assert.stub(Ardb::Adapter, Ardb.config.db.adapter.to_sym){ @adapter_spy }
|
20
|
-
|
21
|
-
@ardb_init_called = false
|
22
|
-
Assert.stub(Ardb, :init){ @ardb_init_called = true }
|
23
|
-
|
24
|
-
# provide an output and error IO to avoid using $stdout/$stderr in tests
|
25
|
-
out_io = err_io = StringIO.new
|
26
|
-
@command = @command_class.new(out_io, err_io)
|
27
|
-
end
|
28
|
-
subject{ @command }
|
29
|
-
|
30
|
-
should have_imeths :run
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
class RunSetupTests < InitTests
|
35
|
-
desc "and run"
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
class RunTests < RunSetupTests
|
40
|
-
setup do
|
41
|
-
@command.run
|
42
|
-
end
|
43
|
-
|
44
|
-
should "initialize Ardb, migrate the db and dump schema via the adapter" do
|
45
|
-
assert_true @ardb_init_called
|
46
|
-
assert_true @adapter_spy.migrate_db_called?
|
47
|
-
assert_true @adapter_spy.dump_schema_called?
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
class RunWithNoSchemaEnvVarTests < RunSetupTests
|
53
|
-
desc "with no schema dump env var set"
|
54
|
-
setup do
|
55
|
-
@current_no_schema = ENV['ARDB_MIGRATE_NO_SCHEMA']
|
56
|
-
ENV['ARDB_MIGRATE_NO_SCHEMA'] = 'yes'
|
57
|
-
|
58
|
-
@command.run
|
59
|
-
end
|
60
|
-
teardown do
|
61
|
-
ENV['ARDB_MIGRATE_NO_SCHEMA'] = @current_no_schema
|
62
|
-
end
|
63
|
-
|
64
|
-
should "initialize Ardb and migrate the db but not dump schema" do
|
65
|
-
assert_true @ardb_init_called
|
66
|
-
assert_true @adapter_spy.migrate_db_called?
|
67
|
-
assert_false @adapter_spy.dump_schema_called?
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
class RunWithCmdErrorTests < InitTests
|
73
|
-
desc "and run with command errors"
|
74
|
-
setup do
|
75
|
-
Assert.stub(@adapter_spy, :migrate_db){ raise Ardb::Runner::CmdError.new }
|
76
|
-
end
|
77
|
-
|
78
|
-
should "not handle the error" do
|
79
|
-
assert_raises(Ardb::Runner::CmdError){ subject.run }
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
class RunWithUnspecifiedErrorTests < InitTests
|
85
|
-
desc "and run with a standard error"
|
86
|
-
setup do
|
87
|
-
Assert.stub(@adapter_spy, :migrate_db){ raise StandardError.new }
|
88
|
-
end
|
89
|
-
|
90
|
-
should "raise a CmdFail error" do
|
91
|
-
assert_raises(Ardb::Runner::CmdFail){ subject.run }
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|