Class: Capsium::Package::DependencyResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/capsium/package/dependency_resolver.rb,
sig/capsium/package/dependency_resolver.rbs

Overview

Orchestrates metadata.dependencies resolution against a package store: circularity checks plus store lookup, with a registry as install fallback for store misses.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(store, registry: nil) ⇒ DependencyResolver

Returns a new instance of DependencyResolver.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/capsium/package/dependency_resolver.rb', line 38

def initialize(store, registry: nil)
  if store.nil?
    raise DependencyError,
          "metadata.dependencies declared but no package store " \
          "configured (set CAPSIUM_STORE or pass store:)"
  end

  @store = store.is_a?(Store) ? store : Store.new(store.to_s)
  @registry = if registry.nil? || registry.is_a?(Capsium::Registry)
                registry
              else
                Capsium::Registry.fetch(registry)
              end
  @registry ||= Capsium::Registry.default
end

Instance Attribute Details

#registryCapsium::Registry? (readonly)

Returns the value of attribute registry.

Returns:



36
37
38
# File 'lib/capsium/package/dependency_resolver.rb', line 36

def registry
  @registry
end

#storeStore (readonly)

Returns the value of attribute store.

Returns:



36
37
38
# File 'lib/capsium/package/dependency_resolver.rb', line 36

def store
  @store
end

Instance Method Details

#resolve_path(guid, range, chain:) ⇒ String

The newest store .cap satisfying the dependency, installing from the configured registry on a store miss and raising typed errors for circular, missing or unsatisfiable dependencies.

Parameters:

  • guid (String)
  • range (String)
  • chain: (Array[String] chain)

Returns:

  • (String)


61
62
63
64
65
66
67
68
69
70
# File 'lib/capsium/package/dependency_resolver.rb', line 61

def resolve_path(guid, range, chain:)
  if chain.include?(guid)
    raise CircularDependencyError,
          "circular dependency: #{(chain + [guid]).join(' -> ')}"
  end

  @store.find(guid, range)
rescue DependencyNotFoundError => e
  resolve_from_registry(guid, range, e)
end