ruby-feedparser 0.7 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,12 +1,12 @@
1
1
  require 'rake/testtask'
2
- require 'rake/rdoctask'
3
- require 'rake/packagetask'
2
+ require 'rdoc/task'
3
+ require 'rubygems/package_task'
4
4
  require 'rake'
5
5
  require 'find'
6
6
 
7
7
  # Globals
8
8
  PKG_NAME = 'ruby-feedparser'
9
- PKG_VERSION = '0.7'
9
+ PKG_VERSION = `ruby -Ilib -rfeedparser/feedparser -e 'puts FeedParser::VERSION'`.strip
10
10
 
11
11
  PKG_FILES = [ 'ChangeLog', 'README', 'COPYING', 'LICENSE', 'setup.rb', 'Rakefile']
12
12
  Find.find('lib/', 'test/', 'tools/') do |f|
@@ -19,7 +19,7 @@ end
19
19
 
20
20
  PKG_FILES.reject! { |f| f =~ /^test\/(source|.*_output)\// }
21
21
 
22
- task :default => [:package]
22
+ task :default => [:test]
23
23
 
24
24
  Rake::TestTask.new do |t|
25
25
  t.libs << "test"
@@ -61,8 +61,6 @@ end
61
61
 
62
62
  # "Gem" part of the Rakefile
63
63
  begin
64
- require 'rake/gempackagetask'
65
-
66
64
  spec = Gem::Specification.new do |s|
67
65
  s.platform = Gem::Platform::RUBY
68
66
  s.summary = "Ruby library to parse ATOM and RSS feeds"
@@ -73,9 +71,11 @@ begin
73
71
  s.autorequire = 'feedparser'
74
72
  s.files = PKG_FILES
75
73
  s.description = "Ruby library to parse ATOM and RSS feeds"
74
+ s.authors = ['Lucas Nussbaum']
75
+ s.add_runtime_dependency 'magic'
76
76
  end
77
77
 
78
- Rake::GemPackageTask.new(spec) do |pkg|
78
+ Gem::PackageTask.new(spec) do |pkg|
79
79
  pkg.need_zip = true
80
80
  pkg.need_tar = true
81
81
  end
@@ -4,14 +4,43 @@ require 'feedparser/textconverters'
4
4
  require 'feedparser/rexml_patch'
5
5
  require 'feedparser/text-output'
6
6
  require 'base64'
7
+ require 'magic'
8
+ require 'uri'
7
9
 
8
10
  module FeedParser
9
11
 
10
- VERSION = "0.7"
12
+ VERSION = "0.9.3"
11
13
 
12
14
  class UnknownFeedTypeException < RuntimeError
13
15
  end
14
16
 
17
+ def self.recode(str)
18
+ encoding = nil
19
+ begin
20
+ encoding = Magic.guess_string_mime_encoding(str)
21
+ rescue Magic::Exception
22
+ # this happens when magic does not find any content at all, e.g. with
23
+ # strings that contain only whitespace. In these case it *should* be safe
24
+ # to assume UTF-8
25
+ encoding = Encoding::UTF_8
26
+ end
27
+ if encoding == 'unknown-8bit'
28
+ # find first substring with a valid encoding that is not us-ascii
29
+ length = 1 # has to start at 1, magic requires at least 2 bytes
30
+ while length < str.length && ['us-ascii', 'unknown-8bit'].include?(encoding)
31
+ encoding = Magic.guess_string_mime_encoding(str[0..length])
32
+ length = length + 1
33
+ end
34
+ # need to remove iso-8859-1 control characters
35
+ if encoding == 'iso-8859-1'
36
+ str = str.bytes.select { |c| c < 128 || c > 159 }.map(&:chr).join
37
+ end
38
+ end
39
+ str.force_encoding(encoding)
40
+ str = str.chars.select { |c| c.valid_encoding? }.join
41
+ str.encode('UTF-8')
42
+ end
43
+
15
44
  # an RSS/Atom feed
16
45
  class Feed
17
46
  attr_reader :type, :title, :link, :description, :creator, :encoding, :items
@@ -20,13 +49,16 @@ module FeedParser
20
49
  attr_reader :xml
21
50
 
22
51
  # parse str to build a Feed
23
- def initialize(str = nil)
52
+ def initialize(str = nil, uri = nil)
24
53
  parse(str) if str
54
+ parse_origin(uri) if uri
25
55
  end
26
56
 
27
57
  # Determines all the fields using a string containing an
28
58
  # XML document
29
59
  def parse(str)
60
+ str = FeedParser.recode(str)
61
+
30
62
  # Dirty hack: some feeds contain the & char. It must be changed to &amp;
31
63
  str.gsub!(/&(\s+)/, '&amp;\1')
32
64
  doc = REXML::Document.new(str)
@@ -34,6 +66,7 @@ module FeedParser
34
66
  # get feed info
35
67
  @encoding = doc.encoding
36
68
  @title,@link,@description,@creator = nil
69
+ @title = ""
37
70
  @items = []
38
71
  if doc.root.elements['channel'] || doc.root.elements['rss:channel']
39
72
  @type = "rss"
@@ -108,19 +141,28 @@ module FeedParser
108
141
  s += "Type: #{@type}\n"
109
142
  s += "Encoding: #{@encoding}\n"
110
143
  s += "Title: #{@title}\n"
111
- s += "Link: #{@link}\n"
144
+ s += "Link: #{link}\n"
112
145
  s += "Description: #{@description}\n"
113
146
  s += "Creator: #{@creator}\n"
114
147
  s += "\n"
115
148
  @items.each { |i| s += i.to_s(localtime) }
116
149
  s
117
150
  end
151
+
152
+ def parse_origin(uri)
153
+ uri = URI.parse(uri)
154
+ if uri.hostname && uri.scheme
155
+ @origin = "#{uri.scheme}://#{uri.hostname}"
156
+ end
157
+ end
158
+
159
+ attr_reader :origin
118
160
  end
119
161
 
120
162
  # an Item from a feed
121
163
  class FeedItem
122
- attr_accessor :title, :link, :content, :date, :creators, :subject,
123
- :cacheditem
164
+ attr_accessor :title, :content, :date, :creators, :subject,
165
+ :cacheditem, :links
124
166
 
125
167
  # The item's categories/tags. An array of strings.
126
168
  attr_accessor :categories
@@ -137,9 +179,12 @@ module FeedParser
137
179
  @xml = item
138
180
  @feed = feed
139
181
  @title, @link, @content, @date, @subject = nil
182
+ @links = []
140
183
  @creators = []
141
184
  @categories = []
142
185
  @enclosures = []
186
+
187
+ @title = ""
143
188
  parse(item) if item
144
189
  end
145
190
 
@@ -160,7 +205,7 @@ module FeedParser
160
205
 
161
206
  def to_s(localtime = true)
162
207
  s = "--------------------------------\n" +
163
- "Title: #{@title}\nLink: #{@link}\n"
208
+ "Title: #{@title}\nLink: #{link}\n"
164
209
  if localtime or @date.nil?
165
210
  s += "Date: #{@date.to_s}\n"
166
211
  else
@@ -181,6 +226,22 @@ module FeedParser
181
226
  end
182
227
  return s
183
228
  end
229
+
230
+ attr_writer :link
231
+
232
+ def link
233
+ if @link
234
+ uri = URI.parse(URI.escape(@link))
235
+ if uri.hostname && uri.scheme
236
+ @link
237
+ elsif feed && feed.origin
238
+ [feed.origin, @link].compact.join
239
+ else
240
+ @link
241
+ end
242
+ end
243
+ end
244
+
184
245
  end
185
246
 
186
247
  class RSSItem < FeedItem
@@ -199,7 +260,7 @@ module FeedParser
199
260
  (e = item.elements['guid'] || item.elements['rss:guid'] and
200
261
  not (e.attribute('isPermaLink') and
201
262
  e.attribute('isPermaLink').value == 'false'))
202
- @link = e.text.rmWhiteSpace!
263
+ self.link = e.text.rmWhiteSpace!
203
264
  end
204
265
  # Content
205
266
  if (e = item.elements['content:encoded']) ||
@@ -261,8 +322,16 @@ module FeedParser
261
322
  end
262
323
  # Link
263
324
  item.each_element('link') do |e|
325
+
264
326
  if (h = e.attribute('href')) && h.value
265
- @link = h.value
327
+ self.link = h.value
328
+
329
+ if e.attribute('type')
330
+ @links << {:href => h.value, :type => e.attribute('type').value}
331
+ else
332
+ @links << {:href => h.value, :type => ''}
333
+ end
334
+
266
335
  end
267
336
  end
268
337
  # Content
@@ -80,13 +80,13 @@ module FeedParser
80
80
  s += (headline % ["Feed:", r])
81
81
 
82
82
  r = ""
83
- r += "<a href=\"#{@link}\">" if @link
83
+ r += "<a href=\"#{link}\">" if link
84
84
  if @title
85
85
  r += "<b>#{@title.escape_html}</b>\n"
86
- elsif @link
87
- r += "<b>#{@link.escape_html}</b>\n"
86
+ elsif link
87
+ r += "<b>#{link.escape_html}</b>\n"
88
88
  end
89
- r += "</a>\n" if @link
89
+ r += "</a>\n" if link
90
90
  s += (headline % ["Item:", r])
91
91
  s += "</table></td></tr></table>\n"
92
92
  s += "\n"
@@ -11,16 +11,16 @@ module FeedParser
11
11
  @pre = false
12
12
  @href = nil
13
13
  @links = []
14
+ @curlink = []
14
15
  @imgs = []
15
- @img_index = '@'
16
+ @img_index = 'A'
16
17
  super(verbose)
17
18
  end
18
19
 
19
20
  def next_img_index
20
- n = @img_index[0] + 1
21
- @img_index = " "
22
- @img_index[0] = n
23
- return @img_index
21
+ idx = @img_index
22
+ @img_index = @img_index.next
23
+ idx
24
24
  end
25
25
 
26
26
  def handle_data(data)
@@ -29,7 +29,8 @@ module FeedParser
29
29
  data.gsub!(/\n/, ' ')
30
30
  data.gsub!(/( )+/, ' ')
31
31
  end
32
- @savedata << data
32
+ data = FeedParser.recode(data)
33
+ @savedata << data.encode(Encoding::UTF_8)
33
34
  end
34
35
 
35
36
  def unknown_starttag(tag, attrs)
@@ -70,7 +71,14 @@ module FeedParser
70
71
  end
71
72
  end
72
73
  if @href
73
- @links << @href.gsub(/^("|'|)(.*)("|')$/,'\2')
74
+ @href.gsub!(/^("|'|)(.*)("|')$/,'\2')
75
+ @curlink = @links.find_index(@href)
76
+ if @curlink.nil?
77
+ @links << @href
78
+ @curlink = @links.length
79
+ else
80
+ @curlink += 1
81
+ end
74
82
  end
75
83
  when 'img'
76
84
  # find src in args
@@ -81,8 +89,14 @@ module FeedParser
81
89
  end
82
90
  end
83
91
  if src
84
- idx = next_img_index
85
- @imgs << [ idx, src.gsub(/^("|'|)(.*)("|')$/,'\2') ]
92
+ src.gsub!(/^("|'|)(.*)("|')$/,'\2')
93
+ i = @imgs.index { |e| e[1] == src }
94
+ if i.nil?
95
+ idx = next_img_index
96
+ @imgs << [ idx, src ]
97
+ else
98
+ idx = @imgs[i][0]
99
+ end
86
100
  @savedata << "[#{idx}]"
87
101
  end
88
102
  else
@@ -125,7 +139,7 @@ module FeedParser
125
139
  @pre = false
126
140
  when 'a'
127
141
  if @href
128
- @savedata << "[#{@links.length}]"
142
+ @savedata << "[#{@curlink}]"
129
143
  @href = nil
130
144
  end
131
145
  end
@@ -293,12 +293,11 @@ module FeedParser
293
293
  end
294
294
 
295
295
  def handle_charref(name)
296
- n = name.to_i
297
- if !(0 <= n && n <= 255)
296
+ if name =~ /[0-9]+/
298
297
  unknown_charref(name)
299
- return
298
+ else
299
+ handle_data(name)
300
300
  end
301
- handle_data(n.chr)
302
301
  end
303
302
 
304
303
  def handle_entityref(name)
@@ -1,4 +1,3 @@
1
- require 'feedparser'
2
1
  require 'feedparser/html2text-parser'
3
2
  require 'feedparser/filesizes'
4
3
 
@@ -61,7 +60,7 @@ module FeedParser
61
60
  if header
62
61
  s += "Item: "
63
62
  s += @title if @title
64
- s += "\n<#{@link}>" if @link
63
+ s += "\n<#{link}>" if link
65
64
  if @date
66
65
  if localtime
67
66
  s += "\nDate: #{@date.to_s}"
@@ -71,7 +70,7 @@ module FeedParser
71
70
  end
72
71
  s += "\n"
73
72
  else
74
- s += "<#{@link}>\n\n" if @link
73
+ s += "<#{link}>\n\n" if link
75
74
  end
76
75
  s += "#{@content.html2text(wrapto).chomp}\n" if @content
77
76
  if @enclosures and @enclosures.length > 0
@@ -89,7 +88,7 @@ module FeedParser
89
88
  if not header
90
89
  s += "\nItem: "
91
90
  s += @title if @title
92
- s += "\n<#{@link}>" if @link
91
+ s += "\n<#{link}>" if link
93
92
  if @date
94
93
  if localtime
95
94
  s += "\nDate: #{@date.to_s}"
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -w
1
+ # encoding: UTF-8
2
2
 
3
3
  $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
4
 
@@ -114,4 +114,51 @@ class FeedParserTest < Test::Unit::TestCase
114
114
  # the third one should be removed because an enclosure should have an url, or it's useless.
115
115
  assert_equal([["url1", "1", "type1"], ["url2", nil, "type2"], ["url1", "1", nil]], ch.items[0].enclosures)
116
116
  end
117
+
118
+ def test_recode_utf8
119
+ assert_equal 'UTF-8', FeedParser.recode("áéíóú").encoding.name
120
+ end
121
+
122
+ def test_recode_iso88519
123
+ assert_equal 'UTF-8', FeedParser.recode("áéíóú".encode('iso-8859-1')).encoding.name
124
+ end
125
+
126
+ def test_recode_utf8_mixed_with_ASCIIBIT
127
+ recoded = FeedParser.recode("áé\x8Díóú")
128
+ assert_equal'UTF-8', recoded.encoding.name
129
+ assert_equal 'áéíóú', recoded
130
+ end
131
+
132
+ def test_recode_unicode_char
133
+ assert_equal "1280×1024", FeedParser.recode("1280×1024")
134
+ end
135
+
136
+ def test_almost_valid_iso88591
137
+ input = "Codifica\xE7\xE3o \x96 quase v\xE1lida"
138
+ assert_equal "Codificação quase válida", FeedParser.recode(input)
139
+ end
140
+
141
+ def test_feed_origin
142
+ feed = FeedParser::Feed.new(nil, 'http://foo.com/feed')
143
+ assert_equal "http://foo.com", feed.origin
144
+ end
145
+
146
+ def test_item_origin
147
+ feed = FeedParser::Feed.new(nil, 'http://foo.com/feed')
148
+ item = FeedParser::FeedItem.new(nil, feed)
149
+ item.link = '/foo/bar'
150
+ assert_equal 'http://foo.com/foo/bar', item.link
151
+ end
152
+
153
+ def test_item_origin_no_link
154
+ item = FeedParser::FeedItem.new(nil, nil)
155
+ assert_nil item.link
156
+ end
157
+
158
+ def test_item_no_feed
159
+ item = FeedParser::FeedItem.new(nil, nil)
160
+ item.link = '/foo/bar'
161
+ assert_equal '/foo/bar', item.link
162
+ end
163
+
117
164
  end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test/unit'
4
+
5
+ require 'feedparser/feedparser'
6
+
7
+ class Html2TextParserTest < Test::Unit::TestCase
8
+
9
+ def test_next_img_index
10
+ parser = FeedParser::HTML2TextParser.new
11
+ assert_equal 'A', parser.next_img_index
12
+ assert_equal 'B', parser.next_img_index
13
+ end
14
+
15
+ def test_numerical_entity
16
+ parser = FeedParser::HTML2TextParser.new
17
+ parser.feed('1280&#215;1024')
18
+ parser.close
19
+ assert_equal "1280×1024", parser.savedata
20
+ end
21
+
22
+ def test_numerical_entity_large_known
23
+ parser = FeedParser::HTML2TextParser.new
24
+ parser.feed('&#8594;')
25
+ parser.close
26
+ assert_equal "→", parser.savedata
27
+ end
28
+
29
+ def test_numerical_entity_large
30
+ parser = FeedParser::HTML2TextParser.new
31
+ parser.feed('&#10000;')
32
+ parser.close
33
+ assert_equal "✐", parser.savedata
34
+ end
35
+
36
+ def test_non_numerical_entity
37
+ parser = FeedParser::HTML2TextParser.new
38
+ parser.feed('HTML&amp;CO')
39
+ parser.close
40
+ assert_equal "HTML&CO", parser.savedata
41
+ end
42
+
43
+ end
@@ -19,12 +19,10 @@ class HTMLOutputTest < Test::Unit::TestCase
19
19
  else
20
20
  raise 'source directory not found.'
21
21
  end
22
- def test_parser
23
- allok = true
24
- Dir.foreach(SRCDIR) do |f|
25
- next if f !~ /.xml$/
26
- next if ENV['SOURCE'] != nil and ENV['SOURCE'] != f
27
- puts "Checking #{f}"
22
+ Dir.foreach(SRCDIR) do |f|
23
+ next if f !~ /.xml$/
24
+ testname = 'test_' + File.basename(f).gsub(/\W/, '_')
25
+ define_method(testname) do
28
26
  str = File::read(SRCDIR + '/' + f)
29
27
  chan = FeedParser::Feed::new(str)
30
28
  chanstr = chan.to_html(false)
@@ -34,19 +32,21 @@ class HTMLOutputTest < Test::Unit::TestCase
34
32
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output.new'), "w") do |fd|
35
33
  fd.print(chanstr)
36
34
  end
37
- puts "Test failed for #{f}."
38
- puts " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}"
39
- puts " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}"
40
- allok = false
35
+ assert(
36
+ false,
37
+ [
38
+ "Test failed for #{f}.",
39
+ " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}",
40
+ " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}",
41
+ ].join("\n")
42
+ )
41
43
  end
42
44
  else
43
- puts "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!"
44
45
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output'), "w") do |f|
45
46
  f.print(chanstr)
46
47
  end
47
- allok = false
48
+ assert(false, "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!")
48
49
  end
49
50
  end
50
- assert(allok)
51
51
  end
52
52
  end
@@ -15,12 +15,10 @@ class ParserTest < Test::Unit::TestCase
15
15
  else
16
16
  raise 'source directory not found.'
17
17
  end
18
- def test_parser
19
- allok = true
20
- Dir.foreach(SRCDIR) do |f|
21
- next if f !~ /.xml$/
22
- next if ENV['SOURCE'] != nil and ENV['SOURCE'] != f
23
- puts "Checking #{f}"
18
+ Dir.foreach(SRCDIR) do |f|
19
+ next if f !~ /.xml$/
20
+ testname = 'test_' + File.basename(f).gsub(/\W/, '_')
21
+ define_method(testname) do
24
22
  str = File::read(SRCDIR + '/' + f)
25
23
  chan = FeedParser::Feed::new(str)
26
24
  chanstr = chan.to_s(false)
@@ -30,19 +28,21 @@ class ParserTest < Test::Unit::TestCase
30
28
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output.new'), "w") do |fd|
31
29
  fd.print(chanstr)
32
30
  end
33
- puts "Test failed for #{f}."
34
- puts " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}"
35
- puts " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}"
36
- allok = false
31
+ assert(
32
+ false,
33
+ [
34
+ "Test failed for #{f}.",
35
+ " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}",
36
+ " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}",
37
+ ].join("\n")
38
+ )
37
39
  end
38
40
  else
39
- puts "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!"
40
41
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output'), "w") do |f|
41
42
  f.print(chanstr)
42
43
  end
43
- allok = false
44
+ assert(false, "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!")
44
45
  end
45
46
  end
46
- assert(allok)
47
47
  end
48
48
  end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test/unit'
4
+ require 'mocha/setup'
5
+
6
+ require 'feedparser/sgml-parser'
7
+
8
+ class SGMLParserTest < Test::Unit::TestCase
9
+
10
+ def test_numerical_charref
11
+ parser = FeedParser::SGMLParser.new
12
+ parser.expects(:unknown_charref).with('215')
13
+ parser.handle_charref('215')
14
+ end
15
+
16
+ def test_non_numerical_charref
17
+ parser = FeedParser::SGMLParser.new
18
+ parser.expects(:handle_data).with('amp')
19
+ parser.handle_charref('amp')
20
+ end
21
+
22
+ end
@@ -15,12 +15,10 @@ class TextOutputTest < Test::Unit::TestCase
15
15
  else
16
16
  raise 'source directory not found.'
17
17
  end
18
- def test_parser
19
- allok = true
20
- Dir.foreach(SRCDIR) do |f|
21
- next if f !~ /.xml$/
22
- next if ENV['SOURCE'] != nil and ENV['SOURCE'] != f
23
- puts "Checking #{f}"
18
+ Dir.foreach(SRCDIR) do |f|
19
+ next if f !~ /.xml$/
20
+ testname = 'test_' + File.basename(f).gsub(/\W/, '_')
21
+ define_method(testname) do
24
22
  str = File::read(SRCDIR + '/' + f)
25
23
  chan = FeedParser::Feed::new(str)
26
24
  chanstr = chan.to_text(false) # localtime set to false
@@ -30,19 +28,21 @@ class TextOutputTest < Test::Unit::TestCase
30
28
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output.new'), "w") do |fd|
31
29
  fd.print(chanstr)
32
30
  end
33
- puts "Test failed for #{f}."
34
- puts " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}"
35
- puts " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}"
36
- allok = false
31
+ assert(
32
+ false,
33
+ [
34
+ "Test failed for #{f}.",
35
+ " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}",
36
+ " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}",
37
+ ].join("\n")
38
+ )
37
39
  end
38
40
  else
39
- puts "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!"
40
41
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output'), "w") do |f|
41
42
  f.print(chanstr)
42
43
  end
43
- allok = false
44
+ assert(false, "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!")
44
45
  end
45
46
  end
46
- assert(allok)
47
47
  end
48
48
  end
@@ -15,12 +15,10 @@ class TextWrappedOutputTest < Test::Unit::TestCase
15
15
  else
16
16
  raise 'source directory not found.'
17
17
  end
18
- def test_parser
19
- allok = true
20
- Dir.foreach(SRCDIR) do |f|
21
- next if f !~ /.xml$/
22
- next if ENV['SOURCE'] != nil and ENV['SOURCE'] != f
23
- puts "Checking #{f}"
18
+ Dir.foreach(SRCDIR) do |f|
19
+ next if f !~ /.xml$/
20
+ testname = 'test_' + File.basename(f).gsub(/\W/, '_')
21
+ define_method(testname) do
24
22
  str = File::read(SRCDIR + '/' + f)
25
23
  chan = FeedParser::Feed::new(str)
26
24
  chanstr = chan.to_text(false, 72) # localtime set to false
@@ -30,19 +28,21 @@ class TextWrappedOutputTest < Test::Unit::TestCase
30
28
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output.new'), "w") do |fd|
31
29
  fd.print(chanstr)
32
30
  end
33
- puts "Test failed for #{f}."
34
- puts " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}"
35
- puts " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}"
36
- allok = false
31
+ assert(
32
+ false,
33
+ [
34
+ "Test failed for #{f}.",
35
+ " Check: diff -u #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{,.new}",
36
+ " Commit: mv -f #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}{.new,}",
37
+ ].join("\n")
38
+ )
37
39
  end
38
40
  else
39
- puts "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!"
40
41
  File::open(DSTDIR + '/' + f.gsub(/.xml$/, '.output'), "w") do |f|
41
42
  f.print(chanstr)
42
43
  end
43
- allok = false
44
+ assert(false, "Missing #{DSTDIR + '/' + f.gsub(/.xml$/, '.output')}. Writing it, but check manually!")
44
45
  end
45
46
  end
46
- assert(allok)
47
47
  end
48
48
  end
metadata CHANGED
@@ -1,76 +1,85 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ruby-feedparser
3
- version: !ruby/object:Gem::Version
4
- version: "0.7"
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.3
5
+ prerelease:
5
6
  platform: ruby
6
- authors: []
7
-
7
+ authors:
8
+ - Lucas Nussbaum
8
9
  autorequire: feedparser
9
10
  bindir: bin
10
11
  cert_chain: []
11
-
12
- date: 2009-07-27 00:00:00 +02:00
13
- default_executable:
14
- dependencies: []
15
-
12
+ date: 2014-02-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: magic
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
16
30
  description: Ruby library to parse ATOM and RSS feeds
17
31
  email:
18
32
  executables: []
19
-
20
33
  extensions: []
21
-
22
34
  extra_rdoc_files: []
23
-
24
- files:
35
+ files:
25
36
  - ChangeLog
26
37
  - README
27
38
  - COPYING
28
39
  - LICENSE
29
40
  - setup.rb
30
41
  - Rakefile
31
- - lib/feedparser/text-output.rb
42
+ - lib/feedparser/feedparser.rb
32
43
  - lib/feedparser/filesizes.rb
33
44
  - lib/feedparser/html-output.rb
34
- - lib/feedparser/rexml_patch.rb
35
45
  - lib/feedparser/html2text-parser.rb
36
- - lib/feedparser/textconverters.rb
37
- - lib/feedparser/feedparser.rb
46
+ - lib/feedparser/rexml_patch.rb
38
47
  - lib/feedparser/sgml-parser.rb
48
+ - lib/feedparser/text-output.rb
49
+ - lib/feedparser/textconverters.rb
39
50
  - lib/feedparser.rb
40
51
  - test/tc_feed_parse.rb
41
- - test/tc_textoutput.rb
52
+ - test/tc_html2text_parser.rb
42
53
  - test/tc_htmloutput.rb
54
+ - test/tc_parser.rb
55
+ - test/tc_sgml_parser.rb
56
+ - test/tc_textoutput.rb
43
57
  - test/tc_textwrappedoutput.rb
44
58
  - test/ts_feedparser.rb
45
- - test/tc_parser.rb
46
59
  - tools/doctoweb.bash
47
- has_rdoc: true
48
60
  homepage:
49
61
  licenses: []
50
-
51
62
  post_install_message:
52
63
  rdoc_options: []
53
-
54
- require_paths:
64
+ require_paths:
55
65
  - lib
56
- required_ruby_version: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: "0"
61
- version:
62
- required_rubygems_version: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: "0"
67
- version:
68
- requirements:
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements:
69
79
  - none
70
80
  rubyforge_project:
71
- rubygems_version: 1.3.4
81
+ rubygems_version: 1.8.23
72
82
  signing_key:
73
83
  specification_version: 3
74
84
  summary: Ruby library to parse ATOM and RSS feeds
75
85
  test_files: []
76
-