feedjira 3.2.0 → 3.2.2
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/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>"
|