producer-core 0.3.8 → 0.3.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/features/task_template.feature +27 -0
- data/features/test_file_match.feature +26 -0
- data/lib/producer/core/condition.rb +1 -0
- data/lib/producer/core/remote.rb +2 -3
- data/lib/producer/core/task.rb +19 -0
- data/lib/producer/core/tests/file_contains.rb +1 -0
- data/lib/producer/core/tests/file_match.rb +18 -0
- data/lib/producer/core/tests/has_env.rb +1 -0
- data/lib/producer/core/version.rb +1 -1
- data/lib/producer/core.rb +2 -0
- data/spec/producer/core/actions/echo_spec.rb +1 -1
- data/spec/producer/core/actions/file_append_spec.rb +1 -1
- data/spec/producer/core/actions/file_replace_content_spec.rb +1 -1
- data/spec/producer/core/actions/file_writer_spec.rb +3 -3
- data/spec/producer/core/actions/mkdir_spec.rb +2 -2
- data/spec/producer/core/actions/shell_command_spec.rb +1 -1
- data/spec/producer/core/condition_spec.rb +2 -1
- data/spec/producer/core/prompter_spec.rb +1 -1
- data/spec/producer/core/remote/fs_spec.rb +1 -1
- data/spec/producer/core/remote_spec.rb +1 -1
- data/spec/producer/core/testing/mock_remote_spec.rb +1 -1
- data/spec/producer/core/tests/file_contains_spec.rb +1 -1
- data/spec/producer/core/tests/file_eq_spec.rb +1 -1
- data/spec/producer/core/tests/file_match_spec.rb +46 -0
- data/spec/producer/core/tests/has_dir_spec.rb +1 -1
- data/spec/producer/core/tests/has_env_spec.rb +2 -2
- data/spec/producer/core/tests/has_executable_spec.rb +1 -1
- data/spec/producer/core/tests/has_file_spec.rb +1 -1
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fba0f36e7a80a2897a17831da23ae1e9a7510ab3
|
4
|
+
data.tar.gz: 53ec1accae1569022521804498ea3eb379e6d6d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 024a23110ed45ca7ed46d78a4ca77e403de5283482aedc549b34f63b3aa14ab38d70f9defbab90e8b8ed935e28e1a116a0307cfc35d4b577dee77934a2364a3a
|
7
|
+
data.tar.gz: 8a5c854adfa2ae0d8bec10abe38995d9aaf7ce312013081a7b4b226c0a58519419457f33be3cd52142864e0be0317fc1e0527f09881a73308cd843a81b5fbd89
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Feature: `template' task keyword
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a file named "basic.erb" with:
|
5
|
+
"""
|
6
|
+
basic template
|
7
|
+
"""
|
8
|
+
Given a file named "variables.erb" with:
|
9
|
+
"""
|
10
|
+
<%= @foo %>
|
11
|
+
"""
|
12
|
+
|
13
|
+
Scenario: renders an ERB template file
|
14
|
+
Given a recipe with:
|
15
|
+
"""
|
16
|
+
task(:echo_template) { echo template 'basic' }
|
17
|
+
"""
|
18
|
+
When I execute the recipe
|
19
|
+
Then the output must contain "basic template"
|
20
|
+
|
21
|
+
Scenario: renders ERB with given attributes as member data
|
22
|
+
Given a recipe with:
|
23
|
+
"""
|
24
|
+
task(:echo_template) { echo template('variables', foo: 'bar') }
|
25
|
+
"""
|
26
|
+
When I execute the recipe
|
27
|
+
Then the output must contain "bar"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
@sshd
|
2
|
+
Feature: `file_match' condition keyword
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given a recipe with:
|
6
|
+
"""
|
7
|
+
task :file_match_test do
|
8
|
+
condition { file_match 'some_file', /\Asome_content\z/ }
|
9
|
+
|
10
|
+
echo 'evaluated'
|
11
|
+
end
|
12
|
+
"""
|
13
|
+
|
14
|
+
Scenario: succeeds when file match pattern
|
15
|
+
Given a remote file named "some_file" with "some_content"
|
16
|
+
When I successfully execute the recipe on remote target
|
17
|
+
Then the output must contain "evaluated"
|
18
|
+
|
19
|
+
Scenario: fails when file does not match pattern
|
20
|
+
Given a remote file named "some_file" with "some_other_content"
|
21
|
+
When I successfully execute the recipe on remote target
|
22
|
+
Then the output must not contain "evaluated"
|
23
|
+
|
24
|
+
Scenario: fails when file does not exist
|
25
|
+
When I successfully execute the recipe on remote target
|
26
|
+
Then the output must not contain "evaluated"
|
@@ -36,6 +36,7 @@ module Producer
|
|
36
36
|
define_test :sh, Tests::ShellCommandStatus
|
37
37
|
define_test :file_contains, Tests::FileContains
|
38
38
|
define_test :file_eq, Tests::FileEq
|
39
|
+
define_test :file_match, Tests::FileMatch
|
39
40
|
define_test :env?, Tests::HasEnv
|
40
41
|
define_test :executable?, Tests::HasExecutable
|
41
42
|
define_test :dir?, Tests::HasDir
|
data/lib/producer/core/remote.rb
CHANGED
@@ -25,7 +25,7 @@ module Producer
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def execute(command, output = '', error_output = '')
|
28
|
-
|
28
|
+
session.open_channel do |channel|
|
29
29
|
channel.exec command do |ch, success|
|
30
30
|
ch.on_data do |c, data|
|
31
31
|
output << data
|
@@ -40,8 +40,7 @@ module Producer
|
|
40
40
|
fail RemoteCommandExecutionError, command if exit_status != 0
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
44
|
-
channel.wait
|
43
|
+
end.wait
|
45
44
|
output
|
46
45
|
end
|
47
46
|
|
data/lib/producer/core/task.rb
CHANGED
@@ -57,6 +57,25 @@ module Producer
|
|
57
57
|
def get(key)
|
58
58
|
@env[key]
|
59
59
|
end
|
60
|
+
|
61
|
+
def template(path, variables = {})
|
62
|
+
path = "#{path}.erb"
|
63
|
+
tpl = ERB.new(File.read(path), nil, '-')
|
64
|
+
tpl.filename = path
|
65
|
+
tpl.result build_erb_binding variables
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def build_erb_binding(variables)
|
72
|
+
Object.new.instance_eval do |o|
|
73
|
+
variables.each do |k, v|
|
74
|
+
o.instance_variable_set "@#{k}", v
|
75
|
+
end
|
76
|
+
binding
|
77
|
+
end
|
78
|
+
end
|
60
79
|
end
|
61
80
|
end
|
62
81
|
end
|
data/lib/producer/core.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'erb'
|
1
2
|
require 'etc'
|
2
3
|
require 'forwardable'
|
3
4
|
require 'optparse'
|
@@ -21,6 +22,7 @@ require 'producer/core/test'
|
|
21
22
|
require 'producer/core/tests/condition_test'
|
22
23
|
require 'producer/core/tests/file_contains'
|
23
24
|
require 'producer/core/tests/file_eq'
|
25
|
+
require 'producer/core/tests/file_match'
|
24
26
|
require 'producer/core/tests/has_dir'
|
25
27
|
require 'producer/core/tests/has_env'
|
26
28
|
require 'producer/core/tests/has_executable'
|
@@ -6,7 +6,7 @@ module Producer::Core
|
|
6
6
|
let(:path) { 'some_path' }
|
7
7
|
let(:content) { 'some content' }
|
8
8
|
let(:added_content) { ' added' }
|
9
|
-
subject(:action) {
|
9
|
+
subject(:action) { described_class.new(env, path, added_content) }
|
10
10
|
|
11
11
|
it_behaves_like 'action'
|
12
12
|
|
@@ -7,7 +7,7 @@ module Producer::Core
|
|
7
7
|
let(:pattern) { 'content' }
|
8
8
|
let(:replacement) { 'other content' }
|
9
9
|
let(:content) { 'some content' }
|
10
|
-
subject(:action) {
|
10
|
+
subject(:action) { described_class.new(env, path, pattern, replacement) }
|
11
11
|
|
12
12
|
it_behaves_like 'action'
|
13
13
|
|
@@ -5,7 +5,7 @@ module Producer::Core
|
|
5
5
|
describe FileWriter, :env do
|
6
6
|
let(:path) { 'some_path' }
|
7
7
|
let(:content) { 'some_content' }
|
8
|
-
subject(:writer) {
|
8
|
+
subject(:writer) { described_class.new(env, path, content) }
|
9
9
|
|
10
10
|
it_behaves_like 'action'
|
11
11
|
|
@@ -16,7 +16,7 @@ module Producer::Core
|
|
16
16
|
end
|
17
17
|
|
18
18
|
context 'when a mode was given' do
|
19
|
-
subject(:writer) {
|
19
|
+
subject(:writer) { described_class.new(env, path, content, 0600) }
|
20
20
|
|
21
21
|
it 'specifies the given mode' do
|
22
22
|
expect(remote_fs)
|
@@ -44,7 +44,7 @@ module Producer::Core
|
|
44
44
|
end
|
45
45
|
|
46
46
|
context 'when a mode was given' do
|
47
|
-
subject(:writer) {
|
47
|
+
subject(:writer) { described_class.new(env, path, content, 0600) }
|
48
48
|
|
49
49
|
it 'returns the mode' do
|
50
50
|
expect(writer.mode).to eq 0600
|
@@ -4,7 +4,7 @@ module Producer::Core
|
|
4
4
|
module Actions
|
5
5
|
describe Mkdir, :env do
|
6
6
|
let(:path) { 'some_path' }
|
7
|
-
subject(:mkdir) {
|
7
|
+
subject(:mkdir) { described_class.new(env, path) }
|
8
8
|
|
9
9
|
it_behaves_like 'action'
|
10
10
|
|
@@ -17,7 +17,7 @@ module Producer::Core
|
|
17
17
|
end
|
18
18
|
|
19
19
|
context 'when a mode was given' do
|
20
|
-
subject(:mkdir) {
|
20
|
+
subject(:mkdir) { described_class.new(env, path, 0700) }
|
21
21
|
|
22
22
|
it 'changes the directory with given mode' do
|
23
23
|
expect(remote_fs).to receive(:chmod).with(path, 0700)
|
@@ -5,7 +5,7 @@ module Producer::Core
|
|
5
5
|
describe ShellCommand, :env do
|
6
6
|
let(:command_args) { 'hello from remote host' }
|
7
7
|
let(:command) { "echo #{command_args}" }
|
8
|
-
subject(:sh) {
|
8
|
+
subject(:sh) { described_class.new(env, command) }
|
9
9
|
|
10
10
|
it_behaves_like 'action'
|
11
11
|
|
@@ -9,6 +9,7 @@ module Producer::Core
|
|
9
9
|
sh
|
10
10
|
file_contains
|
11
11
|
file_eq
|
12
|
+
file_match
|
12
13
|
dir?
|
13
14
|
env?
|
14
15
|
executable?
|
@@ -87,7 +88,7 @@ module Producer::Core
|
|
87
88
|
before { described_class.define_test(:some_test, some_test) }
|
88
89
|
|
89
90
|
it 'returns an evaluated condition' do
|
90
|
-
expect(condition).to be_a
|
91
|
+
expect(condition).to be_a described_class
|
91
92
|
end
|
92
93
|
|
93
94
|
it 'evaluates the condition tests' do
|
@@ -4,7 +4,7 @@ module Producer::Core
|
|
4
4
|
describe Prompter do
|
5
5
|
let(:input) { StringIO.new }
|
6
6
|
let(:output) { StringIO.new }
|
7
|
-
subject(:prompter) {
|
7
|
+
subject(:prompter) { described_class.new(input, output) }
|
8
8
|
|
9
9
|
describe '#initialize' do
|
10
10
|
it 'assigns the given input' do
|
@@ -5,7 +5,7 @@ module Producer::Core
|
|
5
5
|
describe FS do
|
6
6
|
let(:sftp_file) { double 'sftp_file' }
|
7
7
|
let(:sftp) { double('sftp', file: sftp_file) }
|
8
|
-
subject(:fs) {
|
8
|
+
subject(:fs) { described_class.new(sftp) }
|
9
9
|
|
10
10
|
describe '#initialize' do
|
11
11
|
it 'assigns the sftp session' do
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module Producer::Core
|
4
4
|
describe Remote do
|
5
5
|
let(:hostname) { 'some_host.example' }
|
6
|
-
subject(:remote) {
|
6
|
+
subject(:remote) { described_class.new(hostname) }
|
7
7
|
|
8
8
|
describe '#initialize' do
|
9
9
|
it 'assigns the given hostname' do
|
@@ -4,7 +4,7 @@ require 'producer/core/testing'
|
|
4
4
|
module Producer::Core
|
5
5
|
module Testing
|
6
6
|
describe MockRemote do
|
7
|
-
subject(:remote) {
|
7
|
+
subject(:remote) { described_class.new('some_host.example') }
|
8
8
|
|
9
9
|
it 'is a remote' do
|
10
10
|
expect(remote).to be_a Remote
|
@@ -5,7 +5,7 @@ module Producer::Core
|
|
5
5
|
describe FileContains, :env do
|
6
6
|
let(:filepath) { 'some_file' }
|
7
7
|
let(:content) { 'some_content' }
|
8
|
-
subject(:test) {
|
8
|
+
subject(:test) { described_class.new(env, filepath, content) }
|
9
9
|
|
10
10
|
it_behaves_like 'test'
|
11
11
|
|
@@ -5,7 +5,7 @@ module Producer::Core
|
|
5
5
|
describe FileEq, :env do
|
6
6
|
let(:filepath) { 'some_file' }
|
7
7
|
let(:content) { 'some content' }
|
8
|
-
subject(:test) {
|
8
|
+
subject(:test) { described_class.new(env, filepath, content) }
|
9
9
|
|
10
10
|
it_behaves_like 'test'
|
11
11
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Producer::Core
|
4
|
+
module Tests
|
5
|
+
describe FileMatch, :env do
|
6
|
+
let(:filepath) { 'some_file' }
|
7
|
+
let(:pattern) { /\Asome_content\z/ }
|
8
|
+
subject(:test) { described_class.new(env, filepath, pattern) }
|
9
|
+
|
10
|
+
it_behaves_like 'test'
|
11
|
+
|
12
|
+
describe '#verify' do
|
13
|
+
context 'when file matches the pattern' do
|
14
|
+
before do
|
15
|
+
allow(remote_fs)
|
16
|
+
.to receive(:file_read).with(filepath) { 'some_content' }
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'returns true' do
|
20
|
+
expect(test.verify).to be true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when file does not match the pattern' do
|
25
|
+
before do
|
26
|
+
allow(remote_fs).to receive(:file_read).with(filepath) { 'foo bar' }
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns false' do
|
30
|
+
expect(test.verify).to be false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when file does not exist' do
|
35
|
+
before do
|
36
|
+
allow(remote_fs).to receive(:file_read).with(filepath) { nil }
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns false' do
|
40
|
+
expect(test.verify).to be false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -7,7 +7,7 @@ module Producer::Core
|
|
7
7
|
let(:var_name) { 'SOME_VAR' }
|
8
8
|
let(:var_value) { 'SOME_VALUE' }
|
9
9
|
let(:remote_env) { { 'SOME_VAR' => 'SOME_VALUE' } }
|
10
|
-
subject(:has_env) {
|
10
|
+
subject(:has_env) { described_class.new(env, var_name) }
|
11
11
|
|
12
12
|
it_behaves_like 'test'
|
13
13
|
|
@@ -42,7 +42,7 @@ module Producer::Core
|
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'when var name and value are provided' do
|
45
|
-
subject(:has_env) {
|
45
|
+
subject(:has_env) { described_class.new(env, var_name, var_value) }
|
46
46
|
|
47
47
|
describe '#verify' do
|
48
48
|
context 'when remote environment var is defined' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: producer-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thibault Jouan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -155,12 +155,14 @@ files:
|
|
155
155
|
- features/task_condition.feature
|
156
156
|
- features/task_nested_tasks.feature
|
157
157
|
- features/task_target.feature
|
158
|
+
- features/task_template.feature
|
158
159
|
- features/test_dir.feature
|
159
160
|
- features/test_env.feature
|
160
161
|
- features/test_executable.feature
|
161
162
|
- features/test_file.feature
|
162
163
|
- features/test_file_contains.feature
|
163
164
|
- features/test_file_eq.feature
|
165
|
+
- features/test_file_match.feature
|
164
166
|
- features/test_shell_command_status.feature
|
165
167
|
- lib/producer/core.rb
|
166
168
|
- lib/producer/core/action.rb
|
@@ -188,6 +190,7 @@ files:
|
|
188
190
|
- lib/producer/core/tests/condition_test.rb
|
189
191
|
- lib/producer/core/tests/file_contains.rb
|
190
192
|
- lib/producer/core/tests/file_eq.rb
|
193
|
+
- lib/producer/core/tests/file_match.rb
|
191
194
|
- lib/producer/core/tests/has_dir.rb
|
192
195
|
- lib/producer/core/tests/has_env.rb
|
193
196
|
- lib/producer/core/tests/has_executable.rb
|
@@ -223,6 +226,7 @@ files:
|
|
223
226
|
- spec/producer/core/tests/condition_test_spec.rb
|
224
227
|
- spec/producer/core/tests/file_contains_spec.rb
|
225
228
|
- spec/producer/core/tests/file_eq_spec.rb
|
229
|
+
- spec/producer/core/tests/file_match_spec.rb
|
226
230
|
- spec/producer/core/tests/has_dir_spec.rb
|
227
231
|
- spec/producer/core/tests/has_env_spec.rb
|
228
232
|
- spec/producer/core/tests/has_executable_spec.rb
|
@@ -293,12 +297,14 @@ test_files:
|
|
293
297
|
- features/task_condition.feature
|
294
298
|
- features/task_nested_tasks.feature
|
295
299
|
- features/task_target.feature
|
300
|
+
- features/task_template.feature
|
296
301
|
- features/test_dir.feature
|
297
302
|
- features/test_env.feature
|
298
303
|
- features/test_executable.feature
|
299
304
|
- features/test_file.feature
|
300
305
|
- features/test_file_contains.feature
|
301
306
|
- features/test_file_eq.feature
|
307
|
+
- features/test_file_match.feature
|
302
308
|
- features/test_shell_command_status.feature
|
303
309
|
- spec/fixtures/recipes/empty.rb
|
304
310
|
- spec/fixtures/recipes/raise.rb
|
@@ -327,6 +333,7 @@ test_files:
|
|
327
333
|
- spec/producer/core/tests/condition_test_spec.rb
|
328
334
|
- spec/producer/core/tests/file_contains_spec.rb
|
329
335
|
- spec/producer/core/tests/file_eq_spec.rb
|
336
|
+
- spec/producer/core/tests/file_match_spec.rb
|
330
337
|
- spec/producer/core/tests/has_dir_spec.rb
|
331
338
|
- spec/producer/core/tests/has_env_spec.rb
|
332
339
|
- spec/producer/core/tests/has_executable_spec.rb
|