producer-core 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/{test_negated_test.feature → condition_negated_test.feature} +15 -8
- data/features/{recipe_ask.feature → task_ask.feature} +1 -1
- data/lib/producer/core/cli.rb +1 -1
- data/lib/producer/core/condition.rb +33 -4
- data/lib/producer/core/recipe/file_evaluator.rb +14 -0
- data/lib/producer/core/recipe.rb +36 -6
- data/lib/producer/core/task.rb +32 -6
- data/lib/producer/core/version.rb +1 -1
- data/lib/producer/core/worker.rb +5 -7
- data/lib/producer/core.rb +2 -4
- data/spec/producer/core/condition_spec.rb +105 -21
- data/spec/producer/core/recipe/file_evaluator_spec.rb +22 -0
- data/spec/producer/core/recipe_spec.rb +75 -16
- data/spec/producer/core/task_spec.rb +102 -36
- data/spec/producer/core/worker_spec.rb +8 -14
- metadata +10 -16
- data/lib/producer/core/condition/dsl.rb +0 -48
- data/lib/producer/core/recipe/dsl.rb +0 -61
- data/lib/producer/core/task/dsl.rb +0 -50
- data/spec/producer/core/condition/dsl_spec.rb +0 -116
- data/spec/producer/core/recipe/dsl_spec.rb +0 -140
- data/spec/producer/core/task/dsl_spec.rb +0 -123
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a3adf6101a1558efb3ddeaf66acf177c1d60cc1
|
4
|
+
data.tar.gz: 0013660606738921e69b6cda3198ca828bcf4b8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca676ef9b26f0fd6ff8b4a0b88e1cc7caec24da357b8f40280692d19991b8e64b7e7b4c6697a6d5e5debe9bbb3ef4b84ce2cc03ac30c9145a1aceb06a9df04fb
|
7
|
+
data.tar.gz: b8606bd4d3cd7c3507e8ea7e87ad4199a8a5538b95ca2438deff520d40244382b350bfc51b3d1a5fda11ea2ca90f55d3b206cac37f45de059ee2a8632d18b2f1
|
@@ -1,40 +1,47 @@
|
|
1
|
-
@sshd
|
2
1
|
Feature: negated test prefix (no_)
|
3
2
|
|
4
3
|
Scenario: prefixed test fails when non-prefixed test is successful
|
5
4
|
Given a recipe with:
|
6
5
|
"""
|
6
|
+
test_macro :even? do |n|
|
7
|
+
n % 2 == 0
|
8
|
+
end
|
9
|
+
|
7
10
|
task :successful_test do
|
8
|
-
condition {
|
11
|
+
condition { even? 4 }
|
9
12
|
|
10
13
|
echo 'successful_test'
|
11
14
|
end
|
12
15
|
|
13
16
|
task :negated_test do
|
14
|
-
condition {
|
17
|
+
condition { no_even? 4 }
|
15
18
|
|
16
19
|
echo 'negated_test'
|
17
20
|
end
|
18
21
|
"""
|
19
|
-
When I successfully execute the recipe
|
22
|
+
When I successfully execute the recipe
|
20
23
|
Then the output must contain "successful_test"
|
21
24
|
And the output must not contain "negated_test"
|
22
25
|
|
23
|
-
Scenario: prefixed test
|
26
|
+
Scenario: prefixed test succeed when non-prefixed test is failing
|
24
27
|
Given a recipe with:
|
25
28
|
"""
|
29
|
+
test_macro :even? do |n|
|
30
|
+
n % 2 == 0
|
31
|
+
end
|
32
|
+
|
26
33
|
task :failing_test do
|
27
|
-
condition {
|
34
|
+
condition { even? 5 }
|
28
35
|
|
29
36
|
echo 'failing_test'
|
30
37
|
end
|
31
38
|
|
32
39
|
task :negated_test do
|
33
|
-
condition {
|
40
|
+
condition { no_even? 5 }
|
34
41
|
|
35
42
|
echo 'negated_test'
|
36
43
|
end
|
37
44
|
"""
|
38
|
-
When I successfully execute the recipe
|
45
|
+
When I successfully execute the recipe
|
39
46
|
Then the output must not contain "failing_test"
|
40
47
|
And the output must contain "negated_test"
|
data/lib/producer/core/cli.rb
CHANGED
@@ -2,16 +2,45 @@ module Producer
|
|
2
2
|
module Core
|
3
3
|
class Condition
|
4
4
|
class << self
|
5
|
+
def define_test(keyword, test)
|
6
|
+
{
|
7
|
+
keyword => false,
|
8
|
+
"no_#{keyword}" => true
|
9
|
+
}.each do |kw, negated|
|
10
|
+
define_method(kw) do |*args|
|
11
|
+
if test.respond_to? :call
|
12
|
+
args = [test, *args]
|
13
|
+
klass = Tests::ConditionTest
|
14
|
+
else
|
15
|
+
klass = test
|
16
|
+
end
|
17
|
+
t = klass.new(@env, *args, negated: negated)
|
18
|
+
@tests << t
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
5
23
|
def evaluate(env, *args, &block)
|
6
|
-
|
7
|
-
|
8
|
-
|
24
|
+
new.tap do |o|
|
25
|
+
o.instance_eval { @env = env }
|
26
|
+
return_value = o.instance_exec *args, &block
|
27
|
+
o.instance_eval { @return_value = return_value }
|
28
|
+
end
|
9
29
|
end
|
10
30
|
end
|
11
31
|
|
32
|
+
define_test :`, Tests::ShellCommandStatus
|
33
|
+
define_test :sh, Tests::ShellCommandStatus
|
34
|
+
define_test :file_contains, Tests::FileContains
|
35
|
+
define_test :file_eq, Tests::FileEq
|
36
|
+
define_test :env?, Tests::HasEnv
|
37
|
+
define_test :executable?, Tests::HasExecutable
|
38
|
+
define_test :dir?, Tests::HasDir
|
39
|
+
define_test :file?, Tests::HasFile
|
40
|
+
|
12
41
|
attr_reader :tests, :return_value
|
13
42
|
|
14
|
-
def initialize(tests, return_value = nil)
|
43
|
+
def initialize(tests = [], return_value = nil)
|
15
44
|
@tests = tests
|
16
45
|
@return_value = return_value
|
17
46
|
end
|
data/lib/producer/core/recipe.rb
CHANGED
@@ -2,16 +2,46 @@ module Producer
|
|
2
2
|
module Core
|
3
3
|
class Recipe
|
4
4
|
class << self
|
5
|
-
def
|
6
|
-
|
7
|
-
Recipe.new(dsl.tasks)
|
5
|
+
def define_macro(name, block)
|
6
|
+
define_method(name) { |*args| task name, *args, &block }
|
8
7
|
end
|
9
8
|
end
|
10
9
|
|
11
|
-
|
10
|
+
attr_reader :env, :tasks
|
12
11
|
|
13
|
-
def initialize(
|
14
|
-
@
|
12
|
+
def initialize(env)
|
13
|
+
@env = env
|
14
|
+
@tasks = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def source(filepath)
|
18
|
+
instance_eval File.read("./#{filepath}.rb"), "#{filepath}.rb"
|
19
|
+
end
|
20
|
+
|
21
|
+
def target(hostname)
|
22
|
+
env.target ||= hostname
|
23
|
+
end
|
24
|
+
|
25
|
+
def task(name, *args, &block)
|
26
|
+
@tasks << Task.evaluate(env, name, *args, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def macro(name, &block)
|
30
|
+
define_singleton_method(name) do |*args|
|
31
|
+
task("#{name}", *args, &block)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_macro(name, &block)
|
36
|
+
Condition.define_test(name, block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def set(key, value)
|
40
|
+
env[key] = value
|
41
|
+
end
|
42
|
+
|
43
|
+
def get(key)
|
44
|
+
env[key]
|
15
45
|
end
|
16
46
|
end
|
17
47
|
end
|
data/lib/producer/core/task.rb
CHANGED
@@ -2,28 +2,54 @@ module Producer
|
|
2
2
|
module Core
|
3
3
|
class Task
|
4
4
|
class << self
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def define_action(keyword, klass)
|
6
|
+
define_method(keyword) do |*args|
|
7
|
+
@actions << klass.new(@env, *args)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def evaluate(env, name, *args, &block)
|
12
|
+
new(env, name).tap { |o| o.instance_exec *args, &block }
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
16
|
+
define_action :echo, Actions::Echo
|
17
|
+
define_action :sh, Actions::ShellCommand
|
18
|
+
|
19
|
+
define_action :mkdir, Actions::Mkdir
|
20
|
+
define_action :file_append, Actions::FileAppend
|
21
|
+
define_action :file_replace_content, Actions::FileReplaceContent
|
22
|
+
define_action :file_write, Actions::FileWriter
|
23
|
+
|
12
24
|
attr_reader :name, :actions, :condition
|
13
25
|
|
14
|
-
def initialize(name, actions = [], condition = true)
|
26
|
+
def initialize(env, name, actions = [], condition = true)
|
27
|
+
@env = env
|
15
28
|
@name = name
|
16
29
|
@actions = actions
|
17
30
|
@condition = condition
|
18
31
|
end
|
19
32
|
|
20
33
|
def to_s
|
21
|
-
name.to_s
|
34
|
+
@name.to_s
|
22
35
|
end
|
23
36
|
|
24
37
|
def condition_met?
|
25
38
|
!!@condition
|
26
39
|
end
|
40
|
+
|
41
|
+
def condition(&block)
|
42
|
+
@condition = Condition.evaluate(@env, &block) if block
|
43
|
+
@condition
|
44
|
+
end
|
45
|
+
|
46
|
+
def ask(question, choices, prompter: Prompter.new(@env.input, @env.output))
|
47
|
+
prompter.prompt(question, choices)
|
48
|
+
end
|
49
|
+
|
50
|
+
def get(key)
|
51
|
+
@env[key]
|
52
|
+
end
|
27
53
|
end
|
28
54
|
end
|
29
55
|
end
|
data/lib/producer/core/worker.rb
CHANGED
@@ -4,27 +4,25 @@ module Producer
|
|
4
4
|
DRY_RUN_WARNING =
|
5
5
|
'running in dry run mode, actions will NOT be applied'.freeze
|
6
6
|
|
7
|
-
attr_accessor :env
|
8
|
-
|
9
7
|
def initialize(env)
|
10
8
|
@env = env
|
11
9
|
end
|
12
10
|
|
13
11
|
def process(tasks)
|
14
|
-
env.log DRY_RUN_WARNING, :warn if env.dry_run?
|
12
|
+
@env.log DRY_RUN_WARNING, :warn if @env.dry_run?
|
15
13
|
|
16
14
|
tasks.each { |t| process_task t }
|
17
15
|
end
|
18
16
|
|
19
17
|
def process_task(task)
|
20
18
|
if task.condition_met?
|
21
|
-
env.log "Task: `#{task}' applying..."
|
19
|
+
@env.log "Task: `#{task}' applying..."
|
22
20
|
task.actions.each do |e|
|
23
|
-
env.log " action: #{e}"
|
24
|
-
e.apply unless env.dry_run?
|
21
|
+
@env.log " action: #{e}"
|
22
|
+
e.apply unless @env.dry_run?
|
25
23
|
end
|
26
24
|
else
|
27
|
-
env.log "Task: `#{task}' skipped"
|
25
|
+
@env.log "Task: `#{task}' skipped"
|
28
26
|
end
|
29
27
|
end
|
30
28
|
end
|
data/lib/producer/core.rb
CHANGED
@@ -14,7 +14,7 @@ require 'producer/core/actions/file_append'
|
|
14
14
|
require 'producer/core/actions/file_replace_content'
|
15
15
|
require 'producer/core/actions/file_writer'
|
16
16
|
|
17
|
-
# condition tests
|
17
|
+
# condition tests
|
18
18
|
require 'producer/core/test'
|
19
19
|
require 'producer/core/tests/condition_test'
|
20
20
|
require 'producer/core/tests/file_contains'
|
@@ -27,17 +27,15 @@ require 'producer/core/tests/shell_command_status'
|
|
27
27
|
|
28
28
|
require 'producer/core/cli'
|
29
29
|
require 'producer/core/condition'
|
30
|
-
require 'producer/core/condition/dsl'
|
31
30
|
require 'producer/core/env'
|
32
31
|
require 'producer/core/errors'
|
33
32
|
require 'producer/core/logger_formatter'
|
34
33
|
require 'producer/core/prompter'
|
35
34
|
require 'producer/core/recipe'
|
36
|
-
require 'producer/core/recipe/
|
35
|
+
require 'producer/core/recipe/file_evaluator'
|
37
36
|
require 'producer/core/remote'
|
38
37
|
require 'producer/core/remote/environment'
|
39
38
|
require 'producer/core/remote/fs'
|
40
39
|
require 'producer/core/task'
|
41
|
-
require 'producer/core/task/dsl'
|
42
40
|
require 'producer/core/version'
|
43
41
|
require 'producer/core/worker'
|
@@ -2,45 +2,128 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Condition do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
subject(:condition) { described_class.new }
|
6
|
+
|
7
|
+
%w[
|
8
|
+
`
|
9
|
+
sh
|
10
|
+
file_contains
|
11
|
+
file_eq
|
12
|
+
dir?
|
13
|
+
env?
|
14
|
+
executable?
|
15
|
+
file?
|
16
|
+
].each do |test|
|
17
|
+
it "has `#{test}' test defined" do
|
18
|
+
expect(condition).to respond_to test.to_sym
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.define_test' do
|
23
|
+
let(:some_test) { Test }
|
24
|
+
|
25
|
+
before { described_class.define_test(:some_test, some_test) }
|
26
|
+
|
27
|
+
it 'defines a new test keyword' do
|
28
|
+
expect(condition).to respond_to :some_test
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'defines the negated test' do
|
32
|
+
expect(condition).to respond_to :no_some_test
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when a test keyword is called' do
|
36
|
+
it 'registers the test' do
|
37
|
+
expect { condition.some_test }.to change { condition.tests.count }.by 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'registers the test with assigned env' do
|
41
|
+
env = double 'env'
|
42
|
+
condition.instance_eval { @env = env }
|
43
|
+
condition.some_test
|
44
|
+
expect(condition.tests.last.env).to be env
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'registers the test with given arguments' do
|
48
|
+
condition.some_test :foo, :bar
|
49
|
+
expect(condition.tests.last.arguments).to eq %i[foo bar]
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when given test is callable' do
|
53
|
+
let(:some_test) { proc { } }
|
54
|
+
|
55
|
+
before { condition.some_test }
|
56
|
+
|
57
|
+
it 'registers a condition test' do
|
58
|
+
expect(condition.tests.last).to be_a Tests::ConditionTest
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'registers the test with given block' do
|
62
|
+
expect(condition.tests.last.condition_block).to be some_test
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'registers the test with given arguments' do
|
66
|
+
condition.some_test :foo, :bar
|
67
|
+
expect(condition.tests.last.condition_args).to eq %i[foo bar]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when a negated test keyword is called' do
|
73
|
+
it 'registers a negated test' do
|
74
|
+
condition.no_some_test
|
75
|
+
expect(condition.tests.last).to be_negated
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
9
79
|
|
10
80
|
describe '.evaluate' do
|
11
|
-
let(:env)
|
12
|
-
let(:
|
13
|
-
let(:
|
14
|
-
|
81
|
+
let(:env) { double 'env' }
|
82
|
+
let(:code) { proc { some_test; :some_return_value } }
|
83
|
+
let(:some_test) { Class.new(Test) }
|
84
|
+
let(:arguments) { [] }
|
85
|
+
subject(:condition) { described_class.evaluate(env, *arguments, &code) }
|
15
86
|
|
16
|
-
before {
|
87
|
+
before { described_class.define_test(:some_test, some_test) }
|
17
88
|
|
18
89
|
it 'returns an evaluated condition' do
|
90
|
+
expect(condition).to be_a Condition
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'evaluates the condition tests' do
|
19
94
|
expect(condition.tests.first).to be_a Test
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'evaluates the condition return value' do
|
20
98
|
expect(condition.return_value).to eq :some_return_value
|
21
99
|
end
|
100
|
+
|
101
|
+
context 'when arguments are given' do
|
102
|
+
let(:code) { proc { |a, b| throw a } }
|
103
|
+
let(:arguments) { %i[foo bar] }
|
104
|
+
|
105
|
+
it 'passes arguments as block parameters' do
|
106
|
+
expect { condition }
|
107
|
+
.to throw_symbol :foo
|
108
|
+
end
|
109
|
+
end
|
22
110
|
end
|
23
111
|
|
24
112
|
describe '#initialize' do
|
25
|
-
it 'assigns
|
26
|
-
expect(condition.tests).to
|
113
|
+
it 'assigns no tests' do
|
114
|
+
expect(condition.tests).to be_empty
|
27
115
|
end
|
28
116
|
|
29
|
-
it 'assigns
|
117
|
+
it 'assigns the return value as nil' do
|
30
118
|
expect(condition.return_value).to be nil
|
31
119
|
end
|
32
|
-
|
33
|
-
context 'when a return value is given as argument' do
|
34
|
-
let(:return_value) { :some_return_value }
|
35
|
-
subject(:condition) { described_class.new(tests, return_value) }
|
36
|
-
|
37
|
-
it 'assigns the return value' do
|
38
|
-
expect(condition.return_value).to eq return_value
|
39
|
-
end
|
40
|
-
end
|
41
120
|
end
|
42
121
|
|
43
122
|
describe '#met?' do
|
123
|
+
let(:test_ok) { instance_spy Test, pass?: true }
|
124
|
+
let(:test_ko) { instance_spy Test, pass?: false }
|
125
|
+
subject(:condition) { described_class.new(tests) }
|
126
|
+
|
44
127
|
context 'when all tests are successful' do
|
45
128
|
let(:tests) { [test_ok, test_ok] }
|
46
129
|
|
@@ -58,6 +141,7 @@ module Producer::Core
|
|
58
141
|
end
|
59
142
|
|
60
143
|
context 'when there are no test' do
|
144
|
+
let(:tests) { [] }
|
61
145
|
subject(:condition) { described_class.new([], return_value) }
|
62
146
|
|
63
147
|
context 'and return value is truthy' do
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Producer::Core
|
4
|
+
class Recipe
|
5
|
+
describe FileEvaluator do
|
6
|
+
include FixturesHelpers
|
7
|
+
|
8
|
+
describe '.evaluate' do
|
9
|
+
let(:env) { Env.new }
|
10
|
+
let(:file_path) { fixture_path_for 'recipes/some_recipe.rb' }
|
11
|
+
subject(:recipe) { described_class.evaluate(file_path, env) }
|
12
|
+
|
13
|
+
it 'returns an evaluated recipe' do
|
14
|
+
expect(recipe.tasks).to match [
|
15
|
+
an_object_having_attributes(name: :some_task),
|
16
|
+
an_object_having_attributes(name: :another_task)
|
17
|
+
]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -4,33 +4,92 @@ module Producer::Core
|
|
4
4
|
describe Recipe do
|
5
5
|
include FixturesHelpers
|
6
6
|
|
7
|
-
|
7
|
+
let(:env) { Env.new }
|
8
|
+
subject(:recipe) { described_class.new(env) }
|
8
9
|
|
9
|
-
describe '
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'assigns no task' do
|
12
|
+
expect(recipe.tasks).to be_empty
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#source' do
|
17
|
+
let(:filepath) { fixture_path_for 'recipes/throw' }
|
13
18
|
|
14
|
-
it '
|
15
|
-
expect
|
19
|
+
it 'sources the recipe given as argument' do
|
20
|
+
expect { recipe.source filepath }.to throw_symbol :recipe_code
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
19
|
-
describe '#
|
20
|
-
|
21
|
-
|
22
|
-
|
24
|
+
describe '#target' do
|
25
|
+
let(:host) { 'some_host.example' }
|
26
|
+
|
27
|
+
context 'when env has no assigned target' do
|
28
|
+
it 'registers the target host in the env' do
|
29
|
+
recipe.target host
|
30
|
+
expect(env.target).to eq host
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
26
|
-
context 'when
|
27
|
-
|
28
|
-
subject(:recipe) { Recipe.new(tasks) }
|
34
|
+
context 'when env has an assigned target' do
|
35
|
+
before { env.target = 'already_assigned_host.example' }
|
29
36
|
|
30
|
-
it '
|
31
|
-
expect
|
37
|
+
it 'does not change env target' do
|
38
|
+
expect { recipe.target host }.not_to change { env.target }
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
42
|
+
|
43
|
+
describe '#task' do
|
44
|
+
it 'registers a new evaluated task' do
|
45
|
+
expect { recipe.task(:some_task) { :some_task_code } }
|
46
|
+
.to change { recipe.tasks.count }.by 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#macro' do
|
51
|
+
it 'defines the new recipe keyword' do
|
52
|
+
recipe.macro :hello
|
53
|
+
expect(recipe).to respond_to(:hello)
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when a defined macro is called' do
|
57
|
+
before { recipe.macro(:hello) { :some_macro_code } }
|
58
|
+
|
59
|
+
it 'registers the new task' do
|
60
|
+
expect { recipe.hello }.to change { recipe.tasks.count }.by 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when a defined macro is called with arguments' do
|
65
|
+
before { recipe.macro(:hello) { |a, b| echo a, b } }
|
66
|
+
|
67
|
+
it 'evaluates task code with given arguments' do
|
68
|
+
recipe.hello :foo, :bar
|
69
|
+
expect(recipe.tasks.first.actions.first.arguments).to eq %i[foo bar]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#test_macro' do
|
75
|
+
it 'defines the new test' do
|
76
|
+
recipe.test_macro(:some_test) { }
|
77
|
+
expect(Condition.new).to respond_to :some_test
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#set' do
|
82
|
+
it 'registers a key/value pair in env registry' do
|
83
|
+
recipe.set :some_key, :some_value
|
84
|
+
expect(env[:some_key]).to eq :some_value
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#get' do
|
89
|
+
it 'fetches a value from the registry at given index' do
|
90
|
+
recipe.set :some_key, :some_value
|
91
|
+
expect(recipe.get :some_key).to eq :some_value
|
92
|
+
end
|
93
|
+
end
|
35
94
|
end
|
36
95
|
end
|