Patch #605370: Add description[s] for RFC 2980 compliance.
This commit is contained in:
parent
32d0c1b458
commit
cc0f93233a
|
@ -175,6 +175,23 @@ then the method will open a file object with that name, write to it
|
||||||
then close it. If \var{file} is a file object, then it will start
|
then close it. If \var{file} is a file object, then it will start
|
||||||
calling \method{write()} on it to store the lines of the command output.
|
calling \method{write()} on it to store the lines of the command output.
|
||||||
If \var{file} is supplied, then the returned \var{list} is an empty list.
|
If \var{file} is supplied, then the returned \var{list} is an empty list.
|
||||||
|
|
||||||
|
\begin{methoddesc}{descriptions}{grouppattern}
|
||||||
|
Send a \samp{LIST NEWSGROUPS} command, where \var{grouppattern} is a wildmat
|
||||||
|
string as specified in RFC2980 (it's essentially the same as DOS or UNIX
|
||||||
|
shell wildcard strings). Return a pair \code{(\var{response},
|
||||||
|
\var{list})}, where \var{list} is a list of tuples containing
|
||||||
|
\code{(\var{name}, \var{title})}.
|
||||||
|
\end{methoddesc}
|
||||||
|
|
||||||
|
\begin{methoddesc}{description}{group}
|
||||||
|
Get a description for a single group \var{group}. If more than one group
|
||||||
|
matches (if 'group' is a real wildmat string), return the first match. If no group
|
||||||
|
matches, return an empty string.
|
||||||
|
|
||||||
|
This elides the response code from the server. If the response code is
|
||||||
|
needed, use \method{descriptions()}.
|
||||||
|
|
||||||
\end{methoddesc}
|
\end{methoddesc}
|
||||||
|
|
||||||
\begin{methoddesc}{group}{name}
|
\begin{methoddesc}{group}{name}
|
||||||
|
@ -294,6 +311,9 @@ calling \method{write()} on it to store the lines of the command output.
|
||||||
If \var{file} is supplied, then the returned \var{list} is an empty list.
|
If \var{file} is supplied, then the returned \var{list} is an empty list.
|
||||||
This is an optional NNTP extension, and may not be supported by all
|
This is an optional NNTP extension, and may not be supported by all
|
||||||
servers.
|
servers.
|
||||||
|
|
||||||
|
RFC2980 says ``It is suggested that this extension be deprecated''. Use
|
||||||
|
\method{descriptions()} or \method{description()} instead.
|
||||||
\end{methoddesc}
|
\end{methoddesc}
|
||||||
|
|
||||||
\begin{methoddesc}{xover}{start, end, \optional{file}}
|
\begin{methoddesc}{xover}{start, end, \optional{file}}
|
||||||
|
|
|
@ -297,6 +297,42 @@ class NNTP:
|
||||||
list[i] = tuple(list[i].split())
|
list[i] = tuple(list[i].split())
|
||||||
return resp, list
|
return resp, list
|
||||||
|
|
||||||
|
def description(self, group):
|
||||||
|
|
||||||
|
"""Get a description for a single group. If more than one
|
||||||
|
group matches ('group' is a pattern), return the first. If no
|
||||||
|
group matches, return an empty string.
|
||||||
|
|
||||||
|
This elides the response code from the server, since it can
|
||||||
|
only be '215' or '285' (for xgtitle) anyway. If the response
|
||||||
|
code is needed, use the 'descriptions' method.
|
||||||
|
|
||||||
|
NOTE: This neither checks for a wildcard in 'group' nor does
|
||||||
|
it check whether the group actually exists."""
|
||||||
|
|
||||||
|
resp, lines = self.descriptions(group)
|
||||||
|
if len(lines) == 0:
|
||||||
|
return ""
|
||||||
|
else:
|
||||||
|
return lines[0][1]
|
||||||
|
|
||||||
|
def descriptions(self, group_pattern):
|
||||||
|
"""Get descriptions for a range of groups."""
|
||||||
|
line_pat = re.compile("^(?P<group>[^ \t]+)[ \t]+(.*)$")
|
||||||
|
# Try the more std (acc. to RFC2980) LIST NEWSGROUPS first
|
||||||
|
resp, raw_lines = self.longcmd('LIST NEWSGROUPS ' + group_pattern)
|
||||||
|
if resp[:3] != "215":
|
||||||
|
# Now the deprecated XGTITLE. This either raises an error
|
||||||
|
# or succeeds with the same output structure as LIST
|
||||||
|
# NEWSGROUPS.
|
||||||
|
resp, raw_lines = self.longcmd('XGTITLE ' + group_pattern)
|
||||||
|
lines = []
|
||||||
|
for raw_line in raw_lines:
|
||||||
|
match = line_pat.search(raw_line.strip())
|
||||||
|
if match:
|
||||||
|
lines.append(match.group(1, 2))
|
||||||
|
return resp, lines
|
||||||
|
|
||||||
def group(self, name):
|
def group(self, name):
|
||||||
"""Process a GROUP command. Argument:
|
"""Process a GROUP command. Argument:
|
||||||
- group: the group name
|
- group: the group name
|
||||||
|
|
|
@ -163,6 +163,7 @@ David Ely
|
||||||
Jeff Epler
|
Jeff Epler
|
||||||
Tom Epperly
|
Tom Epperly
|
||||||
Stoffel Erasmus
|
Stoffel Erasmus
|
||||||
|
Jürgen A. Erhard
|
||||||
Michael Ernst
|
Michael Ernst
|
||||||
Ben Escoto
|
Ben Escoto
|
||||||
Andy Eskilsson
|
Andy Eskilsson
|
||||||
|
|
|
@ -44,6 +44,9 @@ Extension modules
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- nntplib has two new methods: description and descriptions. They
|
||||||
|
use a more RFC-compliant way of getting a newsgroup description.
|
||||||
|
|
||||||
- Bug #993394. Fix a possible red herring of KeyError in 'threading' being
|
- Bug #993394. Fix a possible red herring of KeyError in 'threading' being
|
||||||
raised during interpreter shutdown from a registered function with atexit
|
raised during interpreter shutdown from a registered function with atexit
|
||||||
when dummy_threading is being used.
|
when dummy_threading is being used.
|
||||||
|
|
Loading…
Reference in New Issue