summaryrefslogtreecommitdiff
path: root/src/mailman/commands/docs/withlist.rst
blob: 827d246cdc0290f32e2b8143261e66693ecf236c (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
126
127
128
129
130
131
132
133
134
135
136
137
138
==========================
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("""\
    ... def showme(mailing_list):
    ...     print "The list's name is", mailing_list.fqdn_listname
    ...
    ... def displayname(mailing_list):
    ...     print "The list's display name is", mailing_list.display_name
    ... """, file=fp)

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.displayname'
    >>> command.process(args)
    The list's display 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 display name is Aardvark
    The list's display name is Badger
    The list's display name is Badboys

    >>> args.listname = '^bad.*'
    >>> command.process(args)
    The list's display name is Badger
    The list's display 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


IPython
=======

You can use `IPython`_ as the interactive shell by changing certain
configuration variables in the `[shell]` section of your `mailman.cfg` file.
Set `use_ipython` to "yes" to switch to IPython, which must be installed on
your system.

Other configuration variables in the `[shell]` section can be used to
configure other aspects of the interactive shell.  You can change both the
prompt and the banner.


.. Clean up
   >>> sys.path = old_path

.. _`IPython`: http://ipython.org/