Class: Kamaze::Project::ToolsProvider

Inherits:
Object
  • Object
show all
Defined in:
lib/kamaze/project/tools_provider.rb,
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: {})


63
64
65
66
67
# File 'lib/kamaze/project/tools_provider.rb', line 63

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

Instance Attribute Details

#cacheHash (readonly, protected)

Used to avoid classes resolution.

Returns:

  • (Hash)


160
161
162
# File 'lib/kamaze/project/tools_provider.rb', line 160

def cache
  @cache
end

#itemsHash (readonly, protected)

Base items, before (if needed) resolution.

Returns:

  • (Hash)


155
156
157
# File 'lib/kamaze/project/tools_provider.rb', line 155

def items
  @items
end

#resolverResolver (readonly, protected)

Returns:



150
151
152
# File 'lib/kamaze/project/tools_provider.rb', line 150

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)


43
44
45
# File 'lib/kamaze/project/tools_provider.rb', line 43

def defaults
  items.freeze
end

.itemsHash (protected)

Get items

Items are collected from a YAML file.

Returns:

  • (Hash)


54
55
56
57
58
59
# File 'lib/kamaze/project/tools_provider.rb', line 54

def items
  config = "#{__dir__}/resources/config/tools.yml"
  defaults = YAML.load_file(config)

  Hash[defaults.collect { |k, v| [k.to_sym, v] }]
end

Instance Method Details

#[](name) ⇒ Object|nil

Get a fresh instance with given name

Parameters:

  • name (Symbol|String)

Returns:



113
114
115
116
117
118
119
120
121
122
123
# File 'lib/kamaze/project/tools_provider.rb', line 113

def [](name)
  name = name.to_sym

  return nil unless member?(name)

  @cache[name] ||= @items.fetch(name).yield_self do |klass|
    resolver.classify(klass)
  end

  @cache.fetch(name).new
end

#[]=(name, value) ⇒ Object

Associates the value given by value with the given key.

Parameters:

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


84
85
86
# File 'lib/kamaze/project/tools_provider.rb', line 84

def []=(name, value)
  merge!(name => value)
end

#fetch(name) ⇒ Object Also known as: get

Get a fresh instance with given name

Parameters:

  • name (Symbol|String)

Returns:

Raises:

  • (KeyError)


103
104
105
106
107
# File 'lib/kamaze/project/tools_provider.rb', line 103

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)


93
94
95
96
# File 'lib/kamaze/project/tools_provider.rb', line 93

def freeze
  @items.freeze
  super
end

#member?(name) ⇒ Boolean

Returns true if the given key is present

Parameters:

  • name (Symbol|String)

Returns:

  • (Boolean)


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

def member?(name)
  name = name.to_sym

  @items.member?(name)
end

#merge!(items) ⇒ self

Parameters:

  • items (Hash)

Returns:

  • (self)


71
72
73
74
75
76
77
78
# File 'lib/kamaze/project/tools_provider.rb', line 71

def merge!(items)
  items = Hash[items.map { |k, v| [k.to_sym, v] }]
  @cache.delete_if { |k| items.member?(k) }

  @items.merge!(items)

  self
end

#to_hHash

Get all instances at once

Returns:

  • (Hash)


130
131
132
133
134
135
# File 'lib/kamaze/project/tools_provider.rb', line 130

def to_h
  @items
    .map { |k, v| [k, @cache[k] ||= resolver.classify(v)] }
    .yield_self { |results| Hash[results] }
    .yield_self { |items| Hash[items.collect { |k, v| [k, v.new] }] }
end