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.
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