class Nanoc::CLI::Commands::ShowPlugins

Constants

PLUGIN_CLASSES
PLUGIN_CLASS_ORDER

rubocop:disable Style/MutableConstant These constants are intended to be mutated (through add_plugin_class)

Public Class Methods

add_plugin_class(klass, name) click to toggle source
# File lib/nanoc/cli/commands/show-plugins.rb, line 84
def self.add_plugin_class(klass, name)
  PLUGIN_CLASS_ORDER << klass
  PLUGIN_CLASSES[klass] = name
end

Public Instance Methods

run() click to toggle source

rubocop:enable Style/MutableConstant

# File lib/nanoc/cli/commands/show-plugins.rb, line 29
def run
  # Get list of plugins (before and after)
  plugins_before = PLUGIN_CLASSES.keys.each_with_object({}) { |c, acc| acc[c] = c.all }
  site = load_site
  site&.code_snippets
  plugins_after = PLUGIN_CLASSES.keys.each_with_object({}) { |c, acc| acc[c] = c.all }

  # Divide list of plugins into builtin and custom
  plugins_builtin = plugins_before
  plugins_custom  = plugins_after.each_with_object({}) do |(superclass, klasses), acc|
    acc[superclass] = klasses - plugins_before[superclass]
  end

  # Find max identifiers length
  all_identifiers = plugins_after.values.flatten.map(&:identifiers)
  max_identifiers_length = all_identifiers.map(&:to_s).map(&:size).max

  PLUGIN_CLASS_ORDER.each do |superclass|
    plugins_with_this_superclass = {
      builtin: plugins_builtin.fetch(superclass, []),
      custom: plugins_custom.fetch(superclass, []),
    }

    # Print kind
    kind = name_for_plugin_class(superclass)
    puts "#{kind}:"
    puts

    # Print plugins organised by subtype
    %i[builtin custom].each do |type|
      # Find relevant plugins
      relevant_plugins = plugins_with_this_superclass[type]

      # Print type
      puts "  #{type}:"
      if relevant_plugins.empty?
        puts '    (none)'
        next
      end

      # Print plugins
      relevant_plugins.sort_by { |k| k.identifiers.join(', ') }.each do |plugin|
        # Display
        puts format(
          "    %-#{max_identifiers_length}s (%s)",
          plugin.identifiers.join(', '),
          plugin.to_s.sub(/^::/, ''),
        )
      end
    end

    puts
  end
end

Private Instance Methods

name_for_plugin_class(klass) click to toggle source
# File lib/nanoc/cli/commands/show-plugins.rb, line 91
def name_for_plugin_class(klass)
  PLUGIN_CLASSES[klass.to_s]
end