sprinkle 0.7.4 → 0.7.5

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 (56) hide show
  1. data/CHANGELOG.md +18 -14
  2. data/Gemfile.lock +11 -11
  3. data/lib/sprinkle.rb +19 -9
  4. data/lib/sprinkle/actors/capistrano.rb +2 -1
  5. data/lib/sprinkle/actors/dummy.rb +3 -3
  6. data/lib/sprinkle/actors/local.rb +7 -9
  7. data/lib/sprinkle/actors/ssh.rb +5 -5
  8. data/lib/sprinkle/deployment.rb +2 -1
  9. data/lib/sprinkle/extensions/sudo.rb +8 -4
  10. data/lib/sprinkle/installers/installer.rb +48 -37
  11. data/lib/sprinkle/installers/npm.rb +31 -30
  12. data/lib/sprinkle/installers/source.rb +6 -6
  13. data/lib/sprinkle/installers/user.rb +7 -6
  14. data/lib/sprinkle/package.rb +55 -51
  15. data/lib/sprinkle/package/chooser.rb +5 -4
  16. data/lib/sprinkle/package/rendering.rb +2 -2
  17. data/lib/sprinkle/policy.rb +13 -13
  18. data/lib/sprinkle/script.rb +5 -1
  19. data/lib/sprinkle/verify.rb +1 -0
  20. data/lib/sprinkle/version.rb +1 -1
  21. data/spec/spec_helper.rb +13 -7
  22. data/spec/sprinkle/actors/capistrano_spec.rb +18 -18
  23. data/spec/sprinkle/actors/local_spec.rb +3 -3
  24. data/spec/sprinkle/deployment_spec.rb +3 -3
  25. data/spec/sprinkle/installers/apt_spec.rb +1 -1
  26. data/spec/sprinkle/installers/binary_spec.rb +1 -1
  27. data/spec/sprinkle/installers/brew_spec.rb +1 -1
  28. data/spec/sprinkle/installers/bsd_port_spec.rb +1 -1
  29. data/spec/sprinkle/installers/file_spec.rb +9 -9
  30. data/spec/sprinkle/installers/freebsd_pkg_spec.rb +1 -1
  31. data/spec/sprinkle/installers/freebsd_portinstall_spec.rb +1 -1
  32. data/spec/sprinkle/installers/gem_spec.rb +1 -1
  33. data/spec/sprinkle/installers/installer_spec.rb +62 -25
  34. data/spec/sprinkle/installers/mac_port_spec.rb +1 -1
  35. data/spec/sprinkle/installers/npm_spec.rb +1 -1
  36. data/spec/sprinkle/installers/openbsd_pkg_spec.rb +1 -1
  37. data/spec/sprinkle/installers/opensolaris_pkg_spec.rb +1 -1
  38. data/spec/sprinkle/installers/pear_spec.rb +1 -1
  39. data/spec/sprinkle/installers/push_text_spec.rb +12 -12
  40. data/spec/sprinkle/installers/rake_spec.rb +1 -1
  41. data/spec/sprinkle/installers/replace_text_spec.rb +10 -10
  42. data/spec/sprinkle/installers/rpm_spec.rb +1 -1
  43. data/spec/sprinkle/installers/runner_spec.rb +9 -9
  44. data/spec/sprinkle/installers/smart_spec.rb +1 -1
  45. data/spec/sprinkle/installers/source_spec.rb +22 -27
  46. data/spec/sprinkle/installers/thor_spec.rb +1 -1
  47. data/spec/sprinkle/installers/transfer_spec.rb +35 -35
  48. data/spec/sprinkle/installers/user_spec.rb +13 -7
  49. data/spec/sprinkle/installers/yum_spec.rb +1 -1
  50. data/spec/sprinkle/installers/zypper_spec.rb +1 -1
  51. data/spec/sprinkle/package/package_repository_spec.rb +7 -7
  52. data/spec/sprinkle/package_spec.rb +58 -58
  53. data/spec/sprinkle/policy_spec.rb +20 -20
  54. data/spec/sprinkle/script_spec.rb +1 -1
  55. data/spec/sprinkle/verify_spec.rb +2 -2
  56. metadata +2 -2
