mina 1.2.4 → 1.2.5
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 +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 ==========
|