# module Gem::Resolver::Molinillo::SpecificationProvider

Provides information about specifications and dependencies to the resolver, allowing the {Resolver} class to remain generic while still providing power and flexibility.

This module contains the methods that users of `Gem::Resolver::Molinillo` must to implement, using knowledge of their own model classes.

### Public Instance Methods

allow_missing?(dependency) click to toggle source

Returns whether this dependency, which has no possible matching specifications, can safely be ignored.

@param [Object] dependency @return [Boolean] whether this dependency can safely be skipped.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 108
    def allow_missing?(dependency)
      false
    end

dependencies_equal?(dependencies, other_dependencies) click to toggle source

Determines whether two arrays of dependencies are equal, and thus can be grouped.

@param [Array<Object>] dependencies @param [Array<Object>] other_dependencies @return [Boolean] whether ‘dependencies` and `other_dependencies` should

    be considered equal.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 55
    def dependencies_equal?(dependencies, other_dependencies)
      dependencies == other_dependencies
    end

dependencies_for(specification) click to toggle source

Returns the dependencies of ‘specification`. @note This method should be ’pure’, i.e. the return value should depend

    only on the `specification` parameter.

@param [Object] specification @return [Array<Object>] the dependencies that are required by the given

    `specification`.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 31
    def dependencies_for(specification)
      []
    end

name_for(dependency) click to toggle source

Returns the name for the given ‘dependency`. @note This method should be ’pure’, i.e. the return value should depend

    only on the `dependency` parameter.

@param [Object] dependency @return [String] the name for the given ‘dependency`.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 65
    def name_for(dependency)
      dependency.to_s
    end

name_for_explicit_dependency_source() click to toggle source

@return [String] the name of the source of explicit dependencies, i.e.

    those passed to {Resolver#resolve} directly.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 71
    def name_for_explicit_dependency_source
      'user-specified dependency'
    end

name_for_locking_dependency_source() click to toggle source

@return [String] the name of the source of ‘locked’ dependencies, i.e.

    those passed to {Resolver#resolve} directly as the `base`

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 77
    def name_for_locking_dependency_source
      'Lockfile'
    end

requirement_satisfied_by?(requirement, activated, spec) click to toggle source

Determines whether the given ‘requirement` is satisfied by the given `spec`, in the context of the current `activated` dependency graph.

@param [Object] requirement @param [DependencyGraph] activated the current dependency graph in the

    resolution process.

@param [Object] spec @return [Boolean] whether ‘requirement` is satisfied by `spec` in the

    context of the current `activated` dependency graph.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 44
    def requirement_satisfied_by?(requirement, activated, spec)
      true
    end

search_for(dependency) click to toggle source

Search for the specifications that match the given dependency. The specifications in the returned array will be considered in reverse order, so the latest version ought to be last. @note This method should be ‘pure’, i.e. the return value should depend

    only on the `dependency` parameter.

@param [Object] dependency @return [Array<Object>] the specifications that satisfy the given

    `dependency`.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 20
    def search_for(dependency)
      []
    end

sort_dependencies(dependencies, activated, conflicts) click to toggle source

Sort dependencies so that the ones that are easiest to resolve are first. Easiest to resolve is (usually) defined by:

    1) Is this dependency already activated?
    2) How relaxed are the requirements?
    3) Are there any conflicts for this dependency?
    4) How many possibilities are there to satisfy this dependency?

@param [Array<Object>] dependencies @param [DependencyGraph] activated the current dependency graph in the

    resolution process.

@param [{String => `Array`<Conflict>}] conflicts @return [Array<Object>] a sorted copy of ‘dependencies`.

    # File lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb, line 93
    def sort_dependencies(dependencies, activated, conflicts)
      dependencies.sort_by do |dependency|
        name = name_for(dependency)
        [
          activated.vertex_named(name).payload ? 0 : 1,
          conflicts[name] ? 0 : 1,
        ]
      end
    end