Class: Kamaze::Project::ToolsProvider

Inherits:
Object
  • Object
show all
Defined in:
lib/kamaze/project/tools_provider.rb,
lib/kamaze/project/tools_provider/resolver.rb

Overview

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:

project.tools.fetch(:licenser).process do |licenser|
  process.license  = project.version.license_header
  process.patterns = ['bin/*', 'lib/**/**.rb']
  process.output   = STDOUT
end

Defined Under Namespace

Classes: Resolver

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(items = {}) ⇒ ToolsProvider

Returns a new instance of ToolsProvider.

Parameters:

  • items (Hash) (defaults to: {})


61
62
63
64
# File 'lib/kamaze/project/tools_provider.rb', line 61

def initialize(items = {})
  @items = Hash[self.class.defaults].merge(items)
  @resolver = Resolver.new
end

Instance Attribute Details

#itemsHash (readonly, protected)

Base items, before (if needed) resolution.

Returns:

  • (Hash)


148
149
150
# File 'lib/kamaze/project/tools_provider.rb', line 148

def items
  @items
end

#resolverResolver (readonly, protected)

Returns:



143
144
145
# File 'lib/kamaze/project/tools_provider.rb', line 143

def resolver
  @resolver
end

Class Method Details

.defaultsHash

Default tools

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

Returns:

  • (Hash)


40
41
42
# File 'lib/kamaze/project/tools_provider.rb', line 40

def defaults
  items.freeze
end

.itemsHash (protected)

Get items

Items are collected from a YAML file.

Returns:

  • (Hash)


51
52
53
54
55
56
57
# 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

Instance Method Details

#[](name) ⇒ Object|nil

Get a fresh instance with given name

Parameters:

  • name (Symbol|String)

Returns:



110
111
112
113
114
115
116
117
118
# 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) ⇒ Object

Associates the value given by value with the given key.

Parameters:

  • name (String|Symbol)
  • value (Class)


78
79
80
81
82
# 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) ⇒ Object Also known as: get

Get a fresh instance with given name

Parameters:

  • name (Symbol|String)

Returns:

Raises:

  • (KeyError)


100
101
102
103
104
# File 'lib/kamaze/project/tools_provider.rb', line 100

def fetch(name)
  raise KeyError, "key not found: :#{name}" unless member?(name)

  self[name]
end

#freezeself

Prevents further modifications.

See also Object#frozen?.

Returns:

  • (self)


89
90
91
92
93
# File 'lib/kamaze/project/tools_provider.rb', line 89

def freeze
  super.tap do
    @items.freeze
  end
end

#member?(name) ⇒ Boolean

Returns true if the given key is present

Parameters:

  • name (Symbol|String)

Returns:

  • (Boolean)


136
137
138
# File 'lib/kamaze/project/tools_provider.rb', line 136

def member?(name)
  self.items.member?(name.to_sym)
end

#merge!(items) ⇒ self

Parameters:

  • items (Hash)

Returns:

  • (self)


68
69
70
71
72
# 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_hHash

Get all instances at once

Returns:

  • (Hash)


125
126
127
128
129
130
# 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