feedjira 3.2.2 → 3.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +17 -0
- data/.github/workflows/ruby.yml +2 -2
- data/.gitignore +1 -0
- data/.rubocop.yml +0 -6
- data/.rubocop_todo.yml +34 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile +13 -3
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/feedjira.gemspec +3 -12
- data/lib/feedjira/configuration.rb +1 -1
- data/lib/feedjira/core_ext/date.rb +0 -4
- data/lib/feedjira/core_ext/time.rb +3 -3
- data/lib/feedjira/core_ext.rb +3 -3
- data/lib/feedjira/feed_entry_utilities.rb +4 -5
- data/lib/feedjira/feed_utilities.rb +3 -7
- data/lib/feedjira/parser/json_feed.rb +7 -3
- data/lib/feedjira/version.rb +1 -1
- data/lib/feedjira.rb +34 -38
- data/spec/feedjira/core_ext/time_spec.rb +57 -0
- data/spec/feedjira/feed_spec.rb +39 -11
- data/spec/feedjira/feed_utilities_spec.rb +5 -3
- data/spec/feedjira/parser/json_feed_spec.rb +16 -0
- data/spec/feedjira_spec.rb +11 -1
- data/spec/sample_feeds/itunes_feedburner.xml +117 -0
- data/spec/sample_feeds/json_feed.json +2 -0
- data/spec/sample_feeds/json_feed_with_escaped_uris.json +632 -0
- data/spec/sample_feeds.rb +2 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/coverage.rb +10 -0
- metadata +20 -120
- data/lib/feedjira/date_time_utilities/date_time_epoch_parser.rb +0 -14
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +0 -24
- data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +0 -30
- data/lib/feedjira/date_time_utilities.rb +0 -30
- data/spec/feedjira/feed_utilities_date_time_spec.rb +0 -49
data/spec/sample_feeds.rb
CHANGED
@@ -10,6 +10,7 @@ module SampleFeeds
|
|
10
10
|
sample_atom_feed_line_breaks: "AtomFeedWithSpacesAroundEquals.xml",
|
11
11
|
sample_atom_entry_content: "AmazonWebServicesBlogFirstEntryContent.xml",
|
12
12
|
sample_itunes_feed: "itunes.xml",
|
13
|
+
sample_itunes_feedburner_feed: "itunes_feedburner.xml",
|
13
14
|
sample_itunes_feed_with_single_quotes: "ITunesWithSingleQuotedAttributes.xml",
|
14
15
|
sample_itunes_feed_with_spaces: "ITunesWithSpacesInAttributes.xml",
|
15
16
|
sample_podlove_feed: "CRE.xml",
|
@@ -31,6 +32,7 @@ module SampleFeeds
|
|
31
32
|
sample_youtube_atom_feed: "youtube_atom.xml",
|
32
33
|
sample_atom_xhtml_with_escpaed_html_in_pre_tag_feed: "AtomEscapedHTMLInPreTag.xml",
|
33
34
|
sample_json_feed: "json_feed.json",
|
35
|
+
sample_json_feed_with_escaped_uris: "json_feed_with_escaped_uris.json",
|
34
36
|
sample_rss_feed_huffpost_ca: "HuffPostCanada.xml",
|
35
37
|
sample_invalid_date_format_feed: "InvalidDateFormat.xml",
|
36
38
|
sample_rss_feed_permalinks: "Permalinks.xml",
|
data/spec/spec_helper.rb
CHANGED
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.
|
4
|
+
version: 3.2.4
|
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:
|
17
|
+
date: 2025-01-09 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
|
-
-
|
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
|
-
- - ">="
|
80
|
-
- !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
|
-
- - ">="
|
56
|
+
- - "<"
|
157
57
|
- !ruby/object:Gem::Version
|
158
|
-
version: '
|
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
|
@@ -282,17 +179,20 @@ files:
|
|
282
179
|
- spec/sample_feeds/atom_with_link_tag_for_url_unmarked.xml
|
283
180
|
- spec/sample_feeds/google_alerts_atom.xml
|
284
181
|
- spec/sample_feeds/itunes.xml
|
182
|
+
- spec/sample_feeds/itunes_feedburner.xml
|
285
183
|
- spec/sample_feeds/json_feed.json
|
184
|
+
- spec/sample_feeds/json_feed_with_escaped_uris.json
|
286
185
|
- spec/sample_feeds/pet_atom.xml
|
287
186
|
- spec/sample_feeds/youtube_atom.xml
|
288
187
|
- spec/spec_helper.rb
|
188
|
+
- spec/support/coverage.rb
|
289
189
|
homepage: https://github.com/feedjira/feedjira
|
290
190
|
licenses:
|
291
191
|
- MIT
|
292
192
|
metadata:
|
293
193
|
homepage_uri: https://github.com/feedjira/feedjira
|
294
194
|
source_code_uri: https://github.com/feedjira/feedjira
|
295
|
-
changelog_uri: https://github.com/feedjira/feedjira/blob/
|
195
|
+
changelog_uri: https://github.com/feedjira/feedjira/blob/main/CHANGELOG.md
|
296
196
|
rubygems_mfa_required: 'true'
|
297
197
|
post_install_message:
|
298
198
|
rdoc_options: []
|
@@ -309,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
309
209
|
- !ruby/object:Gem::Version
|
310
210
|
version: '0'
|
311
211
|
requirements: []
|
312
|
-
rubygems_version: 3.4.
|
212
|
+
rubygems_version: 3.4.10
|
313
213
|
signing_key:
|
314
214
|
specification_version: 4
|
315
215
|
summary: A feed parsing library
|
@@ -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.strptime("Tue Sep 17 12:20:13.931 UTC 2013", "%a %b %d %H:%M:%S.%N %Z %Y")
|
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
|