From c2d2f3dc6644bfa2ea79d3e9b2c82a0f2e2b68d8 Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Thu, 14 Feb 2019 19:46:17 +0000 Subject: [PATCH 01/26] create a feed for each tag, so far it's empty, but baby steps --- .rubocop.yml | 4 ++++ lib/jekyll-feed/generator.rb | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index 08ae1f2b..d8d31cf1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -25,3 +25,7 @@ AllCops: Naming/MemoizedInstanceVariableName: Exclude: - lib/jekyll-feed/page-without-a-file.rb + +Metrics/AbcSize: + Exclude: + - lib/jekyll-feed/generator.rb diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb index 13684056..9b01bfd2 100644 --- a/lib/jekyll-feed/generator.rb +++ b/lib/jekyll-feed/generator.rb @@ -17,6 +17,13 @@ def generate(site) @site.pages << make_page(path, :collection => name, :category => category) end end + @site.tags.each do |tag, _meta| + Jekyll.logger.info "Jekyll Feed:", "testing #{tag}" + path = feed_path(:collection => "by_tag", :category => tag) + next if file_exists?(path) + + @site.pages << make_page(path, :collection => "posts", :category => tag) + end end private From a5d58818ff0620487a67b3382485e270923230fb Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Sat, 16 Feb 2019 10:57:34 +0000 Subject: [PATCH 02/26] include logic to have inclusions or exclusions, and override default path --- .rubocop.yml | 2 ++ lib/jekyll-feed/generator.rb | 54 ++++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index d8d31cf1..96ecb164 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -22,6 +22,8 @@ AllCops: - script/**/* - vendor/**/* + - lib/jekyll-feed/generator.rb + Naming/MemoizedInstanceVariableName: Exclude: - lib/jekyll-feed/page-without-a-file.rb diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb index 9b01bfd2..16c86ba5 100644 --- a/lib/jekyll-feed/generator.rb +++ b/lib/jekyll-feed/generator.rb @@ -17,12 +17,56 @@ def generate(site) @site.pages << make_page(path, :collection => name, :category => category) end end - @site.tags.each do |tag, _meta| - Jekyll.logger.info "Jekyll Feed:", "testing #{tag}" - path = feed_path(:collection => "by_tag", :category => tag) - next if file_exists?(path) + tags + end - @site.pages << make_page(path, :collection => "posts", :category => tag) + def tags + @config = config + @config.each do |name, data| + if name.match("tags") + includes = [] + tags_path = "feed/by_tag/" + excludes = [] + unless data.nil? + data.each do |name, content| + case name + when "path" + tags_path = content + when "includes" + content.each do |include| + includes.push(include) + end + when "excludes" + content.each do |exclude| + excludes.push(exclude) + end + end + end + end + Jekyll.logger.info tags_path + unless includes.empty? + includes.each do |include| + unless excludes.include? include + Jekyll.logger.info include + Jekyll.logger.info "Jekyll Feed:", "We should Generate a feed for #{include}" + path = "#{tags_path}#{include}.xml" + next if file_exists?(path) + + @site.pages << make_page(path, :collection => "posts", :category => include) + end + end + else + @site.tags.each do |tag, _meta| + unless excludes.include? tag + Jekyll.logger.info "Jekyll Feed:", "testing #{tag}" + path = "#{tags_path}#{tag}.xml" + next if file_exists?(path) + + @site.pages << make_page(path, :collection => "posts", :category => tag) + end + end + end + end end end From 0bb481c0468c96240ddb3b672468a0b699f17577 Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Sun, 17 Feb 2019 10:53:06 +0000 Subject: [PATCH 03/26] works to build tag feeds but generates warnings that need tracking down --- lib/jekyll-feed/feed.xml | 7 ++++++- lib/jekyll-feed/generator.rb | 15 +++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/jekyll-feed/feed.xml b/lib/jekyll-feed/feed.xml index cf9f9ed4..d8d9e7e0 100644 --- a/lib/jekyll-feed/feed.xml +++ b/lib/jekyll-feed/feed.xml @@ -39,7 +39,12 @@ {% endif %} - {% assign posts = site[page.collection] | where_exp: "post", "post.draft != true" | sort: "date" | reverse %} + {% if page.tag %} + {% assign entries = site.tags.[page.tag] %} + {% else %} + {% assign entries = site[page.collection] %} + {% endif %} + {% assign posts = entries | where_exp: "post", "post.draft != true" | sort: "date" | reverse %} {% if page.category %} {% assign posts = posts | where: "category",page.category %} {% endif %} diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb index 16c86ba5..2ebd3ecf 100644 --- a/lib/jekyll-feed/generator.rb +++ b/lib/jekyll-feed/generator.rb @@ -43,26 +43,24 @@ def tags end end end - Jekyll.logger.info tags_path unless includes.empty? includes.each do |include| unless excludes.include? include - Jekyll.logger.info include - Jekyll.logger.info "Jekyll Feed:", "We should Generate a feed for #{include}" + Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{include}" path = "#{tags_path}#{include}.xml" next if file_exists?(path) - @site.pages << make_page(path, :collection => "posts", :category => include) + @site.pages << make_page(path, :collection => "posts", :tag => include) end end else @site.tags.each do |tag, _meta| unless excludes.include? tag - Jekyll.logger.info "Jekyll Feed:", "testing #{tag}" + Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}" path = "#{tags_path}#{tag}.xml" next if file_exists?(path) - @site.pages << make_page(path, :collection => "posts", :category => tag) + @site.pages << make_page(path, :collection => "posts", :tag => tag) end end end @@ -136,7 +134,7 @@ def file_exists?(file_path) # Generates contents for a file - def make_page(file_path, collection: "posts", category: nil) + def make_page(file_path, collection: "posts", category: nil, tag: nil) PageWithoutAFile.new(@site, __dir__, "", file_path).tap do |file| file.content = feed_template file.data.merge!( @@ -144,7 +142,8 @@ def make_page(file_path, collection: "posts", category: nil) "sitemap" => false, "xsl" => file_exists?("feed.xslt.xml"), "collection" => collection, - "category" => category + "category" => category, + "tag" => tag ) file.output end From 223343befe3fca1f232b6421ea179b02b82470f3 Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Sun, 17 Feb 2019 17:54:51 +0000 Subject: [PATCH 04/26] minor style tweaks and add instructions to README --- README.md | 39 ++++++++++++++++++++++++++++++++++++ lib/jekyll-feed/generator.rb | 6 +++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 84d68634..32b4314e 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,45 @@ feed: - updates ``` +## Tags + +To automatically generate feeds for each tag you apply to your posts you can add a tags setting to your config: + +```yml +feed: + tags: +``` + +If there are tags you don't want included in this auto generation you can exclude them + +```yml +feed: + tags: + excludes: + - tag-to-exclude + - another-tag +``` + +If you wish to change the location of these auto generated feeds (`/feed/by_tag/.xml` by default) you can provide an alternative folder for them to live in. + +```yml +feed: + tags: + path: "alternative/path/for/tags/feeds/" +``` + +If you only want to generate feeds for a few tags you can also set this. + +```yml +feed: + tags: + includes: + - tag-to-include + - another-tag +``` + +Note that if you include a tag that is excluded a feed will not be generated for it. + ## Contributing 1. Fork it (https://github.com/jekyll/jekyll-feed/fork) diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb index 2ebd3ecf..70881cd7 100644 --- a/lib/jekyll-feed/generator.rb +++ b/lib/jekyll-feed/generator.rb @@ -28,8 +28,8 @@ def tags tags_path = "feed/by_tag/" excludes = [] unless data.nil? - data.each do |name, content| - case name + data.each do |setting, content| + case setting when "path" tags_path = content when "includes" @@ -43,7 +43,7 @@ def tags end end end - unless includes.empty? + unless includes.empty? includes.each do |include| unless excludes.include? include Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{include}" From d2d31d73cc14eb26cf3d8e71d2536b13ba9a48ba Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Sun, 17 Feb 2019 17:55:30 +0000 Subject: [PATCH 05/26] remove rubocop exclusions --- .rubocop.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 96ecb164..08ae1f2b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -22,12 +22,6 @@ AllCops: - script/**/* - vendor/**/* - - lib/jekyll-feed/generator.rb - Naming/MemoizedInstanceVariableName: Exclude: - lib/jekyll-feed/page-without-a-file.rb - -Metrics/AbcSize: - Exclude: - - lib/jekyll-feed/generator.rb From 89eb58aeb869fb711a07f5f8b691bbcdc7bbac26 Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Sun, 17 Feb 2019 18:09:40 +0000 Subject: [PATCH 06/26] use rubocop to fix some styling errors, and correct it's mistakes --- lib/jekyll-feed/generator.rb | 74 ++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb index 70881cd7..8b8faac7 100644 --- a/lib/jekyll-feed/generator.rb +++ b/lib/jekyll-feed/generator.rb @@ -23,48 +23,46 @@ def generate(site) def tags @config = config @config.each do |name, data| - if name.match("tags") - includes = [] - tags_path = "feed/by_tag/" - excludes = [] - unless data.nil? - data.each do |setting, content| - case setting - when "path" - tags_path = content - when "includes" - content.each do |include| - includes.push(include) - end - when "excludes" - content.each do |exclude| - excludes.push(exclude) - end - end + next unless name.match("tags") + + includes = [] + tags_path = "feed/by_tag/" + excludes = [] + data&.each do |setting, content| + case setting + when "path" + tags_path = content + when "includes" + content.each do |include| + includes.push(include) end - end - unless includes.empty? - includes.each do |include| - unless excludes.include? include - Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{include}" - path = "#{tags_path}#{include}.xml" - next if file_exists?(path) - - @site.pages << make_page(path, :collection => "posts", :tag => include) - end - end - else - @site.tags.each do |tag, _meta| - unless excludes.include? tag - Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}" - path = "#{tags_path}#{tag}.xml" - next if file_exists?(path) - - @site.pages << make_page(path, :collection => "posts", :tag => tag) - end + when "excludes" + content.each do |exclude| + excludes.push(exclude) end end end + if includes.empty? + @site.tags.each do |tag, _meta| + next if excludes.include? tag + + Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}" + path = "#{tags_path}#{tag}.xml" + next if file_exists?(path) + + @site.pages << make_page(path, :collection => "posts", :tag => tag) + end + else + includes.each do |include| + next if excludes.include? include + + Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{include}" + path = "#{tags_path}#{include}.xml" + next if file_exists?(path) + + @site.pages << make_page(path, :collection => "posts", :tag => include) + end + end end end From 7601bc6f78ffa35d08f8d918b7e544a515be2107 Mon Sep 17 00:00:00 2001 From: Craig Stewart Date: Mon, 18 Feb 2019 20:50:49 +0000 Subject: [PATCH 07/26] set some tags and use these to make tests for tag feeds --- .../_posts/2013-12-12-dec-the-second.md | 2 + .../_posts/2014-03-02-march-the-second.md | 2 + .../_posts/2014-03-04-march-the-fourth.md | 1 + .../2015-01-18-jekyll-last-modified-at.md | 3 + spec/fixtures/_posts/2015-05-12-pre.html | 2 + .../_posts/2015-05-18-author-detail.md | 3 + .../2015-08-08-stuck-in-the-middle.html | 3 + spec/jekyll-feed_spec.rb | 98 +++++++++++++++++++ 8 files changed, 114 insertions(+) diff --git a/spec/fixtures/_posts/2013-12-12-dec-the-second.md b/spec/fixtures/_posts/2013-12-12-dec-the-second.md index 13b97917..265eaf22 100644 --- a/spec/fixtures/_posts/2013-12-12-dec-the-second.md +++ b/spec/fixtures/_posts/2013-12-12-dec-the-second.md @@ -2,6 +2,8 @@ excerpt: "Foo" image: "/image.png" category: news +tags: + - test --- # December the twelfth, actually. diff --git a/spec/fixtures/_posts/2014-03-02-march-the-second.md b/spec/fixtures/_posts/2014-03-02-march-the-second.md index e33a699d..a74e1b5a 100644 --- a/spec/fixtures/_posts/2014-03-02-march-the-second.md +++ b/spec/fixtures/_posts/2014-03-02-march-the-second.md @@ -1,6 +1,8 @@ --- image: https://cdn.example.org/absolute.png?h=188&w=250 category: news +tags: + - test --- March the second! diff --git a/spec/fixtures/_posts/2014-03-04-march-the-fourth.md b/spec/fixtures/_posts/2014-03-04-march-the-fourth.md index 2401ecc3..f2024599 100644 --- a/spec/fixtures/_posts/2014-03-04-march-the-fourth.md +++ b/spec/fixtures/_posts/2014-03-04-march-the-fourth.md @@ -1,6 +1,7 @@ --- tags: - '"/>' + - test image: path: "/object-image.png" category: updates diff --git a/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md b/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md index f032a1bc..706ad1fd 100644 --- a/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md +++ b/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md @@ -1,5 +1,8 @@ --- last_modified_at: 2015-05-12T13:27:59+00:00 +tags: + - test + - fail --- Please don't modify this file. It's modified time is important. diff --git a/spec/fixtures/_posts/2015-05-12-pre.html b/spec/fixtures/_posts/2015-05-12-pre.html index 42b54b59..2c2a60ff 100644 --- a/spec/fixtures/_posts/2015-05-12-pre.html +++ b/spec/fixtures/_posts/2015-05-12-pre.html @@ -1,6 +1,8 @@ --- author: Pat lang: en +tags: + - test ---
Line 1
diff --git a/spec/fixtures/_posts/2015-05-18-author-detail.md b/spec/fixtures/_posts/2015-05-18-author-detail.md
index c4c42bd3..db50bb0e 100644
--- a/spec/fixtures/_posts/2015-05-18-author-detail.md
+++ b/spec/fixtures/_posts/2015-05-18-author-detail.md
@@ -4,6 +4,9 @@ author:
   name: Ben
   uri: "http://ben.balter.com"
   email: ben@example.com
