pups 1.1.1 → 1.2.1
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/.github/workflows/ci.yml +37 -4
- data/CHANGELOG +4 -0
- data/README.md +28 -0
- data/lib/pups/cli.rb +43 -19
- data/lib/pups/command.rb +4 -2
- data/lib/pups/config.rb +110 -37
- data/lib/pups/docker.rb +5 -8
- data/lib/pups/exec_command.rb +46 -31
- data/lib/pups/file_command.rb +5 -7
- data/lib/pups/merge_command.rb +17 -14
- data/lib/pups/replace_command.rb +8 -8
- data/lib/pups/runit.rb +2 -6
- data/lib/pups/version.rb +1 -1
- data/lib/pups.rb +12 -14
- data/test/cli_test.rb +63 -12
- data/test/config_test.rb +102 -32
- data/test/docker_test.rb +52 -16
- data/test/exec_command_test.rb +26 -33
- data/test/file_command_test.rb +8 -9
- data/test/merge_command_test.rb +18 -15
- data/test/replace_command_test.rb +30 -31
- data/test/test_helper.rb +4 -4
- metadata +6 -7
- data/.github/workflows/lint.yml +0 -27
data/test/exec_command_test.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "test_helper"
|
4
|
+
require "tempfile"
|
5
5
|
|
6
6
|
module Pups
|
7
|
-
class ExecCommandTest <
|
7
|
+
class ExecCommandTest < ::Minitest::Test
|
8
8
|
def from_str(str, params = {})
|
9
9
|
ExecCommand.from_str(str, params).commands
|
10
10
|
end
|
@@ -14,52 +14,49 @@ module Pups
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_simple_str_command
|
17
|
-
assert_equal([
|
18
|
-
from_str('do_something'))
|
17
|
+
assert_equal(["do_something"], from_str("do_something"))
|
19
18
|
end
|
20
19
|
|
21
20
|
def test_simple_str_command_with_param
|
22
|
-
assert_equal(
|
23
|
-
|
21
|
+
assert_equal(
|
22
|
+
["hello world"],
|
23
|
+
from_str("hello $bob", { "bob" => "world" })
|
24
|
+
)
|
24
25
|
end
|
25
26
|
|
26
27
|
def test_nested_command
|
27
|
-
assert_equal([
|
28
|
-
from_hash('cmd' => 'first'))
|
28
|
+
assert_equal(["first"], from_hash("cmd" => "first"))
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_multi_commands
|
32
|
-
assert_equal(%w[first second],
|
33
|
-
from_hash('cmd' => %w[first second]))
|
32
|
+
assert_equal(%w[first second], from_hash("cmd" => %w[first second]))
|
34
33
|
end
|
35
34
|
|
36
35
|
def test_multi_commands_with_home
|
37
|
-
assert_equal(
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
assert_equal(
|
37
|
+
["cd /home/sam && first", "cd /home/sam && second"],
|
38
|
+
from_hash("cmd" => %w[first second], "cd" => "/home/sam")
|
39
|
+
)
|
41
40
|
end
|
42
41
|
|
43
42
|
def test_exec_works
|
44
|
-
ExecCommand.from_str(
|
43
|
+
ExecCommand.from_str("ls", {}).run
|
45
44
|
end
|
46
45
|
|
47
46
|
def test_fails_for_bad_command
|
48
|
-
assert_raises(Errno::ENOENT)
|
49
|
-
ExecCommand.from_str('boom', {}).run
|
50
|
-
end
|
47
|
+
assert_raises(Errno::ENOENT) { ExecCommand.from_str("boom", {}).run }
|
51
48
|
end
|
52
49
|
|
53
50
|
def test_backgroud_task_do_not_fail
|
54
51
|
cmd = ExecCommand.new({})
|
55
52
|
cmd.background = true
|
56
|
-
cmd.add(
|
53
|
+
cmd.add("sleep 10 && exit 1")
|
57
54
|
cmd.run
|
58
55
|
end
|
59
56
|
|
60
57
|
def test_raise_on_fail
|
61
58
|
cmd = ExecCommand.new({})
|
62
|
-
cmd.add(
|
59
|
+
cmd.add("chgrp -a")
|
63
60
|
cmd.raise_on_fail = false
|
64
61
|
cmd.run
|
65
62
|
end
|
@@ -67,29 +64,27 @@ module Pups
|
|
67
64
|
def test_stdin
|
68
65
|
`touch test_file`
|
69
66
|
cmd = ExecCommand.new({})
|
70
|
-
cmd.add(
|
71
|
-
cmd.stdin =
|
67
|
+
cmd.add("read test ; echo $test > test_file")
|
68
|
+
cmd.stdin = "hello"
|
72
69
|
cmd.run
|
73
70
|
|
74
|
-
assert_equal("hello\n", File.read(
|
71
|
+
assert_equal("hello\n", File.read("test_file"))
|
75
72
|
ensure
|
76
|
-
File.delete(
|
73
|
+
File.delete("test_file")
|
77
74
|
end
|
78
75
|
|
79
76
|
def test_fails_for_non_zero_exit
|
80
77
|
assert_raises(Pups::ExecError) do
|
81
|
-
ExecCommand.from_str(
|
78
|
+
ExecCommand.from_str("chgrp -a", {}).run
|
82
79
|
end
|
83
80
|
end
|
84
81
|
|
85
82
|
def test_can_terminate_async
|
86
83
|
cmd = ExecCommand.new({})
|
87
84
|
cmd.background = true
|
88
|
-
pid = cmd.spawn(
|
85
|
+
pid = cmd.spawn("sleep 10 && exit 1")
|
89
86
|
ExecCommand.terminate_async
|
90
|
-
assert_raises(Errno::ECHILD)
|
91
|
-
Process.waitpid(pid, Process::WNOHANG)
|
92
|
-
end
|
87
|
+
assert_raises(Errno::ECHILD) { Process.waitpid(pid, Process::WNOHANG) }
|
93
88
|
end
|
94
89
|
|
95
90
|
def test_can_terminate_rogues
|
@@ -101,9 +96,7 @@ module Pups
|
|
101
96
|
|
102
97
|
ExecCommand.terminate_async(wait: 0.1)
|
103
98
|
|
104
|
-
assert_raises(Errno::ECHILD)
|
105
|
-
Process.waitpid(pid, Process::WNOHANG)
|
106
|
-
end
|
99
|
+
assert_raises(Errno::ECHILD) { Process.waitpid(pid, Process::WNOHANG) }
|
107
100
|
end
|
108
101
|
end
|
109
102
|
end
|
data/test/file_command_test.rb
CHANGED
@@ -1,23 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "test_helper"
|
4
|
+
require "tempfile"
|
5
5
|
|
6
6
|
module Pups
|
7
|
-
class FileCommandTest <
|
7
|
+
class FileCommandTest < ::Minitest::Test
|
8
8
|
def test_simple_file_creation
|
9
|
-
tmp = Tempfile.new(
|
10
|
-
tmp.write(
|
9
|
+
tmp = Tempfile.new("test")
|
10
|
+
tmp.write("x")
|
11
11
|
tmp.close
|
12
12
|
|
13
13
|
cmd = FileCommand.new
|
14
14
|
cmd.path = tmp.path
|
15
|
-
cmd.contents =
|
16
|
-
cmd.params = {
|
15
|
+
cmd.contents = "hello $world"
|
16
|
+
cmd.params = { "world" => "world" }
|
17
17
|
cmd.run
|
18
18
|
|
19
|
-
assert_equal(
|
20
|
-
File.read(tmp.path))
|
19
|
+
assert_equal("hello world", File.read(tmp.path))
|
21
20
|
ensure
|
22
21
|
tmp.close
|
23
22
|
tmp.unlink
|
data/test/merge_command_test.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "test_helper"
|
4
|
+
require "tempfile"
|
5
5
|
|
6
6
|
module Pups
|
7
|
-
class MergeCommandTest <
|
7
|
+
class MergeCommandTest < ::Minitest::Test
|
8
8
|
def test_deep_merge_arrays
|
9
|
-
a = { a: { a: [
|
10
|
-
b = { a: { a: [
|
9
|
+
a = { a: { a: ["hi", 1] } }
|
10
|
+
b = { a: { a: ["hi", 2] } }
|
11
11
|
c = { a: {} }
|
12
12
|
|
13
13
|
d = Pups::MergeCommand.deep_merge(a, b, :merge_arrays)
|
14
14
|
d = Pups::MergeCommand.deep_merge(d, c, :merge_arrays)
|
15
15
|
|
16
|
-
assert_equal([
|
16
|
+
assert_equal(["hi", 1, "hi", 2], d[:a][:a])
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_merges
|
@@ -23,7 +23,7 @@ module Pups
|
|
23
23
|
password: "xyz"
|
24
24
|
YAML
|
25
25
|
|
26
|
-
f = Tempfile.new(
|
26
|
+
f = Tempfile.new("test")
|
27
27
|
f.write source
|
28
28
|
f.close
|
29
29
|
|
@@ -32,24 +32,27 @@ module Pups
|
|
32
32
|
name: "bob2"
|
33
33
|
YAML
|
34
34
|
|
35
|
-
MergeCommand.from_str(
|
35
|
+
MergeCommand.from_str(
|
36
|
+
"#{f.path} $yaml",
|
37
|
+
{ "yaml" => YAML.safe_load(merge) }
|
38
|
+
).run
|
36
39
|
|
37
40
|
changed = YAML.load_file(f.path)
|
38
41
|
|
39
|
-
assert_equal(
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
assert_equal(
|
43
|
+
{ "user" => { "name" => "bob2", "password" => "xyz" } },
|
44
|
+
changed
|
45
|
+
)
|
43
46
|
|
44
47
|
def test_deep_merge_nil
|
45
|
-
a = { param: { venison:
|
48
|
+
a = { param: { venison: "yes please" } }
|
46
49
|
b = { param: nil }
|
47
50
|
|
48
51
|
r1 = Pups::MergeCommand.deep_merge(a, b)
|
49
52
|
r2 = Pups::MergeCommand.deep_merge(b, a)
|
50
53
|
|
51
|
-
assert_equal({ venison:
|
52
|
-
assert_equal({ venison:
|
54
|
+
assert_equal({ venison: "yes please" }, r1[:param])
|
55
|
+
assert_equal({ venison: "yes please" }, r2[:param])
|
53
56
|
end
|
54
57
|
ensure
|
55
58
|
f.unlink
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "test_helper"
|
4
|
+
require "tempfile"
|
5
5
|
|
6
6
|
module Pups
|
7
|
-
class ReplaceCommandTest <
|
7
|
+
class ReplaceCommandTest < ::Minitest::Test
|
8
8
|
def test_simple
|
9
9
|
command = ReplaceCommand.new({})
|
10
|
-
command.text =
|
10
|
+
command.text = "hello world"
|
11
11
|
command.from = /he[^o]+o/
|
12
|
-
command.to =
|
12
|
+
command.to = "world"
|
13
13
|
|
14
|
-
assert_equal(
|
14
|
+
assert_equal("world world", command.replaced_text)
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_reverse
|
@@ -21,20 +21,23 @@ module Pups
|
|
21
21
|
1 one thousand 1
|
22
22
|
SCR
|
23
23
|
|
24
|
-
f = Tempfile.new(
|
24
|
+
f = Tempfile.new("test")
|
25
25
|
f.write source
|
26
26
|
f.close
|
27
27
|
|
28
28
|
hash = {
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
"filename" => f.path,
|
30
|
+
"from" => "/one t.*d/",
|
31
|
+
"to" => "hello world",
|
32
|
+
"direction" => "reverse"
|
33
33
|
}
|
34
34
|
|
35
35
|
command = ReplaceCommand.from_hash(hash, {})
|
36
36
|
|
37
|
-
assert_equal(
|
37
|
+
assert_equal(
|
38
|
+
"1 one thousand 1\n1 one thousand 1\n1 hello world 1\n",
|
39
|
+
command.replaced_text
|
40
|
+
)
|
38
41
|
ensure
|
39
42
|
f.unlink
|
40
43
|
end
|
@@ -46,15 +49,15 @@ module Pups
|
|
46
49
|
one
|
47
50
|
SCR
|
48
51
|
|
49
|
-
f = Tempfile.new(
|
52
|
+
f = Tempfile.new("test")
|
50
53
|
f.write source
|
51
54
|
f.close
|
52
55
|
|
53
56
|
hash = {
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
57
|
+
"filename" => f.path,
|
58
|
+
"from" => "/one/",
|
59
|
+
"to" => "two",
|
60
|
+
"global" => "true"
|
58
61
|
}
|
59
62
|
|
60
63
|
command = ReplaceCommand.from_hash(hash, {})
|
@@ -65,20 +68,16 @@ module Pups
|
|
65
68
|
end
|
66
69
|
|
67
70
|
def test_replace_with_env
|
68
|
-
source =
|
71
|
+
source = "123"
|
69
72
|
|
70
|
-
f = Tempfile.new(
|
73
|
+
f = Tempfile.new("test")
|
71
74
|
f.write source
|
72
75
|
f.close
|
73
76
|
|
74
|
-
hash = {
|
75
|
-
'filename' => f.path,
|
76
|
-
'from' => '123',
|
77
|
-
'to' => 'hello $hellos'
|
78
|
-
}
|
77
|
+
hash = { "filename" => f.path, "from" => "123", "to" => "hello $hellos" }
|
79
78
|
|
80
|
-
command = ReplaceCommand.from_hash(hash, {
|
81
|
-
assert_equal(
|
79
|
+
command = ReplaceCommand.from_hash(hash, { "hello" => "world" })
|
80
|
+
assert_equal("hello worlds", command.replaced_text)
|
82
81
|
ensure
|
83
82
|
f.unlink
|
84
83
|
end
|
@@ -90,19 +89,19 @@ module Pups
|
|
90
89
|
}
|
91
90
|
SCR
|
92
91
|
|
93
|
-
f = Tempfile.new(
|
92
|
+
f = Tempfile.new("test")
|
94
93
|
f.write source
|
95
94
|
f.close
|
96
95
|
|
97
96
|
hash = {
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
"filename" => f.path,
|
98
|
+
"from" => "/this[^\}]+\}/m",
|
99
|
+
"to" => "hello world"
|
101
100
|
}
|
102
101
|
|
103
102
|
command = ReplaceCommand.from_hash(hash, {})
|
104
103
|
|
105
|
-
assert_equal(
|
104
|
+
assert_equal("hello world", command.replaced_text.strip)
|
106
105
|
ensure
|
107
106
|
f.unlink
|
108
107
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pups
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -145,7 +145,6 @@ extensions: []
|
|
145
145
|
extra_rdoc_files: []
|
146
146
|
files:
|
147
147
|
- ".github/workflows/ci.yml"
|
148
|
-
- ".github/workflows/lint.yml"
|
149
148
|
- ".gitignore"
|
150
149
|
- ".rubocop.yml"
|
151
150
|
- CHANGELOG
|
@@ -179,7 +178,7 @@ homepage: ''
|
|
179
178
|
licenses:
|
180
179
|
- MIT
|
181
180
|
metadata: {}
|
182
|
-
post_install_message:
|
181
|
+
post_install_message:
|
183
182
|
rdoc_options: []
|
184
183
|
require_paths:
|
185
184
|
- lib
|
@@ -194,8 +193,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
193
|
- !ruby/object:Gem::Version
|
195
194
|
version: '0'
|
196
195
|
requirements: []
|
197
|
-
rubygems_version: 3.1.
|
198
|
-
signing_key:
|
196
|
+
rubygems_version: 3.1.6
|
197
|
+
signing_key:
|
199
198
|
specification_version: 4
|
200
199
|
summary: Toolkit for orchestrating a composed docker image
|
201
200
|
test_files:
|
data/.github/workflows/lint.yml
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
name: Lint
|
2
|
-
|
3
|
-
on:
|
4
|
-
push:
|
5
|
-
branches:
|
6
|
-
- master
|
7
|
-
pull_request: {}
|
8
|
-
|
9
|
-
jobs:
|
10
|
-
lint:
|
11
|
-
name: "pups lint"
|
12
|
-
runs-on: ${{ matrix.os }}
|
13
|
-
timeout-minutes: 5
|
14
|
-
|
15
|
-
strategy:
|
16
|
-
fail-fast: true
|
17
|
-
matrix:
|
18
|
-
os: [ubuntu-latest]
|
19
|
-
ruby: ["2.7"]
|
20
|
-
|
21
|
-
steps:
|
22
|
-
- uses: actions/checkout@v2
|
23
|
-
- uses: ruby/setup-ruby@v1
|
24
|
-
with:
|
25
|
-
ruby-version: ${{ matrix.ruby }}
|
26
|
-
bundler-cache: true
|
27
|
-
- run: bundle exec rubocop
|