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::PluginUtilobject. -
#initialize_plugin(options) ⇒ Guard::Plugin, Guard::Guard
Initializes a new
Guard::Pluginwith the givenoptionshash. -
#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:
-
guardnamewill becomeGuard::Guardname -
dashed-guard-namewill becomeGuard::DashedGuardName -
underscore_guard_namewill becomeGuard::UnderscoreGuardName
When no class is found with the strict case sensitive rules, another try is made to locate the class without matching case:
-
rspecwill find a classGuard::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 |