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
|