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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49efb7655e500df91c7119e3afbb2b91fab6d0a8282703fecb69f24d15f54357
4
- data.tar.gz: ea6fc3b58be4968be8c8561b6e8c2720b5732882ff2556fe6966583df9bcf130
3
+ metadata.gz: 3d77becc66f52f24c3105ebed905255506b0857c1452accf32b6b2f7f691dd8b
4
+ data.tar.gz: 04e39a33e2de97107040f3a10ae8a84fad2441e2bca21c7c0731c58293d47af1
5
5
  SHA512:
6
- metadata.gz: dd52aec9d212c0428095c3adee3cbfd1115d53a54ac2281bf7ce7f4142ace6659e658658097e43edb3c90deec583941ed220aea1fe1709f66110adb79c471620
7
- data.tar.gz: d39bfe14c74a642311d55369498195e588beec99e5bfb897b0f00c5019f1985f89c1280b8c8eaafb3d36f55b9558b04c9037ccc8710c34c4bad2cb6127702d61
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 verison 3.0"
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.2.1"
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
@@ -61,6 +61,7 @@ module Feedjira
61
61
  Feedjira::Parser::GoogleDocsAtom,
62
62
  Feedjira::Parser::AtomYoutube,
63
63
  Feedjira::Parser::AtomFeedBurner,
64
+ Feedjira::Parser::AtomGoogleAlerts,
64
65
  Feedjira::Parser::Atom,
65
66
  Feedjira::Parser::ITunesRSS,
66
67
  Feedjira::Parser::RSS,
@@ -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
- attr_reader :url
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
- @entry_id ||= @dc_identifier || @url
46
+ entry_id || @dc_identifier || @url
42
47
  end
43
- # rubocop:enable Naming/MemoizedInstanceVariableName
44
48
  end
45
49
  end
@@ -1,3 +1,3 @@
1
1
  module Feedjira
2
- VERSION = "3.0.0".freeze
2
+ VERSION = "3.1.0".freeze
3
3
  end
@@ -78,6 +78,7 @@ describe Feedjira::Parser::AtomEntry do
78
78
  published
79
79
  summary
80
80
  title
81
+ title_type
81
82
  updated
82
83
  url
83
84
  )
