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 +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
|