class Guard::PluginUtil
This class contains useful methods to:
Constants
- ERROR_NO_GUARD_OR_CLASS
- INFO_ADDED_GUARD_TO_GUARDFILE
Attributes
Public Class Methods
Source
# 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
Source
# File lib/guard/plugin_util.rb, line 36 def initialize(name) @name = name.to_s.sub(/^guard-/, "") end
Initializes a new ‘Guard::PluginUtil` object.
@param [String] name the name of the Guard
plugin
Source
# 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
Returns a list of Guard
plugin Gem names installed locally.
@return [Array<String>] a list of Guard
plugin gem names
Public Instance Methods
Source
# 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? options = Guard.state.session.evaluator_options evaluator = Guardfile::Evaluator.new(options) 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
Adds a plugin’s template to the Guardfile
.
Source
# File lib/guard/plugin_util.rb, line 55 def initialize_plugin(options) klass = plugin_class fail "Could not load class: #{_constant_name.inspect}" unless klass if klass.ancestors.include?(Guard) klass.new(options.delete(:watchers), options) else begin klass.new(**options) rescue ArgumentError => e fail "Failed to call #{klass}.new(options): #{e}" end end end
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`.
@see Guard::Plugin
@see github.com/guard/guard/wiki/Upgrading-to-Guard-2.0 How to upgrade for Guard
2.0
@return [Guard::Plugin] the initialized plugin @return [Guard::Guard] the initialized plugin. This return type is
deprecated and the plugin's maintainer should update it to be compatible with Guard 2.0. For more information on how to upgrade for Guard 2.0, please head over to: https://github.com/guard/guard/wiki/Upgrading-to-Guard-2.0
Source
# File lib/guard/plugin_util.rb, line 96 def plugin_class(options = {}) options = { fail_gracefully: false }.merge(options) 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 options[: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
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`
@option options [Boolean] fail_gracefully whether error messages should not be printed
@return [Class, nil] the loaded class
Source
# File lib/guard/plugin_util.rb, line 73 def plugin_location @plugin_location ||= _full_gem_path("guard-#{name}") rescue Gem::LoadError UI.error "Could not find 'guard-#{ name }' gem path." end
Locates a path to a Guard
plugin gem.
@return [String] the full path to the plugin gem
Private Instance Methods
Source
# File lib/guard/plugin_util.rb, line 172 def _constant_name @_constant_name ||= name.gsub(%r{/(.?)}) { "::#{ $1.upcase }" }. gsub(/(?:^|[_-])(.)/) { $1.upcase } end
Guesses the most probable name for the current plugin based on its name.
@example Returns the most probable name for a plugin
> Guard::PluginUtil.new('rspec').send(:_constant_name) => "Rspec"
Source
# File lib/guard/plugin_util.rb, line 177 def _full_gem_path(name) Gem::Specification.find_by_name(name).full_gem_path end
Source
# File lib/guard/plugin_util.rb, line 160 def _plugin_constant @_plugin_constant ||= Guard.constants.detect do |c| c.to_s.casecmp(_constant_name.downcase).zero? end end
Returns the constant for the current plugin.
@example Returns the constant for a plugin
> Guard::PluginUtil.new('rspec').send(:_plugin_constant) => Guard::RSpec