producer-core 0.5.8 → 0.5.9
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/lib/producer/core/version.rb +1 -1
- metadata +21 -202
- data/.gitignore +0 -3
- data/.travis.yml +0 -14
- data/Gemfile +0 -5
- data/Guardfile +0 -14
- data/LICENSE +0 -30
- data/Rakefile +0 -19
- data/config/cucumber.yaml +0 -2
- data/features/actions/echo.feature +0 -11
- data/features/actions/file_append.feature +0 -15
- data/features/actions/file_replace_content.feature +0 -24
- data/features/actions/file_write.feature +0 -21
- data/features/actions/mkdir.feature +0 -31
- data/features/actions/sh.feature +0 -43
- data/features/actions/yaml_write.feature +0 -14
- data/features/cli/debug.feature +0 -19
- data/features/cli/dry_run.feature +0 -22
- data/features/cli/error_reporting.feature +0 -32
- data/features/cli/target.feature +0 -15
- data/features/cli/usage.feature +0 -13
- data/features/cli/verbose.feature +0 -48
- data/features/condition/negated_test.feature +0 -47
- data/features/condition/target.feature +0 -15
- data/features/recipe/compose_macro.feature +0 -29
- data/features/recipe/errors.feature +0 -9
- data/features/recipe/macro.feature +0 -50
- data/features/recipe/registry.feature +0 -82
- data/features/recipe/source.feature +0 -17
- data/features/recipe/target.feature +0 -23
- data/features/recipe/test_macro.feature +0 -50
- data/features/ssh/config.feature +0 -25
- data/features/steps/environment_steps.rb +0 -3
- data/features/support/env.rb +0 -1
- data/features/task/ask.feature +0 -23
- data/features/task/condition.feature +0 -13
- data/features/task/nested_tasks.feature +0 -20
- data/features/task/recipe_argv.feature +0 -13
- data/features/task/target.feature +0 -11
- data/features/task/template.feature +0 -49
- data/features/tests/dir.feature +0 -21
- data/features/tests/env.feature +0 -47
- data/features/tests/executable.feature +0 -26
- data/features/tests/file.feature +0 -21
- data/features/tests/file_contains.feature +0 -26
- data/features/tests/file_eq.feature +0 -26
- data/features/tests/file_match.feature +0 -26
- data/features/tests/shell_command_status.feature +0 -46
- data/features/tests/yaml_eq.feature +0 -26
- data/producer-core.gemspec +0 -28
- data/spec/fixtures/recipes/empty.rb +0 -1
- data/spec/fixtures/recipes/raise.rb +0 -1
- data/spec/fixtures/recipes/some_recipe.rb +0 -5
- data/spec/fixtures/recipes/throw.rb +0 -1
- data/spec/fixtures/templates/basic.erb +0 -1
- data/spec/fixtures/templates/basic_yaml.yaml +0 -1
- data/spec/fixtures/templates/variables.erb +0 -1
- data/spec/producer/core/action_spec.rb +0 -46
- data/spec/producer/core/actions/echo_spec.rb +0 -20
- data/spec/producer/core/actions/file_append_spec.rb +0 -49
- data/spec/producer/core/actions/file_replace_content_spec.rb +0 -42
- data/spec/producer/core/actions/file_writer_spec.rb +0 -52
- data/spec/producer/core/actions/mkdir_spec.rb +0 -71
- data/spec/producer/core/actions/shell_command_spec.rb +0 -45
- data/spec/producer/core/actions/yaml_writer_spec.rb +0 -25
- data/spec/producer/core/cli_spec.rb +0 -211
- data/spec/producer/core/condition_spec.rb +0 -198
- data/spec/producer/core/env_spec.rb +0 -196
- data/spec/producer/core/error_formatter_spec.rb +0 -86
- data/spec/producer/core/logger_formatter_spec.rb +0 -26
- data/spec/producer/core/prompter_spec.rb +0 -40
- data/spec/producer/core/recipe/file_evaluator_spec.rb +0 -22
- data/spec/producer/core/recipe_spec.rb +0 -126
- data/spec/producer/core/remote/environment_spec.rb +0 -19
- data/spec/producer/core/remote/fs_spec.rb +0 -144
- data/spec/producer/core/remote_spec.rb +0 -168
- data/spec/producer/core/task_spec.rb +0 -198
- data/spec/producer/core/template_spec.rb +0 -41
- data/spec/producer/core/test_spec.rb +0 -7
- data/spec/producer/core/testing/mock_remote_spec.rb +0 -66
- data/spec/producer/core/tests/condition_test_spec.rb +0 -55
- data/spec/producer/core/tests/file_contains_spec.rb +0 -46
- data/spec/producer/core/tests/file_eq_spec.rb +0 -45
- data/spec/producer/core/tests/file_match_spec.rb +0 -46
- data/spec/producer/core/tests/has_dir_spec.rb +0 -25
- data/spec/producer/core/tests/has_env_spec.rb +0 -75
- data/spec/producer/core/tests/has_executable_spec.rb +0 -29
- data/spec/producer/core/tests/has_file_spec.rb +0 -25
- data/spec/producer/core/tests/shell_command_status_spec.rb +0 -34
- data/spec/producer/core/tests/yaml_eq_spec.rb +0 -47
- data/spec/producer/core/worker_spec.rb +0 -88
- data/spec/spec_helper.rb +0 -13
- data/spec/support/exit_helpers.rb +0 -6
- data/spec/support/fixtures_helpers.rb +0 -7
- data/spec/support/net_ssh_story_helpers.rb +0 -36
- data/spec/support/shared_action.rb +0 -44
- data/spec/support/shared_test.rb +0 -82
- data/spec/support/test_env_helpers.rb +0 -44
@@ -1,211 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
describe CLI do
|
5
|
-
include ExitHelpers
|
6
|
-
include FixturesHelpers
|
7
|
-
|
8
|
-
let(:options) { [] }
|
9
|
-
let(:recipe_file) { fixture_path_for 'recipes/some_recipe.rb' }
|
10
|
-
let(:arguments) { [*options, recipe_file] }
|
11
|
-
let(:environment) { {} }
|
12
|
-
|
13
|
-
subject(:cli) { described_class.new(arguments, environment) }
|
14
|
-
|
15
|
-
describe '.run!' do
|
16
|
-
subject(:run!) { described_class.run! arguments }
|
17
|
-
|
18
|
-
it 'builds a new CLI instance with given arguments and environment' do
|
19
|
-
expect(described_class)
|
20
|
-
.to receive(:new).with(arguments, ENV, anything).and_call_original
|
21
|
-
run!
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'parses new CLI instance arguments' do
|
25
|
-
expect_any_instance_of(described_class).to receive :parse_arguments!
|
26
|
-
run!
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'runs the new CLI instance' do
|
30
|
-
expect_any_instance_of(described_class).to receive :run
|
31
|
-
run!
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'when no recipe is given' do
|
35
|
-
let(:arguments) { [] }
|
36
|
-
|
37
|
-
it 'exits with a return status of 64' do
|
38
|
-
expect { described_class.run! arguments, stderr: StringIO.new }
|
39
|
-
.to raise_error(SystemExit) { |e| expect(e.status).to eq 64 }
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'prints the usage on the error stream' do
|
43
|
-
expect { trap_exit { run! } }
|
44
|
-
.to output(/\AUsage: .+/).to_stderr
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when an error is raised' do
|
49
|
-
let(:recipe_file) { fixture_path_for 'recipes/raise.rb' }
|
50
|
-
|
51
|
-
it 'exits with a return status of 70' do
|
52
|
-
expect { described_class.run! arguments, stderr: StringIO.new }
|
53
|
-
.to raise_error(SystemExit) { |e| expect(e.status).to eq 70 }
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'prints a report to the error stream' do
|
57
|
-
expect { trap_exit { run! } }
|
58
|
-
.to output(/\ARecipeEvaluationError: false$/).to_stderr
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe '#initialize' do
|
64
|
-
it 'assigns an env' do
|
65
|
-
expect(cli.env).to be_an Env
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'assigns CLI stdin as the env input' do
|
69
|
-
expect(cli.env.input).to be cli.stdin
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'assigns CLI stdout as the env output' do
|
73
|
-
expect(cli.env.output).to be cli.stdout
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'assigns CLI stderr as the env error output' do
|
77
|
-
expect(cli.env.error_output).to be cli.stderr
|
78
|
-
end
|
79
|
-
|
80
|
-
context 'when PRODUCER_VERBOSE environment variable is set' do
|
81
|
-
before { environment['PRODUCER_VERBOSE'] = 'yes' }
|
82
|
-
|
83
|
-
it 'enables env verbose mode' do
|
84
|
-
expect(cli.env).to be_verbose
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
context 'when PRODUCER_DEBUG environment variable is set' do
|
89
|
-
before { environment['PRODUCER_DEBUG'] = 'yes' }
|
90
|
-
|
91
|
-
it 'enables env debug mode' do
|
92
|
-
expect(cli.env).to be_debug
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
context 'when PRODUCER_DRYRUN environment variable is set' do
|
97
|
-
before { environment['PRODUCER_DRYRUN'] = 'yes' }
|
98
|
-
|
99
|
-
it 'enables env dry run mode' do
|
100
|
-
expect(cli.env).to be_dry_run
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe '#parse_arguments!' do
|
106
|
-
let(:options) { %w[-v -t some_host.example] }
|
107
|
-
|
108
|
-
it 'removes options from arguments' do
|
109
|
-
cli.parse_arguments!
|
110
|
-
expect(cli.arguments).to eq [recipe_file]
|
111
|
-
end
|
112
|
-
|
113
|
-
context 'with verbose option' do
|
114
|
-
let(:options) { %w[-v] }
|
115
|
-
|
116
|
-
it 'enables env verbose mode' do
|
117
|
-
cli.parse_arguments!
|
118
|
-
expect(cli.env).to be_verbose
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
context 'with dry run option' do
|
123
|
-
let(:options) { %w[-n] }
|
124
|
-
|
125
|
-
it 'enables env dry run mode' do
|
126
|
-
cli.parse_arguments!
|
127
|
-
expect(cli.env).to be_dry_run
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
context 'with target option' do
|
132
|
-
let(:options) { %w[-t some_host.example] }
|
133
|
-
|
134
|
-
it 'assigns the given target to the env' do
|
135
|
-
cli.parse_arguments!
|
136
|
-
expect(cli.env.target).to eq 'some_host.example'
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
context 'with debug option' do
|
141
|
-
let(:options) { %w[-d] }
|
142
|
-
|
143
|
-
it 'assigns the given target to the env' do
|
144
|
-
cli.parse_arguments!
|
145
|
-
expect(cli.env).to be_debug
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
context 'with combined options' do
|
150
|
-
let(:options) { %w[-vn]}
|
151
|
-
|
152
|
-
it 'handles combined options' do
|
153
|
-
cli.parse_arguments!
|
154
|
-
expect(cli.env).to be_verbose.and be_dry_run
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
context 'with recipe arguments' do
|
159
|
-
let(:arguments) { %w[recipe.rb -- foo] }
|
160
|
-
|
161
|
-
it 'removes recipe arguments' do
|
162
|
-
cli.parse_arguments!
|
163
|
-
expect(cli.arguments).to eq %w[recipe.rb]
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'assigns env recipe arguments' do
|
167
|
-
cli.parse_arguments!
|
168
|
-
expect(cli.env.recipe_argv).to eq %w[foo]
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
context 'when no arguments remains after parsing' do
|
173
|
-
let(:arguments) { [] }
|
174
|
-
|
175
|
-
it 'raises an error' do
|
176
|
-
expect { cli.parse_arguments! }
|
177
|
-
.to raise_error described_class::ArgumentError
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
describe '#run' do
|
183
|
-
it 'processes recipes tasks with a worker' do
|
184
|
-
worker = instance_spy Worker
|
185
|
-
cli.run worker: worker
|
186
|
-
expect(worker).to have_received(:process)
|
187
|
-
.with all be_an_instance_of Task
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'cleans up the env' do
|
191
|
-
expect(cli.env).to receive :cleanup
|
192
|
-
cli.run
|
193
|
-
end
|
194
|
-
|
195
|
-
context 'on error' do
|
196
|
-
let(:recipe_file) { fixture_path_for 'recipes/raise.rb' }
|
197
|
-
|
198
|
-
it 'cleans up the env' do
|
199
|
-
expect(cli.env).to receive :cleanup
|
200
|
-
cli.run rescue nil
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
describe '#evaluate_recipes' do
|
206
|
-
it 'returns the evaluated recipes' do
|
207
|
-
expect(cli.evaluate_recipes).to all be_an_instance_of Recipe
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
@@ -1,198 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
describe Condition do
|
5
|
-
subject(:condition) { described_class.new }
|
6
|
-
|
7
|
-
%w[
|
8
|
-
`
|
9
|
-
sh
|
10
|
-
file_contains
|
11
|
-
file_eq
|
12
|
-
file_match
|
13
|
-
dir?
|
14
|
-
env?
|
15
|
-
executable?
|
16
|
-
file?
|
17
|
-
].each do |test|
|
18
|
-
it "has `#{test}' test defined" do
|
19
|
-
expect(condition).to respond_to test.to_sym
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe '.define_test' do
|
24
|
-
let(:some_test) { Test }
|
25
|
-
|
26
|
-
before { described_class.define_test(:some_test, some_test) }
|
27
|
-
|
28
|
-
it 'defines a new test keyword' do
|
29
|
-
expect(condition).to respond_to :some_test
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'defines the negated test' do
|
33
|
-
expect(condition).to respond_to :no_some_test
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'when a test keyword is called' do
|
37
|
-
it 'registers the test' do
|
38
|
-
expect { condition.some_test }.to change { condition.tests.count }.by 1
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'registers the test with assigned env' do
|
42
|
-
env = double 'env'
|
43
|
-
condition.instance_eval { @env = env }
|
44
|
-
condition.some_test
|
45
|
-
expect(condition.tests.last.env).to be env
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'registers the test with given arguments' do
|
49
|
-
condition.some_test :foo, :bar
|
50
|
-
expect(condition.tests.last.arguments).to eq %i[foo bar]
|
51
|
-
end
|
52
|
-
|
53
|
-
context 'when given test is callable' do
|
54
|
-
let(:some_test) { proc { } }
|
55
|
-
|
56
|
-
before { condition.some_test }
|
57
|
-
|
58
|
-
it 'registers a condition test' do
|
59
|
-
expect(condition.tests.last).to be_a Tests::ConditionTest
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'registers the test with given block' do
|
63
|
-
expect(condition.tests.last.condition_block).to be some_test
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'registers the test with given arguments' do
|
67
|
-
condition.some_test :foo, :bar
|
68
|
-
expect(condition.tests.last.condition_args).to eq %i[foo bar]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'when a negated test keyword is called' do
|
74
|
-
it 'registers a negated test' do
|
75
|
-
condition.no_some_test
|
76
|
-
expect(condition.tests.last).to be_negated
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe '.evaluate' do
|
82
|
-
let(:env) { double 'env' }
|
83
|
-
let(:code) { proc { some_test; :some_return_value } }
|
84
|
-
let(:some_test) { Class.new(Test) }
|
85
|
-
let(:arguments) { [] }
|
86
|
-
subject(:condition) { described_class.evaluate(env, *arguments, &code) }
|
87
|
-
|
88
|
-
before { described_class.define_test(:some_test, some_test) }
|
89
|
-
|
90
|
-
it 'returns an evaluated condition' do
|
91
|
-
expect(condition).to be_a described_class
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'evaluates the condition tests' do
|
95
|
-
expect(condition.tests.first).to be_a Test
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'evaluates the condition return value' do
|
99
|
-
expect(condition.return_value).to eq :some_return_value
|
100
|
-
end
|
101
|
-
|
102
|
-
context 'when arguments are given' do
|
103
|
-
let(:code) { proc { |a, b| throw a } }
|
104
|
-
let(:arguments) { %i[foo bar] }
|
105
|
-
|
106
|
-
it 'passes arguments as block parameters' do
|
107
|
-
expect { condition }
|
108
|
-
.to throw_symbol :foo
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe '#initialize' do
|
114
|
-
it 'assigns no tests' do
|
115
|
-
expect(condition.tests).to be_empty
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'assigns the return value as nil' do
|
119
|
-
expect(condition.return_value).to be nil
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
describe '#met?' do
|
124
|
-
let(:test_ok) { instance_spy Test, pass?: true }
|
125
|
-
let(:test_ko) { instance_spy Test, pass?: false }
|
126
|
-
subject(:condition) { described_class.new(tests) }
|
127
|
-
|
128
|
-
context 'when all tests are successful' do
|
129
|
-
let(:tests) { [test_ok, test_ok] }
|
130
|
-
|
131
|
-
it 'returns true' do
|
132
|
-
expect(condition.met?).to be true
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
context 'when one test is unsuccessful' do
|
137
|
-
let(:tests) { [test_ok, test_ko] }
|
138
|
-
|
139
|
-
it 'returns false' do
|
140
|
-
expect(condition.met?).to be false
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
context 'when there are no test' do
|
145
|
-
let(:tests) { [] }
|
146
|
-
subject(:condition) { described_class.new([], return_value) }
|
147
|
-
|
148
|
-
context 'and return value is truthy' do
|
149
|
-
let(:return_value) { :some_truthy_value }
|
150
|
-
|
151
|
-
it 'returns true' do
|
152
|
-
expect(condition.met?).to be true
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
context 'and return value is falsy' do
|
157
|
-
let(:return_value) { nil }
|
158
|
-
|
159
|
-
it 'returns false' do
|
160
|
-
expect(condition.met?).to be false
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
describe '#!' do
|
167
|
-
[true, false].each do |b|
|
168
|
-
context "when #met? return #{b}" do
|
169
|
-
before { allow(condition).to receive(:met?) { b } }
|
170
|
-
|
171
|
-
it 'returns the negated #met?' do
|
172
|
-
expect(condition.!).to be !condition.met?
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
describe '#get' do
|
179
|
-
let(:env) { Env.new }
|
180
|
-
|
181
|
-
it 'delegates to env registry' do
|
182
|
-
expect(env).to receive(:get).with :some_key
|
183
|
-
described_class.evaluate(env, []) { get :some_key }
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
describe '#target' do
|
188
|
-
let(:env) { Env.new }
|
189
|
-
|
190
|
-
before { env.target = :some_target }
|
191
|
-
|
192
|
-
it 'returns current env target' do
|
193
|
-
condition = described_class.evaluate(env, []) { target == :some_target }
|
194
|
-
expect(condition).to be_met
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
@@ -1,196 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
describe Env do
|
5
|
-
let(:output) { StringIO.new }
|
6
|
-
subject(:env) { described_class.new(output: output) }
|
7
|
-
|
8
|
-
describe '#initialize' do
|
9
|
-
it 'assigns $stdin as the default input' do
|
10
|
-
expect(env.input).to be $stdin
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'assigns $stderr as the default error output' do
|
14
|
-
expect(env.error_output).to be $stderr
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'assigns no default target' do
|
18
|
-
expect(env.target).not_to be
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'assigns an empty registry' do
|
22
|
-
expect(env.registry).to be_empty
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'assigns verbose as false' do
|
26
|
-
expect(env.verbose).to be false
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'assigns debug as false' do
|
30
|
-
expect(env.debug).to be false
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'assigns dry run as false' do
|
34
|
-
expect(env.dry_run).to be false
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'when output is not given as argument' do
|
38
|
-
subject(:env) { described_class.new }
|
39
|
-
|
40
|
-
it 'assigns $stdout as the default output' do
|
41
|
-
expect(env.output).to be $stdout
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'when input is given as argument' do
|
46
|
-
let(:input) { double 'input' }
|
47
|
-
subject(:env) { described_class.new(input: input) }
|
48
|
-
|
49
|
-
it 'assigns the given input' do
|
50
|
-
expect(env.input).to be input
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'when output is given as argument' do
|
55
|
-
subject(:env) { described_class.new(output: output) }
|
56
|
-
|
57
|
-
it 'assigns the given output' do
|
58
|
-
expect(env.output).to be output
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'when error output is given as argument' do
|
63
|
-
let(:error_output) { StringIO.new }
|
64
|
-
subject(:env) { described_class.new(error_output: error_output) }
|
65
|
-
|
66
|
-
it 'assigns the given error output' do
|
67
|
-
expect(env.error_output).to be error_output
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'when remote is given as argument' do
|
72
|
-
let(:remote) { double 'remote' }
|
73
|
-
subject(:env) { described_class.new(remote: remote) }
|
74
|
-
|
75
|
-
it 'assigns the given remote' do
|
76
|
-
expect(env.remote).to be remote
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe '#target' do
|
82
|
-
let(:target) { double 'target' }
|
83
|
-
|
84
|
-
it 'returns the assigned target' do
|
85
|
-
env.target = target
|
86
|
-
expect(env.target).to be target
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#remote' do
|
91
|
-
it 'builds a Remote with the current target' do
|
92
|
-
env.target = 'some_hostname.example'
|
93
|
-
expect(Remote).to receive(:new).with(env.target)
|
94
|
-
env.remote
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'returns the remote' do
|
98
|
-
remote = double 'remote'
|
99
|
-
allow(Remote).to receive(:new) { remote }
|
100
|
-
expect(env.remote).to eq remote
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'memoizes the remote' do
|
104
|
-
expect(env.remote).to be env.remote
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
describe '#[]' do
|
109
|
-
subject(:env) { Env.new(registry: { some_key: :some_value }) }
|
110
|
-
|
111
|
-
it 'returns the value indexed by given key from the registry' do
|
112
|
-
expect(env[:some_key]).to eq :some_value
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'raises an error when given invalid key' do
|
116
|
-
expect { env[:no_key] }.to raise_error RegistryKeyError
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe '#[]=' do
|
121
|
-
it 'registers given value at given index in the registry' do
|
122
|
-
env[:some_key] = :some_value
|
123
|
-
expect(env[:some_key]).to eq :some_value
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe '#logger' do
|
128
|
-
it 'returns a logger' do
|
129
|
-
expect(env.logger).to be_a Logger
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'uses env output' do
|
133
|
-
env.logger.error 'some message'
|
134
|
-
expect(output.string).to include 'some message'
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'has a log level of WARN' do
|
138
|
-
expect(env.logger.level).to eq Logger::WARN
|
139
|
-
end
|
140
|
-
|
141
|
-
it 'uses our formatter' do
|
142
|
-
expect(env.logger.formatter).to be_a LoggerFormatter
|
143
|
-
end
|
144
|
-
|
145
|
-
context 'when verbose mode is enabled' do
|
146
|
-
before { env.verbose = true }
|
147
|
-
|
148
|
-
it 'has a log level of INFO' do
|
149
|
-
expect(env.logger.level).to eq Logger::INFO
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
describe '#log' do
|
155
|
-
it 'logs an info message through the assigned logger' do
|
156
|
-
expect(env.logger).to receive(:info).with 'message'
|
157
|
-
env.log 'message'
|
158
|
-
end
|
159
|
-
|
160
|
-
context 'when second argument is :warn' do
|
161
|
-
it 'logs a warning message through the assigned logger' do
|
162
|
-
expect(env.logger).to receive(:warn).with 'message'
|
163
|
-
env.log 'message', :warn
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
describe '#verbose?' do
|
169
|
-
it 'returns true when verbose is enabled' do
|
170
|
-
env.verbose = true
|
171
|
-
expect(env).to be_verbose
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
describe '#debug?' do
|
176
|
-
it 'returns true when debug is enabled' do
|
177
|
-
env.debug = true
|
178
|
-
expect(env).to be_debug
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
describe '#dry_run?' do
|
183
|
-
it 'returns true when dry run is enabled' do
|
184
|
-
env.dry_run = true
|
185
|
-
expect(env).to be_dry_run
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
describe '#cleanup' do
|
190
|
-
it 'cleans up the remote' do
|
191
|
-
expect(env.remote).to receive :cleanup
|
192
|
-
env.cleanup
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer
|
4
|
-
module Core
|
5
|
-
describe ErrorFormatter do
|
6
|
-
let(:debug) { false }
|
7
|
-
let(:force_cause) { [] }
|
8
|
-
let(:options) { { debug: debug, force_cause: force_cause } }
|
9
|
-
subject(:formatter) { described_class.new(options) }
|
10
|
-
|
11
|
-
describe '#debug?' do
|
12
|
-
it 'returns false' do
|
13
|
-
expect(formatter.debug?).to be false
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'when debug is enabled' do
|
17
|
-
let(:debug) { true }
|
18
|
-
|
19
|
-
it 'returns true' do
|
20
|
-
expect(formatter.debug?).to be true
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '#format' do
|
26
|
-
let(:rubylibdir) { RbConfig::CONFIG['rubylibdir'] }
|
27
|
-
let(:bt) { %W[backtrace /producer /net-ssh #{rubylibdir}] }
|
28
|
-
let(:exception) { RuntimeError.new('some exception').tap { |o| o.set_backtrace bt } }
|
29
|
-
|
30
|
-
def exception_with_cause
|
31
|
-
begin fail 'exception cause' rescue fail 'some exception' end
|
32
|
-
rescue => e
|
33
|
-
e.tap { |o| o.set_backtrace bt }
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'formats the message' do
|
37
|
-
expect(formatter.format exception)
|
38
|
-
.to match /^RuntimeError: some exception$/
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'indents the backtrace' do
|
42
|
-
expect(formatter.format exception).to match /^\s+backtrace$/
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'excludes producer code from the backtrace' do
|
46
|
-
expect(formatter.format exception).not_to include 'producer'
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'excludes net-ssh from the backtrace' do
|
50
|
-
expect(formatter.format exception).not_to include 'net-ssh'
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'excludes ruby lib directory from the backtrace' do
|
54
|
-
expect(formatter.format exception).not_to include rubylibdir
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when exception has a cause' do
|
58
|
-
it 'does not include the cause' do
|
59
|
-
expect(formatter.format exception_with_cause)
|
60
|
-
.not_to include 'exception cause'
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'when debug is enabled' do
|
65
|
-
let(:debug) { true }
|
66
|
-
|
67
|
-
it 'does not filter the backtrace' do
|
68
|
-
expect(formatter.format exception).to include 'producer'
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'when exception has a cause' do
|
72
|
-
it 'includes the exception cause' do
|
73
|
-
expect(formatter.format exception_with_cause)
|
74
|
-
.to include 'exception cause'
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'formats the cause' do
|
78
|
-
expect(formatter.format exception_with_cause)
|
79
|
-
.to match /^cause:\nRuntimeError: exception cause/
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Producer::Core
|
4
|
-
describe LoggerFormatter do
|
5
|
-
describe '#call' do
|
6
|
-
let(:severity) { double 'severity' }
|
7
|
-
let(:datetime) { double 'datetime' }
|
8
|
-
let(:progname) { double 'progname' }
|
9
|
-
let(:message) { 'some message' }
|
10
|
-
|
11
|
-
subject { described_class.new.call(severity, datetime, progname, message) }
|
12
|
-
|
13
|
-
it 'returns the given message with a line separator' do
|
14
|
-
expect(subject).to eq "#{message}\n"
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when severity is WARN' do
|
18
|
-
let(:severity) { 'WARN' }
|
19
|
-
|
20
|
-
it 'prefix the message with `Warning:\'' do
|
21
|
-
expect(subject).to match /\AWarning: #{message}/
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|