feedjira 3.2.0 → 3.2.2
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/ISSUE_TEMPLATE/general-issue.md +8 -0
- data/.github/workflows/ruby.yml +1 -1
- data/.rubocop.yml +33 -1
- data/CHANGELOG.md +13 -0
- data/Gemfile +0 -3
- data/README.md +1 -2
- data/feedjira.gemspec +7 -3
- data/lib/feedjira/core_ext/date.rb +3 -2
- data/lib/feedjira/core_ext/time.rb +1 -1
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +1 -1
- data/lib/feedjira/feed_utilities.rb +3 -3
- data/lib/feedjira/parser/atom_feed_burner.rb +1 -1
- data/lib/feedjira/parser/atom_google_alerts_entry.rb +2 -0
- data/lib/feedjira/parser/atom_youtube.rb +2 -2
- data/lib/feedjira/parser/google_docs_atom.rb +1 -1
- data/lib/feedjira/parser/itunes_rss_category.rb +2 -2
- data/lib/feedjira/parser/podlove_chapter.rb +2 -2
- data/lib/feedjira/parser/rss.rb +1 -1
- data/lib/feedjira/parser/rss_feed_burner.rb +2 -2
- data/lib/feedjira/rss_entry_utilities.rb +5 -1
- data/lib/feedjira/version.rb +1 -1
- data/lib/feedjira.rb +2 -2
- data/spec/feedjira/feed_spec.rb +11 -10
- data/spec/feedjira/{date_time_utilities_spec.rb → feed_utilities_date_time_spec.rb} +8 -8
- data/spec/feedjira/{feed_entry_utilities_spec.rb → feed_utilities_entry_spec.rb} +9 -9
- data/spec/feedjira/feed_utilities_spec.rb +37 -42
- data/spec/feedjira/parser/atom_entry_spec.rb +16 -16
- data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +10 -10
- data/spec/feedjira/parser/atom_feed_burner_spec.rb +26 -26
- data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +6 -6
- data/spec/feedjira/parser/atom_google_alerts_spec.rb +13 -13
- data/spec/feedjira/parser/atom_spec.rb +23 -23
- data/spec/feedjira/parser/atom_youtube_entry_spec.rb +19 -19
- data/spec/feedjira/parser/atom_youtube_spec.rb +13 -13
- data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +3 -3
- data/spec/feedjira/parser/google_docs_atom_spec.rb +8 -8
- data/spec/feedjira/parser/{itunes_rss_item_spec.rb → i_tunes_rss_item_spec.rb} +18 -18
- data/spec/feedjira/parser/{itunes_rss_owner_spec.rb → i_tunes_rss_owner_spec.rb} +3 -3
- data/spec/feedjira/parser/itunes_rss_spec.rb +26 -26
- data/spec/feedjira/parser/json_feed_item_spec.rb +11 -11
- data/spec/feedjira/parser/json_feed_spec.rb +14 -14
- data/spec/feedjira/parser/podlove_chapter_spec.rb +7 -7
- data/spec/feedjira/parser/rss_entry_spec.rb +26 -20
- data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +16 -15
- data/spec/feedjira/parser/rss_feed_burner_spec.rb +17 -17
- data/spec/feedjira/parser/rss_spec.rb +25 -25
- data/spec/feedjira/preprocessor_spec.rb +3 -3
- data/spec/feedjira_spec.rb +41 -41
- data/spec/sample_feeds/RSSWithComments.xml +277 -0
- data/spec/sample_feeds.rb +2 -1
- metadata +68 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5169a51338551c1253b148e944e9b63cff818f85ba5eeafd2c3239ea007b5012
|
4
|
+
data.tar.gz: c9966b308d0f57873c56b474cdbdc7a1a96ee6dd64d5a0ca56f30c333ada9298
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad3fc7290af22ec75dbba64b2397ad3e8e6f283f73c3c793eaf9b33d28410dcaa6439618c47d741858a732df7478cbcb21f987314880ef5acd108224cc6fa7a2
|
7
|
+
data.tar.gz: 20422cf9fdf53491356726c29b118ce6e1b3b37c0ef7294f1c01bcaf00df72097ae6afd1a88191ca765217fe7a159996247de4837a14a1716d33ad8024f7f784
|
data/.github/workflows/ruby.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
inherit_from: .rubocop_todo.yml
|
2
2
|
|
3
|
+
require:
|
4
|
+
- rubocop-rake
|
5
|
+
- rubocop-rspec
|
6
|
+
- rubocop-performance
|
7
|
+
|
3
8
|
AllCops:
|
4
|
-
TargetRubyVersion: 2.
|
9
|
+
TargetRubyVersion: 2.7
|
5
10
|
NewCops: enable
|
6
11
|
|
7
12
|
# Offense count: 3
|
@@ -32,3 +37,30 @@ Style/IfUnlessModifier:
|
|
32
37
|
|
33
38
|
Style/StringLiterals:
|
34
39
|
EnforcedStyle: double_quotes
|
40
|
+
|
41
|
+
RSpec/MultipleExpectations:
|
42
|
+
Max: 10
|
43
|
+
|
44
|
+
RSpec/ExampleLength:
|
45
|
+
Max: 30
|
46
|
+
|
47
|
+
RSpec/InstanceVariable:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
RSpec/MessageSpies:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
RSpec/NestedGroups:
|
54
|
+
Max: 5
|
55
|
+
|
56
|
+
RSpec/MultipleMemoizedHelpers:
|
57
|
+
Max: 10
|
58
|
+
|
59
|
+
RSpec/BeforeAfterAll:
|
60
|
+
Enabled: false
|
61
|
+
|
62
|
+
RSpec/VerifiedDoubles:
|
63
|
+
Enabled: false
|
64
|
+
|
65
|
+
RSpec/RepeatedExample:
|
66
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Feedjira Changelog
|
2
2
|
|
3
|
+
## 3.2.2
|
4
|
+
|
5
|
+
* Fix time handling again usec is not a timezone
|
6
|
+
|
7
|
+
* Update rubocop * drop official support for eol Ruby
|
8
|
+
|
9
|
+
|
10
|
+
## 3.2.1
|
11
|
+
|
12
|
+
* Fix time handling in ruby 3.1
|
13
|
+
|
14
|
+
* Atom feeds now have an icon field via https://github.com/feedjira/feedjira/pull/452 (@jswanner)
|
15
|
+
|
3
16
|
## 3.2.0
|
4
17
|
|
5
18
|
* Atom `feed_url` no longer falls back to `url` via https://github.com/feedjira/feedjira/pull/451 (@frederfred)
|
data/Gemfile
CHANGED
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]
|
3
|
+
[![Build Status][travis-badge]][travis] [![Code Climate][code-climate-badge]][code-climate]
|
4
4
|
|
5
5
|
[travis-badge]: https://travis-ci.org/feedjira/feedjira.svg?branch=master
|
6
6
|
[travis]: http://travis-ci.org/feedjira/feedjira
|
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,20 +22,24 @@ 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/master/CHANGELOG.md",
|
26
|
+
"rubygems_mfa_required" => "true"
|
26
27
|
}
|
27
28
|
|
28
29
|
s.files = `git ls-files`.split("\n")
|
29
30
|
s.require_paths = ["lib"]
|
30
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
31
31
|
|
32
|
-
s.required_ruby_version = ">=2.
|
32
|
+
s.required_ruby_version = ">=2.7"
|
33
33
|
|
34
34
|
s.add_dependency "loofah", ">= 2.3.1"
|
35
35
|
s.add_dependency "sax-machine", ">= 1.0"
|
36
36
|
|
37
37
|
s.add_development_dependency "faraday"
|
38
|
+
s.add_development_dependency "pry"
|
38
39
|
s.add_development_dependency "rspec"
|
39
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"
|
40
44
|
s.add_development_dependency "yard"
|
41
45
|
end
|
@@ -16,7 +16,8 @@ class Date
|
|
16
16
|
private
|
17
17
|
|
18
18
|
def feed_utils_to_time(dest, method)
|
19
|
-
|
20
|
-
|
19
|
+
# Convert a fraction of a day to a number of microseconds
|
20
|
+
usec = (dest.sec_fraction * (10**6)).to_i
|
21
|
+
Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min, dest.sec, usec)
|
21
22
|
end
|
22
23
|
end
|
@@ -15,7 +15,7 @@ module Feedjira
|
|
15
15
|
def self.translate(string)
|
16
16
|
MONTHS_SPANISH.each_with_index do |m, i|
|
17
17
|
rgx = Regexp.new("\s#{m}\s", Regexp::IGNORECASE)
|
18
|
-
return string.gsub(rgx, MONTHS_ENGLISH[i]) if string
|
18
|
+
return string.gsub(rgx, MONTHS_ENGLISH[i]) if string&.match?(rgx)
|
19
19
|
end
|
20
20
|
raise "No translation found for #{string}"
|
21
21
|
end
|
@@ -21,7 +21,7 @@ module Feedjira
|
|
21
21
|
attr_writer :url, :feed_url
|
22
22
|
|
23
23
|
def self.able_to_parse?(xml)
|
24
|
-
((
|
24
|
+
(xml.include?("<feed") && xml.include?("Atom") && xml.include?("feedburner") && !(/<rss|<rdf/ =~ xml)) || false
|
25
25
|
end
|
26
26
|
|
27
27
|
# Feed url is <link> with type="text/html" if present,
|
@@ -14,8 +14,8 @@ module Feedjira
|
|
14
14
|
|
15
15
|
elements :entry, as: :entries, class: AtomYoutubeEntry
|
16
16
|
|
17
|
-
def self.able_to_parse?(xml)
|
18
|
-
|
17
|
+
def self.able_to_parse?(xml) # :nodoc:
|
18
|
+
xml.include?("xmlns:yt=\"http://www.youtube.com/xml/schemas/2015\"")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -13,7 +13,7 @@ module Feedjira
|
|
13
13
|
class: ITunesRSSCategory
|
14
14
|
|
15
15
|
def each_subcategory(&block)
|
16
|
-
return to_enum(__method__) unless
|
16
|
+
return to_enum(__method__) unless block
|
17
17
|
|
18
18
|
yield text
|
19
19
|
|
@@ -23,7 +23,7 @@ module Feedjira
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def each_path(ancestors = [], &block)
|
26
|
-
return to_enum(__method__, ancestors) unless
|
26
|
+
return to_enum(__method__, ancestors) unless block
|
27
27
|
|
28
28
|
category_hierarchy = ancestors + [text]
|
29
29
|
|
@@ -14,9 +14,9 @@ module Feedjira
|
|
14
14
|
return unless start_ntp
|
15
15
|
|
16
16
|
parts = start_ntp.split(":")
|
17
|
-
parts.reverse.to_enum.with_index.
|
17
|
+
parts.reverse.to_enum.with_index.sum do |part, index|
|
18
18
|
part.to_f * (60**index)
|
19
|
-
end
|
19
|
+
end
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/lib/feedjira/parser/rss.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
module Feedjira
|
4
4
|
module RSSEntryUtilities
|
5
|
-
|
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
|
data/lib/feedjira/version.rb
CHANGED
data/lib/feedjira.rb
CHANGED
@@ -65,7 +65,7 @@ module Feedjira
|
|
65
65
|
|
66
66
|
parser.parse(xml, &block)
|
67
67
|
end
|
68
|
-
module_function :parse
|
68
|
+
module_function :parse
|
69
69
|
|
70
70
|
# Find compatible parser for given XML
|
71
71
|
#
|
@@ -77,5 +77,5 @@ module Feedjira
|
|
77
77
|
start_of_doc = xml.slice(0, 2000)
|
78
78
|
Feedjira.parsers.detect { |klass| klass.able_to_parse?(start_of_doc) }
|
79
79
|
end
|
80
|
-
module_function :parser_for_xml
|
80
|
+
module_function :parser_for_xml
|
81
81
|
end
|
data/spec/feedjira/feed_spec.rb
CHANGED
@@ -5,26 +5,27 @@ require "spec_helper"
|
|
5
5
|
class Hell < StandardError; end
|
6
6
|
|
7
7
|
class FailParser
|
8
|
-
def self.parse(_xml
|
9
|
-
|
8
|
+
def self.parse(_xml)
|
9
|
+
yield "this parser always fails."
|
10
|
+
# on_failure.call
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
14
|
describe Feedjira::Feed do
|
14
15
|
describe "#add_common_feed_element" do
|
15
16
|
before(:all) do
|
16
|
-
|
17
|
+
described_class.add_common_feed_element("generator")
|
17
18
|
end
|
18
19
|
|
19
|
-
it "
|
20
|
+
it "parses the added element out of Atom feeds" do
|
20
21
|
expect(Feedjira.parse(sample_wfw_feed).generator).to eq "TypePad"
|
21
22
|
end
|
22
23
|
|
23
|
-
it "
|
24
|
+
it "parses the added element out of Atom Feedburner feeds" do
|
24
25
|
expect(Feedjira::Parser::Atom.new).to respond_to(:generator)
|
25
26
|
end
|
26
27
|
|
27
|
-
it "
|
28
|
+
it "parses the added element out of RSS feeds" do
|
28
29
|
expect(Feedjira::Parser::RSS.new).to respond_to(:generator)
|
29
30
|
end
|
30
31
|
end
|
@@ -32,19 +33,19 @@ describe Feedjira::Feed do
|
|
32
33
|
describe "#add_common_feed_entry_element" do
|
33
34
|
before(:all) do
|
34
35
|
tag = "wfw:commentRss"
|
35
|
-
|
36
|
+
described_class.add_common_feed_entry_element tag, as: :comment_rss
|
36
37
|
end
|
37
38
|
|
38
|
-
it "
|
39
|
+
it "parses the added element out of Atom feeds entries" do
|
39
40
|
entry = Feedjira.parse(sample_wfw_feed).entries.first
|
40
41
|
expect(entry.comment_rss).to eq "this is the new val"
|
41
42
|
end
|
42
43
|
|
43
|
-
it "
|
44
|
+
it "parses the added element out of Atom Feedburner feeds entries" do
|
44
45
|
expect(Feedjira::Parser::AtomEntry.new).to respond_to(:comment_rss)
|
45
46
|
end
|
46
47
|
|
47
|
-
it "
|
48
|
+
it "parses the added element out of RSS feeds entries" do
|
48
49
|
expect(Feedjira::Parser::RSSEntry.new).to respond_to(:comment_rss)
|
49
50
|
end
|
50
51
|
end
|
@@ -3,44 +3,44 @@
|
|
3
3
|
require "spec_helper"
|
4
4
|
|
5
5
|
describe Feedjira::FeedUtilities do
|
6
|
-
before
|
6
|
+
before do
|
7
7
|
@klass = Class.new do
|
8
8
|
include Feedjira::DateTimeUtilities
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "handling dates" do
|
13
|
-
it "
|
13
|
+
it "parses an ISO 8601 formatted datetime into Time" do
|
14
14
|
time = @klass.new.parse_datetime("2008-02-20T8:05:00-010:00")
|
15
15
|
expect(time.class).to eq Time
|
16
16
|
expect(time).to eq Time.parse_safely("Wed Feb 20 18:05:00 UTC 2008")
|
17
17
|
end
|
18
18
|
|
19
|
-
it "
|
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.
|
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
|
|
25
|
-
it "
|
25
|
+
it "parses a US Format into Time" do
|
26
26
|
time = @klass.new.parse_datetime("8/23/2016 12:29:58 PM")
|
27
27
|
expect(time.class).to eq Time
|
28
28
|
expect(time).to eq Time.parse_safely("Wed Aug 23 12:29:58 UTC 2016")
|
29
29
|
end
|
30
30
|
|
31
|
-
it "
|
31
|
+
it "parses a Spanish Format into Time" do
|
32
32
|
time = @klass.new.parse_datetime("Wed, 31 Ago 2016 11:08:22 GMT")
|
33
33
|
expect(time.class).to eq Time
|
34
34
|
expect(time).to eq Time.parse_safely("Wed Aug 31 11:08:22 UTC 2016")
|
35
35
|
end
|
36
36
|
|
37
|
-
it "
|
37
|
+
it "parses Format with japanese symbols into Time" do
|
38
38
|
time = @klass.new.parse_datetime("水, 31 8 2016 07:37:00 PDT")
|
39
39
|
expect(time.class).to eq Time
|
40
40
|
expect(time).to eq Time.parse_safely("Wed Aug 31 14:37:00 UTC 2016")
|
41
41
|
end
|
42
42
|
|
43
|
-
it "
|
43
|
+
it "parses epoch into Time" do
|
44
44
|
time = @klass.new.parse_datetime("1472654220")
|
45
45
|
expect(time.class).to eq Time
|
46
46
|
expect(time).to eq Time.parse_safely("Wed Aug 31 14:37:00 UTC 2016")
|
@@ -3,44 +3,44 @@
|
|
3
3
|
require "spec_helper"
|
4
4
|
|
5
5
|
describe Feedjira::FeedUtilities do
|
6
|
-
before
|
6
|
+
before do
|
7
7
|
@klass = Class.new do
|
8
8
|
include Feedjira::FeedEntryUtilities
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
describe "handling dates" do
|
13
|
-
it "
|
13
|
+
it "parses an ISO 8601 formatted datetime into Time" do
|
14
14
|
time = @klass.new.parse_datetime("2008-02-20T8:05:00-010:00")
|
15
15
|
expect(time.class).to eq Time
|
16
16
|
expect(time).to eq Time.parse_safely("Wed Feb 20 18:05:00 UTC 2008")
|
17
17
|
end
|
18
18
|
|
19
|
-
it "
|
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.
|
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
|
|
26
26
|
describe "sanitizing" do
|
27
|
-
before
|
27
|
+
before do
|
28
28
|
@feed = Feedjira.parse(sample_atom_feed)
|
29
29
|
@entry = @feed.entries.first
|
30
30
|
end
|
31
31
|
|
32
32
|
it "doesn't fail when no elements are defined on includer" do
|
33
|
-
expect { @klass.new.sanitize! }.
|
33
|
+
expect { @klass.new.sanitize! }.not_to raise_error
|
34
34
|
end
|
35
35
|
|
36
|
-
it "
|
36
|
+
it "provides a sanitized title" do
|
37
37
|
new_title = "<script>this is not safe</script>#{@entry.title}"
|
38
38
|
@entry.title = new_title
|
39
39
|
scrubbed_title = Loofah.scrub_fragment(new_title, :prune).to_s
|
40
40
|
expect(@entry.title.sanitize).to eq scrubbed_title
|
41
41
|
end
|
42
42
|
|
43
|
-
it "
|
43
|
+
it "sanitizes content in place" do
|
44
44
|
new_content = "<script>#{@entry.content}"
|
45
45
|
@entry.content = new_content.dup
|
46
46
|
|
@@ -50,7 +50,7 @@ describe Feedjira::FeedUtilities do
|
|
50
50
|
expect(@entry.content).to eq scrubbed_content
|
51
51
|
end
|
52
52
|
|
53
|
-
it "
|
53
|
+
it "sanitizes things in place" do
|
54
54
|
@entry.title += "<script>"
|
55
55
|
@entry.author += "<script>"
|
56
56
|
@entry.content += "<script>"
|