Issue #10283: Add a `group_pattern` argument to NNTP.list().

This commit is contained in:
Antoine Pitrou 2010-11-04 21:36:15 +00:00
parent 99c4830d0c
commit 08eeadac27
4 changed files with 53 additions and 17 deletions

View File

@ -182,13 +182,15 @@ response indicates an error, the method raises one of the above exceptions.
This command is frequently disabled by NNTP server administrators. This command is frequently disabled by NNTP server administrators.
.. method:: NNTP.list(*, file=None) .. method:: NNTP.list(group_pattern=None, *, file=None)
Send a ``LIST`` command. Return a pair ``(response, list)`` where *list* is a Send a ``LIST`` or ``LIST ACTIVE`` command. Return a pair
list of tuples representing all the groups available from this NNTP server. ``(response, list)`` where *list* is a list of tuples representing all
Each tuple has the form ``(group, last, first, flag)``, where the groups available from this NNTP server, optionally matching the
*group* is a group name, *last* and *first* are the last and first article pattern string *group_pattern*. Each tuple has the form
numbers, and *flag* usually takes one of these values: ``(group, last, first, flag)``, where *group* is a group name, *last*
and *first* are the last and first article numbers, and *flag* usually
takes one of these values:
* ``y``: Local postings and articles from peers are allowed. * ``y``: Local postings and articles from peers are allowed.
* ``m``: The group is moderated and all postings must be approved. * ``m``: The group is moderated and all postings must be approved.
@ -200,8 +202,12 @@ response indicates an error, the method raises one of the above exceptions.
If *flag* has another value, then the status of the newsgroup should be If *flag* has another value, then the status of the newsgroup should be
considered unknown. considered unknown.
This command will often return very large results. It is best to cache the This command can return very large results, especially if *group_pattern*
results offline unless you really need to refresh them. is not specified. It is best to cache the results offline unless you
really need to refresh them.
.. versionchanged:: 3.2
*group_pattern* was added.
.. method:: NNTP.descriptions(grouppattern) .. method:: NNTP.descriptions(grouppattern)

View File

@ -571,14 +571,19 @@ class _NNTPBase:
cmd = 'NEWNEWS {0} {1} {2}'.format(group, date_str, time_str) cmd = 'NEWNEWS {0} {1} {2}'.format(group, date_str, time_str)
return self._longcmdstring(cmd, file) return self._longcmdstring(cmd, file)
def list(self, *, file=None): def list(self, group_pattern=None, *, file=None):
"""Process a LIST command. Argument: """Process a LIST or LIST ACTIVE command. Arguments:
- group_pattern: a pattern indicating which groups to query
- file: Filename string or file object to store the result in - file: Filename string or file object to store the result in
Returns: Returns:
- resp: server response if successful - resp: server response if successful
- list: list of (group, last, first, flag) (strings) - list: list of (group, last, first, flag) (strings)
""" """
resp, lines = self._longcmdstring('LIST', file) if group_pattern is not None:
command = 'LIST ACTIVE ' + group_pattern
else:
command = 'LIST'
resp, lines = self._longcmdstring(command, file)
return resp, self._grouplist(lines) return resp, self._grouplist(lines)
def _getdescriptions(self, group_pattern, return_all): def _getdescriptions(self, group_pattern, return_all):

View File

@ -22,16 +22,22 @@ class NetworkedNNTPTestsMixin:
self.assertEqual(str, type(welcome)) self.assertEqual(str, type(welcome))
def test_help(self): def test_help(self):
resp, list = self.server.help() resp, lines = self.server.help()
self.assertTrue(resp.startswith("100 "), resp) self.assertTrue(resp.startswith("100 "), resp)
for line in list: for line in lines:
self.assertEqual(str, type(line)) self.assertEqual(str, type(line))
def test_list(self): def test_list(self):
resp, list = self.server.list() resp, groups = self.server.list()
if len(list) > 0: if len(groups) > 0:
self.assertEqual(GroupInfo, type(list[0])) self.assertEqual(GroupInfo, type(groups[0]))
self.assertEqual(str, type(list[0].group)) self.assertEqual(str, type(groups[0].group))
def test_list_active(self):
resp, groups = self.server.list(self.GROUP_PAT)
if len(groups) > 0:
self.assertEqual(GroupInfo, type(groups[0]))
self.assertEqual(str, type(groups[0].group))
def test_unknown_command(self): def test_unknown_command(self):
with self.assertRaises(nntplib.NNTPPermanentError) as cm: with self.assertRaises(nntplib.NNTPPermanentError) as cm:
@ -383,6 +389,17 @@ class NNTPv1Handler:
free.it.comp.lang.python.learner 0000000000 0000000001 y free.it.comp.lang.python.learner 0000000000 0000000001 y
tw.bbs.comp.lang.python 0000000304 0000000304 y tw.bbs.comp.lang.python 0000000304 0000000304 y
.""") .""")
elif action == "ACTIVE":
if param == "*distutils*":
self.push_lit("""\
215 Newsgroups in form "group high low flags"
gmane.comp.python.distutils.devel 0000014104 0000000001 m
gmane.comp.python.distutils.cvs 0000000000 0000000001 m
.""")
else:
self.push_lit("""\
215 Newsgroups in form "group high low flags"
.""")
elif action == "OVERVIEW.FMT": elif action == "OVERVIEW.FMT":
self.push_lit("""\ self.push_lit("""\
215 Order of fields in overview database. 215 Order of fields in overview database.
@ -608,6 +625,12 @@ class NNTPv1v2TestsMixin:
self.assertEqual(g, self.assertEqual(g,
GroupInfo("comp.lang.python.announce", "0000001153", GroupInfo("comp.lang.python.announce", "0000001153",
"0000000993", "m")) "0000000993", "m"))
resp, groups = self.server.list("*distutils*")
self.assertEqual(len(groups), 2)
g = groups[0]
self.assertEqual(g,
GroupInfo("gmane.comp.python.distutils.devel", "0000014104",
"0000000001", "m"))
def test_stat(self): def test_stat(self):
resp, art_num, message_id = self.server.stat(3000234) resp, art_num, message_id = self.server.stat(3000234)

View File

@ -65,6 +65,8 @@ Core and Builtins
Library Library
------- -------
- Issue #10283: Add a ``group_pattern`` argument to NNTP.list().
- Issue #10155: Add IISCGIHandler to wsgiref.handlers to support IIS - Issue #10155: Add IISCGIHandler to wsgiref.handlers to support IIS
CGI environment better, and to correct unicode environment values CGI environment better, and to correct unicode environment values
for WSGI 1.0.1. for WSGI 1.0.1.