Raxol.Plugins.Lifecycle.Dependencies (Raxol v2.6.1)

View Source

Dependency validation, cycle detection, and load-order resolution for plugins.

A declared dependency is either a bare name (atom or string) or a {name, requirement} tuple whose requirement is a Version requirement string such as ">= 1.0.0" or "~> 2.1". Names normalize to strings.

Three guarantees:

  • resolve_plugin_order/1 returns a topological order, so a plugin is never loaded before something it depends on.
  • check_for_circular_dependency/2 walks the transitive graph, so an indirect cycle (a -> b -> a) is rejected, not just self-reference.
  • check_dependencies/2 honours the requirement half of a dependency tuple, so a plugin cannot be satisfied by an incompatible version.

Summary

Functions

Verifies every declared dependency is loaded and version-compatible.

Rejects a plugin whose dependencies close a cycle, directly or transitively.

Orders plugins so each one follows every dependency it declares.

Types

dep()

@type dep() :: {String.t(), String.t() | nil, term()}

Functions

check_dependencies(plugin, manager)

Verifies every declared dependency is loaded and version-compatible.

Returns :ok, {:error, :missing_dependencies, missing, chain}, or {:error, :version_mismatch, mismatches, chain}.

check_for_circular_dependency(plugin, manager)

Rejects a plugin whose dependencies close a cycle, directly or transitively.

normalize_plugin_key(key)

resolve_plugin_order(initialized_plugins)

Orders plugins so each one follows every dependency it declares.

Dependencies outside the given batch are assumed already loaded and place no constraint on this ordering. Returns {:ok, names} or {:error, :circular_dependency, cycle, []}.

validate_plugin_dependencies(plugin, manager)