feedjira 3.1.0 → 3.2.1
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/.github/ISSUE_TEMPLATE/general-issue.md +8 -0
- data/.github/workflows/ruby.yml +39 -0
- data/.rubocop.yml +34 -615
- data/.rubocop_todo.yml +4 -29
- data/CHANGELOG.md +60 -13
- data/Gemfile +3 -4
- data/Rakefile +3 -1
- data/feedjira.gemspec +12 -12
- data/lib/feedjira/configuration.rb +5 -3
- data/lib/feedjira/core_ext/date.rb +3 -1
- data/lib/feedjira/core_ext/string.rb +2 -0
- data/lib/feedjira/core_ext/time.rb +3 -1
- data/lib/feedjira/core_ext.rb +2 -0
- data/lib/feedjira/date_time_utilities/date_time_epoch_parser.rb +3 -0
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +5 -3
- data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +9 -9
- data/lib/feedjira/date_time_utilities.rb +8 -8
- data/lib/feedjira/feed.rb +3 -1
- data/lib/feedjira/feed_entry_utilities.rb +5 -3
- data/lib/feedjira/feed_utilities.rb +8 -5
- data/lib/feedjira/parser/atom.rb +5 -6
- data/lib/feedjira/parser/atom_entry.rb +2 -0
- data/lib/feedjira/parser/atom_feed_burner.rb +4 -2
- data/lib/feedjira/parser/atom_feed_burner_entry.rb +2 -2
- data/lib/feedjira/parser/atom_google_alerts.rb +3 -1
- data/lib/feedjira/parser/atom_google_alerts_entry.rb +8 -5
- data/lib/feedjira/parser/atom_youtube.rb +4 -2
- data/lib/feedjira/parser/atom_youtube_entry.rb +2 -0
- data/lib/feedjira/parser/globally_unique_identifier.rb +2 -0
- data/lib/feedjira/parser/google_docs_atom.rb +5 -3
- data/lib/feedjira/parser/google_docs_atom_entry.rb +2 -0
- data/lib/feedjira/parser/itunes_rss.rb +4 -2
- data/lib/feedjira/parser/itunes_rss_category.rb +8 -6
- data/lib/feedjira/parser/itunes_rss_item.rb +3 -1
- data/lib/feedjira/parser/itunes_rss_owner.rb +2 -0
- data/lib/feedjira/parser/json_feed.rb +4 -2
- data/lib/feedjira/parser/json_feed_item.rb +7 -1
- data/lib/feedjira/parser/podlove_chapter.rb +5 -2
- data/lib/feedjira/parser/rss.rb +4 -1
- data/lib/feedjira/parser/rss_entry.rb +2 -0
- data/lib/feedjira/parser/rss_feed_burner.rb +4 -2
- data/lib/feedjira/parser/rss_feed_burner_entry.rb +2 -2
- data/lib/feedjira/parser/rss_image.rb +2 -0
- data/lib/feedjira/parser.rb +2 -0
- data/lib/feedjira/preprocessor.rb +3 -1
- data/lib/feedjira/rss_entry_utilities.rb +6 -2
- data/lib/feedjira/version.rb +3 -1
- data/lib/feedjira.rb +2 -1
- data/spec/feedjira/configuration_spec.rb +5 -3
- data/spec/feedjira/feed_spec.rb +13 -10
- data/spec/feedjira/{date_time_utilities_spec.rb → feed_utilities_date_time_spec.rb} +9 -7
- data/spec/feedjira/{feed_entry_utilities_spec.rb → feed_utilities_entry_spec.rb} +12 -10
- data/spec/feedjira/feed_utilities_spec.rb +37 -40
- data/spec/feedjira/parser/atom_entry_spec.rb +22 -20
- data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +16 -14
- data/spec/feedjira/parser/atom_feed_burner_spec.rb +30 -28
- data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +12 -10
- data/spec/feedjira/parser/atom_google_alerts_spec.rb +15 -13
- data/spec/feedjira/parser/atom_spec.rb +44 -25
- data/spec/feedjira/parser/atom_youtube_entry_spec.rb +25 -23
- data/spec/feedjira/parser/atom_youtube_spec.rb +16 -14
- data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +5 -3
- data/spec/feedjira/parser/google_docs_atom_spec.rb +10 -8
- data/spec/feedjira/parser/{itunes_rss_item_spec.rb → i_tunes_rss_item_spec.rb} +21 -19
- data/spec/feedjira/parser/{itunes_rss_owner_spec.rb → i_tunes_rss_owner_spec.rb} +5 -3
- data/spec/feedjira/parser/itunes_rss_spec.rb +35 -33
- data/spec/feedjira/parser/json_feed_item_spec.rb +16 -14
- data/spec/feedjira/parser/json_feed_spec.rb +15 -13
- data/spec/feedjira/parser/podlove_chapter_spec.rb +9 -7
- data/spec/feedjira/parser/rss_entry_spec.rb +25 -23
- data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +24 -22
- data/spec/feedjira/parser/rss_feed_burner_spec.rb +20 -18
- data/spec/feedjira/parser/rss_spec.rb +26 -24
- data/spec/feedjira/preprocessor_spec.rb +6 -4
- data/spec/feedjira_spec.rb +50 -39
- data/spec/sample_feeds/a10.xml +72 -0
- data/spec/sample_feeds/atom_simple_single_entry.xml +17 -0
- data/spec/sample_feeds/atom_simple_single_entry_link_self.xml +17 -0
- data/spec/sample_feeds.rb +6 -1
- data/spec/spec_helper.rb +3 -7
- metadata +60 -24
- data/.travis.yml +0 -34
- data/Dangerfile +0 -1
data/.rubocop_todo.yml
CHANGED
@@ -1,36 +1,11 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2020-09-02 20:02:06 UTC using RuboCop version 0.90.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
10
|
-
|
11
|
-
|
12
|
-
Exclude:
|
13
|
-
- 'lib/feedjira/date_time_utilities/date_time_epoch_parser.rb'
|
14
|
-
- 'lib/feedjira/feed_utilities.rb'
|
15
|
-
- 'lib/feedjira/parser/json_feed_item.rb'
|
16
|
-
- 'lib/feedjira/parser/podlove_chapter.rb'
|
17
|
-
|
18
|
-
# Offense count: 1
|
19
|
-
# Cop supports --auto-correct.
|
20
|
-
Performance/UnneededSort:
|
21
|
-
Exclude:
|
22
|
-
- 'lib/feedjira/feed_utilities.rb'
|
23
|
-
|
24
|
-
# Offense count: 3
|
25
|
-
# Configuration parameters: EnforcedStyle.
|
26
|
-
# SupportedStyles: inline, group
|
27
|
-
Style/AccessModifierDeclarations:
|
28
|
-
Exclude:
|
29
|
-
- 'lib/feedjira.rb'
|
30
|
-
- 'lib/feedjira/parser/itunes_rss.rb'
|
31
|
-
|
32
|
-
# Offense count: 1
|
33
|
-
# Cop supports --auto-correct.
|
34
|
-
Style/UnneededCondition:
|
35
|
-
Exclude:
|
36
|
-
- 'lib/feedjira/feed_utilities.rb'
|
9
|
+
# Offense count: 20
|
10
|
+
Style/Documentation:
|
11
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,42 @@
|
|
1
1
|
# Feedjira Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## 3.2.0
|
4
|
+
|
5
|
+
* Atom `feed_url` no longer falls back to `url` via https://github.com/feedjira/feedjira/pull/451 (@frederfred)
|
6
|
+
|
7
|
+
* Atom feeds now have an icon field via https://github.com/feedjira/feedjira/pull/452 (@jswanner)
|
8
|
+
|
9
|
+
## 3.1.2
|
10
|
+
|
11
|
+
* Enhancements
|
12
|
+
* Alias `managingEditor` as `managing_editor` [#443][] ([@DominikAlberski][])
|
13
|
+
* Add support for the `a10` namespace used in RSS 2.0 feeds generated by .NET applications. Currently `a10:link`, `a10:updated`, `a10:content` and `a10:name` are supported. [#440][] ([@knu][])
|
14
|
+
|
15
|
+
[#440]: https://github.com/feedjira/feedjira/pull/440
|
16
|
+
[#443]: https://github.com/feedjira/feedjira/pull/443
|
17
|
+
|
18
|
+
## 3.1.1
|
19
|
+
|
20
|
+
* Enhancements
|
21
|
+
* Fix warnings in Ruby 2.7 [#434][] ([@sferik][])
|
22
|
+
|
23
|
+
* General
|
24
|
+
* Test on Ruby 2.5, 2.6 and 2.7 [#435][] ([@HParker][])
|
25
|
+
|
26
|
+
[#434]: https://github.com/feedjira/feedjira/pull/434
|
27
|
+
[#435]: https://github.com/feedjira/feedjira/pull/435
|
28
|
+
|
29
|
+
## 3.1.0
|
4
30
|
|
5
31
|
* Breaking Changes
|
6
|
-
* `title` of Atom entry classes always return a plain text even in case the entry has a title of the HTML or XML type. [#423][] (@knu)
|
32
|
+
* `title` of Atom entry classes always return a plain text even in case the entry has a title of the HTML or XML type. [#423][] ([@knu][])
|
7
33
|
|
8
34
|
* Enhancements
|
9
|
-
* `raw_title` and `title_type` are added to Atom entry classes. [#423][] (@knu)
|
10
|
-
* AtomGoogleAlerts is now a supported parser [#424][] (@knu)
|
35
|
+
* `raw_title` and `title_type` are added to Atom entry classes. [#423][] ([@knu][])
|
36
|
+
* AtomGoogleAlerts is now a supported parser [#424][] ([@knu][])
|
37
|
+
|
38
|
+
[#423]: https://github.com/feedjira/feedjira/pull/423
|
39
|
+
[#424]: https://github.com/feedjira/feedjira/pull/424
|
11
40
|
|
12
41
|
## 3.0.0
|
13
42
|
|
@@ -26,16 +55,26 @@ configurable logging and parsing
|
|
26
55
|
## 2.1.0
|
27
56
|
|
28
57
|
* Enhancements
|
29
|
-
* AtomYoutube is now a supported parser [#337][] (@jfiorato)
|
30
|
-
* Oga parsing is now supported [#331][] (@krasnoukhov)
|
31
|
-
* DateTime Handler now supports localized dates [#313][] (@PascalTurbo)
|
32
|
-
* RSS now supports language attribute [#344][] (@PascalTurbo)
|
58
|
+
* AtomYoutube is now a supported parser [#337][] ([@jfiorato][])
|
59
|
+
* Oga parsing is now supported [#331][] ([@krasnoukhov][])
|
60
|
+
* DateTime Handler now supports localized dates [#313][] ([@PascalTurbo][])
|
61
|
+
* RSS now supports language attribute [#344][] ([@PascalTurbo][])
|
33
62
|
* ITunesRSS added support for:
|
34
|
-
* `ttl` and `last_built` [#343][] (@sferik)
|
35
|
-
* `itunes_category` and `itunes_category_paths` [#329][] (@knu)
|
36
|
-
* `itunes_complete` [#328][] (@knu)
|
37
|
-
* single quoted attributes [#326][] (@sferik)
|
38
|
-
* Add image attribute [#349][] (@sferik)
|
63
|
+
* `ttl` and `last_built` [#343][] ([@sferik][])
|
64
|
+
* `itunes_category` and `itunes_category_paths` [#329][] ([@knu][])
|
65
|
+
* `itunes_complete` [#328][] ([@knu][])
|
66
|
+
* single quoted attributes [#326][] ([@sferik][])
|
67
|
+
* Add image attribute [#349][] ([@sferik][])
|
68
|
+
|
69
|
+
[#313]: https://github.com/feedjira/feedjira/pull/313
|
70
|
+
[#326]: https://github.com/feedjira/feedjira/pull/326
|
71
|
+
[#328]: https://github.com/feedjira/feedjira/pull/328
|
72
|
+
[#329]: https://github.com/feedjira/feedjira/pull/329
|
73
|
+
[#331]: https://github.com/feedjira/feedjira/pull/331
|
74
|
+
[#337]: https://github.com/feedjira/feedjira/pull/337
|
75
|
+
[#343]: https://github.com/feedjira/feedjira/pull/343
|
76
|
+
[#344]: https://github.com/feedjira/feedjira/pull/344
|
77
|
+
[#349]: https://github.com/feedjira/feedjira/pull/349
|
39
78
|
|
40
79
|
## 2.0.0
|
41
80
|
|
@@ -293,3 +332,11 @@ configurable logging and parsing
|
|
293
332
|
## 0.1.0
|
294
333
|
|
295
334
|
* lower builder requirement to make it rails-3 friendly
|
335
|
+
|
336
|
+
[@DominikAlberski]: https://github.com/DominikAlberski
|
337
|
+
[@HParker]: https://github.com/HParker
|
338
|
+
[@PascalTurbo]: https://github.com/PascalTurbo
|
339
|
+
[@jfiorato]: https://github.com/jfiorato
|
340
|
+
[@knu]: https://github.com/knu
|
341
|
+
[@krasnoukhov]: https://github.com/krasnoukhov
|
342
|
+
[@sferik]: https://github.com/sferik
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "rspec/core/rake_task"
|
2
4
|
require "rubocop/rake_task"
|
3
5
|
require "yard"
|
@@ -14,4 +16,4 @@ YARD::Rake::YardocTask.new do |t|
|
|
14
16
|
t.files = ["lib/**/*.rb", "-", "LICENSE"]
|
15
17
|
end
|
16
18
|
|
17
|
-
task default: [
|
19
|
+
task default: %i[spec rubocop]
|
data/feedjira.gemspec
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require File.expand_path("lib/feedjira/version", __dir__)
|
4
4
|
|
5
|
-
# rubocop:disable Metrics/BlockLength
|
6
5
|
Gem::Specification.new do |s|
|
7
6
|
s.authors = [
|
8
7
|
"Adam Hess",
|
@@ -11,10 +10,9 @@ Gem::Specification.new do |s|
|
|
11
10
|
"Jon Allured",
|
12
11
|
"Julien Kirch",
|
13
12
|
"Michael Stock",
|
14
|
-
"Paul Dix"
|
13
|
+
"Paul Dix"
|
15
14
|
]
|
16
|
-
s.
|
17
|
-
s.homepage = "http://feedjira.com"
|
15
|
+
s.homepage = "https://github.com/feedjira/feedjira"
|
18
16
|
s.license = "MIT"
|
19
17
|
s.name = "feedjira"
|
20
18
|
s.platform = Gem::Platform::RUBY
|
@@ -22,25 +20,27 @@ Gem::Specification.new do |s|
|
|
22
20
|
s.version = Feedjira::VERSION
|
23
21
|
|
24
22
|
s.metadata = {
|
25
|
-
"homepage_uri"
|
23
|
+
"homepage_uri" => "https://github.com/feedjira/feedjira",
|
26
24
|
"source_code_uri" => "https://github.com/feedjira/feedjira",
|
27
|
-
"changelog_uri"
|
25
|
+
"changelog_uri" => "https://github.com/feedjira/feedjira/blob/master/CHANGELOG.md",
|
26
|
+
"rubygems_mfa_required" => "true"
|
28
27
|
}
|
29
28
|
|
30
29
|
s.files = `git ls-files`.split("\n")
|
31
30
|
s.require_paths = ["lib"]
|
32
31
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
33
32
|
|
34
|
-
s.required_ruby_version = ">=2.
|
33
|
+
s.required_ruby_version = ">=2.5"
|
35
34
|
|
36
35
|
s.add_dependency "loofah", ">= 2.3.1"
|
37
36
|
s.add_dependency "sax-machine", ">= 1.0"
|
38
37
|
|
39
|
-
s.add_development_dependency "
|
40
|
-
s.add_development_dependency "
|
38
|
+
s.add_development_dependency "faraday"
|
39
|
+
s.add_development_dependency "pry"
|
41
40
|
s.add_development_dependency "rspec"
|
42
41
|
s.add_development_dependency "rubocop"
|
43
|
-
s.add_development_dependency "
|
42
|
+
s.add_development_dependency "rubocop-performance"
|
43
|
+
s.add_development_dependency "rubocop-rake"
|
44
|
+
s.add_development_dependency "rubocop-rspec"
|
44
45
|
s.add_development_dependency "yard"
|
45
46
|
end
|
46
|
-
# rubocop:enable Metrics/BlockLength
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Feedjira::Configuration
|
2
4
|
module Feedjira
|
3
5
|
# Provides global configuration options for Feedjira
|
@@ -10,7 +12,7 @@ module Feedjira
|
|
10
12
|
attr_accessor(
|
11
13
|
:logger,
|
12
14
|
:parsers,
|
13
|
-
:strip_whitespace
|
15
|
+
:strip_whitespace
|
14
16
|
)
|
15
17
|
|
16
18
|
# Modify Feedjira's current configuration
|
@@ -48,7 +50,7 @@ module Feedjira
|
|
48
50
|
|
49
51
|
# @private
|
50
52
|
def default_logger
|
51
|
-
Logger.new(
|
53
|
+
Logger.new($stdout).tap do |logger|
|
52
54
|
logger.progname = "Feedjira"
|
53
55
|
logger.level = Logger::WARN
|
54
56
|
end
|
@@ -65,7 +67,7 @@ module Feedjira
|
|
65
67
|
Feedjira::Parser::Atom,
|
66
68
|
Feedjira::Parser::ITunesRSS,
|
67
69
|
Feedjira::Parser::RSS,
|
68
|
-
Feedjira::Parser::JSONFeed
|
70
|
+
Feedjira::Parser::JSONFeed
|
69
71
|
]
|
70
72
|
end
|
71
73
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Date code pulled and adapted from:
|
2
4
|
# Ruby Cookbook by Lucas Carlson and Leonard Richardson
|
3
5
|
# Published by O'Reilly
|
@@ -15,6 +17,6 @@ class Date
|
|
15
17
|
|
16
18
|
def feed_utils_to_time(dest, method)
|
17
19
|
Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min,
|
18
|
-
|
20
|
+
dest.sec, dest.offset)
|
19
21
|
end
|
20
22
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "time"
|
2
4
|
require "date"
|
3
5
|
|
@@ -27,7 +29,7 @@ class Time
|
|
27
29
|
def self.parse_string_safely(string)
|
28
30
|
return nil if string.empty?
|
29
31
|
|
30
|
-
if
|
32
|
+
if /\A\d{14}\z/.match?(string)
|
31
33
|
parse("#{string}Z", true)
|
32
34
|
else
|
33
35
|
parse(string).utc
|
data/lib/feedjira/core_ext.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module DateTimeUtilities
|
3
5
|
class DateTimeEpochParser
|
4
6
|
def self.parse(string)
|
5
7
|
epoch_time = string.to_i
|
6
8
|
return Time.at(epoch_time).to_datetime if epoch_time.to_s == string
|
9
|
+
|
7
10
|
raise "#{string} is not a valid epoch time"
|
8
11
|
end
|
9
12
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module DateTimeUtilities
|
3
5
|
class DateTimeLanguageParser
|
4
6
|
MONTHS_ENGLISH =
|
5
|
-
%w
|
7
|
+
%w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec].freeze
|
6
8
|
MONTHS_SPANISH =
|
7
|
-
%w
|
9
|
+
%w[Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic].freeze
|
8
10
|
|
9
11
|
def self.parse(string)
|
10
12
|
DateTime.parse(translate(string))
|
@@ -13,7 +15,7 @@ module Feedjira
|
|
13
15
|
def self.translate(string)
|
14
16
|
MONTHS_SPANISH.each_with_index do |m, i|
|
15
17
|
rgx = Regexp.new("\s#{m}\s", Regexp::IGNORECASE)
|
16
|
-
return string.gsub(rgx, MONTHS_ENGLISH[i]) if string
|
18
|
+
return string.gsub(rgx, MONTHS_ENGLISH[i]) if string&.match?(rgx)
|
17
19
|
end
|
18
20
|
raise "No translation found for #{string}"
|
19
21
|
end
|
@@ -1,21 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module DateTimeUtilities
|
3
5
|
class DateTimePatternParser
|
4
6
|
# Japanese Symbols are required for strange Date Strings like
|
5
7
|
# '水, 31 8 2016 07:37:00 PDT'
|
6
|
-
JAPANESE_SYMBOLS = %w
|
8
|
+
JAPANESE_SYMBOLS = %w[日 月 火 水 木 金 土].freeze
|
7
9
|
PATTERNS = ["%m/%d/%Y %T %p", "%d %m %Y %T %Z"].freeze
|
8
10
|
|
9
11
|
def self.parse(string)
|
10
12
|
PATTERNS.each do |p|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
nil
|
18
|
-
end
|
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
19
|
end
|
20
20
|
raise "No pattern matched #{string}"
|
21
21
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module DateTimeUtilities
|
3
5
|
# This is our date parsing heuristic.
|
@@ -6,20 +8,18 @@ module Feedjira
|
|
6
8
|
DateTimePatternParser,
|
7
9
|
DateTimeLanguageParser,
|
8
10
|
DateTimeEpochParser,
|
9
|
-
DateTime
|
11
|
+
DateTime
|
10
12
|
].freeze
|
11
13
|
|
12
14
|
# Parse the given string starting with the most common parser (default ruby)
|
13
15
|
# and going over all other available parsers
|
14
16
|
def parse_datetime(string)
|
15
17
|
res = DATE_PARSERS.detect do |parser|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
nil
|
22
|
-
end
|
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
23
|
end
|
24
24
|
|
25
25
|
Feedjira.logger.warn { "Failed to parse date #{string}" } if res.nil?
|
data/lib/feedjira/feed.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
class Feed
|
3
5
|
class << self
|
@@ -27,7 +29,7 @@ module Feedjira
|
|
27
29
|
Feedjira.parsers.each do |klass|
|
28
30
|
klass.sax_config.collection_elements.each_value do |value|
|
29
31
|
collection_configs = value.select do |v|
|
30
|
-
v.accessor == "entries" && v.data_class.
|
32
|
+
v.accessor == "entries" && v.data_class.is_a?(Class)
|
31
33
|
end
|
32
34
|
|
33
35
|
collection_configs.each do |config|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module FeedEntryUtilities
|
3
5
|
include Enumerable
|
@@ -39,9 +41,9 @@ module Feedjira
|
|
39
41
|
end
|
40
42
|
|
41
43
|
def sanitize!
|
42
|
-
%w
|
44
|
+
%w[title author summary content image].each do |name|
|
43
45
|
if respond_to?(name) && send(name).respond_to?(:sanitize!)
|
44
|
-
send(name).send
|
46
|
+
send(name).send(:sanitize!)
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -51,7 +53,7 @@ module Feedjira
|
|
51
53
|
def each
|
52
54
|
@rss_fields ||= instance_variables.map do |ivar|
|
53
55
|
ivar.to_s.sub("@", "")
|
54
|
-
end.select do |field|
|
56
|
+
end.select do |field| # rubocop:disable Style/MultilineBlockChain
|
55
57
|
# select callable (public) methods only
|
56
58
|
respond_to?(field)
|
57
59
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module FeedUtilities
|
3
|
-
UPDATABLE_ATTRIBUTES = %w
|
5
|
+
UPDATABLE_ATTRIBUTES = %w[title feed_url url last_modified etag].freeze
|
4
6
|
|
5
7
|
attr_writer :new_entries, :updated, :last_modified
|
6
8
|
attr_accessor :etag
|
@@ -41,7 +43,7 @@ module Feedjira
|
|
41
43
|
def last_modified
|
42
44
|
@last_modified ||= begin
|
43
45
|
published = entries.reject { |e| e.published.nil? }
|
44
|
-
entry = published.
|
46
|
+
entry = published.max_by(&:published)
|
45
47
|
entry ? entry.published : nil
|
46
48
|
end
|
47
49
|
end
|
@@ -73,11 +75,11 @@ module Feedjira
|
|
73
75
|
old_value = send(name)
|
74
76
|
new_value = feed.send(name)
|
75
77
|
|
76
|
-
if old_value
|
78
|
+
if old_value == new_value
|
79
|
+
false
|
80
|
+
else
|
77
81
|
send("#{name}=", new_value)
|
78
82
|
true
|
79
|
-
else
|
80
|
-
false
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
@@ -100,6 +102,7 @@ module Feedjira
|
|
100
102
|
|
101
103
|
feed.entries.each do |entry|
|
102
104
|
break unless new_entry?(entry, latest_entry)
|
105
|
+
|
103
106
|
found_new_entries << entry
|
104
107
|
end
|
105
108
|
|
data/lib/feedjira/parser/atom.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with Atom feeds.
|
@@ -12,17 +14,14 @@ module Feedjira
|
|
12
14
|
elements :link, as: :links, value: :href
|
13
15
|
elements :link, as: :hubs, value: :href, with: { rel: "hub" }
|
14
16
|
elements :entry, as: :entries, class: AtomEntry
|
17
|
+
element :icon
|
15
18
|
|
16
19
|
def self.able_to_parse?(xml)
|
17
|
-
%r{
|
20
|
+
%r{<feed[^>]+xmlns\s?=\s?["'](http://www\.w3\.org/2005/Atom|http://purl\.org/atom/ns\#)["'][^>]*>} =~ xml
|
18
21
|
end
|
19
22
|
|
20
23
|
def url
|
21
|
-
@url || (links - [feed_url]).last
|
22
|
-
end
|
23
|
-
|
24
|
-
def feed_url
|
25
|
-
@feed_url ||= links.first
|
24
|
+
@url || (links - [feed_url]).last
|
26
25
|
end
|
27
26
|
|
28
27
|
def self.preprocess(xml)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with Feedburner Atom feeds.
|
@@ -10,7 +12,7 @@ module Feedjira
|
|
10
12
|
element :link, as: :url_text_html, value: :href,
|
11
13
|
with: { type: "text/html" }
|
12
14
|
element :link, as: :url_notype, value: :href, with: { type: nil }
|
13
|
-
element :link, as: :feed_url_link, value: :href, with: { type: "application/atom+xml" }
|
15
|
+
element :link, as: :feed_url_link, value: :href, with: { type: "application/atom+xml" }
|
14
16
|
element :"atom10:link", as: :feed_url_atom10_link, value: :href,
|
15
17
|
with: { type: "application/atom+xml" }
|
16
18
|
elements :"atom10:link", as: :hubs, value: :href, with: { rel: "hub" }
|
@@ -19,7 +21,7 @@ module Feedjira
|
|
19
21
|
attr_writer :url, :feed_url
|
20
22
|
|
21
23
|
def self.able_to_parse?(xml)
|
22
|
-
((
|
24
|
+
(xml.include?("<feed") && xml.include?("Atom") && xml.include?("feedburner") && !(/<rss|<rdf/ =~ xml)) || false
|
23
25
|
end
|
24
26
|
|
25
27
|
# Feed url is <link> with type="text/html" if present,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with Feedburner Atom feed entries.
|
@@ -7,9 +9,7 @@ module Feedjira
|
|
7
9
|
include AtomEntryUtilities
|
8
10
|
|
9
11
|
element :"feedburner:origLink", as: :orig_link
|
10
|
-
# rubocop:disable Style/AccessModifierDeclarations
|
11
12
|
private :orig_link
|
12
|
-
# rubocop:enable Style/AccessModifierDeclarations
|
13
13
|
|
14
14
|
element :"media:thumbnail", as: :image, value: :url
|
15
15
|
element :"media:content", as: :image, value: :url
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with Feedburner Atom feeds.
|
@@ -13,7 +15,7 @@ module Feedjira
|
|
13
15
|
elements :entry, as: :entries, class: AtomGoogleAlertsEntry
|
14
16
|
|
15
17
|
def self.able_to_parse?(xml)
|
16
|
-
Atom.able_to_parse?(xml) && (%r{<id>tag:google\.com,2005:[^<]+/com\.google/alerts/} === xml) # rubocop:disable
|
18
|
+
Atom.able_to_parse?(xml) && (%r{<id>tag:google\.com,2005:[^<]+/com\.google/alerts/} === xml) # rubocop:disable Style/CaseEquality
|
17
19
|
end
|
18
20
|
|
19
21
|
def self.preprocess(xml)
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
|
1
5
|
module Feedjira
|
2
6
|
module Parser
|
3
7
|
# Parser for dealing with Feedburner Atom feed entries.
|
@@ -8,12 +12,11 @@ module Feedjira
|
|
8
12
|
|
9
13
|
def url
|
10
14
|
url = super
|
15
|
+
return unless url&.start_with?("https://www.google.com/url?")
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
cons && cons[1]
|
16
|
-
end
|
17
|
+
uri = URI(url)
|
18
|
+
cons = URI.decode_www_form(uri.query).assoc("url")
|
19
|
+
cons && cons[1]
|
17
20
|
end
|
18
21
|
end
|
19
22
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with RSS feeds.
|
@@ -12,8 +14,8 @@ module Feedjira
|
|
12
14
|
|
13
15
|
elements :entry, as: :entries, class: AtomYoutubeEntry
|
14
16
|
|
15
|
-
def self.able_to_parse?(xml)
|
16
|
-
|
17
|
+
def self.able_to_parse?(xml) # :nodoc:
|
18
|
+
xml.include?("xmlns:yt=\"http://www.youtube.com/xml/schemas/2015\"")
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require File.expand_path("./atom", File.dirname(__FILE__))
|
2
4
|
module Feedjira
|
3
5
|
module Parser
|
@@ -7,7 +9,7 @@ module Feedjira
|
|
7
9
|
element :title
|
8
10
|
element :subtitle, as: :description
|
9
11
|
element :link, as: :url, value: :href, with: { type: "text/html" }
|
10
|
-
element :link, as: :feed_url, value: :href, with: { type: "application/atom+xml" }
|
12
|
+
element :link, as: :feed_url, value: :href, with: { type: "application/atom+xml" }
|
11
13
|
elements :link, as: :links, value: :href
|
12
14
|
elements :entry, as: :entries, class: GoogleDocsAtomEntry
|
13
15
|
|
@@ -15,8 +17,8 @@ module Feedjira
|
|
15
17
|
@url ||= links.first
|
16
18
|
end
|
17
19
|
|
18
|
-
def self.able_to_parse?(xml)
|
19
|
-
%r{<id>https?://docs\.google\.com
|
20
|
+
def self.able_to_parse?(xml) # :nodoc:
|
21
|
+
%r{<id>https?://docs\.google\.com/.*</id>} =~ xml
|
20
22
|
end
|
21
23
|
|
22
24
|
def feed_url
|