lib/nanoc/cli/commands/show-plugins.rb
summary 'show all available plugins'
aliases :info
usage 'show-plugins [options]'
description <<-EOS
Show a list of available plugins, including filters and data sources.
If the current directory contains a Nanoc web site, the plugins defined in this site will be shown as well.
EOS
module Nanoc::CLI::Commands
class ShowPlugins < ::Nanoc::CLI::CommandRunner
def run
# Check arguments
if arguments.any?
raise Nanoc::Int::Errors::GenericTrivial, "usage: #{command.usage}"
end
# Get list of plugins (before and after)
plugins_before = PLUGIN_CLASSES.keys.each_with_object({}) { |c, acc| acc[c] = c.all }
site.code_snippets if site
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
[: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
PLUGIN_CLASS_ORDER = [
Nanoc::Filter,
Nanoc::DataSource,
Nanoc::Deploying::Deployer,
].freeze
PLUGIN_CLASSES = {
Nanoc::Filter => 'Filters',
Nanoc::DataSource => 'Data Sources',
Nanoc::Deploying::Deployer => 'Deployers',
}.freeze
def name_for_plugin_class(klass)
PLUGIN_CLASSES[klass]
end
end
end
runner Nanoc::CLI::Commands::ShowPlugins