feedjira 3.2.1 → 3.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +17 -0
  3. data/.github/workflows/ruby.yml +2 -2
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +1 -7
  6. data/.rubocop_todo.yml +28 -4
  7. data/CHANGELOG.md +17 -0
  8. data/Gemfile +13 -3
  9. data/README.md +3 -4
  10. data/feedjira.gemspec +4 -14
  11. data/lib/feedjira/configuration.rb +1 -1
  12. data/lib/feedjira/core_ext/date.rb +3 -6
  13. data/lib/feedjira/core_ext/time.rb +3 -3
  14. data/lib/feedjira/feed_entry_utilities.rb +4 -5
  15. data/lib/feedjira/feed_utilities.rb +3 -7
  16. data/lib/feedjira/parser/json_feed.rb +5 -2
  17. data/lib/feedjira/rss_entry_utilities.rb +5 -1
  18. data/lib/feedjira/version.rb +1 -1
  19. data/lib/feedjira.rb +0 -4
  20. data/spec/feedjira/core_ext/time_spec.rb +57 -0
  21. data/spec/feedjira/feed_spec.rb +39 -11
  22. data/spec/feedjira/feed_utilities_entry_spec.rb +1 -1
  23. data/spec/feedjira/feed_utilities_spec.rb +7 -5
  24. data/spec/feedjira/parser/json_feed_spec.rb +13 -1
  25. data/spec/feedjira/parser/rss_entry_spec.rb +7 -1
  26. data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +1 -0
  27. data/spec/feedjira/parser/rss_spec.rb +1 -1
  28. data/spec/feedjira_spec.rb +11 -1
  29. data/spec/sample_feeds/RSSWithComments.xml +277 -0
  30. data/spec/sample_feeds/itunes_feedburner.xml +117 -0
  31. data/spec/sample_feeds/json_feed.json +2 -0
  32. data/spec/sample_feeds.rb +3 -1
  33. data/spec/spec_helper.rb +3 -0
  34. data/spec/support/coverage.rb +10 -0
  35. metadata +22 -190
  36. data/lib/feedjira/date_time_utilities/date_time_epoch_parser.rb +0 -14
  37. data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +0 -24
  38. data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +0 -30
  39. data/lib/feedjira/date_time_utilities.rb +0 -30
  40. data/spec/feedjira/feed_utilities_date_time_spec.rb +0 -49
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feedjira
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Hess
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2022-01-02 00:00:00.000000000 Z
17
+ date: 2024-02-24 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: loofah
@@ -23,6 +23,9 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: 2.3.1
26
+ - - "<"
27
+ - !ruby/object:Gem::Version
28
+ version: '3'
26
29
  type: :runtime
27
30
  prerelease: false
28
31
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,6 +33,9 @@ dependencies:
30
33
  - - ">="
31
34
  - !ruby/object:Gem::Version
32
35
  version: 2.3.1
36
+ - - "<"
37
+ - !ruby/object:Gem::Version
38
+ version: '3'
33
39
  - !ruby/object:Gem::Dependency
34
40
  name: sax-machine
35
41
  requirement: !ruby/object:Gem::Requirement
@@ -37,6 +43,9 @@ dependencies:
37
43
  - - ">="
38
44
  - !ruby/object:Gem::Version
39
45
  version: '1.0'
46
+ - - "<"
47
+ - !ruby/object:Gem::Version
48
+ version: '2'
40
49
  type: :runtime
41
50
  prerelease: false
42
51
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,118 +53,9 @@ dependencies:
44
53
  - - ">="
45
54
  - !ruby/object:Gem::Version
46
55
  version: '1.0'
47
- - !ruby/object:Gem::Dependency
48
- name: faraday
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: '0'
61
- - !ruby/object:Gem::Dependency
62
- name: pry
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: '0'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
- - !ruby/object:Gem::Dependency
76
- name: rspec
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
56
+ - - "<"
80
57
  - !ruby/object:Gem::Version
81
- version: '0'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- - !ruby/object:Gem::Dependency
90
- name: rubocop
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
- type: :development
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: '0'
103
- - !ruby/object:Gem::Dependency
104
- name: rubocop-performance
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
- - !ruby/object:Gem::Dependency
118
- name: rubocop-rake
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: '0'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: '0'
131
- - !ruby/object:Gem::Dependency
132
- name: rubocop-rspec
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- - !ruby/object:Gem::Dependency
146
- name: yard
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - ">="
150
- - !ruby/object:Gem::Version
151
- version: '0'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - ">="
157
- - !ruby/object:Gem::Version
158
- version: '0'
58
+ version: '2'
159
59
  description:
160
60
  email:
161
61
  executables: []
