feedjira 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Dangerfile +1 -1
- data/README.md +7 -1
- data/feedjira.gemspec +2 -1
- data/lib/feedjira.rb +3 -0
- data/lib/feedjira/atom_entry_utilities.rb +17 -1
- data/lib/feedjira/configuration.rb +1 -0
- data/lib/feedjira/parser/atom_google_alerts.rb +24 -0
- data/lib/feedjira/parser/atom_google_alerts_entry.rb +20 -0
- data/lib/feedjira/parser/globally_unique_identifier.rb +19 -0
- data/lib/feedjira/rss_entry_utilities.rb +9 -5
- data/lib/feedjira/version.rb +1 -1
- data/spec/feedjira/parser/atom_entry_spec.rb +1 -0
- data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +32 -0
- data/spec/feedjira/parser/atom_google_alerts_spec.rb +60 -0
- data/spec/feedjira/parser/atom_spec.rb +3 -1
- data/spec/feedjira/parser/rss_entry_spec.rb +20 -0
- data/spec/sample_feeds.rb +3 -1
- data/spec/sample_feeds/Permalinks.xml +22 -0
- data/spec/sample_feeds/google_alerts_atom.xml +1 -0
- metadata +16 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3d77becc66f52f24c3105ebed905255506b0857c1452accf32b6b2f7f691dd8b
         | 
| 4 | 
            +
              data.tar.gz: 04e39a33e2de97107040f3a10ae8a84fad2441e2bca21c7c0731c58293d47af1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 77fc47a4b6918578a8934b3aff52f07fc7c643597bf4b30116de0f90d1526bc79bccdbd52acba8b43f6fdcf8856490df680ecbce2e9b0f1efd5c337ed0f5da4b
         | 
| 7 | 
            +
              data.tar.gz: 4440459e2e2ad27c953f30238349b9e60d0fff2cd15282fec0d1ae986a6bedacd3fff91ac34add975688c2a002081f5523b57261da4ab4b3a9db25b35d8d3bef
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,11 +1,21 @@ | |
| 1 1 | 
             
            # Feedjira Changelog
         | 
| 2 2 |  | 
| 3 | 
            +
            ## (Unreleased)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Breaking Changes
         | 
