From f418ea5fc37c459e7871f0da85c2509fa15679c0 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 1 Apr 2014 18:10:51 -0400 Subject: [PATCH 1/4] Extract plugin management into its own class. --- lib/jekyll/plugin_manager.rb | 79 ++++++++++++++++++++++++++++++++++++ lib/jekyll/site.rb | 43 ++------------------ 2 files changed, 82 insertions(+), 40 deletions(-) create mode 100644 lib/jekyll/plugin_manager.rb diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb new file mode 100644 index 00000000..bc9b8955 --- /dev/null +++ b/lib/jekyll/plugin_manager.rb @@ -0,0 +1,79 @@ +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_plugin_files + require_gems + end + + # Require each of the gem plugins specified. + # + # Returns nothing. + def require_gems + site.gems.each do |gem| + if plugin_allowed?(gem) + require gem + end + end + end + + # Check whether a gem plugin is allowed to be used during this build. + # + # gem_name - the name of the gem + # + # Returns true if the gem name is in the whitelist or if the site is not + # in safe mode. + def plugin_allowed?(gem_name) + !site.safe || whitelist.include?(gem_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 ||= Array[site.config['whitelist']].flatten + end + + # Require all .rb files if safe mode is off + # + # Returns nothing. + def require_plugin_files + # If safe mode is off, load in any Ruby files under the plugins + # directory. + unless site.safe + plugins.each do |plugins| + Dir[File.join(plugins, "**", "*.rb")].sort.each do |f| + require f + end + end + end + end + + # Static: Setup the plugin search path + # + # path_from_site - the plugin path from the Site configuration + # + # Returns an Array of plugin search paths + def self.plugins_path(path_from_site) + if (path_from_site == Jekyll::Configuration::DEFAULTS['plugins']) + [File.join(source, path_from_site)] + else + Array(path_from_site).map { |d| File.expand_path(d) } + end + end + end +end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index d909e0fe..1dbd37aa 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -19,7 +19,7 @@ module Jekyll self.source = File.expand_path(config['source']) self.dest = File.expand_path(config['destination']) - self.plugins = plugins_path + self.plugins = Jekyll::PluginManager.plugins_path(config['plugins']) self.permalink_style = config['permalink'].to_sym self.file_read_opts = {} @@ -63,17 +63,7 @@ module Jekyll def setup ensure_not_in_dest - # If safe mode is off, load in any Ruby files under the plugins - # directory. - unless safe - plugins.each do |plugins| - Dir[File.join(plugins, "**/*.rb")].sort.each do |f| - require f - end - end - end - - require_gems + Jekyll::PluginManager.new(self).conscientious_require self.converters = instantiate_subclasses(Jekyll::Converter) self.generators = instantiate_subclasses(Jekyll::Generator) @@ -90,33 +80,6 @@ module Jekyll end end - def require_gems - gems.each do |gem| - if plugin_allowed?(gem) - require gem - end - end - end - - def plugin_allowed?(gem_name) - whitelist.include?(gem_name) || !safe - end - - def whitelist - @whitelist ||= Array[config['whitelist']].flatten - end - - # Internal: Setup the plugin search path - # - # Returns an Array of plugin search paths - def plugins_path - if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins']) - [File.join(source, config['plugins'])] - else - Array(config['plugins']).map { |d| File.expand_path(d) } - end - end - # Read Site data from disk and load it into internal data structures. # # Returns nothing. @@ -307,7 +270,7 @@ module Jekyll # See Site#post_attr_hash for type info. def site_payload {"jekyll" => { "version" => Jekyll::VERSION }, - "site" => config.merge({ + "site" => config.merge({ "time" => time, "posts" => posts.sort { |a, b| b <=> a }, "pages" => pages, From 5d761a1c2b2c9a67a580321be293cd81af698c21 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 1 Apr 2014 18:44:37 -0400 Subject: [PATCH 2/4] Require 'plugin_manager' in lib/jekyll.rb --- lib/jekyll.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 90147ac3..604ff238 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -34,6 +34,7 @@ require 'jekyll/utils' require 'jekyll/stevenson' require 'jekyll/deprecator' require 'jekyll/configuration' +require 'jekyll/plugin_manager' require 'jekyll/site' require 'jekyll/convertible' require 'jekyll/url' From 4a4c8846f45e9d584aff7da1605b9cee5a7205b9 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Apr 2014 21:59:15 -0400 Subject: [PATCH 3/4] Fetching/determining the plugin path is beyond this it's kind of sad. --- lib/jekyll/plugin_manager.rb | 14 +------------- lib/jekyll/site.rb | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index bc9b8955..6050075b 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -55,7 +55,7 @@ module Jekyll # If safe mode is off, load in any Ruby files under the plugins # directory. unless site.safe - plugins.each do |plugins| + site.plugins.each do |plugins| Dir[File.join(plugins, "**", "*.rb")].sort.each do |f| require f end @@ -63,17 +63,5 @@ module Jekyll end end - # Static: Setup the plugin search path - # - # path_from_site - the plugin path from the Site configuration - # - # Returns an Array of plugin search paths - def self.plugins_path(path_from_site) - if (path_from_site == Jekyll::Configuration::DEFAULTS['plugins']) - [File.join(source, path_from_site)] - else - Array(path_from_site).map { |d| File.expand_path(d) } - end - end end end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 1dbd37aa..59af4162 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -19,7 +19,7 @@ module Jekyll self.source = File.expand_path(config['source']) self.dest = File.expand_path(config['destination']) - self.plugins = Jekyll::PluginManager.plugins_path(config['plugins']) + self.plugins = plugins_path(config['plugins']) self.permalink_style = config['permalink'].to_sym self.file_read_opts = {} @@ -80,6 +80,19 @@ module Jekyll end end + # Public: Setup the plugin search path + # + # path_from_site - the plugin path from the Site configuration + # + # Returns an Array of plugin search paths + def plugins_path(path_from_site) + if (path_from_site == Jekyll::Configuration::DEFAULTS['plugins']) + [Jekyll.sanitized_path(source, path_from_site)] + else + Array(path_from_site).map { |d| File.expand_path(d) } + end + end + # Read Site data from disk and load it into internal data structures. # # Returns nothing. From 1863057b7e22f777ac538b5fa14bba6d359fbac8 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Wed, 2 Apr 2014 22:06:38 -0400 Subject: [PATCH 4/4] Ok handle the plugins_path stuff in the PluginManager. --- lib/jekyll/plugin_manager.rb | 15 ++++++++++++--- lib/jekyll/site.rb | 22 ++++++---------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 6050075b..7b817e38 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -52,10 +52,8 @@ module Jekyll # # Returns nothing. def require_plugin_files - # If safe mode is off, load in any Ruby files under the plugins - # directory. unless site.safe - site.plugins.each do |plugins| + plugins_path.each do |plugins| Dir[File.join(plugins, "**", "*.rb")].sort.each do |f| require f end @@ -63,5 +61,16 @@ module Jekyll end end + # Public: Setup the plugin search path + # + # Returns an Array of plugin search paths + def plugins_path + if (site.config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins']) + [Jekyll.sanitized_path(site.source, site.config['plugins'])] + else + Array(site.config['plugins']).map { |d| File.expand_path(d) } + end + end + end end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index 59af4162..0e7ddac3 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -3,7 +3,8 @@ module Jekyll attr_accessor :config, :layouts, :posts, :pages, :static_files, :exclude, :include, :source, :dest, :lsi, :highlighter, :permalink_style, :time, :future, :safe, :plugins, :limit_posts, - :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems + :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems, + :plugin_manager attr_accessor :converters, :generators @@ -19,9 +20,11 @@ module Jekyll self.source = File.expand_path(config['source']) self.dest = File.expand_path(config['destination']) - self.plugins = plugins_path(config['plugins']) self.permalink_style = config['permalink'].to_sym + self.plugin_manager = Jekyll::PluginManager.new(self) + self.plugins = plugin_manager.plugins_path + self.file_read_opts = {} self.file_read_opts[:encoding] = config['encoding'] if config['encoding'] @@ -63,7 +66,7 @@ module Jekyll def setup ensure_not_in_dest - Jekyll::PluginManager.new(self).conscientious_require + plugin_manager.conscientious_require self.converters = instantiate_subclasses(Jekyll::Converter) self.generators = instantiate_subclasses(Jekyll::Generator) @@ -80,19 +83,6 @@ module Jekyll end end - # Public: Setup the plugin search path - # - # path_from_site - the plugin path from the Site configuration - # - # Returns an Array of plugin search paths - def plugins_path(path_from_site) - if (path_from_site == Jekyll::Configuration::DEFAULTS['plugins']) - [Jekyll.sanitized_path(source, path_from_site)] - else - Array(path_from_site).map { |d| File.expand_path(d) } - end - end - # Read Site data from disk and load it into internal data structures. # # Returns nothing.