1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
==========================
Operating on mailing lists
==========================
The ``withlist`` command is a pretty powerful way to operate on mailing lists
from the command line. This command allows you to interact with a list at a
Python prompt, or process one or more mailing lists through custom made Python
functions.
XXX Test the interactive operation of withlist
Getting detailed help
=====================
Because ``withlist`` is so complex, you need to request detailed help.
::
>>> from mailman.commands.cli_withlist import Withlist
>>> command = Withlist()
>>> class FakeArgs:
... interactive = False
... run = None
... details = True
... listname = []
>>> class FakeParser:
... def error(self, message):
... print message
>>> command.parser = FakeParser()
>>> args = FakeArgs()
>>> command.process(args)
This script provides you with a general framework for interacting with a
mailing list.
...
Running a command
=================
By putting a Python function somewhere on your ``sys.path``, you can have
``withlist`` call that function on a given mailing list. The function takes a
single argument, the mailing list.
::
>>> import os, sys
>>> old_path = sys.path[:]
>>> sys.path.insert(0, config.VAR_DIR)
>>> with open(os.path.join(config.VAR_DIR, 'showme.py'), 'w') as fp:
... print >> fp, """\
... def showme(mailing_list):
... print "The list's name is", mailing_list.fqdn_listname
...
... def realname(mailing_list):
... print "The list's real name is", mailing_list.real_name
... """
If the name of the function is the same as the module, then you only need to
name the function once.
>>> mlist = create_list('aardvark@example.com')
>>> args.details = False
>>> args.run = 'showme'
>>> args.listname = 'aardvark@example.com'
>>> command.process(args)
The list's name is aardvark@example.com
The function's name can also be different than the modules name. In that
case, just give the full module path name to the function you want to call.
>>> args.run = 'showme.realname'
>>> command.process(args)
The list's real name is Aardvark
Multiple lists
==============
You can run a command over more than one list by using a regular expression in
the `listname` argument. To indicate a regular expression is used, the string
must start with a caret.
::
>>> mlist_2 = create_list('badger@example.com')
>>> mlist_3 = create_list('badboys@example.com')
>>> args.listname = '^.*example.com'
>>> command.process(args)
The list's real name is Aardvark
The list's real name is Badger
The list's real name is Badboys
>>> args.listname = '^bad.*'
>>> command.process(args)
The list's real name is Badger
The list's real name is Badboys
>>> args.listname = '^foo'
>>> command.process(args)
Error handling
==============
You get an error if you try to run a function over a non-existent mailing
list.
>>> args.listname = 'mystery@example.com'
>>> command.process(args)
No such list: mystery@example.com
You also get an error if no mailing list is named.
>>> args.listname = None
>>> command.process(args)
--run requires a mailing list name
Clean up
========
>>> sys.path = old_path
|