@@ -1,41 +1,42 @@
1
1
  module Sprinkle
2
- module Installers
3
- # = Npm package Installed
4
- #
5
- # Installs an npm module
6
- #
7
- # == Example Usage
8
- #
9
- # package :magic_beans do
10
- # npm 'grunt'
11
- # end
12
- #
13
- # verify { has_npm 'grunt' }
14
- class Npm < Installer
2
+ module Installers
3
+ # = Npm package Installed
4
+ #
5
+ # Installs an npm module
6
+ #
7
+ # == Example Usage
8
+ #
9
+ # package :magic_beans do
10
+ # npm 'grunt'
11
+ # end
12
+ #
13
+ # verify { has_npm 'grunt' }
14
+ class Npm < Installer
15
15
 
16
- attr_accessor :package_name
16
+ attr_accessor :package_name
17
17
 
18
- api do
19
- def npm(package, &block)
20
- install Npm.new(self, package, &block)
21
- end
18
+ api do
19
+ def npm(package, &block)
20
+ install Npm.new(self, package, &block)
22
21
  end
22
+ end
23
23
 
24
- verify_api do
25
- def has_npm(package)
26
- @commands << "npm --global list | grep \"#{package}@\""
27
- end
24
+ verify_api do
25
+ def has_npm(package)
26
+ @commands << "npm --global list | grep \"#{package}@\""
28
27
  end
28
+ end
29
29
 
30
- def initialize(parent, package_name, &block) #:nodoc:
31
- super parent, &block
32
- @package_name = package_name
33
- end
30
+ def initialize(parent, package_name, &block) #:nodoc:
31
+ super parent, &block
32
+ @package_name = package_name
33
+ end
34
+
35
+ protected
34
36
 
35
- protected
36
- def install_commands #:nodoc:
37
- "npm install --global #{@package_name}"
38
- end
37
+ def install_commands #:nodoc:
38
+ "npm install --global #{@package_name}"
39
+ end
39
40
 
40
41
  end
41
42
  end
@@ -88,7 +88,7 @@ module Sprinkle
88
88
 
89
89
  class Source < Installer
90
90
  attr_accessor :source #:nodoc:
91
-
91
+
92
92
  api do
93
93
  def source(source, options = {}, &block)
94
94
  recommends :build_essential # Ubuntu/Debian
@@ -171,15 +171,15 @@ module Sprinkle
171
171
  end
172
172
 
173
173
  protected
174
-
174
+
175
175
  def with_log(cmd, stage)
176
176
  "#{cmd} > #{@package.name}-#{stage}.log 2>&1"
177
177
  end
178
-
178
+
179
179
  def in_build_dir(cmd)
180
180
  "bash -c 'cd #{build_dir} && #{cmd}'"
181
181
  end
182
-
182
+
183
183
  def pre_commands(stage) #:nodoc:
184
184
  dress @pre[stage] || [], :pre, stage
185
185
  end
@@ -187,7 +187,7 @@ module Sprinkle
187
187
  def post_commands(stage) #:nodoc:
188
188
  dress @post[stage] || [], :post, stage
189
189
  end
190
-
190
+
191
191
 
192
192
  # dress is overriden from the base Sprinkle::Installers::Installer class so that the command changes
193
193
  # directory to the build directory first. Also, the result of the command is logged.
@@ -195,7 +195,7 @@ module Sprinkle
195
195
  chdir = "cd #{build_dir} && "
196
196
  chdir = "" if [:prepare, :download].include?(stage)
197
197
  chdir = "" if stage == :extract and pre_or_post == :pre
