lachlan-sprinkle 0.0.6 → 0.0.7

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.
@@ -96,17 +96,34 @@ module Sprinkle
96
96
 
97
97
  def package(name, metadata = {}, &block)
98
98
  package = Package.new(name, metadata, &block)
99
- PACKAGES[name] = package
100
-
101
- if package.provides
102
- (PACKAGES[package.provides] ||= []) << package
103
- end
104
-
99
+ (PACKAGES[name] ||= []) << package
100
+ (PACKAGES[package.provides] ||= []) << package if package.provides
105
101
  package
106
102
  end
103
+
104
+ def find(name)
105
+ packages = PACKAGES[name]
106
+ if packages and packages.length > 1
107
+ selected = []
108
+ choose do |menu|
109
+ menu.header = "\nMultiple choices exist for package #{name}"
110
+ packages.sort!.each do |package|
111
+ menu.choice("#{package.name}#{' (' + package.version + ')' if package.version}") do
112
+ selected << package
113
+ end
114
+ end
115
+ menu.choice("all") do
116
+ selected = packages
117
+ end
118
+ end
119
+ packages = selected
120
+ end
121
+ packages
122
+ end
107
123
 
108
124
  class Package #:nodoc:
109
125
  include ArbitraryOptions
126
+ include Comparable
110
127
  attr_accessor :name, :provides, :installer, :dependencies, :recommends, :verifications
111
128
 
112
129
  def initialize(name, metadata = {}, &block)
@@ -185,7 +202,7 @@ module Sprinkle
185
202
  def process(deployment, roles)
186
203
  return if meta_package?
187
204
 
188
- logger.info "\n#{self.name}"
205
+ logger.info "\n#{self.to_s}"
189
206
  # Run a pre-test to see if the software is already installed. If so,
190
207
  # we can skip it, unless we have the force option turned on!
191
208
  unless @verifications.empty? || Sprinkle::OPTIONS[:force]
@@ -233,45 +250,39 @@ module Sprinkle
233
250
  def tree(depth = 1, &block)
234
251
  packages = []
235
252
 
236
- @recommends.each do |dep|
237
- package = PACKAGES[dep]
238
- next unless package # skip missing recommended packages as they can be optional
239
- block.call(self, package, depth) if block
240
- packages << package.tree(depth + 1, &block)
253
+ @recommends.each do |name|
254
+ list = find(name)
255
+ next unless list # skip missing recommended packages as they can be optional
256
+ list.each { |package|
257
+ block.call(self, package, depth) if block
258
+ packages << package.tree(depth + 1, &block)
259
+ }
241
260
  end
242
261
 
243
- @dependencies.each do |dep|
244
- package = PACKAGES[dep]
245
- package = select_package(dep, package) if package.is_a? Array
246
-
247
- raise "Package definition not found for key: #{dep}" unless package
248
- block.call(self, package, depth) if block
249
- packages << package.tree(depth + 1, &block)
262
+ @dependencies.each do |name|
263
+ list = find(name)
264
+ raise "Package definition not found: #{name}" unless list
265
+ list.each { |package|
266
+ block.call(self, package, depth) if block
267
+ packages << package.tree(depth + 1, &block)
268
+ }
250
269
  end
251
270
 
252
271
  packages << self
253
272
  end
254
273
 
255
- def to_s; @name; end
274
+ def to_s
275
+ s = @name.to_s
276
+ s << " (#{@version.to_s})" if @version
277
+ s
278
+ end
279
+
280
+ def <=>(other)
281
+ self.to_s <=> other.to_s
282
+ end
256
283
 
257
284
  private
258
285
 
259
- def select_package(name, packages)
260
- if packages.size <= 1
261
- package = packages.first
262
- else
263
- package = choose do |menu|
264
- menu.prompt = "Multiple choices exist for virtual package #{name}"
265
- menu.choices *packages.collect(&:to_s)
266
- end
267
- package = Sprinkle::Package::PACKAGES[package]
268
- end
269
-
270
- cloud_info "Selecting #{package.to_s} for virtual package #{name}"
271
-
272
- package
273
- end
274
-
275
286
  def meta_package?
