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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6930aadfe8b2a06d65aa2a8dfaad0d8fcc4f34356a3c3646cf75ef70a753a8d
4
- data.tar.gz: 00a921f06c7542ca84d552a6f680e56d99f4b0b3aa830113b75c0545f6fdbcf7
3
+ metadata.gz: 12ef7af9ab5efeab944facbebb844c347458d7cc422927f0971f74606a0a57a3
4
+ data.tar.gz: 1d3c99b6799f173aaeea41b8e91f1e28c68cebfe59af92da0c32320c90d8ff20
5
5
  SHA512:
6
- metadata.gz: 5970d946d3673ff856f95bef75e09b4cc0b6dbc3b8b9ba66a3ebade66d93fd894b23e784d8e9c3ab345eb6deae2094878e60be2164aae46623e2159bcf4530c0
7
- data.tar.gz: ae1466452711a547ec9f2ad42ab34b11a8ce03a1886e6ddeb56f3a8723c3d1ab6f1a0b22461c339a0a5c490e64965a37da9329bcd701fd4d10117c8b9e28fbe1
6
+ metadata.gz: 5c8527d5cfdc791d27cc970223575cdd4a75831d1665f63b7f650b733f4c9f7dadbd071ea3403c97a107d8cfbb930abc631a9428acadd3316f22e46802b7f2a2
7
+ data.tar.gz: b2710b27a649c0544e7f4f71a05117e96bc63c4fff9c3be0a7273ea4a173063b963e59dae9ed1c59aace5ca6319cb56f7012e994c9cecd8b2158f8931299bfbe
@@ -0,0 +1,17 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5
+
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "bundler" # See documentation for possible values
9
+ directory: "/" # Location of package manifests
10
+ schedule:
11
+ interval: "weekly"
12
+ assignees:
13
+ - "mockdeep"
14
+ groups:
15
+ all:
16
+ patterns:
17
+ - "*"
@@ -3,7 +3,7 @@ name: Ruby
3
3
  on:
4
4
  push:
5
5
  branches:
6
- - master
6
+ - main
7
7
  pull_request:
8
8
 
9
9
  jobs:
@@ -12,7 +12,7 @@ jobs:
12
12
  fail-fast: false
13
13
  matrix:
14
14
  os: [ubuntu]
15
- ruby: [2.5, 2.6, 2.7, 3.0]
15
+ ruby: [2.7, 3.0, 3.1, 3.2, 3.3]
16
16
  handler: [nokogiri, ox, oga]
17
17
  exclude:
18
18
  - { ruby: jruby, handler: ox }
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ doc/
7
7
  .yardoc/
8
8
  pkg/
9
9
  rdoc/
10
+ coverage/
data/.rubocop.yml CHANGED
@@ -6,7 +6,7 @@ require:
6
6
  - rubocop-performance
7
7
 
8
8
  AllCops:
9
- TargetRubyVersion: 2.5
9
+ TargetRubyVersion: 2.7
10
10
  NewCops: enable
11
11
 
12
12
  # Offense count: 3
@@ -29,9 +29,6 @@ Layout/LineLength:
29
29
  Exclude:
30
30
  - 'spec/**/*.rb'
31
31
 
32
- Style/AsciiComments:
33
- Enabled: false
34
-
35
32
  Style/IfUnlessModifier:
36
33
  Enabled: false
37
34
 
@@ -59,8 +56,5 @@ RSpec/MultipleMemoizedHelpers:
59
56
  RSpec/BeforeAfterAll:
60
57
  Enabled: false
61
58
 
62
- RSpec/VerifiedDoubles:
63
- Enabled: false
64
-
65
59
  RSpec/RepeatedExample:
66
60
  Enabled: false
data/.rubocop_todo.yml CHANGED
@@ -1,11 +1,35 @@
1
1
  # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2020-09-02 20:02:06 UTC using RuboCop version 0.90.0.
