class Dry::System::Config::ComponentDirs

The configured component dirs for a container

@api public

Attributes

defaults[R]

A ComponentDir for configuring the default values to apply to all added component dirs

@see method_missing @api private

dirs[R]

Returns the hash of component dirs, keyed by their paths

Recently changed default configuration may not be applied to these dirs. Use to_a or each to access dirs with default configuration fully applied.

This method exists to encapsulate the instance variable and to serve the needs of initialize_copy

@return [Hash{String => ComponentDir}]

@api private

Public Class Methods

new() click to toggle source

Creates a new component dirs

@api private

# File lib/dry/system/config/component_dirs.rb, line 94
def initialize
  @dirs = {}
  @defaults = ComponentDir.new(nil)
end

Public Instance Methods

[](path)
Alias for: dir
add(path_or_dir) { |dir| ... } click to toggle source

@overload add(path)

Adds and configures a component dir for the given path

@param path [String] the path for the component dir, relative to the configured
  container root
@yieldparam dir [ComponentDir] the component dir to configure

@return [ComponentDir] the added component dir

@example
  component_dirs.add "lib" do |dir|
    dir.default_namespace = "my_app"
  end

@see ComponentDir
@api public

@overload add(dir)

Adds a configured component dir

@param dir [ComponentDir] the configured component dir

@return [ComponentDir] the added component dir

@example
  dir = Dry::System::ComponentDir.new("lib")
  component_dirs.add dir

@see ComponentDir
@api public
# File lib/dry/system/config/component_dirs.rb, line 152
def add(path_or_dir)
  path, dir_to_add = path_and_dir(path_or_dir)

  raise ComponentDirAlreadyAddedError, path if dirs.key?(path)

  dirs[path] = dir_to_add.tap do |dir|
    # Defaults must be applied after yielding, since the dir is being newly added,
    # and must have its configuration fully in place before we can know which
    # defaults to apply
    yield dir if path_or_dir == path && block_given?
    apply_defaults_to_dir(dir)
  end
end
delete(path) click to toggle source

Deletes and returns a previously added component dir

@param path [String] the path for the component dir

@return [ComponentDir] the removed component dir

@api public

# File lib/dry/system/config/component_dirs.rb, line 173
def delete(path)
  dirs.delete(path)
end
dir(path) { |dir| ... } click to toggle source

Returns and optionally yields a previously added component dir

@param path [String] the path for the component dir @yieldparam dir [ComponentDir] the component dir

@return [ComponentDir] the component dir

@api public

# File lib/dry/system/config/component_dirs.rb, line 113
def dir(path)
  dirs[path].tap do |dir|
    # Defaults can be (re-)applied first, since the dir has already been added
    apply_defaults_to_dir(dir) if dir
    yield dir if block_given?
  end
end
Also aliased as: []
each(&block) click to toggle source

Calls the given block once for each added component dir, passing the dir as an argument.

@yieldparam dir [ComponentDir] the yielded component dir

@api public

# File lib/dry/system/config/component_dirs.rb, line 212
def each(&block)
  to_a.each(&block)
end
initialize_copy(source) click to toggle source

@api private

# File lib/dry/system/config/component_dirs.rb, line 100
def initialize_copy(source)
  @dirs = source.dirs.map { |path, dir| [path, dir.dup] }.to_h
  @defaults = source.defaults.dup
end
length() click to toggle source

Returns the count of component dirs

@return [Integer]

@api public

# File lib/dry/system/config/component_dirs.rb, line 191
def length
  dirs.length
end
Also aliased as: size
paths() click to toggle source

Returns the paths of the component dirs

@return [Array<String>] the component dir paths

@api public

# File lib/dry/system/config/component_dirs.rb, line 182
def paths
  dirs.keys
end
size()
Alias for: length
to_a() click to toggle source

Returns the added component dirs, with default settings applied

@return [Array<ComponentDir>]

@api public

# File lib/dry/system/config/component_dirs.rb, line 201
def to_a
  dirs.each { |_, dir| apply_defaults_to_dir(dir) }
  dirs.values
end

Private Instance Methods

apply_defaults_to_dir(dir) click to toggle source

Applies default settings to a component dir. This is run every time the dirs are accessed to ensure defaults are applied regardless of when new component dirs are added. This method must be idempotent.

@return [void]

# File lib/dry/system/config/component_dirs.rb, line 255
def apply_defaults_to_dir(dir)
  defaults.config.values.each do |key, _|
    if defaults.configured?(key) && !dir.configured?(key)
      dir.public_send(:"#{key}=", defaults.public_send(key).dup)
    end
  end
end
method_missing(name, *args, &block) click to toggle source
Calls superclass method
# File lib/dry/system/config/component_dirs.rb, line 263
def method_missing(name, *args, &block)
  if defaults.respond_to?(name)
    defaults.public_send(name, *args, &block)
  else
    super
  end
end
path_and_dir(path_or_dir) click to toggle source

Converts a path string or pre-built component dir into a path and dir tuple

@param path_or_dir [String,ComponentDir]

@return [Array<(String, ComponentDir)>]

@see add

# File lib/dry/system/config/component_dirs.rb, line 240
def path_and_dir(path_or_dir)
  if path_or_dir.is_a?(ComponentDir)
    dir = path_or_dir
    [dir.path, dir]
  else
    path = path_or_dir
    [path, ComponentDir.new(path)]
  end
end
respond_to_missing?(name, include_all = false) click to toggle source
Calls superclass method
# File lib/dry/system/config/component_dirs.rb, line 271
def respond_to_missing?(name, include_all = false)
  defaults.respond_to?(name) || super
end