producer-core 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -0
- data/config/cucumber.yaml +1 -0
- data/features/{action_echo.feature → actions/echo.feature} +0 -0
- data/features/{action_file_append.feature → actions/file_append.feature} +0 -0
- data/features/{action_file_replace_content.feature → actions/file_replace_content.feature} +0 -0
- data/features/{action_file_write.feature → actions/file_write.feature} +0 -0
- data/features/{action_mkdir.feature → actions/mkdir.feature} +0 -0
- data/features/{action_sh.feature → actions/sh.feature} +0 -0
- data/features/{action_yaml_write.feature → actions/yaml_write.feature} +0 -0
- data/features/{cli_debug.feature → cli/debug.feature} +0 -0
- data/features/{cli_dry_run.feature → cli/dry_run.feature} +0 -0
- data/features/{cli_error_reporting.feature → cli/error_reporting.feature} +0 -0
- data/features/{cli_target.feature → cli/target.feature} +0 -0
- data/features/{cli_usage.feature → cli/usage.feature} +0 -0
- data/features/{cli_verbose.feature → cli/verbose.feature} +0 -0
- data/features/{condition_negated_test.feature → condition/negated_test.feature} +0 -0
- data/features/{condition_target.feature → condition/target.feature} +0 -0
- data/features/{recipe_compose_macro.feature → recipe/compose_macro.feature} +0 -0
- data/features/{recipe_macro.feature → recipe/macro.feature} +0 -0
- data/features/{registry.feature → recipe/registry.feature} +23 -0
- data/features/{recipe_source.feature → recipe/source.feature} +0 -0
- data/features/{recipe_target.feature → recipe/target.feature} +0 -0
- data/features/{recipe_test_macro.feature → recipe/test_macro.feature} +0 -0
- data/features/{ssh_config.feature → ssh/config.feature} +0 -0
- data/features/steps/remote_steps.rb +1 -1
- data/features/{task_ask.feature → task/ask.feature} +0 -0
- data/features/{task_condition.feature → task/condition.feature} +0 -0
- data/features/{task_nested_tasks.feature → task/nested_tasks.feature} +0 -0
- data/features/{task_target.feature → task/target.feature} +0 -0
- data/features/{task_template.feature → task/template.feature} +0 -0
- data/features/{test_dir.feature → tests/dir.feature} +0 -0
- data/features/{test_env.feature → tests/env.feature} +0 -0
- data/features/{test_executable.feature → tests/executable.feature} +0 -0
- data/features/{test_file.feature → tests/file.feature} +0 -0
- data/features/{test_file_contains.feature → tests/file_contains.feature} +0 -0
- data/features/{test_file_eq.feature → tests/file_eq.feature} +0 -0
- data/features/{test_file_match.feature → tests/file_match.feature} +0 -0
- data/features/{test_shell_command_status.feature → tests/shell_command_status.feature} +0 -0
- data/features/{test_yaml_eq.feature → tests/yaml_eq.feature} +0 -0
- data/lib/producer/core/cli.rb +2 -1
- data/lib/producer/core/env.rb +6 -7
- data/lib/producer/core/error_formatter.rb +10 -1
- data/lib/producer/core/recipe.rb +3 -8
- data/lib/producer/core/task.rb +4 -9
- data/lib/producer/core/tests/condition_test.rb +3 -7
- data/lib/producer/core/tests/shell_command_status.rb +3 -4
- data/lib/producer/core/version.rb +1 -1
- data/spec/producer/core/cli_spec.rb +9 -0
- data/spec/producer/core/task_spec.rb +12 -0
- metadata +77 -75
data/.travis.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
default: --require features/support --require features/steps
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -46,3 +46,26 @@ Feature: key/value registry
|
|
46
46
|
When I execute the recipe
|
47
47
|
Then the output must not contain "after_fail"
|
48
48
|
And the output must match /\A\w+Error:\s+:no_key/
|
49
|
+
|
50
|
+
Scenario: `get' keyword accepts a default value
|
51
|
+
Given a recipe with:
|
52
|
+
"""
|
53
|
+
task :registry_testing do
|
54
|
+
echo get(:some_key, 'some_value')
|
55
|
+
end
|
56
|
+
"""
|
57
|
+
When I successfully execute the recipe
|
58
|
+
Then the output must contain "some_value"
|
59
|
+
|
60
|
+
Scenario: `set?' keyword tests wether given key is defined
|
61
|
+
Given a recipe with:
|
62
|
+
"""
|
63
|
+
set :some_key, 'some_value'
|
64
|
+
task :registry_testing do
|
65
|
+
echo 'some_value_set' if set? :some_key
|
66
|
+
echo 'other_value' if set? :other_key
|
67
|
+
end
|
68
|
+
"""
|
69
|
+
When I execute the recipe
|
70
|
+
Then the output must contain "some_value_set"
|
71
|
+
And the output must not contain "other_value"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -19,7 +19,7 @@ Then /^the remote file "([^"]+)" must contain "([^"]+)"$/ do |path, content|
|
|
19
19
|
end
|
20
20
|
|
21
21
|
Then /^the remote file "([^"]+)" must contain exactly "([^"]+)"$/ do |path, content|
|
22
|
-
|
22
|
+
check_file_content path, content
|
23
23
|
end
|
24
24
|
|
25
25
|
Then /^the remote file "([^"]+)" must match \/([^\/]+)\/$/ do |path, pattern|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/producer/core/cli.rb
CHANGED
@@ -17,7 +17,7 @@ module Producer
|
|
17
17
|
rescue ArgumentError => e
|
18
18
|
stderr.puts e.message
|
19
19
|
exit EX_USAGE
|
20
|
-
rescue
|
20
|
+
rescue StandardError => e
|
21
21
|
ef = ErrorFormatter.new(
|
22
22
|
debug: cli.env.debug?,
|
23
23
|
force_cause: [RecipeEvaluationError]
|
@@ -45,6 +45,7 @@ module Producer
|
|
45
45
|
|
46
46
|
def run(worker: Worker.new(@env))
|
47
47
|
evaluate_recipes.each { |recipe| worker.process recipe.tasks }
|
48
|
+
ensure
|
48
49
|
@env.cleanup
|
49
50
|
end
|
50
51
|
|
data/lib/producer/core/env.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
module Producer
|
2
2
|
module Core
|
3
3
|
class Env
|
4
|
+
extend Forwardable
|
5
|
+
def_delegators :@registry, :[]=, :key?
|
6
|
+
|
4
7
|
attr_reader :input, :output, :error_output, :registry, :logger
|
5
8
|
attr_accessor :target, :verbose, :debug, :dry_run
|
6
9
|
|
@@ -17,17 +20,13 @@ module Producer
|
|
17
20
|
@remote ||= Remote.new(target)
|
18
21
|
end
|
19
22
|
|
20
|
-
def [](
|
21
|
-
@registry.fetch
|
23
|
+
def [](*args)
|
24
|
+
@registry.fetch *args
|
22
25
|
rescue KeyError
|
23
|
-
fail RegistryKeyError,
|
26
|
+
fail RegistryKeyError, args.first.inspect
|
24
27
|
end
|
25
28
|
alias get []
|
26
29
|
|
27
|
-
def []=(key, value)
|
28
|
-
@registry[key] = value
|
29
|
-
end
|
30
|
-
|
31
30
|
def logger
|
32
31
|
@logger ||= begin
|
33
32
|
logger = Logger.new(output)
|
@@ -1,6 +1,12 @@
|
|
1
1
|
module Producer
|
2
2
|
module Core
|
3
3
|
class ErrorFormatter
|
4
|
+
FILTERS = [
|
5
|
+
/\/producer-\w+\/(?:bin|lib)\//,
|
6
|
+
/\/net\/ssh\//,
|
7
|
+
/\/net\/sftp\//
|
8
|
+
].freeze
|
9
|
+
|
4
10
|
def initialize(debug: false, force_cause: [])
|
5
11
|
@debug = debug
|
6
12
|
@force_cause = force_cause
|
@@ -22,6 +28,7 @@ module Producer
|
|
22
28
|
lines.join("\n")
|
23
29
|
end
|
24
30
|
|
31
|
+
|
25
32
|
private
|
26
33
|
|
27
34
|
def format_exception(exception, filter: true)
|
@@ -42,7 +49,9 @@ module Producer
|
|
42
49
|
end
|
43
50
|
|
44
51
|
def filter_backtrace(backtrace)
|
45
|
-
backtrace.reject
|
52
|
+
backtrace.reject do |line|
|
53
|
+
FILTERS.any? { |filter| line =~ filter }
|
54
|
+
end
|
46
55
|
end
|
47
56
|
|
48
57
|
def indent_backtrace(backtrace)
|
data/lib/producer/core/recipe.rb
CHANGED
@@ -19,6 +19,9 @@ module Producer
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
extend Forwardable
|
23
|
+
def_delegator :@env, :[]=, :set
|
24
|
+
def_delegator :@env, :[], :get
|
22
25
|
attr_reader :env, :tasks
|
23
26
|
|
24
27
|
def initialize(env)
|
@@ -49,14 +52,6 @@ module Producer
|
|
49
52
|
def test_macro(name, &block)
|
50
53
|
Condition.define_test(name, block)
|
51
54
|
end
|
52
|
-
|
53
|
-
def set(key, value)
|
54
|
-
env[key] = value
|
55
|
-
end
|
56
|
-
|
57
|
-
def get(key)
|
58
|
-
env[key]
|
59
|
-
end
|
60
55
|
end
|
61
56
|
end
|
62
57
|
end
|
data/lib/producer/core/task.rb
CHANGED
@@ -14,7 +14,10 @@ module Producer
|
|
14
14
|
end
|
15
15
|
|
16
16
|
extend Forwardable
|
17
|
-
def_delegators
|
17
|
+
def_delegators :@name, :to_s
|
18
|
+
def_delegators :@env, :target
|
19
|
+
def_delegator :@env, :[], :get
|
20
|
+
def_delegator :@env, :key?, :set?
|
18
21
|
|
19
22
|
define_action :echo, Actions::Echo
|
20
23
|
define_action :sh, Actions::ShellCommand
|
@@ -34,10 +37,6 @@ module Producer
|
|
34
37
|
@condition = condition
|
35
38
|
end
|
36
39
|
|
37
|
-
def to_s
|
38
|
-
@name.to_s
|
39
|
-
end
|
40
|
-
|
41
40
|
def condition_met?
|
42
41
|
!!@condition
|
43
42
|
end
|
@@ -55,10 +54,6 @@ module Producer
|
|
55
54
|
prompter.prompt(question, choices)
|
56
55
|
end
|
57
56
|
|
58
|
-
def get(key)
|
59
|
-
@env[key]
|
60
|
-
end
|
61
|
-
|
62
57
|
def template(path, variables = {})
|
63
58
|
Template.new(path).render variables
|
64
59
|
end
|
@@ -2,9 +2,9 @@ module Producer
|
|
2
2
|
module Core
|
3
3
|
module Tests
|
4
4
|
class ConditionTest < Test
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
extend Forwardable
|
6
|
+
def_delegator :@arguments, :first, :condition_block
|
7
|
+
def_delegator :condition, :met?, :verify
|
8
8
|
|
9
9
|
def condition
|
10
10
|
Condition.evaluate(env, *condition_args, &condition_block)
|
@@ -13,10 +13,6 @@ module Producer
|
|
13
13
|
def condition_args
|
14
14
|
arguments.drop 1
|
15
15
|
end
|
16
|
-
|
17
|
-
def condition_block
|
18
|
-
arguments.first
|
19
|
-
end
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
@@ -2,16 +2,15 @@ module Producer
|
|
2
2
|
module Core
|
3
3
|
module Tests
|
4
4
|
class ShellCommandStatus < Test
|
5
|
+
extend Forwardable
|
6
|
+
def_delegator :@arguments, :first, :command
|
7
|
+
|
5
8
|
def verify
|
6
9
|
remote.execute(command)
|
7
10
|
true
|
8
11
|
rescue RemoteCommandExecutionError
|
9
12
|
false
|
10
13
|
end
|
11
|
-
|
12
|
-
def command
|
13
|
-
arguments.first
|
14
|
-
end
|
15
14
|
end
|
16
15
|
end
|
17
16
|
end
|
@@ -152,6 +152,15 @@ module Producer::Core
|
|
152
152
|
expect(cli.env).to receive :cleanup
|
153
153
|
cli.run
|
154
154
|
end
|
155
|
+
|
156
|
+
context 'on error' do
|
157
|
+
let(:recipe_file) { fixture_path_for 'recipes/raise.rb' }
|
158
|
+
|
159
|
+
it 'cleans up the env' do
|
160
|
+
expect(cli.env).to receive :cleanup
|
161
|
+
cli.run rescue nil
|
162
|
+
end
|
163
|
+
end
|
155
164
|
end
|
156
165
|
|
157
166
|
describe '#evaluate_recipes' do
|
@@ -160,6 +160,18 @@ module Producer::Core
|
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
|
+
describe '#set?' do
|
164
|
+
before { env[:some_key] = :some_value }
|
165
|
+
|
166
|
+
it 'returns true when given key exists' do
|
167
|
+
expect(task.set? :some_key).to be true
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'returns false when given key does not exist' do
|
171
|
+
expect(task.set? :other_key).to be false
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
163
175
|
describe '#target' do
|
164
176
|
before { env.target = :some_target }
|
165
177
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: producer-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: net-ssh
|
@@ -132,33 +132,35 @@ extensions: []
|
|
132
132
|
extra_rdoc_files: []
|
133
133
|
files:
|
134
134
|
- ".gitignore"
|
135
|
+
- ".travis.yml"
|
135
136
|
- Gemfile
|
136
137
|
- Guardfile
|
137
138
|
- LICENSE
|
138
139
|
- Rakefile
|
139
140
|
- bin/producer
|
140
|
-
-
|
141
|
-
- features/
|
142
|
-
- features/
|
143
|
-
- features/
|
144
|
-
- features/
|
145
|
-
- features/
|
146
|
-
- features/
|
147
|
-
- features/
|
148
|
-
- features/
|
149
|
-
- features/
|
150
|
-
- features/
|
151
|
-
- features/
|
152
|
-
- features/
|
153
|
-
- features/
|
154
|
-
- features/
|
155
|
-
- features/
|
156
|
-
- features/
|
157
|
-
- features/
|
158
|
-
- features/
|
159
|
-
- features/
|
160
|
-
- features/
|
161
|
-
- features/
|
141
|
+
- config/cucumber.yaml
|
142
|
+
- features/actions/echo.feature
|
143
|
+
- features/actions/file_append.feature
|
144
|
+
- features/actions/file_replace_content.feature
|
145
|
+
- features/actions/file_write.feature
|
146
|
+
- features/actions/mkdir.feature
|
147
|
+
- features/actions/sh.feature
|
148
|
+
- features/actions/yaml_write.feature
|
149
|
+
- features/cli/debug.feature
|
150
|
+
- features/cli/dry_run.feature
|
151
|
+
- features/cli/error_reporting.feature
|
152
|
+
- features/cli/target.feature
|
153
|
+
- features/cli/usage.feature
|
154
|
+
- features/cli/verbose.feature
|
155
|
+
- features/condition/negated_test.feature
|
156
|
+
- features/condition/target.feature
|
157
|
+
- features/recipe/compose_macro.feature
|
158
|
+
- features/recipe/macro.feature
|
159
|
+
- features/recipe/registry.feature
|
160
|
+
- features/recipe/source.feature
|
161
|
+
- features/recipe/target.feature
|
162
|
+
- features/recipe/test_macro.feature
|
163
|
+
- features/ssh/config.feature
|
162
164
|
- features/steps/etc_steps.rb
|
163
165
|
- features/steps/execution_steps.rb
|
164
166
|
- features/steps/output_steps.rb
|
@@ -169,20 +171,20 @@ files:
|
|
169
171
|
- features/support/env_aruba_timeout.rb
|
170
172
|
- features/support/env_cucumber_doc_string.rb
|
171
173
|
- features/support/env_fake_home.rb
|
172
|
-
- features/
|
173
|
-
- features/
|
174
|
-
- features/
|
175
|
-
- features/
|
176
|
-
- features/
|
177
|
-
- features/
|
178
|
-
- features/
|
179
|
-
- features/
|
180
|
-
- features/
|
181
|
-
- features/
|
182
|
-
- features/
|
183
|
-
- features/
|
184
|
-
- features/
|
185
|
-
- features/
|
174
|
+
- features/task/ask.feature
|
175
|
+
- features/task/condition.feature
|
176
|
+
- features/task/nested_tasks.feature
|
177
|
+
- features/task/target.feature
|
178
|
+
- features/task/template.feature
|
179
|
+
- features/tests/dir.feature
|
180
|
+
- features/tests/env.feature
|
181
|
+
- features/tests/executable.feature
|
182
|
+
- features/tests/file.feature
|
183
|
+
- features/tests/file_contains.feature
|
184
|
+
- features/tests/file_eq.feature
|
185
|
+
- features/tests/file_match.feature
|
186
|
+
- features/tests/shell_command_status.feature
|
187
|
+
- features/tests/yaml_eq.feature
|
186
188
|
- lib/producer/core.rb
|
187
189
|
- lib/producer/core/action.rb
|
188
190
|
- lib/producer/core/actions/echo.rb
|
@@ -290,33 +292,33 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
290
292
|
version: '0'
|
291
293
|
requirements: []
|
292
294
|
rubyforge_project:
|
293
|
-
rubygems_version: 1.8.
|
295
|
+
rubygems_version: 1.8.30
|
294
296
|
signing_key:
|
295
297
|
specification_version: 3
|
296
298
|
summary: Provisioning tool
|
297
299
|
test_files:
|
298
|
-
- features/
|
299
|
-
- features/
|
300
|
-
- features/
|
301
|
-
- features/
|
302
|
-
- features/
|
303
|
-
- features/
|
304
|
-
- features/
|
305
|
-
- features/
|
306
|
-
- features/
|
307
|
-
- features/
|
308
|
-
- features/
|
309
|
-
- features/
|
310
|
-
- features/
|
311
|
-
- features/
|
312
|
-
- features/
|
313
|
-
- features/
|
314
|
-
- features/
|
315
|
-
- features/
|
316
|
-
- features/
|
317
|
-
- features/
|
318
|
-
- features/
|
319
|
-
- features/
|
300
|
+
- features/actions/echo.feature
|
301
|
+
- features/actions/file_append.feature
|
302
|
+
- features/actions/file_replace_content.feature
|
303
|
+
- features/actions/file_write.feature
|
304
|
+
- features/actions/mkdir.feature
|
305
|
+
- features/actions/sh.feature
|
306
|
+
- features/actions/yaml_write.feature
|
307
|
+
- features/cli/debug.feature
|
308
|
+
- features/cli/dry_run.feature
|
309
|
+
- features/cli/error_reporting.feature
|
310
|
+
- features/cli/target.feature
|
311
|
+
- features/cli/usage.feature
|
312
|
+
- features/cli/verbose.feature
|
313
|
+
- features/condition/negated_test.feature
|
314
|
+
- features/condition/target.feature
|
315
|
+
- features/recipe/compose_macro.feature
|
316
|
+
- features/recipe/macro.feature
|
317
|
+
- features/recipe/registry.feature
|
318
|
+
- features/recipe/source.feature
|
319
|
+
- features/recipe/target.feature
|
320
|
+
- features/recipe/test_macro.feature
|
321
|
+
- features/ssh/config.feature
|
320
322
|
- features/steps/etc_steps.rb
|
321
323
|
- features/steps/execution_steps.rb
|
322
324
|
- features/steps/output_steps.rb
|
@@ -327,20 +329,20 @@ test_files:
|
|
327
329
|
- features/support/env_aruba_timeout.rb
|
328
330
|
- features/support/env_cucumber_doc_string.rb
|
329
331
|
- features/support/env_fake_home.rb
|
330
|
-
- features/
|
331
|
-
- features/
|
332
|
-
- features/
|
333
|
-
- features/
|
334
|
-
- features/
|
335
|
-
- features/
|
336
|
-
- features/
|
337
|
-
- features/
|
338
|
-
- features/
|
339
|
-
- features/
|
340
|
-
- features/
|
341
|
-
- features/
|
342
|
-
- features/
|
343
|
-
- features/
|
332
|
+
- features/task/ask.feature
|
333
|
+
- features/task/condition.feature
|
334
|
+
- features/task/nested_tasks.feature
|
335
|
+
- features/task/target.feature
|
336
|
+
- features/task/template.feature
|
337
|
+
- features/tests/dir.feature
|
338
|
+
- features/tests/env.feature
|
339
|
+
- features/tests/executable.feature
|
340
|
+
- features/tests/file.feature
|
341
|
+
- features/tests/file_contains.feature
|
342
|
+
- features/tests/file_eq.feature
|
343
|
+
- features/tests/file_match.feature
|
344
|
+
- features/tests/shell_command_status.feature
|
345
|
+
- features/tests/yaml_eq.feature
|
344
346
|
- spec/fixtures/recipes/empty.rb
|
345
347
|
- spec/fixtures/recipes/raise.rb
|
346
348
|
- spec/fixtures/recipes/some_recipe.rb
|