feedjira 3.1.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/feed-parsing.md +15 -0
  3. data/.github/ISSUE_TEMPLATE/general-issue.md +8 -0
  4. data/.github/workflows/ruby.yml +39 -0
  5. data/.rubocop.yml +34 -615
  6. data/.rubocop_todo.yml +4 -29
  7. data/CHANGELOG.md +60 -13
  8. data/Gemfile +3 -4
  9. data/Rakefile +3 -1
  10. data/feedjira.gemspec +12 -12
  11. data/lib/feedjira/configuration.rb +5 -3
  12. data/lib/feedjira/core_ext/date.rb +3 -1
  13. data/lib/feedjira/core_ext/string.rb +2 -0
  14. data/lib/feedjira/core_ext/time.rb +3 -1
  15. data/lib/feedjira/core_ext.rb +2 -0
  16. data/lib/feedjira/date_time_utilities/date_time_epoch_parser.rb +3 -0
  17. data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +5 -3
  18. data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +9 -9
  19. data/lib/feedjira/date_time_utilities.rb +8 -8
  20. data/lib/feedjira/feed.rb +3 -1
  21. data/lib/feedjira/feed_entry_utilities.rb +5 -3
  22. data/lib/feedjira/feed_utilities.rb +8 -5
  23. data/lib/feedjira/parser/atom.rb +5 -6
  24. data/lib/feedjira/parser/atom_entry.rb +2 -0
  25. data/lib/feedjira/parser/atom_feed_burner.rb +4 -2
  26. data/lib/feedjira/parser/atom_feed_burner_entry.rb +2 -2
  27. data/lib/feedjira/parser/atom_google_alerts.rb +3 -1
  28. data/lib/feedjira/parser/atom_google_alerts_entry.rb +8 -5
  29. data/lib/feedjira/parser/atom_youtube.rb +4 -2
  30. data/lib/feedjira/parser/atom_youtube_entry.rb +2 -0
  31. data/lib/feedjira/parser/globally_unique_identifier.rb +2 -0
  32. data/lib/feedjira/parser/google_docs_atom.rb +5 -3
  33. data/lib/feedjira/parser/google_docs_atom_entry.rb +2 -0
  34. data/lib/feedjira/parser/itunes_rss.rb +4 -2
  35. data/lib/feedjira/parser/itunes_rss_category.rb +8 -6
  36. data/lib/feedjira/parser/itunes_rss_item.rb +3 -1
  37. data/lib/feedjira/parser/itunes_rss_owner.rb +2 -0
  38. data/lib/feedjira/parser/json_feed.rb +4 -2
  39. data/lib/feedjira/parser/json_feed_item.rb +7 -1
  40. data/lib/feedjira/parser/podlove_chapter.rb +5 -2
  41. data/lib/feedjira/parser/rss.rb +4 -1
  42. data/lib/feedjira/parser/rss_entry.rb +2 -0
  43. data/lib/feedjira/parser/rss_feed_burner.rb +4 -2
  44. data/lib/feedjira/parser/rss_feed_burner_entry.rb +2 -2
  45. data/lib/feedjira/parser/rss_image.rb +2 -0
  46. data/lib/feedjira/parser.rb +2 -0
  47. data/lib/feedjira/preprocessor.rb +3 -1
  48. data/lib/feedjira/rss_entry_utilities.rb +6 -2
  49. data/lib/feedjira/version.rb +3 -1
  50. data/lib/feedjira.rb +2 -1
  51. data/spec/feedjira/configuration_spec.rb +5 -3
  52. data/spec/feedjira/feed_spec.rb +13 -10
  53. data/spec/feedjira/{date_time_utilities_spec.rb → feed_utilities_date_time_spec.rb} +9 -7
  54. data/spec/feedjira/{feed_entry_utilities_spec.rb → feed_utilities_entry_spec.rb} +12 -10
  55. data/spec/feedjira/feed_utilities_spec.rb +37 -40
  56. data/spec/feedjira/parser/atom_entry_spec.rb +22 -20
  57. data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +16 -14
  58. data/spec/feedjira/parser/atom_feed_burner_spec.rb +30 -28
  59. data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +12 -10
  60. data/spec/feedjira/parser/atom_google_alerts_spec.rb +15 -13
  61. data/spec/feedjira/parser/atom_spec.rb +44 -25
  62. data/spec/feedjira/parser/atom_youtube_entry_spec.rb +25 -23
  63. data/spec/feedjira/parser/atom_youtube_spec.rb +16 -14
  64. data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +5 -3
  65. data/spec/feedjira/parser/google_docs_atom_spec.rb +10 -8
  66. data/spec/feedjira/parser/{itunes_rss_item_spec.rb → i_tunes_rss_item_spec.rb} +21 -19
  67. data/spec/feedjira/parser/{itunes_rss_owner_spec.rb → i_tunes_rss_owner_spec.rb} +5 -3
  68. data/spec/feedjira/parser/itunes_rss_spec.rb +35 -33
  69. data/spec/feedjira/parser/json_feed_item_spec.rb +16 -14
  70. data/spec/feedjira/parser/json_feed_spec.rb +15 -13
  71. data/spec/feedjira/parser/podlove_chapter_spec.rb +9 -7
  72. data/spec/feedjira/parser/rss_entry_spec.rb +25 -23
  73. data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +24 -22
  74. data/spec/feedjira/parser/rss_feed_burner_spec.rb +20 -18
  75. data/spec/feedjira/parser/rss_spec.rb +26 -24
  76. data/spec/feedjira/preprocessor_spec.rb +6 -4
  77. data/spec/feedjira_spec.rb +50 -39
  78. data/spec/sample_feeds/a10.xml +72 -0
  79. data/spec/sample_feeds/atom_simple_single_entry.xml +17 -0
  80. data/spec/sample_feeds/atom_simple_single_entry_link_self.xml +17 -0
  81. data/spec/sample_feeds.rb +6 -1
  82. data/spec/spec_helper.rb +3 -7
  83. metadata +60 -24
  84. data/.travis.yml +0 -34
  85. 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 2018-10-08 04:14:19 +0900 using RuboCop version 0.59.2.
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: 7
10
- # Cop supports --auto-correct.
11
- Layout/EmptyLineAfterGuardClause:
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
- ## (Unreleased)
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
@@ -1,12 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org/"
2
4
 
