lib/teapot/dependency.rb in teapot-0.7.2 vs lib/teapot/dependency.rb in teapot-0.7.3

- old
+ new

@@ -22,10 +22,20 @@ require 'teapot/environment' module Teapot module Dependency + class UnresolvedDependencyError < StandardError + def initialize(chain) + super "Unresolved dependency chain!" + + @chain = chain + end + + attr :chain + end + Provision = Struct.new(:value) Alias = Struct.new(:dependencies) def provides?(name) provisions.key? name @@ -147,36 +157,43 @@ provision = provider.provisions[dependency] # We will now satisfy this dependency by satisfying any dependent dependencies, but we no longer need to revisit this one. @resolved << dependency - + if Alias === provision # puts "** Resolving alias #{provision}".color(:magenta) - + provision.dependencies.each do |dependency| expand(dependency, provider) end elsif provision != nil # puts "** Appending #{dependency} -> provisions".color(:magenta) @provisions << provision end - + unless @resolved.include?(provider) # We are now satisfying the provider by expanding all its own dependencies: @resolved << provider - + provider.dependencies.each do |dependency| expand(dependency, provider) end - + # puts "** Appending #{dependency} -> ordered".color(:magenta) @ordered << [provider, dependency] end end end + # An `UnresolvedDependencyError` will be thrown if there are any unresolved dependencies. def self.chain(selection, dependencies, providers) - Chain.new(selection, dependencies, providers) + chain = Chain.new(selection, dependencies, providers) + + if chain.unresolved.size > 0 + raise UnresolvedDependencyError.new(chain) + end + + return chain end end end