feedjira 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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