Class: Guard::PluginUtil
- Inherits:
-
Object
- Object
- Guard::PluginUtil
- Defined in:
- lib/guard/plugin_util.rb
Overview
This class contains useful methods to:
-
Fetch all the Guard plugins names;
-
Initialize a plugin, get its location;
-
Return its class name;
-
Add its template to the Guardfile.
Constant Summary collapse
- ERROR_NO_GUARD_OR_CLASS =
"Could not load 'guard/%s' or" \ " find class Guard::%s"
- INFO_ADDED_GUARD_TO_GUARDFILE =
"%s guard added to Guardfile,"\ " feel free to edit it"
Instance Attribute Summary collapse
-
#name ⇒ Object
Returns the value of attribute name.
Class Method Summary collapse
- ._gem_valid?(gem) ⇒ Boolean
-
.plugin_names ⇒ Array<String>
Returns a list of Guard plugin Gem names installed locally.
Instance Method Summary collapse
-
#add_to_guardfile ⇒ Object
Adds a plugin’s template to the Guardfile.
-
#initialize(name) ⇒ PluginUtil
constructor
Initializes a new ‘Guard::PluginUtil` object.
-
#initialize_plugin(options) ⇒ Guard::Plugin, Guard::Guard
Initializes a new ‘Guard::Plugin` with the given `options` hash.
-
#plugin_class(options = {}) ⇒ Class?
Tries to load the Guard plugin main class.
-
#plugin_location ⇒ String
Locates a path to a Guard plugin gem.
Constructor Details
#initialize(name) ⇒ PluginUtil
Initializes a new ‘Guard::PluginUtil` object.
36 37 38 |
# File 'lib/guard/plugin_util.rb', line 36 def initialize(name) @name = name.to_s.sub(/^guard-/, "") end |
Instance Attribute Details
#name ⇒ Object
Returns the value of attribute name.
18 19 20 |
# File 'lib/guard/plugin_util.rb', line 18 def name @name end |
Class Method Details
._gem_valid?(gem) ⇒ Boolean
182 183 184 185 186 187 188 |
# File 'lib/guard/plugin_util.rb', line 182 def _gem_valid?(gem) return false if gem.name == "guard-compat" return true if gem.name =~ /^guard-/ full_path = gem.full_gem_path file = File.join(full_path, "lib", "guard", "#{gem.name}.rb") File.exist?(file) end |
.plugin_names ⇒ Array<String>
Returns a list of Guard plugin Gem names installed locally.
24 25 26 27 28 29 30 |
# File 'lib/guard/plugin_util.rb', line 24 def self.plugin_names valid = Gem::Specification.find_all.select do |gem| _gem_valid?(gem) end valid.map { |x| x.name.sub(/^guard-/, "") }.uniq end |
Instance Method Details
#add_to_guardfile ⇒ Object
Adds a plugin’s template to the Guardfile.
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/guard/plugin_util.rb', line 126 def add_to_guardfile klass = plugin_class # call here to avoid failing later require_relative "guardfile/evaluator" # TODO: move this to Generator? = Guard.state.session. evaluator = Guardfile::Evaluator.new() begin evaluator.evaluate rescue Guard::Guardfile::Evaluator::NoPluginsError end if evaluator.guardfile_include?(name) UI.info "Guardfile already includes #{ name } guard" else content = File.read("Guardfile") File.open("Guardfile", "wb") do |f| f.puts(content) f.puts("") f.puts(klass.template(plugin_location)) end UI.info INFO_ADDED_GUARD_TO_GUARDFILE % name end end |
#initialize_plugin(options) ⇒ Guard::Plugin, Guard::Guard
Initializes a new ‘Guard::Plugin` with the given `options` hash. This methods handles plugins that inherit from the deprecated `Guard::Guard` class as well as plugins that inherit from `Guard::Plugin`.
upgrade for Guard 2.0
55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/guard/plugin_util.rb', line 55 def initialize_plugin() klass = plugin_class fail "Could not load class: #{_constant_name.inspect}" unless klass if klass.ancestors.include?(Guard) klass.new(.delete(:watchers), ) else begin klass.new(**) rescue ArgumentError => e fail "Failed to call #{klass}.new(options): #{e}" end end end |
#plugin_class(options = {}) ⇒ Class?
Tries to load the Guard plugin main class. This transforms the supplied plugin name into a class name:
-
‘guardname` will become `Guard::Guardname`
-
‘dashed-guard-name` will become `Guard::DashedGuardName`
-
‘underscore_guard_name` will become `Guard::UnderscoreGuardName`
When no class is found with the strict case sensitive rules, another try is made to locate the class without matching case:
-
‘rspec` will find a class `Guard::RSpec`
not be printed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/guard/plugin_util.rb', line 96 def plugin_class( = {}) = { fail_gracefully: false }.merge() const = _plugin_constant fail TypeError, "no constant: #{_constant_name}" unless const @plugin_class ||= Guard.const_get(const) rescue TypeError begin require "guard/#{ name.downcase }" const = _plugin_constant @plugin_class ||= Guard.const_get(const) rescue TypeError => error UI.error "Could not find class Guard::#{ _constant_name }" UI.error error.backtrace.join("\n") # TODO: return value or move exception higher rescue LoadError => error unless [:fail_gracefully] msg = format(ERROR_NO_GUARD_OR_CLASS, name.downcase, _constant_name) UI.error(msg) UI.error("Error is: #{error}") UI.error(error.backtrace.join("\n")) # TODO: return value or move exception higher end end end |