2
+ # `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 400`
3
+ # on 2023-12-16 21:24:13 UTC using RuboCop version 1.59.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: 20
9
+ # Offense count: 16
10
+ # Configuration parameters: AllowedConstants.
10
11
  Style/Documentation:
11
- Enabled: false
12
+ Exclude:
13
+ - 'spec/**/*'
14
+ - 'test/**/*'
15
+ - 'lib/feedjira/atom_entry_utilities.rb'
16
+ - 'lib/feedjira/core_ext/string.rb'
17
+ - 'lib/feedjira/core_ext/time.rb'
18
+ - 'lib/feedjira/feed.rb'
19
+ - 'lib/feedjira/feed_entry_utilities.rb'
20
+ - 'lib/feedjira/feed_utilities.rb'
21
+ - 'lib/feedjira/parser.rb'
22
+ - 'lib/feedjira/parser/atom_youtube_entry.rb'
23
+ - 'lib/feedjira/parser/globally_unique_identifier.rb'
24
+ - 'lib/feedjira/parser/google_docs_atom.rb'
25
+ - 'lib/feedjira/parser/google_docs_atom_entry.rb'
26
+ - 'lib/feedjira/parser/itunes_rss_owner.rb'
27
+ - 'lib/feedjira/parser/podlove_chapter.rb'
28
+ - 'lib/feedjira/preprocessor.rb'
29
+ - 'lib/feedjira/rss_entry_utilities.rb'
30
+
31
+ # Offense count: 1
32
+ # This cop supports safe autocorrection (--autocorrect).
33
+ Style/SuperWithArgsParentheses:
34
+ Exclude:
35
+ - 'lib/feedjira/feed_utilities.rb'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Feedjira Changelog
2
2
 
