summaryrefslogtreecommitdiff
path: root/src/mailman/commands/docs/withlist.txt
blob: 7632c726a39561b09a0e5caedd31ca47d7ce918d (plain)
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