feedjira 3.2.0 → 3.2.2
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/.github/ISSUE_TEMPLATE/general-issue.md +8 -0
- data/.github/workflows/ruby.yml +1 -1
- data/.rubocop.yml +33 -1
- data/CHANGELOG.md +13 -0
- data/Gemfile +0 -3
- data/README.md +1 -2
- data/feedjira.gemspec +7 -3
- data/lib/feedjira/core_ext/date.rb +3 -2
- data/lib/feedjira/core_ext/time.rb +1 -1
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +1 -1
- data/lib/feedjira/feed_utilities.rb +3 -3
- data/lib/feedjira/parser/atom_feed_burner.rb +1 -1
- data/lib/feedjira/parser/atom_google_alerts_entry.rb +2 -0
- data/lib/feedjira/parser/atom_youtube.rb +2 -2
- data/lib/feedjira/parser/google_docs_atom.rb +1 -1
- data/lib/feedjira/parser/itunes_rss_category.rb +2 -2
- data/lib/feedjira/parser/podlove_chapter.rb +2 -2
- data/lib/feedjira/parser/rss.rb +1 -1
- data/lib/feedjira/parser/rss_feed_burner.rb +2 -2
- data/lib/feedjira/rss_entry_utilities.rb +5 -1
- data/lib/feedjira/version.rb +1 -1
- data/lib/feedjira.rb +2 -2
- data/spec/feedjira/feed_spec.rb +11 -10
- data/spec/feedjira/{date_time_utilities_spec.rb → feed_utilities_date_time_spec.rb} +8 -8
- data/spec/feedjira/{feed_entry_utilities_spec.rb → feed_utilities_entry_spec.rb} +9 -9
- data/spec/feedjira/feed_utilities_spec.rb +37 -42
- data/spec/feedjira/parser/atom_entry_spec.rb +16 -16
- data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +10 -10
- data/spec/feedjira/parser/atom_feed_burner_spec.rb +26 -26
- data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +6 -6
- data/spec/feedjira/parser/atom_google_alerts_spec.rb +13 -13
- data/spec/feedjira/parser/atom_spec.rb +23 -23
- data/spec/feedjira/parser/atom_youtube_entry_spec.rb +19 -19
- data/spec/feedjira/parser/atom_youtube_spec.rb +13 -13
- data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +3 -3
- data/spec/feedjira/parser/google_docs_atom_spec.rb +8 -8
- data/spec/feedjira/parser/{itunes_rss_item_spec.rb → i_tunes_rss_item_spec.rb} +18 -18
- data/spec/feedjira/parser/{itunes_rss_owner_spec.rb → i_tunes_rss_owner_spec.rb} +3 -3
- data/spec/feedjira/parser/itunes_rss_spec.rb +26 -26
- data/spec/feedjira/parser/json_feed_item_spec.rb +11 -11
- data/spec/feedjira/parser/json_feed_spec.rb +14 -14
- data/spec/feedjira/parser/podlove_chapter_spec.rb +7 -7
- data/spec/feedjira/parser/rss_entry_spec.rb +26 -20
- data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +16 -15
- data/spec/feedjira/parser/rss_feed_burner_spec.rb +17 -17
- data/spec/feedjira/parser/rss_spec.rb +25 -25
- data/spec/feedjira/preprocessor_spec.rb +3 -3
- data/spec/feedjira_spec.rb +41 -41
- data/spec/sample_feeds/RSSWithComments.xml +277 -0
- data/spec/sample_feeds.rb +2 -1
- metadata +68 -77
data/spec/feedjira_spec.rb
CHANGED
@@ -4,10 +4,10 @@ require "spec_helper"
|
|
4
4
|
|
5
5
|
RSpec.describe Feedjira do
|
6
6
|
describe ".parse" do
|
7
|
-
context "
|
8
|
-
it "
|
9
|
-
parser =
|
10
|
-
feed =
|
7
|
+
context "when the parser is specified" do
|
8
|
+
it "parses an rss feed" do
|
9
|
+
parser = described_class.parser_for_xml(sample_rss_feed)
|
10
|
+
feed = described_class.parse(sample_rss_feed, parser: parser)
|
11
11
|
|
12
12
|
expect(feed.title).to eq "Tender Lovemaking"
|
13
13
|
published = Time.parse_safely "Thu Dec 04 17:17:49 UTC 2008"
|
@@ -17,40 +17,40 @@ RSpec.describe Feedjira do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
context "when there's an available parser" do
|
20
|
-
it "
|
21
|
-
feed =
|
20
|
+
it "parses an rdf feed" do
|
21
|
+
feed = described_class.parse(sample_rdf_feed)
|
22
22
|
expect(feed.title).to eq "HREF Considered Harmful"
|
23
23
|
published = Time.parse_safely("Tue Sep 02 19:50:07 UTC 2008")
|
24
24
|
expect(feed.entries.first.published).to eq published
|
25
25
|
expect(feed.entries.size).to eq 10
|
26
26
|
end
|
27
27
|
|
28
|
-
it "
|
29
|
-
feed =
|
28
|
+
it "parses an rss feed" do
|
29
|
+
feed = described_class.parse(sample_rss_feed)
|
30
30
|
expect(feed.title).to eq "Tender Lovemaking"
|
31
31
|
published = Time.parse_safely "Thu Dec 04 17:17:49 UTC 2008"
|
32
32
|
expect(feed.entries.first.published).to eq published
|
33
33
|
expect(feed.entries.size).to eq 10
|
34
34
|
end
|
35
35
|
|
36
|
-
it "
|
37
|
-
feed =
|
36
|
+
it "parses an atom feed" do
|
37
|
+
feed = described_class.parse(sample_atom_feed)
|
38
38
|
expect(feed.title).to eq "Amazon Web Services Blog"
|
39
39
|
published = Time.parse_safely "Fri Jan 16 18:21:00 UTC 2009"
|
40
40
|
expect(feed.entries.first.published).to eq published
|
41
41
|
expect(feed.entries.size).to eq 10
|
42
42
|
end
|
43
43
|
|
44
|
-
it "
|
45
|
-
feed =
|
44
|
+
it "parses an feedburner atom feed" do
|
45
|
+
feed = described_class.parse(sample_feedburner_atom_feed)
|
46
46
|
expect(feed.title).to eq "Paul Dix Explains Nothing"
|
47
47
|
published = Time.parse_safely "Thu Jan 22 15:50:22 UTC 2009"
|
48
48
|
expect(feed.entries.first.published).to eq published
|
49
49
|
expect(feed.entries.size).to eq 5
|
50
50
|
end
|
51
51
|
|
52
|
-
it "
|
53
|
-
feed =
|
52
|
+
it "parses an itunes feed" do
|
53
|
+
feed = described_class.parse(sample_itunes_feed)
|
54
54
|
expect(feed.title).to eq "All About Everything"
|
55
55
|
published = Time.parse_safely "Wed, 15 Jun 2005 19:00:00 GMT"
|
56
56
|
expect(feed.entries.first.published).to eq published
|
@@ -58,7 +58,7 @@ RSpec.describe Feedjira do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it "with nested dc:identifier it does not overwrite entry_id" do
|
61
|
-
feed =
|
61
|
+
feed = described_class.parse(sample_rss_feed_huffpost_ca)
|
62
62
|
expect(feed.title.strip).to eq "HuffPost Canada - Athena2 - All Posts"
|
63
63
|
expect(feed.entries.size).to eq 2
|
64
64
|
expect(feed.entries.first.id).to eq "23246627"
|
@@ -66,9 +66,9 @@ RSpec.describe Feedjira do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
it "does not fail if multiple published dates exist and some are unparseable" do
|
69
|
-
expect(
|
69
|
+
expect(described_class.logger).to receive(:warn).twice
|
70
70
|
|
71
|
-
feed =
|
71
|
+
feed = described_class.parse(sample_invalid_date_format_feed)
|
72
72
|
expect(feed.title).to eq "Invalid date format feed"
|
73
73
|
published = Time.parse_safely "Mon, 16 Oct 2017 15:10:00 GMT"
|
74
74
|
expect(feed.entries.first.published).to eq published
|
@@ -77,23 +77,23 @@ RSpec.describe Feedjira do
|
|
77
77
|
end
|
78
78
|
|
79
79
|
context "when there's no available parser" do
|
80
|
-
it "raises
|
80
|
+
it "raises described_class::NoParserAvailable" do
|
81
81
|
expect do
|
82
|
-
|
83
|
-
end.to raise_error(
|
82
|
+
described_class.parse("I'm an invalid feed")
|
83
|
+
end.to raise_error(described_class::NoParserAvailable)
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
it "
|
88
|
-
feed =
|
87
|
+
it "parses an feedburner rss feed" do
|
88
|
+
feed = described_class.parse(sample_rss_feed_burner_feed)
|
89
89
|
expect(feed.title).to eq "TechCrunch"
|
90
90
|
published = Time.parse_safely "Wed Nov 02 17:25:27 UTC 2011"
|
91
91
|
expect(feed.entries.first.published).to eq published
|
92
92
|
expect(feed.entries.size).to eq 20
|
93
93
|
end
|
94
94
|
|
95
|
-
it "
|
96
|
-
feed =
|
95
|
+
it "parses an RSS feed with an a10 namespace" do
|
96
|
+
feed = described_class.parse(sample_rss_feed_with_a10_namespace)
|
97
97
|
expect(feed.url).to eq "http://www.example.com/"
|
98
98
|
expect(feed.entries.first.url).to eq "http://www.example.com/5"
|
99
99
|
expect(feed.entries.first.updated).to eq Time.parse_safely("2020-05-14T10:00:18Z")
|
@@ -105,44 +105,44 @@ RSpec.describe Feedjira do
|
|
105
105
|
describe ".parser_for_xml" do
|
106
106
|
it "with Google Docs atom feed it returns the GoogleDocsAtom parser" do
|
107
107
|
xml = sample_google_docs_list_feed
|
108
|
-
actual_parser =
|
109
|
-
expect(actual_parser).to eq
|
108
|
+
actual_parser = described_class.parser_for_xml(xml)
|
109
|
+
expect(actual_parser).to eq described_class::Parser::GoogleDocsAtom
|
110
110
|
end
|
111
111
|
|
112
112
|
it "with an atom feed it returns the Atom parser" do
|
113
113
|
xml = sample_atom_feed
|
114
|
-
actual_parser =
|
115
|
-
expect(actual_parser).to eq
|
114
|
+
actual_parser = described_class.parser_for_xml(xml)
|
115
|
+
expect(actual_parser).to eq described_class::Parser::Atom
|
116
116
|
end
|
117
117
|
|
118
118
|
it "with an atom feedburner feed it returns the AtomFeedBurner parser" do
|
119
119
|
xml = sample_feedburner_atom_feed
|
120
|
-
actual_parser =
|
121
|
-
expect(actual_parser).to eq
|
120
|
+
actual_parser = described_class.parser_for_xml(xml)
|
121
|
+
expect(actual_parser).to eq described_class::Parser::AtomFeedBurner
|
122
122
|
end
|
123
123
|
|
124
124
|
it "with an rdf feed it returns the RSS parser" do
|
125
125
|
xml = sample_rdf_feed
|
126
|
-
actual_parser =
|
127
|
-
expect(actual_parser).to eq
|
126
|
+
actual_parser = described_class.parser_for_xml(xml)
|
127
|
+
expect(actual_parser).to eq described_class::Parser::RSS
|
128
128
|
end
|
129
129
|
|
130
130
|
it "with an rss feedburner feed it returns the RSSFeedBurner parser" do
|
131
131
|
xml = sample_rss_feed_burner_feed
|
132
|
-
actual_parser =
|
133
|
-
expect(actual_parser).to eq
|
132
|
+
actual_parser = described_class.parser_for_xml(xml)
|
133
|
+
expect(actual_parser).to eq described_class::Parser::RSSFeedBurner
|
134
134
|
end
|
135
135
|
|
136
136
|
it "with an rss 2.0 feed it returns the RSS parser" do
|
137
137
|
xml = sample_rss_feed
|
138
|
-
actual_parser =
|
139
|
-
expect(actual_parser).to eq
|
138
|
+
actual_parser = described_class.parser_for_xml(xml)
|
139
|
+
expect(actual_parser).to eq described_class::Parser::RSS
|
140
140
|
end
|
141
141
|
|
142
142
|
it "with an itunes feed it returns the RSS parser" do
|
143
143
|
xml = sample_itunes_feed
|
144
|
-
actual_parser =
|
145
|
-
expect(actual_parser).to eq
|
144
|
+
actual_parser = described_class.parser_for_xml(xml)
|
145
|
+
expect(actual_parser).to eq described_class::Parser::ITunesRSS
|
146
146
|
end
|
147
147
|
|
148
148
|
context "when parsers are configured" do
|
@@ -154,12 +154,12 @@ RSpec.describe Feedjira do
|
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
|
-
|
157
|
+
described_class.configure { |config| config.parsers = [new_parser] }
|
158
158
|
|
159
|
-
parser =
|
159
|
+
parser = described_class.parser_for_xml(xml)
|
160
160
|
expect(parser).to eq(new_parser)
|
161
161
|
|
162
|
-
|
162
|
+
described_class.reset_configuration!
|
163
163
|
end
|
164
164
|
end
|
165
165
|
end
|
@@ -0,0 +1,277 @@
|
|
1
|
+
<rss version="2.0">
|
2
|
+
<channel>
|
3
|
+
<title>Hacker News</title>
|
4
|
+
<link>https://news.ycombinator.com/</link>
|
5
|
+
<description>Links for the intellectually curious, ranked by readers.</description>
|
6
|
+
<item>
|
7
|
+
<title>AWS Lambda Function URLs: Built-In HTTPS Endpoints for Lambda</title>
|
8
|
+
<link>https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/</link>
|
9
|
+
<pubDate>Wed, 6 Apr 2022 21:07:47 +0000</pubDate>
|
10
|
+
<comments>https://news.ycombinator.com/item?id=30937433</comments>
|
11
|
+
<description>
|
12
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30937433">Comments</a>]]>
|
13
|
+
</description>
|
14
|
+
</item>
|
15
|
+
<item>
|
16
|
+
<title>Dall-E 2</title>
|
17
|
+
<link>https://openai.com/dall-e-2/</link>
|
18
|
+
<pubDate>Wed, 6 Apr 2022 14:09:04 +0000</pubDate>
|
19
|
+
<comments>https://news.ycombinator.com/item?id=30932095</comments>
|
20
|
+
<description>
|
21
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30932095">Comments</a>]]>
|
22
|
+
</description>
|
23
|
+
</item>
|
24
|
+
<item>
|
25
|
+
<title>Twitter Bluesky: A Self-Authenticating Social Protocol</title>
|
26
|
+
<link>https://blueskyweb.xyz/blog/3-6-2022-a-self-authenticating-social-protocol</link>
|
27
|
+
<pubDate>Wed, 6 Apr 2022 21:23:54 +0000</pubDate>
|
28
|
+
<comments>https://news.ycombinator.com/item?id=30937578</comments>
|
29
|
+
<description>
|
30
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30937578">Comments</a>]]>
|
31
|
+
</description>
|
32
|
+
</item>
|
33
|
+
<item>
|
34
|
+
<title>The existence of true one-way functions depends on Kolmogorov complexity</title>
|
35
|
+
<link>https://www.quantamagazine.org/researchers-identify-master-problem-underlying-all-cryptography-20220406/</link>
|
36
|
+
<pubDate>Wed, 6 Apr 2022 17:01:46 +0000</pubDate>
|
37
|
+
<comments>https://news.ycombinator.com/item?id=30934721</comments>
|
38
|
+
<description>
|
39
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30934721">Comments</a>]]>
|
40
|
+
</description>
|
41
|
+
</item>
|
42
|
+
<item>
|
43
|
+
<title>You can do a lot with an empty file</title>
|
44
|
+
<link>https://rachelbythebay.com/w/2022/04/06/text/</link>
|
45
|
+
<pubDate>Wed, 6 Apr 2022 19:16:37 +0000</pubDate>
|
46
|
+
<comments>https://news.ycombinator.com/item?id=30936333</comments>
|
47
|
+
<description>
|
48
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30936333">Comments</a>]]>
|
49
|
+
</description>
|
50
|
+
</item>
|
51
|
+
<item>
|
52
|
+
<title>λ-2D: An exploration of drawing as programming language</title>
|
53
|
+
<link>https://www.media.mit.edu/projects/2d-an-exploration-of-drawing-as-programming-language-featuring-ideas-from-lambda-calculus/overview/</link>
|
54
|
+
<pubDate>Wed, 6 Apr 2022 14:44:41 +0000</pubDate>
|
55
|
+
<comments>https://news.ycombinator.com/item?id=30932552</comments>
|
56
|
+
<description>
|
57
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30932552">Comments</a>]]>
|
58
|
+
</description>
|
59
|
+
</item>
|
60
|
+
<item>
|
61
|
+
<title>Your competitor wrote the RFP you're bidding on</title>
|
62
|
+
<link>https://www.sofuckingagile.com/blog/your-competitor-wrote-the-rfp-you-are-bidding-on</link>
|
63
|
+
<pubDate>Wed, 6 Apr 2022 14:48:40 +0000</pubDate>
|
64
|
+
<comments>https://news.ycombinator.com/item?id=30932596</comments>
|
65
|
+
<description>
|
66
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30932596">Comments</a>]]>
|
67
|
+
</description>
|
68
|
+
</item>
|
69
|
+
<item>
|
70
|
+
<title>Inside London's first Ketamine therapy clinic</title>
|
71
|
+
<link>https://www.leafie.co.uk/articles/inside-londons-first-ketamine-therapy-clinic/</link>
|
72
|
+
<pubDate>Wed, 6 Apr 2022 22:08:36 +0000</pubDate>
|
73
|
+
<comments>https://news.ycombinator.com/item?id=30938074</comments>
|
74
|
+
<description>
|
75
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30938074">Comments</a>]]>
|
76
|
+
</description>
|
77
|
+
</item>
|
78
|
+
<item>
|
79
|
+
<title>Smarking (YC W15) is hiring staff and engineers to digitize the parking industry</title>
|
80
|
+
<link>https://jobs.lever.co/smarking/01b7a4c5-28ce-4a4c-9c88-d4cad6c01c76</link>
|
81
|
+
<pubDate>Wed, 6 Apr 2022 21:00:55 +0000</pubDate>
|
82
|
+
<comments>https://news.ycombinator.com/item?id=30937371</comments>
|
83
|
+
<description>
|
84
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30937371">Comments</a>]]>
|
85
|
+
</description>
|
86
|
+
</item>
|
87
|
+
<item>
|
88
|
+
<title>Ask HN: Share your personal site</title>
|
89
|
+
<link>https://news.ycombinator.com/item?id=30934529</link>
|
90
|
+
<pubDate>Wed, 6 Apr 2022 16:48:33 +0000</pubDate>
|
91
|
+
<comments>https://news.ycombinator.com/item?id=30934529</comments>
|
92
|
+
<description>
|
93
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30934529">Comments</a>]]>
|
94
|
+
</description>
|
95
|
+
</item>
|
96
|
+
<item>
|
97
|
+
<title>The State of Fortran</title>
|
98
|
+
<link>https://arxiv.org/abs/2203.15110</link>
|
99
|
+
<pubDate>Wed, 6 Apr 2022 18:20:19 +0000</pubDate>
|
100
|
+
<comments>https://news.ycombinator.com/item?id=30935633</comments>
|
101
|
+
<description>
|
102
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30935633">Comments</a>]]>
|
103
|
+
</description>
|
104
|
+
</item>
|
105
|
+
<item>
|
106
|
+
<title>A whole website in a single JavaScript file</title>
|
107
|
+
<link>https://deno.com/blog/a-whole-website-in-a-single-js-file</link>
|
108
|
+
<pubDate>Wed, 6 Apr 2022 16:07:19 +0000</pubDate>
|
109
|
+
<comments>https://news.ycombinator.com/item?id=30933831</comments>
|
110
|
+
<description>
|
111
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30933831">Comments</a>]]>
|
112
|
+
</description>
|
113
|
+
</item>
|
114
|
+
<item>
|
115
|
+
<title>Language of fungi derived from their electrical spiking activity</title>
|
116
|
+
<link>https://royalsocietypublishing.org/doi/10.1098/rsos.211926</link>
|
117
|
+
<pubDate>Wed, 6 Apr 2022 13:58:09 +0000</pubDate>
|
118
|
+
<comments>https://news.ycombinator.com/item?id=30931998</comments>
|
119
|
+
<description>
|
120
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30931998">Comments</a>]]>
|
121
|
+
</description>
|
122
|
+
</item>
|
123
|
+
<item>
|
124
|
+
<title>In defense of simple architectures</title>
|
125
|
+
<link>https://danluu.com/simple-architectures/</link>
|
126
|
+
<pubDate>Wed, 6 Apr 2022 19:04:29 +0000</pubDate>
|
127
|
+
<comments>https://news.ycombinator.com/item?id=30936189</comments>
|
128
|
+
<description>
|
129
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30936189">Comments</a>]]>
|
130
|
+
</description>
|
131
|
+
</item>
|
132
|
+
<item>
|
133
|
+
<title>Show HN: MetricFlow – open-source metric framework</title>
|
134
|
+
<link>https://github.com/transform-data/metricflow</link>
|
135
|
+
<pubDate>Wed, 6 Apr 2022 22:12:03 +0000</pubDate>
|
136
|
+
<comments>https://news.ycombinator.com/item?id=30938109</comments>
|
137
|
+
<description>
|
138
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30938109">Comments</a>]]>
|
139
|
+
</description>
|
140
|
+
</item>
|
141
|
+
<item>
|
142
|
+
<title>The remarkable brain of a carpet cleaner who speaks 24 languages</title>
|
143
|
+
<link>https://www.washingtonpost.com/dc-md-va/interactive/2022/multilingual-hyperpolyglot-brain-languages/</link>
|
144
|
+
<pubDate>Tue, 5 Apr 2022 15:31:04 +0000</pubDate>
|
145
|
+
<comments>https://news.ycombinator.com/item?id=30920287</comments>
|
146
|
+
<description>
|
147
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30920287">Comments</a>]]>
|
148
|
+
</description>
|
149
|
+
</item>
|
150
|
+
<item>
|
151
|
+
<title>It Knows (2011)</title>
|
152
|
+
<link>https://www.lrb.co.uk/the-paper/v33/n19/daniel-soar/it-knows</link>
|
153
|
+
<pubDate>Wed, 6 Apr 2022 08:26:49 +0000</pubDate>
|
154
|
+
<comments>https://news.ycombinator.com/item?id=30929778</comments>
|
155
|
+
<description>
|
156
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30929778">Comments</a>]]>
|
157
|
+
</description>
|
158
|
+
</item>
|
159
|
+
<item>
|
160
|
+
<title>GhostSCAD: Marrying OpenSCAD and Golang</title>
|
161
|
+
<link>https://jany.st/post/2022-04-04-ghostscad-marrying-openscad-and-golang.html</link>
|
162
|
+
<pubDate>Wed, 6 Apr 2022 10:59:47 +0000</pubDate>
|
163
|
+
<comments>https://news.ycombinator.com/item?id=30930665</comments>
|
164
|
+
<description>
|
165
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30930665">Comments</a>]]>
|
166
|
+
</description>
|
167
|
+
</item>
|
168
|
+
<item>
|
169
|
+
<title>Wolfenstein 3D's winding journey from pitch to release</title>
|
170
|
+
<link>https://www.gamedeveloper.com/gdc2022/wolfenstein-3d-postmortem</link>
|
171
|
+
<pubDate>Sun, 3 Apr 2022 02:07:52 +0000</pubDate>
|
172
|
+
<comments>https://news.ycombinator.com/item?id=30893655</comments>
|
173
|
+
<description>
|
174
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30893655">Comments</a>]]>
|
175
|
+
</description>
|
176
|
+
</item>
|
177
|
+
<item>
|
178
|
+
<title>MIPS provides highly scalable RISC processor IP</title>
|
179
|
+
<link>https://www.mips.com/</link>
|
180
|
+
<pubDate>Wed, 6 Apr 2022 18:24:26 +0000</pubDate>
|
181
|
+
<comments>https://news.ycombinator.com/item?id=30935683</comments>
|
182
|
+
<description>
|
183
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30935683">Comments</a>]]>
|
184
|
+
</description>
|
185
|
+
</item>
|
186
|
+
<item>
|
187
|
+
<title>Intel's “Cripple AMD” Function (2019)</title>
|
188
|
+
<link>https://www.agner.org/forum/viewtopic.php?t=6</link>
|
189
|
+
<pubDate>Wed, 6 Apr 2022 17:27:26 +0000</pubDate>
|
190
|
+
<comments>https://news.ycombinator.com/item?id=30935064</comments>
|
191
|
+
<description>
|
192
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30935064">Comments</a>]]>
|
193
|
+
</description>
|
194
|
+
</item>
|
195
|
+
<item>
|
196
|
+
<title>GoodGuesser</title>
|
197
|
+
<link>https://twitter.com/lisperati/status/1509859692855631881</link>
|
198
|
+
<pubDate>Tue, 5 Apr 2022 22:30:05 +0000</pubDate>
|
199
|
+
<comments>https://news.ycombinator.com/item?id=30925917</comments>
|
200
|
+
<description>
|
201
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30925917">Comments</a>]]>
|
202
|
+
</description>
|
203
|
+
</item>
|
204
|
+
<item>
|
205
|
+
<title>Tailscale’s human-scale networks are still controlled by Google and Microsoft</title>
|
206
|
+
<link>https://iliana.fyi/blog/tailscale-auth-and-threat-modeling/</link>
|
207
|
+
<pubDate>Mon, 4 Apr 2022 19:41:11 +0000</pubDate>
|
208
|
+
<comments>https://news.ycombinator.com/item?id=30911109</comments>
|
209
|
+
<description>
|
210
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30911109">Comments</a>]]>
|
211
|
+
</description>
|
212
|
+
</item>
|
213
|
+
<item>
|
214
|
+
<title>Dim, a self-hosted media manager</title>
|
215
|
+
<link>https://github.com/Dusk-Labs/dim</link>
|
216
|
+
<pubDate>Tue, 5 Apr 2022 18:24:59 +0000</pubDate>
|
217
|
+
<comments>https://news.ycombinator.com/item?id=30922871</comments>
|
218
|
+
<description>
|
219
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30922871">Comments</a>]]>
|
220
|
+
</description>
|
221
|
+
</item>
|
222
|
+
<item>
|
223
|
+
<title>Home sweet homepage, a comic about growing up online</title>
|
224
|
+
<link>https://sailorhg.com/home_sweet_homepage/</link>
|
225
|
+
<pubDate>Wed, 6 Apr 2022 19:28:44 +0000</pubDate>
|
226
|
+
<comments>https://news.ycombinator.com/item?id=30936462</comments>
|
227
|
+
<description>
|
228
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30936462">Comments</a>]]>
|
229
|
+
</description>
|
230
|
+
</item>
|
231
|
+
<item>
|
232
|
+
<title>Show HN: Tilepieces – An open source project for visually editing HTML documents</title>
|
233
|
+
<link>https://tilepieces.net</link>
|
234
|
+
<pubDate>Wed, 6 Apr 2022 13:14:06 +0000</pubDate>
|
235
|
+
<comments>https://news.ycombinator.com/item?id=30931586</comments>
|
236
|
+
<description>
|
237
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30931586">Comments</a>]]>
|
238
|
+
</description>
|
239
|
+
</item>
|
240
|
+
<item>
|
241
|
+
<title>TruffleHog v3 – Detect and automatically verify over 600 credential types</title>
|
242
|
+
<link>https://github.com/trufflesecurity/trufflehog</link>
|
243
|
+
<pubDate>Mon, 4 Apr 2022 19:21:30 +0000</pubDate>
|
244
|
+
<comments>https://news.ycombinator.com/item?id=30910893</comments>
|
245
|
+
<description>
|
246
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30910893">Comments</a>]]>
|
247
|
+
</description>
|
248
|
+
</item>
|
249
|
+
<item>
|
250
|
+
<title>Casting Silver Bullets (2013)</title>
|
251
|
+
<link>https://www.patriciabriggs.com/articles/silver/silverbullets.shtml</link>
|
252
|
+
<pubDate>Tue, 5 Apr 2022 20:33:23 +0000</pubDate>
|
253
|
+
<comments>https://news.ycombinator.com/item?id=30924635</comments>
|
254
|
+
<description>
|
255
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30924635">Comments</a>]]>
|
256
|
+
</description>
|
257
|
+
</item>
|
258
|
+
<item>
|
259
|
+
<title>GenieFramework – Build web applications with Julia</title>
|
260
|
+
<link>https://genieframework.com/</link>
|
261
|
+
<pubDate>Wed, 6 Apr 2022 08:45:26 +0000</pubDate>
|
262
|
+
<comments>https://news.ycombinator.com/item?id=30929873</comments>
|
263
|
+
<description>
|
264
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30929873">Comments</a>]]>
|
265
|
+
</description>
|
266
|
+
</item>
|
267
|
+
<item>
|
268
|
+
<title>What’s new in Emacs 28.1?</title>
|
269
|
+
<link>https://www.masteringemacs.org/article/whats-new-in-emacs-28-1</link>
|
270
|
+
<pubDate>Wed, 6 Apr 2022 11:23:33 +0000</pubDate>
|
271
|
+
<comments>https://news.ycombinator.com/item?id=30930816</comments>
|
272
|
+
<description>
|
273
|
+
<![CDATA[<a href="https://news.ycombinator.com/item?id=30930816">Comments</a>]]>
|
274
|
+
</description>
|
275
|
+
</item>
|
276
|
+
</channel>
|
277
|
+
</rss>
|
data/spec/sample_feeds.rb
CHANGED
@@ -34,7 +34,8 @@ module SampleFeeds
|
|
34
34
|
sample_rss_feed_huffpost_ca: "HuffPostCanada.xml",
|
35
35
|
sample_invalid_date_format_feed: "InvalidDateFormat.xml",
|
36
36
|
sample_rss_feed_permalinks: "Permalinks.xml",
|
37
|
-
sample_rss_feed_with_a10_namespace: "a10.xml"
|
37
|
+
sample_rss_feed_with_a10_namespace: "a10.xml",
|
38
|
+
sample_rss_feed_with_comments: "RSSWithComments.xml"
|
38
39
|
}.freeze
|
39
40
|
|
40
41
|
FEEDS.each do |method, filename|
|