feedjira 2.2.0 → 3.1.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/feed-parsing.md +15 -0
- data/.rubocop.yml +32 -8
- data/.rubocop_todo.yml +11 -0
- data/.travis.yml +3 -7
- data/CHANGELOG.md +18 -9
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -5
- data/README.md +46 -99
- data/Rakefile +8 -6
- data/feedjira.gemspec +31 -20
- data/lib/feedjira.rb +75 -41
- data/lib/feedjira/atom_entry_utilities.rb +51 -0
- data/lib/feedjira/configuration.rb +8 -10
- data/lib/feedjira/core_ext.rb +5 -3
- data/lib/feedjira/core_ext/date.rb +2 -1
- data/lib/feedjira/core_ext/string.rb +2 -1
- data/lib/feedjira/core_ext/time.rb +12 -12
- data/lib/feedjira/date_time_utilities.rb +8 -10
- data/lib/feedjira/date_time_utilities/date_time_epoch_parser.rb +3 -2
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +4 -4
- data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +11 -15
- data/lib/feedjira/feed.rb +12 -82
- data/lib/feedjira/feed_entry_utilities.rb +14 -7
- data/lib/feedjira/feed_utilities.rb +5 -4
- data/lib/feedjira/parser.rb +6 -1
- data/lib/feedjira/parser/atom.rb +6 -5
- data/lib/feedjira/parser/atom_entry.rb +4 -21
- data/lib/feedjira/parser/atom_feed_burner.rb +7 -6
- data/lib/feedjira/parser/atom_feed_burner_entry.rb +7 -18
- data/lib/feedjira/parser/atom_google_alerts.rb +26 -0
- data/lib/feedjira/parser/atom_google_alerts_entry.rb +21 -0
- data/lib/feedjira/parser/atom_youtube.rb +4 -3
- data/lib/feedjira/parser/atom_youtube_entry.rb +9 -8
- data/lib/feedjira/parser/globally_unique_identifier.rb +21 -0
- data/lib/feedjira/parser/google_docs_atom.rb +6 -6
- data/lib/feedjira/parser/google_docs_atom_entry.rb +3 -19
- data/lib/feedjira/parser/itunes_rss.rb +4 -3
- data/lib/feedjira/parser/itunes_rss_category.rb +6 -5
- data/lib/feedjira/parser/itunes_rss_item.rb +5 -8
- data/lib/feedjira/parser/itunes_rss_owner.rb +2 -1
- data/lib/feedjira/parser/json_feed.rb +41 -0
- data/lib/feedjira/parser/json_feed_item.rb +57 -0
- data/lib/feedjira/parser/podlove_chapter.rb +4 -3
- data/lib/feedjira/parser/rss.rb +5 -3
- data/lib/feedjira/parser/rss_entry.rb +3 -24
- data/lib/feedjira/parser/rss_feed_burner.rb +4 -3
- data/lib/feedjira/parser/rss_feed_burner_entry.rb +6 -26
- data/lib/feedjira/parser/rss_image.rb +2 -0
- data/lib/feedjira/preprocessor.rb +4 -4
- data/lib/feedjira/rss_entry_utilities.rb +53 -0
- data/lib/feedjira/version.rb +3 -1
- data/spec/feedjira/configuration_spec.rb +11 -16
- data/spec/feedjira/date_time_utilities_spec.rb +22 -20
- data/spec/feedjira/feed_entry_utilities_spec.rb +20 -18
- data/spec/feedjira/feed_spec.rb +17 -229
- data/spec/feedjira/feed_utilities_spec.rb +75 -73
- data/spec/feedjira/parser/atom_entry_spec.rb +41 -38
- data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +22 -20
- data/spec/feedjira/parser/atom_feed_burner_spec.rb +122 -118
- data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +34 -0
- data/spec/feedjira/parser/atom_google_alerts_spec.rb +62 -0
- data/spec/feedjira/parser/atom_spec.rb +83 -77
- data/spec/feedjira/parser/atom_youtube_entry_spec.rb +41 -39
- data/spec/feedjira/parser/atom_youtube_spec.rb +21 -19
- data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +10 -8
- data/spec/feedjira/parser/google_docs_atom_spec.rb +25 -21
- data/spec/feedjira/parser/itunes_rss_item_spec.rb +39 -37
- data/spec/feedjira/parser/itunes_rss_owner_spec.rb +7 -5
- data/spec/feedjira/parser/itunes_rss_spec.rb +120 -116
- data/spec/feedjira/parser/json_feed_item_spec.rb +81 -0
- data/spec/feedjira/parser/json_feed_spec.rb +55 -0
- data/spec/feedjira/parser/podlove_chapter_spec.rb +14 -12
- data/spec/feedjira/parser/rss_entry_spec.rb +56 -34
- data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +36 -34
- data/spec/feedjira/parser/rss_feed_burner_spec.rb +49 -45
- data/spec/feedjira/parser/rss_spec.rb +38 -36
- data/spec/feedjira/preprocessor_spec.rb +9 -7
- data/spec/feedjira_spec.rb +166 -0
- data/spec/sample_feeds.rb +32 -29
- data/spec/sample_feeds/HuffPostCanada.xml +279 -0
- data/spec/sample_feeds/Permalinks.xml +22 -0
- data/spec/sample_feeds/a10.xml +72 -0
- data/spec/sample_feeds/google_alerts_atom.xml +1 -0
- data/spec/sample_feeds/json_feed.json +156 -0
- data/spec/spec_helper.rb +7 -5
- metadata +59 -70
- data/Dangerfile +0 -1
- data/fixtures/vcr_cassettes/fetch_failure.yml +0 -62
- data/fixtures/vcr_cassettes/parse_error.yml +0 -222
- data/fixtures/vcr_cassettes/success.yml +0 -281
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
require 'sample_feeds'
|
3
|
-
require 'vcr'
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../lib/feedjira")
|
4
|
+
require "sample_feeds"
|
5
|
+
require "vcr"
|
6
|
+
|
7
|
+
SAXMachine.handler = ENV["HANDLER"].to_sym if ENV["HANDLER"]
|
6
8
|
|
7
9
|
VCR.configure do |config|
|
8
|
-
config.cassette_library_dir =
|
10
|
+
config.cassette_library_dir = "fixtures/vcr_cassettes"
|
9
11
|
config.hook_into :faraday
|
10
12
|
end
|
11
13
|
|
metadata
CHANGED
@@ -1,60 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: feedjira
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
-
|
7
|
+
- Adam Hess
|
8
|
+
- Akinori Musha
|
9
9
|
- Ezekiel Templin
|
10
10
|
- Jon Allured
|
11
|
-
|
11
|
+
- Julien Kirch
|
12
|
+
- Michael Stock
|
13
|
+
- Paul Dix
|
14
|
+
autorequire:
|
12
15
|
bindir: bin
|
13
16
|
cert_chain: []
|
14
|
-
date:
|
17
|
+
date: 2020-11-22 00:00:00.000000000 Z
|
15
18
|
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
17
|
-
name: faraday
|
18
|
-
requirement: !ruby/object:Gem::Requirement
|
19
|
-
requirements:
|
20
|
-
- - ">="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '0.9'
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0.9'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: faraday_middleware
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
requirements:
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: '0.9'
|
37
|
-
type: :runtime
|
38
|
-
prerelease: false
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '0.9'
|
44
19
|
- !ruby/object:Gem::Dependency
|
45
20
|
name: loofah
|
46
21
|
requirement: !ruby/object:Gem::Requirement
|
47
22
|
requirements:
|
48
23
|
- - ">="
|
49
24
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
25
|
+
version: 2.3.1
|
51
26
|
type: :runtime
|
52
27
|
prerelease: false
|
53
28
|
version_requirements: !ruby/object:Gem::Requirement
|
54
29
|
requirements:
|
55
30
|
- - ">="
|
56
31
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
32
|
+
version: 2.3.1
|
58
33
|
- !ruby/object:Gem::Dependency
|
59
34
|
name: sax-machine
|
60
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,7 +45,7 @@ dependencies:
|
|
70
45
|
- !ruby/object:Gem::Version
|
71
46
|
version: '1.0'
|
72
47
|
- !ruby/object:Gem::Dependency
|
73
|
-
name:
|
48
|
+
name: faraday
|
74
49
|
requirement: !ruby/object:Gem::Requirement
|
75
50
|
requirements:
|
76
51
|
- - ">="
|
@@ -84,7 +59,7 @@ dependencies:
|
|
84
59
|
- !ruby/object:Gem::Version
|
85
60
|
version: '0'
|
86
61
|
- !ruby/object:Gem::Dependency
|
87
|
-
name:
|
62
|
+
name: rspec
|
88
63
|
requirement: !ruby/object:Gem::Requirement
|
89
64
|
requirements:
|
90
65
|
- - ">="
|
@@ -98,7 +73,7 @@ dependencies:
|
|
98
73
|
- !ruby/object:Gem::Version
|
99
74
|
version: '0'
|
100
75
|
- !ruby/object:Gem::Dependency
|
101
|
-
name:
|
76
|
+
name: rubocop
|
102
77
|
requirement: !ruby/object:Gem::Requirement
|
103
78
|
requirements:
|
104
79
|
- - ">="
|
@@ -111,20 +86,6 @@ dependencies:
|
|
111
86
|
- - ">="
|
112
87
|
- !ruby/object:Gem::Version
|
113
88
|
version: '0'
|
114
|
-
- !ruby/object:Gem::Dependency
|
115
|
-
name: rubocop
|
116
|
-
requirement: !ruby/object:Gem::Requirement
|
117
|
-
requirements:
|
118
|
-
- - '='
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version: '0.46'
|
121
|
-
type: :development
|
122
|
-
prerelease: false
|
123
|
-
version_requirements: !ruby/object:Gem::Requirement
|
124
|
-
requirements:
|
125
|
-
- - '='
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
version: '0.46'
|
128
89
|
- !ruby/object:Gem::Dependency
|
129
90
|
name: vcr
|
130
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,37 +104,37 @@ dependencies:
|
|
143
104
|
name: yard
|
144
105
|
requirement: !ruby/object:Gem::Requirement
|
145
106
|
requirements:
|
146
|
-
- - "
|
107
|
+
- - ">="
|
147
108
|
- !ruby/object:Gem::Version
|
148
|
-
version: '0
|
109
|
+
version: '0'
|
149
110
|
type: :development
|
150
111
|
prerelease: false
|
151
112
|
version_requirements: !ruby/object:Gem::Requirement
|
152
113
|
requirements:
|
153
|
-
- - "
|
114
|
+
- - ">="
|
154
115
|
- !ruby/object:Gem::Version
|
155
|
-
version: '0
|
156
|
-
description:
|
157
|
-
email:
|
116
|
+
version: '0'
|
117
|
+
description:
|
118
|
+
email:
|
158
119
|
executables: []
|
159
120
|
extensions: []
|
160
121
|
extra_rdoc_files: []
|
161
122
|
files:
|
123
|
+
- ".github/ISSUE_TEMPLATE/feed-parsing.md"
|
162
124
|
- ".gitignore"
|
163
125
|
- ".rspec"
|
164
126
|
- ".rubocop.yml"
|
127
|
+
- ".rubocop_todo.yml"
|
165
128
|
- ".travis.yml"
|
166
129
|
- CHANGELOG.md
|
167
|
-
-
|
130
|
+
- CODE_OF_CONDUCT.md
|
168
131
|
- Gemfile
|
169
132
|
- LICENSE
|
170
133
|
- README.md
|
171
134
|
- Rakefile
|
172
135
|
- feedjira.gemspec
|
173
|
-
- fixtures/vcr_cassettes/fetch_failure.yml
|
174
|
-
- fixtures/vcr_cassettes/parse_error.yml
|
175
|
-
- fixtures/vcr_cassettes/success.yml
|
176
136
|
- lib/feedjira.rb
|
137
|
+
- lib/feedjira/atom_entry_utilities.rb
|
177
138
|
- lib/feedjira/configuration.rb
|
178
139
|
- lib/feedjira/core_ext.rb
|
179
140
|
- lib/feedjira/core_ext/date.rb
|
@@ -191,14 +152,19 @@ files:
|
|
191
152
|
- lib/feedjira/parser/atom_entry.rb
|
192
153
|
- lib/feedjira/parser/atom_feed_burner.rb
|
193
154
|
- lib/feedjira/parser/atom_feed_burner_entry.rb
|
155
|
+
- lib/feedjira/parser/atom_google_alerts.rb
|
156
|
+
- lib/feedjira/parser/atom_google_alerts_entry.rb
|
194
157
|
- lib/feedjira/parser/atom_youtube.rb
|
195
158
|
- lib/feedjira/parser/atom_youtube_entry.rb
|
159
|
+
- lib/feedjira/parser/globally_unique_identifier.rb
|
196
160
|
- lib/feedjira/parser/google_docs_atom.rb
|
197
161
|
- lib/feedjira/parser/google_docs_atom_entry.rb
|
198
162
|
- lib/feedjira/parser/itunes_rss.rb
|
199
163
|
- lib/feedjira/parser/itunes_rss_category.rb
|
200
164
|
- lib/feedjira/parser/itunes_rss_item.rb
|
201
165
|
- lib/feedjira/parser/itunes_rss_owner.rb
|
166
|
+
- lib/feedjira/parser/json_feed.rb
|
167
|
+
- lib/feedjira/parser/json_feed_item.rb
|
202
168
|
- lib/feedjira/parser/podlove_chapter.rb
|
203
169
|
- lib/feedjira/parser/rss.rb
|
204
170
|
- lib/feedjira/parser/rss_entry.rb
|
@@ -206,6 +172,7 @@ files:
|
|
206
172
|
- lib/feedjira/parser/rss_feed_burner_entry.rb
|
207
173
|
- lib/feedjira/parser/rss_image.rb
|
208
174
|
- lib/feedjira/preprocessor.rb
|
175
|
+
- lib/feedjira/rss_entry_utilities.rb
|
209
176
|
- lib/feedjira/version.rb
|
210
177
|
- spec/feedjira/configuration_spec.rb
|
211
178
|
- spec/feedjira/date_time_utilities_spec.rb
|
@@ -215,6 +182,8 @@ files:
|
|
215
182
|
- spec/feedjira/parser/atom_entry_spec.rb
|
216
183
|
- spec/feedjira/parser/atom_feed_burner_entry_spec.rb
|
217
184
|
- spec/feedjira/parser/atom_feed_burner_spec.rb
|
185
|
+
- spec/feedjira/parser/atom_google_alerts_entry_spec.rb
|
186
|
+
- spec/feedjira/parser/atom_google_alerts_spec.rb
|
218
187
|
- spec/feedjira/parser/atom_spec.rb
|
219
188
|
- spec/feedjira/parser/atom_youtube_entry_spec.rb
|
220
189
|
- spec/feedjira/parser/atom_youtube_spec.rb
|
@@ -223,12 +192,15 @@ files:
|
|
223
192
|
- spec/feedjira/parser/itunes_rss_item_spec.rb
|
224
193
|
- spec/feedjira/parser/itunes_rss_owner_spec.rb
|
225
194
|
- spec/feedjira/parser/itunes_rss_spec.rb
|
195
|
+
- spec/feedjira/parser/json_feed_item_spec.rb
|
196
|
+
- spec/feedjira/parser/json_feed_spec.rb
|
226
197
|
- spec/feedjira/parser/podlove_chapter_spec.rb
|
227
198
|
- spec/feedjira/parser/rss_entry_spec.rb
|
228
199
|
- spec/feedjira/parser/rss_feed_burner_entry_spec.rb
|
229
200
|
- spec/feedjira/parser/rss_feed_burner_spec.rb
|
230
201
|
- spec/feedjira/parser/rss_spec.rb
|
231
202
|
- spec/feedjira/preprocessor_spec.rb
|
203
|
+
- spec/feedjira_spec.rb
|
232
204
|
- spec/sample_feeds.rb
|
233
205
|
- spec/sample_feeds/AmazonWebServicesBlog.xml
|
234
206
|
- spec/sample_feeds/AmazonWebServicesBlogFirstEntryContent.xml
|
@@ -243,6 +215,7 @@ files:
|
|
243
215
|
- spec/sample_feeds/GoogleDocsList.xml
|
244
216
|
- spec/sample_feeds/HREFConsideredHarmful.xml
|
245
217
|
- spec/sample_feeds/HREFConsideredHarmfulFirstEntry.xml
|
218
|
+
- spec/sample_feeds/HuffPostCanada.xml
|
246
219
|
- spec/sample_feeds/ITunesWithSingleQuotedAttributes.xml
|
247
220
|
- spec/sample_feeds/ITunesWithSpacesInAttributes.xml
|
248
221
|
- spec/sample_feeds/InvalidDateFormat.xml
|
@@ -250,6 +223,7 @@ files:
|
|
250
223
|
- spec/sample_feeds/PaulDixExplainsNothingAlternate.xml
|
251
224
|
- spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml
|
252
225
|
- spec/sample_feeds/PaulDixExplainsNothingWFW.xml
|
226
|
+
- spec/sample_feeds/Permalinks.xml
|
253
227
|
- spec/sample_feeds/SamRuby.xml
|
254
228
|
- spec/sample_feeds/TechCrunch.xml
|
255
229
|
- spec/sample_feeds/TechCrunchFirstEntry.xml
|
@@ -258,16 +232,22 @@ files:
|
|
258
232
|
- spec/sample_feeds/TenderLovemakingFirstEntry.xml
|
259
233
|
- spec/sample_feeds/TrotterCashionHome.xml
|
260
234
|
- spec/sample_feeds/TypePadNews.xml
|
235
|
+
- spec/sample_feeds/a10.xml
|
261
236
|
- spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
|
237
|
+
- spec/sample_feeds/google_alerts_atom.xml
|
262
238
|
- spec/sample_feeds/itunes.xml
|
239
|
+
- spec/sample_feeds/json_feed.json
|
263
240
|
- spec/sample_feeds/pet_atom.xml
|
264
241
|
- spec/sample_feeds/youtube_atom.xml
|
265
242
|
- spec/spec_helper.rb
|
266
|
-
homepage:
|
243
|
+
homepage: https://github.com/feedjira/feedjira
|
267
244
|
licenses:
|
268
245
|
- MIT
|
269
|
-
metadata:
|
270
|
-
|
246
|
+
metadata:
|
247
|
+
homepage_uri: http://feedjira.com
|
248
|
+
source_code_uri: https://github.com/feedjira/feedjira
|
249
|
+
changelog_uri: https://github.com/feedjira/feedjira/blob/master/CHANGELOG.md
|
250
|
+
post_install_message:
|
271
251
|
rdoc_options: []
|
272
252
|
require_paths:
|
273
253
|
- lib
|
@@ -275,18 +255,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
275
255
|
requirements:
|
276
256
|
- - ">="
|
277
257
|
- !ruby/object:Gem::Version
|
278
|
-
version:
|
258
|
+
version: '2.2'
|
279
259
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
280
260
|
requirements:
|
281
261
|
- - ">="
|
282
262
|
- !ruby/object:Gem::Version
|
283
263
|
version: '0'
|
284
264
|
requirements: []
|
285
|
-
|
286
|
-
|
287
|
-
signing_key:
|
265
|
+
rubygems_version: 3.2.0.rc.1
|
266
|
+
signing_key:
|
288
267
|
specification_version: 4
|
289
|
-
summary: A feed
|
268
|
+
summary: A feed parsing library
|
290
269
|
test_files:
|
291
270
|
- spec/feedjira/configuration_spec.rb
|
292
271
|
- spec/feedjira/date_time_utilities_spec.rb
|
@@ -296,6 +275,8 @@ test_files:
|
|
296
275
|
- spec/feedjira/parser/atom_entry_spec.rb
|
297
276
|
- spec/feedjira/parser/atom_feed_burner_entry_spec.rb
|
298
277
|
- spec/feedjira/parser/atom_feed_burner_spec.rb
|
278
|
+
- spec/feedjira/parser/atom_google_alerts_entry_spec.rb
|
279
|
+
- spec/feedjira/parser/atom_google_alerts_spec.rb
|
299
280
|
- spec/feedjira/parser/atom_spec.rb
|
300
281
|
- spec/feedjira/parser/atom_youtube_entry_spec.rb
|
301
282
|
- spec/feedjira/parser/atom_youtube_spec.rb
|
@@ -304,12 +285,15 @@ test_files:
|
|
304
285
|
- spec/feedjira/parser/itunes_rss_item_spec.rb
|
305
286
|
- spec/feedjira/parser/itunes_rss_owner_spec.rb
|
306
287
|
- spec/feedjira/parser/itunes_rss_spec.rb
|
288
|
+
- spec/feedjira/parser/json_feed_item_spec.rb
|
289
|
+
- spec/feedjira/parser/json_feed_spec.rb
|
307
290
|
- spec/feedjira/parser/podlove_chapter_spec.rb
|
308
291
|
- spec/feedjira/parser/rss_entry_spec.rb
|
309
292
|
- spec/feedjira/parser/rss_feed_burner_entry_spec.rb
|
310
293
|
- spec/feedjira/parser/rss_feed_burner_spec.rb
|
311
294
|
- spec/feedjira/parser/rss_spec.rb
|
312
295
|
- spec/feedjira/preprocessor_spec.rb
|
296
|
+
- spec/feedjira_spec.rb
|
313
297
|
- spec/sample_feeds.rb
|
314
298
|
- spec/sample_feeds/AmazonWebServicesBlog.xml
|
315
299
|
- spec/sample_feeds/AmazonWebServicesBlogFirstEntryContent.xml
|
@@ -324,6 +308,7 @@ test_files:
|
|
324
308
|
- spec/sample_feeds/GoogleDocsList.xml
|
325
309
|
- spec/sample_feeds/HREFConsideredHarmful.xml
|
326
310
|
- spec/sample_feeds/HREFConsideredHarmfulFirstEntry.xml
|
311
|
+
- spec/sample_feeds/HuffPostCanada.xml
|
327
312
|
- spec/sample_feeds/ITunesWithSingleQuotedAttributes.xml
|
328
313
|
- spec/sample_feeds/ITunesWithSpacesInAttributes.xml
|
329
314
|
- spec/sample_feeds/InvalidDateFormat.xml
|
@@ -331,6 +316,7 @@ test_files:
|
|
331
316
|
- spec/sample_feeds/PaulDixExplainsNothingAlternate.xml
|
332
317
|
- spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml
|
333
318
|
- spec/sample_feeds/PaulDixExplainsNothingWFW.xml
|
319
|
+
- spec/sample_feeds/Permalinks.xml
|
334
320
|
- spec/sample_feeds/SamRuby.xml
|
335
321
|
- spec/sample_feeds/TechCrunch.xml
|
336
322
|
- spec/sample_feeds/TechCrunchFirstEntry.xml
|
@@ -339,8 +325,11 @@ test_files:
|
|
339
325
|
- spec/sample_feeds/TenderLovemakingFirstEntry.xml
|
340
326
|
- spec/sample_feeds/TrotterCashionHome.xml
|
341
327
|
- spec/sample_feeds/TypePadNews.xml
|
328
|
+
- spec/sample_feeds/a10.xml
|
342
329
|
- spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
|
330
|
+
- spec/sample_feeds/google_alerts_atom.xml
|
343
331
|
- spec/sample_feeds/itunes.xml
|
332
|
+
- spec/sample_feeds/json_feed.json
|
344
333
|
- spec/sample_feeds/pet_atom.xml
|
345
334
|
- spec/sample_feeds/youtube_atom.xml
|
346
335
|
- spec/spec_helper.rb
|
data/Dangerfile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
commit_lint.check(warn: :all)
|
@@ -1,62 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: http://www.example.com/feed.xml
|
6
|
-
body:
|
7
|
-
encoding: US-ASCII
|
8
|
-
string: ''
|
9
|
-
headers:
|
10
|
-
User-Agent:
|
11
|
-
- Faraday v0.9.2
|
12
|
-
response:
|
13
|
-
status:
|
14
|
-
code: 404
|
15
|
-
message:
|
16
|
-
headers:
|
17
|
-
cache-control:
|
18
|
-
- max-age=604800
|
19
|
-
content-type:
|
20
|
-
- text/html
|
21
|
-
date:
|
22
|
-
- Mon, 31 Oct 2016 02:29:13 GMT
|
23
|
-
etag:
|
24
|
-
- '"359670651+gzip"'
|
25
|
-
expires:
|
26
|
-
- Mon, 07 Nov 2016 02:29:13 GMT
|
27
|
-
last-modified:
|
28
|
-
- Fri, 09 Aug 2013 23:54:35 GMT
|
29
|
-
server:
|
30
|
-
- ECS (oxr/83C7)
|
31
|
-
vary:
|
32
|
-
- Accept-Encoding
|
33
|
-
x-cache:
|
34
|
-
- HIT
|
35
|
-
x-ec-custom-error:
|
36
|
-
- '1'
|
37
|
-
content-length:
|
38
|
-
- '606'
|
39
|
-
connection:
|
40
|
-
- close
|
41
|
-
body:
|
42
|
-
encoding: ASCII-8BIT
|
43
|
-
string: "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n
|
44
|
-
\ <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"text/html;
|
45
|
-
charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,
|
46
|
-
initial-scale=1\" />\n <style type=\"text/css\">\n body {\n background-color:
|
47
|
-
#f0f0f2;\n margin: 0;\n padding: 0;\n font-family: \"Open
|
48
|
-
Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n \n }\n
|
49
|
-
\ div {\n width: 600px;\n margin: 5em auto;\n padding:
|
50
|
-
50px;\n background-color: #fff;\n border-radius: 1em;\n }\n
|
51
|
-
\ a:link, a:visited {\n color: #38488f;\n text-decoration:
|
52
|
-
none;\n }\n @media (max-width: 700px) {\n body {\n background-color:
|
53
|
-
#fff;\n }\n div {\n width: auto;\n margin:
|
54
|
-
0 auto;\n border-radius: 0;\n padding: 1em;\n }\n
|
55
|
-
\ }\n </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n
|
56
|
-
\ <p>This domain is established to be used for illustrative examples in
|
57
|
-
documents. You may use this\n domain in examples without prior coordination
|
58
|
-
or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\">More
|
59
|
-
information...</a></p>\n</div>\n</body>\n</html>\n"
|
60
|
-
http_version:
|
61
|
-
recorded_at: Mon, 31 Oct 2016 02:29:13 GMT
|
62
|
-
recorded_with: VCR 3.0.3
|
@@ -1,222 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: http://feedjira.com/
|
6
|
-
body:
|
7
|
-
encoding: US-ASCII
|
8
|
-
string: ''
|
9
|
-
headers:
|
10
|
-
User-Agent:
|
11
|
-
- Faraday v0.9.2
|
12
|
-
response:
|
13
|
-
status:
|
14
|
-
code: 200
|
15
|
-
message:
|
16
|
-
headers:
|
17
|
-
date:
|
18
|
-
- Mon, 31 Oct 2016 02:29:13 GMT
|
19
|
-
server:
|
20
|
-
- Apache/2.4.18 (Ubuntu)
|
21
|
-
last-modified:
|
22
|
-
- Fri, 07 Oct 2016 14:50:31 GMT
|
23
|
-
etag:
|
24
|
-
- '"3678-53e47882c0305-gzip"'
|
25
|
-
accept-ranges:
|
26
|
-
- bytes
|
27
|
-
vary:
|
28
|
-
- Accept-Encoding
|
29
|
-
content-length:
|
30
|
-
- '3519'
|
31
|
-
connection:
|
32
|
-
- close
|
33
|
-
content-type:
|
34
|
-
- text/html
|
35
|
-
body:
|
36
|
-
encoding: ASCII-8BIT
|
37
|
-
string: |
|
38
|
-
<!DOCTYPE html>
|
39
|
-
<html>
|
40
|
-
<head>
|
41
|
-
<meta charset='utf-8'>
|
42
|
-
<meta content='IE=edge;chrome=1' http-equiv='X-UA-Compatible'>
|
43
|
-
<meta content='width=device-width, initial-scale=.7, maximum-scale=1' name='viewport'>
|
44
|
-
<title>Feedjira</title>
|
45
|
-
<link href="http://fonts.googleapis.com/css?family=Merriweather+Sans:400,300,400italic,700,700italic,300italic" rel="stylesheet" type="text/css" media="screen" />
|
46
|
-
<link href="/css/syntax.css" media="screen" rel="stylesheet" type="text/css" />
|
47
|
-
<link href="/css/style.css" media="screen" rel="stylesheet" type="text/css" />
|
48
|
-
<link rel="alternate" type="application/atom+xml" title="Atom Feed" href="/blog/feed.xml" />
|
49
|
-
</head>
|
50
|
-
<body>
|
51
|
-
<div id='content'>
|
52
|
-
<header>
|
53
|
-
<h1><a href="/">Feedjira</a></h1>
|
54
|
-
</header>
|
55
|
-
<nav>
|
56
|
-
<ul>
|
57
|
-
<li><a href="/">Home</a></li>
|
58
|
-
<li><a href="/blog/">Blog</a></li>
|
59
|
-
<li><a target="_blank" href="https://github.com/feedjira/feedjira">Source</a></li>
|
60
|
-
</ul>
|
61
|
-
</nav>
|
62
|
-
<section><h1>The Feedjira Ruby Gem</h1>
|
63
|
-
|
64
|
-
<p><a href="https://github.com/feedjira/feedjira">Feedjira</a> (formerly Feedzirra) is a Ruby gem for fetching and parsing
|
65
|
-
RSS feeds. Version 2.0 <a href="/blog/2015/06/05/feedjira-two-point-oh.html">was recently released</a>.</p>
|
66
|
-
|
67
|
-
<h2>Getting Started</h2>
|
68
|
-
|
69
|
-
<p>Feedjira is tested with Ruby version 1.9.3 and 2.x so like any Ruby gem, the
|
70
|
-
first step is to install the gem:</p>
|
71
|
-
<pre class="highlight text"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div></td><td class="code">$ gem install feedjira
|
72
|
-
</td></tr></tbody></table></pre>
|
73
|
-
<p>Or add it to your Gemfile:</p>
|
74
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div></td><td class="code"><span class="n">gem</span> <span class="s1">'feedjira'</span>
|
75
|
-
</td></tr></tbody></table></pre>
|
76
|
-
<h2>Fetching and Parsing</h2>
|
77
|
-
|
78
|
-
<p>For many users, the <code>fetch_and_parse</code> method is what they use Feedjira for. This
|
79
|
-
method takes a url and returns a Parser object:</p>
|
80
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div><div class="lineno">2</div><div class="lineno">3</div></td><td class="code"><span class="n">url</span> <span class="o">=</span> <span class="s2">"http://feedjira.com/blog/feed.xml"</span>
|
81
|
-
<span class="n">feed</span> <span class="o">=</span> <span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.fetch_and_parse</span> <span class="n">url</span>
|
82
|
-
<span class="c1"># => #<Feedjira::Parser::Atom...></span>
|
83
|
-
</td></tr></tbody></table></pre>
|
84
|
-
<p>These feed objects have both the meta data for a feed and an <code>entries</code>
|
85
|
-
collection that contains all the entries that were found:</p>
|
86
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div><div class="lineno">2</div><div class="lineno">3</div><div class="lineno">4</div><div class="lineno">5</div><div class="lineno">6</div></td><td class="code"><span class="n">feed</span><span class="nf">.title</span>
|
87
|
-
<span class="c1"># => "Feedjira Blog"</span>
|
88
|
-
<span class="n">feed</span><span class="nf">.url</span>
|
89
|
-
<span class="c1"># => "http://feedjira.com/blog"</span>
|
90
|
-
<span class="n">feed</span><span class="nf">.entries</span> <span class="c1"># returns an array of Entry objects</span>
|
91
|
-
<span class="c1"># => [<Feedjira::Feed::Entry ...>, <Feedjira::Feed::Entry ...>, ...]</span>
|
92
|
-
</td></tr></tbody></table></pre>
|
93
|
-
<p>These entry objects contain the data parsed from the feed XML:</p>
|
94
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div><div class="lineno">2</div><div class="lineno">3</div><div class="lineno">4</div><div class="lineno">5</div></td><td class="code"><span class="n">entry</span> <span class="o">=</span> <span class="n">feed</span><span class="nf">.entries.first</span>
|
95
|
-
<span class="n">entry</span><span class="nf">.title</span>
|
96
|
-
<span class="c1"># => "Announcing verison 1.0"</span>
|
97
|
-
<span class="n">entry</span><span class="nf">.url</span>
|
98
|
-
<span class="c1"># => "http://feedjira.com/blog/2014-02-12-announcing-version-10.html"</span>
|
99
|
-
</td></tr></tbody></table></pre>
|
100
|
-
<h2>Just Parsing</h2>
|
101
|
-
|
102
|
-
<p>The parsing functionality of Feedjira has been exposed so that it can be used in
|
103
|
-
isolation:</p>
|
104
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div><div class="lineno">2</div><div class="lineno">3</div><div class="lineno">4</div></td><td class="code"><span class="n">xml</span> <span class="o">=</span> <span class="no">Faraday</span><span class="nf">.get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="nf">.body</span>
|
105
|
-
<span class="n">feed</span> <span class="o">=</span> <span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.parse</span> <span class="n">xml</span>
|
106
|
-
<span class="n">feed</span><span class="nf">.entries.first.title</span>
|
107
|
-
<span class="c1"># => "Announcing verison 1.0"</span>
|
108
|
-
</td></tr></tbody></table></pre>
|
109
|
-
<h2>Adding a feed parsing class</h2>
|
110
|
-
|
111
|
-
<p>When determining which parser to use for a given XML document, the following
|
112
|
-
list of parser classes is used:</p>
|
113
|
-
|
114
|
-
<ul>
|
115
|
-
<li><code>Feedjira::Parser::RSSFeedBurner</code></li>
|
116
|
-
<li><code>Feedjira::Parser::GoogleDocsAtom</code></li>
|
117
|
-
<li><code>Feedjira::Parser::AtomFeedBurner</code></li>
|
118
|
-
<li><code>Feedjira::Parser::Atom</code></li>
|
119
|
-
<li><code>Feedjira::Parser::ITunesRSS</code></li>
|
120
|
-
<li><code>Feedjira::Parser::RSS</code></li>
|
121
|
-
</ul>
|
122
|
-
|
123
|
-
<p>You can insert your own parser at the front of this stack by calling
|
124
|
-
<code>add_feed_class</code>, like this:</p>
|
125
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div></td><td class="code"><span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.add_feed_class</span> <span class="no">MyAwesomeParser</span>
|
126
|
-
</td></tr></tbody></table></pre>
|
127
|
-
<p>Now when you <code>fetch_and_parse</code>, <code>MyAwesomeParser</code> will be the first one to get a
|
128
|
-
chance to parse the feed.</p>
|
129
|
-
|
130
|
-
<p>If you have the XML and just want to provide a parser class for one parse, you
|
131
|
-
can specify that using <code>parse_with</code>:</p>
|
132
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div></td><td class="code"><span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.parse_with</span> <span class="no">MyAwesomeParser</span><span class="p">,</span> <span class="n">xml</span>
|
133
|
-
</td></tr></tbody></table></pre>
|
134
|
-
<h2>Adding attributes to all feeds types / all entries types</h2>
|
135
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div><div class="lineno">2</div><div class="lineno">3</div><div class="lineno">4</div><div class="lineno">5</div><div class="lineno">6</div><div class="lineno">7</div><div class="lineno">8</div><div class="lineno">9</div><div class="lineno">10</div></td><td class="code"><span class="c1"># Add the generator attribute to all feed types</span>
|
136
|
-
<span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.add_common_feed_element</span><span class="p">(</span><span class="s1">'generator'</span><span class="p">)</span>
|
137
|
-
<span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.fetch_and_parse</span><span class="p">(</span><span class="s2">"http://www.pauldix.net/atom.xml"</span><span class="p">)</span><span class="nf">.generator</span> <span class="c1"># => 'TypePad'</span>
|
138
|
-
|
139
|
-
<span class="c1"># Add some GeoRss information</span>
|
140
|
-
<span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.add_common_feed_entry_element</span><span class="p">(</span><span class="s1">'geo:lat'</span><span class="p">,</span> <span class="ss">:as</span> <span class="o">=></span> <span class="ss">:lat</span><span class="p">)</span>
|
141
|
-
<span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.fetch_and_parse</span><span class="p">(</span><span class="s2">"http://www.earthpublisher.com/georss.php"</span><span class="p">)</span><span class="nf">.entries.each</span> <span class="k">do</span> <span class="o">|</span><span class="n">e</span><span class="o">|</span>
|
142
|
-
<span class="nb">p</span> <span class="s2">"lat: #[e.lat}, long: </span><span class="si">#{</span><span class="n">e</span><span class="nf">.long</span><span class="o">]</span><span class="s2">"
|
143
|
-
end
|
144
|
-
</span></td></tr></tbody></table></pre>
|
145
|
-
<h2>Adding attributes to only one class</h2>
|
146
|
-
|
147
|
-
<p>If you want to add attributes for only one class you simply have to declare them
|
148
|
-
in the class</p>
|
149
|
-
<pre class="highlight ruby"><table><tbody><tr><td class="gutter gl"><div class="lineno">1</div><div class="lineno">2</div><div class="lineno">3</div><div class="lineno">4</div><div class="lineno">5</div><div class="lineno">6</div><div class="lineno">7</div><div class="lineno">8</div><div class="lineno">9</div><div class="lineno">10</div><div class="lineno">11</div><div class="lineno">12</div></td><td class="code"><span class="c1"># Add some GeoRss information</span>
|
150
|
-
<span class="nb">require</span> <span class="s1">'lib/feedzirra/parser/rss_entry'</span>
|
151
|
-
|
152
|
-
<span class="k">class </span><span class="nc">Feedjira</span><span class="o">::</span><span class="no">Parser</span><span class="o">::</span><span class="no">RSSEntry</span>
|
153
|
-
<span class="n">element</span> <span class="s1">'geo:lat'</span><span class="p">,</span> <span class="ss">:as</span> <span class="o">=></span> <span class="ss">:lat</span>
|
154
|
-
<span class="n">element</span> <span class="s1">'geo:long'</span><span class="p">,</span> <span class="ss">:as</span> <span class="o">=></span> <span class="ss">:long</span>
|
155
|
-
<span class="k">end</span>
|
156
|
-
|
157
|
-
<span class="c1"># Fetch a feed containing GeoRss info and print them</span>
|
158
|
-
<span class="no">Feedjira</span><span class="o">::</span><span class="no">Feed</span><span class="nf">.fetch_and_parse</span><span class="p">(</span><span class="s2">"http://www.earthpublisher.com/georss.php"</span><span class="p">)</span><span class="nf">.entries.each</span> <span class="k">do</span> <span class="o">|</span><span class="n">e</span><span class="o">|</span>
|
159
|
-
<span class="nb">p</span> <span class="s2">"lat: </span><span class="si">#{</span><span class="n">e</span><span class="nf">.lat</span><span class="si">}</span><span class="s2">, long: </span><span class="si">#{</span><span class="n">e</span><span class="nf">.long</span><span class="si">}</span><span class="s2">"</span>
|
160
|
-
<span class="k">end</span>
|
161
|
-
</td></tr></tbody></table></pre>
|
162
|
-
<h2>Testing</h2>
|
163
|
-
|
164
|
-
<p>Feedjira uses <a href="https://github.com/lostisland/faraday">faraday</a> to perform requests, so testing Feedjira is really
|
165
|
-
about <a href="https://github.com/lostisland/faraday#using-faraday-for-testing">stubbing out faraday requests</a>.</p>
|
166
|
-
|
167
|
-
<h2>Projects that use Feedjira</h2>
|
168
|
-
|
169
|
-
<p>Feedjira is used in some awesome projects around the web - from RSS readers to
|
170
|
-
add-ons and everything in between. Here are some of them:</p>
|
171
|
-
|
172
|
-
<ul>
|
173
|
-
<li><p><a href="https://feedbin.com/">Feedbin</a>: Feedbin bills itself as a fast, simple RSS reader that delivers a
|
174
|
-
great reading experience. It’s a paid RSS reader that integrates with mobile
|
175
|
-
apps and it even has a fully featured API!</p></li>
|
176
|
-
<li><p><a href="https://github.com/swanson/stringer">Stringer</a>: Stringer is a self-hosted, anti-social RSS reader. It’s an
|
177
|
-
open-source project that’s easy to deploy to any host, there’s even a
|
178
|
-
one-click button to deploy on Heroku.</p></li>
|
179
|
-
<li><p><a href="https://apps.shopify.com/blogfeeder">BlogFeeder</a>: BlogFeeder is a paid Shopify App that makes it easy for you to
|
180
|
-
import any external blog into your Shopify store. It helps improve your
|
181
|
-
store’s SEO and keeps your blogs in sync, plus a lot more.</p></li>
|
182
|
-
<li><p><a href="https://github.com/amatriain/feedbunch">Feedbunch</a>: Feedbunch is an open source feed reader built to fill the hole
|
183
|
-
left by Google Reader. It aims to support all features of Google Reader and
|
184
|
-
actually improve on others.</p></li>
|
185
|
-
<li><p><a href="http://theoldreader.com/">The Old Reader</a>: The Old Reader advertises as the ultimate social RSS
|
186
|
-
reader. It’s free to start and also has a paid premium version. There’s an API
|
187
|
-
and it integrates with many different mobile apps.</p></li>
|
188
|
-
<li><p><a href="https://solveforall.com/">Solve for All</a>: Solve for All combines search engine and feed parsing
|
189
|
-
while protecting your privacy. It’s even extendable by the community!</p></li>
|
190
|
-
</ul>
|
191
|
-
|
192
|
-
<p>Note: to get your project on this list, simply <a href="mailto:feedjira@gmail.com">send an email</a>
|
193
|
-
with your project’s details.</p>
|
194
|
-
</section>
|
195
|
-
</div>
|
196
|
-
<footer>
|
197
|
-
<div class='column'>
|
198
|
-
<ul>
|
199
|
-
<li><a href="/">Home</a></li>
|
200
|
-
<li><a href="/blog/">Blog</a></li>
|
201
|
-
<li><a href="/blog/feed.xml">Feed</a></li>
|
202
|
-
<li><a target="_blank" href="https://github.com/feedjira/feedjira">Source</a></li>
|
203
|
-
<li><a target="_blank" href="https://twitter.com/feedjira">@feedjira</a></li>
|
204
|
-
</ul>
|
205
|
-
<p>Maintained by <a href="http://jonallured.com">Jon Allured</a>, Created by <a href="http://www.pauldix.net">Paul Dix</a>, Site design by <a href="http://danielariza.com">Daniel Ariza</a></p>
|
206
|
-
</div>
|
207
|
-
</footer>
|
208
|
-
<script type="text/javascript">
|
209
|
-
var _gaq = _gaq || [];
|
210
|
-
_gaq.push(["_setAccount", "UA-3137727-7"]);
|
211
|
-
_gaq.push(["_trackPageview"]);
|
212
|
-
(function() {
|
213
|
-
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
214
|
-
ga.src = ('https:' == document.location.protocol ? '//ssl' : '//www') + '.google-analytics.com/ga.js';
|
215
|
-
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
216
|
-
})();
|
217
|
-
</script>
|
218
|
-
</body>
|
219
|
-
</html>
|
220
|
-
http_version:
|
221
|
-
recorded_at: Mon, 31 Oct 2016 02:29:13 GMT
|
222
|
-
recorded_with: VCR 3.0.3
|