class Chef::Taste::DependencyChecker

The class checks for cookbook dependencies and populates all fields for the dependent cookbook

Public Class Methods

check(path = Dir.pwd) click to toggle source

Check for cookbook dependencies and their versions

@param path [String] the path for the cookbook

@return [Array<Dependency>] list of dependency objects

@raise NotACookbook the current/given path is not a cookbook

# File lib/chef/taste/dependency_checker.rb, line 42
def check(path = Dir.pwd)
  raise NotACookbookError, 'Path is not a cookbook' unless File.exists?(File.join(path, 'metadata.rb'))
  ridley = Ridley::Chef::Cookbook::Metadata.from_file(File.join(path, 'metadata.rb'))
  dependencies =
    ridley.dependencies.map do |name, version|
      Dependency.new(name, version)
    end
  populate_fields(dependencies)
end
cookbook_exists?(name) click to toggle source

Checks if a particular cookbook exists in the community site

@param name [String] the name of the cookbook

@return [Boolean] whether the cookbook exists in the community site or not

# File lib/chef/taste/dependency_checker.rb, line 99
def cookbook_exists?(name)
  rest = Berkshelf::CommunityREST.new
  rest.get(name).status == 200
end
populate_fields(dependencies) click to toggle source

Populate various fields for all dependencies

@param dependencies [Array<Dependency>] list of dependency objects

@return [Array<Dependency>] list of dependency objects with updated fields

# File lib/chef/taste/dependency_checker.rb, line 58
def populate_fields(dependencies)
  rest = Berkshelf::CommunityREST.new
  dependencies.each do |dependency|
    # Skip cookbooks that are not available in the community site. It might be an external cookbook.
    next unless cookbook_exists?(dependency.name)

    dependency.latest = rest.latest_version(dependency.name)

    # Obtain the version used based on the version constraint
    dependency.version_used = rest.satisfy(dependency.name, dependency.requirement)
    dependency.source_url = rest.get(dependency.name).body['external_url']

    # Calculate the status and changelog based on the version being used and the latest version
    update_status(dependency)
  end
end
update_status(dependency) click to toggle source

Updates the status of the dependency based on the version used and the latest version available in the community site. It also obtains the changelog of the dependency is out-of-date

@param dependency [Dependency] the cookbook dependency

# File lib/chef/taste/dependency_checker.rb, line 80
def update_status(dependency)
  if dependency.version_used && dependency.latest
    used_version = Solve::Version.new(dependency.version_used)
    latest_version = Solve::Version.new(dependency.latest)
    if used_version.eql?(latest_version)
      dependency.status = 'up-to-date'
    else
      dependency.status = 'out-of-date'
      dependency.changelog = Changelog.compute(dependency)
    end
  end
end