3
+ ## 3.2.3
4
+
5
+ * Switch date parse error to debug (#492)
6
+
7
+ ## 3.2.2
8
+
9
+ * Fix time handling again usec is not a timezone
10
+
11
+ * Update rubocop * drop official support for eol Ruby
12
+
13
+
14
+ ## 3.2.1
15
+
16
+ * Fix time handling in ruby 3.1
17
+
18
+ * Atom feeds now have an icon field via https://github.com/feedjira/feedjira/pull/452 (@jswanner)
19
+
3
20
  ## 3.2.0
4
21
 
5
22
  * Atom `feed_url` no longer falls back to `url` via https://github.com/feedjira/feedjira/pull/451 (@frederfred)
data/Gemfile CHANGED
@@ -4,8 +4,18 @@ source "https://rubygems.org/"
4
4
 
5
5
  gemspec
6
6
 
7
+ gem "faraday", "~> 2.8.1"
8
+ gem "pry", "~> 0.14.2"
9
+ gem "rspec", "~> 3.13.0"
10
+ gem "rubocop", "~> 1.60.1"
11
+ gem "rubocop-performance", "~> 1.20.0"
12
+ gem "rubocop-rake", "~> 0.6.0"
13
+ gem "rubocop-rspec", "~> 2.26.1"
14
+ gem "simplecov", "~> 0.22.0"
15
+ gem "yard", "~> 0.9.34"
16
+
7
17
  group :test do
8
- gem "oga"
9
- gem "ox", platforms: %i[mri rbx]
10
- gem "rake"
18
+ gem "oga", "~> 3.4"
19
+ gem "ox", "~> 2.14.17", platforms: %i[mri rbx]
20
+ gem "rake", "~> 13.1.0"
11
21
  end
data/README.md CHANGED
@@ -1,13 +1,12 @@
1
1
  # Feedjira
2
2
 
3
- [![Build Status][travis-badge]][travis] [![Code Climate][code-climate-badge]][code-climate] [![Gitter][gitter-badge]][gitter]
3
+ [![Build Status][actions-badge]][actions] [![Code Climate][code-climate-badge]][code-climate]
4
4
 
5
- [travis-badge]: https://travis-ci.org/feedjira/feedjira.svg?branch=master
6
- [travis]: http://travis-ci.org/feedjira/feedjira
5
+ [actions-badge]: https://github.com/feedjira/feedjira/actions/workflows/ruby.yml/badge.svg?branch=main
6
+ [actions]: https://github.com/feedjira/feedjira/actions?query=branch%3Amain
7
7
  [code-climate-badge]: https://codeclimate.com/github/feedjira/feedjira/badges/gpa.svg
8
8
  [code-climate]: https://codeclimate.com/github/feedjira/feedjira
9
9
  [gitter-badge]: https://badges.gitter.im/feedjira/feedjira.svg
10
- [gitter]: https://gitter.im/feedjira/feedjira?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
11
10
 
12
11
  Feedjira is a Ruby library designed to parse feeds.
13
12
 
data/feedjira.gemspec CHANGED
@@ -22,25 +22,15 @@ Gem::Specification.new do |s|
22
22
  s.metadata = {
23
23
  "homepage_uri" => "https://github.com/feedjira/feedjira",
24
24
  "source_code_uri" => "https://github.com/feedjira/feedjira",
25
- "changelog_uri" => "https://github.com/feedjira/feedjira/blob/master/CHANGELOG.md",
25
+ "changelog_uri" => "https://github.com/feedjira/feedjira/blob/main/CHANGELOG.md",
26
26
  "rubygems_mfa_required" => "true"
27
27
  }
28
28
 
29
29
  s.files = `git ls-files`.split("\n")
30
30
  s.require_paths = ["lib"]
31
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
32
31
 
33
- s.required_ruby_version = ">=2.5"
32
+ s.required_ruby_version = ">=2.7"
34
33
 
35
- s.add_dependency "loofah", ">= 2.3.1"
36
- s.add_dependency "sax-machine", ">= 1.0"
37
-
38
- s.add_development_dependency "faraday"
39
- s.add_development_dependency "pry"
40
- s.add_development_dependency "rspec"
41
- s.add_development_dependency "rubocop"
42
- s.add_development_dependency "rubocop-performance"
43
- s.add_development_dependency "rubocop-rake"
44
- s.add_development_dependency "rubocop-rspec"
45
- s.add_development_dependency "yard"
34
+ s.add_runtime_dependency "loofah", ">= 2.3.1", "< 3"
35
+ s.add_runtime_dependency "sax-machine", ">= 1.0", "< 2"
46
36
  end
@@ -59,13 +59,13 @@ module Feedjira
59
59
  # @private
60
60
  def default_parsers
61
61
  [
62
+ Feedjira::Parser::ITunesRSS,
62
63
  Feedjira::Parser::RSSFeedBurner,
63
64
  Feedjira::Parser::GoogleDocsAtom,
64
65
  Feedjira::Parser::AtomYoutube,
65
66
  Feedjira::Parser::AtomFeedBurner,
66
67
  Feedjira::Parser::AtomGoogleAlerts,
67
68
  Feedjira::Parser::Atom,
68
- Feedjira::Parser::ITunesRSS,
69
69
  Feedjira::Parser::RSS,
70
70
  Feedjira::Parser::JSONFeed
71
71
  ]
@@ -9,14 +9,11 @@ class Date
9
9
  feed_utils_to_time(new_offset, :gm)
10
10
  end
11
11
 
12
- def feed_utils_to_local_time
13
- feed_utils_to_time(new_offset(DateTime.now.offset - offset), :local)
14
- end
15
-
16
12
  private
17
13
 
18
14
  def feed_utils_to_time(dest, method)
19
- Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min,
20
- dest.sec, dest.offset)
15
+ # Convert a fraction of a day to a number of microseconds
16
+ usec = (dest.sec_fraction * (10**6)).to_i
17
+ Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min, dest.sec, usec)
21
18
  end