+tags:
+ - test
+ - success
 ---
 
 # December the twelfth, actually.
diff --git a/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html b/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html
index a845151c..ae7d72cf 100644
--- a/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html
+++ b/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html
@@ -1,2 +1,5 @@
 ---
+tags:
+ - test
+ - fail
 ---
diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index 1a8cc5c7..dfa4f1d2 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -470,4 +470,102 @@
       end
     end
   end
+
+  context "tags" do
+    let(:tags_feed_test) { File.read(dest_dir("feed/by_tag/test.xml")) }
+    let(:tags_feed_fail) { File.read(dest_dir("feed/by_tag/fail.xml")) }
+    let(:tags_feed_success) { File.read(dest_dir("feed/by_tag/success.xml")) }
+
+    let(:overrides) do
+      {
+        "feed" => {
+          "tags" => {}
+        },
+      }
+    end
+
+    it "should write tags feeds" do
+      expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to exist
+      expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to exist
+      expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to exist
+      expect(tags_feed_test).to match "/2013/12/12/dec-the-second.html"
+      expect(tags_feed_test).to match "/2014/03/02/march-the-second.html"
+      expect(tags_feed_test).to match "/2014/03/04/march-the-fourth.html"
+      expect(tags_feed_test).to match "/2015/01/18/jekyll-last-modified-at.html"
+      expect(tags_feed_test).to match "/2015/05/12/pre.html"
+      expect(tags_feed_test).to match "/2015/05/18/author-detail.html"
+      expect(tags_feed_test).to match "/2015/08/08/stuck-in-the-middle.html"
+      expect(tags_feed_fail).to_not match "/2013/12/12/dec-the-second.html"
+      expect(tags_feed_fail).to_not match "/2014/03/02/march-the-second.html"
+      expect(tags_feed_fail).to_not match "/2014/03/04/march-the-fourth.html"
+      expect(tags_feed_fail).to_not match "/2015/05/12/pre.html"
+      expect(tags_feed_fail).to_not match "/2015/05/18/author-detail.html"
+      expect(tags_feed_success).to_not match "/2013/12/12/dec-the-second.html"
+      expect(tags_feed_success).to_not match "/2014/03/02/march-the-second.html"
+      expect(tags_feed_success).to_not match "/2014/03/04/march-the-fourth.html"
+      expect(tags_feed_success).to_not match "/2015/01/18/jekyll-last-modified-at.html"
+      expect(tags_feed_success).to_not match "/2015/05/12/pre.html"
+      expect(tags_feed_success).to_not match "/2015/08/08/stuck-in-the-middle.html"
+      expect(tags_feed_fail).to match "/2015/01/18/jekyll-last-modified-at.html"
+      expect(tags_feed_fail).to match "/2015/08/08/stuck-in-the-middle.html"
+      expect(tags_feed_success).to match "2015/05/18/author-detail.html"
+    end
+
+    context "set exclusions" do
+      let(:overrides) do
+        {
+          "feed" => {
+            "tags" => {
+              "excludes" => [ "fail" ]
+            },
+          },
+        }
+      end
+
+      it "should not write fail feed" do
+        expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to exist
+        expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to exist
+      end
+    end
+
+    context "set inclusions" do
+      let(:overrides) do
+        {
+          "feed" => {
+            "tags" => {
+              "includes" => [ "success" ]
+            },
+          },
+        }
+      end
+
+      it "should not write fail feed" do
+        expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to exist
+      end
+    end
+
+    context "set alternate path" do
+      let(:overrides) do
+        {
+          "feed" => {
+            "tags" => {
+              "path" => "alternate/path/"
+            },
+          },
+        }
+      end
+
+      it "should not write fail feed" do
+        expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("alternate/path/test.xml"))).to exist
+        expect(Pathname.new(dest_dir("alternate/path/fail.xml"))).to exist
+        expect(Pathname.new(dest_dir("alternate/path/success.xml"))).to exist
+      end
+    end
+  end
 end