276
287
  @installer == nil
277
288
  end
@@ -76,16 +76,17 @@ module Sprinkle
76
76
 
77
77
  @packages.each do |p|
78
78
  cloud_info "\nPolicy #{@name} requires package #{p}"
79
+
80
+ list = Sprinkle::Package.find(p)
81
+ raise "Package definition not found: #{p}" unless list
79
82
 
80
- package = Sprinkle::Package::PACKAGES[p]
81
- raise "Package definition not found for key: #{p}" unless package
82
- package = select_package(p, package) if package.is_a? Array # handle virtual package selection
83
-
84
- tree = package.tree do |parent, child, depth|
85
- indent = "\t" * depth; cloud_info "#{indent}Package #{parent.name} requires #{child.name}"
86
- end
83
+ list.each { |package|
84
+ tree = package.tree do |parent, child, depth|
85
+ indent = "\t" * depth; cloud_info "#{indent}Package #{parent.to_s} requires #{child.to_s}"
86
+ end
87
87
 
88
- all << tree
88
+ all << tree
89
+ }
89
90
  end
90
91
 
91
92
  normalize(all) do |package|
@@ -99,25 +100,9 @@ module Sprinkle
99
100
  logger.info(message) if Sprinkle::OPTIONS[:cloud] or logger.debug?
100
101
  end
101
102
 
102
- def select_package(name, packages)
103
- if packages.size <= 1
104
- package = packages.first
105
- else
106
- package = choose do |menu|
107
- menu.prompt = "Multiple choices exist for virtual package #{name}"
108
- menu.choices *packages.collect(&:to_s)
109
- end
110
- package = Sprinkle::Package::PACKAGES[package]
111
- end
112
-
113
- cloud_info "Selecting #{package.to_s} for virtual package #{name}"
114
-
115
- package
116
- end
117
-
118
103
  def normalize(all, &block)
119
104
  all = all.flatten.uniq
120
- cloud_info "\n--> Normalized installation order for all packages: #{all.collect(&:name).join(', ')}"
105
+ cloud_info "\n--> Normalized installation order for all packages: #{all.map(&:to_s).join(', ')}"
121
106
  all.each &block
122
107
  end
123
108
  end
@@ -101,7 +101,7 @@ module Sprinkle
101
101
  attr_accessor :package, :commands
102
102
 
103
103
  def initialize(package, commands)
104
- super("Verifying #{package.name} failed: #{commands.join(RUBY_PLATFORM =~ /win32/ ? ' & ' : '; ')}")
104
+ super("Verifying #{package.name} failed: #{Array(commands).join(RUBY_PLATFORM =~ /win32/ ? ' & ' : '; ')}")
105
105
 
106
106
  @package = package
107
107
  @commands = commands
@@ -2,7 +2,7 @@ module Sprinkle #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 6
5
+ TINY = 7
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -140,7 +140,7 @@ describe Sprinkle::Verify do
140
140
  end
141
141
 
142
142
  it 'should print the install sequence to the console' do
143
- @verification.should_receive(:logger).twice.and_return(@logger)
143
+ @verification.should_receive(:logger).once.and_return(@logger)
144
144
  end
145
145
 
146
146
  after do
data/sprinkle.gemspec CHANGED
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{sprinkle}
3
- s.version = "0.0.6"
3
+ s.version = "0.0.7"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
6
  s.authors = ["Marcus Crafter", "Mitchell Hashimoto"]
7
- s.date = %q{2009-03-29}
7
+ s.date = %q{2009-03-30}
8
8
  s.default_executable = %q{sprinkle}
9
9
  s.description = %q{Ruby DSL based software provisioning tool}
10
10
  s.email = ["crafterm@redartisan.com", "mitchell.hashimoto@citrusbyte.com"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lachlan-sprinkle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcus Crafter
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-03-29 00:00:00 -07:00
13
+ date: 2009-03-30 00:00:00 -07:00
14
14
  default_executable: sprinkle
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency