lib/berkshelf/locations/base.rb
module Berkshelf
class BaseLocation
attr_reader :dependency
attr_reader :options
def initialize(dependency, options = {})
@dependency = dependency
@options = options
end
# Determine if this revision is installed.
#
# @return [Boolean]
def installed?
raise AbstractFunction,
"#installed? must be implemented on #{self.class.name}!"
end
# Install the given cookbook. Subclasses that implement this method should
# perform all the installation and validation steps required.
#
# @return [void]
def install
raise AbstractFunction,
"#install must be implemented on #{self.class.name}!"
end
# The cached cookbook for this location.
#
# @return [CachedCookbook]
def cached_cookbook
raise AbstractFunction,
"#cached_cookbook must be implemented on #{self.class.name}!"
end
# The lockfile representation of this location.
#
# @return [string]
def to_lock
raise AbstractFunction,
"#to_lock must be implemented on #{self.class.name}!"
end
# Ensure the given {CachedCookbook} is valid
#
# @param [String] path
# the path to the possible cookbook
#
# @raise [NotACookbook]
# if the cookbook at the path does not have a metadata
# @raise [CookbookValidationFailure]
# if given CachedCookbook does not satisfy the constraint of the location
# @raise [MismatcheCookboookName]
# if the cookbook does not have a name or if the name is different
#
# @return [true]
def validate_cached!(path)
unless File.cookbook?(path)
raise NotACookbook.new(path)
end
begin
cookbook = CachedCookbook.from_path(path)
rescue => e
raise InternalError, "The following error occurred while reading the " \
"cookbook `#{dependency.name}':\n#{e.class}: #{e.message}"
end
unless @dependency.version_constraint.satisfies?(cookbook.version)
raise CookbookValidationFailure.new(dependency, cookbook)
end
unless @dependency.name == cookbook.cookbook_name
raise MismatchedCookbookName.new(dependency, cookbook)
end
true
end
end
end