From ee59d9e47e7f7d15607ae8561796674337f1e7ce Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 18 Feb 2019 21:08:55 +0000
Subject: [PATCH 08/26] refactor to reduce rubocop errors

---
 lib/jekyll-feed/generator.rb | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index 8b8faac7..b45d12f6 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -44,28 +44,26 @@ def tags
         end
         if includes.empty?
           @site.tags.each do |tag, _meta|
-            next if excludes.include? tag
-
-            Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
-            path = "#{tags_path}#{tag}.xml"
-            next if file_exists?(path)
-
-            @site.pages << make_page(path, :collection => "posts", :tag => tag)
+            build_tags_feed(tags_path, tag, excludes)
           end
         else
           includes.each do |include|
-            next if excludes.include? include
-
-            Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{include}"
-            path = "#{tags_path}#{include}.xml"
-            next if file_exists?(path)
-
-            @site.pages << make_page(path, :collection => "posts", :tag => include)
+            build_tags_feed(tags_path, include, excludes)
           end
         end
       end
     end
 
+    def build_tags_feed(tags_path, tag, excludes)
+      unless excludes.include? tag
+        Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
+        path = "#{tags_path}#{tag}.xml"
+        unless file_exists?(path)
+          @site.pages << make_page(path, :collection => "posts", :tag => tag)
+        end
+      end
+    end
+
     private
 
     # Matches all whitespace that follows

