Sha256: e6b36526b05fadfe10433ea8611dac42dd5111d48411c4c69f422dec34ec4318

Contents?: true

Size: 1.03 KB

Versions: 7

Compression:

Stored size: 1.03 KB

Contents

# frozen_string_literal: true

module Infusible
  # Sanitizes and resolves dependencies for use.
  class DependencyMap
    PATTERNS = {key: /([a-z_][a-zA-Z_0-9]*)$/, valid: /^[\w.]+$/}.freeze

    attr_reader :keys

    def initialize *configuration, patterns: PATTERNS
      @patterns = patterns
      @collection = {}

      aliases = configuration.last.is_a?(Hash) ? configuration.pop : {}

      configuration.each { |identifier| add to_key(identifier), identifier }
      aliases.each { |key, identifier| add key, identifier }

      @keys = collection.keys.freeze
    end

    def to_h = collection

    private

    attr_reader :patterns, :collection

    def to_key identifier
      key = identifier[patterns.fetch(:key)]

      return key if key && key.match?(patterns.fetch(:valid))

      fail Errors::InvalidDependency.new(identifier:)
    end

    def add key, identifier
      key = key.to_sym

      return collection[key] = identifier unless collection.key? key

      fail Errors::DuplicateDependency.new(key:, identifier:)
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
infusible-4.2.0 lib/infusible/dependency_map.rb
infusible-4.1.0 lib/infusible/dependency_map.rb
infusible-4.0.0 lib/infusible/dependency_map.rb
infusible-3.12.0 lib/infusible/dependency_map.rb
infusible-3.11.0 lib/infusible/dependency_map.rb
infusible-3.10.1 lib/infusible/dependency_map.rb
infusible-3.10.0 lib/infusible/dependency_map.rb