diff --git a/lib/jekyll.rb b/lib/jekyll.rb index d99a3972..f9f787b7 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -45,6 +45,7 @@ require 'jekyll/static_file' require 'jekyll/errors' require 'jekyll/related_posts' require 'jekyll/cleaner' +require 'jekyll/entry_filter' # extensions require 'jekyll/plugin' diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb new file mode 100644 index 00000000..56f3cfc2 --- /dev/null +++ b/lib/jekyll/entry_filter.rb @@ -0,0 +1,35 @@ +class EntryFilter + attr_reader :site + def initialize(site) + @site = site + end + + def filter(entries) + entries.reject do |e| + unless included?(e) + special?(e) || backup?(e) || excluded?(e) || symlink?(e) + end + end + end + + def included?(entry) + site.include.glob_include?(entry) + end + + def special?(entry) + ['.', '_', '#'].include?(entry[0..0]) + end + + def backup?(entry) + entry[-1..-1] == '~' + end + + def excluded?(entry) + site.exclude.glob_include?(entry) + end + + def symlink?(entry) + File.symlink?(entry) && site.safe + end + +end diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index b892a31a..b0dcbb06 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -325,14 +325,7 @@ module Jekyll # # Returns the Array of filtered entries. def filter_entries(entries) - entries.reject do |e| - unless self.include.glob_include?(e) - ['.', '_', '#'].include?(e[0..0]) || - e[-1..-1] == '~' || - self.exclude.glob_include?(e) || - (File.symlink?(e) && self.safe) - end - end + EntryFilter.new(self).filter(entries) end # Get the implementation class for the given Converter. diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb new file mode 100644 index 00000000..c295a57c --- /dev/null +++ b/test/test_entry_filter.rb @@ -0,0 +1,74 @@ +require 'helper' + +class TestEntryFilter < Test::Unit::TestCase + context "Filtering entries" do + setup do + stub(Jekyll).configuration do + Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) + end + @site = Site.new(Jekyll.configuration) + end + + should "filter entries" do + ent1 = %w[foo.markdown bar.markdown baz.markdown #baz.markdown# + .baz.markdow foo.markdown~ .htaccess _posts _pages] + + entries = EntryFilter.new(@site).filter(ent1) + assert_equal %w[foo.markdown bar.markdown baz.markdown .htaccess], entries + end + + should "filter entries with exclude" do + excludes = %w[README TODO] + files = %w[index.html site.css .htaccess] + + @site.exclude = excludes + ["exclude*"] + assert_equal files, @site.filter_entries(excludes + files + ["excludeA"]) + end + + should "not filter entries within include" do + includes = %w[_index.html .htaccess include*] + files = %w[index.html _index.html .htaccess includeA] + + @site.include = includes + assert_equal files, @site.filter_entries(files) + end + + should "filter symlink entries when safe mode enabled" do + stub(Jekyll).configuration do + Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true}) + end + site = Site.new(Jekyll.configuration) + stub(File).symlink?('symlink.js') {true} + files = %w[symlink.js] + assert_equal [], site.filter_entries(files) + end + + should "not filter symlink entries when safe mode disabled" do + stub(File).symlink?('symlink.js') {true} + files = %w[symlink.js] + assert_equal files, @site.filter_entries(files) + end + + should "not include symlinks in safe mode" do + stub(Jekyll).configuration do + Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true}) + end + site = Site.new(Jekyll.configuration) + + site.read_directories("symlink-test") + assert_equal [], site.pages + assert_equal [], site.static_files + end + + should "include symlinks in unsafe mode" do + stub(Jekyll).configuration do + Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => false}) + end + site = Site.new(Jekyll.configuration) + + site.read_directories("symlink-test") + assert_not_equal [], site.pages + assert_not_equal [], site.static_files + end + end +end diff --git a/test/test_site.rb b/test/test_site.rb index 4deb5645..35359a2a 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -179,69 +179,6 @@ class TestSite < Test::Unit::TestCase assert_equal 4, @site.categories['foo'].size end - should "filter entries" do - ent1 = %w[foo.markdown bar.markdown baz.markdown #baz.markdown# - .baz.markdow foo.markdown~] - ent2 = %w[.htaccess _posts _pages bla.bla] - - assert_equal %w[foo.markdown bar.markdown baz.markdown], @site.filter_entries(ent1) - assert_equal %w[.htaccess bla.bla], @site.filter_entries(ent2) - end - - should "filter entries with exclude" do - excludes = %w[README TODO] - files = %w[index.html site.css .htaccess] - - @site.exclude = excludes + ["exclude*"] - assert_equal files, @site.filter_entries(excludes + files + ["excludeA"]) - end - - should "not filter entries within include" do - includes = %w[_index.html .htaccess include*] - files = %w[index.html _index.html .htaccess includeA] - - @site.include = includes - assert_equal files, @site.filter_entries(files) - end - - should "filter symlink entries when safe mode enabled" do - stub(Jekyll).configuration do - Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true}) - end - site = Site.new(Jekyll.configuration) - stub(File).symlink?('symlink.js') {true} - files = %w[symlink.js] - assert_equal [], site.filter_entries(files) - end - - should "not filter symlink entries when safe mode disabled" do - stub(File).symlink?('symlink.js') {true} - files = %w[symlink.js] - assert_equal files, @site.filter_entries(files) - end - - should "not include symlinks in safe mode" do - stub(Jekyll).configuration do - Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true}) - end - site = Site.new(Jekyll.configuration) - - site.read_directories("symlink-test") - assert_equal [], site.pages - assert_equal [], site.static_files - end - - should "include symlinks in unsafe mode" do - stub(Jekyll).configuration do - Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => false}) - end - site = Site.new(Jekyll.configuration) - - site.read_directories("symlink-test") - assert_not_equal [], site.pages - assert_not_equal [], site.static_files - end - context 'error handling' do should "raise if destination is included in source" do stub(Jekyll).configuration do