From c60d01e7f51c0a5a895e6ef94007a4a8cbc71662 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 18 Feb 2019 21:20:19 +0000
Subject: [PATCH 09/26] change match to equivilency check to apease rubocop

---
 lib/jekyll-feed/generator.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index b45d12f6..e564bb9f 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -23,7 +23,7 @@ def generate(site)
     def tags
       @config = config
       @config.each do |name, data|
-        next unless name.match("tags")
+        next unless name == "tags"
 
         includes = []
         tags_path = "feed/by_tag/"

From f74c32ffd1d8b57f4d535f008ac5015acd1dffce Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 18 Feb 2019 21:24:51 +0000
Subject: [PATCH 10/26] move stuff out of logice block it doesn't need to live
 in

---
 lib/jekyll-feed/generator.rb | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index e564bb9f..48738962 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -22,12 +22,12 @@ def generate(site)
 
     def tags
       @config = config
+      includes = []
+      tags_path = "feed/by_tag/"
+      excludes = []
       @config.each do |name, data|
         next unless name == "tags"
 
-        includes = []
-        tags_path = "feed/by_tag/"
-        excludes = []
         data&.each do |setting, content|
           case setting
           when "path"
@@ -42,14 +42,14 @@ def tags
             end
           end
         end
-        if includes.empty?
-          @site.tags.each do |tag, _meta|
-            build_tags_feed(tags_path, tag, excludes)
-          end
-        else
-          includes.each do |include|
-            build_tags_feed(tags_path, include, excludes)
-          end
+      end
+      if includes.empty?
+        @site.tags.each do |tag, _meta|
+          build_tags_feed(tags_path, tag, excludes)
+        end
+      else
+        includes.each do |include|
+          build_tags_feed(tags_path, include, excludes)
         end
       end
     end

From e622a6f48cf37d37d89fadabdba68c0e5245aee4 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 18 Feb 2019 22:28:43 +0000
Subject: [PATCH 11/26] add tests for not setting tags so not building those
 feeds

