HexSolver (HexSolver v0.3.0)

Copy Markdown View Source

A version solver.

Summary

Functions

Serializes an internal solver constraint as an Elixir version requirement.

Parses or converts a SemVer version or Elixir version requirement to an internal solver constraint that can be returned by the HexSolver.Registry or passed to HexSolver.run/4.

Parses or converts a SemVer version or Elixir version requirement to an internal solver constraint that can be returned by the HexSolver.Registry or passed to HexSolver.run/4.

Types

constraint()

@opaque constraint()

dependency()

@type dependency() :: %{
  repo: repo(),
  name: package(),
  constraint: constraint(),
  optional: optional(),
  label: label(),
  dependencies: [dependency()]
}

label()

@type label() :: String.t()

locked()

@type locked() :: %{
  repo: repo(),
  name: package(),
  version: Version.t(),
  label: label()
}

optional()

@type optional() :: boolean()

package()

@type package() :: String.t()

repo()

@type repo() :: String.t() | nil

result()

@type result() :: %{required(package()) => {Version.t(), repo()}}

Functions

constraint_to_requirement!(constraint)

@spec constraint_to_requirement!(constraint()) :: String.t()

Serializes an internal solver constraint as an Elixir version requirement.

parse_constraint(string)

@spec parse_constraint(String.t() | Version.t() | Version.Requirement.t()) ::
  {:ok, constraint()} | :error

Parses or converts a SemVer version or Elixir version requirement to an internal solver constraint that can be returned by the HexSolver.Registry or passed to HexSolver.run/4.

parse_constraint!(string)

@spec parse_constraint!(String.t() | Version.t() | Version.Requirement.t()) ::
  constraint()

Parses or converts a SemVer version or Elixir version requirement to an internal solver constraint that can be returned by the HexSolver.Registry or passed to HexSolver.run/4.

Raises Version.InvalidRequirementError if the requirement is invalid and HexSolver.UnsatisfiableRequirementError if no version can satisfy it.

run(registry, dependencies, locked, overrides, opts \\ [])

@spec run(module(), [dependency()], [locked()], [label()], [{:ansi, boolean()}]) ::
  {:ok, result()} | {:error, String.t()}

Runs the version solver.

Takes a HexSolver.Registry implementation, a list of root dependencies, a list of locked package versions, and a list of packages that are overridden by the root dependencies.

Depdendencies with sub-dependencies in the :dependencies map field are not expected to be packages in the registry. These dependencies are used to give better error messages for when there are multiple declarations of the dependency with conflicting version requirements. For example:

* Top dependency 1
  * package ~> 1.0
* Top dependency 2
  * package ~> 2.0

Locked dependencies are treated as optional dependencies with a single version as their constraint.

The overrides are a set of labels. If a dependency with a matching label is declared the solver will ignore that dependency unless it's a root dependency.

Returns a map of packages and their selected versions or a human readable explanation of why a solution could not be found.

Options

  • :ansi - If true adds ANSI formatting to the failure message (Default: false)