bpo-32861: urllib.robotparser fix incomplete __str__ methods. (GH-5711)

The urllib.robotparser's __str__ representation now includes wildcard
entries and the "Crawl-delay" and "Request-rate" fields. Also removes extra
newlines that were being appended to the end of the string.
This commit is contained in:
Michael Lazar 2018-05-14 10:10:41 -04:00 committed by Serhiy Storchaka
parent 5c0d462689
commit bd08a0af2d
3 changed files with 42 additions and 5 deletions

View File

@ -246,6 +246,32 @@ Disallow: /cyberworld/map/
bad = ['/cyberworld/map/index.html'] bad = ['/cyberworld/map/index.html']
class StringFormattingTest(BaseRobotTest, unittest.TestCase):
robots_txt = """\
User-agent: *
Crawl-delay: 1
Request-rate: 3/15
Disallow: /cyberworld/map/ # This is an infinite virtual URL space
# Cybermapper knows where to go.
User-agent: cybermapper
Disallow: /some/path
"""
expected_output = """\
User-agent: cybermapper
Disallow: /some/path
User-agent: *
Crawl-delay: 1
Request-rate: 3/15
Disallow: /cyberworld/map/\
"""
def test_string_formatting(self):
self.assertEqual(str(self.parser), self.expected_output)
class RobotHandler(BaseHTTPRequestHandler): class RobotHandler(BaseHTTPRequestHandler):
def do_GET(self): def do_GET(self):

View File

@ -190,7 +190,10 @@ class RobotFileParser:
return self.default_entry.req_rate return self.default_entry.req_rate
def __str__(self): def __str__(self):
return ''.join([str(entry) + "\n" for entry in self.entries]) entries = self.entries
if self.default_entry is not None:
entries = entries + [self.default_entry]
return '\n\n'.join(map(str, entries))
class RuleLine: class RuleLine:
@ -222,10 +225,14 @@ class Entry:
def __str__(self): def __str__(self):
ret = [] ret = []
for agent in self.useragents: for agent in self.useragents:
ret.extend(["User-agent: ", agent, "\n"]) ret.append(f"User-agent: {agent}")
for line in self.rulelines: if self.delay is not None:
ret.extend([str(line), "\n"]) ret.append(f"Crawl-delay: {self.delay}")
return ''.join(ret) if self.req_rate is not None:
rate = self.req_rate
ret.append(f"Request-rate: {rate.requests}/{rate.seconds}")
ret.extend(map(str, self.rulelines))
return '\n'.join(ret)
def applies_to(self, useragent): def applies_to(self, useragent):
"""check if this entry applies to the specified agent""" """check if this entry applies to the specified agent"""

View File

@ -0,0 +1,4 @@
The urllib.robotparser's ``__str__`` representation now includes wildcard
entries and the "Crawl-delay" and "Request-rate" fields. Also removes extra
newlines that were being appended to the end of the string. Patch by
Michael Lazar.