wright 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +8 -0
  3. data/README.md +2 -0
  4. data/Rakefile +6 -0
  5. data/bin/wright +6 -0
  6. data/lib/wright/cli.rb +68 -0
  7. data/lib/wright/dsl.rb +1 -1
  8. data/lib/wright/provider/directory.rb +17 -12
  9. data/lib/wright/provider/file.rb +24 -17
  10. data/lib/wright/provider/group/darwin_directory_service.rb +1 -8
  11. data/lib/wright/provider/group/gnu_passwd.rb +0 -1
  12. data/lib/wright/provider/group.rb +6 -12
  13. data/lib/wright/provider/package/apt.rb +9 -21
  14. data/lib/wright/provider/package/homebrew.rb +5 -18
  15. data/lib/wright/provider/package.rb +22 -11
  16. data/lib/wright/provider/symlink.rb +17 -22
  17. data/lib/wright/provider/user/darwin_directory_service.rb +65 -0
  18. data/lib/wright/provider/user/gnu_passwd.rb +6 -7
  19. data/lib/wright/provider/user.rb +6 -12
  20. data/lib/wright/provider.rb +20 -2
  21. data/lib/wright/resource/directory.rb +19 -20
  22. data/lib/wright/resource/file.rb +19 -15
  23. data/lib/wright/resource/symlink.rb +1 -0
  24. data/lib/wright/resource/user.rb +2 -1
  25. data/lib/wright/resource.rb +1 -1
  26. data/lib/wright/util/file_owner.rb +61 -0
  27. data/lib/wright/util/file_permissions.rb +21 -30
  28. data/lib/wright/util/stolen_from_activesupport.rb +1 -1
  29. data/lib/wright/util/user.rb +48 -23
  30. data/lib/wright/util.rb +10 -6
  31. data/lib/wright/version.rb +1 -1
  32. data/lib/wright.rb +1 -0
  33. data/man/wright.1 +202 -0
  34. data/spec/cli/shebang.rb +3 -0
  35. data/spec/cli_spec.rb +64 -0
  36. data/spec/dsl_spec.rb +8 -3
  37. data/spec/provider/group/darwin_directory_service_spec.rb +3 -2
  38. data/spec/provider/package/apt/apt-cache_policy_abcde.stdout +7 -0
  39. data/spec/provider/package/apt/apt-cache_policy_htop.stdout +6 -0
  40. data/spec/provider/package/apt/apt-cache_policy_not-a-real-package.return +1 -0
  41. data/spec/provider/package/apt_spec.rb +17 -211
  42. data/spec/provider/package/homebrew_spec.rb +11 -164
  43. data/spec/provider/package_spec.rb +151 -7
  44. data/spec/provider/user/darwin_directory_service/dscl-delete-user.return +1 -0
  45. data/spec/provider/user/darwin_directory_service/dscl-delete-user.stderr +0 -0
  46. data/spec/provider/user/darwin_directory_service/dscl-delete-user.stdout +0 -0
  47. data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.return +1 -0
  48. data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stderr +0 -0
  49. data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stdout +0 -0
  50. data/spec/provider/user/darwin_directory_service/dscl-new-user-home.return +1 -0
  51. data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stderr +0 -0
  52. data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stdout +0 -0
  53. data/spec/provider/user/darwin_directory_service/dscl-new-user-password.return +1 -0
  54. data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stderr +0 -0
  55. data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stdout +0 -0
  56. data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.return +1 -0
  57. data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stderr +0 -0
  58. data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stdout +0 -0
  59. data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.return +1 -0
  60. data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stderr +0 -0
  61. data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stdout +0 -0
  62. data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.return +1 -0
  63. data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stderr +0 -0
  64. data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stdout +0 -0
  65. data/spec/provider/user/darwin_directory_service_spec.rb +167 -0
  66. data/spec/provider/user/gnu_passwd_spec.rb +5 -5
  67. data/spec/resource/directory_spec.rb +17 -15
  68. data/spec/resource/file_spec.rb +17 -15
  69. data/spec/resource_spec.rb +1 -1
  70. data/spec/spec_helpers/test_coverage.rb +1 -1
  71. data/spec/util/file_owner_spec.rb +36 -0
  72. data/spec/util/file_permissions_spec.rb +6 -6
  73. data/spec/util/user_spec.rb +0 -17
  74. data/spec/util_spec.rb +64 -5
  75. metadata +91 -41
  76. data/spec/provider/package/apt/dpkg-query_-s_abcde.stdout +0 -23
  77. data/spec/provider/package/apt/dpkg-query_-s_htop.stdout +0 -19
  78. data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.return +0 -1
  79. data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stderr +0 -3
  80. data/spec/provider/package/apt/dpkg-query_-s_vlc.return +0 -1
  81. data/spec/provider/package/apt/dpkg-query_-s_vlc.stderr +0 -3
  82. /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.return → dseditgroup_-o_create_-i_2_newgroup.return} +0 -0
  83. /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stderr → dseditgroup_-o_create_-i_2_newgroup.stderr} +0 -0
  84. /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stdout → dseditgroup_-o_create_-i_2_newgroup.stdout} +0 -0
  85. /data/spec/provider/package/apt/{dpkg-query_-s_abcde.return → apt-cache_policy_abcde.return} +0 -0
  86. /data/spec/provider/package/apt/{dpkg-query_-s_abcde.stderr → apt-cache_policy_abcde.stderr} +0 -0
  87. /data/spec/provider/package/apt/{dpkg-query_-s_htop.return → apt-cache_policy_htop.return} +0 -0
  88. /data/spec/provider/package/apt/{dpkg-query_-s_htop.stderr → apt-cache_policy_htop.stderr} +0 -0
  89. /data/spec/provider/package/apt/{dpkg-query_-s_not-a-real-package.stdout → apt-cache_policy_not-a-real-package.stderr} +0 -0
  90. /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")\&.
