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