class Bridgetown::Commands::Plugins

Public Instance Methods

cd(arg) click to toggle source

This is super useful if you want to copy files out of plugins to override.

Example:

bridgetown plugins cd AwesomePlugin/layouts
cp -r * $BRIDGETOWN_SITE/src/_layouts

Now all the plugin's layouts will be in the site repo directly.

# File lib/bridgetown-core/commands/plugins.rb, line 100
def cd(arg)
  site = Bridgetown::Site.new(configuration_with_overrides(options))

  pm = site.plugin_manager

  directive = arg.split("/")
  unless directive[1]
    Bridgetown.logger.warn("Oops!", "Your command needs to be in the <origin/dir> format")
    return
  end

  manifest = pm.class.source_manifests.find do |source_manifest|
    source_manifest.origin.to_s == directive[0]
  end

  if manifest&.respond_to?(directive[1].downcase)
    dir = manifest.send(directive[1].downcase)
    Bridgetown.logger.info("Opening the #{dir.green} folder for" \
                            " #{manifest.origin.to_s.cyan}…")
    Bridgetown.logger.info("Type #{"exit".yellow} when you're done to" \
                            " return to your site root.")
    puts

    Dir.chdir dir do
      ENV["BRIDGETOWN_SITE"] = site.root_dir
      if ENV["SHELL"]
        system(ENV["SHELL"])
      else
        system("/bin/sh")
      end
    end

    puts
    Bridgetown.logger.info("Done!", "You're back in #{Dir.pwd.green}")
  else
    Bridgetown.logger.warn("Oops!", "I wasn't able to find the" \
                            " #{directive[1]} folder for #{directive[0]}")
  end
end
list() click to toggle source
# File lib/bridgetown-core/commands/plugins.rb, line 16
def list
  site = Bridgetown::Site.new(configuration_with_overrides(options))
  site.reset
  Bridgetown::Hooks.trigger :site, :pre_read, site

  pm = site.plugin_manager

  plugins_list = pm.class.registered_plugins.reject do |plugin|
    plugin.to_s.end_with? "site_builder.rb"
  end

  Bridgetown.logger.info("Registered Plugins:", plugins_list.length.to_s.yellow.bold)

  plugins_list.each do |plugin|
    unless plugin.to_s.end_with? "site_builder.rb"
      Bridgetown.logger.info("", plugin.to_s.sub(site.in_root_dir("/"), ""))
    end
  end

  Bridgetown.logger.info("Source Manifests:", "---") unless pm.class.source_manifests.empty?

  pm.class.source_manifests.each do |manifest|
    Bridgetown.logger.info("Origin:", (manifest.origin || "n/a").to_s.green)
    Bridgetown.logger.info("Components:", (manifest.components || "n/a").to_s.cyan)
    Bridgetown.logger.info("Content:", (manifest.content || "n/a").to_s.cyan)
    Bridgetown.logger.info("Layouts:", (manifest.layouts || "n/a").to_s.cyan)

    Bridgetown.logger.info("", "---")
  end

  unless Bridgetown.autoload? :Builder
    builders = Bridgetown::Builder.descendants
    Bridgetown.logger.info("Builders:", builders.length.to_s.yellow.bold)

    builders.each do |builder|
      name = builder.respond_to?(:custom_name) ? builder.custom_name : builder.name
      name_components = name.split("::")
      last_name = name_components.pop
      name_components.push last_name.magenta
      Bridgetown.logger.info("", name_components.join("::"))
    end
  end

  Bridgetown.logger.info("Converters:", site.converters.length.to_s.yellow.bold)

  site.converters.each do |converter|
    name = plugin_name_for(converter)
    name_components = name.split("::")
    last_name = name_components.pop
    name_components.push last_name.magenta
    Bridgetown.logger.info("", name_components.join("::"))
  end

  Bridgetown.logger.info("Generators:", site.generators.length.to_s.yellow.bold)

  site.generators.each do |generator|
    name = plugin_name_for(generator)
    name_components = name.split("::")
    last_name = name_components.pop
    name_components.push last_name.magenta
    Bridgetown.logger.info("", name_components.join("::"))
  end
end
new(plugin_name) click to toggle source

rubocop:disable Layout/LineLength

# File lib/bridgetown-core/commands/plugins.rb, line 143
def new(plugin_name)
  folder_name = plugin_name.underscore
  name = folder_name.dasherize
  module_name = folder_name.camelize

  # TODO: upon 0.21 release, remove the explicit branch name!
  run "git clone -b switch-to-minitest https://github.com/bridgetownrb/bridgetown-sample-plugin #{name}"
  new_gemspec = "#{name}.gemspec"

  inside name do # rubocop:todo Metrics/BlockLength
    destroy_existing_repo
    initialize_new_repo

    FileUtils.mv "bridgetown-sample-plugin.gemspec", new_gemspec.to_s
    gsub_file new_gemspec, "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
    gsub_file new_gemspec, "bridgetown-sample-plugin", name
    gsub_file new_gemspec, "sample-plugin", name
    gsub_file new_gemspec, "SamplePlugin", module_name

    gsub_file "package.json", "https://github.com/bridgetownrb/bridgetown-sample-plugin", "https://github.com/username/#{name}"
    gsub_file "package.json", "bridgetown-sample-plugin", name

    FileUtils.mv "lib/sample-plugin.rb", "lib/#{name}.rb"
    gsub_file "lib/#{name}.rb", "sample-plugin", name
    gsub_file "lib/#{name}.rb", "SamplePlugin", module_name

    FileUtils.mv "lib/sample-plugin", "lib/#{name}"
    gsub_file "lib/#{name}/builder.rb", "SamplePlugin", module_name
    gsub_file "lib/#{name}/version.rb", "SamplePlugin", module_name

    FileUtils.mv "test/test_sample_plugin.rb", "test/test_#{folder_name}.rb"
    gsub_file "test/test_#{folder_name}.rb", "SamplePlugin", module_name
    gsub_file "test/helper.rb", "sample-plugin", name

    FileUtils.mv "components/sample_plugin", "components/#{folder_name}"
    FileUtils.mv "content/sample_plugin", "content/#{folder_name}"
    FileUtils.mv "layouts/sample_plugin", "layouts/#{folder_name}"

    gsub_file "layouts/#{folder_name}/layout.html", "sample_plugin", folder_name
    gsub_file "content/#{folder_name}/example_page.md", "sample_plugin", folder_name
    gsub_file "components/#{folder_name}/layout_help.liquid", "sample_plugin", folder_name

    gsub_file "frontend/javascript/index.js", "bridgetown-sample-plugin", name
    gsub_file "frontend/javascript/index.js", "SamplePlugin", module_name
  end
  say ""
  say_status "Done!", "Have fun writing your new #{name} plugin :)"
  say_status "Remember:", "Don't forget to rename the SamplePlugin" \
                         " code identifiers and paths to your own" \
                         " indentifer, as well as update your README " \
                         " and CHANGELOG files as necessary."
end

Protected Instance Methods

plugin_name_for(plugin) click to toggle source

rubocop:enable Layout/LineLength

# File lib/bridgetown-core/commands/plugins.rb, line 199
def plugin_name_for(plugin)
  if plugin.class.respond_to?(:custom_name)
    plugin.class.custom_name
  else
    plugin.class.name
  end
end