summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/lib/libnntplib.tex20
-rw-r--r--Lib/nntplib.py36
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
4 files changed, 60 insertions, 0 deletions
diff --git a/Doc/lib/libnntplib.tex b/Doc/lib/libnntplib.tex
index 8616fb9..9b9217b 100644
--- a/Doc/lib/libnntplib.tex
+++ b/Doc/lib/libnntplib.tex
@@ -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
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.
+
+\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}
\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.
This is an optional NNTP extension, and may not be supported by all
servers.
+
+RFC2980 says ``It is suggested that this extension be deprecated''. Use
+\method{descriptions()} or \method{description()} instead.
\end{methoddesc}
\begin{methoddesc}{xover}{start, end, \optional{file}}
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index 83544b8..d0bd5ad 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -297,6 +297,42 @@ class NNTP:
list[i] = tuple(list[i].split())
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):
"""Process a GROUP command. Argument:
- group: the group name
diff --git a/Misc/ACKS b/Misc/ACKS
index 348949c..071f86e 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -163,6 +163,7 @@ David Ely
Jeff Epler
Tom Epperly
Stoffel Erasmus
+Jürgen A. Erhard
Michael Ernst
Ben Escoto
Andy Eskilsson
diff --git a/Misc/NEWS b/Misc/NEWS
index 4b5fae1..e48309c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -44,6 +44,9 @@ Extension modules
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
raised during interpreter shutdown from a registered function with atexit
when dummy_threading is being used.