@@ -164,6 +64,7 @@ extra_rdoc_files: []
164
64
  files:
165
65
  - ".github/ISSUE_TEMPLATE/feed-parsing.md"
166
66
  - ".github/ISSUE_TEMPLATE/general-issue.md"
67
+ - ".github/dependabot.yml"
167
68
  - ".github/workflows/ruby.yml"
168
69
  - ".gitignore"
169
70
  - ".rspec"
@@ -183,10 +84,6 @@ files:
183
84
  - lib/feedjira/core_ext/date.rb
184
85
  - lib/feedjira/core_ext/string.rb
185
86
  - lib/feedjira/core_ext/time.rb
186
- - lib/feedjira/date_time_utilities.rb
187
- - lib/feedjira/date_time_utilities/date_time_epoch_parser.rb
188
- - lib/feedjira/date_time_utilities/date_time_language_parser.rb
189
- - lib/feedjira/date_time_utilities/date_time_pattern_parser.rb
190
87
  - lib/feedjira/feed.rb
191
88
  - lib/feedjira/feed_entry_utilities.rb
192
89
  - lib/feedjira/feed_utilities.rb
@@ -218,8 +115,8 @@ files:
218
115
  - lib/feedjira/rss_entry_utilities.rb
219
116
  - lib/feedjira/version.rb
220
117
  - spec/feedjira/configuration_spec.rb
118
+ - spec/feedjira/core_ext/time_spec.rb
221
119
  - spec/feedjira/feed_spec.rb
222
- - spec/feedjira/feed_utilities_date_time_spec.rb
223
120
  - spec/feedjira/feed_utilities_entry_spec.rb
224
121
  - spec/feedjira/feed_utilities_spec.rb
225
122
  - spec/feedjira/parser/atom_entry_spec.rb
@@ -267,6 +164,7 @@ files:
267
164
  - spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml
268
165
  - spec/sample_feeds/PaulDixExplainsNothingWFW.xml
269
166
  - spec/sample_feeds/Permalinks.xml
167
+ - spec/sample_feeds/RSSWithComments.xml
270
168
  - spec/sample_feeds/SamRuby.xml
271
169
  - spec/sample_feeds/TechCrunch.xml
272
170
  - spec/sample_feeds/TechCrunchFirstEntry.xml
@@ -281,17 +179,19 @@ files:
281
179
  - spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
282
180
  - spec/sample_feeds/google_alerts_atom.xml
283
181
  - spec/sample_feeds/itunes.xml
182
+ - spec/sample_feeds/itunes_feedburner.xml
284
183
  - spec/sample_feeds/json_feed.json
285
184
  - spec/sample_feeds/pet_atom.xml
286
185
  - spec/sample_feeds/youtube_atom.xml
287
186
  - spec/spec_helper.rb
187
+ - spec/support/coverage.rb
288
188
  homepage: https://github.com/feedjira/feedjira
289
189
  licenses:
290
190
  - MIT
291
191
  metadata:
292
192
  homepage_uri: https://github.com/feedjira/feedjira
293
193
  source_code_uri: https://github.com/feedjira/feedjira
294
- changelog_uri: https://github.com/feedjira/feedjira/blob/master/CHANGELOG.md
194
+ changelog_uri: https://github.com/feedjira/feedjira/blob/main/CHANGELOG.md
295
195
  rubygems_mfa_required: 'true'
296
196
  post_install_message:
297
197
  rdoc_options: []
@@ -301,83 +201,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
301
201
  requirements:
302
202
  - - ">="
303
203
  - !ruby/object:Gem::Version
304
- version: '2.5'
204
+ version: '2.7'
305
205
  required_rubygems_version: !ruby/object:Gem::Requirement
306
206
  requirements:
307
207
  - - ">="
308
208
  - !ruby/object:Gem::Version
309
209
  version: '0'
310
210
  requirements: []
311
- rubygems_version: 3.3.3
211
+ rubygems_version: 3.4.19
312
212
  signing_key:
313
213
  specification_version: 4
314
214
  summary: A feed parsing library