3
5
  gemspec
4
6
 
5
- gem "pry"
6
- gem "rubocop", "~> 0.59.2"
7
-
8
7
  group :test do
9
8
  gem "oga"
10
- gem "ox", platforms: [:mri, :rbx]
9
+ gem "ox", platforms: %i[mri rbx]
11
10
  gem "rake"
12
11
  end
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: [:spec, :rubocop]
19
+ task default: %i[spec rubocop]
data/feedjira.gemspec CHANGED
@@ -1,8 +1,7 @@
1
- # -*- encoding: utf-8 -*-
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.email = "feedjira@gmail.com"
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" => "http://feedjira.com",
23
+ "homepage_uri" => "https://github.com/feedjira/feedjira",
26
24
  "source_code_uri" => "https://github.com/feedjira/feedjira",
27
- "changelog_uri" => "https://github.com/feedjira/feedjira/blob/master/CHANGELOG.md"
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.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 "danger"
40
- s.add_development_dependency "danger-commit_lint"
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 "vcr"
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(STDOUT).tap do |logger|
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
- dest.sec, dest.zone)
20
+ dest.sec, dest.offset)
19
21
  end
20
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class String
2
4
  def sanitize!
3
5
  replace(sanitize)
@@ -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 string =~ /\A\d{14}\z/
32
+ if /\A\d{14}\z/.match?(string)
31
33
  parse("#{string}Z", true)
32
34
  else
33
35
  parse(string).utc
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "feedjira/core_ext/time"
2
4
  require "feedjira/core_ext/date"
3
5
  require "feedjira/core_ext/string"
@@ -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(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec).freeze
7
+ %w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec].freeze
6
8
  MONTHS_SPANISH =
7
- %w(Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic).freeze
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 =~ rgx
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(日 月 火 水 木 金 土).freeze
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
- begin
12
- datetime = DateTime.strptime(prepare(string), p)
13
- return datetime
14
- rescue StandardError => e
15
- Feedjira.logger.debug("Failed to parse date #{string}")
16
- Feedjira.logger.debug(e)
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
- begin
17
- return parser.parse(string).feed_utils_to_gm_time
18
- rescue StandardError => e
19
- Feedjira.logger.debug { "Failed to parse date #{string}" }
20
- Feedjira.logger.debug(e)
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.class == 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(title author summary content image).each do |name|
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 :sanitize!
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(title feed_url url last_modified etag).freeze
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.sort_by { |e| e.published if e.published }.last
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 != new_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
 
@@ -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{\<feed[^\>]+xmlns\s?=\s?[\"\'](http://www\.w3\.org/2005/Atom|http://purl\.org/atom/ns\#)[\"\'][^\>]*\>} =~ xml # rubocop:disable Metrics/LineLength
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 || links.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 Atom feed entries.
@@ -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" } # rubocop:disable Metrics/LineLength
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
- ((/<feed/ =~ xml) && (/Atom/ =~ xml) && (/feedburner/ =~ xml) && !(/\<rss|\<rdf/ =~ xml)) || false # rubocop:disable Metrics/LineLength
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 Metrics/LineLength
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
- if url && url.start_with?("https://www.google.com/url?")
13
- uri = URI(url)
14
- cons = URI.decode_www_form(uri.query).assoc("url")
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) #:nodoc:
16
- %r{xmlns:yt="http://www.youtube.com/xml/schemas/2015"} =~ xml
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
  module Feedjira
2
4
  module Parser
3
5
  class AtomYoutubeEntry
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Feedjira
2
4
  module Parser
3
5
  class GloballyUniqueIdentifier
@@ -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" } # rubocop:disable Metrics/LineLength
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) #:nodoc:
19
- %r{<id>https?://docs\.google\.com/.*\</id\>} =~ xml
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