Class: Kamaze::Project::ToolsProvider
- 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
-
#cache ⇒ Hash
readonly
protected
Used to avoid classes resolution.
-
#items ⇒ Hash
readonly
protected
Base items, before (if needed) resolution.
- #resolver ⇒ Resolver readonly protected
Class Method Summary collapse
-
.defaults ⇒ Hash
Default tools.
-
.items ⇒ Hash
protected
Get items.
Instance Method Summary collapse
-
#[](name) ⇒ Object|nil
Get a fresh instance with given name.
-
#[]=(name, value) ⇒ Object
Associates the value given by value with the given key.
-
#fetch(name) ⇒ Object
(also: #get)
Get a fresh instance with given name.
-
#freeze ⇒ self
Prevents further modifications.
-
#initialize(items = {}) ⇒ ToolsProvider
constructor
A new instance of ToolsProvider.
-
#member?(name) ⇒ Boolean
Returns
true
if the given key is present. - #merge!(items) ⇒ self
-
#to_h ⇒ Hash
Get all instances at once.
Constructor Details
#initialize(items = {}) ⇒ ToolsProvider
Returns a new instance of ToolsProvider.
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
#cache ⇒ Hash (readonly, protected)
Used to avoid classes resolution.
160 161 162 |
# File 'lib/kamaze/project/tools_provider.rb', line 160 def cache @cache end |
#items ⇒ Hash (readonly, protected)
Base items, before (if needed) resolution.
155 156 157 |
# File 'lib/kamaze/project/tools_provider.rb', line 155 def items @items end |
#resolver ⇒ Resolver (readonly, protected)
150 151 152 |
# File 'lib/kamaze/project/tools_provider.rb', line 150 def resolver @resolver end |
Class Method Details
.defaults ⇒ Hash
Default tools
Tools default values can be Class
or String
(or Symbol
),
when value is not a Class
, it is resolved using inflector
43 44 45 |
# File 'lib/kamaze/project/tools_provider.rb', line 43 def defaults items.freeze end |
.items ⇒ Hash (protected)
Get items
Items are collected from a YAML file.
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
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.
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
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 |
#freeze ⇒ self
Prevents further modifications.
See also Object#frozen?
.
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
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
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_h ⇒ Hash
Get all instances at once
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 |