198
- commands.collect { |command| "bash -c '#{chdir}#{command} >> #{@package.name}-#{stage}.log 2>&1'" }
198
+ flatten(commands).collect { |command| "bash -c '#{chdir}#{command} >> #{@package.name}-#{stage}.log 2>&1'" }
199
199
  end
200
200
 
201
201
  private
@@ -1,7 +1,7 @@
1
1
  module Sprinkle
2
2
  module Installers
3
3
  # The user installer add users. You may pass :flags as an option.
4
- #
4
+ #
5
5
  # == Example Usage
6
6
  #
7
7
  # package :users do
@@ -12,13 +12,13 @@ module Sprinkle
12
12
  # end
13
13
  # end
14
14
  class User < Installer
15
-
15
+
16
16
  api do
17
17
  def add_user(username, options={}, &block)
18
18
  install User.new(self, username, options, &block)
19
19
  end
20
20
  end
21
-
21
+
22
22
  verify_api do
23
23
  def has_user(user, opts = {})
24
24
  if opts[:in_group]
@@ -34,14 +34,15 @@ module Sprinkle
34
34
  @username = username
35
35
  end
36
36
 
37
- protected
38
-
37
+ protected
38
+
39
39
  def install_commands #:nodoc:
40
40
  noninteractive = " --gecos ,,,"
41
41
  flags = @options[:flags] || ""
42
42
  flags << noninteractive unless flags =~ /--gecos/
43
- "adduser #{flags} #{@username}"
43
+ "#{sudo_cmd}adduser #{flags.strip} #{@username}"
44
44
  end
45
+
45
46
  end
46
47
  end
47
48
  end
@@ -20,7 +20,7 @@ module Sprinkle
20
20
  # 'ruby' being availble. Pretty simple, right?
21
21
  #
22
22
  # <b>Note:</b> Defining a package does not INSTALL it. To install a
23
- # package, you must require it in a Sprinkle::Policy block.
23
+ # package, you must require it in a Sprinkle::Policy block.
24
24
  #
25
25
  # == Pre-Requirements
26
26
  #
@@ -53,11 +53,11 @@ module Sprinkle
53
53
  #
54
54
  # == Verifications
55
55
  #
56
- # Most of the time its important to know whether the software you're
56
+ # Most of the time its important to know whether the software you're
57
57
  # attempting to install was installed successfully or not. For this,
58
58
  # Sprinkle provides verifications. Verifications are one or more blocks
59
59
  # which define rules with which Sprinkle can check if it installed
60
- # the package successfully. If these verification blocks fail, then
60
+ # the package successfully. If these verification blocks fail, then
61
61
  # Sprinkle will gracefully stop the entire process. An example below:
62
62
  #
63
63
  # package :rubygems do
@@ -89,9 +89,9 @@ module Sprinkle
89
89
  #
90
90
  # The :provides option allows you to reference this package either by :sqlite3
91
91
  # or by :database. But whereas the package name is unique, multiple packages may
92
- # share the same provision. If this is the case, when running Sprinkle, the
92
+ # share the same provision. If this is the case, when running Sprinkle, the
93
93
  # script will ask you which provision you want to install. At this time, you
94
- # can only install one.
94
+ # can only install one.
95
95
  #
96
96
  # == Meta-Packages
97
97
  #
@@ -107,7 +107,7 @@ module Sprinkle
107
107
  # FIXME: Should probably document recommendations.
108
108
  #++
109
109
  module Package
110
-
110
+
111
111
  PACKAGES = PackageRepository.new
112
112
 
113
113
  def package(name, metadata = {}, &block)
@@ -117,16 +117,16 @@ module Sprinkle
117
117
  end
118
118
 
119
119
  class Package #:nodoc:
120
- attr_accessor :name, :provides, :installers, :verifications
120
+ attr_accessor :name, :provides, :verifications
121
121
  attr_internal :args, :opts
122
122
  cattr_reader :installer_methods
123
123
  @@installer_methods = []
124
-
124
+
125
125
  include Rendering