22
19
  end
@@ -16,12 +16,12 @@ class Time
16
16
  if datetime.is_a?(Time)
17
17
  datetime.utc
18
18
  elsif datetime.respond_to?(:to_datetime)
19
- datetime.to_datetime.utc
20
- elsif datetime.respond_to? :to_s
19
+ datetime.to_time.utc
20
+ else
21
21
  parse_string_safely datetime.to_s
22
22
  end
23
23
  rescue StandardError => e
24
- Feedjira.logger.debug { "Failed to parse time #{datetime}" }
24
+ Feedjira.logger.debug("Failed to parse time #{datetime}")
25
25
  Feedjira.logger.debug(e)
26
26
  nil
27
27
  end
@@ -3,7 +3,6 @@
3
3
  module Feedjira
4
4
  module FeedEntryUtilities
5
5
  include Enumerable
6
- include DateTimeUtilities
7
6
 
8
7
  def published
9
8
  @published ||= @updated
@@ -12,8 +11,8 @@ module Feedjira
12
11
  def parse_datetime(string)
13
12
  DateTime.parse(string).feed_utils_to_gm_time
14
13
  rescue StandardError => e
15
- Feedjira.logger.warn { "Failed to parse date #{string.inspect}" }
16
- Feedjira.logger.warn(e)
14
+ Feedjira.logger.debug("Failed to parse date #{string.inspect}")
15
+ Feedjira.logger.debug(e)
17
16
  nil
18
17
  end
19
18
 
@@ -64,11 +63,11 @@ module Feedjira
64
63
  end
65
64
 
66
65
  def [](field)
67
- instance_variable_get("@#{field}")
66
+ instance_variable_get(:"@#{field}")
68
67
  end
69
68
 
70
69
  def []=(field, value)
71
- instance_variable_set("@#{field}", value)
70
+ instance_variable_set(:"@#{field}", value)
72
71
  end
73
72
  end
74
73
  end
@@ -41,11 +41,7 @@ module Feedjira
41
41
  end
42
42
 
43
43
  def last_modified
44
- @last_modified ||= begin
45
- published = entries.reject { |e| e.published.nil? }
46
- entry = published.max_by(&:published)
47
- entry ? entry.published : nil
48
- end
44
+ @last_modified ||= entries.reject { |e| e.published.nil? }.max_by(&:published)&.published
49
45
  end
50
46
 
51
47
  def updated?
@@ -78,7 +74,7 @@ module Feedjira
78
74
  if old_value == new_value
79
75
  false
80
76
  else
81
- send("#{name}=", new_value)
77
+ send(:"#{name}=", new_value)
82
78
  true
83
79
  end
84
80
  end
@@ -95,7 +91,7 @@ module Feedjira
95
91
  # entries just parsed and insert each one as a new entry until we get to
96
92
  # one that has the same id as the the newest for the feed.
97
93
  def find_new_entries_for(feed)
98
- return feed.entries if entries.length.zero?
94
+ return feed.entries if entries.empty?
99
95
 
100
96
  latest_entry = entries.first
101
97
  found_new_entries = []
@@ -15,8 +15,8 @@ module Feedjira
15
15
  new(JSON.parse(json))
16
16
  end
17
17
 
18
- attr_reader :json, :version, :title, :url, :feed_url, :description,
19
- :expired, :entries
18
+ attr_reader :json, :version, :title, :description, :url, :feed_url, :icon, :favicon,
19
+ :language, :expired, :entries
20
20
 
21
21
  def initialize(json)
22
22
  @json = json
@@ -24,7 +24,10 @@ module Feedjira
24
24
  @title = json.fetch("title")
25
25
  @url = json.fetch("home_page_url", nil)
26
26
  @feed_url = json.fetch("feed_url", nil)
27
+ @icon = json.fetch("icon", nil)
28
+ @favicon = json.fetch("favicon", nil)
27
29
  @description = json.fetch("description", nil)
