rrsimple-rss 1.3.5 → 1.3.6

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTg0ZWNjZGZjZWU5NmVkODVmOWU1ZGNkM2NlYWE4ZDZkODZlZjc2Mg==
5
+ data.tar.gz: !binary |-
6
+ Y2I4NWY4MjlhMDM3MTE1Y2FmNjBlZTEzNTM2YTFjZmI0ZjkwMjlkOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZjU0YTA3YWM1M2Y0ZjM4YWIwZmUyMTliNTUyYzg3YmI5YjRiMWY5MmQ0M2Q1
10
+ Mjc1NDkyZDQ0NmY4OTIwM2NjNTRhMzA4N2VlZjRiYTcwYzIxN2Y2YTQ3M2Q3
11
+ MTdkOWNlYmUyYmFjNjI0MDg3MjdhOGU4ZjM3MjhiMDY4MGFmMTg=
12
+ data.tar.gz: !binary |-
13
+ ZjRiMTA1YzhlZTg1NzczM2JlMjVkNjIwNjAwMmNmZTg0N2Y1MzY1MTJhODY2
14
+ NDE1MzIyODI2MGNjYWRjMzNjZDcxZjA1ZmEyOTEwODQwOTM0N2I4YzAyODhh
15
+ MTUyOGFjN2I5YTNlYWYyYjFkMDIxNzlhYWI4ODBkNTQ2ZDY3ZTY=
data/lib/rrsimple-rss.rb CHANGED
@@ -2,17 +2,17 @@ require 'cgi'
2
2
  require 'time'
3
3
 
4
4
  class RRSimpleRSS
5
- VERSION = "1.3.5"
6
-
5
+ VERSION = "1.3.6"
6
+
7
7
  attr_reader :items, :source
8
8
  alias :entries :items
9
9
 