@@ -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&nbsp;..." # 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.title).to match(/\<i/)
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 &lt;b&gt;Slack&lt;/b&gt; Market by Top key players like Haldex, Meritor, Bendix ...</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;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/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNHUcRGtHY1ygcMDkVS68IgpYs7Wpg"></link> <published>2019-07-10T11:53:37Z</published> <updated>2019-07-10T11:53:37Z</updated> <content type="html">Automotive &lt;b&gt;Slack&lt;/b&gt; Market reports provides a comprehensive overview of the global market size and share. It provides strategists, marketers and senior&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13685523368333461374</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; Stock Has a Compelling Story and the Numbers to Back It Up</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://investorplace.com/2019/07/slack-stock-truly-compelling/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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 &lt;b&gt;Slack&lt;/b&gt; Technologies Inc (NYSE:WORK), much of the news coverage centered on the Company&amp;#39;s decision to go public via&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:16151843349267390757</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) Insider Cal Henderson Sells 1500 Shares</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://rivertonroll.com/news/2019/07/10/slack-nasdaqwork-insider-cal-henderson-sells-1500-shares-3.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNGa9L5blE9C_ZfDAAvEn2wd4T6SMg"></link> <published>2019-07-10T11:36:15Z</published> <updated>2019-07-10T11:36:15Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (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&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:1835132116100339822</id> <title type="html">Recode Daily: &lt;b&gt;Slack&lt;/b&gt; has a Snap problem</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://www.vox.com/2019/7/10/20688476/recode-daily-slack-has-a-snap-problem&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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 &lt;b&gt;Slack&lt;/b&gt; what Facebook was to Snapchat: a copier and a killer. The workplace messaging software &lt;b&gt;Slack&lt;/b&gt; is losing ground to&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:991231131852743341</id> <title type="html">Global Automotive &lt;b&gt;Slack&lt;/b&gt; Market Revenue Share by Players: Haldex, Meritor, Bendix, MEI, Wabco</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://www.globalindustryjournal.us/183648/global-automotive-slack-market-revenue-share-by-players-haldex-meritor-bendix-mei-wabco/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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 &lt;b&gt;Slack&lt;/b&gt; Market, enfolding details of market competition, trends,&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:6847164010869268236</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) Director Sells $39655442.33 in Stock</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://mayfieldrecorder.com/2019/07/10/slack-nasdaqwork-director-chamath-palihapitiya-sells-1017067-shares.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNHgq8lH_XYoxtARd4wwG1AachxXBg"></link> <published>2019-07-10T05:48:45Z</published> <updated>2019-07-10T05:48:45Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) Director Chamath Palihapitiya sold 1,017,067 shares of the firm&amp;#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">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) Insider Cal Henderson Sells 99342 Shares</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://mayfieldrecorder.com/2019/07/10/slack-nasdaqwork-insider-cal-henderson-sells-99342-shares-of-stock.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNFq39KMesisexj52u8TlmigPkty1g"></link> <published>2019-07-10T05:48:45Z</published> <updated>2019-07-10T05:48:45Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) insider Cal Henderson sold 99,342 shares of the firm&amp;#39;s stock in a transaction on Friday, June 21st. The shares were sold at an&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:676733747034138159</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; Wax Market 2019 Global Industry Growth, Historical Analysis, Size, Trends, Emerging ...</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;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/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNGSN1zkCT-nKy9XVtCuwP2Vtr_HMQ"></link> <published>2019-07-10T05:37:30Z</published> <updated>2019-07-10T05:37:30Z</updated> <content type="html">Global “&lt;b&gt;Slack&lt;/b&gt; Wax Market” 2019 Industry research report provides an In-Depth analysis that includes an executive summary, definition, and scope of&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:18336572245163291818</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) SVP Sells $14409915.40 in Stock</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://techknowbits.com/2019/07/10/slack-nasdaqwork-svp-robert-frati-sells-376238-shares-of-stock.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNFkHaZhjSnl6JinAe2lasaG3oKGAg"></link> <published>2019-07-10T05:03:45Z</published> <updated>2019-07-10T05:03:45Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) SVP Robert Frati sold 376,238 shares of the company&amp;#39;s stock in a transaction that occurred on Friday, June 21st. The stock&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:2703912120395789266</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) CFO Sells $19407875.75 in Stock</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://techknowbits.com/2019/07/10/slack-nasdaqwork-cfo-allen-shim-sells-502925-shares-of-stock.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNEXxF5Cfnhwz-SxZFQPvgjPUmgGVQ"></link> <published>2019-07-10T05:03:45Z</published> <updated>2019-07-10T05:03:45Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) CFO Allen Shim sold 502,925 shares of the company&amp;#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">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) CEO Sells $53170714.63 in Stock</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://mayfieldrecorder.com/2019/07/10/slack-nasdaqwork-ceo-stewart-butterfield-sells-1360909-shares.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNFU3yaWB2ZAMHAEg88g4swT73wfUQ"></link> <published>2019-07-10T05:03:45Z</published> <updated>2019-07-10T05:03:45Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) CEO Stewart Butterfield sold 1,360,909 shares of &lt;b&gt;Slack&lt;/b&gt; stock in a transaction on Friday, June 21st. The shares were sold at&amp;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&amp;sa=t&amp;url=http://www.valleybreeze.com/2019-07-09/pawtucket/pineview-advances-district-ii-playoffs&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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 &lt;b&gt;Slack&lt;/b&gt;, right, tries to tag out Rumford runner James Lynch, who slides into second with a double in the second&amp;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&amp;sa=t&amp;url=http://marketnewswire24.us/17010/global-enterprise-collaboration-software-market-2019-ibm-corporation-microsoft-corporation-slack-technologies-inc/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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, &lt;b&gt;Slack&lt;/b&gt; technologies,&amp;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&amp;sa=t&amp;url=https://www.sacbee.com/news/local/crime/article232483667.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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&amp;#39;s handler, also was shot through the &lt;b&gt;slack&lt;/b&gt; 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 &lt;b&gt;Slack&lt;/b&gt; Adjuster 3150 Market Report – A Complete Overview of Market Segments and ...</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;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/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNHKbCms6OnCO67WnO8_fhejvqS4Bg"></link> <published>2019-07-10T03:22:30Z</published> <updated>2019-07-10T03:22:30Z</updated> <content type="html">This Automotive &lt;b&gt;Slack&lt;/b&gt; Adjuster 3150 market report presents a comprehensive overview, market shares, and growth opportunities of Automotive &lt;b&gt;Slack&lt;/b&gt;&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:16965181355074777371</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; and Spotify debuts tempt companies to cut out the middlemen</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://www.ft.com/content/6ee262ba-a1f5-11e9-974c-ad1c6ab5efd1&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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 &lt;b&gt;Slack&lt;/b&gt; bypassed convention with a “direct listing,” where shares become tradable on an exchange, but no money is&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13555337362872998403</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; Technologies, Inc. (NYSE:WORK) Has Witnessed Cash Flow Change of</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://thestockminute.com/slack-technologies-inc-nysework-has-witnessed-cash-flow-change-of/48532/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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. &lt;b&gt;Slack&lt;/b&gt;&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:443267995170339225</id> <title type="html">Insider Selling: &lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) Insider Sells 1500 Shares of Stock</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://rivertonroll.com/news/2019/07/09/slack-nasdaqwork-insider-cal-henderson-sells-1500-shares-2.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNF7JwPeGB209qmU1JTDp36eQBFexA"></link> <published>2019-07-10T01:30:00Z</published> <updated>2019-07-10T01:30:00Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) insider Cal Henderson sold 1,500 shares of &lt;b&gt;Slack&lt;/b&gt; stock in a transaction dated Friday, June 28th. The shares were sold at an&amp;nbsp;...</content> <author> <name></name> </author> </entry><entry> <id>tag:google.com,2013:googlealerts/feed:13952751448219995557</id> <title type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) CEO Sells $91750.00 in Stock</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://rivertonroll.com/news/2019/07/09/insider-selling-slack-nasdaqwork-ceo-sells-2500-shares-of-stock.html&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;usg=AFQjCNFpplJXjDKxXBAEKaxL4p87dlJXVg"></link> <published>2019-07-10T00:45:00Z</published> <updated>2019-07-10T00:45:00Z</updated> <content type="html">&lt;b&gt;Slack&lt;/b&gt; (NASDAQ:WORK) CEO Stewart Butterfield sold 2,500 shares of the firm&amp;#39;s stock in a transaction that occurred on Friday, June 28th. The shares&amp;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 &lt;b&gt;Slack&lt;/b&gt;</title> <link href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://mspoweruser.com/latest-research-shows-microsoft-teams-is-stomping-slack/&amp;ct=ga&amp;cd=CAIyHGU4ZTJkZjQ3OTVkYmIzMTc6Y28uanA6ZW46SlA&amp;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 &lt;b&gt;Slack&lt;/b&gt; is losing ground to Microsoft Teams, especially with&amp;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.0.0
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-07-10 00:00:00.000000000 Z
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.2.1
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.2.1
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