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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/general-issue.md +8 -0
  3. data/.github/workflows/ruby.yml +1 -1
  4. data/.rubocop.yml +33 -1
  5. data/CHANGELOG.md +13 -0
  6. data/Gemfile +0 -3
  7. data/README.md +1 -2
  8. data/feedjira.gemspec +7 -3
  9. data/lib/feedjira/core_ext/date.rb +3 -2
  10. data/lib/feedjira/core_ext/time.rb +1 -1
  11. data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +1 -1
  12. data/lib/feedjira/feed_utilities.rb +3 -3
  13. data/lib/feedjira/parser/atom_feed_burner.rb +1 -1
  14. data/lib/feedjira/parser/atom_google_alerts_entry.rb +2 -0
  15. data/lib/feedjira/parser/atom_youtube.rb +2 -2
  16. data/lib/feedjira/parser/google_docs_atom.rb +1 -1
  17. data/lib/feedjira/parser/itunes_rss_category.rb +2 -2
  18. data/lib/feedjira/parser/podlove_chapter.rb +2 -2
  19. data/lib/feedjira/parser/rss.rb +1 -1
  20. data/lib/feedjira/parser/rss_feed_burner.rb +2 -2
  21. data/lib/feedjira/rss_entry_utilities.rb +5 -1
  22. data/lib/feedjira/version.rb +1 -1
  23. data/lib/feedjira.rb +2 -2
  24. data/spec/feedjira/feed_spec.rb +11 -10
  25. data/spec/feedjira/{date_time_utilities_spec.rb → feed_utilities_date_time_spec.rb} +8 -8
  26. data/spec/feedjira/{feed_entry_utilities_spec.rb → feed_utilities_entry_spec.rb} +9 -9
  27. data/spec/feedjira/feed_utilities_spec.rb +37 -42
  28. data/spec/feedjira/parser/atom_entry_spec.rb +16 -16
  29. data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +10 -10
  30. data/spec/feedjira/parser/atom_feed_burner_spec.rb +26 -26
  31. data/spec/feedjira/parser/atom_google_alerts_entry_spec.rb +6 -6
  32. data/spec/feedjira/parser/atom_google_alerts_spec.rb +13 -13
  33. data/spec/feedjira/parser/atom_spec.rb +23 -23
  34. data/spec/feedjira/parser/atom_youtube_entry_spec.rb +19 -19
  35. data/spec/feedjira/parser/atom_youtube_spec.rb +13 -13
  36. data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +3 -3
  37. data/spec/feedjira/parser/google_docs_atom_spec.rb +8 -8
  38. data/spec/feedjira/parser/{itunes_rss_item_spec.rb → i_tunes_rss_item_spec.rb} +18 -18
  39. data/spec/feedjira/parser/{itunes_rss_owner_spec.rb → i_tunes_rss_owner_spec.rb} +3 -3
  40. data/spec/feedjira/parser/itunes_rss_spec.rb +26 -26
  41. data/spec/feedjira/parser/json_feed_item_spec.rb +11 -11
  42. data/spec/feedjira/parser/json_feed_spec.rb +14 -14
  43. data/spec/feedjira/parser/podlove_chapter_spec.rb +7 -7
  44. data/spec/feedjira/parser/rss_entry_spec.rb +26 -20
  45. data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +16 -15
  46. data/spec/feedjira/parser/rss_feed_burner_spec.rb +17 -17
  47. data/spec/feedjira/parser/rss_spec.rb +25 -25
  48. data/spec/feedjira/preprocessor_spec.rb +3 -3
  49. data/spec/feedjira_spec.rb +41 -41
  50. data/spec/sample_feeds/RSSWithComments.xml +277 -0
  51. data/spec/sample_feeds.rb +2 -1
  52. metadata +68 -77
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db9d2eb01b3bf275ae7d0599df9bef74ea336ddfb9afdcc31998c4f79890cf51
4
- data.tar.gz: 30de1f11b4054c3860ca79a27f8fb54b2244e8140bd26340d3f64f84c2d29884
3
+ metadata.gz: 5169a51338551c1253b148e944e9b63cff818f85ba5eeafd2c3239ea007b5012
4
+ data.tar.gz: c9966b308d0f57873c56b474cdbdc7a1a96ee6dd64d5a0ca56f30c333ada9298
5
5
  SHA512:
6
- metadata.gz: a83a5507737ed80d62515733dad8005f0f3d0bce59558d6b6f252a94084d459b664b7a56c5355d853cb706b62c1a7c804e5bd68df74f4cb9091bc12ce475d075
7
- data.tar.gz: 8af825f5c5cde56ba80d69cbd7d55b1e36e4cb2c6c401f7092a9a8654757fcc133666dbd7ad38527b45f790523aa5449c29dd6886f43112dac49c328ccce816d
6
+ metadata.gz: ad3fc7290af22ec75dbba64b2397ad3e8e6f283f73c3c793eaf9b33d28410dcaa6439618c47d741858a732df7478cbcb21f987314880ef5acd108224cc6fa7a2
7
+ data.tar.gz: 20422cf9fdf53491356726c29b118ce6e1b3b37c0ef7294f1c01bcaf00df72097ae6afd1a88191ca765217fe7a159996247de4837a14a1716d33ad8024f7f784
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: Feed Parsing
3
+ about: Anything else
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
@@ -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]
16
16
  handler: [nokogiri, ox, oga]
17
17
  exclude:
18
18
  - { ruby: jruby, handler: ox }
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.5
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
@@ -4,9 +4,6 @@ source "https://rubygems.org/"
4
4
 
5
5
  gemspec
6
6
 