30
+ @language = json.fetch("language", nil)
28
31
  @expired = json.fetch("expired", nil)
29
32
  @entries = parse_items(json["items"])
30
33
  end
@@ -2,7 +2,8 @@
2
2
 
3
3
  module Feedjira
4
4
  module RSSEntryUtilities
5
- def self.included(mod)
5
+ # rubocop:todo Metrics/MethodLength
6
+ def self.included(mod) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
6
7
  mod.class_exec do
7
8
  element :title
8
9
 
@@ -34,9 +35,12 @@ module Feedjira
34
35
  element :"media:content", as: :image, value: :url
35
36
  element :enclosure, as: :image, value: :url
36
37
 
38
+ element :comments
39
+
37
40
  elements :category, as: :categories
38
41
  end
39
42
  end
43
+ # rubocop:enable Metrics/MethodLength
40
44
 
41
45
  def entry_id
42
46
  @entry_id&.guid
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Feedjira
4
- VERSION = "3.2.1"
4
+ VERSION = "3.2.3"
5
5
  end
data/lib/feedjira.rb CHANGED
@@ -8,10 +8,6 @@ require "json"
8
8
 
9
9
  require "feedjira/core_ext"
10
10
  require "feedjira/configuration"
11
- require "feedjira/date_time_utilities/date_time_epoch_parser"
12
- require "feedjira/date_time_utilities/date_time_language_parser"
13
- require "feedjira/date_time_utilities/date_time_pattern_parser"
14
- require "feedjira/date_time_utilities"
15
11
  require "feedjira/feed_entry_utilities"
16
12
  require "feedjira/feed_utilities"
17
13
  require "feedjira/feed"
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe Time do
6
+ describe "#parse_safely" do
7
+ it "returns the datetime in utc when given a Time" do
8
+ time = described_class.now
9
+
10
+ expect(described_class.parse_safely(time)).to eq(time.utc)
11
+ end
12
+
13
+ it "returns the datetime in utc when given a Date" do
14
+ date = Date.today
15
+
16
+ expect(described_class.parse_safely(date)).to eq(date.to_time.utc)
17
+ end
18
+
19
+ it "returns the datetime in utc when given a String" do
20
+ timestamp = "2016-01-01 00:00:00"
21
+
22
+ expect(described_class.parse_safely(timestamp)).to eq(described_class.parse(timestamp).utc)
23
+ end
24
+
25
+ it "returns nil when given an empty String" do
26
+ timestamp = ""
27
+
28
+ expect(described_class.parse_safely(timestamp)).to be_nil
29
+ end
30
+
31
+ it "returns the the datetime in utc given a 14-digit time" do
32
+ time = described_class.now.utc
33
+ timestamp = time.strftime("%Y%m%d%H%M%S")
34
+
35
+ expect(described_class.parse_safely(timestamp)).to eq(time.floor)
36
+ end
37
+
38
+ context "when given an invalid time string" do
39
+ it "returns nil" do
40
+ timestamp = "2016-51-51 00:00:00"
41
+
42
+ expect(described_class.parse_safely(timestamp)).to be_nil
43
+ end
44
+
45
+ it "logs an error" do
46
+ timestamp = "2016-51-51 00:00:00"
47
+
48
+ expect(Feedjira.logger)
49
+ .to receive(:debug).with("Failed to parse time #{timestamp}")
50
+ expect(Feedjira.logger)
51
+ .to receive(:debug).with(an_instance_of(ArgumentError))
52
+
53
+ described_class.parse_safely(timestamp)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -2,17 +2,8 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- class Hell < StandardError; end
6
-
7
- class FailParser
8
- def self.parse(_xml)
9
- yield "this parser always fails."
10
- # on_failure.call
11
- end
12
- end
13
-
14
5
  describe Feedjira::Feed do
