gene_system 0.3.2 → 0.4.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 +4 -4
- data/Gemfile +0 -7
- data/Gemfile.lock +32 -18
- data/README.md +2 -0
- data/bin/gene_system +20 -0
- data/bin/genesystem +11 -43
- data/gene_system.gemspec +3 -1
- data/lib/gene_system/cli.rb +51 -63
- data/lib/gene_system/commands/create_manifest.rb +54 -0
- data/lib/gene_system/commands/install_manifest.rb +86 -0
- data/lib/gene_system/commands/print_version.rb +17 -0
- data/lib/gene_system/commands/remove_manifest.rb +86 -0
- data/lib/gene_system/commands.rb +14 -0
- data/lib/gene_system/generators.rb +1 -1
- data/lib/gene_system/manifest.rb +58 -1
- data/lib/gene_system/platform.rb +1 -0
- data/lib/gene_system/version.rb +1 -1
- data/manifest.json +59 -0
- data/spec/gene_system/cli_spec.rb +68 -46
- data/spec/gene_system/commands/create_manifest_spec.rb +119 -0
- data/spec/gene_system/commands/install_manifest_spec.rb +258 -0
- data/spec/gene_system/commands/print_version_spec.rb +20 -0
- data/spec/gene_system/commands/remove_manifest_spec.rb +258 -0
- data/spec/gene_system/generators_spec.rb +1 -1
- data/spec/gene_system/manifest_spec.rb +68 -0
- metadata +47 -6
- data/lib/gene_system/cli/commands.rb +0 -109
- data/spec/gene_system/cli/commands_spec.rb +0 -230
data/lib/gene_system/manifest.rb
CHANGED
@@ -18,6 +18,11 @@ module GeneSystem
|
|
18
18
|
File.read(file_path)
|
19
19
|
)
|
20
20
|
|
21
|
+
if missing_required?(manifest)
|
22
|
+
raise 'manifest is missing required attributes name, '\
|
23
|
+
'version and/or metadata'
|
24
|
+
end
|
25
|
+
|
21
26
|
if incompatible?(manifest)
|
22
27
|
raise 'provided manifest is invalid or incompatible with '\
|
23
28
|
'this version of gene_system'
|
@@ -29,6 +34,34 @@ module GeneSystem
|
|
29
34
|
)
|
30
35
|
end
|
31
36
|
|
37
|
+
##
|
38
|
+
# Determines whether there are missing
|
39
|
+
# attributes in given manifest.
|
40
|
+
#
|
41
|
+
# Manifests require name, version and
|
42
|
+
# metadata attributes.
|
43
|
+
#
|
44
|
+
# If these are not present in the given manifest
|
45
|
+
# then this method returns true, indicating
|
46
|
+
# that the manifest does not have all required
|
47
|
+
# attributes and is therefore not valid.
|
48
|
+
#
|
49
|
+
# If they are present, then false will be returned
|
50
|
+
# indicating that the manifest has required
|
51
|
+
# attributes
|
52
|
+
#
|
53
|
+
# @param [GeneSystem::Manifest] manifest
|
54
|
+
#
|
55
|
+
# @return [Boolean]
|
56
|
+
#
|
57
|
+
def missing_required?(manifest)
|
58
|
+
return true unless manifest['name']
|
59
|
+
return true unless manifest['version']
|
60
|
+
return true unless manifest['metadata']
|
61
|
+
|
62
|
+
false
|
63
|
+
end
|
64
|
+
|
32
65
|
##
|
33
66
|
# Incompatible returns true if the current manifest is not compatible
|
34
67
|
# with this version of GeneSystem.
|
@@ -57,6 +90,15 @@ module GeneSystem
|
|
57
90
|
@steps = GeneSystem::Step.load_steps(@data.steps)
|
58
91
|
end
|
59
92
|
|
93
|
+
##
|
94
|
+
# Manifest name and version getter
|
95
|
+
#
|
96
|
+
# @return [String]
|
97
|
+
#
|
98
|
+
def name_and_version
|
99
|
+
"#{name} v#{version}"
|
100
|
+
end
|
101
|
+
|
60
102
|
##
|
61
103
|
# Manifest name getter
|
62
104
|
#
|
@@ -110,7 +152,7 @@ module GeneSystem
|
|
110
152
|
#
|
111
153
|
# By default a all steps will be returned.
|
112
154
|
#
|
113
|
-
#
|
155
|
+
# Example:
|
114
156
|
# query = ->(step) { step.tags.include?("foo") }
|
115
157
|
# manifest.steps(query)
|
116
158
|
#
|
@@ -123,5 +165,20 @@ module GeneSystem
|
|
123
165
|
query.call(step)
|
124
166
|
end
|
125
167
|
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# Returns manifest information and variables
|
171
|
+
#
|
172
|
+
# @return [Hashie::Mash]
|
173
|
+
#
|
174
|
+
def variables
|
175
|
+
Hashie::Mash.new(
|
176
|
+
'manifest' => {
|
177
|
+
'name' => name,
|
178
|
+
'version' => version,
|
179
|
+
'metadata' => metadata
|
180
|
+
}
|
181
|
+
)
|
182
|
+
end
|
126
183
|
end
|
127
184
|
end
|
data/lib/gene_system/platform.rb
CHANGED
data/lib/gene_system/version.rb
CHANGED
data/manifest.json
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
{
|
2
|
+
"name": "manifest.json",
|
3
|
+
"version": "0.0.1",
|
4
|
+
"metadata": {
|
5
|
+
"gene_system": {
|
6
|
+
"version": "0.3.2"
|
7
|
+
}
|
8
|
+
},
|
9
|
+
"steps": [
|
10
|
+
{
|
11
|
+
"name": "greet user",
|
12
|
+
"exe": {
|
13
|
+
"install": {
|
14
|
+
"prompts": [
|
15
|
+
{
|
16
|
+
"prompt": "Please enter your name",
|
17
|
+
"var": "name"
|
18
|
+
}
|
19
|
+
],
|
20
|
+
"cmd": [
|
21
|
+
"echo hello '{{name}}'"
|
22
|
+
]
|
23
|
+
},
|
24
|
+
"remove": {
|
25
|
+
"prompts": [
|
26
|
+
{
|
27
|
+
"prompt": "Please enter your name",
|
28
|
+
"var": "name"
|
29
|
+
}
|
30
|
+
],
|
31
|
+
"cmd": [
|
32
|
+
"echo 'goodbye {{name}}'"
|
33
|
+
]
|
34
|
+
}
|
35
|
+
},
|
36
|
+
"tags": "example step"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"name": "print version",
|
40
|
+
"exe": {
|
41
|
+
"install": {
|
42
|
+
"cmd": [
|
43
|
+
"echo '{{manifest.name}}'",
|
44
|
+
"echo '{{manifest.version}}'",
|
45
|
+
"echo '{{manifest.metadata.gene_system.version}}'"
|
46
|
+
]
|
47
|
+
},
|
48
|
+
"remove": {
|
49
|
+
"cmd": [
|
50
|
+
"echo '{{manifest.name}}'",
|
51
|
+
"echo '{{manifest.version}}'",
|
52
|
+
"echo '{{manifest.metadata.gene_system.version}}'"
|
53
|
+
]
|
54
|
+
}
|
55
|
+
},
|
56
|
+
"tags": "example front matter access"
|
57
|
+
}
|
58
|
+
]
|
59
|
+
}
|
@@ -1,83 +1,105 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe GeneSystem::CLI do
|
4
|
-
|
5
|
-
let(:err_logger) { double(Logger) }
|
6
|
-
let(:message) { 'All work and no play makes Jack a dull boy' }
|
4
|
+
subject { described_class.new }
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
describe '#version' do
|
7
|
+
let(:version) { double(GeneSystem::Commands::PrintVersion) }
|
8
|
+
let(:options) { double }
|
11
9
|
|
12
|
-
describe '.logger' do
|
13
|
-
let(:out) { double(STDOUT) }
|
14
10
|
before do
|
15
|
-
allow(
|
16
|
-
allow(
|
17
|
-
|
18
|
-
|
11
|
+
allow(subject).to receive(:options).and_return(options)
|
12
|
+
allow(GeneSystem::Commands::PrintVersion)
|
13
|
+
.to receive(:new)
|
14
|
+
.and_return(version)
|
19
15
|
|
20
|
-
|
21
|
-
|
16
|
+
allow(version).to receive(:run)
|
17
|
+
subject.version
|
22
18
|
end
|
23
|
-
end
|
24
19
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
allow(described_class).to receive(:logger).and_return(logger)
|
30
|
-
allow(logger).to receive(:info)
|
31
|
-
described_class.print_message(message)
|
20
|
+
it 'creates a new version command' do
|
21
|
+
expect(GeneSystem::Commands::PrintVersion)
|
22
|
+
.to have_received(:new)
|
23
|
+
.with(options)
|
32
24
|
end
|
33
25
|
|
34
|
-
it '
|
35
|
-
expect(
|
26
|
+
it 'calls run' do
|
27
|
+
expect(version).to have_received(:run)
|
36
28
|
end
|
37
29
|
end
|
38
30
|
|
39
|
-
describe '
|
40
|
-
let(:
|
31
|
+
describe '#new' do
|
32
|
+
let(:new) { double(GeneSystem::Commands::CreateManifest) }
|
33
|
+
let(:options) { double }
|
41
34
|
|
42
35
|
before do
|
43
|
-
allow(
|
44
|
-
allow(
|
45
|
-
|
36
|
+
allow(subject).to receive(:options).and_return(options)
|
37
|
+
allow(GeneSystem::Commands::CreateManifest)
|
38
|
+
.to receive(:new)
|
39
|
+
.and_return(new)
|
40
|
+
|
41
|
+
allow(new).to receive(:run)
|
42
|
+
subject.new
|
46
43
|
end
|
47
44
|
|
48
|
-
it '
|
49
|
-
expect(
|
45
|
+
it 'creates a new new command' do
|
46
|
+
expect(GeneSystem::Commands::CreateManifest)
|
47
|
+
.to have_received(:new)
|
48
|
+
.with(options)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'calls run' do
|
52
|
+
expect(new).to have_received(:run)
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
53
|
-
describe '
|
54
|
-
let(:
|
56
|
+
describe '#install' do
|
57
|
+
let(:install) { double(GeneSystem::Commands::InstallManifest) }
|
58
|
+
let(:options) { double }
|
55
59
|
|
56
60
|
before do
|
57
|
-
allow(
|
58
|
-
allow(
|
59
|
-
|
61
|
+
allow(subject).to receive(:options).and_return(options)
|
62
|
+
allow(GeneSystem::Commands::InstallManifest)
|
63
|
+
.to receive(:new)
|
64
|
+
.and_return(install)
|
65
|
+
|
66
|
+
allow(install).to receive(:run)
|
67
|
+
subject.install
|
60
68
|
end
|
61
69
|
|
62
|
-
it '
|
63
|
-
expect(
|
70
|
+
it 'creates a new install command' do
|
71
|
+
expect(GeneSystem::Commands::InstallManifest)
|
72
|
+
.to have_received(:new)
|
73
|
+
.with(options)
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'calls run' do
|
77
|
+
expect(install).to have_received(:run)
|
64
78
|
end
|
65
79
|
end
|
66
80
|
|
67
|
-
describe '
|
68
|
-
let(:
|
81
|
+
describe '#remove' do
|
82
|
+
let(:remove) { double(GeneSystem::Commands::RemoveManifest) }
|
83
|
+
let(:options) { double }
|
69
84
|
|
70
85
|
before do
|
71
|
-
allow(
|
72
|
-
|
86
|
+
allow(subject).to receive(:options).and_return(options)
|
87
|
+
allow(GeneSystem::Commands::RemoveManifest)
|
88
|
+
.to receive(:new)
|
89
|
+
.and_return(remove)
|
90
|
+
|
91
|
+
allow(remove).to receive(:run)
|
92
|
+
subject.remove
|
73
93
|
end
|
74
94
|
|
75
|
-
it '
|
76
|
-
expect(
|
95
|
+
it 'creates a new remove command' do
|
96
|
+
expect(GeneSystem::Commands::RemoveManifest)
|
97
|
+
.to have_received(:new)
|
98
|
+
.with(options)
|
77
99
|
end
|
78
100
|
|
79
|
-
it '
|
80
|
-
expect(
|
101
|
+
it 'calls run' do
|
102
|
+
expect(remove).to have_received(:run)
|
81
103
|
end
|
82
104
|
end
|
83
105
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe GeneSystem::Commands::CreateManifest do
|
4
|
+
let(:name_opt) { 'manifest.jsonnet' }
|
5
|
+
let(:output_opt) { '/path/to/output' }
|
6
|
+
|
7
|
+
let(:options) do
|
8
|
+
Hashie::Mash.new(
|
9
|
+
name: name_opt,
|
10
|
+
out: output_opt
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { described_class.new(options) }
|
15
|
+
|
16
|
+
describe '#run' do
|
17
|
+
let(:prompt) { double }
|
18
|
+
let(:prompt_response) { nil }
|
19
|
+
|
20
|
+
let(:is_dir) { true }
|
21
|
+
|
22
|
+
before do
|
23
|
+
subject.instance_variable_set(:@prompt, prompt)
|
24
|
+
|
25
|
+
allow(File).to receive(:directory?).and_return(is_dir)
|
26
|
+
allow(subject).to receive(:puts)
|
27
|
+
|
28
|
+
allow(prompt).to receive(:ask)
|
29
|
+
.and_return(prompt_response)
|
30
|
+
|
31
|
+
allow(GeneSystem::Generators)
|
32
|
+
.to receive(:render_empty_manifest)
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when name and output prompt is provided' do
|
36
|
+
before { subject.run }
|
37
|
+
|
38
|
+
it 'does not ask for any input' do
|
39
|
+
expect(prompt).not_to have_received(:ask)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'renders empty manifest' do
|
43
|
+
expect(GeneSystem::Generators)
|
44
|
+
.to have_received(:render_empty_manifest)
|
45
|
+
.with(name_opt, output_opt)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'reports success' do
|
49
|
+
expect(subject)
|
50
|
+
.to have_received(:puts)
|
51
|
+
.with('✔ Manifest successfully created in /path/to/output')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when only name is provided' do
|
56
|
+
let(:output_opt) { nil }
|
57
|
+
let(:prompt_response) { '/path/to/given/output' }
|
58
|
+
|
59
|
+
before { subject.run }
|
60
|
+
|
61
|
+
it 'prompts for output location' do
|
62
|
+
expect(prompt).to have_received(:ask)
|
63
|
+
.with(
|
64
|
+
'Please specify output location',
|
65
|
+
default: Dir.pwd
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'renders empty manifest' do
|
70
|
+
expect(GeneSystem::Generators)
|
71
|
+
.to have_received(:render_empty_manifest)
|
72
|
+
.with(name_opt, prompt_response)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'reports success' do
|
76
|
+
expect(subject)
|
77
|
+
.to have_received(:puts)
|
78
|
+
.with('✔ Manifest successfully created in /path/to/given/output')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when only output is provided' do
|
83
|
+
let(:name_opt) { nil }
|
84
|
+
let(:prompt_response) { 'abc.json' }
|
85
|
+
|
86
|
+
before { subject.run }
|
87
|
+
|
88
|
+
it 'prompts for manifest name' do
|
89
|
+
expect(prompt).to have_received(:ask)
|
90
|
+
.with(
|
91
|
+
'Please enter the name of the manifest',
|
92
|
+
default: described_class::DEFAULT_MANIFEST_NAME
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'renders empty manifest' do
|
97
|
+
expect(GeneSystem::Generators)
|
98
|
+
.to have_received(:render_empty_manifest)
|
99
|
+
.with(prompt_response, output_opt)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'reports success' do
|
103
|
+
expect(subject)
|
104
|
+
.to have_received(:puts)
|
105
|
+
.with('✔ Manifest successfully created in /path/to/output')
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when the output location is not a directory' do
|
110
|
+
let(:is_dir) { false }
|
111
|
+
|
112
|
+
it 'raises runtime error' do
|
113
|
+
expect do
|
114
|
+
subject.run
|
115
|
+
end.to raise_error('output location must be a folder')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,258 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe GeneSystem::Commands::InstallManifest do
|
4
|
+
let(:options) { Hashie::Mash.new }
|
5
|
+
let(:prompt) { double(TTY::Prompt) }
|
6
|
+
let(:version) { '1.0.0' }
|
7
|
+
let(:execute_command_result) { 0 }
|
8
|
+
let(:manifest_name) { 'some manifest' }
|
9
|
+
|
10
|
+
subject { described_class.new(options) }
|
11
|
+
|
12
|
+
before do
|
13
|
+
subject.instance_variable_set(:@prompt, prompt)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#run' do
|
17
|
+
let(:platform) { double(GeneSystem::Platform) }
|
18
|
+
|
19
|
+
let(:manifest) do
|
20
|
+
double(
|
21
|
+
GeneSystem::Manifest,
|
22
|
+
name: manifest_name,
|
23
|
+
name_and_version: "#{manifest_name} v#{version}"
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:skip_command) { 'false' }
|
28
|
+
let(:prompts) { [prompt_definition, prompt_definition] }
|
29
|
+
let(:prompt_definition) do
|
30
|
+
{
|
31
|
+
"prompt": 'Please enter your name',
|
32
|
+
"var": 'name'
|
33
|
+
}
|
34
|
+
end
|
35
|
+
let(:cmd) { 'echo {{name}}' }
|
36
|
+
let(:cmds) do
|
37
|
+
[
|
38
|
+
cmd
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:step_definition) do
|
43
|
+
{
|
44
|
+
"name": 'some step',
|
45
|
+
"exe": {
|
46
|
+
"install": {
|
47
|
+
"skip": skip_command,
|
48
|
+
"prompts": prompts,
|
49
|
+
"cmd": cmds
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:step) do
|
56
|
+
GeneSystem::Step.new(step_definition)
|
57
|
+
end
|
58
|
+
|
59
|
+
before do
|
60
|
+
allow(GeneSystem::Manifest)
|
61
|
+
.to receive(:new_from_file)
|
62
|
+
.and_return(manifest)
|
63
|
+
|
64
|
+
allow(GeneSystem::Platform)
|
65
|
+
.to receive(:new)
|
66
|
+
.and_return(platform)
|
67
|
+
|
68
|
+
allow(manifest)
|
69
|
+
.to receive(:steps)
|
70
|
+
.and_return([step, step])
|
71
|
+
|
72
|
+
allow(manifest)
|
73
|
+
.to receive(:version)
|
74
|
+
.and_return(version)
|
75
|
+
|
76
|
+
allow(manifest)
|
77
|
+
.to receive(:variables)
|
78
|
+
.and_return({})
|
79
|
+
|
80
|
+
allow(platform)
|
81
|
+
.to receive(:execute_commands)
|
82
|
+
|
83
|
+
allow(platform)
|
84
|
+
.to receive(:execute_command)
|
85
|
+
.and_return(execute_command_result)
|
86
|
+
|
87
|
+
allow(prompt).to receive(:ask).and_return(prompt_response)
|
88
|
+
allow(subject).to receive(:puts)
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when manifest path is provided' do
|
92
|
+
let(:manifest_path) { 'provided/path/to/manifest.json' }
|
93
|
+
let(:execute_command_result) { 1 }
|
94
|
+
let(:prompt_response) { 'Jon' }
|
95
|
+
let(:options) do
|
96
|
+
Hashie::Mash.new(
|
97
|
+
manifest: manifest_path
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
before do
|
102
|
+
subject.run
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'loads manifest from expected file' do
|
106
|
+
expect(GeneSystem::Manifest)
|
107
|
+
.to have_received(:new_from_file)
|
108
|
+
.with(manifest_path)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'prints install message' do
|
112
|
+
expect(subject)
|
113
|
+
.to have_received(:puts)
|
114
|
+
.with("INSTALL #{manifest_name} v#{version}")
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'skip steps' do
|
118
|
+
context 'when there is a skip command defined' do
|
119
|
+
it 'checks whether it should skip any steps' do
|
120
|
+
expect(platform)
|
121
|
+
.to have_received(:execute_command)
|
122
|
+
.with(skip_command).twice
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'when there is no skip command defined' do
|
127
|
+
let(:step_definition) do
|
128
|
+
{
|
129
|
+
"name": 'some step',
|
130
|
+
"exe": {
|
131
|
+
"install": {
|
132
|
+
"skip": nil,
|
133
|
+
"cmd": []
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'does not try to run nil command' do
|
140
|
+
expect(platform)
|
141
|
+
.not_to have_received(:execute_command)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'when the skip command returns non zero' do
|
146
|
+
let(:execute_command_result) { 1 }
|
147
|
+
let(:prompts) { [] }
|
148
|
+
|
149
|
+
it 'does not execute step' do
|
150
|
+
expect(platform)
|
151
|
+
.not_to have_received(:execute_command)
|
152
|
+
.with(cmd)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe 'prompting user for input' do
|
158
|
+
context 'when there are no prompts' do
|
159
|
+
let(:prompts) { [] }
|
160
|
+
|
161
|
+
it 'does not ask user for input' do
|
162
|
+
expect(prompt)
|
163
|
+
.not_to have_received(:ask)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when there are prompts' do
|
168
|
+
it 'asks user for input' do
|
169
|
+
expect(prompt)
|
170
|
+
.to have_received(:ask)
|
171
|
+
.with('Please enter your name').exactly(4).times
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'executes step commands' do
|
177
|
+
expect(platform)
|
178
|
+
.to have_received(:execute_commands)
|
179
|
+
.with(cmds, 'name' => prompt_response).twice
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'prints success message' do
|
183
|
+
expect(subject)
|
184
|
+
.to have_received(:puts)
|
185
|
+
.with("✔ Manifest #{manifest_name} v#{version} successfully installed")
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'when the manifest name is not provided' do
|
190
|
+
let(:prompt_response) { '/path/to/manifest.json' }
|
191
|
+
|
192
|
+
before do
|
193
|
+
allow(prompt)
|
194
|
+
.to receive(:ask)
|
195
|
+
.and_return(prompt_response)
|
196
|
+
|
197
|
+
subject.run
|
198
|
+
end
|
199
|
+
|
200
|
+
describe 'prompting user for manifest path' do
|
201
|
+
it 'prompts user for manifest path' do
|
202
|
+
expect(prompt)
|
203
|
+
.to have_received(:ask)
|
204
|
+
.with(
|
205
|
+
'Please enter the path to the configuration manifest',
|
206
|
+
default: 'manifest.json'
|
207
|
+
)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe 'skipping steps' do
|
212
|
+
context 'when there is a skip command defined' do
|
213
|
+
it 'checks whether it should skip any steps' do
|
214
|
+
expect(platform)
|
215
|
+
.to have_received(:execute_command)
|
216
|
+
.with(skip_command).twice
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
context 'when there is no skip command defined' do
|
221
|
+
let(:step_definition) do
|
222
|
+
{
|
223
|
+
"name": 'some step',
|
224
|
+
"exe": {
|
225
|
+
"install": {
|
226
|
+
"skip": nil,
|
227
|
+
"cmd": []
|
228
|
+
}
|
229
|
+
}
|
230
|
+
}
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'does not try to run nil command' do
|
234
|
+
expect(platform)
|
235
|
+
.not_to have_received(:execute_command)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
context 'when the skip command returns non zero' do
|
240
|
+
let(:execute_command_result) { 1 }
|
241
|
+
let(:prompts) { [] }
|
242
|
+
|
243
|
+
it 'does not execute step' do
|
244
|
+
expect(platform)
|
245
|
+
.not_to have_received(:execute_command)
|
246
|
+
.with(cmd)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'prints success message' do
|
252
|
+
expect(subject)
|
253
|
+
.to have_received(:puts)
|
254
|
+
.with("✔ Manifest #{manifest_name} v#{version} successfully installed")
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|