feedjira 3.2.1 → 3.2.3

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