class Guard::DslDescriber

The DslDescriber evaluates the Guardfile and creates an internal structure of it that is used in some inspection utility methods like the CLI commands ‘show` and `list`.

@see Guard::Dsl @see Guard::CLI

Public Class Methods

new(options = nil) click to toggle source
# File lib/guard/dsl_describer.rb, line 19
def initialize(options = nil)
  fail "options passed to DslDescriber are ignored!" unless options.nil?
end

Public Instance Methods

list() click to toggle source

List the Guard plugins that are available for use in your system and marks those that are currently used in your ‘Guardfile`.

@see CLI#list

# File lib/guard/dsl_describer.rb, line 28
def list
  # TODO: remove dependency on Guard in this whole file
  # collect metadata
  data = PluginUtil.plugin_names.sort.inject({}) do |hash, name|
    hash[name.capitalize] = Guard.state.session.plugins.all(name).any?
    hash
  end

  # presentation
  header = [:Plugin, :Guardfile]
  final_rows = []
  data.each do |name, used|
    final_rows << { Plugin: name, Guardfile: used ? "✔" : "✘" }
  end

  # render
  Formatador.display_compact_table(final_rows, header)
end
notifiers() click to toggle source

Shows all notifiers and their options that are defined in the ‘Guardfile`.

@see CLI#show

# File lib/guard/dsl_describer.rb, line 108
def notifiers
  supported = Notifier.supported
  Notifier.connect(notify: true, silent: true)
  detected = Notifier.detected
  Notifier.disconnect

  detected_names = detected.map { |item| item[:name] }

  final_rows = supported.each_with_object([]) do |(name, _), rows|
    available = detected_names.include?(name) ? "✔" : "✘"

    notifier = detected.detect { |n| n[:name] == name }
    used = notifier ? "✔" : "✘"

    options = notifier ? notifier[:options] : {}

    if options.empty?
      rows << :split
      _add_row(rows, name, available, used, "", "")
    else
      options.each_with_index do |(option, value), index|
        if index == 0
          rows << :split
          _add_row(rows, name, available, used, option.to_s, value.inspect)
        else
          _add_row(rows, "", "", "", option.to_s, value.inspect)
        end
      end
    end

    rows
  end

  Formatador.display_compact_table(
    final_rows.drop(1),
    [:Name, :Available, :Used, :Option, :Value]
  )
end
show() click to toggle source

Shows all Guard plugins and their options that are defined in the ‘Guardfile`.

@see CLI#show

# File lib/guard/dsl_describer.rb, line 52
def show
  # collect metadata
  groups = Guard.state.session.groups.all

  objects = []

  empty_plugin = OpenStruct.new
  empty_plugin.options = [["", nil]]

  groups.each do |group|
    plugins = Array(Guard.state.session.plugins.all(group: group.name))
    plugins = [empty_plugin] if plugins.empty?
    plugins.each do |plugin|
      options = plugin.options
      options = [["", nil]] if options.empty?
      options.each do |option, raw_value|
        value = raw_value.nil? ? "" : raw_value.inspect
        objects << [group.title, plugin.title, option.to_s, value]
      end
    end
  end

  # presentation
  rows = []
  prev_group = prev_plugin = prev_option = prev_value = nil
  objects.each do |group, plugin, option, value|
    group_changed = prev_group != group
    plugin_changed = (prev_plugin != plugin || group_changed)

    rows << :split if group_changed || plugin_changed

    rows << {
      Group: group_changed ? group : "",
      Plugin: plugin_changed ? plugin : "",
      Option: option,
      Value: value
    }

    prev_group = group
    prev_plugin = plugin
    prev_option = option
    prev_value = value
  end

  # render
  Formatador.display_compact_table(
    rows.drop(1),
    [:Group, :Plugin, :Option, :Value]
  )
end

Private Instance Methods

_add_row(rows, name, available, used, option, value) click to toggle source
# File lib/guard/dsl_describer.rb, line 149
def _add_row(rows, name, available, used, option, value)
  rows << {
    Name: name,
    Available: available,
    Used: used,
    Option: option,
    Value: value
  }
end