lachlan-sprinkle 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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