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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca73bd8dd61cf4dde35246f10e5632830da4ea5a996b61767455ed4f62e7b4af
|
4
|
+
data.tar.gz: a8707013a54705e161e3e1968bd99ed0125d87812928c45b331064af2d615514
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce8991276f54810f067e930095558d640d885f242beb0030e7d8eec33f4fd64fdd786886514fb0711adfecb022f8ee47c429c77d03e52f7e72b721dbc7381359
|
7
|
+
data.tar.gz: fb6c3596fd55cd2ac817881597f43f0ae98f1eb064a5513f573bc4dd03082877d4b48898c7798b5725ccc546f336155cce5df6cbc788515ca7cdc5630df936a5
|
@@ -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
|
+
- "*"
|
data/.github/workflows/ruby.yml
CHANGED
@@ -3,7 +3,7 @@ name: Ruby
|
|
3
3
|
on:
|
4
4
|
push:
|
5
5
|
branches:
|
6
|
-
-
|
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.7, 3.0, 3.1]
|
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
data/.rubocop.yml
CHANGED
@@ -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,41 @@
|
|
1
1
|
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
2
|
+
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 400`
|
3
|
+
# on 2024-05-27 16:41:59 UTC using RuboCop version 1.64.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:
|
9
|
+
# Offense count: 16
|
10
|
+
# Configuration parameters: AllowedConstants.
|
10
11
|
Style/Documentation:
|
11
|
-
|
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/SuperArguments:
|
34
|
+
Exclude:
|
35
|
+
- 'lib/feedjira/feed_utilities.rb'
|
36
|
+
|
37
|
+
# Offense count: 1
|
38
|
+
# This cop supports safe autocorrection (--autocorrect).
|
39
|
+
Style/SuperWithArgsParentheses:
|
40
|
+
Exclude:
|
41
|
+
- 'lib/feedjira/feed_utilities.rb'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Feedjira Changelog
|
2
2
|
|
3
|
+
## 3.2.4
|
4
|
+
|
5
|
+
* Increasing slice limit regarding able_to_parse? (#514)
|
6
|
+
* Enable parsing of JSON feeds with escaped version URL (#515)
|
7
|
+
|
8
|
+
## 3.2.3
|
9
|
+
|
10
|
+
* Switch date parse error to debug (#492)
|
11
|
+
|
3
12
|
## 3.2.2
|
4
13
|
|
5
14
|
* Fix time handling again usec is not a timezone
|
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.15.0"
|
9
|
+
gem "rspec", "~> 3.13.0"
|
10
|
+
gem "rubocop", "~> 1.69.0"
|
11
|
+
gem "rubocop-performance", "~> 1.23.0"
|
12
|
+
gem "rubocop-rake", "~> 0.6.0"
|
13
|
+
gem "rubocop-rspec", "~> 3.3.0"
|
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.2.1"
|
11
21
|
end
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Feedjira
|
2
2
|
|
3
|
-
[![Build Status][
|
3
|
+
[![Build Status][actions-badge]][actions] [![Code Climate][code-climate-badge]][code-climate]
|
4
4
|
|
5
|
-
[
|
6
|
-
[
|
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
|
data/Rakefile
CHANGED
data/feedjira.gemspec
CHANGED
@@ -22,7 +22,7 @@ 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/
|
25
|
+
"changelog_uri" => "https://github.com/feedjira/feedjira/blob/main/CHANGELOG.md",
|
26
26
|
"rubygems_mfa_required" => "true"
|
27
27
|
}
|
28
28
|
|
@@ -31,15 +31,6 @@ Gem::Specification.new do |s|
|
|
31
31
|
|
32
32
|
s.required_ruby_version = ">=2.7"
|
33
33
|
|
34
|
-
s.add_dependency "loofah",
|
35
|
-
s.add_dependency "sax-machine",
|
36
|
-
|
37
|
-
s.add_development_dependency "faraday"
|
38
|
-
s.add_development_dependency "pry"
|
39
|
-
s.add_development_dependency "rspec"
|
40
|
-
s.add_development_dependency "rubocop"
|
41
|
-
s.add_development_dependency "rubocop-performance"
|
42
|
-
s.add_development_dependency "rubocop-rake"
|
43
|
-
s.add_development_dependency "rubocop-rspec"
|
44
|
-
s.add_development_dependency "yard"
|
34
|
+
s.add_dependency "loofah", ">= 2.3.1", "< 3"
|
35
|
+
s.add_dependency "sax-machine", ">= 1.0", "< 2"
|
45
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
|
]
|
@@ -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.
|
20
|
-
|
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
|
24
|
+
Feedjira.logger.debug("Failed to parse time #{datetime}")
|
25
25
|
Feedjira.logger.debug(e)
|
26
26
|
nil
|
27
27
|
end
|
data/lib/feedjira/core_ext.rb
CHANGED
@@ -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.
|
16
|
-
Feedjira.logger.
|
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 ||=
|
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.
|
94
|
+
return feed.entries if entries.empty?
|
99
95
|
|
100
96
|
latest_entry = entries.first
|
101
97
|
found_new_entries = []
|
@@ -8,15 +8,16 @@ module Feedjira
|
|
8
8
|
include FeedUtilities
|
9
9
|
|
10
10
|
def self.able_to_parse?(json)
|
11
|
-
|
11
|
+
json.include?("https://jsonfeed.org/version/") ||
|
12
|
+
json.include?('https:\/\/jsonfeed.org\/version\/')
|
12
13
|
end
|
13
14
|
|
14
15
|
def self.parse(json)
|
15
16
|
new(JSON.parse(json))
|
16
17
|
end
|
17
18
|
|
18
|
-
attr_reader :json, :version, :title, :url, :feed_url, :
|
19
|
-
:expired, :entries
|
19
|
+
attr_reader :json, :version, :title, :description, :url, :feed_url, :icon, :favicon,
|
20
|
+
:language, :expired, :entries
|
20
21
|
|
21
22
|
def initialize(json)
|
22
23
|
@json = json
|
@@ -24,7 +25,10 @@ module Feedjira
|
|
24
25
|
@title = json.fetch("title")
|
25
26
|
@url = json.fetch("home_page_url", nil)
|
26
27
|
@feed_url = json.fetch("feed_url", nil)
|
28
|
+
@icon = json.fetch("icon", nil)
|
29
|
+
@favicon = json.fetch("favicon", nil)
|
27
30
|
@description = json.fetch("description", nil)
|
31
|
+
@language = json.fetch("language", nil)
|
28
32
|
@expired = json.fetch("expired", nil)
|
29
33
|
@entries = parse_items(json["items"])
|
30
34
|
end
|
data/lib/feedjira/version.rb
CHANGED
data/lib/feedjira.rb
CHANGED
@@ -6,44 +6,40 @@ require "loofah"
|
|
6
6
|
require "logger"
|
7
7
|
require "json"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
require "feedjira/parser/atom_entry"
|
26
|
-
require "feedjira/parser/atom"
|
27
|
-
require "feedjira/preprocessor"
|
28
|
-
require "feedjira/version"
|
9
|
+
require_relative "feedjira/core_ext"
|
10
|
+
require_relative "feedjira/configuration"
|
11
|
+
require_relative "feedjira/feed_entry_utilities"
|
12
|
+
require_relative "feedjira/feed_utilities"
|
13
|
+
require_relative "feedjira/feed"
|
14
|
+
require_relative "feedjira/rss_entry_utilities"
|
15
|
+
require_relative "feedjira/atom_entry_utilities"
|
16
|
+
require_relative "feedjira/parser"
|
17
|
+
require_relative "feedjira/parser/globally_unique_identifier"
|
18
|
+
require_relative "feedjira/parser/rss_entry"
|
19
|
+
require_relative "feedjira/parser/rss_image"
|
20
|
+
require_relative "feedjira/parser/rss"
|
21
|
+
require_relative "feedjira/parser/atom_entry"
|
22
|
+
require_relative "feedjira/parser/atom"
|
23
|
+
require_relative "feedjira/preprocessor"
|
24
|
+
require_relative "feedjira/version"
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
26
|
+
require_relative "feedjira/parser/rss_feed_burner_entry"
|
27
|
+
require_relative "feedjira/parser/rss_feed_burner"
|
28
|
+
require_relative "feedjira/parser/podlove_chapter"
|
29
|
+
require_relative "feedjira/parser/itunes_rss_owner"
|
30
|
+
require_relative "feedjira/parser/itunes_rss_category"
|
31
|
+
require_relative "feedjira/parser/itunes_rss_item"
|
32
|
+
require_relative "feedjira/parser/itunes_rss"
|
33
|
+
require_relative "feedjira/parser/atom_feed_burner_entry"
|
34
|
+
require_relative "feedjira/parser/atom_feed_burner"
|
35
|
+
require_relative "feedjira/parser/atom_google_alerts_entry"
|
36
|
+
require_relative "feedjira/parser/atom_google_alerts"
|
37
|
+
require_relative "feedjira/parser/google_docs_atom_entry"
|
38
|
+
require_relative "feedjira/parser/google_docs_atom"
|
39
|
+
require_relative "feedjira/parser/atom_youtube_entry"
|
40
|
+
require_relative "feedjira/parser/atom_youtube"
|
41
|
+
require_relative "feedjira/parser/json_feed"
|
42
|
+
require_relative "feedjira/parser/json_feed_item"
|
47
43
|
|
48
44
|
# Feedjira
|
49
45
|
module Feedjira
|
@@ -74,7 +70,7 @@ module Feedjira
|
|
74
70
|
# parser = Feedjira.parser_for_xml(xml)
|
75
71
|
# parser.parse(xml)
|
76
72
|
def parser_for_xml(xml)
|
77
|
-
start_of_doc = xml.slice(0,
|
73
|
+
start_of_doc = xml.slice(0, 4000)
|
78
74
|
Feedjira.parsers.detect { |klass| klass.able_to_parse?(start_of_doc) }
|
79
75
|
end
|
80
76
|
module_function :parser_for_xml
|
@@ -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
|
data/spec/feedjira/feed_spec.rb
CHANGED
@@ -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 "
|
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 "
|
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
|
@@ -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) {
|
256
|
-
|
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) {
|
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", [])
|
@@ -9,6 +9,10 @@ module Feedjira
|
|
9
9
|
expect(JSONFeed).to be_able_to_parse(sample_json_feed)
|
10
10
|
end
|
11
11
|
|
12
|
+
it "returns true for a JSON feed with escaped URIs" do
|
13
|
+
expect(JSONFeed).to be_able_to_parse(sample_json_feed_with_escaped_uris)
|
14
|
+
end
|
15
|
+
|
12
16
|
it "returns false for an RSS feed" do
|
13
17
|
expect(JSONFeed).not_to be_able_to_parse(sample_rss_feed)
|
14
18
|
end
|
@@ -43,6 +47,18 @@ module Feedjira
|
|
43
47
|
expect(@feed.description).to eq "Brent Simmons’s weblog."
|
44
48
|
end
|
45
49
|
|
50
|
+
it "parses the favicon" do
|
51
|
+
expect(@feed.favicon).to eq "http://inessential.com/favicon.ico"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "parses the icon" do
|
55
|
+
expect(@feed.icon).to eq "http://inessential.com/icon.png"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "parses the language" do
|
59
|
+
expect(@feed.language).to eq "en-US"
|
60
|
+
end
|
61
|
+
|
46
62
|
it "parses expired and return default (nil)" do
|
47
63
|
expect(@feed.expired).to be_nil
|
48
64
|
end
|