logformatter: support non-ascii characters in custom implementations of Item.__str__()

This commit is contained in:
Pablo Hoffman 2011-07-12 01:16:06 -03:00
parent 31a375bde7
commit 67213ce673
2 changed files with 21 additions and 3 deletions

View File

@ -9,11 +9,11 @@ class LogFormatter(object):
def crawled(self, request, response, spider):
referer = request.headers.get('Referer')
flags = ' %s' % str(response.flags) if response.flags else ''
return "Crawled (%d) %s (referer: %s)%s" % (response.status, \
return u"Crawled (%d) %s (referer: %s)%s" % (response.status, \
request, referer, flags)
def scraped(self, item, response, spider):
return "Scraped from %s" % response + os.linesep + str(item)
return u"Scraped from %s%s%s" % (response, os.linesep, item)
def dropped(self, item, exception, response, spider):
return "Dropped: %s" % unicode(exception) + os.linesep + str(item)
return u"Dropped: %s%s%s" % (exception, os.linesep, item)

View File

@ -2,9 +2,18 @@ import unittest
from scrapy.spider import BaseSpider
from scrapy.http import Request, Response
from scrapy.item import Item, Field
from scrapy.logformatter import LogFormatter
class CustomItem(Item):
name = Field()
def __str__(self):
return "name: %s" % self['name']
class LoggingContribTest(unittest.TestCase):
def setUp(self):
@ -27,7 +36,16 @@ class LoggingContribTest(unittest.TestCase):
exception = Exception(u"\u2018")
response = Response("http://www.example.com")
lines = self.formatter.dropped(item, exception, response, self.spider).splitlines()
assert all(isinstance(x, unicode) for x in lines)
self.assertEqual(lines, [u"Dropped: \u2018", '{}'])
def test_scraped(self):
item = CustomItem()
item['name'] = u'\xa3'
response = Response("http://www.example.com")
lines = self.formatter.scraped(item, response, self.spider).splitlines()
assert all(isinstance(x, unicode) for x in lines)
self.assertEqual(lines, [u"Scraped from <200 http://www.example.com>", u'name: \xa3'])
if __name__ == "__main__":
unittest.main()