315
- test_files:
316
- - spec/feedjira/configuration_spec.rb
317
- - spec/feedjira/feed_spec.rb
318
- - spec/feedjira/feed_utilities_date_time_spec.rb
319
- - spec/feedjira/feed_utilities_entry_spec.rb
320
- - spec/feedjira/feed_utilities_spec.rb
321
- - spec/feedjira/parser/atom_entry_spec.rb
322
- - spec/feedjira/parser/atom_feed_burner_entry_spec.rb
323
- - spec/feedjira/parser/atom_feed_burner_spec.rb
324
- - spec/feedjira/parser/atom_google_alerts_entry_spec.rb
325
- - spec/feedjira/parser/atom_google_alerts_spec.rb
326
- - spec/feedjira/parser/atom_spec.rb
327
- - spec/feedjira/parser/atom_youtube_entry_spec.rb
328
- - spec/feedjira/parser/atom_youtube_spec.rb
329
- - spec/feedjira/parser/google_docs_atom_entry_spec.rb
330
- - spec/feedjira/parser/google_docs_atom_spec.rb
331
- - spec/feedjira/parser/i_tunes_rss_item_spec.rb
332
- - spec/feedjira/parser/i_tunes_rss_owner_spec.rb
333
- - spec/feedjira/parser/itunes_rss_spec.rb
334
- - spec/feedjira/parser/json_feed_item_spec.rb
335
- - spec/feedjira/parser/json_feed_spec.rb
336
- - spec/feedjira/parser/podlove_chapter_spec.rb
337
- - spec/feedjira/parser/rss_entry_spec.rb
338
- - spec/feedjira/parser/rss_feed_burner_entry_spec.rb
339
- - spec/feedjira/parser/rss_feed_burner_spec.rb
340
- - spec/feedjira/parser/rss_spec.rb
341
- - spec/feedjira/preprocessor_spec.rb
342
- - spec/feedjira_spec.rb
343
- - spec/sample_feeds.rb
344
- - spec/sample_feeds/AmazonWebServicesBlog.xml
345
- - spec/sample_feeds/AmazonWebServicesBlogFirstEntryContent.xml
346
- - spec/sample_feeds/AtomEscapedHTMLInPreTag.xml
347
- - spec/sample_feeds/AtomFeedWithSpacesAroundEquals.xml
348
- - spec/sample_feeds/CRE.xml
349
- - spec/sample_feeds/DuplicateContentAtomFeed.xml
350
- - spec/sample_feeds/FeedBurnerUrlNoAlternate.xml
351
- - spec/sample_feeds/FeedBurnerXHTML.xml
352
- - spec/sample_feeds/FeedjiraBlog.xml
353
- - spec/sample_feeds/GiantRobotsSmashingIntoOtherGiantRobots.xml
354
- - spec/sample_feeds/GoogleDocsList.xml
355
- - spec/sample_feeds/HREFConsideredHarmful.xml
356
- - spec/sample_feeds/HREFConsideredHarmfulFirstEntry.xml
357
- - spec/sample_feeds/HuffPostCanada.xml
358
- - spec/sample_feeds/ITunesWithSingleQuotedAttributes.xml
359
- - spec/sample_feeds/ITunesWithSpacesInAttributes.xml
360
- - spec/sample_feeds/InvalidDateFormat.xml
361
- - spec/sample_feeds/PaulDixExplainsNothing.xml
362
- - spec/sample_feeds/PaulDixExplainsNothingAlternate.xml
363
- - spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml
364
- - spec/sample_feeds/PaulDixExplainsNothingWFW.xml
365
- - spec/sample_feeds/Permalinks.xml
366
- - spec/sample_feeds/SamRuby.xml
367
- - spec/sample_feeds/TechCrunch.xml
368
- - spec/sample_feeds/TechCrunchFirstEntry.xml
369
- - spec/sample_feeds/TechCrunchFirstEntryDescription.xml
370
- - spec/sample_feeds/TenderLovemaking.xml
371
- - spec/sample_feeds/TenderLovemakingFirstEntry.xml
372
- - spec/sample_feeds/TrotterCashionHome.xml
373
- - spec/sample_feeds/TypePadNews.xml
374
- - spec/sample_feeds/a10.xml
375
- - spec/sample_feeds/atom_simple_single_entry.xml
376
- - spec/sample_feeds/atom_simple_single_entry_link_self.xml
377
- - spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
378
- - spec/sample_feeds/google_alerts_atom.xml
379
- - spec/sample_feeds/itunes.xml
380
- - spec/sample_feeds/json_feed.json
381
- - spec/sample_feeds/pet_atom.xml
382
- - spec/sample_feeds/youtube_atom.xml
383
- - spec/spec_helper.rb
215
+ test_files: []
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Feedjira
4
- module DateTimeUtilities
5
- class DateTimeEpochParser
6
- def self.parse(string)
7
- epoch_time = string.to_i
8
- return Time.at(epoch_time).to_datetime if epoch_time.to_s == string
9
-
10
- raise "#{string} is not a valid epoch time"
11
- end
12
- end
13
- end
14
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Feedjira
4
- module DateTimeUtilities
5
- class DateTimeLanguageParser
6
- MONTHS_ENGLISH =
7
- %w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec].freeze
8
- MONTHS_SPANISH =
9
- %w[Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic].freeze
10
-
11
- def self.parse(string)
12
- DateTime.parse(translate(string))
13
- end
14
-
15
- def self.translate(string)
16
- MONTHS_SPANISH.each_with_index do |m, i|
17
- rgx = Regexp.new("\s#{m}\s", Regexp::IGNORECASE)
18
- return string.gsub(rgx, MONTHS_ENGLISH[i]) if string&.match?(rgx)
19
- end
20
- raise "No translation found for #{string}"
21
- end
22
- end
23
- end
24
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Feedjira
4
- module DateTimeUtilities
5
- class DateTimePatternParser
6
- # Japanese Symbols are required for strange Date Strings like
7
- # '水, 31 8 2016 07:37:00 PDT'
8
- JAPANESE_SYMBOLS = %w[日 月 火 水 木 金 土].freeze
9
- PATTERNS = ["%m/%d/%Y %T %p", "%d %m %Y %T %Z"].freeze
10
-
11
- def self.parse(string)
12
- PATTERNS.each do |p|
13
- datetime = DateTime.strptime(prepare(string), p)
14
- return datetime
15
- rescue StandardError => e
16
- Feedjira.logger.debug("Failed to parse date #{string}")
17
- Feedjira.logger.debug(e)
18
- nil
19
- end
20
- raise "No pattern matched #{string}"
21
- end
22
-
23
- def self.prepare(string)
24
- rgx = Regexp.new("^(#{JAPANESE_SYMBOLS.join('|')}),\s")
25
- string.gsub(rgx, "")
26
- end
27
- private_class_method :prepare
28
- end
29
- end
30
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Feedjira
4
- module DateTimeUtilities
5
- # This is our date parsing heuristic.
6
- # Date Parsers are attempted in order.
7
- DATE_PARSERS = [
8
- DateTimePatternParser,
9
- DateTimeLanguageParser,
10
- DateTimeEpochParser,
11
- DateTime
12
- ].freeze
13
-
14
- # Parse the given string starting with the most common parser (default ruby)
15
- # and going over all other available parsers
16
- def parse_datetime(string)
17
- res = DATE_PARSERS.detect do |parser|
18
- return parser.parse(string).feed_utils_to_gm_time
19
- rescue StandardError => e
20
- Feedjira.logger.debug { "Failed to parse date #{string}" }
21
- Feedjira.logger.debug(e)
22
- nil
23
- end
24
-
25
- Feedjira.logger.warn { "Failed to parse date #{string}" } if res.nil?
26
-
27
- res
28
- end
29
- end
30
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe Feedjira::FeedUtilities do
6
- before do
7
- @klass = Class.new do
8
- include Feedjira::DateTimeUtilities
9
- end
10
- end
11
-
12
- describe "handling dates" do
13
- it "parses an ISO 8601 formatted datetime into Time" do
14
- time = @klass.new.parse_datetime("2008-02-20T8:05:00-010:00")
15
- expect(time.class).to eq Time
16
- expect(time).to eq Time.parse_safely("Wed Feb 20 18:05:00 UTC 2008")
17
- end
18
-
19
- it "parses a ISO 8601 with milliseconds into Time" do
20
- time = @klass.new.parse_datetime("2013-09-17T08:20:13.931-04:00")
21
- expect(time.class).to eq Time
22
- expect(time).to eq Time.parse_safely("Tue Sep 17 12:20:13 UTC 2013")
23
- end
24
-
25
- it "parses a US Format into Time" do
26
- time = @klass.new.parse_datetime("8/23/2016 12:29:58 PM")
27
- expect(time.class).to eq Time
28
- expect(time).to eq Time.parse_safely("Wed Aug 23 12:29:58 UTC 2016")
29
- end
30
-
31
- it "parses a Spanish Format into Time" do
32
- time = @klass.new.parse_datetime("Wed, 31 Ago 2016 11:08:22 GMT")
33
- expect(time.class).to eq Time
34
- expect(time).to eq Time.parse_safely("Wed Aug 31 11:08:22 UTC 2016")
35
- end
36
-
37
- it "parses Format with japanese symbols into Time" do
38
- time = @klass.new.parse_datetime("水, 31 8 2016 07:37:00 PDT")
39
- expect(time.class).to eq Time
40
- expect(time).to eq Time.parse_safely("Wed Aug 31 14:37:00 UTC 2016")
41
- end
42
-
43
- it "parses epoch into Time" do
44
- time = @klass.new.parse_datetime("1472654220")
45
- expect(time.class).to eq Time
46
- expect(time).to eq Time.parse_safely("Wed Aug 31 14:37:00 UTC 2016")
47
- end
48
- end
49
- end