---
 lib/jekyll-feed/generator.rb | 52 ++++++++++++-------------
 spec/jekyll-feed_spec.rb     | 73 +++++++++++++++++++++---------------
 2 files changed, 66 insertions(+), 59 deletions(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index 48738962..a2b824f8 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -25,41 +25,37 @@ def tags
       includes = []
       tags_path = "feed/by_tag/"
       excludes = []
-      @config.each do |name, data|
-        next unless name == "tags"
-
-        data&.each do |setting, content|
-          case setting
-          when "path"
-            tags_path = content
-          when "includes"
-            content.each do |include|
-              includes.push(include)
-            end
-          when "excludes"
-            content.each do |exclude|
-              excludes.push(exclude)
-            end
+      if @config["tags"]
+        if @config["tags"]["path"]
+          tags_path = @config["tags"]["path"]
+        end
+        if @config["tags"]["excludes"]
+          @config["tags"]["excludes"].each do |exclude|
+            excludes.push(exclude)
           end
         end
-      end
-      if includes.empty?
-        @site.tags.each do |tag, _meta|
-          build_tags_feed(tags_path, tag, excludes)
+        if @config["tags"]["includes"]
+          @config["tags"]["includes"].each do |include|
+            includes.push(include)
+          end
         end
-      else
-        includes.each do |include|
-          build_tags_feed(tags_path, include, excludes)
+        if includes.empty?
+          @site.tags.each do |tag, _meta|
+            includes.push(tag)
+          end
         end
+        build_tags_feeds(tags_path, includes, excludes)
       end
     end
 
-    def build_tags_feed(tags_path, tag, excludes)
-      unless excludes.include? tag
-        Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
-        path = "#{tags_path}#{tag}.xml"
-        unless file_exists?(path)
-          @site.pages << make_page(path, :collection => "posts", :tag => tag)
+    def build_tags_feeds(tags_path, includes, excludes)
+      includes.each do |tag|
+        unless excludes.include? tag
+          Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
+          path = "#{tags_path}#{tag}.xml"
+          unless file_exists?(path)
+            @site.pages << make_page(path, :collection => "posts", :tag => tag)
+          end
         end
       end
     end
diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index dfa4f1d2..f76842b4 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -476,39 +476,50 @@
     let(:tags_feed_fail) { File.read(dest_dir("feed/by_tag/fail.xml")) }
     let(:tags_feed_success) { File.read(dest_dir("feed/by_tag/success.xml")) }
 
-    let(:overrides) do
-      {
-        "feed" => {
-          "tags" => {}
-        },
-      }
+    context "do not set tags setting" do
+      it "should not write tags feeds" do
+        expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to_not exist
+        expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to_not exist
+      end
     end
 
-    it "should write tags feeds" do
-      expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to exist
-      expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to exist
-      expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to exist
-      expect(tags_feed_test).to match "/2013/12/12/dec-the-second.html"
-      expect(tags_feed_test).to match "/2014/03/02/march-the-second.html"
-      expect(tags_feed_test).to match "/2014/03/04/march-the-fourth.html"
-      expect(tags_feed_test).to match "/2015/01/18/jekyll-last-modified-at.html"
-      expect(tags_feed_test).to match "/2015/05/12/pre.html"
-      expect(tags_feed_test).to match "/2015/05/18/author-detail.html"
-      expect(tags_feed_test).to match "/2015/08/08/stuck-in-the-middle.html"
-      expect(tags_feed_fail).to_not match "/2013/12/12/dec-the-second.html"
-      expect(tags_feed_fail).to_not match "/2014/03/02/march-the-second.html"
-      expect(tags_feed_fail).to_not match "/2014/03/04/march-the-fourth.html"
-      expect(tags_feed_fail).to_not match "/2015/05/12/pre.html"
-      expect(tags_feed_fail).to_not match "/2015/05/18/author-detail.html"
-      expect(tags_feed_success).to_not match "/2013/12/12/dec-the-second.html"
-      expect(tags_feed_success).to_not match "/2014/03/02/march-the-second.html"
-      expect(tags_feed_success).to_not match "/2014/03/04/march-the-fourth.html"
-      expect(tags_feed_success).to_not match "/2015/01/18/jekyll-last-modified-at.html"
-      expect(tags_feed_success).to_not match "/2015/05/12/pre.html"
-      expect(tags_feed_success).to_not match "/2015/08/08/stuck-in-the-middle.html"
-      expect(tags_feed_fail).to match "/2015/01/18/jekyll-last-modified-at.html"
-      expect(tags_feed_fail).to match "/2015/08/08/stuck-in-the-middle.html"
-      expect(tags_feed_success).to match "2015/05/18/author-detail.html"
+
+    context "set tags setting" do
+      let(:overrides) do
+        {
+          "feed" => {
+            "tags" => {}
+          },
+        }
+      end
+
+      it "should write tags feeds" do
+        expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to exist
+        expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to exist
+        expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to exist
+        expect(tags_feed_test).to match "/2013/12/12/dec-the-second.html"
+        expect(tags_feed_test).to match "/2014/03/02/march-the-second.html"
+        expect(tags_feed_test).to match "/2014/03/04/march-the-fourth.html"
+        expect(tags_feed_test).to match "/2015/01/18/jekyll-last-modified-at.html"
+        expect(tags_feed_test).to match "/2015/05/12/pre.html"
+        expect(tags_feed_test).to match "/2015/05/18/author-detail.html"
+        expect(tags_feed_test).to match "/2015/08/08/stuck-in-the-middle.html"
+        expect(tags_feed_fail).to_not match "/2013/12/12/dec-the-second.html"
+        expect(tags_feed_fail).to_not match "/2014/03/02/march-the-second.html"
+        expect(tags_feed_fail).to_not match "/2014/03/04/march-the-fourth.html"
+        expect(tags_feed_fail).to_not match "/2015/05/12/pre.html"
+        expect(tags_feed_fail).to_not match "/2015/05/18/author-detail.html"
+        expect(tags_feed_success).to_not match "/2013/12/12/dec-the-second.html"
+        expect(tags_feed_success).to_not match "/2014/03/02/march-the-second.html"
+        expect(tags_feed_success).to_not match "/2014/03/04/march-the-fourth.html"
+        expect(tags_feed_success).to_not match "/2015/01/18/jekyll-last-modified-at.html"
+        expect(tags_feed_success).to_not match "/2015/05/12/pre.html"
+        expect(tags_feed_success).to_not match "/2015/08/08/stuck-in-the-middle.html"
+        expect(tags_feed_fail).to match "/2015/01/18/jekyll-last-modified-at.html"
+        expect(tags_feed_fail).to match "/2015/08/08/stuck-in-the-middle.html"
+        expect(tags_feed_success).to match "2015/05/18/author-detail.html"
+      end
     end
 
     context "set exclusions" do

From 8db0621a77293ad7d9c67f32b069f8636c9af01b Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 18 Feb 2019 22:33:29 +0000
Subject: [PATCH 12/26] rubocop auto correct

---
 lib/jekyll-feed/generator.rb | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index a2b824f8..2c454c90 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -26,18 +26,12 @@ def tags
       tags_path = "feed/by_tag/"
       excludes = []
       if @config["tags"]
-        if @config["tags"]["path"]
-          tags_path = @config["tags"]["path"]
+        tags_path = @config["tags"]["path"] if @config["tags"]["path"]
+        @config["tags"]["excludes"]&.each do |exclude|
+          excludes.push(exclude)
         end
-        if @config["tags"]["excludes"]
-          @config["tags"]["excludes"].each do |exclude|
-            excludes.push(exclude)
-          end
-        end
-        if @config["tags"]["includes"]
-          @config["tags"]["includes"].each do |include|
-            includes.push(include)
-          end
+        @config["tags"]["includes"]&.each do |include|
+          includes.push(include)
         end
         if includes.empty?
           @site.tags.each do |tag, _meta|
@@ -50,12 +44,12 @@ def tags
 
     def build_tags_feeds(tags_path, includes, excludes)
       includes.each do |tag|
-        unless excludes.include? tag
-          Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
-          path = "#{tags_path}#{tag}.xml"
-          unless file_exists?(path)
-            @site.pages << make_page(path, :collection => "posts", :tag => tag)
-          end
+        next if excludes.include? tag
+
+        Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
+        path = "#{tags_path}#{tag}.xml"
+        unless file_exists?(path)
+          @site.pages << make_page(path, :collection => "posts", :tag => tag)
         end
       end
     end

From 6a7bd531a10848f2d549b71e1b85743fa4dee8c2 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 18 Feb 2019 22:40:37 +0000
Subject: [PATCH 13/26] remove extra . that cause liquid syntax warnings

---
 lib/jekyll-feed/feed.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/jekyll-feed/feed.xml b/lib/jekyll-feed/feed.xml
index d8d9e7e0..aa45e8cc 100644
--- a/lib/jekyll-feed/feed.xml
+++ b/lib/jekyll-feed/feed.xml
@@ -40,7 +40,7 @@
   {% endif %}
 
   {% if page.tag %}
-    {% assign entries = site.tags.[page.tag] %}
+    {% assign entries = site.tags[page.tag] %}
   {% else %}
     {% assign entries = site[page.collection] %}
   {% endif %}

From 5f7d27ac2a2a88c56fd5686f0724e61c00736562 Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Tue, 19 Feb 2019 10:34:21 +0530
Subject: [PATCH 14/26] refactor to simplify logic

---
 lib/jekyll-feed/generator.rb | 56 ++++++++++++++----------------------
 1 file changed, 21 insertions(+), 35 deletions(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index 2c454c90..d38564b3 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -17,41 +17,7 @@ def generate(site)
           @site.pages << make_page(path, :collection => name, :category => category)
         end
       end
-      tags
-    end
-
-    def tags
-      @config = config
-      includes = []
-      tags_path = "feed/by_tag/"
-      excludes = []
-      if @config["tags"]
-        tags_path = @config["tags"]["path"] if @config["tags"]["path"]
-        @config["tags"]["excludes"]&.each do |exclude|
-          excludes.push(exclude)
-        end
-        @config["tags"]["includes"]&.each do |include|
-          includes.push(include)
-        end
-        if includes.empty?
-          @site.tags.each do |tag, _meta|
-            includes.push(tag)
-          end
-        end
-        build_tags_feeds(tags_path, includes, excludes)
-      end
-    end
-
-    def build_tags_feeds(tags_path, includes, excludes)
-      includes.each do |tag|
-        next if excludes.include? tag
-
-        Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
-        path = "#{tags_path}#{tag}.xml"
-        unless file_exists?(path)
-          @site.pages << make_page(path, :collection => "posts", :tag => tag)
-        end
-      end
+      generate_feed_by_tag if config["tags"] && !@site.tags.empty?
     end
 
     private
@@ -104,6 +70,26 @@ def collections
       @collections
     end
 
+    def generate_feed_by_tag
+      tags_config = config["tags"]
+
+      excludes  = tags_config["excludes"] || []
+      includes  = tags_config["includes"] || @site.tags.keys
+      tags_pool = includes - excludes
+      tags_path = tags_config["path"] || "/feed/by_tag/"
+
+      tags_pool.each do |tag|
+        # allow only tags with alphanumeric non-ASCII characters
+        next if tag =~ %r![^a-zA-Z0-9_]!
+
+        Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"
+        path = "#{tags_path}#{tag}.xml"
+        next if file_exists?(path)
+
+        @site.pages << make_page(path, :tag => tag)
+      end
+    end
+
     # Path to feed.xml template file
     def feed_source_path
       @feed_source_path ||= File.expand_path "feed.xml", __dir__

From 665cfba5447fa41e30db6907dea0d9169134de3c Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Tue, 19 Feb 2019 14:47:23 +0530
Subject: [PATCH 15/26] reset tags_config to empty Hash if it isn't Hash

---
 lib/jekyll-feed/generator.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index d38564b3..aaaa40fc 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -71,7 +71,7 @@ def collections
     end
 
     def generate_feed_by_tag
-      tags_config = config["tags"]
+      tags_config = config["tags"].is_a?(Hash) ? config["tags"] : {}
 
       excludes  = tags_config["excludes"] || []
       includes  = tags_config["includes"] || @site.tags.keys

From 67d817d212415b252f9ea261fd60eac57392826c Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Tue, 19 Feb 2019 14:48:59 +0530
Subject: [PATCH 16/26] split method apart to reduce CyclomaticComplexity

---
 lib/jekyll-feed/generator.rb | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index aaaa40fc..e301dadd 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -78,6 +78,10 @@ def generate_feed_by_tag
       tags_pool = includes - excludes
       tags_path = tags_config["path"] || "/feed/by_tag/"
 
+      generate_tag_feed(tags_pool, tags_path)
+    end
+
+    def generate_tag_feed(tags_pool, tags_path)
       tags_pool.each do |tag|
         # allow only tags with alphanumeric non-ASCII characters
         next if tag =~ %r![^a-zA-Z0-9_]!

From f975bb52f85bc76c9e554f5d0e07babe617cb16c Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Tue, 19 Feb 2019 14:52:12 +0530
Subject: [PATCH 17/26] Improve comment inlined within iteration logic

---
 lib/jekyll-feed/generator.rb | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index e301dadd..0d83dd95 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -83,7 +83,8 @@ def generate_feed_by_tag
 
     def generate_tag_feed(tags_pool, tags_path)
       tags_pool.each do |tag|
-        # allow only tags with alphanumeric non-ASCII characters
+        # allow only tags with basic alphanumeric characters and underscore to keep
+        # feed path simple.
         next if tag =~ %r![^a-zA-Z0-9_]!
 
         Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}"

From 3eb88ac2eafe57df86049457babee06a2514fc06 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Tue, 19 Feb 2019 18:16:53 +0000
Subject: [PATCH 18/26] fix comments from project maintainer

---
 README.md                | 2 +-
 spec/jekyll-feed_spec.rb | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 32b4314e..54eebf05 100644
--- a/README.md
+++ b/README.md
@@ -188,7 +188,7 @@ To automatically generate feeds for each tag you apply to your posts you can add
 
 ```yml
 feed:
-  tags:
+  tags: true
 ```
 
 If there are tags you don't want included in this auto generation you can exclude them
diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index f76842b4..71f8bef1 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -489,7 +489,7 @@
       let(:overrides) do
         {
           "feed" => {
-            "tags" => {}
+            "tags" => true
           },
         }
       end

From 05ee1782fb207b2b1741272085f13579128cfc34 Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Wed, 20 Feb 2019 12:07:12 +0530
Subject: [PATCH 19/26] Remove extra blank line in spec file

---
 spec/jekyll-feed_spec.rb | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index 71f8bef1..fe9fa1f1 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -484,7 +484,6 @@
       end
     end
 
-
     context "set tags setting" do
       let(:overrides) do
         {

From 3d8e51efac4ec22404b0cc78050258608441b707 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Fri, 10 Jan 2020 20:24:49 +0000
Subject: [PATCH 20/26] change tag to tags in generator make_page function for
 consistency

---
 lib/jekyll-feed/feed.xml     | 4 ++--
 lib/jekyll-feed/generator.rb | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/lib/jekyll-feed/feed.xml b/lib/jekyll-feed/feed.xml
index 9c190657..b47e65d6 100644
--- a/lib/jekyll-feed/feed.xml
+++ b/lib/jekyll-feed/feed.xml
@@ -39,8 +39,8 @@
     
   {% endif %}
 
-  {% if page.tag %}
-    {% assign entries = site.tags[page.tag] %}
+  {% if page.tags %}
+    {% assign entries = site.tags[page.tags] %}
   {% else %}
     {% assign entries = site[page.collection] %}
   {% endif %}
diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index 0d83dd95..dbae653c 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -91,7 +91,7 @@ def generate_tag_feed(tags_pool, tags_path)
         path = "#{tags_path}#{tag}.xml"
         next if file_exists?(path)
 
-        @site.pages << make_page(path, :tag => tag)
+        @site.pages << make_page(path, :tags => tag)
       end
     end
 
@@ -111,7 +111,7 @@ def file_exists?(file_path)
 
     # Generates contents for a file
 
-    def make_page(file_path, collection: "posts", category: nil, tag: nil)
+    def make_page(file_path, collection: "posts", category: nil, tags: nil)
       PageWithoutAFile.new(@site, __dir__, "", file_path).tap do |file|
         file.content = feed_template
         file.data.merge!(
@@ -120,7 +120,7 @@ def make_page(file_path, collection: "posts", category: nil, tag: nil)
           "xsl"        => file_exists?("feed.xslt.xml"),
           "collection" => collection,
           "category"   => category,
-          "tag"        => tag
+          "tags"       => tags
         )
         file.output
       end

From 9216296d065e1e9f1462b527c5b45f397d05f1ad Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Sat, 11 Jan 2020 11:46:56 +0000
Subject: [PATCH 21/26] add test for creating tag feed for tag created as a
 non-array tag in front matter

---
 spec/fixtures/_posts/2015-05-12-liquid.md |  1 +
 spec/jekyll-feed_spec.rb                  | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/spec/fixtures/_posts/2015-05-12-liquid.md b/spec/fixtures/_posts/2015-05-12-liquid.md
index 81aaeae5..29011eed 100644
--- a/spec/fixtures/_posts/2015-05-12-liquid.md
+++ b/spec/fixtures/_posts/2015-05-12-liquid.md
@@ -1,4 +1,5 @@
 ---
+tag: nonarray
 ---
 
 {% capture liquidstring %}
diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index 0a67bf6b..9c86645b 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -488,6 +488,8 @@
     let(:tags_feed_test) { File.read(dest_dir("feed/by_tag/test.xml")) }
     let(:tags_feed_fail) { File.read(dest_dir("feed/by_tag/fail.xml")) }
     let(:tags_feed_success) { File.read(dest_dir("feed/by_tag/success.xml")) }
+    let(:tags_feed_nonarray) { File.read(dest_dir("feed/by_tag/nonarray.xml")) }
+
 
     context "do not set tags setting" do
       it "should not write tags feeds" do
@@ -590,6 +592,24 @@
         expect(Pathname.new(dest_dir("alternate/path/success.xml"))).to exist
       end
     end
+
+    context "test nonarray tag value" do
+      let(:overrides) do
+        {
+          "feed" => {
+            "tags" => {
+              "includes" => [ "nonarray" ]
+            },
+          },
+        }
+      end
+
+      it "should write nonarray feed" do
+        expect(Pathname.new(dest_dir("feed/by_tag/nonarray.xml"))).to exist
+        expect(tags_feed_nonarray).to match "/2015/05/12/liquid.html"
+      end
+ 
+    end
   end
 
   context "excerpt_only flag" do

From 93c69a83a3fc2a8bd80d95f5348cdb5c8eecdd7a Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Wed, 15 Jan 2020 14:28:07 +0530
Subject: [PATCH 22/26] Test if questionable paths are handled properly

---
 spec/jekyll-feed_spec.rb | 40 +++++++++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index 9c86645b..73407bc3 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -512,6 +512,7 @@
         expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to exist
         expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to exist
         expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to exist
+
         expect(tags_feed_test).to match "/2013/12/12/dec-the-second.html"
         expect(tags_feed_test).to match "/2014/03/02/march-the-second.html"
         expect(tags_feed_test).to match "/2014/03/04/march-the-fourth.html"
@@ -519,20 +520,22 @@
         expect(tags_feed_test).to match "/2015/05/12/pre.html"
         expect(tags_feed_test).to match "/2015/05/18/author-detail.html"
         expect(tags_feed_test).to match "/2015/08/08/stuck-in-the-middle.html"
+
+        expect(tags_feed_fail).to match "/2015/01/18/jekyll-last-modified-at.html"
+        expect(tags_feed_fail).to match "/2015/08/08/stuck-in-the-middle.html"
         expect(tags_feed_fail).to_not match "/2013/12/12/dec-the-second.html"
         expect(tags_feed_fail).to_not match "/2014/03/02/march-the-second.html"
         expect(tags_feed_fail).to_not match "/2014/03/04/march-the-fourth.html"
         expect(tags_feed_fail).to_not match "/2015/05/12/pre.html"
         expect(tags_feed_fail).to_not match "/2015/05/18/author-detail.html"
+
+        expect(tags_feed_success).to match "2015/05/18/author-detail.html"
         expect(tags_feed_success).to_not match "/2013/12/12/dec-the-second.html"
         expect(tags_feed_success).to_not match "/2014/03/02/march-the-second.html"
         expect(tags_feed_success).to_not match "/2014/03/04/march-the-fourth.html"
         expect(tags_feed_success).to_not match "/2015/01/18/jekyll-last-modified-at.html"
         expect(tags_feed_success).to_not match "/2015/05/12/pre.html"
         expect(tags_feed_success).to_not match "/2015/08/08/stuck-in-the-middle.html"
-        expect(tags_feed_fail).to match "/2015/01/18/jekyll-last-modified-at.html"
-        expect(tags_feed_fail).to match "/2015/08/08/stuck-in-the-middle.html"
-        expect(tags_feed_success).to match "2015/05/18/author-detail.html"
       end
     end
 
@@ -541,7 +544,7 @@
         {
           "feed" => {
             "tags" => {
-              "excludes" => [ "fail" ]
+              "excludes" => ["fail"]
             },
           },
         }
@@ -559,7 +562,7 @@
         {
           "feed" => {
             "tags" => {
-              "includes" => [ "success" ]
+              "includes" => ["success"]
             },
           },
         }
@@ -583,14 +586,37 @@
         }
       end
 
-      it "should not write fail feed" do
+      it "should write feeds to new path" do
         expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to_not exist
         expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to_not exist
         expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to_not exist
+
         expect(Pathname.new(dest_dir("alternate/path/test.xml"))).to exist
         expect(Pathname.new(dest_dir("alternate/path/fail.xml"))).to exist
         expect(Pathname.new(dest_dir("alternate/path/success.xml"))).to exist
       end
+
+      context "set to questionable path" do
+        let(:overrides) do
+          {
+            "feed" => {
+              "tags" => {
+                "path" => "../../../../../../../questionable/path/"
+              },
+            },
+          }
+        end
+
+        it "should write feeds to sane paths" do
+          expect(Pathname.new(dest_dir("feed/by_tag/test.xml"))).to_not exist
+          expect(Pathname.new(dest_dir("feed/by_tag/fail.xml"))).to_not exist
+          expect(Pathname.new(dest_dir("feed/by_tag/success.xml"))).to_not exist
+
+          expect(Pathname.new(dest_dir("questionable/path/test.xml"))).to exist
+          expect(Pathname.new(dest_dir("questionable/path/fail.xml"))).to exist
+          expect(Pathname.new(dest_dir("questionable/path/success.xml"))).to exist
+        end
+      end
     end
 
     context "test nonarray tag value" do
@@ -598,7 +624,7 @@
         {
           "feed" => {
             "tags" => {
-              "includes" => [ "nonarray" ]
+              "includes" => ["nonarray"]
             },
           },
         }

From 9cd44b42cffe3d14c6da133114fc7bff6c655485 Mon Sep 17 00:00:00 2001
From: Ashwin Maroli 
Date: Wed, 15 Jan 2020 14:38:45 +0530
Subject: [PATCH 23/26] Read `config["tags"]` just once

---
 lib/jekyll-feed/generator.rb | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index dbae653c..184b364d 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -71,7 +71,8 @@ def collections
     end
 
     def generate_feed_by_tag
-      tags_config = config["tags"].is_a?(Hash) ? config["tags"] : {}
+      tags_config = config["tags"]
+      tags_config = {} unless tags_config.is_a?(Hash)
 
       excludes  = tags_config["excludes"] || []
       includes  = tags_config["includes"] || @site.tags.keys

From 281b49ff5bb4a50e4532584544de40297ec13d27 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Wed, 15 Jan 2020 18:08:56 +0000
Subject: [PATCH 24/26] change the names of settings for included or excluded
 feeds to make it more clear

---
 README.md                    | 4 ++--
 lib/jekyll-feed/generator.rb | 6 +++---
 spec/jekyll-feed_spec.rb     | 6 +++---
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index d272da62..87cde7ec 100644
--- a/README.md
+++ b/README.md
@@ -210,7 +210,7 @@ If there are tags you don't want included in this auto generation you can exclud
 ```yml
 feed:
   tags:
-    excludes:
+    except:
       - tag-to-exclude
       - another-tag
 ```
@@ -228,7 +228,7 @@ If you only want to generate feeds for a few tags you can also set this.
 ```yml
 feed:
   tags:
-    includes:
+    only:
       - tag-to-include
       - another-tag
 ```
diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index 184b364d..586b6428 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -74,9 +74,9 @@ def generate_feed_by_tag
       tags_config = config["tags"]
       tags_config = {} unless tags_config.is_a?(Hash)
 
-      excludes  = tags_config["excludes"] || []
-      includes  = tags_config["includes"] || @site.tags.keys
-      tags_pool = includes - excludes
+      except = tags_config["except"] || []
+      only = tags_config["only"] || @site.tags.keys
+      tags_pool = only - except
       tags_path = tags_config["path"] || "/feed/by_tag/"
 
       generate_tag_feed(tags_pool, tags_path)
diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index 73407bc3..25d27310 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -544,7 +544,7 @@
         {
           "feed" => {
             "tags" => {
-              "excludes" => ["fail"]
+              "except" => ["fail"]
             },
           },
         }
@@ -562,7 +562,7 @@
         {
           "feed" => {
             "tags" => {
-              "includes" => ["success"]
+              "only" => ["success"]
             },
           },
         }
@@ -624,7 +624,7 @@
         {
           "feed" => {
             "tags" => {
-              "includes" => ["nonarray"]
+              "only" => ["nonarray"]
             },
           },
         }

From fde5155a83c03ff74d870ed42c78146d708f61b9 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Wed, 15 Jan 2020 18:13:02 +0000
Subject: [PATCH 25/26] Line up = in generate_feed_by_tag function to make code
 more readable

---
 lib/jekyll-feed/generator.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/jekyll-feed/generator.rb b/lib/jekyll-feed/generator.rb
index 586b6428..590f66f4 100644
--- a/lib/jekyll-feed/generator.rb
+++ b/lib/jekyll-feed/generator.rb
@@ -74,8 +74,8 @@ def generate_feed_by_tag
       tags_config = config["tags"]
       tags_config = {} unless tags_config.is_a?(Hash)
 
-      except = tags_config["except"] || []
-      only = tags_config["only"] || @site.tags.keys
+      except    = tags_config["except"] || []
+      only      = tags_config["only"] || @site.tags.keys
       tags_pool = only - except
       tags_path = tags_config["path"] || "/feed/by_tag/"
 

From d98228527573a286fe52964b2e1edb518ce111e2 Mon Sep 17 00:00:00 2001
From: Craig Stewart 
Date: Mon, 22 Jun 2020 17:19:05 +0100
Subject: [PATCH 26/26] remove test for core jekyll functionality suggested by
 parkr

---
 spec/fixtures/_posts/2015-05-12-liquid.md |  1 -
 spec/jekyll-feed_spec.rb                  | 19 -------------------
 2 files changed, 20 deletions(-)

diff --git a/spec/fixtures/_posts/2015-05-12-liquid.md b/spec/fixtures/_posts/2015-05-12-liquid.md
index 29011eed..81aaeae5 100644
--- a/spec/fixtures/_posts/2015-05-12-liquid.md
+++ b/spec/fixtures/_posts/2015-05-12-liquid.md
@@ -1,5 +1,4 @@
 ---
-tag: nonarray
 ---
 
 {% capture liquidstring %}
diff --git a/spec/jekyll-feed_spec.rb b/spec/jekyll-feed_spec.rb
index ac5267cb..5f23ebb4 100644
--- a/spec/jekyll-feed_spec.rb
+++ b/spec/jekyll-feed_spec.rb
@@ -501,7 +501,6 @@
     let(:tags_feed_test) { File.read(dest_dir("feed/by_tag/test.xml")) }
     let(:tags_feed_fail) { File.read(dest_dir("feed/by_tag/fail.xml")) }
     let(:tags_feed_success) { File.read(dest_dir("feed/by_tag/success.xml")) }
-    let(:tags_feed_nonarray) { File.read(dest_dir("feed/by_tag/nonarray.xml")) }
 
 
     context "do not set tags setting" do
@@ -631,24 +630,6 @@
         end
       end
     end
-
-    context "test nonarray tag value" do
-      let(:overrides) do
-        {
-          "feed" => {
-            "tags" => {
-              "only" => ["nonarray"]
-            },
-          },
-        }
-      end
-
-      it "should write nonarray feed" do
-        expect(Pathname.new(dest_dir("feed/by_tag/nonarray.xml"))).to exist
-        expect(tags_feed_nonarray).to match "/2015/05/12/liquid.html"
-      end
- 
-    end
   end
 
   context "excerpt_only flag" do