module Debci # This class represents a single package. See Debci::Repository for how to # obtain one of these. class Package < Struct.new(:name, :repository) # Returns the architectures in which this package is available def architectures repository.architectures_for(self) end # Returns the suites in which this package is available def suites repository.suites_for(self) end # Returns a matrix of Debci::Status objects, where rows represent # architectures and columns represent suites: # # [ # [ amd64_unstable , amd64_testing ], # [ i386_unstable, i386_testing ], # ] # # Each cell of the matrix contains a Debci::Status object. def status repository.status_for(self) end # Returns an array of Debci::Status objects that represent the test # history for this package def history(suite, architecture) repository.history_for(self, suite, architecture) end # Returns a list of Debci::Status objects that are newsworthy for this # package. The list is sorted with the most recent entries first and the # older entries last. def news repository.news_for(self) end # Returns an array containing the suite/architectures this package is # failing. If this package is passing on all suite/architectures, nothing # is returned. def failures failing_status = [] status.each do |architecture| architecture.each do |suite| case suite.status when :tmpfail # Determine if there was a failure before the tmpfail history(suite.suite, suite.architecture).each do |test| # If there wasn't a failure before the tmpfail, # stop looking through the test history if test.status == :pass break end if test.status == :fail failing_status.push(suite.suite + '/' + suite.architecture) break end end when :fail failing_status.push(suite.suite + '/' + suite.architecture) end end end return failing_status unless failing_status.empty? end # Returns an Array of suite/architectures that this package is temporarily # failing. If there are no temporary failures, nothing is returned. def tmpfail status.flatten.select { |p| p.status == :tmpfail }.map { |s| "#{s.suite}/#{s.architecture}" } end def to_s # :nodoc: "<Package #{name}>" end def to_str # :nodoc: name end def prefix name =~ /^((lib)?.)/ $1 end def blacklisted? Debci.blacklist.include?(self) end end end