Sha256: 3126b2e7db9bb949a0bd43df5b839a1247ade83f71538d8c834e1b9634012977

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

module DependencyManager
  # Resolves a factories dependencies against the currently loaded dependency
  # list. Checks for potential missing dependencies and reconciles against
  # optional and required dependencies.
  class Resolver
    # If dependencies are not present
    class MissingDependencies < ArgumentError; end

    # Creates a new Resolver
    #
    # @param factory: [Factory]
    #   Factory instance
    #
    # @param loaded_dependencies: [Hash[Symbol, Any]]
    #   Map of currently loaded dependencies
    #
    # @return [Resolver]
    def initialize(factory:, loaded_dependencies:)
      @factory = factory
      @loaded_dependencies = loaded_dependencies
    end

    # Resolves dependencies from the currently loaded dependencies
    #
    # @raise [MissingDependencies]
    #   When there are missing dependencies required by the current factory
    #   that will prevent the factory from building
    #
    # @return [Hash[Symbol, Any]]
    #   Dependencies necessary to build the factory
    def resolve
      # Resolve required dependencies from our current list
      resolved_dependencies = @loaded_dependencies.slice(*@factory.dependencies)
      required_dependencies = @factory.required_dependencies

      # But check if there are a few missing. Optional dependencies not included in this
      missing_dependencies = required_dependencies.reject do |dependency_name|
        !!resolved_dependencies[dependency_name]
      end

      if missing_dependencies.any?
        error = missing_dependencies.join(', ')
        raise MissingDependencies, "Dependencies for `#{@factory.const_name}` are not present: #{error}"
      end

      resolved_dependencies
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dependency_manager-0.0.1 lib/dependency_manager/resolver.rb