mina 1.2.4 → 1.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +11 -3
- data/.gitignore +0 -1
- data/.rspec +1 -1
- data/.rubocop.yml +28 -1126
- data/CHANGELOG.md +89 -8
- data/Gemfile +2 -0
- data/Gemfile.lock +73 -0
- data/Rakefile +2 -0
- data/Readme.md +8 -12
- data/bin/mina +2 -0
- data/data/deploy.rb +6 -4
- data/docs/3rd_party_plugins.md +1 -0
- data/docs/assets/images/mina.png +0 -0
- data/docs/default_plugins.md +1 -1
- data/docs/how_mina_works.md +2 -2
- data/lib/Minafile +1 -0
- data/lib/mina/application.rb +45 -35
- data/lib/mina/backend/local.rb +2 -0
- data/lib/mina/backend/remote.rb +3 -1
- data/lib/mina/commands.rb +10 -7
- data/lib/mina/configuration.rb +6 -3
- data/lib/mina/dsl.rb +2 -2
- data/lib/mina/helpers/internal.rb +8 -8
- data/lib/mina/helpers/output.rb +5 -3
- data/lib/mina/runner/exec.rb +2 -0
- data/lib/mina/runner/pretty.rb +25 -19
- data/lib/mina/runner/printer.rb +2 -0
- data/lib/mina/runner/system.rb +2 -0
- data/lib/mina/runner.rb +9 -10
- data/lib/mina/version.rb +3 -1
- data/lib/mina/windows_patches.rb +4 -2
- data/lib/mina.rb +4 -3
- data/mina.gemspec +8 -7
- data/spec/configs/default.rb +8 -0
- data/spec/configs/dsl.rb +55 -0
- data/spec/configs/e2e.rb +25 -0
- data/spec/e2e/docker-compose.yml +21 -0
- data/spec/e2e/e2e_run.sh +11 -0
- data/spec/e2e/e2e_spec.rb +35 -0
- data/spec/e2e/ssh +27 -0
- data/spec/e2e/ssh.pub +1 -0
- data/spec/lib/mina/application_spec.rb +94 -35
- data/spec/lib/mina/backend/local_spec.rb +5 -2
- data/spec/lib/mina/backend/remote_spec.rb +5 -3
- data/spec/lib/mina/commands_spec.rb +7 -7
- data/spec/lib/mina/configuration_spec.rb +63 -3
- data/spec/lib/mina/dsl_spec.rb +94 -0
- data/spec/lib/mina/helpers/internal_spec.rb +88 -10
- data/spec/lib/mina/helpers/output_spec.rb +13 -10
- data/spec/lib/mina/runner/exec_spec.rb +19 -0
- data/spec/lib/mina/runner/pretty_spec.rb +17 -0
- data/spec/lib/mina/runner/printer_spec.rb +19 -0
- data/spec/lib/mina/runner/system_spec.rb +19 -0
- data/spec/lib/mina/runner_spec.rb +6 -10
- data/spec/spec_helper.rb +33 -14
- data/spec/support/outputs/bundle_clean.txt +2 -2
- data/spec/support/outputs/chruby_with_env.txt +7 -0
- data/spec/support/outputs/chruby_without_env.txt +2 -0
- data/spec/support/outputs/debug_configuration_variables.txt +11 -0
- data/spec/support/outputs/dsl_deploy.txt +4 -0
- data/spec/support/outputs/dsl_in_path.txt +1 -0
- data/spec/support/outputs/dsl_local_run.txt +5 -0
- data/spec/support/outputs/dsl_on.txt +6 -0
- data/spec/support/outputs/dsl_remote_run.txt +5 -0
- data/spec/support/outputs/dsl_reset.txt +2 -0
- data/spec/support/outputs/e2e_deploy_after_setup.txt +1 -0
- data/spec/support/outputs/e2e_deploy_without_setup.txt +1 -0
- data/spec/support/outputs/e2e_setup.txt +1 -0
- data/spec/support/outputs/environment.txt +1 -0
- data/spec/support/outputs/git_ensure_pushed.txt +15 -0
- data/spec/support/outputs/rails_assets_precompile_force_precompile.txt +2 -0
- data/spec/support/outputs/rails_assets_precompile_outside_deploy_block.txt +1 -0
- data/spec/support/outputs/rails_assets_precompile_with_diff.txt +7 -0
- data/spec/support/outputs/rails_console.txt +1 -0
- data/spec/support/outputs/rails_db_migrate_force_migrate.txt +2 -0
- data/spec/support/outputs/rails_db_migrate_outside_deploy_block.txt +1 -0
- data/spec/support/outputs/rails_db_migrate_with_diff.txt +7 -0
- data/spec/support/outputs/rails_log.txt +1 -0
- data/spec/support/outputs/rails_with_arguments.txt +1 -0
- data/spec/support/outputs/rails_without_arguments.txt +1 -0
- data/spec/support/outputs/rake_with_arguments.txt +1 -0
- data/spec/support/outputs/rake_without_arguments.txt +1 -0
- data/spec/support/outputs/rbenv_load.txt +9 -1
- data/spec/support/outputs/rvm_use_with_env.txt +8 -0
- data/spec/support/outputs/rvm_use_without_env.txt +2 -0
- data/spec/support/outputs/rvm_wrapper_with_arguments.txt +8 -0
- data/spec/support/outputs/rvm_wrapper_without_arguments.txt +2 -0
- data/spec/support/outputs/ry_with_env.txt +13 -0
- data/spec/support/outputs/ry_without_env.txt +13 -0
- data/spec/support/outputs/ssh.txt +1 -0
- data/spec/support/outputs/ssh_keyscan_domain.txt +3 -0
- data/spec/support/rake_example_group.rb +23 -19
- data/spec/tasks/bundler_spec.rb +6 -0
- data/spec/tasks/chruby_spec.rb +29 -0
- data/spec/tasks/default_spec.rb +79 -7
- data/spec/tasks/deploy_spec.rb +6 -0
- data/spec/tasks/git_spec.rb +12 -0
- data/spec/tasks/init_spec.rb +13 -4
- data/spec/tasks/rails_spec.rb +126 -15
- data/spec/tasks/rbenv_spec.rb +15 -0
- data/spec/tasks/rvm_spec.rb +51 -0
- data/spec/tasks/ry_spec.rb +43 -0
- data/tasks/mina/bundler.rb +7 -5
- data/tasks/mina/chruby.rb +7 -5
- data/tasks/mina/default.rb +19 -12
- data/tasks/mina/deploy.rb +26 -24
- data/tasks/mina/git.rb +28 -16
- data/tasks/mina/install.rb +3 -1
- data/tasks/mina/rails.rb +29 -27
- data/tasks/mina/rbenv.rb +8 -6
- data/tasks/mina/rvm.rb +13 -11
- data/tasks/mina/ry.rb +11 -11
- data/test_env/config/deploy.rb +9 -8
- metadata +64 -32
- data/spec/support/outputs/chruby.txt +0 -9
- data/spec/support/outputs/console.txt +0 -1
- data/spec/support/outputs/log.txt +0 -1
- data/spec/support/outputs/rails_db_migrate.txt +0 -1
- data/spec/support/outputs/rvm_use.txt +0 -1
- data/spec/support/outputs/ry.txt +0 -15
- data/spec/tasks/ruby_managers_spec.rb +0 -33
@@ -1,11 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Backend::Local do
|
4
|
-
let(:backend) {
|
6
|
+
let(:backend) { described_class.new ['ls -al'] }
|
7
|
+
|
5
8
|
describe '#prepare' do
|
6
9
|
it 'escpaces shellwords' do
|
7
10
|
Mina::Configuration.instance.remove(:simulate)
|
8
|
-
expect(backend.prepare).to eq(
|
11
|
+
expect(backend.prepare).to eq('\\[\\"ls\\ -al\\"\\]')
|
9
12
|
end
|
10
13
|
|
11
14
|
it 'adds debug if simualte' do
|
@@ -1,13 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Backend::Remote do
|
4
|
-
let(:backend) {
|
6
|
+
let(:backend) { described_class.new ['ls -al'] }
|
7
|
+
|
5
8
|
before { Mina::Configuration.instance.set(:domain, 'localhost') }
|
6
|
-
after { Mina::Configuration.instance.remove(:domain) }
|
7
9
|
|
8
10
|
describe '#prepare' do
|
9
11
|
it 'escpaces shellwords' do
|
10
|
-
expect(backend.prepare).to eq(
|
12
|
+
expect(backend.prepare).to eq('ssh localhost -p 22 -tt -- \\[\\"ls\\ -al\\"\\]')
|
11
13
|
end
|
12
14
|
|
13
15
|
it 'adds debug if simualte' do
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Commands do
|
4
|
-
let(:commands) {
|
6
|
+
let(:commands) { described_class.new(:default) }
|
5
7
|
|
6
8
|
describe '#command' do
|
7
9
|
it 'adds a command to the queue' do
|
@@ -18,7 +20,6 @@ describe Mina::Commands do
|
|
18
20
|
|
19
21
|
context 'when verbose' do
|
20
22
|
before { Mina::Configuration.instance.set(:verbose, true) }
|
21
|
-
after { Mina::Configuration.instance.remove(:verbose) }
|
22
23
|
|
23
24
|
it 'adds a echo command to the queue' do
|
24
25
|
commands.command('ls -al')
|
@@ -73,20 +74,19 @@ describe Mina::Commands do
|
|
73
74
|
|
74
75
|
context 'when verbose' do
|
75
76
|
before { Mina::Configuration.instance.set(:verbose, true) }
|
76
|
-
after { Mina::Configuration.instance.remove(:verbose) }
|
77
77
|
|
78
78
|
it 'joins all the commands within a path and echoes it' do
|
79
|
-
expect(commands.process('some/path')).to eq(
|
79
|
+
expect(commands.process('some/path')).to eq('(cd some/path && echo "$ cd some/path" && ls -al && pwd && cd -)')
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
84
|
describe '#run' do
|
85
|
-
it 'calls run on a backend' do
|
85
|
+
it 'calls run on a backend', :suppressed_output do
|
86
86
|
commands.command('ls -al')
|
87
|
-
runner =
|
87
|
+
runner = instance_double(Mina::Runner)
|
88
88
|
allow(Mina::Runner).to receive(:new).and_return(runner)
|
89
|
-
|
89
|
+
allow(runner).to receive(:run).and_return(true)
|
90
90
|
commands.run(:local)
|
91
91
|
end
|
92
92
|
end
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Configuration do
|
4
|
-
let(:config) { Class.new(
|
6
|
+
let(:config) { Class.new(described_class).instance }
|
5
7
|
let(:key) { config.fetch(:key, :default) }
|
6
8
|
|
7
9
|
describe '#set' do
|
@@ -26,6 +28,44 @@ describe Mina::Configuration do
|
|
26
28
|
expect(key).to eq 'env'
|
27
29
|
ENV['key'] = nil
|
28
30
|
end
|
31
|
+
|
32
|
+
it "returns nil if a default value isn't provided" do
|
33
|
+
expect(config.fetch(:key)).to eq(nil)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#remove' do
|
38
|
+
context 'when key exists' do
|
39
|
+
before do
|
40
|
+
config.set(:key, :value)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'removes the key' do
|
44
|
+
expect(config.set?(:key)).to eq(true)
|
45
|
+
|
46
|
+
config.remove(:key)
|
47
|
+
|
48
|
+
expect(config.set?(:key)).to eq(false)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns key value' do
|
52
|
+
expect(config.remove(:key)).to eq(:value)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when key doesn't exist" do
|
57
|
+
it "doesn't do anything" do
|
58
|
+
expect(config.set?(:key)).to eq(false)
|
59
|
+
|
60
|
+
config.remove(:key)
|
61
|
+
|
62
|
+
expect(config.set?(:key)).to eq(false)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns nil' do
|
66
|
+
expect(config.remove(:key)).to eq(nil)
|
67
|
+
end
|
68
|
+
end
|
29
69
|
end
|
30
70
|
|
31
71
|
describe '#set?' do
|
@@ -34,6 +74,11 @@ describe Mina::Configuration do
|
|
34
74
|
expect(config.set?(:key)).to be true
|
35
75
|
end
|
36
76
|
|
77
|
+
it 'returns false if key is set with nil value' do
|
78
|
+
config.set(:key, nil)
|
79
|
+
expect(config.set?(:key)).to be false
|
80
|
+
end
|
81
|
+
|
37
82
|
it 'returns false if key is not set' do
|
38
83
|
expect(config.set?(:key)).to be false
|
39
84
|
end
|
@@ -42,11 +87,26 @@ describe Mina::Configuration do
|
|
42
87
|
describe '#ensure!' do
|
43
88
|
it 'does not raise error if key is set' do
|
44
89
|
config.set(:key, :value)
|
45
|
-
expect { config.ensure!(:key) }.
|
90
|
+
expect { config.ensure!(:key) }.not_to raise_error
|
46
91
|
end
|
47
92
|
|
48
93
|
it 'raises an error if key is not set' do
|
49
94
|
expect { config.ensure!(:key) }.to raise_error(SystemExit)
|
95
|
+
.and output(/key must be defined!/).to_stdout
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#reset!' do
|
100
|
+
before do
|
101
|
+
config.set(:key, :value)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'cleans all variables' do
|
105
|
+
expect(config.variables).not_to be_empty
|
106
|
+
|
107
|
+
config.reset!
|
108
|
+
|
109
|
+
expect(config.variables).to be_empty
|
50
110
|
end
|
51
111
|
end
|
52
112
|
|
@@ -55,7 +115,7 @@ describe Mina::Configuration do
|
|
55
115
|
let(:host) { host_class.new }
|
56
116
|
|
57
117
|
[:fetch, :set].each do |method|
|
58
|
-
it "
|
118
|
+
it "responds to #{method}" do
|
59
119
|
expect(host).to respond_to(method)
|
60
120
|
end
|
61
121
|
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Mina::DSL, type: :rake do
|
6
|
+
before do
|
7
|
+
load_default_config
|
8
|
+
load_config 'dsl'
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#reset!' do
|
12
|
+
let(:task_name) { 'reset_task' }
|
13
|
+
|
14
|
+
it 'clears all commands before it' do
|
15
|
+
expect do
|
16
|
+
invoke_all
|
17
|
+
end.to output(output_file('dsl_reset')).to_stdout
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#run' do
|
22
|
+
context 'when one run block is inside another' do
|
23
|
+
let(:task_name) { 'one_run_inside_another' }
|
24
|
+
|
25
|
+
it 'exits with an error message' do
|
26
|
+
expect do
|
27
|
+
invoke_all
|
28
|
+
end.to raise_error(SystemExit)
|
29
|
+
.and output(/Can't use run block inside another run block./).to_stdout
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when backend is :local' do
|
34
|
+
let(:task_name) { 'local_run' }
|
35
|
+
|
36
|
+
it 'executes commands locally' do
|
37
|
+
expect do
|
38
|
+
invoke_all
|
39
|
+
end.to output(output_file('dsl_local_run')).to_stdout
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when backend is :remote' do
|
44
|
+
let(:task_name) { 'remote_run' }
|
45
|
+
|
46
|
+
it 'executes commands on the server' do
|
47
|
+
expect do
|
48
|
+
invoke_all
|
49
|
+
end.to output(output_file('dsl_remote_run')).to_stdout
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when backend doesn't exist" do
|
54
|
+
let(:task_name) { 'nonexistent_run' }
|
55
|
+
|
56
|
+
# TODO: refactor for more user-friendly error handling
|
57
|
+
it 'raises a runtime error' do
|
58
|
+
expect do
|
59
|
+
invoke_all
|
60
|
+
end.to raise_error(RuntimeError, /Don't know how to build task 'nonexistent_environment'/)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#on' do
|
66
|
+
let(:task_name) { 'on_stage_task' }
|
67
|
+
|
68
|
+
it 'executes the command in the given stage' do
|
69
|
+
expect do
|
70
|
+
invoke_all
|
71
|
+
end.to output(output_file('dsl_on')).to_stdout
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#in_path' do
|
76
|
+
let(:task_name) { 'in_path_task' }
|
77
|
+
|
78
|
+
it 'executes the command in the given path' do
|
79
|
+
expect do
|
80
|
+
invoke_all
|
81
|
+
end.to output(output_file('dsl_in_path')).to_stdout
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#deploy' do
|
86
|
+
let(:task_name) { 'deploy_block_task' }
|
87
|
+
|
88
|
+
it 'executes the deploy script and commands on remote' do
|
89
|
+
expect do
|
90
|
+
invoke_all
|
91
|
+
end.to output(output_file('dsl_deploy')).to_stdout
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -1,12 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Helpers::Internal do
|
4
|
-
|
5
|
-
|
6
|
-
|
6
|
+
let(:dummy_class) do
|
7
|
+
Class.new do
|
8
|
+
include Mina::DSL
|
9
|
+
include Mina::Helpers::Internal
|
10
|
+
end
|
7
11
|
end
|
8
|
-
|
9
|
-
let(:helper) { DummyInternalHelper.new }
|
12
|
+
let(:helper) { dummy_class.new }
|
10
13
|
|
11
14
|
describe '#deploy_script' do
|
12
15
|
before do
|
@@ -15,29 +18,29 @@ describe Mina::Helpers::Internal do
|
|
15
18
|
end
|
16
19
|
|
17
20
|
it 'returns whole script' do
|
18
|
-
expect(helper.deploy_script {}).
|
21
|
+
expect(helper.deploy_script {}).not_to be_empty
|
19
22
|
end
|
20
23
|
end
|
21
24
|
|
22
25
|
describe '#erb' do
|
23
26
|
before { Mina::Configuration.instance.set(:version_scheme, :sequence) }
|
24
|
-
after { Mina::Configuration.instance.remove(:version_scheme) }
|
25
27
|
|
26
28
|
it 'returns whole script' do
|
27
|
-
expect(helper.erb('data/deploy.sh.erb')).
|
29
|
+
expect(helper.erb('data/deploy.sh.erb')).not_to be_empty
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
33
|
describe '#echo_cmd' do
|
32
34
|
context 'when not verbose' do
|
33
|
-
|
35
|
+
before { Mina::Configuration.instance.set(:verbose, false) }
|
36
|
+
|
37
|
+
it 'returns unedited code' do
|
34
38
|
expect(helper.echo_cmd('ls -al')).to eq('ls -al')
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
38
42
|
context 'when verbose' do
|
39
43
|
before { Mina::Configuration.instance.set(:verbose, true) }
|
40
|
-
after { Mina::Configuration.instance.remove(:verbose) }
|
41
44
|
|
42
45
|
it 'modifies code' do
|
43
46
|
expect(helper.echo_cmd('ls -al')).to eq("echo \\$\\ ls\\ -al &&\nls -al")
|
@@ -54,4 +57,79 @@ describe Mina::Helpers::Internal do
|
|
54
57
|
expect(helper.indent(4, 'ls -al')).to eq(' ls -al')
|
55
58
|
end
|
56
59
|
end
|
60
|
+
|
61
|
+
describe '#unindent' do
|
62
|
+
it 'unindents code' do
|
63
|
+
expect(helper.unindent(" ls -al\n")).to eq('ls -al')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#report_time' do
|
68
|
+
context 'when :skip_report_time is true' do
|
69
|
+
before { Mina::Configuration.instance.set(:skip_report_time, true) }
|
70
|
+
|
71
|
+
it "doesn't output report time" do
|
72
|
+
expect do
|
73
|
+
helper.report_time {}
|
74
|
+
end.not_to output.to_stdout
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when :skip_report_time is false' do
|
79
|
+
before { Mina::Configuration.instance.set(:skip_report_time, false) }
|
80
|
+
|
81
|
+
it 'outputs report time' do
|
82
|
+
expect do
|
83
|
+
helper.report_time {}
|
84
|
+
end.to output(/Elapsed time: \d+\.\d\d seconds/).to_stdout
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#next_version' do
|
90
|
+
before do
|
91
|
+
Mina::Configuration.instance.set(:releases_path, '/releases')
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'when :version_scheme is :datetime' do
|
95
|
+
before do
|
96
|
+
Mina::Configuration.instance.set(:version_scheme, :datetime)
|
97
|
+
|
98
|
+
allow(Time).to receive(:now).and_return(Time.parse('2020-05-01 12:34:56 UTC'))
|
99
|
+
end
|
100
|
+
|
101
|
+
after { Mina::Configuration.instance.remove(:version_scheme) }
|
102
|
+
|
103
|
+
it 'formats current UTC time' do
|
104
|
+
expect(helper.next_version).to eq('20200501123456')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when :version_scheme is :sequence' do
|
109
|
+
before { Mina::Configuration.instance.set(:version_scheme, :sequence) }
|
110
|
+
|
111
|
+
it 'generates a command to calculate the next version' do
|
112
|
+
expect(helper.next_version).to eq('$((`ls -1 /releases | sort -n | tail -n 1`+1))')
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when :version_scheme is unknown' do
|
117
|
+
before { Mina::Configuration.instance.set(:version_scheme, :foobar) }
|
118
|
+
|
119
|
+
it 'exits with an error message' do
|
120
|
+
expect do
|
121
|
+
helper.next_version
|
122
|
+
end.to raise_error(SystemExit)
|
123
|
+
.and output(/Unrecognized version scheme\. Use :datetime or :sequence/).to_stdout
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#error!' do
|
129
|
+
it 'exits with an error message' do
|
130
|
+
expect do
|
131
|
+
helper.error!('foobar')
|
132
|
+
end.to raise_error(SystemExit).and output(/foobar/).to_stdout
|
133
|
+
end
|
134
|
+
end
|
57
135
|
end
|
@@ -1,33 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Helpers::Output do
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
let(:helper) { DummyOutputHelper.new }
|
6
|
+
let(:dummy_class) { Class.new { include Mina::Helpers::Output } }
|
7
|
+
let(:helper) { dummy_class.new }
|
9
8
|
|
10
9
|
describe '#print_line' do
|
11
10
|
it 'prints normally' do
|
12
|
-
expect{ helper.print_line('ls -al') }.to output(" ls -al\n").to_stdout
|
11
|
+
expect { helper.print_line('ls -al') }.to output(" ls -al\n").to_stdout
|
13
12
|
end
|
14
13
|
|
15
14
|
it 'prints comment' do
|
16
|
-
expect{ helper.print_line('-> ls -al') }.to output("\e[32m----->\e[0m ls -al\n").to_stdout
|
15
|
+
expect { helper.print_line('-> ls -al') }.to output("\e[32m----->\e[0m ls -al\n").to_stdout
|
17
16
|
end
|
18
17
|
|
19
18
|
it 'prints error' do
|
20
|
-
expect{ helper.print_line('! ls -al') }.to output(" \e[33m!\e[0m \e[31mls -al\e[0m\n").to_stdout
|
19
|
+
expect { helper.print_line('! ls -al') }.to output(" \e[33m!\e[0m \e[31mls -al\e[0m\n").to_stdout
|
21
20
|
end
|
22
21
|
|
23
22
|
it 'prints command' do
|
24
|
-
expect{ helper.print_line('$ ls -al') }.to output(" \e[36m$\e[0m \e[36mls -al\e[0m\n").to_stdout
|
23
|
+
expect { helper.print_line('$ ls -al') }.to output(" \e[36m$\e[0m \e[36mls -al\e[0m\n").to_stdout
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
28
27
|
describe '#print_stderr' do
|
28
|
+
it 'prints normally when the message is formatted by assets precompile' do
|
29
|
+
expect { helper.print_stderr('I, [ ls -al') }.to output(" I, [ ls -al\n").to_stdout
|
30
|
+
end
|
31
|
+
|
29
32
|
it 'prints stderr' do
|
30
|
-
expect{ helper.print_stderr('ls -al') }.to output(" \e[31mls -al\e[0m\n").to_stdout
|
33
|
+
expect { helper.print_stderr('ls -al') }.to output(" \e[31mls -al\e[0m\n").to_stdout
|
31
34
|
end
|
32
35
|
end
|
33
36
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Mina::Runner::Exec do
|
6
|
+
subject(:runner) { described_class.new('echo hello') }
|
7
|
+
|
8
|
+
describe '#run' do
|
9
|
+
before do
|
10
|
+
allow(Kernel).to receive(:exec)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'executes the script' do
|
14
|
+
runner.run
|
15
|
+
|
16
|
+
expect(Kernel).to have_received(:exec).with('echo hello')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Mina::Runner::Pretty do
|
6
|
+
subject(:runner) { described_class.new('true') }
|
7
|
+
|
8
|
+
describe '#run', :suppressed_output do
|
9
|
+
it 'executes the script' do
|
10
|
+
expect { runner.run }.to output('').to_stdout
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns true', :suppressed_output do
|
14
|
+
expect(runner.run).to eq(true)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Mina::Runner::Printer do
|
6
|
+
subject(:runner) { described_class.new('echo hello') }
|
7
|
+
|
8
|
+
describe '#run' do
|
9
|
+
it 'prints the script to stdout' do
|
10
|
+
expect do
|
11
|
+
runner.run
|
12
|
+
end.to output("echo hello\n").to_stdout
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns true', :suppressed_output do
|
16
|
+
expect(runner.run).to eq(true)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Mina::Runner::System do
|
6
|
+
subject(:runner) { described_class.new('echo hello') }
|
7
|
+
|
8
|
+
describe '#run' do
|
9
|
+
before do
|
10
|
+
allow(Kernel).to receive(:system)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'executes the script' do
|
14
|
+
runner.run
|
15
|
+
|
16
|
+
expect(Kernel).to have_received(:system).with('echo hello')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Mina::Runner do
|
@@ -6,19 +8,13 @@ describe Mina::Runner do
|
|
6
8
|
describe '#initialize' do
|
7
9
|
it 'raises an error if execution mode is not set' do
|
8
10
|
instance.remove(:execution_mode)
|
9
|
-
expect {
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'raises an error when run on windows and pretty print' do
|
13
|
-
instance.set(:execution_mode, :pretty)
|
14
|
-
allow(Gem::Platform.local).to receive(:os).and_return(:windows)
|
15
|
-
expect { Mina::Runner.new(nil, nil) }.to raise_error('Unsuported execution mode (pretty on windows)')
|
11
|
+
expect { described_class.new(nil, nil) }.to raise_error('You must specify execution mode')
|
16
12
|
end
|
17
13
|
|
18
14
|
it 'sets execution mode to printer if simulate is true' do
|
19
15
|
instance.set(:execution_mode, :pretty)
|
20
|
-
instance.set(:simulate,
|
21
|
-
expect(
|
16
|
+
instance.set(:simulate, true)
|
17
|
+
expect(described_class.new(nil, nil).execution_mode).to eq(:printer)
|
22
18
|
instance.remove(:simulate)
|
23
19
|
end
|
24
20
|
end
|
@@ -26,7 +22,7 @@ describe Mina::Runner do
|
|
26
22
|
describe '#run' do
|
27
23
|
it 'runs the commands on a backend' do
|
28
24
|
instance.set(:execution_mode, :printer)
|
29
|
-
runner =
|
25
|
+
runner = described_class.new(['ls -al'], :local)
|
30
26
|
expect { runner.run }.to output("\\[\\\"ls\\ -al\\\"\\]\n").to_stdout
|
31
27
|
end
|
32
28
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,17 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'simplecov'
|
2
4
|
|
3
|
-
SimpleCov.start
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter '/spec/'
|
4
7
|
|
5
|
-
|
6
|
-
|
8
|
+
enable_coverage :branch
|
9
|
+
primary_coverage :branch
|
10
|
+
end
|
7
11
|
|
8
12
|
require 'mina'
|
9
13
|
require 'rspec'
|
10
14
|
require 'pry'
|
15
|
+
require 'set'
|
11
16
|
|
12
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
17
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
|
13
18
|
Rake.application = Mina::Application.new
|
14
|
-
Dir[
|
19
|
+
Dir['./tasks/mina/**/*.rb'].sort.each { |f| require f }
|
15
20
|
|
16
21
|
RSpec.configure do |config|
|
17
22
|
config.include RakeExampleGroup, type: :rake
|
@@ -19,16 +24,30 @@ RSpec.configure do |config|
|
|
19
24
|
config.raise_errors_for_deprecations!
|
20
25
|
config.order = 'random'
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
Mina::Configuration.instance.
|
27
|
-
|
28
|
-
|
27
|
+
initial_task_names = Rake.application.tasks.to_set(&:name)
|
28
|
+
initial_variables = Mina::Configuration.instance.variables
|
29
|
+
|
30
|
+
config.before do
|
31
|
+
Mina::Configuration.instance.instance_variable_set(:@variables, initial_variables.clone)
|
32
|
+
end
|
33
|
+
|
34
|
+
config.after do
|
35
|
+
Rake.application.tasks.each(&:reenable)
|
36
|
+
Rake.application.instance_variable_get(:@tasks).keep_if { |task_name, _| initial_task_names.include?(task_name) }
|
37
|
+
end
|
38
|
+
|
39
|
+
config.around(:each, :suppressed_output) do |example|
|
40
|
+
original_stdout, $stdout = $stdout, File.open(File::NULL, 'w')
|
41
|
+
original_stderr, $stderr = $stderr, File.open(File::NULL, 'w')
|
42
|
+
|
43
|
+
example.run
|
44
|
+
|
45
|
+
$stdout, $stderr = original_stdout, original_stderr
|
29
46
|
end
|
30
47
|
|
31
|
-
config.
|
32
|
-
|
48
|
+
config.around do |example|
|
49
|
+
example.run
|
50
|
+
rescue SystemExit
|
51
|
+
raise "Unhandled system exit (you're probably missing a raise_error(SystemExit) matcher somewhere)"
|
33
52
|
end
|
34
53
|
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
echo "----->
|
2
|
-
bundle clean
|
1
|
+
echo "-----> Cleaning up unused gems"
|
2
|
+
bundle clean
|
@@ -0,0 +1,11 @@
|
|
1
|
+
========== Configuration variables ==========
|
2
|
+
(.|\n)*
|
3
|
+
:bundle_bin => "bundle"
|
4
|
+
(.|\n)*
|
5
|
+
:releases_path => ".*/releases"
|
6
|
+
(.|\n)*
|
7
|
+
:keep_releases => "1234"
|
8
|
+
(.|\n)*
|
9
|
+
:migration_dirs => \["db/migrate"\]
|
10
|
+
(.|\n)*
|
11
|
+
========== Configuration variables ==========
|