| 6 | 
            +
              * `title` of Atom entry classes always return a plain text even in case the entry has a title of the HTML or XML type. [#423][] (@knu)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            * Enhancements
         | 
| 9 | 
            +
              * `raw_title` and `title_type` are added to Atom entry classes. [#423][] (@knu)
         | 
| 10 | 
            +
              * AtomGoogleAlerts is now a supported parser [#424][] (@knu)
         | 
| 11 | 
            +
             | 
| 3 12 | 
             
            ## 3.0.0
         | 
| 4 13 |  | 
| 5 14 | 
             
            * Breaking Changes
         | 
| 6 15 | 
             
              * `Feedjira::Feed.parse` has moved to `Feedjira.parse`
         | 
| 7 16 | 
             
              * `Feedjira::Feed.fetch_and_parse` has been removed. See README examples for
         | 
| 8 17 | 
             
                  how to request XML and parse.
         | 
| 18 | 
            +
             | 
| 9 19 | 
             
            * General
         | 
| 10 20 | 
             
              * Drop support for Ruby 2.1
         | 
| 11 21 |  | 
    
        data/Dangerfile
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            commit_lint.check(warn: :all)
         | 
| 1 | 
            +
            # commit_lint.check(warn: :all)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -27,7 +27,7 @@ An example of parsing a feed with Feedjira: | |
| 27 27 | 
             
            xml = HTTParty.get(url).body
         | 
| 28 28 | 
             
            feed = Feedjira.parse(xml)
         | 
| 29 29 | 
             
            feed.entries.first.title
         | 
| 30 | 
            -
            # => "Announcing  | 
| 30 | 
            +
            # => "Announcing version 3.0"
         | 
| 31 31 | 
             
            ```
         | 
| 32 32 |  | 
| 33 33 | 
             
            ## Specifying parser
         | 
| @@ -146,6 +146,10 @@ add-ons and everything in between. Here are some of them: | |
| 146 146 |  | 
| 147 147 | 
             
            * [Feedi API][feedi]: Feedi simplifies how you handle RSS, Atom, or JSON feeds. You can add and keep track of your favourite           feed data with a simple and clean REST API. All entries are enriched by Machine Learning and Semantic engines.
         | 
| 148 148 |  | 
| 149 | 
            +
            * [Breaker][breaker]: The social podcast app
         | 
| 150 | 
            +
             | 
| 151 | 
            +
            * [Huginn][huginn]: Huginn is a system for building agents that perform automated tasks for you online.
         | 
| 152 | 
            +
             | 
| 149 153 | 
             
            [Feedbin]: https://feedbin.com/
         | 
| 150 154 | 
             
            [Stringer]: https://github.com/swanson/stringer
         | 
| 151 155 | 
             
            [BlogFeeder]: https://apps.shopify.com/blogfeeder
         | 
| @@ -153,6 +157,8 @@ add-ons and everything in between. Here are some of them: | |
| 153 157 | 
             
            [old]: http://theoldreader.com/
         | 
| 154 158 | 
             
            [solve]: https://solveforall.com/
         | 
| 155 159 | 
             
            [feedi]: https://github.com/davidesantangelo/feedi
         | 
| 160 | 
            +
            [breaker]: https://breaker.audio
         | 
| 161 | 
            +
            [huginn]: https://github.com/huginn/huginn
         | 
| 156 162 |  | 
| 157 163 | 
             
            Note: to get your project on this list, simply [send an email](mailto:feedjira@gmail.com)
         | 
| 158 164 | 
             
            with your project's details.
         | 
    
        data/feedjira.gemspec
    CHANGED
    
    | @@ -6,6 +6,7 @@ require File.expand_path("lib/feedjira/version", __dir__) | |
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.authors = [
         | 
| 8 8 | 
             
                "Adam Hess",
         | 
| 9 | 
            +
                "Akinori Musha",
         | 
| 9 10 | 
             
                "Ezekiel Templin",
         | 
| 10 11 | 
             
                "Jon Allured",
         | 
| 11 12 | 
             
                "Julien Kirch",
         | 
| @@ -32,7 +33,7 @@ Gem::Specification.new do |s| | |
| 32 33 |  | 
| 33 34 | 
             
              s.required_ruby_version = ">=2.2"
         | 
| 34 35 |  | 
| 35 | 
            -
              s.add_dependency "loofah",             ">= 2. | 
| 36 | 
            +
              s.add_dependency "loofah",             ">= 2.3.1"
         | 
| 36 37 | 
             
              s.add_dependency "sax-machine",        ">= 1.0"
         | 
| 37 38 |  | 
| 38 39 | 
             
              s.add_development_dependency "danger"
         | 
    
        data/lib/feedjira.rb
    CHANGED
    
    | @@ -17,6 +17,7 @@ require "feedjira/feed" | |
| 17 17 | 
             
            require "feedjira/rss_entry_utilities"
         | 
| 18 18 | 
             
            require "feedjira/atom_entry_utilities"
         | 
| 19 19 | 
             
            require "feedjira/parser"
         | 
| 20 | 
            +
            require "feedjira/parser/globally_unique_identifier"
         | 
| 20 21 | 
             
            require "feedjira/parser/rss_entry"
         | 
| 21 22 | 
             
            require "feedjira/parser/rss_image"
         | 
| 22 23 | 
             
            require "feedjira/parser/rss"
         | 
| @@ -34,6 +35,8 @@ require "feedjira/parser/itunes_rss_item" | |
| 34 35 | 
             
            require "feedjira/parser/itunes_rss"
         | 
| 35 36 | 
             
            require "feedjira/parser/atom_feed_burner_entry"
         | 
| 36 37 | 
             
            require "feedjira/parser/atom_feed_burner"
         | 
| 38 | 
            +
            require "feedjira/parser/atom_google_alerts_entry"
         | 
| 39 | 
            +
            require "feedjira/parser/atom_google_alerts"
         | 
| 37 40 | 
             
            require "feedjira/parser/google_docs_atom_entry"
         | 
| 38 41 | 
             
            require "feedjira/parser/google_docs_atom"
         | 
| 39 42 | 
             
            require "feedjira/parser/atom_youtube_entry"
         | 
| @@ -4,7 +4,13 @@ module Feedjira | |
| 4 4 | 
             
              module AtomEntryUtilities
         | 
| 5 5 | 
             
                def self.included(mod)
         | 
| 6 6 | 
             
                  mod.class_exec do
         | 
| 7 | 
            -
                    element :title
         | 
| 7 | 
            +
                    element :title, as: :raw_title, with: { type: "html" }
         | 
| 8 | 
            +
                    element :title, as: :raw_title, with: { type: "xhtml" }
         | 
| 9 | 
            +
                    element :title, as: :raw_title, with: { type: "xml" }
         | 
| 10 | 
            +
                    element :title, as: :title, with: { type: "text" }
         | 
| 11 | 
            +
                    element :title, as: :title, with: { type: nil }
         | 
| 12 | 
            +
                    element :title, as: :title_type, value: :type
         | 
| 13 | 
            +
             | 
| 8 14 | 
             
                    element :name, as: :author
         | 
| 9 15 | 
             
                    element :content
         | 
| 10 16 | 
             
                    element :summary
         | 
| @@ -28,6 +34,16 @@ module Feedjira | |
| 28 34 | 
             
                  end
         | 
| 29 35 | 
             
                end
         | 
| 30 36 |  | 
| 37 | 
            +
                def title
         | 
| 38 | 
            +
                  @title ||=
         | 
| 39 | 
            +
                    case @raw_title
         | 
| 40 | 
            +
                    when String
         | 
| 41 | 
            +
                      Loofah.fragment(@raw_title).xpath("normalize-space(.)")
         | 
| 42 | 
            +
                    else
         | 
| 43 | 
            +
                      @title
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 31 47 | 
             
                def url
         | 
| 32 48 | 
             
                  @url ||= links.first
         | 
| 33 49 | 
             
                end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module Feedjira
         | 
| 2 | 
            +
              module Parser
         | 
| 3 | 
            +
                # Parser for dealing with Feedburner Atom feeds.
         | 
| 4 | 
            +
                class AtomGoogleAlerts
         | 
| 5 | 
            +
                  include SAXMachine
         | 
| 6 | 
            +
                  include FeedUtilities
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  element :title
         | 
| 9 | 
            +
                  element :subtitle, as: :description
         | 
| 10 | 
            +
                  element :link, as: :feed_url, value: :href, with: { rel: "self" }
         | 
| 11 | 
            +
                  element :link, as: :url, value: :href, with: { rel: "self" }
         | 
| 12 | 
            +
                  elements :link, as: :links, value: :href
         | 
| 13 | 
            +
                  elements :entry, as: :entries, class: AtomGoogleAlertsEntry
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def self.able_to_parse?(xml)
         | 
| 16 | 
            +
                    Atom.able_to_parse?(xml) && (%r{<id>tag:google\.com,2005:[^<]+/com\.google/alerts/} === xml) # rubocop:disable Metrics/LineLength
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def self.preprocess(xml)
         | 
| 20 | 
            +
                    Preprocessor.new(xml).to_xml
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            module Feedjira
         | 
| 2 | 
            +
              module Parser
         | 
| 3 | 
            +
                # Parser for dealing with Feedburner Atom feed entries.
         | 
| 4 | 
            +
                class AtomGoogleAlertsEntry
         | 
| 5 | 
            +
                  include SAXMachine
         | 
| 6 | 
            +
                  include FeedEntryUtilities
         | 
| 7 | 
            +
                  include AtomEntryUtilities
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def url
         | 
| 10 | 
            +
                    url = super
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    if url && url.start_with?("https://www.google.com/url?")
         | 
| 13 | 
            +
                      uri = URI(url)
         | 
| 14 | 
            +
                      cons = URI.decode_www_form(uri.query).assoc("url")
         | 
| 15 | 
            +
                      cons && cons[1]
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            module Feedjira
         | 
| 2 | 
            +
              module Parser
         | 
| 3 | 
            +
                class GloballyUniqueIdentifier
         | 
| 4 | 
            +
                  include SAXMachine
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  attribute :isPermaLink, as: :is_perma_link
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  value :guid
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def perma_link?
         | 
| 11 | 
            +
                    is_perma_link != "false"
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def url
         | 
| 15 | 
            +
                    perma_link? ? guid : nil
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -23,7 +23,7 @@ module Feedjira | |
| 23 23 |  | 
| 24 24 | 
             
                    element :"dcterms:modified", as: :updated
         | 
| 25 25 |  | 
| 26 | 
            -
                    element :guid, as: :entry_id
         | 
| 26 | 
            +
                    element :guid, as: :entry_id, class: Feedjira::Parser::GloballyUniqueIdentifier
         | 
| 27 27 | 
             
                    element :"dc:identifier", as: :dc_identifier
         | 
| 28 28 |  | 
| 29 29 | 
             
                    element :"media:thumbnail", as: :image, value: :url
         | 
| @@ -34,12 +34,16 @@ module Feedjira | |
| 34 34 | 
             
                  end
         | 
| 35 35 | 
             
                end
         | 
| 36 36 |  | 
| 37 | 
            -
                 | 
| 37 | 
            +
                def entry_id
         | 
| 38 | 
            +
                  @entry_id && @entry_id.guid
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def url
         | 
| 42 | 
            +
                  @url || (@entry_id && @entry_id.url)
         | 
| 43 | 
            +
                end
         | 
| 38 44 |  | 
| 39 | 
            -
                # rubocop:disable Naming/MemoizedInstanceVariableName
         | 
| 40 45 | 
             
                def id
         | 
| 41 | 
            -
                   | 
| 46 | 
            +
                  entry_id || @dc_identifier || @url
         | 
| 42 47 | 
             
                end
         | 
| 43 | 
            -
                # rubocop:enable Naming/MemoizedInstanceVariableName
         | 
| 44 48 | 
             
              end
         | 
| 45 49 | 
             
            end
         | 
    
        data/lib/feedjira/version.rb
    CHANGED
    
    
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Feedjira::Parser::AtomGoogleAlertsEntry do
         | 
| 4 | 
            +
              before(:each) do
         | 
| 5 | 
            +
                feed = Feedjira::Parser::AtomGoogleAlerts.parse sample_google_alerts_atom_feed
         | 
| 6 | 
            +
                @entry = feed.entries.first
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              it "should parse the title" do
         | 
| 10 | 
            +
                expect(@entry.title).to eq "Report offers Prediction of Automotive Slack Market by Top key players like Haldex, Meritor, Bendix ..." # rubocop:disable Metrics/LineLength
         | 
| 11 | 
            +
                expect(@entry.raw_title).to eq "Report offers Prediction of Automotive <b>Slack</b> Market by Top key players like Haldex, Meritor, Bendix ..." # rubocop:disable Metrics/LineLength
         | 
| 12 | 
            +
                expect(@entry.title_type).to eq "html"
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              it "should parse the url" do
         | 
| 16 | 
            +
                expect(@entry.url).to eq "https://www.aglobalmarketresearch.com/report-offers-prediction-of-automotive-slack-market-by-top-key-players-like-haldex-meritor-bendix-mei-wabco-accuride-stemco-tbk-febi-aydinsan/" # rubocop:disable Metrics/LineLength
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              it "should parse the content" do
         | 
| 20 | 
            +
                expect(@entry.content).to eq "Automotive <b>Slack</b> Market reports provides a comprehensive overview of the global market size and share. It provides strategists, marketers and senior ..." # rubocop:disable Metrics/LineLength
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              it "should parse the published date" do
         | 
| 24 | 
            +
                published = Time.parse_safely "2019-07-10T11:53:37Z"
         | 
| 25 | 
            +
                expect(@entry.published).to eq published
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              it "should parse the updated date" do
         | 
| 29 | 
            +
                updated = Time.parse_safely "2019-07-10T11:53:37Z"
         | 
| 30 | 
            +
                expect(@entry.updated).to eq updated
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Feedjira
         | 
| 4 | 
            +
              module Parser
         | 
| 5 | 
            +
                describe "#able_to_parse?" do
         | 
| 6 | 
            +
                  it "should return true for a Google Alerts atom feed" do
         | 
| 7 | 
            +
                    expect(AtomGoogleAlerts).to be_able_to_parse(sample_google_alerts_atom_feed)
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  it "should return false for an rdf feed" do
         | 
| 11 | 
            +
                    expect(AtomGoogleAlerts).to_not be_able_to_parse(sample_rdf_feed)
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  it "should return false for a regular atom feed" do
         | 
| 15 | 
            +
                    expect(AtomGoogleAlerts).to_not be_able_to_parse(sample_atom_feed)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  it "should return false for a feedburner atom feed" do
         | 
| 19 | 
            +
                    expect(AtomGoogleAlerts).to_not be_able_to_parse(sample_feedburner_atom_feed)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                describe "parsing" do
         | 
| 24 | 
            +
                  before(:each) do
         | 
| 25 | 
            +
                    @feed = AtomGoogleAlerts.parse(sample_google_alerts_atom_feed)
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  it "should parse the title" do
         | 
| 29 | 
            +
                    expect(@feed.title).to eq "Google Alert - Slack"
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  it "should parse the descripton" do
         | 
| 33 | 
            +
                    expect(@feed.description).to be_nil
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  it "should parse the url" do
         | 
| 37 | 
            +
                    expect(@feed.url).to eq "https://www.google.com/alerts/feeds/04175468913983673025/4428013283581841004"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  it "should parse the feed_url" do
         | 
| 41 | 
            +
                    expect(@feed.feed_url).to eq "https://www.google.com/alerts/feeds/04175468913983673025/4428013283581841004"
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  it "should parse entries" do
         | 
| 45 | 
            +
                    expect(@feed.entries.size).to eq 20
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                describe "preprocessing" do
         | 
| 50 | 
            +
                  it "retains markup in xhtml content" do
         | 
| 51 | 
            +
                    AtomGoogleAlerts.preprocess_xml = true
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    feed = AtomGoogleAlerts.parse sample_google_alerts_atom_feed
         | 
| 54 | 
            +
                    entry = feed.entries.first
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    expect(entry.content).to include("<b>Slack</b>")
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| @@ -75,7 +75,9 @@ module Feedjira | |
| 75 75 | 
             
                    feed = Atom.parse sample_atom_xhtml_feed
         | 
| 76 76 | 
             
                    entry = feed.entries.first
         | 
| 77 77 |  | 
| 78 | 
            -
                    expect(entry. | 
| 78 | 
            +
                    expect(entry.raw_title).to match(/\<i/)
         | 
| 79 | 
            +
                    expect(entry.title).to eq("Sentry Calming Collar for dogs")
         | 
| 80 | 
            +
                    expect(entry.title_type).to eq("xhtml")
         | 
| 79 81 | 
             
                    expect(entry.summary).to match(/\<b/)
         | 
| 80 82 | 
             
                    expect(entry.content).to match(/\A\<p/)
         | 
| 81 83 | 
             
                  end
         | 
| @@ -94,4 +94,24 @@ describe Feedjira::Parser::RSSEntry do | |
| 94 94 | 
             
                @entry["title"] = "Foobar"
         | 
| 95 95 | 
             
                expect(@entry.title).to eq "Foobar"
         | 
| 96 96 | 
             
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              it "should ignore urls from guids with isPermaLink='false'" do
         | 
| 99 | 
            +
                feed = Feedjira.parse(sample_rss_feed_permalinks)
         | 
| 100 | 
            +
                expect(feed.entries[0].url).to eq nil
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              it "should get urls from guids with isPermaLink='true'" do
         | 
| 104 | 
            +
                feed = Feedjira.parse(sample_rss_feed_permalinks)
         | 
| 105 | 
            +
                expect(feed.entries[1].url).to eq "http://example.com/2"
         | 
| 106 | 
            +
              end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
              it "should get urls from guid where isPermaLink is unspecified" do
         | 
| 109 | 
            +
                feed = Feedjira.parse(sample_rss_feed_permalinks)
         | 
| 110 | 
            +
                expect(feed.entries[2].url).to eq "http://example.com/3"
         | 
| 111 | 
            +
              end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
              it "should prefer urls from <link> when both guid and link are specified" do
         | 
| 114 | 
            +
                feed = Feedjira.parse(sample_rss_feed_permalinks)
         | 
| 115 | 
            +
                expect(feed.entries[3].url).to eq "http://example.com/4"
         | 
| 116 | 
            +
              end
         | 
| 97 117 | 
             
            end
         | 
    
        data/spec/sample_feeds.rb
    CHANGED
    
    | @@ -19,6 +19,7 @@ module SampleFeeds | |
| 19 19 | 
             
                sample_feedburner_atom_feed: "PaulDixExplainsNothing.xml",
         | 
| 20 20 | 
             
                sample_feedburner_atom_feed_alternate: "GiantRobotsSmashingIntoOtherGiantRobots.xml",
         | 
| 21 21 | 
             
                sample_feedburner_atom_entry_content: "PaulDixExplainsNothingFirstEntryContent.xml",
         | 
| 22 | 
            +
                sample_google_alerts_atom_feed: "google_alerts_atom.xml",
         | 
| 22 23 | 
             
                sample_wfw_feed: "PaulDixExplainsNothingWFW.xml",
         | 
| 23 24 | 
             
                sample_google_docs_list_feed: "GoogleDocsList.xml",
         | 
| 24 25 | 
             
                sample_feed_burner_atom_xhtml_feed: "FeedBurnerXHTML.xml",
         | 
| @@ -27,7 +28,8 @@ module SampleFeeds | |
| 27 28 | 
             
                sample_atom_xhtml_with_escpaed_html_in_pre_tag_feed: "AtomEscapedHTMLInPreTag.xml",
         | 
| 28 29 | 
             
                sample_json_feed: "json_feed.json",
         | 
| 29 30 | 
             
                sample_rss_feed_huffpost_ca: "HuffPostCanada.xml",
         | 
| 30 | 
            -
                sample_invalid_date_format_feed: "InvalidDateFormat.xml"
         | 
| 31 | 
            +
                sample_invalid_date_format_feed: "InvalidDateFormat.xml",
         | 
| 32 | 
            +
                sample_rss_feed_permalinks: "Permalinks.xml"
         | 
| 31 33 | 
             
              }.freeze
         | 
| 32 34 |  | 
| 33 35 | 
             
              FEEDS.each do |method, filename|
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="utf-8"?>
         | 
| 2 | 
            +
            <rss version="2.0">
         | 
| 3 | 
            +
                <channel>
         | 
| 4 | 
            +
                    <item>
         | 
| 5 | 
            +
                        <title>Item 1</title>
         | 
| 6 | 
            +
                        <guid isPermaLink="false">http://example.com/1</guid>
         | 
| 7 | 
            +
                    </item>
         | 
| 8 | 
            +
                    <item>
         | 
| 9 | 
            +
                        <title>Item 2</title>
         | 
| 10 | 
            +
                        <guid isPermaLink="true">http://example.com/2</guid>
         | 
| 11 | 
            +
                    </item>
         | 
| 12 | 
            +
                    <item>
         | 
| 13 | 
            +
                        <title>Item 3</title>
         | 
| 14 | 
            +
                        <guid>http://example.com/3</guid>
         | 
| 15 | 
            +
                    </item>
         | 
| 16 | 
            +
                    <item>
         | 
| 17 | 
            +
                        <title>Item 4</title>
         | 
| 18 | 
            +
                        <link>http://example.com/4</link>
         | 
| 19 | 
            +
                        <guid>http://example.com/5</guid>
         | 
| 20 | 
            +
                    </item>
         | 
| 21 | 
            +
                </channel>
         | 
| 22 | 
            +
            </rss>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:idx="urn:atom-extension:indexing"> <id>tag:google.com,2005:reader/user/04175468913983673025/state/com.google/alerts/4428013283581841004</id> <title>Google Alert - Slack</title> <link href="https://www.google.com/alerts/feeds/04175468913983673025/4428013283581841004" rel="self"></link> <updated>2019-07-10T11:53:37Z</updated> <entry> <id>tag:google.com,2013:googlealerts/feed:8974135267215335962</id> <title type="html">Report offers Prediction of Automotive <b>Slack</b> Market by Top key players like Haldex, Meritor, Bendix ...</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://www.aglobalmarketresearch.com/report-offers-prediction-of-automotive-slack-market-by-top-key-players-like-haldex-meritor-bendix-mei-wabco-accuride-stemco-tbk-febi-aydinsan/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNHUcRGtHY1ygcMDkVS68IgpYs7Wpg"></link> <published>2019-07-10T11:53:37Z</published> <updated>2019-07-10T11:53:37Z</updated> <content type="html">Automotive <b>Slack</b> Market reports provides a comprehensive overview of the global market size and share. It provides strategists, marketers and senior&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13685523368333461374</id> <title type="html"><b>Slack</b> Stock Has a Compelling Story and the Numbers to Back It Up</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://investorplace.com/2019/07/slack-stock-truly-compelling/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNEZXRySX8eW_IyksUe5d7lidLUXxg"></link> <published>2019-07-10T11:46:48Z</published> <updated>2019-07-10T11:46:48Z</updated> <content type="html">In the run up to the IPO for <b>Slack</b> Technologies Inc (NYSE:WORK), much of the news coverage centered on the Company&#39;s decision to go public via&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:16151843349267390757</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) Insider Cal Henderson Sells 1500 Shares</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://rivertonroll.com/news/2019/07/10/slack-nasdaqwork-insider-cal-henderson-sells-1500-shares-3.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNGa9L5blE9C_ZfDAAvEn2wd4T6SMg"></link> <published>2019-07-10T11:36:15Z</published> <updated>2019-07-10T11:36:15Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) insider Cal Henderson sold 1,500 shares of the stock in a transaction on Friday, July 5th. The shares were sold at an average&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:1835132116100339822</id> <title type="html">Recode Daily: <b>Slack</b> has a Snap problem</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://www.vox.com/2019/7/10/20688476/recode-daily-slack-has-a-snap-problem&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNEtQrh4XLXd2sVV4nUaaLRLTH41gA"></link> <published>2019-07-10T11:26:15Z</published> <updated>2019-07-10T11:26:15Z</updated> <content type="html">Microsoft Teams could be to <b>Slack</b> what Facebook was to Snapchat: a copier and a killer. The workplace messaging software <b>Slack</b> is losing ground to&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:991231131852743341</id> <title type="html">Global Automotive <b>Slack</b> Market Revenue Share by Players: Haldex, Meritor, Bendix, MEI, Wabco</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://www.globalindustryjournal.us/183648/global-automotive-slack-market-revenue-share-by-players-haldex-meritor-bendix-mei-wabco/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNEjveCF1nef8dDcyjHbbhfhckMzFw"></link> <published>2019-07-10T09:56:15Z</published> <updated>2019-07-10T09:56:15Z</updated> <content type="html">Market Research Explore recently released an exhaustive study of Global Automotive <b>Slack</b> Market, enfolding details of market competition, trends,&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:6847164010869268236</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) Director Sells $39655442.33 in Stock</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://mayfieldrecorder.com/2019/07/10/slack-nasdaqwork-director-chamath-palihapitiya-sells-1017067-shares.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNHgq8lH_XYoxtARd4wwG1AachxXBg"></link> <published>2019-07-10T05:48:45Z</published> <updated>2019-07-10T05:48:45Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) Director Chamath Palihapitiya sold 1,017,067 shares of the firm&#39;s stock in a transaction that occurred on Thursday, June 20th.</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:10850208843585695355</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) Insider Cal Henderson Sells 99342 Shares</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://mayfieldrecorder.com/2019/07/10/slack-nasdaqwork-insider-cal-henderson-sells-99342-shares-of-stock.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNFq39KMesisexj52u8TlmigPkty1g"></link> <published>2019-07-10T05:48:45Z</published> <updated>2019-07-10T05:48:45Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) insider Cal Henderson sold 99,342 shares of the firm&#39;s stock in a transaction on Friday, June 21st. The shares were sold at an&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:676733747034138159</id> <title type="html"><b>Slack</b> Wax Market 2019 Global Industry Growth, Historical Analysis, Size, Trends, Emerging ...</title> <link href="https://www.google.com/url?rct=j&sa=t&url=http://newsinbites.com/2019/07/10/slack-wax-market-2019-global-industry-growth-historical-analysis-size-trends-emerging-factors-demands-key-players-emerging-technologies-and-potential-of-industry-till-2024/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNGSN1zkCT-nKy9XVtCuwP2Vtr_HMQ"></link> <published>2019-07-10T05:37:30Z</published> <updated>2019-07-10T05:37:30Z</updated> <content type="html">Global “<b>Slack</b> Wax Market” 2019 Industry research report provides an In-Depth analysis that includes an executive summary, definition, and scope of&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:18336572245163291818</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) SVP Sells $14409915.40 in Stock</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://techknowbits.com/2019/07/10/slack-nasdaqwork-svp-robert-frati-sells-376238-shares-of-stock.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNFkHaZhjSnl6JinAe2lasaG3oKGAg"></link> <published>2019-07-10T05:03:45Z</published> <updated>2019-07-10T05:03:45Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) SVP Robert Frati sold 376,238 shares of the company&#39;s stock in a transaction that occurred on Friday, June 21st. The stock&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:2703912120395789266</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) CFO Sells $19407875.75 in Stock</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://techknowbits.com/2019/07/10/slack-nasdaqwork-cfo-allen-shim-sells-502925-shares-of-stock.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNEXxF5Cfnhwz-SxZFQPvgjPUmgGVQ"></link> <published>2019-07-10T05:03:45Z</published> <updated>2019-07-10T05:03:45Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) CFO Allen Shim sold 502,925 shares of the company&#39;s stock in a transaction that occurred on Thursday, June 20th.</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:16967451403322814502</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) CEO Sells $53170714.63 in Stock</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://mayfieldrecorder.com/2019/07/10/slack-nasdaqwork-ceo-stewart-butterfield-sells-1360909-shares.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNFU3yaWB2ZAMHAEg88g4swT73wfUQ"></link> <published>2019-07-10T05:03:45Z</published> <updated>2019-07-10T05:03:45Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) CEO Stewart Butterfield sold 1,360,909 shares of <b>Slack</b> stock in a transaction on Friday, June 21st. The shares were sold at&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:7033385826050307251</id> <title type="html">Pineview advances in District II playoffs</title> <link href="https://www.google.com/url?rct=j&sa=t&url=http://www.valleybreeze.com/2019-07-09/pawtucket/pineview-advances-district-ii-playoffs&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNFhAakIA4wXQDhO_D00ECKTu5_imw"></link> <published>2019-07-10T04:11:14Z</published> <updated>2019-07-10T04:11:14Z</updated> <content type="html">Pineview second baseman Brayden <b>Slack</b>, right, tries to tag out Rumford runner James Lynch, who slides into second with a double in the second&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:3167943241172286723</id> <title type="html">Global Enterprise Collaboration Software Market 2019 IBM Corporation, Microsoft Corporation ...</title> <link href="https://www.google.com/url?rct=j&sa=t&url=http://marketnewswire24.us/17010/global-enterprise-collaboration-software-market-2019-ibm-corporation-microsoft-corporation-slack-technologies-inc/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNHG-jxznBgS52cob3KFPnXyFhGW8g"></link> <published>2019-07-10T03:36:51Z</published> <updated>2019-07-10T03:36:51Z</updated> <content type="html">Leading Enterprise Collaboration Software Industry Players Included In The Report Are: IBM Corporation, Microsoft Corporation, <b>Slack</b> technologies,&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:15024912487216559816</id> <title type="html">Armed man killed, K-9 shot in Citrus Heights officer-involved shooting near Sunrise Mall</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://www.sacbee.com/news/local/crime/article232483667.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNENE1Tle1J2dM3ZxqdYaLWlI4xoyg"></link> <published>2019-07-10T03:33:51Z</published> <updated>2019-07-10T03:33:51Z</updated> <content type="html">A Citrus Heights officer, the K-9&#39;s handler, also was shot through the <b>slack</b> in his uniform but was not injured, said police spokesman Lt. Chad Morris.</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:14640835878759953379</id> <title type="html">Automotive <b>Slack</b> Adjuster 3150 Market Report – A Complete Overview of Market Segments and ...</title> <link href="https://www.google.com/url?rct=j&sa=t&url=http://cw57.tv/market-research-news/69293/automotive-slack-adjuster-3150-market-report-a-complete-overview-of-market-segments-and-the-regional-outlook-of-automotive-slack-adjuster-3150-industry/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNHKbCms6OnCO67WnO8_fhejvqS4Bg"></link> <published>2019-07-10T03:22:30Z</published> <updated>2019-07-10T03:22:30Z</updated> <content type="html">This Automotive <b>Slack</b> Adjuster 3150 market report presents a comprehensive overview, market shares, and growth opportunities of Automotive <b>Slack</b>&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:16965181355074777371</id> <title type="html"><b>Slack</b> and Spotify debuts tempt companies to cut out the middlemen</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://www.ft.com/content/6ee262ba-a1f5-11e9-974c-ad1c6ab5efd1&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNGE6e4LnMTVczc_IGbhgiSinZqQ9Q"></link> <published>2019-07-10T03:00:00Z</published> <updated>2019-07-10T03:00:00Z</updated> <content type="html">Last month, messaging service <b>Slack</b> bypassed convention with a “direct listing,” where shares become tradable on an exchange, but no money is&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13555337362872998403</id> <title type="html"><b>Slack</b> Technologies, Inc. (NYSE:WORK) Has Witnessed Cash Flow Change of</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://thestockminute.com/slack-technologies-inc-nysework-has-witnessed-cash-flow-change-of/48532/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNGm59ORBBH9vi4-WMWFURi4MQfRDw"></link> <published>2019-07-10T02:03:45Z</published> <updated>2019-07-10T02:03:45Z</updated> <content type="html">Investors looking to take advantage of cash heavy shares, they might look first to the cash flow of a company, and how fast that is growing. <b>Slack</b>&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:443267995170339225</id> <title type="html">Insider Selling: <b>Slack</b> (NASDAQ:WORK) Insider Sells 1500 Shares of Stock</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://rivertonroll.com/news/2019/07/09/slack-nasdaqwork-insider-cal-henderson-sells-1500-shares-2.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNF7JwPeGB209qmU1JTDp36eQBFexA"></link> <published>2019-07-10T01:30:00Z</published> <updated>2019-07-10T01:30:00Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) insider Cal Henderson sold 1,500 shares of <b>Slack</b> stock in a transaction dated Friday, June 28th. The shares were sold at an&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13952751448219995557</id> <title type="html"><b>Slack</b> (NASDAQ:WORK) CEO Sells $91750.00 in Stock</title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://rivertonroll.com/news/2019/07/09/insider-selling-slack-nasdaqwork-ceo-sells-2500-shares-of-stock.html&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNFpplJXjDKxXBAEKaxL4p87dlJXVg"></link> <published>2019-07-10T00:45:00Z</published> <updated>2019-07-10T00:45:00Z</updated> <content type="html"><b>Slack</b> (NASDAQ:WORK) CEO Stewart Butterfield sold 2,500 shares of the firm&#39;s stock in a transaction that occurred on Friday, June 28th. The shares&nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13546348949071100939</id> <title type="html">Latest research shows Microsoft Teams is stomping <b>Slack</b></title> <link href="https://www.google.com/url?rct=j&sa=t&url=https://mspoweruser.com/latest-research-shows-microsoft-teams-is-stomping-slack/&ct=ga&cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&usg=AFQjCNHlMxJk51Ai598ebVkCpaKE2uStCw"></link> <published>2019-07-09T23:59:57Z</published> <updated>2019-07-09T23:59:57Z</updated> <content type="html">A new survey by market research firm ETR has shown that enterprise collaboration software <b>Slack</b> is losing ground to Microsoft Teams, especially with&nbsp;...</content> <author> <name></name> </author> </entry> </feed> 
         | 
    
        metadata
    CHANGED
    
    | @@ -1,10 +1,11 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: feedjira
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Adam Hess
         | 
| 8 | 
            +
            - Akinori Musha
         | 
| 8 9 | 
             
            - Ezekiel Templin
         | 
| 9 10 | 
             
            - Jon Allured
         | 
| 10 11 | 
             
            - Julien Kirch
         | 
| @@ -13,7 +14,7 @@ authors: | |
| 13 14 | 
             
            autorequire: 
         | 
| 14 15 | 
             
            bindir: bin
         | 
| 15 16 | 
             
            cert_chain: []
         | 
| 16 | 
            -
            date: 2019- | 
| 17 | 
            +
            date: 2019-11-21 00:00:00.000000000 Z
         | 
| 17 18 | 
             
            dependencies:
         | 
| 18 19 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 19 20 | 
             
              name: loofah
         | 
| @@ -21,14 +22,14 @@ dependencies: | |
| 21 22 | 
             
                requirements:
         | 
| 22 23 | 
             
                - - ">="
         | 
| 23 24 | 
             
                  - !ruby/object:Gem::Version
         | 
| 24 | 
            -
                    version: 2. | 
| 25 | 
            +
                    version: 2.3.1
         | 
| 25 26 | 
             
              type: :runtime
         | 
| 26 27 | 
             
              prerelease: false
         | 
| 27 28 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 28 29 | 
             
                requirements:
         | 
| 29 30 | 
             
                - - ">="
         | 
| 30 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 31 | 
            -
                    version: 2. | 
| 32 | 
            +
                    version: 2.3.1
         | 
| 32 33 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 33 34 | 
             
              name: sax-machine
         | 
| 34 35 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -165,8 +166,11 @@ files: | |
| 165 166 | 
             
            - lib/feedjira/parser/atom_entry.rb
         | 
| 166 167 | 
             
            - lib/feedjira/parser/atom_feed_burner.rb
         | 
| 167 168 | 
             
            - lib/feedjira/parser/atom_feed_burner_entry.rb
         | 
| 169 | 
            +
            - lib/feedjira/parser/atom_google_alerts.rb
         | 
| 170 | 
            +
            - lib/feedjira/parser/atom_google_alerts_entry.rb
         | 
| 168 171 | 
             
            - lib/feedjira/parser/atom_youtube.rb
         | 
| 169 172 | 
             
            - lib/feedjira/parser/atom_youtube_entry.rb
         | 
| 173 | 
            +
            - lib/feedjira/parser/globally_unique_identifier.rb
         | 
| 170 174 | 
             
            - lib/feedjira/parser/google_docs_atom.rb
         | 
| 171 175 | 
             
            - lib/feedjira/parser/google_docs_atom_entry.rb
         | 
| 172 176 | 
             
            - lib/feedjira/parser/itunes_rss.rb
         | 
| @@ -192,6 +196,8 @@ files: | |
| 192 196 | 
             
            - spec/feedjira/parser/atom_entry_spec.rb
         | 
| 193 197 | 
             
            - spec/feedjira/parser/atom_feed_burner_entry_spec.rb
         | 
| 194 198 | 
             
            - spec/feedjira/parser/atom_feed_burner_spec.rb
         | 
| 199 | 
            +
            - spec/feedjira/parser/atom_google_alerts_entry_spec.rb
         | 
| 200 | 
            +
            - spec/feedjira/parser/atom_google_alerts_spec.rb
         | 
| 195 201 | 
             
            - spec/feedjira/parser/atom_spec.rb
         | 
| 196 202 | 
             
            - spec/feedjira/parser/atom_youtube_entry_spec.rb
         | 
| 197 203 | 
             
            - spec/feedjira/parser/atom_youtube_spec.rb
         | 
| @@ -231,6 +237,7 @@ files: | |
| 231 237 | 
             
            - spec/sample_feeds/PaulDixExplainsNothingAlternate.xml
         | 
| 232 238 | 
             
            - spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml
         | 
| 233 239 | 
             
            - spec/sample_feeds/PaulDixExplainsNothingWFW.xml
         | 
| 240 | 
            +
            - spec/sample_feeds/Permalinks.xml
         | 
| 234 241 | 
             
            - spec/sample_feeds/SamRuby.xml
         | 
| 235 242 | 
             
            - spec/sample_feeds/TechCrunch.xml
         | 
| 236 243 | 
             
            - spec/sample_feeds/TechCrunchFirstEntry.xml
         | 
| @@ -240,6 +247,7 @@ files: | |
| 240 247 | 
             
            - spec/sample_feeds/TrotterCashionHome.xml
         | 
| 241 248 | 
             
            - spec/sample_feeds/TypePadNews.xml
         | 
| 242 249 | 
             
            - spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
         | 
| 250 | 
            +
            - spec/sample_feeds/google_alerts_atom.xml
         | 
| 243 251 | 
             
            - spec/sample_feeds/itunes.xml
         | 
| 244 252 | 
             
            - spec/sample_feeds/json_feed.json
         | 
| 245 253 | 
             
            - spec/sample_feeds/pet_atom.xml
         | 
| @@ -280,6 +288,8 @@ test_files: | |
| 280 288 | 
             
            - spec/feedjira/parser/atom_entry_spec.rb
         | 
| 281 289 | 
             
            - spec/feedjira/parser/atom_feed_burner_entry_spec.rb
         | 
| 282 290 | 
             
            - spec/feedjira/parser/atom_feed_burner_spec.rb
         | 
| 291 | 
            +
            - spec/feedjira/parser/atom_google_alerts_entry_spec.rb
         | 
| 292 | 
            +
            - spec/feedjira/parser/atom_google_alerts_spec.rb
         | 
| 283 293 | 
             
            - spec/feedjira/parser/atom_spec.rb
         | 
| 284 294 | 
             
            - spec/feedjira/parser/atom_youtube_entry_spec.rb
         | 
| 285 295 | 
             
            - spec/feedjira/parser/atom_youtube_spec.rb
         | 
| @@ -319,6 +329,7 @@ test_files: | |
| 319 329 | 
             
            - spec/sample_feeds/PaulDixExplainsNothingAlternate.xml
         | 
| 320 330 | 
             
            - spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml
         | 
| 321 331 | 
             
            - spec/sample_feeds/PaulDixExplainsNothingWFW.xml
         | 
| 332 | 
            +
            - spec/sample_feeds/Permalinks.xml
         | 
| 322 333 | 
             
            - spec/sample_feeds/SamRuby.xml
         | 
| 323 334 | 
             
            - spec/sample_feeds/TechCrunch.xml
         | 
| 324 335 | 
             
            - spec/sample_feeds/TechCrunchFirstEntry.xml
         | 
| @@ -328,6 +339,7 @@ test_files: | |
| 328 339 | 
             
            - spec/sample_feeds/TrotterCashionHome.xml
         | 
| 329 340 | 
             
            - spec/sample_feeds/TypePadNews.xml
         | 
| 330 341 | 
             
            - spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
         | 
| 342 | 
            +
            - spec/sample_feeds/google_alerts_atom.xml
         | 
| 331 343 | 
             
            - spec/sample_feeds/itunes.xml
         | 
| 332 344 | 
             
            - spec/sample_feeds/json_feed.json
         | 
| 333 345 | 
             
            - spec/sample_feeds/pet_atom.xml
         |