126
-
126
+
127
127
  def self.add_api(&block)
128
128
  before = self.instance_methods
129
- self.class_eval &block
129
+ self.class_eval(&block)
130
130
  added = self.instance_methods - before
131
131
  @@installer_methods += added.map(&:to_sym)
132
132
  end
@@ -141,33 +141,35 @@ module Sprinkle
141
141
  @recommends = []
142
142
  @optional = []
143
143
  @verifications = []
144
- @installers = []
144
+ @install_queues ||= [[]]
145
145
  @block = block
146
+ @use_sudo = false
147
+ @version = nil
146
148
  # this should probably not be done twice
147
- self.instance_eval &block
149
+ self.instance_eval(&block)
148
150
  end
149
-
151
+
150
152
  def description(s=nil)
151
153
  s ? @description = s : @description
152
154
  end
153
-
155
+
154
156
  def version(s=nil)
155
157
  s ? @version = s : @version
156
158
  end
157
-
159
+
158
160
  def instance(*args)
159
161
  p=Package.new(name, @metadata) {}
160
162
  p.opts = defaults.merge(args.extract_options!)
161
163
  p.args = args
162
164
  p.instance_variable_set("@block", @block)
163
- p.instance_eval &@block
165
+ p.instance_eval(&@block)
164
166
  p
165
167
  end
166
-
168
+
167
169
  def sudo?
168
170
  @use_sudo
169
171
  end
170
-
172
+
171
173
  def use_sudo(flag=true)
172
174
  @use_sudo = flag
173
175
  end
@@ -179,69 +181,69 @@ module Sprinkle
179
181
  def args
180
182
  @_args ||= []
181
183
  end
182
-
184
+
183
185
  def opts
184
186
  @_opts ||= defaults.clone
185
187
  end
186
-
188
+
187
189
  class ContextError < StandardError #:nodoc:
188
190
  end
189
-
191
+
190
192
  def get(x)
191
193
  raise ContextError, "Cannot call get inside a package, must be inside an Installer block"
192
194
  end
193
-
195
+
194
196
  # TODO - remove
195
197
  def push_file(file, options ={}, &block)
196
198
  ActiveSupport::Deprecation.warn("push_file is depreciated and will be removed in v0.9. Use the new `file` installer instead.")
197
199
  raise "need content" unless options[:content]
198
200
  runner "#{"sudo " if sudo?}rm -f #{file}"
199
- push_text options[:content], file, options, &block
201
+ push_text(options[:content], file, options, &block)
200
202
  end
201
-
203
+
202
204
  def verify(description = '', &block)
203
205
  @verifications << Sprinkle::Verify.new(self, description, &block)
204
206
  end
205
-
207
+
206
208
  def process(deployment, roles)
207
209
  logger.info " * #{name}"
208
210
  return if meta_package?
209
- opts.each_with_index do |(k, v), index|
211
+ opts.each_with_index do |(k, v), index|
210
212
  branch = (index == opts.size - 1) ? "└" : "├"
211
- logger.debug " #{branch}─ #{k}: #{v}"
213
+ logger.debug " #{branch}─ #{k}: #{v}"
212
214
  end
213
-
215
+
214
216
  # Run a pre-test to see if the software is already installed. If so,
215
217
  # we can skip it, unless we have the force option turned on!
216
218
  unless @verifications.empty? || Sprinkle::OPTIONS[:force]
217
219
  begin
218
220
  process_verifications(deployment, roles, true)
219
-
221
+
220
222
  logger.info " --> already installed for roles: #{roles}"
221
223
  return
222
- rescue Sprinkle::VerificationFailed => e
224
+ rescue Sprinkle::VerificationFailed
223
225
  # Continue
224
226
  end
225
227
  end
226
228
 
227
- @installers.each do |installer|
229
+ installers.each do |installer|
228
230
  installer.defaults(deployment)
229
231
  installer.process(roles)
230
232
  end
231
-
233
+
232
234
  process_verifications(deployment, roles)
