wright 0.2.0 → 0.3.0
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/NEWS.md +8 -0
- data/README.md +2 -0
- data/Rakefile +6 -0
- data/bin/wright +6 -0
- data/lib/wright/cli.rb +68 -0
- data/lib/wright/dsl.rb +1 -1
- data/lib/wright/provider/directory.rb +17 -12
- data/lib/wright/provider/file.rb +24 -17
- data/lib/wright/provider/group/darwin_directory_service.rb +1 -8
- data/lib/wright/provider/group/gnu_passwd.rb +0 -1
- data/lib/wright/provider/group.rb +6 -12
- data/lib/wright/provider/package/apt.rb +9 -21
- data/lib/wright/provider/package/homebrew.rb +5 -18
- data/lib/wright/provider/package.rb +22 -11
- data/lib/wright/provider/symlink.rb +17 -22
- data/lib/wright/provider/user/darwin_directory_service.rb +65 -0
- data/lib/wright/provider/user/gnu_passwd.rb +6 -7
- data/lib/wright/provider/user.rb +6 -12
- data/lib/wright/provider.rb +20 -2
- data/lib/wright/resource/directory.rb +19 -20
- data/lib/wright/resource/file.rb +19 -15
- data/lib/wright/resource/symlink.rb +1 -0
- data/lib/wright/resource/user.rb +2 -1
- data/lib/wright/resource.rb +1 -1
- data/lib/wright/util/file_owner.rb +61 -0
- data/lib/wright/util/file_permissions.rb +21 -30
- data/lib/wright/util/stolen_from_activesupport.rb +1 -1
- data/lib/wright/util/user.rb +48 -23
- data/lib/wright/util.rb +10 -6
- data/lib/wright/version.rb +1 -1
- data/lib/wright.rb +1 -0
- data/man/wright.1 +202 -0
- data/spec/cli/shebang.rb +3 -0
- data/spec/cli_spec.rb +64 -0
- data/spec/dsl_spec.rb +8 -3
- data/spec/provider/group/darwin_directory_service_spec.rb +3 -2
- data/spec/provider/package/apt/apt-cache_policy_abcde.stdout +7 -0
- data/spec/provider/package/apt/apt-cache_policy_htop.stdout +6 -0
- data/spec/provider/package/apt/apt-cache_policy_not-a-real-package.return +1 -0
- data/spec/provider/package/apt_spec.rb +17 -211
- data/spec/provider/package/homebrew_spec.rb +11 -164
- data/spec/provider/package_spec.rb +151 -7
- data/spec/provider/user/darwin_directory_service/dscl-delete-user.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-delete-user.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-delete-user.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-home.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-password.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stdout +0 -0
- data/spec/provider/user/darwin_directory_service_spec.rb +167 -0
- data/spec/provider/user/gnu_passwd_spec.rb +5 -5
- data/spec/resource/directory_spec.rb +17 -15
- data/spec/resource/file_spec.rb +17 -15
- data/spec/resource_spec.rb +1 -1
- data/spec/spec_helpers/test_coverage.rb +1 -1
- data/spec/util/file_owner_spec.rb +36 -0
- data/spec/util/file_permissions_spec.rb +6 -6
- data/spec/util/user_spec.rb +0 -17
- data/spec/util_spec.rb +64 -5
- metadata +91 -41
- data/spec/provider/package/apt/dpkg-query_-s_abcde.stdout +0 -23
- data/spec/provider/package/apt/dpkg-query_-s_htop.stdout +0 -19
- data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.return +0 -1
- data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stderr +0 -3
- data/spec/provider/package/apt/dpkg-query_-s_vlc.return +0 -1
- data/spec/provider/package/apt/dpkg-query_-s_vlc.stderr +0 -3
- /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.return → dseditgroup_-o_create_-i_2_newgroup.return} +0 -0
- /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stderr → dseditgroup_-o_create_-i_2_newgroup.stderr} +0 -0
- /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stdout → dseditgroup_-o_create_-i_2_newgroup.stdout} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_abcde.return → apt-cache_policy_abcde.return} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_abcde.stderr → apt-cache_policy_abcde.stderr} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_htop.return → apt-cache_policy_htop.return} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_htop.stderr → apt-cache_policy_htop.stderr} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_not-a-real-package.stdout → apt-cache_policy_not-a-real-package.stderr} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_vlc.stdout → apt-cache_policy_not-a-real-package.stdout} +0 -0
data/man/wright.1
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
'\" t
|
|
2
|
+
.\" Title: wright
|
|
3
|
+
.\" Author: [see the "AUTHOR" section]
|
|
4
|
+
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
|
|
5
|
+
.\" Date: 04/22/2015
|
|
6
|
+
.\" Manual: \ \&
|
|
7
|
+
.\" Source: \ \&
|
|
8
|
+
.\" Language: English
|
|
9
|
+
.\"
|
|
10
|
+
.TH "WRIGHT" "1" "04/22/2015" "\ \&" "\ \&"
|
|
11
|
+
.\" -----------------------------------------------------------------
|
|
12
|
+
.\" * Define some portability stuff
|
|
13
|
+
.\" -----------------------------------------------------------------
|
|
14
|
+
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
15
|
+
.\" http://bugs.debian.org/507673
|
|
16
|
+
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
|
17
|
+
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
18
|
+
.ie \n(.g .ds Aq \(aq
|
|
19
|
+
.el .ds Aq '
|
|
20
|
+
.\" -----------------------------------------------------------------
|
|
21
|
+
.\" * set default formatting
|
|
22
|
+
.\" -----------------------------------------------------------------
|
|
23
|
+
.\" disable hyphenation
|
|
24
|
+
.nh
|
|
25
|
+
.\" disable justification (adjust text to left margin only)
|
|
26
|
+
.ad l
|
|
27
|
+
.\" -----------------------------------------------------------------
|
|
28
|
+
.\" * MAIN CONTENT STARTS HERE *
|
|
29
|
+
.\" -----------------------------------------------------------------
|
|
30
|
+
.SH "NAME"
|
|
31
|
+
wright \- lightweight config management utility
|
|
32
|
+
.SH "SYNOPSIS"
|
|
33
|
+
.sp
|
|
34
|
+
\fBwright\fR [\fIOPTIONS\fR] \fIFILE\fR [\fIARGUMENT\fR\&...]
|
|
35
|
+
.sp
|
|
36
|
+
\fBwright\fR [\fIOPTIONS\fR] \fB\-e\fR \fICOMMAND\fR [\fIARGUMENT\fR\&...]
|
|
37
|
+
.SH "DESCRIPTION"
|
|
38
|
+
.sp
|
|
39
|
+
wright is a lightweight configuration management utility\&. It can be used to perform common sysadmin tasks such as installing packages, creating files, setting up groups and users and so on by running short Ruby scripts\&.
|
|
40
|
+
.sp
|
|
41
|
+
Although wright is typically used to run script files, it can also execute short code snippets passed on the command line\&. Another way to run wright scripts is to make your script executable and use wright as the interpreter by setting an appropriate "#!" line\&.
|
|
42
|
+
.SH "OPTIONS"
|
|
43
|
+
.PP
|
|
44
|
+
\fB\-e\fR \fICOMMAND\fR
|
|
45
|
+
.RS 4
|
|
46
|
+
Run
|
|
47
|
+
\fICOMMAND\fR
|
|
48
|
+
as a wright script\&. When multiple commands are passed, they are joined and run in sequence\&.
|
|
49
|
+
.RE
|
|
50
|
+
.PP
|
|
51
|
+
\fB\-v, \-\-verbose\fR
|
|
52
|
+
.RS 4
|
|
53
|
+
Print debugging information\&.
|
|
54
|
+
.RE
|
|
55
|
+
.PP
|
|
56
|
+
\fB\-q, \-\-quiet\fR
|
|
57
|
+
.RS 4
|
|
58
|
+
Suppress non\-error output\&.
|
|
59
|
+
.RE
|
|
60
|
+
.PP
|
|
61
|
+
\fB\-\-version\fR
|
|
62
|
+
.RS 4
|
|
63
|
+
Print wright version\&.
|
|
64
|
+
.RE
|
|
65
|
+
.SH "EXAMPLES"
|
|
66
|
+
.sp
|
|
67
|
+
Install tmux via the system package manager:
|
|
68
|
+
.sp
|
|
69
|
+
.if n \{\
|
|
70
|
+
.RS 4
|
|
71
|
+
.\}
|
|
72
|
+
.nf
|
|
73
|
+
wright \-e \*(Aqpackage "tmux"\*(Aq
|
|
74
|
+
.fi
|
|
75
|
+
.if n \{\
|
|
76
|
+
.RE
|
|
77
|
+
.\}
|
|
78
|
+
.sp
|
|
79
|
+
Create a system user named "foobard":
|
|
80
|
+
.sp
|
|
81
|
+
.if n \{\
|
|
82
|
+
.RS 4
|
|
83
|
+
.\}
|
|
84
|
+
.nf
|
|
85
|
+
wright \-e \*(Aquser("foobard") { |u| u\&.system = true }\*(Aq
|
|
86
|
+
.fi
|
|
87
|
+
.if n \{\
|
|
88
|
+
.RE
|
|
89
|
+
.\}
|
|
90
|
+
.sp
|
|
91
|
+
Create a system group named "foobard":
|
|
92
|
+
.sp
|
|
93
|
+
.if n \{\
|
|
94
|
+
.RS 4
|
|
95
|
+
.\}
|
|
96
|
+
.nf
|
|
97
|
+
wright \-e \*(Aqgroup("foobard") { |u| u\&.system = true }\*(Aq
|
|
98
|
+
.fi
|
|
99
|
+
.if n \{\
|
|
100
|
+
.RE
|
|
101
|
+
.\}
|
|
102
|
+
.sp
|
|
103
|
+
Create a file named \fI/etc/issue\fR containing the current wright version:
|
|
104
|
+
.sp
|
|
105
|
+
.if n \{\
|
|
106
|
+
.RS 4
|
|
107
|
+
.\}
|
|
108
|
+
.nf
|
|
109
|
+
wright \-e \*(Aqfile("/etc/issue") { |f| f\&.content = Wright::VERSION }\*(Aq
|
|
110
|
+
.fi
|
|
111
|
+
.if n \{\
|
|
112
|
+
.RE
|
|
113
|
+
.\}
|
|
114
|
+
.sp
|
|
115
|
+
Create a directory named \fI/tmp/foo/bar/baz\fR:
|
|
116
|
+
.sp
|
|
117
|
+
.if n \{\
|
|
118
|
+
.RS 4
|
|
119
|
+
.\}
|
|
120
|
+
.nf
|
|
121
|
+
wright \-e \*(Aqdirectory "/tmp/foo/bar/baz"\*(Aq
|
|
122
|
+
.fi
|
|
123
|
+
.if n \{\
|
|
124
|
+
.RE
|
|
125
|
+
.\}
|
|
126
|
+
.sp
|
|
127
|
+
Create a symlink from \fI\&.bash_profile\fR to \fI\&.profile\fR in the current user\(cqs home directory:
|
|
128
|
+
.sp
|
|
129
|
+
.if n \{\
|
|
130
|
+
.RS 4
|
|
131
|
+
.\}
|
|
132
|
+
.nf
|
|
133
|
+
wright \-e \*(Aqsymlink("~/\&.bash_profile") { |s| s\&.to = "~/\&.profile" }\*(Aq
|
|
134
|
+
.fi
|
|
135
|
+
.if n \{\
|
|
136
|
+
.RE
|
|
137
|
+
.\}
|
|
138
|
+
.sp
|
|
139
|
+
To install tmux and update its config file from a wright script, create the following file:
|
|
140
|
+
.sp
|
|
141
|
+
.if n \{\
|
|
142
|
+
.RS 4
|
|
143
|
+
.\}
|
|
144
|
+
.nf
|
|
145
|
+
package \*(Aqtmux\*(Aq
|
|
146
|
+
.fi
|
|
147
|
+
.if n \{\
|
|
148
|
+
.RE
|
|
149
|
+
.\}
|
|
150
|
+
.sp
|
|
151
|
+
.if n \{\
|
|
152
|
+
.RS 4
|
|
153
|
+
.\}
|
|
154
|
+
.nf
|
|
155
|
+
file \*(Aq/etc/tmux\&.conf\*(Aq do |f|
|
|
156
|
+
f\&.content = <<EOF
|
|
157
|
+
unbind C\-b
|
|
158
|
+
set \-g prefix C\-a
|
|
159
|
+
bind\-key a send\-prefix
|
|
160
|
+
EOF
|
|
161
|
+
f\&.mode = \*(Aq444\*(Aq
|
|
162
|
+
f\&.on_update = \-> { puts \*(AqUpdated /etc/tmux\&.conf\*(Aq }
|
|
163
|
+
end
|
|
164
|
+
.fi
|
|
165
|
+
.if n \{\
|
|
166
|
+
.RE
|
|
167
|
+
.\}
|
|
168
|
+
.sp
|
|
169
|
+
When saved as \fIinstall\-tmux\&.rb\fR, the script can then be run via
|
|
170
|
+
.sp
|
|
171
|
+
.if n \{\
|
|
172
|
+
.RS 4
|
|
173
|
+
.\}
|
|
174
|
+
.nf
|
|
175
|
+
wright \-\-quiet install\-tmux\&.rb
|
|
176
|
+
.fi
|
|
177
|
+
.if n \{\
|
|
178
|
+
.RE
|
|
179
|
+
.\}
|
|
180
|
+
.sp
|
|
181
|
+
wright can also be used as an interpreter\&. The example below creates and runs a standalone wright script:
|
|
182
|
+
.sp
|
|
183
|
+
.if n \{\
|
|
184
|
+
.RS 4
|
|
185
|
+
.\}
|
|
186
|
+
.nf
|
|
187
|
+
cat <<EOF > create\-dir\&.rb
|
|
188
|
+
#!/usr/bin/env wright
|
|
189
|
+
directory \*(Aq/tmp/foo/bar/baz\*(Aq
|
|
190
|
+
EOF
|
|
191
|
+
chmod +x create\-dir\&.rb
|
|
192
|
+
\&./create\-dir\&.rb
|
|
193
|
+
.fi
|
|
194
|
+
.if n \{\
|
|
195
|
+
.RE
|
|
196
|
+
.\}
|
|
197
|
+
.SH "AUTHOR"
|
|
198
|
+
.sp
|
|
199
|
+
Sebastian Boehm <sebastian@sometimesfood\&.org>
|
|
200
|
+
.SH "COPYING"
|
|
201
|
+
.sp
|
|
202
|
+
Copyright (C) 2012\-2015 Sebastian Boehm\&. Free use of this software is granted under the terms of the MIT License (also known as the "Expat License")\&.
|
data/spec/cli/shebang.rb
ADDED
data/spec/cli_spec.rb
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require_relative 'spec_helper'
|
|
2
|
+
|
|
3
|
+
require 'wright/cli'
|
|
4
|
+
require 'wright/version'
|
|
5
|
+
|
|
6
|
+
main = self
|
|
7
|
+
|
|
8
|
+
describe Wright::CLI do
|
|
9
|
+
before(:each) do
|
|
10
|
+
@cli = Wright::CLI.new(main)
|
|
11
|
+
@cli_dir = File.expand_path('../cli', __FILE__)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '#parse' do
|
|
15
|
+
before(:each) { Wright::CLI.send(:public, :parse) }
|
|
16
|
+
after(:each) { Wright::CLI.send(:private, :parse) }
|
|
17
|
+
|
|
18
|
+
it 'parses -e COMMAND' do
|
|
19
|
+
argv = %w(-e foo -e bar -- --baz)
|
|
20
|
+
@cli.parse(argv).must_equal %w(--baz)
|
|
21
|
+
@cli.send(:commands).must_equal %w(foo bar)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'parses --verbose' do
|
|
25
|
+
argv = ['--verbose']
|
|
26
|
+
@cli.parse(argv)
|
|
27
|
+
@cli.send(:log_level).must_equal Wright::Logger::DEBUG
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'parses --quiet' do
|
|
31
|
+
argv = ['--quiet']
|
|
32
|
+
@cli.parse(argv)
|
|
33
|
+
@cli.send(:log_level).must_equal Wright::Logger::ERROR
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe '#run' do
|
|
38
|
+
it 'parses --version' do
|
|
39
|
+
argv = ['--version']
|
|
40
|
+
expected = "wright version #{Wright::VERSION}\n"
|
|
41
|
+
|
|
42
|
+
-> { @cli.run(argv) }.must_output expected
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'loads files' do
|
|
46
|
+
argv = [File.join(@cli_dir, 'shebang.rb')]
|
|
47
|
+
expected = 'loaded shebang.rb'
|
|
48
|
+
-> { @cli.run(argv) }.must_output expected
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'evals commands' do
|
|
52
|
+
argv = ['-e print :foo']
|
|
53
|
+
-> { @cli.run(argv) }.must_output 'foo'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'evals commands from $stdin' do
|
|
57
|
+
argv = []
|
|
58
|
+
stdin_orig = $stdin
|
|
59
|
+
$stdin = StringIO.new("print :bar\ntrue")
|
|
60
|
+
-> { @cli.run(argv) }.must_output 'bar'
|
|
61
|
+
$stdin = stdin_orig
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
data/spec/dsl_spec.rb
CHANGED
|
@@ -22,9 +22,14 @@ describe Wright::DSL do
|
|
|
22
22
|
|
|
23
23
|
@wright_dsl.register_resource(resource_class)
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
resource_method_name = 'resource_klass'
|
|
26
|
+
resource_name = 'just a name'
|
|
27
|
+
@recipe.must_respond_to(resource_method_name)
|
|
28
|
+
|
|
29
|
+
e = -> { @recipe.send(resource_method_name) }.must_raise ArgumentError
|
|
30
|
+
e.message.must_equal 'wrong number of arguments (0 for 1)'
|
|
31
|
+
|
|
32
|
+
resource = @recipe.send(resource_method_name, resource_name)
|
|
28
33
|
resource.must_be_instance_of(resource_class)
|
|
29
34
|
end
|
|
30
35
|
|
|
@@ -6,7 +6,7 @@ require 'fakeetc'
|
|
|
6
6
|
describe Wright::Provider::Group::DarwinDirectoryService do
|
|
7
7
|
def dseditgroup(command, group_name, gid = nil, system = false)
|
|
8
8
|
if command != :delete
|
|
9
|
-
gid ||=
|
|
9
|
+
gid ||= @groups['daemon'][:gid] + 1 if system
|
|
10
10
|
options = gid.nil? ? [] : ['-i', gid.to_s]
|
|
11
11
|
['dseditgroup', '-o', command.to_s, *options, group_name]
|
|
12
12
|
else
|
|
@@ -45,7 +45,8 @@ describe Wright::Provider::Group::DarwinDirectoryService do
|
|
|
45
45
|
@remove_message_debug = lambda do |group|
|
|
46
46
|
"DEBUG: group already removed: '#{group}'\n"
|
|
47
47
|
end
|
|
48
|
-
@groups = { '
|
|
48
|
+
@groups = { 'daemon' => { gid: 1, mem: [] },
|
|
49
|
+
'foobar' => { gid: 42, mem: %w(foo bar) },
|
|
49
50
|
'bazqux' => { gid: 43, mem: %w(baz qux) } }
|
|
50
51
|
FakeEtc.add_groups(@groups)
|
|
51
52
|
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0
|
|
@@ -3,8 +3,8 @@ require_relative '../../spec_helper'
|
|
|
3
3
|
require 'wright/provider/package/apt'
|
|
4
4
|
|
|
5
5
|
describe Wright::Provider::Package::Apt do
|
|
6
|
-
def
|
|
7
|
-
['
|
|
6
|
+
def apt_cache(pkg_name)
|
|
7
|
+
['apt-cache', 'policy', pkg_name]
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def apt_get(action, pkg_name, pkg_version = nil)
|
|
@@ -21,20 +21,6 @@ describe Wright::Provider::Package::Apt do
|
|
|
21
21
|
apt_dir = File.join(File.dirname(__FILE__), 'apt')
|
|
22
22
|
env = { 'DEBIAN_FRONTEND' => 'noninteractive' }
|
|
23
23
|
@fake_capture3 = FakeCapture3.new(apt_dir, env)
|
|
24
|
-
@install_message = ->(pkg) { "INFO: install package: '#{pkg}'\n" }
|
|
25
|
-
@install_message_dry = lambda do |pkg|
|
|
26
|
-
"INFO: (would) install package: '#{pkg}'\n"
|
|
27
|
-
end
|
|
28
|
-
@install_message_debug = lambda do |pkg|
|
|
29
|
-
"DEBUG: package already installed: '#{pkg}'\n"
|
|
30
|
-
end
|
|
31
|
-
@remove_message = ->(pkg) { "INFO: remove package: '#{pkg}'\n" }
|
|
32
|
-
@remove_message_dry = lambda do |pkg|
|
|
33
|
-
"INFO: (would) remove package: '#{pkg}'\n"
|
|
34
|
-
end
|
|
35
|
-
@remove_message_debug = lambda do |pkg|
|
|
36
|
-
"DEBUG: package already removed: '#{pkg}'\n"
|
|
37
|
-
end
|
|
38
24
|
end
|
|
39
25
|
|
|
40
26
|
describe '#installed_versions' do
|
|
@@ -42,33 +28,21 @@ describe Wright::Provider::Package::Apt do
|
|
|
42
28
|
pkg_name = 'abcde'
|
|
43
29
|
pkg_versions = ['2.5.3-1']
|
|
44
30
|
pkg_provider = package_provider(pkg_name)
|
|
45
|
-
|
|
31
|
+
apt_cache_cmd = apt_cache(pkg_name)
|
|
46
32
|
|
|
47
|
-
@fake_capture3.expect(
|
|
33
|
+
@fake_capture3.expect(apt_cache_cmd)
|
|
48
34
|
@fake_capture3.stub do
|
|
49
35
|
pkg_provider.installed_versions.must_equal pkg_versions
|
|
50
36
|
end
|
|
51
37
|
end
|
|
52
38
|
|
|
53
39
|
it 'should return an empty array for missing packages' do
|
|
54
|
-
pkg_name = 'vlc'
|
|
55
|
-
pkg_versions = []
|
|
56
|
-
pkg_provider = package_provider(pkg_name)
|
|
57
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
58
|
-
|
|
59
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
60
|
-
@fake_capture3.stub do
|
|
61
|
-
pkg_provider.installed_versions.must_equal pkg_versions
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it 'should return an empty array for removed packages' do
|
|
66
40
|
pkg_name = 'htop'
|
|
67
41
|
pkg_versions = []
|
|
68
42
|
pkg_provider = package_provider(pkg_name)
|
|
69
|
-
|
|
43
|
+
apt_cache_cmd = apt_cache(pkg_name)
|
|
70
44
|
|
|
71
|
-
@fake_capture3.expect(
|
|
45
|
+
@fake_capture3.expect(apt_cache_cmd)
|
|
72
46
|
@fake_capture3.stub do
|
|
73
47
|
pkg_provider.installed_versions.must_equal pkg_versions
|
|
74
48
|
end
|
|
@@ -78,92 +52,47 @@ describe Wright::Provider::Package::Apt do
|
|
|
78
52
|
pkg_name = 'not-a-real-package'
|
|
79
53
|
pkg_versions = []
|
|
80
54
|
pkg_provider = package_provider(pkg_name)
|
|
81
|
-
|
|
55
|
+
apt_cache_cmd = apt_cache(pkg_name)
|
|
82
56
|
|
|
83
|
-
@fake_capture3.expect(
|
|
57
|
+
@fake_capture3.expect(apt_cache_cmd)
|
|
84
58
|
@fake_capture3.stub do
|
|
85
59
|
pkg_provider.installed_versions.must_equal pkg_versions
|
|
86
60
|
end
|
|
87
61
|
end
|
|
88
62
|
end
|
|
89
63
|
|
|
90
|
-
describe '#
|
|
91
|
-
it 'should install packages
|
|
64
|
+
describe '#install_package' do
|
|
65
|
+
it 'should install packages' do
|
|
92
66
|
pkg_name = 'htop'
|
|
93
67
|
pkg_provider = package_provider(pkg_name)
|
|
94
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
95
68
|
apt_cmd = apt_get(:install, pkg_name)
|
|
96
69
|
|
|
97
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
98
70
|
@fake_capture3.expect(apt_cmd)
|
|
99
71
|
@fake_capture3.stub do
|
|
100
|
-
|
|
101
|
-
reset_logger
|
|
102
|
-
pkg_provider.install
|
|
103
|
-
pkg_provider.updated?.must_equal true
|
|
104
|
-
end.must_output @install_message.call(pkg_name)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it 'should not try to install packages that are already installed' do
|
|
109
|
-
pkg_name = 'abcde'
|
|
110
|
-
pkg_provider = package_provider(pkg_name)
|
|
111
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
112
|
-
|
|
113
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
114
|
-
@fake_capture3.stub do
|
|
115
|
-
lambda do
|
|
116
|
-
reset_logger
|
|
117
|
-
pkg_provider.install
|
|
118
|
-
pkg_provider.updated?.must_equal false
|
|
119
|
-
end.must_output @install_message_debug.call(pkg_name)
|
|
72
|
+
pkg_provider.send(:install_package)
|
|
120
73
|
end
|
|
121
74
|
end
|
|
122
75
|
|
|
123
|
-
it 'should install package versions
|
|
76
|
+
it 'should install specific package versions' do
|
|
124
77
|
pkg_name = 'abcde'
|
|
125
78
|
pkg_version = '2.5.4-1'
|
|
126
79
|
pkg_provider = package_provider(pkg_name, pkg_version)
|
|
127
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
128
80
|
apt_cmd = apt_get(:install, pkg_name, pkg_version)
|
|
129
81
|
|
|
130
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
131
82
|
@fake_capture3.expect(apt_cmd)
|
|
132
83
|
@fake_capture3.stub do
|
|
133
|
-
|
|
134
|
-
reset_logger
|
|
135
|
-
pkg_provider.install
|
|
136
|
-
pkg_provider.updated?.must_equal true
|
|
137
|
-
end.must_output @install_message.call(pkg_name)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
it 'should not try to install package versions already installed' do
|
|
142
|
-
pkg_name = 'abcde'
|
|
143
|
-
pkg_version = '2.5.3-1'
|
|
144
|
-
pkg_provider = package_provider(pkg_name, pkg_version)
|
|
145
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
146
|
-
|
|
147
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
148
|
-
@fake_capture3.stub do
|
|
149
|
-
lambda do
|
|
150
|
-
reset_logger
|
|
151
|
-
pkg_provider.install
|
|
152
|
-
pkg_provider.updated?.must_equal false
|
|
153
|
-
end.must_output @install_message_debug.call(pkg_name)
|
|
84
|
+
pkg_provider.send(:install_package)
|
|
154
85
|
end
|
|
155
86
|
end
|
|
156
87
|
|
|
157
88
|
it 'should raise exceptions for unknown packages' do
|
|
158
89
|
pkg_name = 'not-a-real-package'
|
|
159
90
|
pkg_provider = package_provider(pkg_name)
|
|
160
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
161
91
|
apt_cmd = apt_get(:install, pkg_name)
|
|
162
92
|
|
|
163
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
164
93
|
@fake_capture3.expect(apt_cmd)
|
|
165
94
|
@fake_capture3.stub do
|
|
166
|
-
e = -> { pkg_provider.
|
|
95
|
+
e = -> { pkg_provider.send(:install_package) }.must_raise RuntimeError
|
|
167
96
|
wright_error = "cannot install package '#{pkg_name}'"
|
|
168
97
|
apt_error = "E: Unable to locate package #{pkg_name}"
|
|
169
98
|
e.message.must_equal %(#{wright_error}: "#{apt_error}")
|
|
@@ -171,138 +100,15 @@ describe Wright::Provider::Package::Apt do
|
|
|
171
100
|
end
|
|
172
101
|
end
|
|
173
102
|
|
|
174
|
-
describe '#
|
|
175
|
-
it 'should remove packages
|
|
103
|
+
describe '#remove_package' do
|
|
104
|
+
it 'should remove packages' do
|
|
176
105
|
pkg_name = 'abcde'
|
|
177
106
|
pkg_provider = package_provider(pkg_name)
|
|
178
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
179
107
|
apt_cmd = apt_get(:remove, pkg_name)
|
|
180
108
|
|
|
181
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
182
109
|
@fake_capture3.expect(apt_cmd)
|
|
183
110
|
@fake_capture3.stub do
|
|
184
|
-
|
|
185
|
-
reset_logger
|
|
186
|
-
pkg_provider.remove
|
|
187
|
-
pkg_provider.updated?.must_equal true
|
|
188
|
-
end.must_output @remove_message.call(pkg_name)
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
it 'should not try to remove packages that are already removed' do
|
|
193
|
-
pkg_name = 'htop'
|
|
194
|
-
pkg_provider = package_provider(pkg_name)
|
|
195
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
196
|
-
|
|
197
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
198
|
-
@fake_capture3.stub do
|
|
199
|
-
lambda do
|
|
200
|
-
reset_logger
|
|
201
|
-
pkg_provider.remove
|
|
202
|
-
pkg_provider.updated?.must_equal false
|
|
203
|
-
end.must_output @remove_message_debug.call(pkg_name)
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
it 'should remove package versions that are currently installed' do
|
|
208
|
-
pkg_name = 'abcde'
|
|
209
|
-
pkg_version = '2.5.3-1'
|
|
210
|
-
pkg_provider = package_provider(pkg_name, pkg_version)
|
|
211
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
212
|
-
apt_cmd = apt_get(:remove, pkg_name)
|
|
213
|
-
|
|
214
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
215
|
-
@fake_capture3.expect(apt_cmd)
|
|
216
|
-
@fake_capture3.stub do
|
|
217
|
-
lambda do
|
|
218
|
-
reset_logger
|
|
219
|
-
pkg_provider.remove
|
|
220
|
-
pkg_provider.updated?.must_equal true
|
|
221
|
-
end.must_output @remove_message.call(pkg_name)
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
it 'should not try to remove packages that are already removed' do
|
|
226
|
-
pkg_name = 'htop'
|
|
227
|
-
pkg_version = '2.5.4-1'
|
|
228
|
-
pkg_provider = package_provider(pkg_name, pkg_version)
|
|
229
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
230
|
-
|
|
231
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
232
|
-
@fake_capture3.stub do
|
|
233
|
-
lambda do
|
|
234
|
-
reset_logger
|
|
235
|
-
pkg_provider.remove
|
|
236
|
-
pkg_provider.updated?.must_equal false
|
|
237
|
-
end.must_output @remove_message_debug.call(pkg_name)
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
describe 'dry_run' do
|
|
243
|
-
it 'should not actually install packages' do
|
|
244
|
-
pkg_name = 'htop'
|
|
245
|
-
pkg_provider = package_provider(pkg_name)
|
|
246
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
247
|
-
|
|
248
|
-
Wright.dry_run do
|
|
249
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
250
|
-
@fake_capture3.stub do
|
|
251
|
-
lambda do
|
|
252
|
-
reset_logger
|
|
253
|
-
pkg_provider.install
|
|
254
|
-
end.must_output @install_message_dry.call(pkg_name)
|
|
255
|
-
end
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
it 'should not try to install packages that are already installed' do
|
|
260
|
-
pkg_name = 'abcde'
|
|
261
|
-
pkg_provider = package_provider(pkg_name)
|
|
262
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
263
|
-
|
|
264
|
-
Wright.dry_run do
|
|
265
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
266
|
-
@fake_capture3.stub do
|
|
267
|
-
lambda do
|
|
268
|
-
reset_logger
|
|
269
|
-
pkg_provider.install
|
|
270
|
-
pkg_provider.updated?.must_equal false
|
|
271
|
-
end.must_output @install_message_debug.call(pkg_name)
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
it 'should not actually remove packages' do
|
|
277
|
-
pkg_name = 'abcde'
|
|
278
|
-
pkg_provider = package_provider(pkg_name)
|
|
279
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
280
|
-
|
|
281
|
-
Wright.dry_run do
|
|
282
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
283
|
-
@fake_capture3.stub do
|
|
284
|
-
lambda do
|
|
285
|
-
reset_logger
|
|
286
|
-
pkg_provider.remove
|
|
287
|
-
end.must_output @remove_message_dry.call(pkg_name)
|
|
288
|
-
end
|
|
289
|
-
end
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
it 'should not try to remove packages that are already removed' do
|
|
293
|
-
pkg_name = 'htop'
|
|
294
|
-
pkg_provider = package_provider(pkg_name)
|
|
295
|
-
dpkg_cmd = dpkg_query(pkg_name)
|
|
296
|
-
|
|
297
|
-
Wright.dry_run do
|
|
298
|
-
@fake_capture3.expect(dpkg_cmd)
|
|
299
|
-
@fake_capture3.stub do
|
|
300
|
-
lambda do
|
|
301
|
-
reset_logger
|
|
302
|
-
pkg_provider.remove
|
|
303
|
-
pkg_provider.updated?.must_equal false
|
|
304
|
-
end.must_output @remove_message_debug.call(pkg_name)
|
|
305
|
-
end
|
|
111
|
+
pkg_provider.send(:remove_package)
|
|
306
112
|
end
|
|
307
113
|
end
|
|
308
114
|
end
|