feedjira 3.1.0 → 3.2.1
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/feed-parsing.md +15 -0
- data/.github/ISSUE_TEMPLATE/general-issue.md +8 -0
- data/.github/workflows/ruby.yml +39 -0
- data/.rubocop.yml +34 -615
- data/.rubocop_todo.yml +4 -29
- data/CHANGELOG.md +60 -13
- data/Gemfile +3 -4
- data/Rakefile +3 -1
- data/feedjira.gemspec +12 -12
- data/lib/feedjira/configuration.rb +5 -3
- data/lib/feedjira/core_ext/date.rb +3 -1
- data/lib/feedjira/core_ext/string.rb +2 -0
- data/lib/feedjira/core_ext/time.rb +3 -1
- data/lib/feedjira/core_ext.rb +2 -0
- data/lib/feedjira/date_time_utilities/date_time_epoch_parser.rb +3 -0
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +5 -3
- data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +9 -9
- data/lib/feedjira/date_time_utilities.rb +8 -8
- data/lib/feedjira/feed.rb +3 -1
- data/lib/feedjira/feed_entry_utilities.rb +5 -3
- data/lib/feedjira/feed_utilities.rb +8 -5
- data/lib/feedjira/parser/atom.rb +5 -6
- data/lib/feedjira/parser/atom_entry.rb +2 -0
- data/lib/feedjira/parser/atom_feed_burner.rb +4 -2
- data/lib/feedjira/parser/atom_feed_burner_entry.rb +2 -2
- data/lib/feedjira/parser/atom_google_alerts.rb +3 -1
- data/lib/feedjira/parser/atom_google_alerts_entry.rb +8 -5
- data/lib/feedjira/parser/atom_youtube.rb +4 -2
- data/lib/feedjira/parser/atom_youtube_entry.rb +2 -0
- data/lib/feedjira/parser/globally_unique_identifier.rb +2 -0
- data/lib/feedjira/parser/google_docs_atom.rb +5 -3
- data/lib/feedjira/parser/google_docs_atom_entry.rb +2 -0
- data/lib/feedjira/parser/itunes_rss.rb +4 -2
- data/lib/feedjira/parser/itunes_rss_category.rb +8 -6
- data/lib/feedjira/parser/itunes_rss_item.rb +3 -1
- data/lib/feedjira/parser/itunes_rss_owner.rb +2 -0
- data/lib/feedjira/parser/json_feed.rb +4 -2
- data/lib/feedjira/parser/json_feed_item.rb +7 -1
- data/lib/feedjira/parser/podlove_chapter.rb +5 -2
- data/lib/feedjira/parser/rss.rb +4 -1
- data/lib/feedjira/parser/rss_entry.rb +2 -0
- data/lib/feedjira/parser/rss_feed_burner.rb +4 -2
- data/lib/feedjira/parser/rss_feed_burner_entry.rb +2 -2
- data/lib/feedjira/parser/rss_image.rb +2 -0
- data/lib/feedjira/parser.rb +2 -0
- data/lib/feedjira/preprocessor.rb +3 -1
- data/lib/feedjira/rss_entry_utilities.rb +6 -2
- data/lib/feedjira/version.rb +3 -1
- data/lib/feedjira.rb +2 -1
- data/spec/feedjira/configuration_spec.rb +5 -3
- data/spec/feedjira/feed_spec.rb +13 -10
- data/spec/feedjira/{date_time_utilities_spec.rb → feed_utilities_date_time_spec.rb} +9 -7
- data/spec/feedjira/{feed_entry_utilities_spec.rb → feed_utilities_entry_spec.rb} +12 -10
- data/spec/feedjira/feed_utilities_spec.rb +37 -40
- data/spec/feedjira/parser/atom_entry_spec.rb +22 -20
- data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +16 -14
- data/spec/feedjira/parser/atom_feed_burner_spec.rb +30 -28
- data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +12 -10
- data/spec/feedjira/parser/atom_google_alerts_spec.rb +15 -13
- data/spec/feedjira/parser/atom_spec.rb +44 -25
- data/spec/feedjira/parser/atom_youtube_entry_spec.rb +25 -23
- data/spec/feedjira/parser/atom_youtube_spec.rb +16 -14
- data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +5 -3
- data/spec/feedjira/parser/google_docs_atom_spec.rb +10 -8
- data/spec/feedjira/parser/{itunes_rss_item_spec.rb → i_tunes_rss_item_spec.rb} +21 -19
- data/spec/feedjira/parser/{itunes_rss_owner_spec.rb → i_tunes_rss_owner_spec.rb} +5 -3
- data/spec/feedjira/parser/itunes_rss_spec.rb +35 -33
- data/spec/feedjira/parser/json_feed_item_spec.rb +16 -14
- data/spec/feedjira/parser/json_feed_spec.rb +15 -13
- data/spec/feedjira/parser/podlove_chapter_spec.rb +9 -7
- data/spec/feedjira/parser/rss_entry_spec.rb +25 -23
- data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +24 -22
- data/spec/feedjira/parser/rss_feed_burner_spec.rb +20 -18
- data/spec/feedjira/parser/rss_spec.rb +26 -24
- data/spec/feedjira/preprocessor_spec.rb +6 -4
- data/spec/feedjira_spec.rb +50 -39
- data/spec/sample_feeds/a10.xml +72 -0
- data/spec/sample_feeds/atom_simple_single_entry.xml +17 -0
- data/spec/sample_feeds/atom_simple_single_entry_link_self.xml +17 -0
- data/spec/sample_feeds.rb +6 -1
- data/spec/spec_helper.rb +3 -7
- metadata +60 -24
- data/.travis.yml +0 -34
- data/Dangerfile +0 -1
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# iTunes is RSS 2.0 + some apple extensions
|
@@ -18,7 +20,7 @@ module Feedjira
|
|
18
20
|
element :language
|
19
21
|
element :lastBuildDate, as: :last_built
|
20
22
|
element :link, as: :url
|
21
|
-
element :managingEditor
|
23
|
+
element :managingEditor, as: :managing_editor
|
22
24
|
element :rss, as: :version, value: :version
|
23
25
|
element :title
|
24
26
|
element :ttl
|
@@ -61,7 +63,7 @@ module Feedjira
|
|
61
63
|
elements :item, as: :entries, class: ITunesRSSItem
|
62
64
|
|
63
65
|
def self.able_to_parse?(xml)
|
64
|
-
%r{xmlns:itunes\s?=\s?[
|
66
|
+
%r{xmlns:itunes\s?=\s?["']http://www\.itunes\.com/dtds/podcast-1\.0\.dtd["']}i =~ xml
|
65
67
|
end
|
66
68
|
end
|
67
69
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# iTunes extensions to the standard RSS2.0 item
|
@@ -10,18 +12,18 @@ module Feedjira
|
|
10
12
|
elements :"itunes:category", as: :itunes_categories,
|
11
13
|
class: ITunesRSSCategory
|
12
14
|
|
13
|
-
def each_subcategory
|
14
|
-
return to_enum(__method__) unless
|
15
|
+
def each_subcategory(&block)
|
16
|
+
return to_enum(__method__) unless block
|
15
17
|
|
16
18
|
yield text
|
17
19
|
|
18
20
|
itunes_categories.each do |itunes_category|
|
19
|
-
itunes_category.each_subcategory(&
|
21
|
+
itunes_category.each_subcategory(&block)
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
def each_path(ancestors = [])
|
24
|
-
return to_enum(__method__, ancestors) unless
|
25
|
+
def each_path(ancestors = [], &block)
|
26
|
+
return to_enum(__method__, ancestors) unless block
|
25
27
|
|
26
28
|
category_hierarchy = ancestors + [text]
|
27
29
|
|
@@ -29,7 +31,7 @@ module Feedjira
|
|
29
31
|
yield category_hierarchy
|
30
32
|
else
|
31
33
|
itunes_categories.each do |itunes_category|
|
32
|
-
itunes_category.each_path(category_hierarchy, &
|
34
|
+
itunes_category.each_path(category_hierarchy, &block)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# iTunes extensions to the standard RSS2.0 item
|
@@ -29,7 +31,7 @@ module Feedjira
|
|
29
31
|
element :enclosure, value: :length, as: :enclosure_length
|
30
32
|
element :enclosure, value: :type, as: :enclosure_type
|
31
33
|
element :enclosure, value: :url, as: :enclosure_url
|
32
|
-
elements "psc:chapter", as: :raw_chapters, class: Feedjira::Parser::PodloveChapter
|
34
|
+
elements "psc:chapter", as: :raw_chapters, class: Feedjira::Parser::PodloveChapter
|
33
35
|
|
34
36
|
# Podlove requires clients to re-order by start time in the
|
35
37
|
# event the publisher doesn't provide them in that
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with JSON Feeds.
|
@@ -6,7 +8,7 @@ module Feedjira
|
|
6
8
|
include FeedUtilities
|
7
9
|
|
8
10
|
def self.able_to_parse?(json)
|
9
|
-
%r{https
|
11
|
+
%r{https://jsonfeed.org/version/} =~ json
|
10
12
|
end
|
11
13
|
|
12
14
|
def self.parse(json)
|
@@ -14,7 +16,7 @@ module Feedjira
|
|
14
16
|
end
|
15
17
|
|
16
18
|
attr_reader :json, :version, :title, :url, :feed_url, :description,
|
17
|
-
|
19
|
+
:expired, :entries
|
18
20
|
|
19
21
|
def initialize(json)
|
20
22
|
@json = json
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
# Parser for dealing with JSON Feed items.
|
@@ -5,7 +7,7 @@ module Feedjira
|
|
5
7
|
include FeedEntryUtilities
|
6
8
|
|
7
9
|
attr_reader :json, :entry_id, :url, :external_url, :title, :content, :summary,
|
8
|
-
|
10
|
+
:published, :updated, :image, :banner_image, :author, :categories
|
9
11
|
|
10
12
|
def initialize(json)
|
11
13
|
@json = json
|
@@ -27,11 +29,13 @@ module Feedjira
|
|
27
29
|
|
28
30
|
def parse_published(date_published)
|
29
31
|
return nil unless date_published
|
32
|
+
|
30
33
|
Time.parse_safely(date_published)
|
31
34
|
end
|
32
35
|
|
33
36
|
def parse_updated(date_modified)
|
34
37
|
return nil unless date_modified
|
38
|
+
|
35
39
|
Time.parse_safely(date_modified)
|
36
40
|
end
|
37
41
|
|
@@ -39,11 +43,13 @@ module Feedjira
|
|
39
43
|
# Prefer content_html unless it isn't included.
|
40
44
|
def parse_content(content_html, content_text)
|
41
45
|
return content_html unless content_html.nil?
|
46
|
+
|
42
47
|
content_text
|
43
48
|
end
|
44
49
|
|
45
50
|
def author_name(author_obj)
|
46
51
|
return nil if author_obj.nil?
|
52
|
+
|
47
53
|
author_obj["name"]
|
48
54
|
end
|
49
55
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
module Parser
|
3
5
|
class PodloveChapter
|
@@ -10,10 +12,11 @@ module Feedjira
|
|
10
12
|
|
11
13
|
def start
|
12
14
|
return unless start_ntp
|
15
|
+
|
13
16
|
parts = start_ntp.split(":")
|
14
|
-
parts.reverse.to_enum.with_index.
|
17
|
+
parts.reverse.to_enum.with_index.sum do |part, index|
|
15
18
|
part.to_f * (60**index)
|
16
|
-
end
|
19
|
+
end
|
17
20
|
end
|
18
21
|
end
|
19
22
|
end
|
data/lib/feedjira/parser/rss.rb
CHANGED
@@ -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.
|
@@ -10,6 +12,7 @@ module Feedjira
|
|
10
12
|
element :language
|
11
13
|
element :lastBuildDate, as: :last_built
|
12
14
|
element :link, as: :url
|
15
|
+
element :"a10:link", as: :url, value: :href
|
13
16
|
element :rss, as: :version, value: :version
|
14
17
|
element :title
|
15
18
|
element :ttl
|
@@ -19,7 +22,7 @@ module Feedjira
|
|
19
22
|
attr_accessor :feed_url
|
20
23
|
|
21
24
|
def self.able_to_parse?(xml)
|
22
|
-
(
|
25
|
+
(/<rss|<rdf/ =~ xml) && !xml.include?("feedburner")
|
23
26
|
end
|
24
27
|
end
|
25
28
|
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.
|
@@ -13,8 +15,8 @@ module Feedjira
|
|
13
15
|
|
14
16
|
attr_accessor :feed_url
|
15
17
|
|
16
|
-
def self.able_to_parse?(xml)
|
17
|
-
(
|
18
|
+
def self.able_to_parse?(xml) # :nodoc:
|
19
|
+
(/<rss|<rdf/ =~ xml) && xml.include?("feedburner")
|
18
20
|
end
|
19
21
|
end
|
20
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 RDF feed entries.
|
@@ -7,9 +9,7 @@ module Feedjira
|
|
7
9
|
include RSSEntryUtilities
|
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
|
def url
|
15
15
|
orig_link || super
|
data/lib/feedjira/parser.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Feedjira
|
2
4
|
class Preprocessor
|
3
5
|
def initialize(xml)
|
@@ -18,7 +20,7 @@ module Feedjira
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def content_nodes
|
21
|
-
doc.search 'entry > content[type="xhtml"], entry > summary[type="xhtml"], entry > title[type="xhtml"]'
|
23
|
+
doc.search 'entry > content[type="xhtml"], entry > summary[type="xhtml"], entry > title[type="xhtml"]'
|
22
24
|
end
|
23
25
|
|
24
26
|
def raw_html(node)
|
@@ -7,12 +7,15 @@ module Feedjira
|
|
7
7
|
element :title
|
8
8
|
|
9
9
|
element :"content:encoded", as: :content
|
10
|
+
element :"a10:content", as: :content
|
10
11
|
element :description, as: :summary
|
11
12
|
|
12
13
|
element :link, as: :url
|
14
|
+
element :"a10:link", as: :url, value: :href
|
13
15
|
|
14
16
|
element :author
|
15
17
|
element :"dc:creator", as: :author
|
18
|
+
element :"a10:name", as: :author
|
16
19
|
|
17
20
|
element :pubDate, as: :published
|
18
21
|
element :pubdate, as: :published
|
@@ -22,6 +25,7 @@ module Feedjira
|
|
22
25
|
element :"dcterms:created", as: :published
|
23
26
|
|
24
27
|
element :"dcterms:modified", as: :updated
|
28
|
+
element :"a10:updated", as: :updated
|
25
29
|
|
26
30
|
element :guid, as: :entry_id, class: Feedjira::Parser::GloballyUniqueIdentifier
|
27
31
|
element :"dc:identifier", as: :dc_identifier
|
@@ -35,11 +39,11 @@ module Feedjira
|
|
35
39
|
end
|
36
40
|
|
37
41
|
def entry_id
|
38
|
-
@entry_id
|
42
|
+
@entry_id&.guid
|
39
43
|
end
|
40
44
|
|
41
45
|
def url
|
42
|
-
@url ||
|
46
|
+
@url || @entry_id&.url
|
43
47
|
end
|
44
48
|
|
45
49
|
def id
|
data/lib/feedjira/version.rb
CHANGED
data/lib/feedjira.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "zlib"
|
2
4
|
require "sax-machine"
|
3
5
|
require "loofah"
|
@@ -10,7 +12,6 @@ require "feedjira/date_time_utilities/date_time_epoch_parser"
|
|
10
12
|
require "feedjira/date_time_utilities/date_time_language_parser"
|
11
13
|
require "feedjira/date_time_utilities/date_time_pattern_parser"
|
12
14
|
require "feedjira/date_time_utilities"
|
13
|
-
require "feedjira/date_time_utilities"
|
14
15
|
require "feedjira/feed_entry_utilities"
|
15
16
|
require "feedjira/feed_utilities"
|
16
17
|
require "feedjira/feed"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
describe Feedjira::Configuration do
|
@@ -8,10 +10,10 @@ describe Feedjira::Configuration do
|
|
8
10
|
end
|
9
11
|
|
10
12
|
it "allows parsers to be modified" do
|
11
|
-
|
13
|
+
custom_parser = Class.new
|
12
14
|
|
13
|
-
Feedjira.configure { |config| config.parsers.unshift(
|
14
|
-
expect(Feedjira.parsers.first).to eq(
|
15
|
+
Feedjira.configure { |config| config.parsers.unshift(custom_parser) }
|
16
|
+
expect(Feedjira.parsers.first).to eq(custom_parser)
|
15
17
|
Feedjira.reset_configuration!
|
16
18
|
end
|
17
19
|
end
|
data/spec/feedjira/feed_spec.rb
CHANGED
@@ -1,28 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
class Hell < StandardError; end
|
4
6
|
|
5
7
|
class FailParser
|
6
|
-
def self.parse(_xml
|
7
|
-
|
8
|
+
def self.parse(_xml)
|
9
|
+
yield "this parser always fails."
|
10
|
+
# on_failure.call
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
11
14
|
describe Feedjira::Feed do
|
12
15
|
describe "#add_common_feed_element" do
|
13
16
|
before(:all) do
|
14
|
-
|
17
|
+
described_class.add_common_feed_element("generator")
|
15
18
|
end
|
16
19
|
|
17
|
-
it "
|
20
|
+
it "parses the added element out of Atom feeds" do
|
18
21
|
expect(Feedjira.parse(sample_wfw_feed).generator).to eq "TypePad"
|
19
22
|
end
|
20
23
|
|
21
|
-
it "
|
24
|
+
it "parses the added element out of Atom Feedburner feeds" do
|
22
25
|
expect(Feedjira::Parser::Atom.new).to respond_to(:generator)
|
23
26
|
end
|
24
27
|
|
25
|
-
it "
|
28
|
+
it "parses the added element out of RSS feeds" do
|
26
29
|
expect(Feedjira::Parser::RSS.new).to respond_to(:generator)
|
27
30
|
end
|
28
31
|
end
|
@@ -30,19 +33,19 @@ describe Feedjira::Feed do
|
|
30
33
|
describe "#add_common_feed_entry_element" do
|
31
34
|
before(:all) do
|
32
35
|
tag = "wfw:commentRss"
|
33
|
-
|
36
|
+
described_class.add_common_feed_entry_element tag, as: :comment_rss
|
34
37
|
end
|
35
38
|
|
36
|
-
it "
|
39
|
+
it "parses the added element out of Atom feeds entries" do
|
37
40
|
entry = Feedjira.parse(sample_wfw_feed).entries.first
|
38
41
|
expect(entry.comment_rss).to eq "this is the new val"
|
39
42
|
end
|
40
43
|
|
41
|
-
it "
|
44
|
+
it "parses the added element out of Atom Feedburner feeds entries" do
|
42
45
|
expect(Feedjira::Parser::AtomEntry.new).to respond_to(:comment_rss)
|
43
46
|
end
|
44
47
|
|
45
|
-
it "
|
48
|
+
it "parses the added element out of RSS feeds entries" do
|
46
49
|
expect(Feedjira::Parser::RSSEntry.new).to respond_to(:comment_rss)
|
47
50
|
end
|
48
51
|
end
|
@@ -1,44 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
describe Feedjira::FeedUtilities do
|
4
|
-
before
|
6
|
+
before do
|
5
7
|
@klass = Class.new do
|
6
8
|
include Feedjira::DateTimeUtilities
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
10
12
|
describe "handling dates" do
|
11
|
-
it "
|
13
|
+
it "parses an ISO 8601 formatted datetime into Time" do
|
12
14
|
time = @klass.new.parse_datetime("2008-02-20T8:05:00-010:00")
|
13
15
|
expect(time.class).to eq Time
|
14
16
|
expect(time).to eq Time.parse_safely("Wed Feb 20 18:05:00 UTC 2008")
|
15
17
|
end
|
16
18
|
|
17
|
-
it "
|
19
|
+
it "parses a ISO 8601 with milliseconds into Time" do
|
18
20
|
time = @klass.new.parse_datetime("2013-09-17T08:20:13.931-04:00")
|
19
21
|
expect(time.class).to eq Time
|
20
22
|
expect(time).to eq Time.parse_safely("Tue Sep 17 12:20:13 UTC 2013")
|
21
23
|
end
|
22
24
|
|
23
|
-
it "
|
25
|
+
it "parses a US Format into Time" do
|
24
26
|
time = @klass.new.parse_datetime("8/23/2016 12:29:58 PM")
|
25
27
|
expect(time.class).to eq Time
|
26
28
|
expect(time).to eq Time.parse_safely("Wed Aug 23 12:29:58 UTC 2016")
|
27
29
|
end
|
28
30
|
|
29
|
-
it "
|
31
|
+
it "parses a Spanish Format into Time" do
|
30
32
|
time = @klass.new.parse_datetime("Wed, 31 Ago 2016 11:08:22 GMT")
|
31
33
|
expect(time.class).to eq Time
|
32
34
|
expect(time).to eq Time.parse_safely("Wed Aug 31 11:08:22 UTC 2016")
|
33
35
|
end
|
34
36
|
|
35
|
-
it "
|
37
|
+
it "parses Format with japanese symbols into Time" do
|
36
38
|
time = @klass.new.parse_datetime("水, 31 8 2016 07:37:00 PDT")
|
37
39
|
expect(time.class).to eq Time
|
38
40
|
expect(time).to eq Time.parse_safely("Wed Aug 31 14:37:00 UTC 2016")
|
39
41
|
end
|
40
42
|
|
41
|
-
it "
|
43
|
+
it "parses epoch into Time" do
|
42
44
|
time = @klass.new.parse_datetime("1472654220")
|
43
45
|
expect(time.class).to eq Time
|
44
46
|
expect(time).to eq Time.parse_safely("Wed Aug 31 14:37:00 UTC 2016")
|
@@ -1,20 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
describe Feedjira::FeedUtilities do
|
4
|
-
before
|
6
|
+
before do
|
5
7
|
@klass = Class.new do
|
6
8
|
include Feedjira::FeedEntryUtilities
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
10
12
|
describe "handling dates" do
|
11
|
-
it "
|
13
|
+
it "parses an ISO 8601 formatted datetime into Time" do
|
12
14
|
time = @klass.new.parse_datetime("2008-02-20T8:05:00-010:00")
|
13
15
|
expect(time.class).to eq Time
|
14
16
|
expect(time).to eq Time.parse_safely("Wed Feb 20 18:05:00 UTC 2008")
|
15
17
|
end
|
16
18
|
|
17
|
-
it "
|
19
|
+
it "parses a ISO 8601 with milliseconds into Time" do
|
18
20
|
time = @klass.new.parse_datetime("2013-09-17T08:20:13.931-04:00")
|
19
21
|
expect(time.class).to eq Time
|
20
22
|
expect(time).to eq Time.parse_safely("Tue Sep 17 12:20:13 UTC 2013")
|
@@ -22,24 +24,24 @@ describe Feedjira::FeedUtilities do
|
|
22
24
|
end
|
23
25
|
|
24
26
|
describe "sanitizing" do
|
25
|
-
before
|
27
|
+
before do
|
26
28
|
@feed = Feedjira.parse(sample_atom_feed)
|
27
29
|
@entry = @feed.entries.first
|
28
30
|
end
|
29
31
|
|
30
32
|
it "doesn't fail when no elements are defined on includer" do
|
31
|
-
expect { @klass.new.sanitize! }.
|
33
|
+
expect { @klass.new.sanitize! }.not_to raise_error
|
32
34
|
end
|
33
35
|
|
34
|
-
it "
|
35
|
-
new_title = "<script>this is not safe</script
|
36
|
+
it "provides a sanitized title" do
|
37
|
+
new_title = "<script>this is not safe</script>#{@entry.title}"
|
36
38
|
@entry.title = new_title
|
37
39
|
scrubbed_title = Loofah.scrub_fragment(new_title, :prune).to_s
|
38
40
|
expect(@entry.title.sanitize).to eq scrubbed_title
|
39
41
|
end
|
40
42
|
|
41
|
-
it "
|
42
|
-
new_content = "<script
|
43
|
+
it "sanitizes content in place" do
|
44
|
+
new_content = "<script>#{@entry.content}"
|
43
45
|
@entry.content = new_content.dup
|
44
46
|
|
45
47
|
scrubbed_content = Loofah.scrub_fragment(new_content, :prune).to_s
|
@@ -48,7 +50,7 @@ describe Feedjira::FeedUtilities do
|
|
48
50
|
expect(@entry.content).to eq scrubbed_content
|
49
51
|
end
|
50
52
|
|
51
|
-
it "
|
53
|
+
it "sanitizes things in place" do
|
52
54
|
@entry.title += "<script>"
|
53
55
|
@entry.author += "<script>"
|
54
56
|
@entry.content += "<script>"
|