Raxol.Core.Runtime.Plugins.DependencyManager.Graph (Raxol v0.5.0)

View Source

Handles dependency graph building and cycle detection for plugin dependencies. Provides functionality for building dependency graphs and analyzing dependency chains.

Summary

Functions

Builds a dependency chain for error reporting.

Builds a dependency graph from plugin metadata.

Gets all dependencies for a plugin, including transitive dependencies.

Functions

build_dependency_chain(cycle, graph)

Builds a dependency chain for error reporting.

Parameters

  • cycle - List of plugin IDs forming a cycle
  • graph - The dependency graph

Returns

  • A list of plugin IDs representing the dependency chain

Example

iex> Graph.build_dependency_chain(["plugin_a", "plugin_b"], %{
  "plugin_a" => [{"plugin_b", ">= 1.0.0", %{optional: false}}],
  "plugin_b" => [{"plugin_a", ">= 1.0.0", %{optional: false}}]
})
["plugin_a", "plugin_b", "plugin_a"]

build_dependency_graph(plugins)

Builds a dependency graph from plugin metadata.

Parameters

  • plugins - Map of plugin metadata, keyed by plugin ID

Returns

  • A map representing the dependency graph, where each key is a plugin ID and the value is a list of tuples containing dependency information: {dep_id, version_req, opts}

Example

iex> Graph.build_dependency_graph(%{
  "plugin_a" => %{dependencies: [{"plugin_b", ">= 1.0.0"}]},
  "plugin_b" => %{dependencies: []}
})
%{
  "plugin_a" => [{"plugin_b", ">= 1.0.0", %{optional: false}}],
  "plugin_b" => []
}

get_all_dependencies(plugin_id, graph, visited \\ MapSet.new())

Gets all dependencies for a plugin, including transitive dependencies.

Parameters

  • plugin_id - The ID of the plugin
  • graph - The dependency graph
  • visited - Set of already visited plugin IDs (for cycle detection)

Returns

  • {:ok, deps} - List of all dependencies
  • {:error, :circular_dependency, cycle} - If a circular dependency is detected