233
235
  logger.info " --> INSTALLED for roles: #{roles}"
234
236
  end
235
-
237
+
236
238
  def process_verifications(deployment, roles, pre = false)
237
239
  return if @verifications.blank?
238
-
240
+
239
241
  if pre
240
242
  logger.debug "--> Checking if #{self.name} is already installed for roles: #{roles}"
241
243
  else
242
244
  logger.debug "--> Verifying #{self.name} was properly installed for roles: #{roles}"
243
245
  end
244
-
246
+
245
247
  @verifications.each do |v|
246
248
  v.defaults(deployment)
247
249
  v.process(roles)
@@ -259,11 +261,11 @@ module Sprinkle
259
261
  def optional(*packages)
260
262
  add_dependencies packages, :optional
261
263
  end
262
-
264
+
263
265
  def dependencies
264
266
  @dependencies.map {|a,b| a }
265
267
  end
266
-
268
+
267
269
  def tree(depth = 1, &block)
268
270
  packages = []
269
271
  packages << tree_for_packages(@recommends, :depth => depth, &block)
@@ -276,29 +278,31 @@ module Sprinkle
276
278
  def to_s
277
279
  "#{@name} #{@version}".strip
278
280
  end
279
-
281
+
280
282
  # allow an installer to request a private install queue from the package
281
283
  # for example to allow pre and post hooks to have their own installers that
282
284
  # do not mess with the packages installer list
283
- #
285
+ #
284
286
  # returns: the private queue
285
287
  def with_private_install_queue()
286
- b = @installers
287
- @installers = private_queue =[]
288
+ @install_queues.push []
288
289
  yield
289
- @installers = b
290
- private_queue
290
+ @install_queues.pop
291
291
  end
292
-
292
+
293
+ def installers
294
+ @install_queues.last
295
+ end
296
+
293
297
  protected
294
-
298
+
295
299
  def install(i)
296
- @installers << i
300
+ installers << i
297
301
  i
298
302
  end
299
-
303
+
300
304
  private
301
-
305
+
302
306
  def add_dependencies(packages, kind)
303
307
  opts = packages.extract_options!
304
308
  depends = instance_variable_get("@#{kind}")
@@ -307,7 +311,7 @@ module Sprinkle
307
311
  end
308
312
  depends.map {|a,b| a }
309
313
  end
310
-
314
+
311
315
  def tree_for_packages(packages, opts={}, &block)
312
316
  depth = opts[:depth]
313
317
  tree = []
@@ -322,13 +326,13 @@ module Sprinkle
322
326
  end
323
327
  tree
324
328
  end
325
-
329
+
326
330
  def cloud_info(message)
327
331
  logger.info(message) if Sprinkle::OPTIONS[:cloud] or logger.debug?
328
332
  end
329
333
 
330
334
  def meta_package?
331
- @installers.blank?
335
+ installers.blank?
332
336
  end
333
337
  end
334
338
  end
@@ -1,12 +1,13 @@
1
1
  module Sprinkle::Package
2
2
  class Chooser #:nodoc:
3
+
3
4
  def self.select_package(name, packages)
4
5
  if packages.size <= 1
5
6
  package = packages.first
6
7
  else
7
8
  package = choose do |menu|
8
9
  menu.prompt = "Multiple choices exist for virtual package #{name}"
9
- menu.choices *packages.collect(&:to_s)
10
+ menu.choices( *packages.collect(&:to_s) )
10
11
  end
11
12
  package = Sprinkle::Package::PACKAGES.first(package)
12
13
  end
@@ -15,10 +16,10 @@ module Sprinkle::Package
15
16
 
16
17
  package
17
18
  end
18
-
19
+
19
20
  def self.cloud_info(message)
20
21
  logger.info(message) if Sprinkle::OPTIONS[:cloud] or logger.debug?
21
22
  end
22
-
23
+
23
24
  end
24
- end
25
+ end