Skip to content

Commit

Permalink
[3.7] bpo-32861: urllib.robotparser fix incomplete __str__ methods. (G…
Browse files Browse the repository at this point in the history
…H-5711) (GH-6795) (GH-6818)

The urllib.robotparser's __str__ representation now includes wildcard
entries and the "Crawl-delay" and "Request-rate" fields.
(cherry picked from commit c3fa1f2)

Co-authored-by: Michael Lazar <lazar.michael22@gmail.com>
  • Loading branch information
2 people authored and serhiy-storchaka committed May 14, 2018
1 parent 914bad6 commit 3936fd7
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 5 deletions.
27 changes: 27 additions & 0 deletions Lib/test/test_robotparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,33 @@ class DefaultEntryTest(BaseRequestRateTest, unittest.TestCase):
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):

def do_GET(self):
Expand Down
18 changes: 13 additions & 5 deletions Lib/urllib/robotparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,10 @@ def request_rate(self, useragent):
return self.default_entry.req_rate

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'.join(map(str, entries)) + '\n'


class RuleLine:
Expand Down Expand Up @@ -222,10 +225,15 @@ def __init__(self):
def __str__(self):
ret = []
for agent in self.useragents:
ret.extend(["User-agent: ", agent, "\n"])
for line in self.rulelines:
ret.extend([str(line), "\n"])
return ''.join(ret)
ret.append(f"User-agent: {agent}")
if self.delay is not None:
ret.append(f"Crawl-delay: {self.delay}")
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))
ret.append('') # for compatibility
return '\n'.join(ret)

def applies_to(self, useragent):
"""check if this entry applies to the specified agent"""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The urllib.robotparser's ``__str__`` representation now includes wildcard
entries and the "Crawl-delay" and "Request-rate" fields. Patch by
Michael Lazar.

0 comments on commit 3936fd7

Please sign in to comment.