producer-core 0.3.8 → 0.3.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|