class Kamaze::Project::ToolsProvider

Tools provider

Tools are instantiated on demand, each demand generates a fresh new tool instance, avoiding risk to reuse a previous altered version of a tool.

Sample of use:

“`ruby project.tools.fetch(:licenser).process do |licenser|

process.license  = project.version.license_header
process.patterns = ['bin/*', 'lib/**/**.rb']
process.output   = STDOUT

end “`

Attributes

items[R]

Base items, before (if needed) resolution.

@return [Hash]

resolver[R]

@return [Resolver]

Public Class Methods

defaults() click to toggle source

Default tools

Tools default values can be “Class“ or “String“ (or “Symbol“), when value is not a “Class“, it is resolved using “inflector“

@return [Hash]

# File lib/kamaze/project/tools_provider.rb, line 40
def defaults
  items.freeze
end
new(items = {}) click to toggle source

@param [Hash] items

# File lib/kamaze/project/tools_provider.rb, line 61
def initialize(items = {})
  @items = Hash[self.class.defaults].merge(items)
  @resolver = Resolver.new
end

Protected Class Methods

items() click to toggle source

Get items

Items are collected from a YAML file.

@return [Hash]

# File lib/kamaze/project/tools_provider.rb, line 51
def items
  "#{__dir__}/resources/config/tools.yml"
    .yield_self { |file| YAML.load_file(file) }
    .yield_self do |defaults|
    defaults.transform_keys(&:to_sym)
  end
end

Public Instance Methods

[](name) click to toggle source

Get a fresh instance with given name

@param [Symbol|String] name @return [Object|nil]

# File lib/kamaze/project/tools_provider.rb, line 110
def [](name)
  name = name.to_sym

  return nil unless member?(name)

  self.items.fetch(name).yield_self do |klass|
    resolver.classify(klass).new
  end
end
[]=(name, value) click to toggle source

Associates the value given by value with the given key.

@param [String|Symbol] name @param [Class] value

# File lib/kamaze/project/tools_provider.rb, line 78
def []=(name, value)
  value.tap do
    { name => value }.tap { |h| merge!(h) }
  end
end
fetch(name) click to toggle source

Get a fresh instance with given name

@param [Symbol|String] name @return [Object] @raise [KeyError]

# File lib/kamaze/project/tools_provider.rb, line 100
def fetch(name)
  raise KeyError, "key not found: :#{name}" unless member?(name)

  self[name]
end
Also aliased as: get
freeze() click to toggle source

Prevents further modifications.

See also “Object#frozen?“.

@return [self]

Calls superclass method
# File lib/kamaze/project/tools_provider.rb, line 89
def freeze
  super.tap do
    @items.freeze
  end
end
get(name)
Alias for: fetch
member?(name) click to toggle source

Returns “true“ if the given key is present

@param [Symbol|String] name @return [Boolean]

# File lib/kamaze/project/tools_provider.rb, line 136
def member?(name)
  self.items.member?(name.to_sym)
end
merge!(items) click to toggle source

@param [Hash] items @return [self]

# File lib/kamaze/project/tools_provider.rb, line 68
def merge!(items)
  self.tap do
    items.transform_keys(&:to_sym).tap { |h| @items.merge!(h) }
  end
end
to_h() click to toggle source

Get all instances at once

@return [Hash]

# File lib/kamaze/project/tools_provider.rb, line 125
def to_h
  self.items
      .map { |k, v| [k, resolver.classify(v)] }
      .yield_self { |results| Hash[results] }
      .yield_self { |items| items.transform_values(&:new) }
end