This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jekyll
|
||||
class PluginManager
|
||||
attr_reader :site
|
||||
|
||||
# Create an instance of this class.
|
||||
#
|
||||
# site - the instance of Jekyll::Site we're concerned with
|
||||
#
|
||||
# Returns nothing
|
||||
def initialize(site)
|
||||
@site = site
|
||||
end
|
||||
|
||||
# Require all the plugins which are allowed.
|
||||
#
|
||||
# Returns nothing
|
||||
def conscientious_require
|
||||
require_theme_deps if site.theme
|
||||
require_plugin_files
|
||||
require_gems
|
||||
deprecation_checks
|
||||
end
|
||||
|
||||
# Require each of the gem plugins specified.
|
||||
#
|
||||
# Returns nothing.
|
||||
def require_gems
|
||||
Jekyll::External.require_with_graceful_fail(
|
||||
site.gems.select { |plugin| plugin_allowed?(plugin) }
|
||||
)
|
||||
end
|
||||
|
||||
# Require each of the runtime_dependencies specified by the theme's gemspec.
|
||||
#
|
||||
# Returns false only if no dependencies have been specified, otherwise nothing.
|
||||
def require_theme_deps
|
||||
return false unless site.theme.runtime_dependencies
|
||||
|
||||
site.theme.runtime_dependencies.each do |dep|
|
||||
next if dep.name == "jekyll"
|
||||
|
||||
External.require_with_graceful_fail(dep.name) if plugin_allowed?(dep.name)
|
||||
end
|
||||
end
|
||||
|
||||
def self.require_from_bundler
|
||||
if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && gemfile_exists?
|
||||
require "bundler"
|
||||
|
||||
Bundler.setup
|
||||
required_gems = Bundler.require(:jekyll_plugins)
|
||||
message = "Required #{required_gems.map(&:name).join(", ")}"
|
||||
Jekyll.logger.debug("PluginManager:", message)
|
||||
ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true"
|
||||
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
# Check for the existence of a Gemfile.
|
||||
#
|
||||
# Returns true if a Gemfile exists in the places bundler will look
|
||||
def self.gemfile_exists?
|
||||
File.file?("Gemfile") || (ENV["BUNDLE_GEMFILE"] && File.file?(ENV["BUNDLE_GEMFILE"]))
|
||||
end
|
||||
|
||||
# Check whether a gem plugin is allowed to be used during this build.
|
||||
#
|
||||
# plugin_name - the name of the plugin
|
||||
#
|
||||
# Returns true if the plugin name is in the whitelist or if the site is not
|
||||
# in safe mode.
|
||||
def plugin_allowed?(plugin_name)
|
||||
!site.safe || whitelist.include?(plugin_name)
|
||||
end
|
||||
|
||||
# Build an array of allowed plugin gem names.
|
||||
#
|
||||
# Returns an array of strings, each string being the name of a gem name
|
||||
# that is allowed to be used.
|
||||
def whitelist
|
||||
@whitelist ||= [site.config["whitelist"]].flatten
|
||||
end
|
||||
|
||||
# Require all .rb files if safe mode is off
|
||||
#
|
||||
# Returns nothing.
|
||||
def require_plugin_files
|
||||
unless site.safe
|
||||
plugins_path.each do |plugin_search_path|
|
||||
plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb"))
|
||||
Jekyll::External.require_with_graceful_fail(plugin_files)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Public: Setup the plugin search path
|
||||
#
|
||||
# Returns an Array of plugin search paths
|
||||
def plugins_path
|
||||
if site.config["plugins_dir"].eql? Jekyll::Configuration::DEFAULTS["plugins_dir"]
|
||||
[site.in_source_dir(site.config["plugins_dir"])]
|
||||
else
|
||||
Array(site.config["plugins_dir"]).map { |d| File.expand_path(d) }
|
||||
end
|
||||
end
|
||||
|
||||
def deprecation_checks
|
||||
pagination_included = (site.config["plugins"] || []).include?("jekyll-paginate") ||
|
||||
defined?(Jekyll::Paginate)
|
||||
if site.config["paginate"] && !pagination_included
|
||||
Jekyll::Deprecator.deprecation_message <<~MSG
|
||||
You appear to have pagination turned on, but you haven't included the `jekyll-paginate`
|
||||
gem. Ensure you have `plugins: [jekyll-paginate]` in your configuration file.
|
||||
MSG
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user