10
10
  @@feed_tags = [
11
11
  :id,
12
12
  :title, :subtitle, :link,
13
- :description,
13
+ :description,
14
14
  :author, :webMaster, :managingEditor, :contributor,
15
- :pubDate, :lastBuildDate, :updated, :'dc:date',
15
+ :pubDate, :lastBuildDate, :updated, :'dc:date', :'dc:subject',
16
16
  :generator, :language, :docs, :cloud,
17
17
  :ttl, :skipHours, :skipDays,
18
18
  :image, :logo, :icon, :rating,
@@ -26,7 +26,7 @@ class RRSimpleRSS
26
26
  :title, :link, :'link+alternate', :'link+self', :'link+edit', :'link+replies',
27
27
  :author, :contributor,
28
28
  :description, :summary, :content, :'content:encoded', :comments,
29
- :pubDate, :published, :updated, :expirationDate, :modified, :'dc:date',
29
+ :pubDate, :published, :updated, :expirationDate, :modified, :'dc:date', :'dc:subject',
30
30
  :category, :categories, :guid,
31
31
  :'trackback:ping', :'trackback:about',
32
32
  :'dc:creator', :'dc:title', :'dc:subject', :'dc:rights', :'dc:publisher',
@@ -41,7 +41,7 @@ class RRSimpleRSS
41
41
  @source = source.respond_to?(:read) ? source.read : source.to_s
42
42
  @items = Array.new
43
43
  @options = Hash.new.update(options)
44
-
44
+
45
45
  parse
46
46
  end
47
47
 
@@ -73,10 +73,10 @@ class RRSimpleRSS
73
73
 
74
74
  def parse
75
75
  raise RRSimpleRSSError, "Poorly formatted feed" unless @source =~ %r{<(channel|feed).*?>.*?</(channel|feed)>}mi
76
-
76
+
77
77
  # Feed's title and link
78
78
  feed_content = $1 if @source =~ %r{(.*?)<(rss:|atom:)?(item|entry).*?>.*?</(rss:|atom:)?(item|entry)>}mi
79
-
79
+
80
80
  @@feed_tags.each do |tag|
81
81
  if feed_content && feed_content =~ %r{<(rss:|atom:)?#{tag}(.*?)>(.*?)</(rss:|atom:)?#{tag}>}mi
82
82
  nil
@@ -87,14 +87,14 @@ class RRSimpleRSS
87
87
  elsif @source =~ %r{<(rss:|atom:)?#{tag}(.*?)\/\s*>}mi
88
88
  nil
89
89
  end
90
-
90
+
91
91
  if $2 || $3
92
92
  tag_cleaned = clean_tag(tag)
93
93
  instance_variable_set("@#{ tag_cleaned }", clean_content(tag, $2, $3))
94
94
  self.class.class_eval("attr_reader :#{ tag_cleaned }")
95
95
  end
96
96
  end
97
-
97
+
98
98
  # RSS items' title, link, and description
99
99
  @source.scan( %r{<(rss:|atom:)?(item|entry)([\s][^>]*)?>(.*?)</(rss:|atom:)?(item|entry)>}mi ) do |match|
100
100
  item = Hash.new
@@ -103,13 +103,13 @@ class RRSimpleRSS
103
103
  tag_data = tag.to_s.split("+")
104
104
  tag = tag_data[0]
105
105
  rel = tag_data[1]
106
-
106
+
107
107
  if match[3] =~ %r{<(rss:|atom:)?#{tag}(.*?)rel=['"]#{rel}['"](.*?)>(.*?)</(rss:|atom:)?#{tag}>}mi
108
108
  nil
109
109
  elsif match[3] =~ %r{<(rss:|atom:)?#{tag}(.*?)rel=['"]#{rel}['"](.*?)/\s*>}mi
110
110
  nil
111
111
  end
112
-
112
+
113
113
  item[clean_tag("#{tag}+#{rel}")] = clean_content(tag, $3, $4) if $3 || $4
114
114
  elsif tag.to_s.include?("#")
115
115
  tag_data = tag.to_s.split("#")
@@ -120,7 +120,7 @@ class RRSimpleRSS
120
120
  elsif match[3] =~ %r{<(rss:|atom:)?#{tag}(.*?)#{attrib}=['"](.*?)['"](.*?)/\s*>}mi
121
121
  nil
122
122
  end
123
-
123
+
124
124
  item[clean_tag("#{tag}_#{attrib}")] = clean_content(tag, attrib, $3) if $3
125
125
  else
126
126
  if match[3] =~ %r{<(rss:|atom:)?#{tag}(.*?)>(.*?)</(rss:|atom:)?#{tag}>}mi
@@ -128,13 +128,15 @@ class RRSimpleRSS
128
128
  elsif match[3] =~ %r{<(rss:|atom:)?#{tag}(.*?)/\s*>}mi
129
129
  nil
130
130
  end
131
-
132
- if tag == :category || tag == :keywords
131
+
132
+ if tag == :category
133
133
  item[tag] = match[3].scan(%r{<(rss:|atom:)?#{tag}(.*?)>(.*?)</(rss:|atom:)?#{tag}>}mi).map {|x| category(x[2])}
134
+ elsif tag == :keywords
135
+ item[tag] = match[3].scan(%r{<(rss:|atom:)?dc:subject rdf:type="keywords"(.*?)>(.*?)<\/(rss:|atom:)?dc:subject>}mi).map {|x| x[2].gsub(";", ",") }
134
136
  else
135
137
  item[clean_tag(tag)] = clean_content(tag, $2, $3) if $2 || $3
136
138
  end
137
-
139
+
138
140
  end
139
141
  end
140
142
 
@@ -157,7 +159,10 @@ class RRSimpleRSS
157
159
  when :author, :contributor, :skipHours, :skipDays
158
160
  unescape(content.gsub(/<.*?>/,''))
159
161
  when :"full-text"
160
- CGI.unescapeHTML unescape(content.gsub(/<.*?>/,'')).force_encoding("UTF-8")
162
+ CGI.unescapeHTML unescape(content.gsub(/<.*?>/,'')).force_encoding("UTF-8")
163
+ when :link
164
+ "#{attrs} " =~ /href=['"]?([^'"]*)['" ]/mi
165
+ $1
161
166
  else
162
167
  content.empty? && "#{attrs} " =~ /href=['"]?([^'"]*)['" ]/mi ? $1.strip : unescape(content)
163
168
  end
@@ -166,7 +171,7 @@ class RRSimpleRSS
166
171
  def clean_tag(tag)
167
172
  tag != :'full-text' ? tag.to_s.gsub(':','_').intern : tag.to_s.gsub('-','_').intern
168
173
  end
169
-
174
+
170
175
  def unescape(content)
171
176
  if content.respond_to?(:force_encoding) && content.force_encoding("binary") =~ /([^-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]%)/n then
172
177
  CGI.unescape(content).gsub(/(<!\[CDATA\[|\]\]>)/,'').strip
data/rrsimple-rss.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "rrsimple-rss"
3
- s.version = "1.3.5"
3
+ s.version = "1.3.6"
4
4
  s.date = "2010-07-06"
5
5
  s.summary = "A simple, flexible, extensible, and liberal RSS and Atom reader for Ruby. It is designed to be backwards compatible with the standard RSS parser, but will never do RSS generation."
6
6
  s.email = "rodrigo@rrmartins.com"
@@ -7,45 +7,48 @@ require 'pry'
7
7
  class BaseTest < Test::Unit::TestCase
8
8
  def setup
9
9
  @rss_prnews = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/prnews.xml')
10
- @rss_bbc = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/bbc.xml')
11
- @rss_baboo = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/baboo.xml')
12
- @rss09 = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/rss09.rdf')
13
- @rss20 = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/rss20.xml')
14
- @media_rss = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/media_rss.xml')
15
- @atom = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/atom.xml')
10
+ @rss_bbc = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/bbc.xml')
11
+ @rss_bbc2 = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/bbc2.xml')
12
+ @rss_baboo = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/baboo.xml')
13
+ @rss09 = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/rss09.rdf')
14
+ @rss20 = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/rss20.xml')
15
+ @media_rss = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/media_rss.xml')
16
+ @atom = RRSimpleRSS.parse open(File.dirname(__FILE__) + '/../data/atom.xml')
16
17
  end
17
-
18
+
18
19
  def test_channel
19
- assert_equal @rss_bbc, @rss_bbc.channel
20
- assert_equal @rss09, @rss09.channel
21
- assert_equal @rss20, @rss20.channel
22
- assert_equal @atom, @atom.feed
23
- assert_equal @rss_baboo, @rss_baboo.feed
20
+ assert_equal @rss_bbc2, @rss_bbc2.channel
21
+ assert_equal @rss_bbc, @rss_bbc.channel
22
+ assert_equal @rss09, @rss09.channel
23
+ assert_equal @rss20, @rss20.channel
24
+ assert_equal @atom, @atom.feed
25
+ assert_equal @rss_baboo, @rss_baboo.feed
24
26
  assert_equal @rss_prnews, @rss_prnews.feed
25
27
  end
26
-
28
+
27
29
  def test_items
28
30
  assert_kind_of Array, @rss_baboo.items
29
31
  assert_kind_of Array, @rss_bbc.items
32
+ assert_kind_of Array, @rss_bbc2.items
30
33
  assert_kind_of Array, @rss09.items
31
34
  assert_kind_of Array, @rss20.items
32
35
  assert_kind_of Array, @atom.entries
33
36
  assert_kind_of Array, @rss_prnews.items
34
37
  end
35
-
38
+
36
39
  def test_rss_prnews
37
- assert_equal 20, @rss_prnews.items.size
40
+ assert_equal 20, @rss_prnews.items.size
38
41
  assert_equal "PR Newswire Releases", @rss_prnews.title.force_encoding("UTF-8")
39
42
  assert_equal "http://www.prnewswire.com/news-releases/sva-promove-exposicao-de-cartazes-que-retrata-a-evolucao-do-design-grafico-nos-ultimos-70-anos-540199401.html", @rss_prnews.channel.link
40
43
  assert_equal "http://www.prnewswire.com/news-releases/sva-promove-exposicao-de-cartazes-que-retrata-a-evolucao-do-design-grafico-nos-ultimos-70-anos-540199401.html", @rss_prnews.items.first.link
41
44
  assert_equal "http://www.prnewswire.com/news-releases/sva-promove-exposicao-de-cartazes-que-retrata-a-evolucao-do-design-grafico-nos-ultimos-70-anos-540199401.html", @rss_prnews.items.first[:link]
42
45
  assert_equal Time.parse("2015-11-04 15:30:00 -0200"), @rss_prnews.items.first.pubDate
43
46
  assert_equal Time.parse("2015-11-09 11:55:45 -0200"), @rss_prnews.channel.lastBuildDate
44
- assert_nil @rss_prnews.items.first.full_text
47
+ assert_nil @rss_prnews.items.first.full_text
45
48
  assert_not_nil @rss_prnews.items.first.description
46
49
  assert_kind_of Array, @rss_prnews.items.first.keywords
47
50
  assert_kind_of Array, @rss_prnews.items.first.category
48
- assert_equal "Art", @rss_prnews.items.first.category.first
51
+ assert_equal "Art", @rss_prnews.items.first.category.first
49
52
  end
50
53
 
51
54
  def test_rss_baboo
@@ -56,8 +59,8 @@ class BaseTest < Test::Unit::TestCase
56
59
  assert_equal "http://www.baboo.com.br/internet/lista-do-procon-sp-com-lojas-online-que-devem-ser-evitadas-e-atualizada/", @rss_baboo.items.first[:link]
57
60
  assert_equal Time.parse("2015-11-05 14:11:24 -0200"), @rss_baboo.items.first.pubDate
58
61
  assert_equal Time.parse("2015-11-05 14:11:24 -0200"), @rss_baboo.channel.lastBuildDate
59
- assert_nil @rss_baboo.items.first.full_text
60
- assert_not_nil @rss_baboo.items.first.description
62
+ assert_nil @rss_baboo.items.first.full_text
63
+ assert_not_nil @rss_baboo.items.first.description
61
64
  assert_kind_of Array, @rss_baboo.items.first.category
62
65
  end
63
66
 
@@ -73,6 +76,19 @@ class BaseTest < Test::Unit::TestCase
73
76
  assert_kind_of Array, @rss_bbc.items.first.category
74
77
  end
75
78
 
79
+ def test_rss_bbc2
80
+ assert_equal 3, @rss_bbc2.items.size
81
+ assert_equal "BBCBrasil.com | Notícias", @rss_bbc2.title.force_encoding("UTF-8")
82
+ assert_equal "http://www.bbc.com/portuguese/full_all.xml", @rss_bbc2.channel.link
83
+ assert_equal "http://www.bbc.com/portuguese/noticias/2015/11/151109_catacumbas_paris_brasileiro_cc", @rss_bbc2.items.first.link
84
+ assert_equal "http://www.bbc.com/portuguese/noticias/2015/11/151109_catacumbas_paris_brasileiro_cc", @rss_bbc2.items.first[:link]
85
+ assert_equal Time.parse("2015-11-09 16:40:33 -0200"), @rss_bbc2.items.first.updated
86
+ assert_equal Time.parse("2015-11-09 13:29:35 -0200"), @rss_bbc2.channel.updated
87
+ assert_not_nil @rss_bbc2.items.first.content
88
+ assert_nil @rss_bbc2.items.first.category.first
89
+ assert_kind_of Array, @rss_bbc2.items.first.keywords
90
+ end
91
+
76
92
  def test_rss09
77
93
  assert_equal 10, @rss09.items.size
78
94
  assert_equal "Slashdot", @rss09.title
@@ -106,7 +122,7 @@ class BaseTest < Test::Unit::TestCase
106
122
  assert_nil @media_rss.items.first.full_text
107
123
  assert_kind_of Array, @media_rss.items.first.category
108
124
  end
109
-
125
+
110
126
  def test_rss20
111
127
  assert_equal 10, @rss20.items.size
112
128
  assert_equal "Technoblog", @rss20.title
@@ -117,7 +133,7 @@ class BaseTest < Test::Unit::TestCase
117
133
  assert_nil @rss20.items.first.full_text
118
134
  assert_kind_of Array, @rss20.items.first.category
119
135
  end
120
-
136
+
121
137
  def test_atom
122
138
  assert_equal 1, @atom.entries.size
123
139
  assert_equal "dive into mark", @atom.title
@@ -127,7 +143,7 @@ class BaseTest < Test::Unit::TestCase
127
143
  assert_nil @atom.entries.first.full_text
128
144
  assert_kind_of Array, @atom.entries.first.category
129
145
  end
130
-
146
+
131
147
  def test_bad_feed
132
148
  assert_raise(RRSimpleRSSError) { RRSimpleRSS.parse(open(File.dirname(__FILE__) + '/../data/not-rss.xml')) }
133
149
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rrsimple-rss
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.5
5
- prerelease:
4
+ version: 1.3.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Lucas Carlson
@@ -20,42 +19,41 @@ executables: []
20
19
  extensions: []
21
20
  extra_rdoc_files: []
22
21
  files:
23
- - install.rb
24
- - lib/rrsimple-rss.rb
25
22
  - LICENSE
26
- - Rakefile
27
23
  - README.markdown
24
+ - Rakefile
25
+ - install.rb
26
+ - lib/rrsimple-rss.rb
28
27
  - rrsimple-rss.gemspec
29
28
  - test/base/base_test.rb
30
- - test/data/bbc.xml
31
29
  - test/data/atom.xml
30
+ - test/data/bbc.xml
32
31
  - test/data/not-rss.xml
33
32
  - test/data/rss09.rdf
34
33
  - test/data/rss20.xml
35
34
  - test/test_helper.rb
36
35
  homepage: http://github.com/rrmartins/simple-rss
37
36
  licenses: []
37
+ metadata: {}
38
38
  post_install_message:
39
39
  rdoc_options: []
40
40
  require_paths:
41
41
  - lib
42
42
  required_ruby_version: !ruby/object:Gem::Requirement
43
- none: false
44
43
  requirements:
45
44
  - - ! '>='
46
45
  - !ruby/object:Gem::Version
47
46
  version: '0'
48
47
  required_rubygems_version: !ruby/object:Gem::Requirement
49
- none: false
50
48
  requirements:
51
49
  - - ! '>='
52
50
  - !ruby/object:Gem::Version
53
51
  version: '0'
54
52
  requirements: []
55
53
  rubyforge_project: rrsimple-rss
56
- rubygems_version: 1.8.23.2
54
+ rubygems_version: 2.4.8
57
55
  signing_key:
58
- specification_version: 3
56
+ specification_version: 4
59
57
  summary: A simple, flexible, extensible, and liberal RSS and Atom reader for Ruby.
60
58
  It is designed to be backwards compatible with the standard RSS parser, but will
61
59
  never do RSS generation.