15
- describe "#add_common_feed_element" do
6
+ describe ".add_common_feed_element" do
16
7
  before(:all) do
17
8
  described_class.add_common_feed_element("generator")
18
9
  end
@@ -30,7 +21,25 @@ describe Feedjira::Feed do
30
21
  end
31
22
  end
32
23
 
33
- describe "#add_common_feed_entry_element" do
24
+ describe ".add_common_feed_elements" do
25
+ before do
26
+ described_class.add_common_feed_elements(:foos)
27
+ end
28
+
29
+ it "parses the added element out of Atom feeds" do
30
+ expect(Feedjira.parse(sample_wfw_feed).foos).to eq []
31
+ end
32
+
33
+ it "parses the added element out of Atom Feedburner feeds" do
34
+ expect(Feedjira::Parser::Atom.new).to respond_to(:foos)
35
+ end
36
+
37
+ it "parses the added element out of RSS feeds" do
38
+ expect(Feedjira::Parser::RSS.new).to respond_to(:foos)
39
+ end
40
+ end
41
+
42
+ describe ".add_common_feed_entry_element" do
34
43
  before(:all) do
35
44
  tag = "wfw:commentRss"
36
45
  described_class.add_common_feed_entry_element tag, as: :comment_rss
@@ -49,4 +58,23 @@ describe Feedjira::Feed do
49
58
  expect(Feedjira::Parser::RSSEntry.new).to respond_to(:comment_rss)
50
59
  end
51
60
  end
61
+
62
+ describe ".add_common_feed_entry_elements" do
63
+ before do
64
+ described_class.add_common_feed_entry_elements(:things)
65
+ end
66
+
67
+ it "parses the added element out of Atom feeds entries" do
68
+ entry = Feedjira.parse(sample_wfw_feed).entries.first
69
+ expect(entry.things).to eq []
70
+ end
71
+
72
+ it "parses the added element out of Atom Feedburner feeds entries" do
73
+ expect(Feedjira::Parser::AtomEntry.new).to respond_to(:things)
74
+ end
75
+
76
+ it "parses the added element out of RSS feeds entries" do
77
+ expect(Feedjira::Parser::RSSEntry.new).to respond_to(:things)
78
+ end
79
+ end
52
80
  end
@@ -19,7 +19,7 @@ describe Feedjira::FeedUtilities do
19
19
  it "parses a ISO 8601 with milliseconds into Time" do
20
20
  time = @klass.new.parse_datetime("2013-09-17T08:20:13.931-04:00")
21
21
  expect(time.class).to eq Time
22
- expect(time).to eq Time.parse_safely("Tue Sep 17 12:20:13 UTC 2013")
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
23
  end
24
24
  end
25
25
 
@@ -20,7 +20,7 @@ describe Feedjira::FeedUtilities do
20
20
  end
21
21
 
22
22
  context "when the flag is set" do
23
- it "calls the preprocessing method" do
23
+ it "calls the preprocessing method" do # rubocop:todo RSpec/NoExpectationExample
24
24
  @klass.preprocess_xml = true
25
25
  allow(@klass).to receive(:preprocess).and_return sample_rss_feed
26
26
  @klass.parse sample_rss_feed
@@ -78,7 +78,7 @@ describe Feedjira::FeedUtilities do
78
78
  it "returns new_entries? as true when entries are put into new_entries" do
79
79
  feed = @klass.new
80
80
  feed.new_entries << :foo
81
- expect(feed.new_entries?).to eq true
81
+ expect(feed.new_entries?).to be true
82
82
  end
83
83
 
84
84
  it "returns a last_modified value from the entry with the most recent published date if the last_modified date hasn't been set" do
@@ -116,6 +116,7 @@ describe Feedjira::FeedUtilities do
116
116
  it "updates the title if changed" do
117
117
  @updated_feed.title = "new title"
118
118
  @feed.update_from_feed(@updated_feed)