@@ -0,0 +1,3 @@
1
+ print 'loaded shebang.rb'
2
+ class WrightDSLMissing < StandardError; end
3
+ fail WrightDSLMissing unless respond_to? :package
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
- resource_name = 'resource_klass'
26
- @recipe.must_respond_to(resource_name)
27
- resource = @recipe.send(resource_name)
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 ||= 499 if system
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 = { 'foobar' => { gid: 42, mem: %w(foo bar) },
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,7 @@
1
+ abcde:
2
+ Installed: 2.5.3-1
3
+ Candidate: 2.5.3-1
4
+ Version table:
5
+ *** 2.5.3-1 0
6
+ 500 http://debian.inode.at/debian/ wheezy/main amd64 Packages
7
+ 100 /var/lib/dpkg/status
@@ -0,0 +1,6 @@
1
+ htop:
2
+ Installed: (none)
3
+ Candidate: 1.0.1-1
4
+ Version table:
5
+ 1.0.1-1 0
6
+ 500 http://debian.inode.at/debian/ wheezy/main amd64 Packages
@@ -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 dpkg_query(pkg_name)
7
- ['dpkg-query', '-s', pkg_name]
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
- dpkg_cmd = dpkg_query(pkg_name)
31
+ apt_cache_cmd = apt_cache(pkg_name)
46
32
 
47
- @fake_capture3.expect(dpkg_cmd)
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
- dpkg_cmd = dpkg_query(pkg_name)
43
+ apt_cache_cmd = apt_cache(pkg_name)
70
44
 
71
- @fake_capture3.expect(dpkg_cmd)
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
- dpkg_cmd = dpkg_query(pkg_name)
55
+ apt_cache_cmd = apt_cache(pkg_name)
82
56
 
83
- @fake_capture3.expect(dpkg_cmd)
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 '#install' do
91
- it 'should install packages that are not currently installed' do
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
- lambda do
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 that are not currently installed' do
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
- lambda do
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.install }.must_raise RuntimeError
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 '#remove' do
175
- it 'should remove packages that are currently installed' do
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
- lambda do
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