7
- gem "pry"
8
- gem "rubocop", "~> 0.90"
9
-
10
7
  group :test do
11
8
  gem "oga"
12
9
  gem "ox", platforms: %i[mri rbx]
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][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.5"
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
- Time.send(method, dest.year, dest.month, dest.day, dest.hour, dest.min,
20
- dest.sec, dest.zone)
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
@@ -29,7 +29,7 @@ class Time
29
29
  def self.parse_string_safely(string)
30
30
  return nil if string.empty?
31
31
 
32
- if string =~ /\A\d{14}\z/
32
+ if /\A\d{14}\z/.match?(string)
33
33
  parse("#{string}Z", true)
34
34
  else
35
35
  parse(string).utc
@@ -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 =~ rgx
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
@@ -75,11 +75,11 @@ module Feedjira
75
75
  old_value = send(name)
76
76
  new_value = feed.send(name)
77
77
 
78
- if old_value != new_value
78
+ if old_value == new_value
79
+ false
80
+ else
79
81
  send("#{name}=", new_value)
80
82
  true
81
- else
82
- false
83
83
  end
84
84
  end
85
85
 
@@ -21,7 +21,7 @@ module Feedjira
21
21
  attr_writer :url, :feed_url
22
22
 
23
23
  def self.able_to_parse?(xml)
24
- ((/<feed/ =~ xml) && (/Atom/ =~ xml) && (/feedburner/ =~ xml) && !(/<rss|<rdf/ =~ xml)) || false
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,
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "uri"
4
+
3
5
  module Feedjira
4
6
  module Parser
5
7
  # Parser for dealing with Feedburner Atom feed entries.
@@ -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) #:nodoc:
18
- %r{xmlns:yt="http://www.youtube.com/xml/schemas/2015"} =~ xml
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
@@ -17,7 +17,7 @@ module Feedjira
17
17
  @url ||= links.first
18
18
  end
19
19
 
20
- def self.able_to_parse?(xml) #:nodoc:
20
+ def self.able_to_parse?(xml) # :nodoc:
21
21
  %r{<id>https?://docs\.google\.com/.*</id>} =~ xml
22
22
  end
23
23
 
@@ -13,7 +13,7 @@ module Feedjira
13
13
  class: ITunesRSSCategory
14
14
 
15
15
  def each_subcategory(&block)
16
- return to_enum(__method__) unless block_given?
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 block_given?
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.map do |part, index|
17
+ parts.reverse.to_enum.with_index.sum do |part, index|
18
18
  part.to_f * (60**index)
19
- end.reduce(:+)
19
+ end
20
20
  end
21
21
  end
22
22
  end
@@ -22,7 +22,7 @@ module Feedjira
22
22
  attr_accessor :feed_url
23
23
 
24
24
  def self.able_to_parse?(xml)
25
- (/<rss|<rdf/ =~ xml) && !(/feedburner/ =~ xml)
25
+ (/<rss|<rdf/ =~ xml) && !xml.include?("feedburner")
26
26
  end
27
27
  end
28
28
  end
@@ -15,8 +15,8 @@ module Feedjira
15
15
 
16
16
  attr_accessor :feed_url
17
17
 
18
- def self.able_to_parse?(xml) #:nodoc:
19
- (/<rss|<rdf/ =~ xml) && (/feedburner/ =~ xml)
18
+ def self.able_to_parse?(xml) # :nodoc:
19
+ (/<rss|<rdf/ =~ xml) && xml.include?("feedburner")
20
20
  end
21
21
  end
22
22
  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.0"
4
+ VERSION = "3.2.2"
5
5
  end
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 # rubocop:disable Style/AccessModifierDeclarations
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 # rubocop:disable Style/AccessModifierDeclarations
80
+ module_function :parser_for_xml
81
81
  end
@@ -5,26 +5,27 @@ require "spec_helper"
5
5
  class Hell < StandardError; end
6
6
 
7
7
  class FailParser
8
- def self.parse(_xml, &on_failure)
9
- on_failure.call "this parser always fails."
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
- Feedjira::Feed.add_common_feed_element("generator")
17
+ described_class.add_common_feed_element("generator")
17
18
  end
18
19
 
19
- it "should parse the added element out of Atom feeds" do
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 "should parse the added element out of Atom Feedburner feeds" do
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 "should parse the added element out of RSS feeds" do
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
- Feedjira::Feed.add_common_feed_entry_element tag, as: :comment_rss
36
+ described_class.add_common_feed_entry_element tag, as: :comment_rss
36
37
  end
37
38
 
38
- it "should parse the added element out of Atom feeds entries" do
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 "should parse the added element out of Atom Feedburner feeds entries" do
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 "should parse the added element out of RSS feeds entries" do
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(:each) do
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 "should parse an ISO 8601 formatted datetime into Time" do
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 "should parse a ISO 8601 with milliseconds into Time" do
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
 
25
- it "should parse a US Format into Time" do
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 "should parse a Spanish Format into Time" do
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 "should parse Format with japanese symbols into Time" do
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 "should parse epoch into Time" do
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(:each) do
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 "should parse an ISO 8601 formatted datetime into Time" do
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 "should parse a ISO 8601 with milliseconds into Time" do
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
 
26
26
  describe "sanitizing" do
27
- before(:each) do
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! }.to_not raise_error
33
+ expect { @klass.new.sanitize! }.not_to raise_error
34
34
  end
35
35
 
36
- it "should provide a sanitized title" do
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 "should sanitize content in place" do
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 "should sanitize things in place" do
53
+ it "sanitizes things in place" do
54
54
  @entry.title += "<script>"
55
55
  @entry.author += "<script>"
56
56
  @entry.content += "<script>"