119
+
119
120
  expect(@feed.title).to eq @updated_feed.title
120
121
  expect(@feed).to be_updated
121
122
  end
@@ -252,11 +253,12 @@ describe Feedjira::FeedUtilities do
252
253
  let(:url_one) { "http://example.com/post_one.html" }
253
254
  let(:url_two) { "http://example.com/post_two.html" }
254
255
 
255
- let(:entry_one) { double "Entry One", entry_id: id_one, url: url_one }
256
- let(:entry_two) { double "Entry Two", entry_id: id_two, url: url_two }
256
+ let(:entry_one) { object_double(Feedjira::Parser::AtomEntry.new, entry_id: id_one, url: url_one) }
257
+
258
+ let(:entry_two) { object_double(Feedjira::Parser::AtomEntry.new, entry_id: id_two, url: url_two) }
257
259
 
258
260
  let(:feed_one) { Feedjira::Parser::Atom.new }
259
- let(:feed_two) { double "Feed Two", entries: [entry_two] }
261
+ let(:feed_two) { object_double(Feedjira::Parser::Atom.new, entries: [entry_two]) }
260
262
 
261
263
  before do
262
264
  stub_const("Feedjira::FeedUtilities::UPDATABLE_ATTRIBUTES", [])
@@ -43,8 +43,20 @@ module Feedjira
43
43
  expect(@feed.description).to eq "Brent Simmons’s weblog."
44
44
  end
45
45
 
46
+ it "parses the favicon" do
47
+ expect(@feed.favicon).to eq "http://inessential.com/favicon.ico"
48
+ end
49
+
50
+ it "parses the icon" do
51
+ expect(@feed.icon).to eq "http://inessential.com/icon.png"
52
+ end
53
+
54
+ it "parses the language" do
55
+ expect(@feed.language).to eq "en-US"
56
+ end
57
+
46
58
  it "parses expired and return default (nil)" do
47
- expect(@feed.expired).to be nil
59
+ expect(@feed.expired).to be_nil
48
60
  end
49
61
 
50
62
  it "parses entries" do
@@ -72,6 +72,7 @@ describe Feedjira::Parser::RSSEntry do
72
72
  author
73
73
  categories
74
74
  comment_rss
75
+ comments
75
76
  content
76
77
  entry_id
77
78
  published
@@ -99,7 +100,7 @@ describe Feedjira::Parser::RSSEntry do
99
100
 
100
101
  it "ignores urls from guids with isPermaLink='false'" do
101
102
  feed = Feedjira.parse(sample_rss_feed_permalinks)
102
- expect(feed.entries[0].url).to eq nil
103
+ expect(feed.entries[0].url).to be_nil
103
104
  end
104
105
 
105
106
  it "gets urls from guids with isPermaLink='true'" do
@@ -116,4 +117,9 @@ describe Feedjira::Parser::RSSEntry do
116
117
  feed = Feedjira.parse(sample_rss_feed_permalinks)
117
118
  expect(feed.entries[3].url).to eq "http://example.com/4"
118
119
  end
120
+
121
+ it "exposes comments URL" do
122
+ feed = Feedjira.parse(sample_rss_feed_with_comments)
123
+ expect(feed.entries[0].comments).to eq "https://news.ycombinator.com/item?id=30937433"
124
+ end
119
125
  end
@@ -75,6 +75,7 @@ describe Feedjira::Parser::RSSFeedBurnerEntry do
75
75
  author
76
76
  categories
77
77
  comment_rss
78
+ comments
78
79
  content
79
80
  entry_id
80
81
  image
@@ -14,7 +14,7 @@ describe Feedjira::Parser::RSS do
14
14
 
15
15
  it "returns false for an rss feedburner feed" do
16
16
  able = described_class.able_to_parse? sample_rss_feed_burner_feed
17
- expect(able).to eq false
17
+ expect(able).to be false
18
18
  end
19
19
  end
20
20