Merge lp:~barry/mailman.client/bilingual into lp:mailman.client

Proposed by Barry Warsaw
Status: Merged
Merged at revision: 60
Proposed branch: lp:~barry/mailman.client/bilingual
Merge into: lp:mailman.client
Diff against target: 6418 lines (+4561/-1012)
23 files modified
.bzrignore (+3/-0)
MANIFEST.in (+2/-2)
README.rst (+1/-2)
TESTING.rst (+90/-0)
bin/test (+0/-35)
distribute_setup.py (+0/-477)
setup.py (+11/-13)
setup_helpers.py (+20/-19)
src/__init__.py (+1/-1)
src/mailmanclient/NEWS.rst (+6/-2)
src/mailmanclient/README.rst (+3/-4)
src/mailmanclient/__init__.py (+2/-2)
src/mailmanclient/_client.py (+100/-71)
src/mailmanclient/docs/using.rst (+130/-111)
src/mailmanclient/testing/documentation.py (+84/-0)
src/mailmanclient/testing/nose.py (+129/-0)
src/mailmanclient/tests/data/tape.yaml (+3905/-0)
src/mailmanclient/tests/test_docs.py (+0/-127)
src/mailmanclient/tests/test_domain.py (+47/-0)
src/mailmanclient/tests/utils.py (+0/-144)
template.py (+2/-2)
tox.ini (+15/-0)
unittest.cfg (+10/-0)
To merge this branch: bzr merge lp:~barry/mailman.client/bilingual
Reviewer Review Type Date Requested Status
Florian Fuchs Pending
Review via email: mp+245537@code.launchpad.net

Description of the change

mailmanclient's test suite no longer imports from the Mailman 3 code; it only uses the REST API.

It now uses `tox` to run the test suite against multiple versions of Python, and nose2 as the test runner.

Drop the use of distribute since it's been merged with setuptools.

Port to Python 3 (I've tested against 3.4 and 2.7 but I don't have a 2.6, 3.2, or 3.3 environment).

Added support for the new `queues` resource (py3 MM3 branch only; merged RSN).

Removed some unnecessary files and code; cleaned up some other stuff.

README.txt -> README.rst
using.txt -> using.rst
NEWS.txt -> NEWS.rst
Added a TESTING.rst file.

To post a comment you must log in.
Revision history for this message
Florian Fuchs (flo-fuchs) wrote :

Hi Barry,

thank you very much for this change! I ran the tests like described in TESTING.rst and also did some manual testing with fresh checkouts of the core, client and postorius. Worked like a charm.

I talked to Aurélien today about whether to wait with this merge until we have corresponing tests in Postorius and Hyperkitty. But we agreed that we better merge this branch now and then take care of Postorius and HK.

Flo

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2010-12-23 18:07:32 +0000
+++ .bzrignore 2015-01-04 23:44:27 +0000
@@ -1,3 +1,6 @@
1build1build
2dist2dist
3mailman.client.egg-info3mailman.client.egg-info
4.tox
5__pycache__
6*.egg-info
47
=== modified file 'MANIFEST.in'
--- MANIFEST.in 2010-12-23 16:29:39 +0000
+++ MANIFEST.in 2015-01-04 23:44:27 +0000
@@ -1,4 +1,4 @@
1include *.py1include *.py MANIFEST.in
2global-include *.txt2global-include *.txt *.rst *.yaml
3include Makefile3include Makefile
4prune _build4prune _build
55
=== renamed file 'README.txt' => 'README.rst'
--- README.txt 2010-12-26 21:22:12 +0000
+++ README.rst 2015-01-04 23:44:27 +0000
@@ -41,9 +41,8 @@
41You may download the latest version of the package from the Python41You may download the latest version of the package from the Python
42`Cheese Shop`_ or from Launchpad_.42`Cheese Shop`_ or from Launchpad_.
4343
44You can also install it via ``easy_install`` or ``pip``.44You can also install it via ``pip``.
4545
46 % sudo easy_install mailman.client
47 % sudo pip install mailman.client46 % sudo pip install mailman.client
4847
49See the Launchpad project page for access to the Bazaar branch, bug report,48See the Launchpad project page for access to the Bazaar branch, bug report,
5049
=== added file 'TESTING.rst'
--- TESTING.rst 1970-01-01 00:00:00 +0000
+++ TESTING.rst 2015-01-04 23:44:27 +0000
@@ -0,0 +1,90 @@
1======================
2Running the test suite
3======================
4
5The test suite is run with the `tox`_ tool, which allows it to be run against
6multiple versions of Python. There are two modes to the test suite:
7
8 * *Record mode* which is used to record the HTTP traffic against a live
9 Mailman 3 REST server.
10 * *Replay mode* which allows you to run the test suite off-line, without
11 running the REST server.
12
13Whenever you add tests for other parts of the REST API, you need to run the
14suite once in record mode to generate the YAML file of HTTP requests and
15responses.
16
17Then you can run the test suite in replay mode as often as you want, and
18Mailman 3 needn't even be installed on your system.
19
20Since this branch ships with a recording file, you don't need to run in record
21mode to start with.
22
23
24Replay mode
25===========
26
27To run the test suite in replay mode (the default), just run the following::
28
29 $ tox
30
31This will attempt to run the test suite against Python 2.6, 2.7, 3.2, 3.3, and
323.4, or whatever combination of those that are available on your system.
33
34
35Record mode
36===========
37
38Start by branching the Mailman 3 code base, then you should install it into a
39virtual environment. The easiest way to do this is with `tox`::
40
41 $ tox --notest -r
42
43Now, use the virtual environment that `tox` creates to create a template `var`
44directory in the current directory::
45
46 $ .tox/py34/bin/mailman info
47
48Now you need to modify the ``var/etc/mailman.cfg`` configuration file, so that
49it contains the following::
50
51 [devmode]
52 enabled: yes
53 recipient: you@yourdomain.com
54
55 [mta]
56 smtp_port: 9025
57 lmtp_port: 9024
58 incoming: mailman.testing.mta.FakeMTA
59
60 [webservice]
61 port: 9001
62
63Now you can start Mailman 3::
64
65 $ .tox/py34/bin/mailman start
66
67Back in your ``mailmanclient`` branch, run the test suite in record mode::
68
69 $ tox -e record
70
71You should now have an updated recording file (``tape.yaml``).
72
73If you find you need to re-run the test suite, you *must* first stop the
74Mailman REST server, and then delete the ``mailman.db`` file, since it
75contains state that will mess up the ``mailmanclient`` test suite::
76
77 $ cd <mailman3-branch>
78 $ .tox/py34/bin/mailman stop
79 $ rm -f var/data/mailman.db
80 $ .tox/py34/bin/mailman start
81
82 $ cd <mailmanclient-branch>
83 $ tox -e record
84
85Once you're done recording the HTTP traffic, you can stop the Mailman 3 server
86and you won't need it again. It's a good idea to commit the ``tape.yaml``
87changes for other users of your branch.
88
89
90.. _`tox`: https://testrun.org/tox/latest/
091
=== removed directory 'bin'
=== removed file 'bin/test'
--- bin/test 2014-11-24 10:25:10 +0000
+++ bin/test 1970-01-01 00:00:00 +0000
@@ -1,35 +0,0 @@
1#!/usr/bin/env python
2# Copyright (C) 2010-2013 by the Free Software Foundation, Inc.
3#
4# This file is part of mailman.client.
5#
6# mailman.client is free software: you can redistribute it and/or modify it
7# under the terms of the GNU Lesser General Public License as published by the
8# Free Software Foundation, version 3 of the License.
9#
10# mailman.client is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
13# License for more details.
14#
15# You should have received a copy of the GNU Lesser General Public License
16# along with mailman.client. If not, see <http://www.gnu.org/licenses/>.
17
18"""Test runner."""
19
20from __future__ import absolute_import, unicode_literals
21
22__metaclass__ = type
23
24
25import os
26import sys
27import unittest
28
29from mailmanclient.tests.test_docs import additional_tests
30
31
32if __name__ == '__main__':
33 suite = additional_tests()
34 runner = unittest.TextTestRunner(verbosity=2)
35 runner.run(suite)
360
=== removed file 'distribute_setup.py'
--- distribute_setup.py 2010-12-23 16:29:39 +0000
+++ distribute_setup.py 1970-01-01 00:00:00 +0000
@@ -1,477 +0,0 @@
1#!python
2"""Bootstrap distribute installation
3
4If you want to use setuptools in your package's setup.py, just include this
5file in the same directory with it, and add this to the top of your setup.py::
6
7 from distribute_setup import use_setuptools
8 use_setuptools()
9
10If you want to require a specific version of setuptools, set a download
11mirror, or use an alternate download directory, you can do so by supplying
12the appropriate options to ``use_setuptools()``.
13
14This file can also be run as a script to install or upgrade setuptools.
15"""
16import os
17import sys
18import time
19import fnmatch
20import tempfile
21import tarfile
22from distutils import log
23
24try:
25 from site import USER_SITE
26except ImportError:
27 USER_SITE = None
28
29try:
30 import subprocess
31
32 def _python_cmd(*args):
33 args = (sys.executable,) + args
34 return subprocess.call(args) == 0
35
36except ImportError:
37 # will be used for python 2.3
38 def _python_cmd(*args):
39 args = (sys.executable,) + args
40 # quoting arguments if windows
41 if sys.platform == 'win32':
42 def quote(arg):
43 if ' ' in arg:
44 return '"%s"' % arg
45 return arg
46 args = [quote(arg) for arg in args]
47 return os.spawnl(os.P_WAIT, sys.executable, *args) == 0
48
49DEFAULT_VERSION = "0.6.10"
50DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
51SETUPTOOLS_FAKED_VERSION = "0.6c11"
52
53SETUPTOOLS_PKG_INFO = """\
54Metadata-Version: 1.0
55Name: setuptools
56Version: %s
57Summary: xxxx
58Home-page: xxx
59Author: xxx
60Author-email: xxx
61License: xxx
62Description: xxx
63""" % SETUPTOOLS_FAKED_VERSION
64
65
66def _install(tarball):
67 # extracting the tarball
68 tmpdir = tempfile.mkdtemp()
69 log.warn('Extracting in %s', tmpdir)
70 old_wd = os.getcwd()
71 try:
72 os.chdir(tmpdir)
73 tar = tarfile.open(tarball)
74 _extractall(tar)
75 tar.close()
76
77 # going in the directory
78 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
79 os.chdir(subdir)
80 log.warn('Now working in %s', subdir)
81
82 # installing
83 log.warn('Installing Distribute')
84 if not _python_cmd('setup.py', 'install'):
85 log.warn('Something went wrong during the installation.')
86 log.warn('See the error message above.')
87 finally:
88 os.chdir(old_wd)
89
90
91def _build_egg(egg, tarball, to_dir):
92 # extracting the tarball
93 tmpdir = tempfile.mkdtemp()
94 log.warn('Extracting in %s', tmpdir)
95 old_wd = os.getcwd()
96 try:
97 os.chdir(tmpdir)
98 tar = tarfile.open(tarball)
99 _extractall(tar)
100 tar.close()
101
102 # going in the directory
103 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
104 os.chdir(subdir)
105 log.warn('Now working in %s', subdir)
106
107 # building an egg
108 log.warn('Building a Distribute egg in %s', to_dir)
109 _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
110
111 finally:
112 os.chdir(old_wd)
113 # returning the result
114 log.warn(egg)
115 if not os.path.exists(egg):
116 raise IOError('Could not build the egg.')
117
118
119def _do_download(version, download_base, to_dir, download_delay):
120 egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg'
121 % (version, sys.version_info[0], sys.version_info[1]))
122 if not os.path.exists(egg):
123 tarball = download_setuptools(version, download_base,
124 to_dir, download_delay)
125 _build_egg(egg, tarball, to_dir)
126 sys.path.insert(0, egg)
127 import setuptools
128 setuptools.bootstrap_install_from = egg
129
130
131def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
132 to_dir=os.curdir, download_delay=15, no_fake=True):
133 # making sure we use the absolute path
134 to_dir = os.path.abspath(to_dir)
135 was_imported = 'pkg_resources' in sys.modules or \
136 'setuptools' in sys.modules
137 try:
138 try:
139 import pkg_resources
140 if not hasattr(pkg_resources, '_distribute'):
141 if not no_fake:
142 _fake_setuptools()
143 raise ImportError
144 except ImportError:
145 return _do_download(version, download_base, to_dir, download_delay)
146 try:
147 pkg_resources.require("distribute>="+version)
148 return
149 except pkg_resources.VersionConflict:
150 e = sys.exc_info()[1]
151 if was_imported:
152 sys.stderr.write(
153 "The required version of distribute (>=%s) is not available,\n"
154 "and can't be installed while this script is running. Please\n"
155 "install a more recent version first, using\n"
156 "'easy_install -U distribute'."
157 "\n\n(Currently using %r)\n" % (version, e.args[0]))
158 sys.exit(2)
159 else:
160 del pkg_resources, sys.modules['pkg_resources'] # reload ok
161 return _do_download(version, download_base, to_dir,
162 download_delay)
163 except pkg_resources.DistributionNotFound:
164 return _do_download(version, download_base, to_dir,
165 download_delay)
166 finally:
167 if not no_fake:
168 _create_fake_setuptools_pkg_info(to_dir)
169
170def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
171 to_dir=os.curdir, delay=15):
172 """Download distribute from a specified location and return its filename
173
174 `version` should be a valid distribute version number that is available
175 as an egg for download under the `download_base` URL (which should end
176 with a '/'). `to_dir` is the directory where the egg will be downloaded.
177 `delay` is the number of seconds to pause before an actual download
178 attempt.
179 """
180 # making sure we use the absolute path
181 to_dir = os.path.abspath(to_dir)
182 try:
183 from urllib.request import urlopen
184 except ImportError:
185 from urllib2 import urlopen
186 tgz_name = "distribute-%s.tar.gz" % version
187 url = download_base + tgz_name
188 saveto = os.path.join(to_dir, tgz_name)
189 src = dst = None
190 if not os.path.exists(saveto): # Avoid repeated downloads
191 try:
192 log.warn("Downloading %s", url)
193 src = urlopen(url)
194 # Read/write all in one block, so we don't create a corrupt file
195 # if the download is interrupted.
196 data = src.read()
197 dst = open(saveto, "wb")
198 dst.write(data)
199 finally:
200 if src:
201 src.close()
202 if dst:
203 dst.close()
204 return os.path.realpath(saveto)
205
206
207def _patch_file(path, content):
208 """Will backup the file then patch it"""
209 existing_content = open(path).read()
210 if existing_content == content:
211 # already patched
212 log.warn('Already patched.')
213 return False
214 log.warn('Patching...')
215 _rename_path(path)
216 f = open(path, 'w')
217 try:
218 f.write(content)
219 finally:
220 f.close()
221 return True
222
223
224def _same_content(path, content):
225 return open(path).read() == content
226
227def _no_sandbox(function):
228 def __no_sandbox(*args, **kw):
229 try:
230 from setuptools.sandbox import DirectorySandbox
231 def violation(*args):
232 pass
233 DirectorySandbox._old = DirectorySandbox._violation
234 DirectorySandbox._violation = violation
235 patched = True
236 except ImportError:
237 patched = False
238
239 try:
240 return function(*args, **kw)
241 finally:
242 if patched:
243 DirectorySandbox._violation = DirectorySandbox._old
244 del DirectorySandbox._old
245
246 return __no_sandbox
247
248@_no_sandbox
249def _rename_path(path):
250 new_name = path + '.OLD.%s' % time.time()
251 log.warn('Renaming %s into %s', path, new_name)
252 os.rename(path, new_name)
253 return new_name
254
255def _remove_flat_installation(placeholder):
256 if not os.path.isdir(placeholder):
257 log.warn('Unkown installation at %s', placeholder)
258 return False
259 found = False
260 for file in os.listdir(placeholder):
261 if fnmatch.fnmatch(file, 'setuptools*.egg-info'):
262 found = True
263 break
264 if not found:
265 log.warn('Could not locate setuptools*.egg-info')
266 return
267
268 log.warn('Removing elements out of the way...')
269 pkg_info = os.path.join(placeholder, file)
270 if os.path.isdir(pkg_info):
271 patched = _patch_egg_dir(pkg_info)
272 else:
273 patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO)
274
275 if not patched:
276 log.warn('%s already patched.', pkg_info)
277 return False
278 # now let's move the files out of the way
279 for element in ('setuptools', 'pkg_resources.py', 'site.py'):
280 element = os.path.join(placeholder, element)
281 if os.path.exists(element):
282 _rename_path(element)
283 else:
284 log.warn('Could not find the %s element of the '
285 'Setuptools distribution', element)
286 return True
287
288
289def _after_install(dist):
290 log.warn('After install bootstrap.')
291 placeholder = dist.get_command_obj('install').install_purelib
292 _create_fake_setuptools_pkg_info(placeholder)
293
294@_no_sandbox
295def _create_fake_setuptools_pkg_info(placeholder):
296 if not placeholder or not os.path.exists(placeholder):
297 log.warn('Could not find the install location')
298 return
299 pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1])
300 setuptools_file = 'setuptools-%s-py%s.egg-info' % \
301 (SETUPTOOLS_FAKED_VERSION, pyver)
302 pkg_info = os.path.join(placeholder, setuptools_file)
303 if os.path.exists(pkg_info):
304 log.warn('%s already exists', pkg_info)
305 return
306
307 log.warn('Creating %s', pkg_info)
308 f = open(pkg_info, 'w')
309 try:
310 f.write(SETUPTOOLS_PKG_INFO)
311 finally:
312 f.close()
313
314 pth_file = os.path.join(placeholder, 'setuptools.pth')
315 log.warn('Creating %s', pth_file)
316 f = open(pth_file, 'w')
317 try:
318 f.write(os.path.join(os.curdir, setuptools_file))
319 finally:
320 f.close()
321
322def _patch_egg_dir(path):
323 # let's check if it's already patched
324 pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
325 if os.path.exists(pkg_info):
326 if _same_content(pkg_info, SETUPTOOLS_PKG_INFO):
327 log.warn('%s already patched.', pkg_info)
328 return False
329 _rename_path(path)
330 os.mkdir(path)
331 os.mkdir(os.path.join(path, 'EGG-INFO'))
332 pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
333 f = open(pkg_info, 'w')
334 try:
335 f.write(SETUPTOOLS_PKG_INFO)
336 finally:
337 f.close()
338 return True
339
340
341def _before_install():
342 log.warn('Before install bootstrap.')
343 _fake_setuptools()
344
345
346def _under_prefix(location):
347 if 'install' not in sys.argv:
348 return True
349 args = sys.argv[sys.argv.index('install')+1:]
350 for index, arg in enumerate(args):
351 for option in ('--root', '--prefix'):
352 if arg.startswith('%s=' % option):
353 top_dir = arg.split('root=')[-1]
354 return location.startswith(top_dir)
355 elif arg == option:
356 if len(args) > index:
357 top_dir = args[index+1]
358 return location.startswith(top_dir)
359 elif option == '--user' and USER_SITE is not None:
360 return location.startswith(USER_SITE)
361 return True
362
363
364def _fake_setuptools():
365 log.warn('Scanning installed packages')
366 try:
367 import pkg_resources
368 except ImportError:
369 # we're cool
370 log.warn('Setuptools or Distribute does not seem to be installed.')
371 return
372 ws = pkg_resources.working_set
373 try:
374 setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools',
375 replacement=False))
376 except TypeError:
377 # old distribute API
378 setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools'))
379
380 if setuptools_dist is None:
381 log.warn('No setuptools distribution found')
382 return
383 # detecting if it was already faked
384 setuptools_location = setuptools_dist.location
385 log.warn('Setuptools installation detected at %s', setuptools_location)
386
387 # if --root or --preix was provided, and if
388 # setuptools is not located in them, we don't patch it
389 if not _under_prefix(setuptools_location):
390 log.warn('Not patching, --root or --prefix is installing Distribute'
391 ' in another location')
392 return
393
394 # let's see if its an egg
395 if not setuptools_location.endswith('.egg'):
396 log.warn('Non-egg installation')
397 res = _remove_flat_installation(setuptools_location)
398 if not res:
399 return
400 else:
401 log.warn('Egg installation')
402 pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO')
403 if (os.path.exists(pkg_info) and
404 _same_content(pkg_info, SETUPTOOLS_PKG_INFO)):
405 log.warn('Already patched.')
406 return
407 log.warn('Patching...')
408 # let's create a fake egg replacing setuptools one
409 res = _patch_egg_dir(setuptools_location)
410 if not res:
411 return
412 log.warn('Patched done.')
413 _relaunch()
414
415
416def _relaunch():
417 log.warn('Relaunching...')
418 # we have to relaunch the process
419 args = [sys.executable] + sys.argv
420 sys.exit(subprocess.call(args))
421
422
423def _extractall(self, path=".", members=None):
424 """Extract all members from the archive to the current working
425 directory and set owner, modification time and permissions on
426 directories afterwards. `path' specifies a different directory
427 to extract to. `members' is optional and must be a subset of the
428 list returned by getmembers().
429 """
430 import copy
431 import operator
432 from tarfile import ExtractError
433 directories = []
434
435 if members is None:
436 members = self
437
438 for tarinfo in members:
439 if tarinfo.isdir():
440 # Extract directories with a safe mode.
441 directories.append(tarinfo)
442 tarinfo = copy.copy(tarinfo)
443 tarinfo.mode = 448 # decimal for oct 0700
444 self.extract(tarinfo, path)
445
446 # Reverse sort directories.
447 if sys.version_info < (2, 4):
448 def sorter(dir1, dir2):
449 return cmp(dir1.name, dir2.name)
450 directories.sort(sorter)
451 directories.reverse()
452 else:
453 directories.sort(key=operator.attrgetter('name'), reverse=True)
454
455 # Set correct owner, mtime and filemode on directories.
456 for tarinfo in directories:
457 dirpath = os.path.join(path, tarinfo.name)
458 try:
459 self.chown(tarinfo, dirpath)
460 self.utime(tarinfo, dirpath)
461 self.chmod(tarinfo, dirpath)
462 except ExtractError:
463 e = sys.exc_info()[1]
464 if self.errorlevel > 1:
465 raise
466 else:
467 self._dbg(1, "tarfile: %s" % e)
468
469
470def main(argv, version=DEFAULT_VERSION):
471 """Install or upgrade setuptools and EasyInstall"""
472 tarball = download_setuptools()
473 _install(tarball)
474
475
476if __name__ == '__main__':
477 main(sys.argv[1:])
4780
=== modified file 'setup.py'
--- setup.py 2014-11-19 11:03:32 +0000
+++ setup.py 2015-01-04 23:44:27 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2010 by the Free Software Foundation, Inc.1# Copyright (C) 2010-2015 by the Free Software Foundation, Inc.
2#2#
3# This file is part of mailman.client.3# This file is part of mailman.client.
4#4#
@@ -15,34 +15,32 @@
15# You should have received a copy of the GNU Lesser General Public License15# You should have received a copy of the GNU Lesser General Public License
16# along with mailman.client. If not, see <http://www.gnu.org/licenses/>.16# along with mailman.client. If not, see <http://www.gnu.org/licenses/>.
1717
18import distribute_setup
19distribute_setup.use_setuptools()
20
21from setup_helpers import (18from setup_helpers import (
22 description, find_doctests, get_version, long_description, require_python)19 description, find_doctests, get_version, long_description, require_python)
23from setuptools import setup, find_packages20from setuptools import setup, find_packages
2421
2522
26require_python(0x20600f0)23require_python(0x20600f0)
24__version__ = get_version('src/mailmanclient/__init__.py')
2725
2826
29setup(27setup(
30 name='mailmanclient',28 name='mailmanclient',
31 version='1.0.0b1',29 version=__version__,
32 packages=find_packages('src'),30 packages=find_packages('src'),
33 package_dir = {'': 'src'},31 package_dir = {'': 'src'},
34 include_package_data=True,32 include_package_data=True,
35 maintainer='Barry Warsaw',33 maintainer='Barry Warsaw',
36 maintainer_email='barry@list.org',34 maintainer_email='barry@list.org',
37 description=description('README.txt'),35 description=description('README.rst'),
38 long_description=long_description(36 long_description=long_description(
39 'src/mailmanclient/README.txt',37 'src/mailmanclient/README.rst',
40 'src/mailmanclient/NEWS.txt'),38 'src/mailmanclient/NEWS.rst'),
41 license='LGPLv3',39 license='LGPLv3',
42 url='http://launchpad.net/mailman.client',40 url='http://launchpad.net/mailman.client',
43 download_url='https://launchpad.net/mailman.client/+download',41 download_url='https://launchpad.net/mailman.client/+download',
44 # Auto-conversion to Python 3.42 install_requires=[
45 use_2to3=True,43 'httplib2',
46 convert_2to3_doctests=find_doctests(),44 'six',
47 install_requires=['httplib2', 'mock', 'WebTest', ],45 ],
48)46 )
4947
=== modified file 'setup_helpers.py'
--- setup_helpers.py 2014-12-16 11:07:10 +0000
+++ setup_helpers.py 2015-01-04 23:44:27 +0000
@@ -1,23 +1,22 @@
1# Copyright (C) 2009, 2010 by Barry A. Warsaw1# Copyright (C) 2009-2015 by the Free Software Foundation, Inc.
2#2#
3# This file is part of flufl.i18n3# This file is part of mailman.client
4#4#
5# flufl.i18n is free software: you can redistribute it and/or modify it under5# mailman.client is free software: you can redistribute it and/or modify it
6# the terms of the GNU Lesser General Public License as published by the Free6# under the terms of the GNU Lesser General Public License as published by the
7# Software Foundation, version 3 of the License.7# Free Software Foundation, version 3 of the License.
8#8#
9# flufl.i18n is distributed in the hope that it will be useful, but WITHOUT9# mailman.client is distributed in the hope that it will be useful, but WITHOUT
10# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License11# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12# for more details.12# details.
13#13#
14# You should have received a copy of the GNU Lesser General Public License14# You should have received a copy of the GNU Lesser General Public License
15# along with flufl.i18n. If not, see <http://www.gnu.org/licenses/>.15# along with mailman.client. If not, see <http://www.gnu.org/licenses/>.
1616
17"""setup.py helper functions."""17"""setup.py helper functions."""
1818
19from __future__ import absolute_import, unicode_literals19from __future__ import absolute_import, print_function, unicode_literals
20from __future__ import print_function
2120
2221
23__metaclass__ = type22__metaclass__ = type
@@ -33,6 +32,7 @@
33import os32import os
34import re33import re
35import sys34import sys
35import codecs
3636
3737
38DEFAULT_VERSION_RE = re.compile(r'(?P<version>\d+\.\d(?:\.\d+)?)')38DEFAULT_VERSION_RE = re.compile(r'(?P<version>\d+\.\d(?:\.\d+)?)')
@@ -131,9 +131,10 @@
131 """Provide a long description."""131 """Provide a long description."""
132 res = []132 res = []
133 for value in filenames:133 for value in filenames:
134 if value.endswith('.txt'):134 base, ext = os.path.splitext(value)
135 with open(value) as fp:135 if ext in ('.txt', '.rst'):
136 value = fp.read().decode('UTF-8')136 with codecs.open(value, 'r', encoding='utf-8') as fp:
137 value = fp.read()
137 res.append(value)138 res.append(value)
138 if not value.endswith(NL):139 if not value.endswith(NL):
139 res.append('')140 res.append('')
@@ -142,6 +143,6 @@
142143
143def description(filename):144def description(filename):
144 """Provide a short description."""145 """Provide a short description."""
145 with open(filename) as fp:146 with codecs.open(filename, 'r', encoding='utf-8') as fp:
146 for line in fp:147 for line in fp:
147 return line.strip()148 return line.strip()
148149
=== modified file 'src/__init__.py'
--- src/__init__.py 2010-12-23 16:31:21 +0000
+++ src/__init__.py 2015-01-04 23:44:27 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2010 by the Free Software Foundation, Inc.1# Copyright (C) 2010-2015 by the Free Software Foundation, Inc.
2#2#
3# This file is part of mailman.client.3# This file is part of mailman.client.
4#4#
55
=== renamed file 'src/mailmanclient/NEWS.txt' => 'src/mailmanclient/NEWS.rst'
--- src/mailmanclient/NEWS.txt 2014-12-16 11:07:10 +0000
+++ src/mailmanclient/NEWS.rst 2015-01-04 23:44:27 +0000
@@ -2,9 +2,13 @@
2NEWS for mailman.client2NEWS for mailman.client
3=======================3=======================
44
51.0.0b1 (xxxx-xx-xx)51.0.0b1 (2015-xx-xx)
6====================
67
7* Addedd an improved test harness using WebTest. Contributed by Aurélien Bompard.8 * Added an improved test harness using WebTest. Contributed by Aurélien
9 Bompard.
10 * Port to Python 3.4.
11 * Run test suite with `tox`.
812
913
101.0.0a1 (2014-03-15)141.0.0a1 (2014-03-15)
1115
=== renamed file 'src/mailmanclient/README.txt' => 'src/mailmanclient/README.rst'
--- src/mailmanclient/README.txt 2010-12-23 16:34:38 +0000
+++ src/mailmanclient/README.rst 2015-01-04 23:44:27 +0000
@@ -2,7 +2,7 @@
2mailman.client - Python bindings for the Mailman 3 REST API2mailman.client - Python bindings for the Mailman 3 REST API
3===========================================================3===========================================================
44
5This package is called ``mailman.client``. 5This package is called ``mailman.client``.
66
77
8Requirements8Requirements
@@ -38,10 +38,9 @@
38 http://pypi.python.org/pypi/mailman.client38 http://pypi.python.org/pypi/mailman.client
3939
40or from the Launchpad page above. Of course you can also just install it with40or from the Launchpad page above. Of course you can also just install it with
41``pip`` or ``easy_install`` from the command line::41``pip`` from the command line::
4242
43 % sudo pip mailman.client43 % sudo pip mailman.client
44 % sudo easy_install mailman.client
4544
46You can grab the latest development copy of the code using Bazaar, from the45You can grab the latest development copy of the code using Bazaar, from the
47Launchpad home page above. See http://bazaar-vcs.org for details on the46Launchpad home page above. See http://bazaar-vcs.org for details on the
@@ -56,7 +55,7 @@
56Copyright55Copyright
57=========56=========
5857
59Copyright (C) 2010 by The Free Software Foundation, Inc.58Copyright (C) 2010-2015 by The Free Software Foundation, Inc.
6059
61This file is part of mailman.client.60This file is part of mailman.client.
6261
6362
=== modified file 'src/mailmanclient/__init__.py'
--- src/mailmanclient/__init__.py 2014-04-22 14:38:40 +0000
+++ src/mailmanclient/__init__.py 2015-01-04 23:44:27 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2010-2014 by the Free Software Foundation, Inc.1# Copyright (C) 2010-2015 by the Free Software Foundation, Inc.
2#2#
3# This file is part of mailman.client.3# This file is part of mailman.client.
4#4#
@@ -16,7 +16,7 @@
1616
17"""Package contents."""17"""Package contents."""
1818
19from __future__ import absolute_import, unicode_literals19from __future__ import absolute_import, print_function, unicode_literals
2020
21__metaclass__ = type21__metaclass__ = type
22__all__ = [22__all__ = [
2323
=== modified file 'src/mailmanclient/_client.py'
--- src/mailmanclient/_client.py 2014-04-22 12:35:29 +0000
+++ src/mailmanclient/_client.py 2015-01-04 23:44:27 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2010-2014 by the Free Software Foundation, Inc.1# Copyright (C) 2010-2015 by the Free Software Foundation, Inc.
2#2#
3# This file is part of mailman.client.3# This file is part of mailman.client.
4#4#
@@ -25,31 +25,25 @@
25]25]
2626
2727
28import re28import six
29import json29import json
3030
31from base64 import b64encode31from base64 import b64encode
32from httplib2 import Http32from httplib2 import Http
33from mailmanclient import __version__
33from operator import itemgetter34from operator import itemgetter
34from urllib import urlencode35from six.moves.urllib_error import HTTPError
35from urllib2 import HTTPError36from six.moves.urllib_parse import urlencode, urljoin
36from urlparse import urljoin
37
38
39from mailmanclient import __version__
4037
4138
42DEFAULT_PAGE_ITEM_COUNT = 5039DEFAULT_PAGE_ITEM_COUNT = 50
4340
4441
45class MailmanConnectionError(Exception):42class MailmanConnectionError(Exception):
46
47 """Custom Exception to catch connection errors."""43 """Custom Exception to catch connection errors."""
48 pass
4944
5045
51class _Connection:46class _Connection:
52
53 """A connection to the REST client."""47 """A connection to the REST client."""
5448
55 def __init__(self, baseurl, name=None, password=None):49 def __init__(self, baseurl, name=None, password=None):
@@ -74,7 +68,7 @@
74 self.basic_auth = None68 self.basic_auth = None
75 else:69 else:
76 auth = '{0}:{1}'.format(name, password)70 auth = '{0}:{1}'.format(name, password)
77 self.basic_auth = b64encode(auth)71 self.basic_auth = b64encode(auth.encode('utf-8')).decode('utf-8')
7872
79 def call(self, path, data=None, method=None):73 def call(self, path, data=None, method=None):
80 """Make a call to the Mailman REST API.74 """Make a call to the Mailman REST API.
@@ -93,7 +87,7 @@
93 """87 """
94 headers = {88 headers = {
95 'User-Agent': 'GNU Mailman REST client v{0}'.format(__version__),89 'User-Agent': 'GNU Mailman REST client v{0}'.format(__version__),
96 }90 }
97 if data is not None:91 if data is not None:
98 data = urlencode(data, doseq=True)92 data = urlencode(data, doseq=True)
99 headers['Content-Type'] = 'application/x-www-form-urlencoded'93 headers['Content-Type'] = 'application/x-www-form-urlencoded'
@@ -115,7 +109,8 @@
115 if len(content) == 0:109 if len(content) == 0:
116 return response, None110 return response, None
117 # XXX Work around for http://bugs.python.org/issue10038111 # XXX Work around for http://bugs.python.org/issue10038
118 content = unicode(content)112 if isinstance(content, six.binary_type):
113 content = content.decode('utf-8')
119 return response, json.loads(content)114 return response, json.loads(content)
120 except HTTPError:115 except HTTPError:
121 raise116 raise
@@ -124,7 +119,6 @@
124119
125120
126class Client:121class Client:
127
128 """Access the Mailman REST API root."""122 """Access the Mailman REST API root."""
129123
130 def __init__(self, baseurl, name=None, password=None):124 def __init__(self, baseurl, name=None, password=None):
@@ -144,13 +138,21 @@
144138
145 @property139 @property
146 def system(self):140 def system(self):
147 return self._connection.call('system')[1]141 return self._connection.call('system/versions')[1]
148142
149 @property143 @property
150 def preferences(self):144 def preferences(self):
151 return _Preferences(self._connection, 'system/preferences')145 return _Preferences(self._connection, 'system/preferences')
152146
153 @property147 @property
148 def queues(self):
149 response, content = self._connection.call('queues')
150 queues = {}
151 for entry in content['entries']:
152 queues[entry['name']] = _Queue(self._connection, entry)
153 return queues
154
155 @property
154 def lists(self):156 def lists(self):
155 response, content = self._connection.call('lists')157 response, content = self._connection.call('lists')
156 if 'entries' not in content:158 if 'entries' not in content:
@@ -209,9 +211,8 @@
209 return _Domain(self._connection, response['location'])211 return _Domain(self._connection, response['location'])
210212
211 def delete_domain(self, mail_host):213 def delete_domain(self, mail_host):
212 response, content = self._connection.call('domains/{0}'214 response, content = self._connection.call(
213 .format(mail_host),215 'domains/{0}'.format(mail_host), None, 'DELETE')
214 None, 'DELETE')
215216
216 def get_domain(self, mail_host=None, web_host=None):217 def get_domain(self, mail_host=None, web_host=None):
217 """Get domain by its mail_host or its web_host."""218 """Get domain by its mail_host or its web_host."""
@@ -225,13 +226,13 @@
225 # in Mailman3Alpha8226 # in Mailman3Alpha8
226 if domain.base_url == web_host:227 if domain.base_url == web_host:
227 return domain228 return domain
228 break
229 else:229 else:
230 return None230 return None
231231
232 def create_user(self, email, password, display_name=''):232 def create_user(self, email, password, display_name=''):
233 response, content = self._connection.call(233 response, content = self._connection.call(
234 'users', dict(email=email, password=password,234 'users', dict(email=email,
235 password=password,
235 display_name=display_name))236 display_name=display_name))
236 return _User(self._connection, response['location'])237 return _User(self._connection, response['location'])
237238
@@ -319,9 +320,7 @@
319 def __init__(self, connection, url, data=None):320 def __init__(self, connection, url, data=None):
320 self._connection = connection321 self._connection = connection
321 self._url = url322 self._url = url
322 self._info = None323 self._info = data
323 if data is not None:
324 self._info = data
325324
326 def __repr__(self):325 def __repr__(self):
327 return '<List "{0}">'.format(self.fqdn_listname)326 return '<List "{0}">'.format(self.fqdn_listname)
@@ -409,8 +408,7 @@
409408
410 @property409 @property
411 def held(self):410 def held(self):
412 """Return a list of dicts with held message information.411 """Return a list of dicts with held message information."""
413 """
414 response, content = self._connection.call(412 response, content = self._connection.call(
415 'lists/{0}/held'.format(self.fqdn_listname), None, 'GET')413 'lists/{0}/held'.format(self.fqdn_listname), None, 'GET')
416 if 'entries' not in content:414 if 'entries' not in content:
@@ -429,8 +427,7 @@
429427
430 @property428 @property
431 def requests(self):429 def requests(self):
432 """Return a list of dicts with subscription requests.430 """Return a list of dicts with subscription requests."""
433 """
434 response, content = self._connection.call(431 response, content = self._connection.call(
435 'lists/{0}/requests'.format(self.fqdn_listname), None, 'GET')432 'lists/{0}/requests'.format(self.fqdn_listname), None, 'GET')
436 if 'entries' not in content:433 if 'entries' not in content:
@@ -479,30 +476,26 @@
479 :param action: Action to perform on held message.476 :param action: Action to perform on held message.
480 :type action: String.477 :type action: String.
481 """478 """
482 path = 'lists/{0}/held/{1}'.format(self.fqdn_listname,479 path = 'lists/{0}/held/{1}'.format(
483 str(request_id))480 self.fqdn_listname, str(request_id))
484 response, content = self._connection.call(path, dict(action=action),481 response, content = self._connection.call(
485 'POST')482 path, dict(action=action), 'POST')
486 return response483 return response
487484
488 def discard_message(self, request_id):485 def discard_message(self, request_id):
489 """Shortcut for moderate_message.486 """Shortcut for moderate_message."""
490 """
491 return self.moderate_message(request_id, 'discard')487 return self.moderate_message(request_id, 'discard')
492488
493 def reject_message(self, request_id):489 def reject_message(self, request_id):
494 """Shortcut for moderate_message.490 """Shortcut for moderate_message."""
495 """
496 return self.moderate_message(request_id, 'reject')491 return self.moderate_message(request_id, 'reject')
497492
498 def defer_message(self, request_id):493 def defer_message(self, request_id):
499 """Shortcut for moderate_message.494 """Shortcut for moderate_message."""
500 """
501 return self.moderate_message(request_id, 'defer')495 return self.moderate_message(request_id, 'defer')
502496
503 def accept_message(self, request_id):497 def accept_message(self, request_id):
504 """Shortcut for moderate_message.498 """Shortcut for moderate_message."""
505 """
506 return self.moderate_message(request_id, 'accept')499 return self.moderate_message(request_id, 'accept')
507500
508 def get_member(self, email):501 def get_member(self, email):
@@ -516,7 +509,6 @@
516 for member in self.members:509 for member in self.members:
517 if member.email == email:510 if member.email == email:
518 return member511 return member
519 break
520 else:512 else:
521 raise ValueError('%s is not a member address of %s' %513 raise ValueError('%s is not a member address of %s' %
522 (email, self.fqdn_listname))514 (email, self.fqdn_listname))
@@ -534,7 +526,7 @@
534 list_id=self.list_id,526 list_id=self.list_id,
535 subscriber=address,527 subscriber=address,
536 display_name=display_name,528 display_name=display_name,
537 )529 )
538 response, content = self._connection.call('members', data)530 response, content = self._connection.call('members', data)
539 return _Member(self._connection, response['location'])531 return _Member(self._connection, response['location'])
540532
@@ -568,8 +560,7 @@
568 self._preferences = None560 self._preferences = None
569561
570 def __repr__(self):562 def __repr__(self):
571 return '<Member "{0}" on "{1}">'.format(563 return '<Member "{0}" on "{1}">'.format(self.email, self.list_id)
572 self.email, self.list_id)
573564
574 def _get_info(self):565 def _get_info(self):
575 if self._info is None:566 if self._info is None:
@@ -634,8 +625,7 @@
634 self._cleartext_password = None625 self._cleartext_password = None
635626
636 def __repr__(self):627 def __repr__(self):
637 return '<User "{0}" ({1})>'.format(628 return '<User "{0}" ({1})>'.format(self.display_name, self.user_id)
638 self.display_name, self.user_id)
639629
640 def _get_info(self):630 def _get_info(self):
641 if self._info is None:631 if self._info is None:
@@ -685,8 +675,8 @@
685 if self._subscriptions is None:675 if self._subscriptions is None:
686 subscriptions = []676 subscriptions = []
687 for address in self.addresses:677 for address in self.addresses:
688 response, content = self._connection.call('members/find',678 response, content = self._connection.call(
689 data={'subscriber': address})679 'members/find', data={'subscriber': address})
690 try:680 try:
691 for entry in content['entries']:681 for entry in content['entries']:
692 subscriptions.append(_Member(self._connection,682 subscriptions.append(_Member(self._connection,
@@ -713,7 +703,7 @@
713 return self._preferences703 return self._preferences
714704
715 def add_address(self, email):705 def add_address(self, email):
716 # Adds another email adress to the user record and returns an 706 # Adds another email adress to the user record and returns an
717 # _Address object.707 # _Address object.
718 url = '{0}/addresses'.format(self._url)708 url = '{0}/addresses'.format(self._url)
719 self._connection.call(url, {'email': email})709 self._connection.call(url, {'email': email})
@@ -723,8 +713,8 @@
723 if self._cleartext_password is not None:713 if self._cleartext_password is not None:
724 data['cleartext_password'] = self._cleartext_password714 data['cleartext_password'] = self._cleartext_password
725 self.cleartext_password = None715 self.cleartext_password = None
726 response, content = self._connection.call(self._url,716 response, content = self._connection.call(
727 data, method='PATCH')717 self._url, data, method='PATCH')
728 self._info = None718 self._info = None
729719
730 def delete(self):720 def delete(self):
@@ -741,8 +731,8 @@
741731
742 def _get_addresses(self):732 def _get_addresses(self):
743 if self._addresses is None:733 if self._addresses is None:
744 response, content = self._connection.call('users/{0}/addresses'734 response, content = self._connection.call(
745 .format(self._user_id))735 'users/{0}/addresses'.format(self._user_id))
746 if 'entries' not in content:736 if 'entries' not in content:
747 self._addresses = []737 self._addresses = []
748 self._addresses = content['entries']738 self._addresses = content['entries']
@@ -795,13 +785,13 @@
795 return self._preferences785 return self._preferences
796786
797 def verify(self):787 def verify(self):
798 self._connection.call('addresses/{0}/verify'788 self._connection.call('addresses/{0}/verify'.format(
799 .format(self._address['email']), method='POST')789 self._address['email']), method='POST')
800 self._info = None790 self._info = None
801791
802 def unverify(self):792 def unverify(self):
803 self._connection.call('addresses/{0}/unverify'793 self._connection.call('addresses/{0}/unverify'.format(
804 .format(self._address['email']), method='POST')794 self._address['email']), method='POST')
805 self._info = None795 self._info = None
806796
807797
@@ -812,9 +802,13 @@
812 'hide_address',802 'hide_address',
813 'preferred_language',803 'preferred_language',
814 'receive_list_copy',804 'receive_list_copy',
815 'receive_own_postings', )805 'receive_own_postings',
806 )
816807
817PREF_READ_ONLY_ATTRS = ('http_etag', 'self_link')808PREF_READ_ONLY_ATTRS = (
809 'http_etag',
810 'self_link',
811 )
818812
819813
820class _Preferences:814class _Preferences:
@@ -843,7 +837,7 @@
843 return self._preferences[key]837 return self._preferences[key]
844838
845 def __iter__(self):839 def __iter__(self):
846 for key in self._preferences.keys():840 for key in self._preferences:
847 yield self._preferences[key]841 yield self._preferences[key]
848842
849 def __len__(self):843 def __len__(self):
@@ -861,18 +855,34 @@
861 def save(self):855 def save(self):
862 data = {}856 data = {}
863 for key in self._preferences:857 for key in self._preferences:
864 if key not in PREF_READ_ONLY_ATTRS and self._preferences[key] is not None:858 if (key not in PREF_READ_ONLY_ATTRS
859 and self._preferences[key] is not None):
865 data[key] = self._preferences[key]860 data[key] = self._preferences[key]
866 response, content = self._connection.call(self._url, data, 'PATCH')861 response, content = self._connection.call(self._url, data, 'PATCH')
867862
868863
869LIST_READ_ONLY_ATTRS = ('bounces_address', 'created_at', 'digest_last_sent_at',864LIST_READ_ONLY_ATTRS = (
870 'fqdn_listname', 'http_etag', 'mail_host',865 'bounces_address',
871 'join_address', 'last_post_at', 'leave_address',866 'created_at',
872 'list_id', 'list_name', 'next_digest_number',867 'digest_last_sent_at',
873 'no_reply_address', 'owner_address', 'post_id',868 'fqdn_listname',
874 'posting_address', 'request_address', 'scheme',869 'http_etag',
875 'volume', 'web_host',)870 'join_address',
871 'last_post_at',
872 'leave_address',
873 'list_id',
874 'list_name',
875 'mail_host',
876 'next_digest_number',
877 'no_reply_address',
878 'owner_address',
879 'post_id',
880 'posting_address',
881 'request_address',
882 'scheme',
883 'volume',
884 'web_host',
885 )
876886
877887
878class _Settings:888class _Settings:
@@ -892,7 +902,7 @@
892 self._info = content902 self._info = content
893903
894 def __iter__(self):904 def __iter__(self):
895 for key in self._info.keys():905 for key in self._info:
896 yield key906 yield key
897907
898 def __getitem__(self, key):908 def __getitem__(self, key):
@@ -949,8 +959,8 @@
949 def _create_page(self):959 def _create_page(self):
950 self._entries = []960 self._entries = []
951 # create url961 # create url
952 path = '{0}?count={1}&page={2}'.format(self._path, self._count,962 path = '{0}?count={1}&page={2}'.format(
953 self._page)963 self._path, self._count, self._page)
954 response, content = self._connection.call(path)964 response, content = self._connection.call(path)
955 if 'entries' in content:965 if 'entries' in content:
956 for entry in content['entries']:966 for entry in content['entries']:
@@ -973,3 +983,22 @@
973 self._page -= 1983 self._page -= 1
974 self._create_page()984 self._create_page()
975 return self985 return self
986
987
988class _Queue:
989 def __init__(self, connection, entry):
990 self._connection = connection
991 self.name = entry['name']
992 self.url = entry['self_link']
993 self.directory = entry['directory']
994
995 def __repr__(self):
996 return '<Queue: {}>'.format(self.name)
997
998 def inject(self, list_id, text):
999 self._connection.call(self.url, dict(list_id=list_id, text=text))
1000
1001 @property
1002 def files(self):
1003 response, content = self._connection.call(self.url)
1004 return content['files']
9761005
=== renamed file 'src/mailmanclient/docs/using.txt' => 'src/mailmanclient/docs/using.rst'
--- src/mailmanclient/docs/using.txt 2014-11-18 15:08:41 +0000
+++ src/mailmanclient/docs/using.rst 2015-01-04 23:44:27 +0000
@@ -2,13 +2,6 @@
2Mailman REST client2Mailman REST client
3===================3===================
44
5 >>> import os
6 >>> import time
7 >>> import smtplib
8 >>> import subprocess
9
10 >>> from mock import patch
11
12This is the official Python bindings for the GNU Mailman REST API. In order5This is the official Python bindings for the GNU Mailman REST API. In order
13to talk to Mailman, the engine's REST server must be running. You begin by6to talk to Mailman, the engine's REST server must be running. You begin by
14instantiating a client object to access the root of the REST hierarchy,7instantiating a client object to access the root of the REST hierarchy,
@@ -23,7 +16,7 @@
23 http_etag: "..."16 http_etag: "..."
24 mailman_version: GNU Mailman 3.0... (...)17 mailman_version: GNU Mailman 3.0... (...)
25 python_version: ...18 python_version: ...
26 self_link: http://localhost:9001/3.0/system19 self_link: http://localhost:9001/3.0/system/versions
2720
28To start with, there are no known mailing lists.21To start with, there are no known mailing lists.
2922
@@ -47,15 +40,15 @@
47 ... contact_address='admin@example.com')40 ... contact_address='admin@example.com')
48 >>> example_dot_com41 >>> example_dot_com
49 <Domain "example.com">42 <Domain "example.com">
50 >>> print example_dot_com.base_url43 >>> print(example_dot_com.base_url)
51 http://example.com44 http://example.com
52 >>> print example_dot_com.contact_address45 >>> print(example_dot_com.contact_address)
53 admin@example.com46 admin@example.com
54 >>> print example_dot_com.description47 >>> print(example_dot_com.description)
55 None48 None
56 >>> print example_dot_com.mail_host49 >>> print(example_dot_com.mail_host)
57 example.com50 example.com
58 >>> print example_dot_com.url_host51 >>> print(example_dot_com.url_host)
59 example.com52 example.com
6053
61You can also get an existing domain independently using its mail host.54You can also get an existing domain independently using its mail host.
@@ -63,7 +56,7 @@
63 >>> example = client.get_domain('example.com')56 >>> example = client.get_domain('example.com')
64 >>> example57 >>> example
65 <Domain "example.com">58 <Domain "example.com">
66 >>> print example_dot_com.base_url59 >>> print(example_dot_com.base_url)
67 http://example.com60 http://example.com
6861
69Additionally you can get an existing domain using its web host.62Additionally you can get an existing domain using its web host.
@@ -71,16 +64,9 @@
71 >>> example = client.get_domain(web_host='http://example.com')64 >>> example = client.get_domain(web_host='http://example.com')
72 >>> example65 >>> example
73 <Domain "example.com">66 <Domain "example.com">
74 >>> print example_dot_com.base_url67 >>> print(example_dot_com.base_url)
75 http://example.com68 http://example.com
7669
77But you cannot retrieve a non-existent domain.
78
79 >>> client.get_domain('example.org')
80 Traceback (most recent call last):
81 ...
82 HTTPError: HTTP Error 404: 404 Not Found
83
84After creating a few more domains, we can print the list of all domains.70After creating a few more domains, we can print the list of all domains.
8571
86 >>> client.create_domain('example.net')72 >>> client.create_domain('example.net')
@@ -88,7 +74,7 @@
88 >>> client.create_domain('example.org')74 >>> client.create_domain('example.org')
89 <Domain "example.org">75 <Domain "example.org">
90 >>> for mail_host in client.domains:76 >>> for mail_host in client.domains:
91 ... print mail_host77 ... print(mail_host)
92 <Domain "example.com">78 <Domain "example.com">
93 <Domain "example.net">79 <Domain "example.net">
94 <Domain "example.org">80 <Domain "example.org">
@@ -97,7 +83,7 @@
9783
98 >>> client.delete_domain('example.org')84 >>> client.delete_domain('example.org')
99 >>> for mail_host in client.domains:85 >>> for mail_host in client.domains:
100 ... print mail_host86 ... print(mail_host)
101 <Domain "example.com">87 <Domain "example.com">
102 <Domain "example.net">88 <Domain "example.net">
10389
@@ -110,13 +96,13 @@
110 >>> test_one = example.create_list('test-one')96 >>> test_one = example.create_list('test-one')
111 >>> test_one97 >>> test_one
112 <List "test-one@example.com">98 <List "test-one@example.com">
113 >>> print test_one.fqdn_listname99 >>> print(test_one.fqdn_listname)
114 test-one@example.com100 test-one@example.com
115 >>> print test_one.mail_host101 >>> print(test_one.mail_host)
116 example.com102 example.com
117 >>> print test_one.list_name103 >>> print(test_one.list_name)
118 test-one104 test-one
119 >>> print test_one.display_name105 >>> print(test_one.display_name)
120 Test-one106 Test-one
121107
122You can also retrieve the mailing list after the fact.108You can also retrieve the mailing list after the fact.
@@ -137,7 +123,7 @@
137 <List "test-three@example.com">123 <List "test-three@example.com">
138124
139 >>> for mlist in client.lists:125 >>> for mlist in client.lists:
140 ... print mlist126 ... print(mlist)
141 <List "test-one@example.com">127 <List "test-one@example.com">
142 <List "test-two@example.com">128 <List "test-two@example.com">
143 <List "test-three@example.net">129 <List "test-three@example.net">
@@ -151,21 +137,22 @@
151 >>> len(page)137 >>> len(page)
152 2138 2
153 >>> for m_list in page:139 >>> for m_list in page:
154 ... print m_list140 ... print(m_list)
155 <List "test-one@example.com">141 <List "test-one@example.com">
156 <List "test-two@example.com">142 <List "test-two@example.com">
157 >>> page = page.next143 >>> page = page.next
158 >>> page.nr144 >>> page.nr
159 2145 2
160 >>> for m_list in page:146 >>> for m_list in page:
161 ... print m_list147 ... print(m_list)
162 <List "test-three@example.net">148 <List "test-three@example.net">
163 <List "test-three@example.com">149 <List "test-three@example.com">
164150
165If you only want to know all lists for a specific domain, use the domain object.151If you only want to know all lists for a specific domain, use the domain
152object.
166153
167 >>> for mlist in example.lists:154 >>> for mlist in example.lists:
168 ... print mlist155 ... print(mlist)
169 <List "test-one@example.com">156 <List "test-one@example.com">
170 <List "test-three@example.com">157 <List "test-three@example.com">
171 <List "test-two@example.com">158 <List "test-two@example.com">
@@ -180,7 +167,7 @@
180 >>> client.delete_list('test-three@example.com')167 >>> client.delete_list('test-three@example.com')
181168
182 >>> for mlist in client.lists:169 >>> for mlist in client.lists:
183 ... print mlist170 ... print(mlist)
184 <List "test-one@example.com">171 <List "test-one@example.com">
185 <List "test-two@example.com">172 <List "test-two@example.com">
186173
@@ -217,7 +204,7 @@
217name, then by email address.204name, then by email address.
218205
219 >>> for member in client.members:206 >>> for member in client.members:
220 ... print member207 ... print(member)
221 <Member "anna@example.com" on "test-one.example.com">208 <Member "anna@example.com" on "test-one.example.com">
222 <Member "bill@example.com" on "test-one.example.com">209 <Member "bill@example.com" on "test-one.example.com">
223 <Member "anna@example.com" on "test-two.example.com">210 <Member "anna@example.com" on "test-two.example.com">
@@ -226,7 +213,7 @@
226We can also view the memberships for a single mailing list.213We can also view the memberships for a single mailing list.
227214
228 >>> for member in test_one.members:215 >>> for member in test_one.members:
229 ... print member216 ... print(member)
230 <Member "anna@example.com" on "test-one.example.com">217 <Member "anna@example.com" on "test-one.example.com">
231 <Member "bill@example.com" on "test-one.example.com">218 <Member "bill@example.com" on "test-one.example.com">
232219
@@ -236,7 +223,7 @@
236 >>> page.nr223 >>> page.nr
237 1224 1
238 >>> for member in page:225 >>> for member in page:
239 ... print member226 ... print(member)
240 <Member "anna@example.com" on "test-one.example.com">227 <Member "anna@example.com" on "test-one.example.com">
241 <Member "bill@example.com" on "test-one.example.com">228 <Member "bill@example.com" on "test-one.example.com">
242229
@@ -244,7 +231,7 @@
244 >>> page.nr231 >>> page.nr
245 2232 2
246 >>> for member in page:233 >>> for member in page:
247 ... print member234 ... print(member)
248 <Member "anna@example.com" on "test-two.example.com">235 <Member "anna@example.com" on "test-two.example.com">
249 <Member "cris@example.com" on "test-two.example.com">236 <Member "cris@example.com" on "test-two.example.com">
250237
@@ -252,13 +239,13 @@
252 >>> page.nr239 >>> page.nr
253 1240 1
254 >>> for member in page:241 >>> for member in page:
255 ... print member242 ... print(member)
256 <Member "anna@example.com" on "test-one.example.com">243 <Member "anna@example.com" on "test-one.example.com">
257 >>> page = page.next244 >>> page = page.next
258 >>> page.nr245 >>> page.nr
259 2246 2
260 >>> for member in page:247 >>> for member in page:
261 ... print member248 ... print(member)
262 <Member "bill@example.com" on "test-one.example.com">249 <Member "bill@example.com" on "test-one.example.com">
263250
264We can get a single membership too.251We can get a single membership too.
@@ -266,7 +253,7 @@
266 >>> cris_test_two = test_two.get_member('cris@example.com')253 >>> cris_test_two = test_two.get_member('cris@example.com')
267 >>> cris_test_two254 >>> cris_test_two
268 <Member "cris@example.com" on "test-two.example.com">255 <Member "cris@example.com" on "test-two.example.com">
269 >>> print cris_test_two.role256 >>> print(cris_test_two.role)
270 member257 member
271258
272A membership can also be retrieved without instantiating the list object first:259A membership can also be retrieved without instantiating the list object first:
@@ -277,24 +264,24 @@
277A membership has preferences.264A membership has preferences.
278265
279 >>> prefs = cris_test_two.preferences266 >>> prefs = cris_test_two.preferences
280 >>> print prefs['delivery_mode']267 >>> print(prefs['delivery_mode'])
281 regular268 regular
282 >>> print prefs['acknowledge_posts']269 >>> print(prefs['acknowledge_posts'])
283 None270 None
284 >>> print prefs['delivery_status']271 >>> print(prefs['delivery_status'])
285 None272 None
286 >>> print prefs['hide_address']273 >>> print(prefs['hide_address'])
287 None274 None
288 >>> print prefs['preferred_language']275 >>> print(prefs['preferred_language'])
289 None276 None
290 >>> print prefs['receive_list_copy']277 >>> print(prefs['receive_list_copy'])
291 None278 None
292 >>> print prefs['receive_own_postings']279 >>> print(prefs['receive_own_postings'])
293 None280 None
294281
295The membership object's ``user`` attribute will return a User object:282The membership object's ``user`` attribute will return a User object:
296283
297 >>> cris_test_two.user 284 >>> cris_test_two.user
298 <User "Cris" (...)>285 <User "Cris" (...)>
299286
300If you use an address which is not a member of test_two `ValueError` is raised:287If you use an address which is not a member of test_two `ValueError` is raised:
@@ -302,15 +289,17 @@
302 >>> test_two.unsubscribe('nomember@example.com')289 >>> test_two.unsubscribe('nomember@example.com')
303 Traceback (most recent call last):290 Traceback (most recent call last):
304 ...291 ...
305 ValueError: nomember@example.com is not a member address of test-two@example.com292 ValueError: nomember@example.com is not a member address of
293 test-two@example.com
306294
307After a while, Anna decides to unsubscribe from the Test One mailing list,295After a while, Anna decides to unsubscribe from the Test One mailing list,
308though she keeps her Test Two membership active.296though she keeps her Test Two membership active.
309297
298 >>> import time
310 >>> time.sleep(2)299 >>> time.sleep(2)
311 >>> test_one.unsubscribe('anna@example.com')300 >>> test_one.unsubscribe('anna@example.com')
312 >>> for member in client.members:301 >>> for member in client.members:
313 ... print member302 ... print(member)
314 <Member "bill@example.com" on "test-one.example.com">303 <Member "bill@example.com" on "test-one.example.com">
315 <Member "anna@example.com" on "test-two.example.com">304 <Member "anna@example.com" on "test-two.example.com">
316 <Member "cris@example.com" on "test-two.example.com">305 <Member "cris@example.com" on "test-two.example.com">
@@ -319,16 +308,19 @@
319308
320 >>> cris_test_two.unsubscribe()309 >>> cris_test_two.unsubscribe()
321 >>> for member in client.members:310 >>> for member in client.members:
322 ... print member311 ... print(member)
323 <Member "bill@example.com" on "test-one.example.com">312 <Member "bill@example.com" on "test-one.example.com">
324 <Member "anna@example.com" on "test-two.example.com">313 <Member "anna@example.com" on "test-two.example.com">
325314
326If you try to unsubscribe an address which is not a member address `ValueError` is raised:315If you try to unsubscribe an address which is not a member address
316`ValueError` is raised:
327317
328 >>> test_one.unsubscribe('nomember@example.com')318 >>> test_one.unsubscribe('nomember@example.com')
329 Traceback (most recent call last):319 Traceback (most recent call last):
330 ...320 ...
331 ValueError: nomember@example.com is not a member address of test-one@example.com321 ValueError: nomember@example.com is not a member address of
322 test-one@example.com
323
332324
333Non-Members325Non-Members
334===========326===========
@@ -347,13 +339,15 @@
347When someone tries to send a message to the list and they are not a339When someone tries to send a message to the list and they are not a
348subscriber, they get added to the nonmember list.340subscriber, they get added to the nonmember list.
349341
342
350Users343Users
351=====344=====
352345
353Users are people with one or more list memberhips. To get a list of all users, access the clients user property.346Users are people with one or more list memberships. To get a list of all users,
347access the clients user property.
354348
355 >>> for user in client.users:349 >>> for user in client.users:
356 ... print user350 ... print(user)
357 <User "..." (...)>351 <User "..." (...)>
358 <User "..." (...)>352 <User "..." (...)>
359 <User "..." (...)>353 <User "..." (...)>
@@ -365,7 +359,7 @@
365 1359 1
366360
367 >>> for user in page:361 >>> for user in page:
368 ... print user362 ... print(user)
369 <User "Anna" (...)>363 <User "Anna" (...)>
370 <User "Bill" (...)>364 <User "Bill" (...)>
371365
@@ -376,7 +370,7 @@
376 2370 2
377371
378 >>> for user in page:372 >>> for user in page:
379 ... print user373 ... print(user)
380 <User "Cris" (...)>374 <User "Cris" (...)>
381375
382 >>> page = page.previous376 >>> page = page.previous
@@ -384,34 +378,34 @@
384 1378 1
385379
386 >>> for user in page:380 >>> for user in page:
387 ... print user381 ... print(user)
388 <User "Anna" (...)>382 <User "Anna" (...)>
389 <User "Bill" (...)>383 <User "Bill" (...)>
390384
391A single user can be retrieved using their email address.385A single user can be retrieved using their email address.
392386
393 >>> cris = client.get_user('cris@example.com')387 >>> cris = client.get_user('cris@example.com')
394 >>> print cris.display_name388 >>> print(cris.display_name)
395 Cris389 Cris
396390
397Every user has a list of one or more addresses.391Every user has a list of one or more addresses.
398392
399 >>> for address in cris.addresses:393 >>> for address in cris.addresses:
400 ... print address394 ... print(address)
401 ... print address.display_name395 ... print(address.display_name)
402 ... print address.registered_on396 ... print(address.registered_on)
403 cris@example.com397 cris@example.com
404 Cris398 Cris
405 ...399 ...
406 400
407Multiple addresses can be assigned to a user record:401Multiple addresses can be assigned to a user record:
408402
409 >>> cris.add_address('cris.person@example.org')403 >>> cris.add_address('cris.person@example.org')
410 >>> print client.get_address('cris.person@example.org')404 >>> print(client.get_address('cris.person@example.org'))
411 cris.person@example.org405 cris.person@example.org
412406
413 >>> for address in cris.addresses:407 >>> for address in cris.addresses:
414 ... print address408 ... print(address)
415 cris.person@example.org409 cris.person@example.org
416 cris@example.com410 cris@example.com
417411
@@ -422,14 +416,14 @@
422Addresses can be accessed directly:416Addresses can be accessed directly:
423417
424 >>> address = client.get_address('cris@example.com')418 >>> address = client.get_address('cris@example.com')
425 >>> print address419 >>> print(address)
426 cris@example.com420 cris@example.com
427 >>> print address.display_name421 >>> print(address.display_name)
428 Cris422 Cris
429423
430The address has not been verified:424The address has not been verified:
431425
432 >>> print address.verified_on is None426 >>> print(address.verified_on is None)
433 True427 True
434428
435But that can be done via the address object:429But that can be done via the address object:
@@ -451,9 +445,9 @@
451 ... display_name='Ler')445 ... display_name='Ler')
452 <User "Ler" (...)>446 <User "Ler" (...)>
453 >>> ler = client.get_user('ler@primus.org')447 >>> ler = client.get_user('ler@primus.org')
454 >>> print ler.password448 >>> print(ler.password)
455 $...449 $...
456 >>> print ler.display_name450 >>> print(ler.display_name)
457 Ler451 Ler
458452
459User attributes can be changed through assignment, but you need to call the453User attributes can be changed through assignment, but you need to call the
@@ -462,7 +456,7 @@
462 >>> ler.display_name = 'Sir Ler'456 >>> ler.display_name = 'Sir Ler'
463 >>> ler.save()457 >>> ler.save()
464 >>> ler = client.get_user('ler@primus.org')458 >>> ler = client.get_user('ler@primus.org')
465 >>> print ler.display_name459 >>> print(ler.display_name)
466 Sir Ler460 Sir Ler
467461
468Passwords can be changed as well:462Passwords can be changed as well:
@@ -483,39 +477,41 @@
483477
484 >>> bill = client.get_user('bill@example.com')478 >>> bill = client.get_user('bill@example.com')
485 >>> for subscription in bill.subscriptions:479 >>> for subscription in bill.subscriptions:
486 ... print subscription480 ... print(subscription)
487 <Member "bill@example.com" on "test-one.example.com">481 <Member "bill@example.com" on "test-one.example.com">
488482
489If all you need are the list ids of all mailing lists a user is subscribed to, you can use the ``subscription_list_ids`` property.483If all you need are the list ids of all mailing lists a user is subscribed to,
484you can use the ``subscription_list_ids`` property.
490485
491 >>> for list_id in bill.subscription_list_ids:486 >>> for list_id in bill.subscription_list_ids:
492 ... print list_id487 ... print(list_id)
493 test-one.example.com488 test-one.example.com
494489
495490
496List Settings491List Settings
497=============492=============
498493
499We can get all list settings via a lists settings attribute. A proxy object for the settings is returned which behaves much like a dictionary.494We can get all list settings via a lists settings attribute. A proxy object
495for the settings is returned which behaves much like a dictionary.
500496
501 >>> settings = test_one.settings497 >>> settings = test_one.settings
502 >>> len(settings)498 >>> len(settings)
503 50499 50
504500
505 >>> for attr in sorted(settings):501 >>> for attr in sorted(settings):
506 ... print attr + ': ' + str(settings[attr])502 ... print(attr + ': ' + str(settings[attr]))
507 acceptable_aliases: []503 acceptable_aliases: []
508 ...504 ...
509 welcome_message_uri: mailman:///welcome.txt505 welcome_message_uri: mailman:///welcome.txt
510506
511 >>> print settings['display_name']507 >>> print(settings['display_name'])
512 Test-one508 Test-one
513509
514We can access all valid list settings as attributes.510We can access all valid list settings as attributes.
515511
516 >>> print settings['fqdn_listname']512 >>> print(settings['fqdn_listname'])
517 test-one@example.com513 test-one@example.com
518 >>> print settings['description']514 >>> print(settings['description'])
519515
520 >>> settings['description'] = 'A very meaningful description.'516 >>> settings['description'] = 'A very meaningful description.'
521 >>> settings['display_name'] = 'Test Numero Uno'517 >>> settings['display_name'] = 'Test Numero Uno'
@@ -523,14 +519,16 @@
523 >>> settings.save()519 >>> settings.save()
524520
525 >>> settings_new = test_one.settings521 >>> settings_new = test_one.settings
526 >>> print settings_new['description']522 >>> print(settings_new['description'])
527 A very meaningful description.523 A very meaningful description.
528 >>> print settings_new['display_name']524 >>> print(settings_new['display_name'])
529 Test Numero Uno525 Test Numero Uno
530526
531The settings object also supports the `get` method of usual Python dictionaries:527The settings object also supports the `get` method of usual Python
528dictionaries:
532529
533 >>> print settings_new.get('OhNoIForgotTheKey', 'HowGoodIPlacedOneUnderTheDoormat')530 >>> print(settings_new.get('OhNoIForgotTheKey',
531 ... 'HowGoodIPlacedOneUnderTheDoormat'))
534 HowGoodIPlacedOneUnderTheDoormat532 HowGoodIPlacedOneUnderTheDoormat
535533
536534
@@ -539,31 +537,33 @@
539537
540Preferences can be accessed and set for users, members and addresses.538Preferences can be accessed and set for users, members and addresses.
541539
542By default, preferences are not set and fall back to the global system preferences. They're read-only and can be accessed through the client object.540By default, preferences are not set and fall back to the global system
541preferences. They're read-only and can be accessed through the client object.
543542
544 >>> global_prefs = client.preferences543 >>> global_prefs = client.preferences
545 >>> print global_prefs['acknowledge_posts']544 >>> print(global_prefs['acknowledge_posts'])
546 False545 False
547 >>> print global_prefs['delivery_mode']546 >>> print(global_prefs['delivery_mode'])
548 regular547 regular
549 >>> print global_prefs['delivery_status']548 >>> print(global_prefs['delivery_status'])
550 enabled549 enabled
551 >>> print global_prefs['hide_address']550 >>> print(global_prefs['hide_address'])
552 True551 True
553 >>> print global_prefs['preferred_language']552 >>> print(global_prefs['preferred_language'])
554 en553 en
555 >>> print global_prefs['receive_list_copy']554 >>> print(global_prefs['receive_list_copy'])
556 True555 True
557 >>> print global_prefs['receive_own_postings']556 >>> print(global_prefs['receive_own_postings'])
558 True557 True
559558
560Preferences can be set, but you have to call ``save`` to make your changes permanent.559Preferences can be set, but you have to call ``save`` to make your changes
560permanent.
561561
562 >>> prefs = test_two.get_member('anna@example.com').preferences562 >>> prefs = test_two.get_member('anna@example.com').preferences
563 >>> prefs['delivery_status'] = 'by_user'563 >>> prefs['delivery_status'] = 'by_user'
564 >>> prefs.save()564 >>> prefs.save()
565 >>> prefs = test_two.get_member('anna@example.com').preferences565 >>> prefs = test_two.get_member('anna@example.com').preferences
566 >>> print prefs['delivery_status']566 >>> print(prefs['delivery_status'])
567 by_user567 by_user
568568
569569
@@ -581,7 +581,7 @@
581581
582 >>> test_one.add_owner('foo@example.com')582 >>> test_one.add_owner('foo@example.com')
583 >>> for owner in test_one.owners:583 >>> for owner in test_one.owners:
584 ... print owner584 ... print(owner)
585 foo@example.com585 foo@example.com
586586
587The owner of the list not automatically added as a member:587The owner of the list not automatically added as a member:
@@ -593,7 +593,7 @@
593593
594 >>> test_one.add_moderator('bar@example.com')594 >>> test_one.add_moderator('bar@example.com')
595 >>> for moderator in test_one.moderators:595 >>> for moderator in test_one.moderators:
596 ... print moderator596 ... print(moderator)
597 bar@example.com597 bar@example.com
598598
599Moderators are also not automatically added as members:599Moderators are also not automatically added as members:
@@ -608,7 +608,7 @@
608 <Member "bar@example.com" on "test-one.example.com">608 <Member "bar@example.com" on "test-one.example.com">
609609
610 >>> for member in client.members:610 >>> for member in client.members:
611 ... print '%s: %s' %(member, member.role)611 ... print('%s: %s' %(member, member.role))
612 <Member "foo@example.com" on "test-one.example.com">: owner612 <Member "foo@example.com" on "test-one.example.com">: owner
613 <Member "bar@example.com" on "test-one.example.com">: moderator613 <Member "bar@example.com" on "test-one.example.com">: moderator
614 <Member "bar@example.com" on "test-one.example.com">: member614 <Member "bar@example.com" on "test-one.example.com">: member
@@ -632,33 +632,52 @@
632Message Moderation632Message Moderation
633------------------633------------------
634634
635By injecting a message by a non-member into the incoming queue, we can
636simulate a message being held for moderator approval.
637
635 >>> msg = """From: nomember@example.com638 >>> msg = """From: nomember@example.com
636 ... To: test-one@example.com639 ... To: test-one@example.com
637 ... Subject: Something640 ... Subject: Something
638 ... Message-ID: <moderated_01>641 ... Message-ID: <moderated_01>
639 ... 642 ...
640 ... Some text.643 ... Some text.
641 ... 644 ...
642 ... """645 ... """
643 >>> inject_message('test-one@example.com', msg)646 >>> inq = client.queues['in']
647 >>> inq.inject('test-one.example.com', msg)
648
649Now wait until the message has been processed.
650
651 >>> while True:
652 ... if len(inq.files) == 0:
653 ... break
654 ... time.sleep(0.1)
655
656It might take a few moments for the message to show up in the moderation
657queue.
658
659 >>> while True:
660 ... held = test_one.held
661 ... if len(held) > 0:
662 ... break
663 ... time.sleep(0.1)
644664
645Messages held for moderation can be listed on a per list basis.665Messages held for moderation can be listed on a per list basis.
646666
647 >>> held = test_one.held667 >>> print(held[0]['subject'])
648 >>> print held[0]['subject']
649 Something668 Something
650 >>> print held[0]['reason']669 >>> print(held[0]['reason'])
651 <BLANKLINE>670 <BLANKLINE>
652 >>> print held[0]['request_id']671 >>> print(held[0]['request_id'])
653 1672 1
654673
655 >>> print test_one.defer_message(held[0]['request_id'])['status']674 >>> print(test_one.defer_message(held[0]['request_id'])['status'])
656 204675 204
657676
658 >>> len(test_one.held)677 >>> len(test_one.held)
659 1678 1
660679
661 >>> print test_one.discard_message(held[0]['request_id'])['status']680 >>> print(test_one.discard_message(held[0]['request_id'])['status'])
662 204681 204
663682
664 >>> len(test_one.held)683 >>> len(test_one.held)
665684
=== added directory 'src/mailmanclient/testing'
=== added file 'src/mailmanclient/testing/__init__.py'
=== added file 'src/mailmanclient/testing/documentation.py'
--- src/mailmanclient/testing/documentation.py 1970-01-01 00:00:00 +0000
+++ src/mailmanclient/testing/documentation.py 2015-01-04 23:44:27 +0000
@@ -0,0 +1,84 @@
1# Copyright (C) 2007-2015 by the Free Software Foundation, Inc.
2#
3# This file is part of GNU Mailman.
4#
5# GNU Mailman is free software: you can redistribute it and/or modify it under
6# the terms of the GNU General Public License as published by the Free
7# Software Foundation, either version 3 of the License, or (at your option)
8# any later version.
9#
10# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
11# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13# more details.
14#
15# You should have received a copy of the GNU General Public License along with
16# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
17
18"""Harness for testing Mailman's documentation.
19
20Note that doctest extraction does not currently work for zip file
21distributions. doctest discovery currently requires file system traversal.
22"""
23
24from __future__ import absolute_import, print_function, unicode_literals
25
26__metaclass__ = type
27__all__ = [
28 'setup',
29 'teardown'
30 ]
31
32
33from inspect import isfunction, ismethod
34
35
36
037
38def stop():
39 """Call into pdb.set_trace()"""
40 # Do the import here so that you get the wacky special hacked pdb instead
41 # of Python's normal pdb.
42 import pdb
43 pdb.set_trace()
44
45
46def dump(results):
47 if results is None:
48 print(None)
49 return
50 for key in sorted(results):
51 if key == 'entries':
52 for i, entry in enumerate(results[key]):
53 # entry is a dictionary.
54 print('entry %d:' % i)
55 for entry_key in sorted(entry):
56 print(' {0}: {1}'.format(entry_key, entry[entry_key]))
57 else:
58 print('{0}: {1}'.format(key, results[key]))
59
60
61
162
63def setup(testobj):
64 """Test setup."""
65 # Make sure future statements in our doctests are the same as everywhere
66 # else.
67 testobj.globs['absolute_import'] = absolute_import
68 testobj.globs['print_function'] = print_function
69 testobj.globs['unicode_literals'] = unicode_literals
70 # In general, I don't like adding convenience functions, since I think
71 # doctests should do the imports themselves. It makes for better
72 # documentation that way. However, a few are really useful, or help to
73 # hide some icky test implementation details.
74 testobj.globs['stop'] = stop
75 testobj.globs['dump'] = dump
76 # Add this so that cleanups can be automatically added by the doctest.
77 testobj.globs['cleanups'] = []
78
79
80
281
82def teardown(testobj):
83 for cleanup in testobj.globs['cleanups']:
84 if isfunction(cleanup) or ismethod(cleanup):
85 cleanup()
86 else:
87 cleanup[0](*cleanup[1:])
388
=== added file 'src/mailmanclient/testing/nose.py'
--- src/mailmanclient/testing/nose.py 1970-01-01 00:00:00 +0000
+++ src/mailmanclient/testing/nose.py 2015-01-04 23:44:27 +0000
@@ -0,0 +1,129 @@
1# Copyright (C) 2013-2015 by the Free Software Foundation, Inc.
2#
3# This file is part of GNU Mailman.
4#
5# GNU Mailman is free software: you can redistribute it and/or modify it under
6# the terms of the GNU General Public License as published by the Free
7# Software Foundation, either version 3 of the License, or (at your option)
8# any later version.
9#
10# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
11# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13# more details.
14#
15# You should have received a copy of the GNU General Public License along with
16# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
17
18"""nose2 test infrastructure."""
19
20__all__ = [
21 'NosePlugin',
22 ]
23
24
25import os
26import re
27import vcr
28import errno
29import doctest
30import mailmanclient
31
32from contextlib2 import ExitStack
33from mailmanclient.testing.documentation import setup, teardown
34from nose2.events import Plugin
35
36
37DOT = '.'
38FLAGS = doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE | doctest.REPORT_NDIFF
39TOPDIR = os.path.dirname(mailmanclient.__file__)
40
41
42
043
44class NosePlugin(Plugin):
45 configSection = 'mailman'
46
47 def __init__(self):
48 super(NosePlugin, self).__init__()
49 self.patterns = []
50 self.stderr = False
51 self.record = False
52 def set_stderr(ignore):
53 self.stderr = True
54 self.addArgument(self.patterns, 'P', 'pattern',
55 'Add a test matching pattern')
56 self.addFlag(set_stderr, 'E', 'stderr',
57 'Enable stderr logging to sub-runners')
58 def set_record(ignore):
59 self.record = True
60 self.addFlag(set_record, 'R', 'rerecord',
61 """Force re-recording of test responses. Requires
62 Mailman to be running.""")
63 self._data_path = os.path.join(TOPDIR, 'tests', 'data', 'tape.yaml')
64 self._resources = ExitStack()
65
66 def startTestRun(self, event):
67 # Check to see if we're running the test suite in record mode. If so,
68 # delete any existing recording.
69 if self.record:
70 try:
71 os.remove(self._data_path)
72 except OSError as error:
73 if error.errno != errno.ENOENT:
74 raise
75 # This will automatically create the recording file.
76 self._resources.enter_context(vcr.use_cassette(self._data_path))
77
78 def stopTestRun(self, event):
79 # Stop all recording.
80 self._resources.close()
81
82 def getTestCaseNames(self, event):
83 if len(self.patterns) == 0:
84 # No filter patterns, so everything should be tested.
85 return
86 # Does the pattern match the fully qualified class name?
87 for pattern in self.patterns:
88 full_class_name = '{}.{}'.format(
89 event.testCase.__module__, event.testCase.__name__)
90 if re.search(pattern, full_class_name):
91 # Don't suppress this test class.
92 return
93 names = filter(event.isTestMethod, dir(event.testCase))
94 for name in names:
95 full_test_name = '{}.{}.{}'.format(
96 event.testCase.__module__,
97 event.testCase.__name__,
98 name)
99 for pattern in self.patterns:
100 if re.search(pattern, full_test_name):
101 break
102 else:
103 event.excludedNames.append(name)
104
105 def handleFile(self, event):
106 path = event.path[len(TOPDIR)+1:]
107 if len(self.patterns) > 0:
108 for pattern in self.patterns:
109 if re.search(pattern, path):
110 break
111 else:
112 # Skip this doctest.
113 return
114 base, ext = os.path.splitext(path)
115 if ext != '.rst':
116 return
117 test = doctest.DocFileTest(
118 path, package=mailmanclient,
119 optionflags=FLAGS,
120 setUp=setup,
121 tearDown=teardown)
122 # Suppress the extra "Doctest: ..." line.
123 test.shortDescription = lambda: None
124 event.extraTests.append(test)
125
126 ## def startTest(self, event):
127 ## import sys; print('vvvvv', event.test, file=sys.stderr)
128
129 ## def stopTest(self, event):
130 ## import sys; print('^^^^^', event.test, file=sys.stderr)
1131
=== added directory 'src/mailmanclient/tests/data'
=== added file 'src/mailmanclient/tests/data/tape.yaml'
--- src/mailmanclient/tests/data/tape.yaml 1970-01-01 00:00:00 +0000
+++ src/mailmanclient/tests/data/tape.yaml 2015-01-04 23:44:27 +0000
@@ -0,0 +1,3905 @@
1interactions:
2- request:
3 body: null
4 headers:
5 accept-encoding: ['gzip, deflate']
6 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
7 user-agent: [GNU Mailman REST client v1.0.0b1]
8 method: GET
9 uri: http://localhost:9001/3.0/domains/example.org
10 response:
11 body: {string: 404 Not Found}
12 headers:
13 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
14 Server: [WSGIServer/0.2 CPython/3.4.2]
15 content-length: ['13']
16 content-type: [application/json; charset=utf-8]
17 status: {code: 404, message: Not Found}
18- request:
19 body: null
20 headers:
21 accept-encoding: ['gzip, deflate']
22 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
23 user-agent: [GNU Mailman REST client v1.0.0b1]
24 method: GET
25 uri: http://localhost:9001/3.0/system/versions
26 response:
27 body: {string: '{"python_version": "3.4.2 (default, Dec 27 2014, 23:37:21) \n[GCC
28 4.9.2]", "http_etag": "\"9fa41b456a0e065e31f34bf9ce42637722d3bf15\"", "mailman_version":
29 "GNU Mailman 3.0.0b5 (Carve Away The Stone)", "self_link": "http://localhost:9001/3.0/system/versions"}'}
30 headers:
31 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
32 Server: [WSGIServer/0.2 CPython/3.4.2]
33 content-length: ['258']
34 content-type: [application/json; charset=utf-8]
35 status: {code: 200, message: OK}
36- request:
37 body: null
38 headers:
39 accept-encoding: ['gzip, deflate']
40 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
41 user-agent: [GNU Mailman REST client v1.0.0b1]
42 method: GET
43 uri: http://localhost:9001/3.0/lists
44 response:
45 body: {string: '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
46 "total_size": 0, "start": 0}'}
47 headers:
48 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
49 Server: [WSGIServer/0.2 CPython/3.4.2]
50 content-length: ['90']
51 content-type: [application/json; charset=utf-8]
52 status: {code: 200, message: OK}
53- request:
54 body: null
55 headers:
56 accept-encoding: ['gzip, deflate']
57 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
58 user-agent: [GNU Mailman REST client v1.0.0b1]
59 method: GET
60 uri: http://localhost:9001/3.0/domains
61 response:
62 body: {string: '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
63 "total_size": 0, "start": 0}'}
64 headers:
65 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
66 Server: [WSGIServer/0.2 CPython/3.4.2]
67 content-length: ['90']
68 content-type: [application/json; charset=utf-8]
69 status: {code: 200, message: OK}
70- request:
71 body: contact_address=admin%40example.com&mail_host=example.com
72 headers:
73 accept-encoding: ['gzip, deflate']
74 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
75 content-type: [application/x-www-form-urlencoded]
76 user-agent: [GNU Mailman REST client v1.0.0b1]
77 method: POST
78 uri: http://localhost:9001/3.0/domains
79 response:
80 body: {string: ''}
81 headers:
82 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
83 Server: [WSGIServer/0.2 CPython/3.4.2]
84 content-length: ['0']
85 location: ['http://localhost:9001/3.0/domains/example.com']
86 status: {code: 201, message: Created}
87- request:
88 body: null
89 headers:
90 accept-encoding: ['gzip, deflate']
91 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
92 user-agent: [GNU Mailman REST client v1.0.0b1]
93 method: GET
94 uri: http://localhost:9001/3.0/domains/example.com
95 response:
96 body: {string: '{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
97 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
98 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
99 null}'}
100 headers:
101 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
102 Server: [WSGIServer/0.2 CPython/3.4.2]
103 content-length: ['273']
104 content-type: [application/json; charset=utf-8]
105 status: {code: 200, message: OK}
106- request:
107 body: null
108 headers:
109 accept-encoding: ['gzip, deflate']
110 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
111 user-agent: [GNU Mailman REST client v1.0.0b1]
112 method: GET
113 uri: http://localhost:9001/3.0/domains/example.com
114 response:
115 body: {string: '{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
116 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
117 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
118 null}'}
119 headers:
120 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
121 Server: [WSGIServer/0.2 CPython/3.4.2]
122 content-length: ['273']
123 content-type: [application/json; charset=utf-8]
124 status: {code: 200, message: OK}
125- request:
126 body: null
127 headers:
128 accept-encoding: ['gzip, deflate']
129 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
130 user-agent: [GNU Mailman REST client v1.0.0b1]
131 method: GET
132 uri: http://localhost:9001/3.0/domains/example.com
133 response:
134 body: {string: '{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
135 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
136 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
137 null}'}
138 headers:
139 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
140 Server: [WSGIServer/0.2 CPython/3.4.2]
141 content-length: ['273']
142 content-type: [application/json; charset=utf-8]
143 status: {code: 200, message: OK}
144- request:
145 body: null
146 headers:
147 accept-encoding: ['gzip, deflate']
148 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
149 user-agent: [GNU Mailman REST client v1.0.0b1]
150 method: GET
151 uri: http://localhost:9001/3.0/domains
152 response:
153 body: {string: '{"entries": [{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
154 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
155 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
156 null}], "http_etag": "\"6df529c1146b355d86760c043ba724375711c3fb\"", "total_size":
157 1, "start": 0}'}
158 headers:
159 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
160 Server: [WSGIServer/0.2 CPython/3.4.2]
161 content-length: ['378']
162 content-type: [application/json; charset=utf-8]
163 status: {code: 200, message: OK}
164- request:
165 body: null
166 headers:
167 accept-encoding: ['gzip, deflate']
168 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
169 user-agent: [GNU Mailman REST client v1.0.0b1]
170 method: GET
171 uri: http://localhost:9001/3.0/domains/example.com
172 response:
173 body: {string: '{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
174 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
175 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
176 null}'}
177 headers:
178 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
179 Server: [WSGIServer/0.2 CPython/3.4.2]
180 content-length: ['273']
181 content-type: [application/json; charset=utf-8]
182 status: {code: 200, message: OK}
183- request:
184 body: mail_host=example.net
185 headers:
186 accept-encoding: ['gzip, deflate']
187 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
188 content-type: [application/x-www-form-urlencoded]
189 user-agent: [GNU Mailman REST client v1.0.0b1]
190 method: POST
191 uri: http://localhost:9001/3.0/domains
192 response:
193 body: {string: ''}
194 headers:
195 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
196 Server: [WSGIServer/0.2 CPython/3.4.2]
197 content-length: ['0']
198 location: ['http://localhost:9001/3.0/domains/example.net']
199 status: {code: 201, message: Created}
200- request:
201 body: null
202 headers:
203 accept-encoding: ['gzip, deflate']
204 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
205 user-agent: [GNU Mailman REST client v1.0.0b1]
206 method: GET
207 uri: http://localhost:9001/3.0/domains/example.net
208 response:
209 body: {string: '{"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
210 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
211 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
212 null}'}
213 headers:
214 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
215 Server: [WSGIServer/0.2 CPython/3.4.2]
216 content-length: ['278']
217 content-type: [application/json; charset=utf-8]
218 status: {code: 200, message: OK}
219- request:
220 body: mail_host=example.org
221 headers:
222 accept-encoding: ['gzip, deflate']
223 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
224 content-type: [application/x-www-form-urlencoded]
225 user-agent: [GNU Mailman REST client v1.0.0b1]
226 method: POST
227 uri: http://localhost:9001/3.0/domains
228 response:
229 body: {string: ''}
230 headers:
231 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
232 Server: [WSGIServer/0.2 CPython/3.4.2]
233 content-length: ['0']
234 location: ['http://localhost:9001/3.0/domains/example.org']
235 status: {code: 201, message: Created}
236- request:
237 body: null
238 headers:
239 accept-encoding: ['gzip, deflate']
240 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
241 user-agent: [GNU Mailman REST client v1.0.0b1]
242 method: GET
243 uri: http://localhost:9001/3.0/domains/example.org
244 response:
245 body: {string: '{"base_url": "http://example.org", "http_etag": "\"730f23a7a90aecfe1248f952d15bcfe97ce9e51f\"",
246 "url_host": "example.org", "self_link": "http://localhost:9001/3.0/domains/example.org",
247 "contact_address": "postmaster@example.org", "mail_host": "example.org", "description":
248 null}'}
249 headers:
250 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
251 Server: [WSGIServer/0.2 CPython/3.4.2]
252 content-length: ['278']
253 content-type: [application/json; charset=utf-8]
254 status: {code: 200, message: OK}
255- request:
256 body: null
257 headers:
258 accept-encoding: ['gzip, deflate']
259 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
260 user-agent: [GNU Mailman REST client v1.0.0b1]
261 method: GET
262 uri: http://localhost:9001/3.0/domains
263 response:
264 body: {string: '{"entries": [{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
265 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
266 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
267 null}, {"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
268 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
269 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
270 null}, {"base_url": "http://example.org", "http_etag": "\"730f23a7a90aecfe1248f952d15bcfe97ce9e51f\"",
271 "url_host": "example.org", "self_link": "http://localhost:9001/3.0/domains/example.org",
272 "contact_address": "postmaster@example.org", "mail_host": "example.org", "description":
273 null}], "http_etag": "\"f76dc099470a0e1b5bb1788c290dbff8b2e06822\"", "total_size":
274 3, "start": 0}'}
275 headers:
276 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
277 Server: [WSGIServer/0.2 CPython/3.4.2]
278 content-length: ['938']
279 content-type: [application/json; charset=utf-8]
280 status: {code: 200, message: OK}
281- request:
282 body: null
283 headers:
284 accept-encoding: ['gzip, deflate']
285 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
286 user-agent: [GNU Mailman REST client v1.0.0b1]
287 method: GET
288 uri: http://localhost:9001/3.0/domains/example.com
289 response:
290 body: {string: '{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
291 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
292 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
293 null}'}
294 headers:
295 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
296 Server: [WSGIServer/0.2 CPython/3.4.2]
297 content-length: ['273']
298 content-type: [application/json; charset=utf-8]
299 status: {code: 200, message: OK}
300- request:
301 body: null
302 headers:
303 accept-encoding: ['gzip, deflate']
304 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
305 user-agent: [GNU Mailman REST client v1.0.0b1]
306 method: GET
307 uri: http://localhost:9001/3.0/domains/example.net
308 response:
309 body: {string: '{"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
310 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
311 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
312 null}'}
313 headers:
314 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
315 Server: [WSGIServer/0.2 CPython/3.4.2]
316 content-length: ['278']
317 content-type: [application/json; charset=utf-8]
318 status: {code: 200, message: OK}
319- request:
320 body: null
321 headers:
322 accept-encoding: ['gzip, deflate']
323 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
324 user-agent: [GNU Mailman REST client v1.0.0b1]
325 method: GET
326 uri: http://localhost:9001/3.0/domains/example.org
327 response:
328 body: {string: '{"base_url": "http://example.org", "http_etag": "\"730f23a7a90aecfe1248f952d15bcfe97ce9e51f\"",
329 "url_host": "example.org", "self_link": "http://localhost:9001/3.0/domains/example.org",
330 "contact_address": "postmaster@example.org", "mail_host": "example.org", "description":
331 null}'}
332 headers:
333 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
334 Server: [WSGIServer/0.2 CPython/3.4.2]
335 content-length: ['278']
336 content-type: [application/json; charset=utf-8]
337 status: {code: 200, message: OK}
338- request:
339 body: null
340 headers:
341 accept-encoding: ['gzip, deflate']
342 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
343 user-agent: [GNU Mailman REST client v1.0.0b1]
344 method: DELETE
345 uri: http://localhost:9001/3.0/domains/example.org
346 response:
347 body: {string: ''}
348 headers:
349 Content-Length: ['0']
350 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
351 Server: [WSGIServer/0.2 CPython/3.4.2]
352 status: {code: 204, message: No Content}
353- request:
354 body: null
355 headers:
356 accept-encoding: ['gzip, deflate']
357 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
358 user-agent: [GNU Mailman REST client v1.0.0b1]
359 method: GET
360 uri: http://localhost:9001/3.0/domains
361 response:
362 body: {string: '{"entries": [{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
363 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
364 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
365 null}, {"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
366 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
367 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
368 null}], "http_etag": "\"8c072a5737b36719925d2e222ca2f8fc5a758b50\"", "total_size":
369 2, "start": 0}'}
370 headers:
371 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
372 Server: [WSGIServer/0.2 CPython/3.4.2]
373 content-length: ['658']
374 content-type: [application/json; charset=utf-8]
375 status: {code: 200, message: OK}
376- request:
377 body: null
378 headers:
379 accept-encoding: ['gzip, deflate']
380 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
381 user-agent: [GNU Mailman REST client v1.0.0b1]
382 method: GET
383 uri: http://localhost:9001/3.0/domains/example.com
384 response:
385 body: {string: '{"base_url": "http://example.com", "http_etag": "\"8e9e004095e6daf79c3b9906bf1bb63f21cf60d7\"",
386 "url_host": "example.com", "self_link": "http://localhost:9001/3.0/domains/example.com",
387 "contact_address": "admin@example.com", "mail_host": "example.com", "description":
388 null}'}
389 headers:
390 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
391 Server: [WSGIServer/0.2 CPython/3.4.2]
392 content-length: ['273']
393 content-type: [application/json; charset=utf-8]
394 status: {code: 200, message: OK}
395- request:
396 body: null
397 headers:
398 accept-encoding: ['gzip, deflate']
399 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
400 user-agent: [GNU Mailman REST client v1.0.0b1]
401 method: GET
402 uri: http://localhost:9001/3.0/domains/example.net
403 response:
404 body: {string: '{"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
405 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
406 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
407 null}'}
408 headers:
409 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
410 Server: [WSGIServer/0.2 CPython/3.4.2]
411 content-length: ['278']
412 content-type: [application/json; charset=utf-8]
413 status: {code: 200, message: OK}
414- request:
415 body: fqdn_listname=test-one%40example.com
416 headers:
417 accept-encoding: ['gzip, deflate']
418 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
419 content-type: [application/x-www-form-urlencoded]
420 user-agent: [GNU Mailman REST client v1.0.0b1]
421 method: POST
422 uri: http://localhost:9001/3.0/lists
423 response:
424 body: {string: ''}
425 headers:
426 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
427 Server: [WSGIServer/0.2 CPython/3.4.2]
428 content-length: ['0']
429 location: ['http://localhost:9001/3.0/lists/test-one.example.com']
430 status: {code: 201, message: Created}
431- request:
432 body: null
433 headers:
434 accept-encoding: ['gzip, deflate']
435 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
436 user-agent: [GNU Mailman REST client v1.0.0b1]
437 method: GET
438 uri: http://localhost:9001/3.0/lists/test-one.example.com
439 response:
440 body: {string: '{"display_name": "Test-one", "list_name": "test-one", "mail_host":
441 "example.com", "volume": 1, "fqdn_listname": "test-one@example.com", "member_count":
442 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"", "self_link":
443 "http://localhost:9001/3.0/lists/test-one.example.com", "list_id": "test-one.example.com"}'}
444 headers:
445 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
446 Server: [WSGIServer/0.2 CPython/3.4.2]
447 content-length: ['319']
448 content-type: [application/json; charset=utf-8]
449 status: {code: 200, message: OK}
450- request:
451 body: null
452 headers:
453 accept-encoding: ['gzip, deflate']
454 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
455 user-agent: [GNU Mailman REST client v1.0.0b1]
456 method: GET
457 uri: http://localhost:9001/3.0/lists/test-one@example.com
458 response:
459 body: {string: '{"display_name": "Test-one", "list_name": "test-one", "mail_host":
460 "example.com", "volume": 1, "fqdn_listname": "test-one@example.com", "member_count":
461 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"", "self_link":
462 "http://localhost:9001/3.0/lists/test-one.example.com", "list_id": "test-one.example.com"}'}
463 headers:
464 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
465 Server: [WSGIServer/0.2 CPython/3.4.2]
466 content-length: ['319']
467 content-type: [application/json; charset=utf-8]
468 status: {code: 200, message: OK}
469- request:
470 body: fqdn_listname=test-two%40example.com
471 headers:
472 accept-encoding: ['gzip, deflate']
473 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
474 content-type: [application/x-www-form-urlencoded]
475 user-agent: [GNU Mailman REST client v1.0.0b1]
476 method: POST
477 uri: http://localhost:9001/3.0/lists
478 response:
479 body: {string: ''}
480 headers:
481 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
482 Server: [WSGIServer/0.2 CPython/3.4.2]
483 content-length: ['0']
484 location: ['http://localhost:9001/3.0/lists/test-two.example.com']
485 status: {code: 201, message: Created}
486- request:
487 body: null
488 headers:
489 accept-encoding: ['gzip, deflate']
490 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
491 user-agent: [GNU Mailman REST client v1.0.0b1]
492 method: GET
493 uri: http://localhost:9001/3.0/lists/test-two.example.com
494 response:
495 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
496 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
497 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"", "self_link":
498 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
499 headers:
500 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
501 Server: [WSGIServer/0.2 CPython/3.4.2]
502 content-length: ['319']
503 content-type: [application/json; charset=utf-8]
504 status: {code: 200, message: OK}
505- request:
506 body: null
507 headers:
508 accept-encoding: ['gzip, deflate']
509 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
510 user-agent: [GNU Mailman REST client v1.0.0b1]
511 method: GET
512 uri: http://localhost:9001/3.0/domains/example.net
513 response:
514 body: {string: '{"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
515 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
516 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
517 null}'}
518 headers:
519 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
520 Server: [WSGIServer/0.2 CPython/3.4.2]
521 content-length: ['278']
522 content-type: [application/json; charset=utf-8]
523 status: {code: 200, message: OK}
524- request:
525 body: null
526 headers:
527 accept-encoding: ['gzip, deflate']
528 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
529 user-agent: [GNU Mailman REST client v1.0.0b1]
530 method: GET
531 uri: http://localhost:9001/3.0/domains/example.net
532 response:
533 body: {string: '{"base_url": "http://example.net", "http_etag": "\"e9851cfb8e0e0999c083459951f4f9764f3be325\"",
534 "url_host": "example.net", "self_link": "http://localhost:9001/3.0/domains/example.net",
535 "contact_address": "postmaster@example.net", "mail_host": "example.net", "description":
536 null}'}
537 headers:
538 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
539 Server: [WSGIServer/0.2 CPython/3.4.2]
540 content-length: ['278']
541 content-type: [application/json; charset=utf-8]
542 status: {code: 200, message: OK}
543- request:
544 body: fqdn_listname=test-three%40example.net
545 headers:
546 accept-encoding: ['gzip, deflate']
547 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
548 content-type: [application/x-www-form-urlencoded]
549 user-agent: [GNU Mailman REST client v1.0.0b1]
550 method: POST
551 uri: http://localhost:9001/3.0/lists
552 response:
553 body: {string: ''}
554 headers:
555 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
556 Server: [WSGIServer/0.2 CPython/3.4.2]
557 content-length: ['0']
558 location: ['http://localhost:9001/3.0/lists/test-three.example.net']
559 status: {code: 201, message: Created}
560- request:
561 body: null
562 headers:
563 accept-encoding: ['gzip, deflate']
564 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
565 user-agent: [GNU Mailman REST client v1.0.0b1]
566 method: GET
567 uri: http://localhost:9001/3.0/lists/test-three.example.net
568 response:
569 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
570 "example.net", "volume": 1, "fqdn_listname": "test-three@example.net", "member_count":
571 0, "http_etag": "\"aac838e6414aceb4bd94838ce8587acd14c82689\"", "self_link":
572 "http://localhost:9001/3.0/lists/test-three.example.net", "list_id": "test-three.example.net"}'}
573 headers:
574 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
575 Server: [WSGIServer/0.2 CPython/3.4.2]
576 content-length: ['329']
577 content-type: [application/json; charset=utf-8]
578 status: {code: 200, message: OK}
579- request:
580 body: fqdn_listname=test-three%40example.com
581 headers:
582 accept-encoding: ['gzip, deflate']
583 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
584 content-type: [application/x-www-form-urlencoded]
585 user-agent: [GNU Mailman REST client v1.0.0b1]
586 method: POST
587 uri: http://localhost:9001/3.0/lists
588 response:
589 body: {string: ''}
590 headers:
591 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
592 Server: [WSGIServer/0.2 CPython/3.4.2]
593 content-length: ['0']
594 location: ['http://localhost:9001/3.0/lists/test-three.example.com']
595 status: {code: 201, message: Created}
596- request:
597 body: null
598 headers:
599 accept-encoding: ['gzip, deflate']
600 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
601 user-agent: [GNU Mailman REST client v1.0.0b1]
602 method: GET
603 uri: http://localhost:9001/3.0/lists/test-three.example.com
604 response:
605 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
606 "example.com", "volume": 1, "fqdn_listname": "test-three@example.com", "member_count":
607 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"", "self_link":
608 "http://localhost:9001/3.0/lists/test-three.example.com", "list_id": "test-three.example.com"}'}
609 headers:
610 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
611 Server: [WSGIServer/0.2 CPython/3.4.2]
612 content-length: ['329']
613 content-type: [application/json; charset=utf-8]
614 status: {code: 200, message: OK}
615- request:
616 body: null
617 headers:
618 accept-encoding: ['gzip, deflate']
619 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
620 user-agent: [GNU Mailman REST client v1.0.0b1]
621 method: GET
622 uri: http://localhost:9001/3.0/lists
623 response:
624 body: {string: '{"entries": [{"display_name": "Test-one", "list_name": "test-one",
625 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-one@example.com",
626 "member_count": 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"",
627 "self_link": "http://localhost:9001/3.0/lists/test-one.example.com", "list_id":
628 "test-one.example.com"}, {"display_name": "Test-two", "list_name": "test-two",
629 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-two@example.com",
630 "member_count": 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"",
631 "self_link": "http://localhost:9001/3.0/lists/test-two.example.com", "list_id":
632 "test-two.example.com"}, {"display_name": "Test-three", "list_name": "test-three",
633 "mail_host": "example.net", "volume": 1, "fqdn_listname": "test-three@example.net",
634 "member_count": 0, "http_etag": "\"aac838e6414aceb4bd94838ce8587acd14c82689\"",
635 "self_link": "http://localhost:9001/3.0/lists/test-three.example.net", "list_id":
636 "test-three.example.net"}, {"display_name": "Test-three", "list_name": "test-three",
637 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-three@example.com",
638 "member_count": 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"",
639 "self_link": "http://localhost:9001/3.0/lists/test-three.example.com", "list_id":
640 "test-three.example.com"}], "http_etag": "\"364f4981c17939f6475615640cf38eca0354df52\"",
641 "total_size": 4, "start": 0}'}
642 headers:
643 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
644 Server: [WSGIServer/0.2 CPython/3.4.2]
645 content-length: ['1407']
646 content-type: [application/json; charset=utf-8]
647 status: {code: 200, message: OK}
648- request:
649 body: null
650 headers:
651 accept-encoding: ['gzip, deflate']
652 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
653 user-agent: [GNU Mailman REST client v1.0.0b1]
654 method: GET
655 uri: http://localhost:9001/3.0/lists/test-one.example.com
656 response:
657 body: {string: '{"display_name": "Test-one", "list_name": "test-one", "mail_host":
658 "example.com", "volume": 1, "fqdn_listname": "test-one@example.com", "member_count":
659 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"", "self_link":
660 "http://localhost:9001/3.0/lists/test-one.example.com", "list_id": "test-one.example.com"}'}
661 headers:
662 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
663 Server: [WSGIServer/0.2 CPython/3.4.2]
664 content-length: ['319']
665 content-type: [application/json; charset=utf-8]
666 status: {code: 200, message: OK}
667- request:
668 body: null
669 headers:
670 accept-encoding: ['gzip, deflate']
671 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
672 user-agent: [GNU Mailman REST client v1.0.0b1]
673 method: GET
674 uri: http://localhost:9001/3.0/lists/test-two.example.com
675 response:
676 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
677 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
678 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"", "self_link":
679 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
680 headers:
681 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
682 Server: [WSGIServer/0.2 CPython/3.4.2]
683 content-length: ['319']
684 content-type: [application/json; charset=utf-8]
685 status: {code: 200, message: OK}
686- request:
687 body: null
688 headers:
689 accept-encoding: ['gzip, deflate']
690 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
691 user-agent: [GNU Mailman REST client v1.0.0b1]
692 method: GET
693 uri: http://localhost:9001/3.0/lists/test-three.example.net
694 response:
695 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
696 "example.net", "volume": 1, "fqdn_listname": "test-three@example.net", "member_count":
697 0, "http_etag": "\"aac838e6414aceb4bd94838ce8587acd14c82689\"", "self_link":
698 "http://localhost:9001/3.0/lists/test-three.example.net", "list_id": "test-three.example.net"}'}
699 headers:
700 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
701 Server: [WSGIServer/0.2 CPython/3.4.2]
702 content-length: ['329']
703 content-type: [application/json; charset=utf-8]
704 status: {code: 200, message: OK}
705- request:
706 body: null
707 headers:
708 accept-encoding: ['gzip, deflate']
709 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
710 user-agent: [GNU Mailman REST client v1.0.0b1]
711 method: GET
712 uri: http://localhost:9001/3.0/lists/test-three.example.com
713 response:
714 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
715 "example.com", "volume": 1, "fqdn_listname": "test-three@example.com", "member_count":
716 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"", "self_link":
717 "http://localhost:9001/3.0/lists/test-three.example.com", "list_id": "test-three.example.com"}'}
718 headers:
719 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
720 Server: [WSGIServer/0.2 CPython/3.4.2]
721 content-length: ['329']
722 content-type: [application/json; charset=utf-8]
723 status: {code: 200, message: OK}
724- request:
725 body: null
726 headers:
727 accept-encoding: ['gzip, deflate']
728 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
729 user-agent: [GNU Mailman REST client v1.0.0b1]
730 method: GET
731 uri: http://localhost:9001/3.0/lists?count=2&page=1
732 response:
733 body: {string: '{"entries": [{"display_name": "Test-one", "list_name": "test-one",
734 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-one@example.com",
735 "member_count": 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"",
736 "self_link": "http://localhost:9001/3.0/lists/test-one.example.com", "list_id":
737 "test-one.example.com"}, {"display_name": "Test-two", "list_name": "test-two",
738 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-two@example.com",
739 "member_count": 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"",
740 "self_link": "http://localhost:9001/3.0/lists/test-two.example.com", "list_id":
741 "test-two.example.com"}], "http_etag": "\"7576518b52cee8dd837ba7de06531325e23d8051\"",
742 "total_size": 2, "start": 0}'}
743 headers:
744 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
745 Server: [WSGIServer/0.2 CPython/3.4.2]
746 content-length: ['745']
747 content-type: [application/json; charset=utf-8]
748 status: {code: 200, message: OK}
749- request:
750 body: null
751 headers:
752 accept-encoding: ['gzip, deflate']
753 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
754 user-agent: [GNU Mailman REST client v1.0.0b1]
755 method: GET
756 uri: http://localhost:9001/3.0/lists/test-one.example.com
757 response:
758 body: {string: '{"display_name": "Test-one", "list_name": "test-one", "mail_host":
759 "example.com", "volume": 1, "fqdn_listname": "test-one@example.com", "member_count":
760 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"", "self_link":
761 "http://localhost:9001/3.0/lists/test-one.example.com", "list_id": "test-one.example.com"}'}
762 headers:
763 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
764 Server: [WSGIServer/0.2 CPython/3.4.2]
765 content-length: ['319']
766 content-type: [application/json; charset=utf-8]
767 status: {code: 200, message: OK}
768- request:
769 body: null
770 headers:
771 accept-encoding: ['gzip, deflate']
772 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
773 user-agent: [GNU Mailman REST client v1.0.0b1]
774 method: GET
775 uri: http://localhost:9001/3.0/lists/test-two.example.com
776 response:
777 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
778 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
779 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"", "self_link":
780 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
781 headers:
782 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
783 Server: [WSGIServer/0.2 CPython/3.4.2]
784 content-length: ['319']
785 content-type: [application/json; charset=utf-8]
786 status: {code: 200, message: OK}
787- request:
788 body: null
789 headers:
790 accept-encoding: ['gzip, deflate']
791 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
792 user-agent: [GNU Mailman REST client v1.0.0b1]
793 method: GET
794 uri: http://localhost:9001/3.0/lists?count=2&page=2
795 response:
796 body: {string: '{"entries": [{"display_name": "Test-three", "list_name": "test-three",
797 "mail_host": "example.net", "volume": 1, "fqdn_listname": "test-three@example.net",
798 "member_count": 0, "http_etag": "\"aac838e6414aceb4bd94838ce8587acd14c82689\"",
799 "self_link": "http://localhost:9001/3.0/lists/test-three.example.net", "list_id":
800 "test-three.example.net"}, {"display_name": "Test-three", "list_name": "test-three",
801 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-three@example.com",
802 "member_count": 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"",
803 "self_link": "http://localhost:9001/3.0/lists/test-three.example.com", "list_id":
804 "test-three.example.com"}], "http_etag": "\"8bb63eb4f57656bfbeda922896dc67efd33fb31c\"",
805 "total_size": 2, "start": 0}'}
806 headers:
807 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
808 Server: [WSGIServer/0.2 CPython/3.4.2]
809 content-length: ['765']
810 content-type: [application/json; charset=utf-8]
811 status: {code: 200, message: OK}
812- request:
813 body: null
814 headers:
815 accept-encoding: ['gzip, deflate']
816 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
817 user-agent: [GNU Mailman REST client v1.0.0b1]
818 method: GET
819 uri: http://localhost:9001/3.0/lists/test-three.example.net
820 response:
821 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
822 "example.net", "volume": 1, "fqdn_listname": "test-three@example.net", "member_count":
823 0, "http_etag": "\"aac838e6414aceb4bd94838ce8587acd14c82689\"", "self_link":
824 "http://localhost:9001/3.0/lists/test-three.example.net", "list_id": "test-three.example.net"}'}
825 headers:
826 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
827 Server: [WSGIServer/0.2 CPython/3.4.2]
828 content-length: ['329']
829 content-type: [application/json; charset=utf-8]
830 status: {code: 200, message: OK}
831- request:
832 body: null
833 headers:
834 accept-encoding: ['gzip, deflate']
835 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
836 user-agent: [GNU Mailman REST client v1.0.0b1]
837 method: GET
838 uri: http://localhost:9001/3.0/lists/test-three.example.com
839 response:
840 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
841 "example.com", "volume": 1, "fqdn_listname": "test-three@example.com", "member_count":
842 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"", "self_link":
843 "http://localhost:9001/3.0/lists/test-three.example.com", "list_id": "test-three.example.com"}'}
844 headers:
845 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
846 Server: [WSGIServer/0.2 CPython/3.4.2]
847 content-length: ['329']
848 content-type: [application/json; charset=utf-8]
849 status: {code: 200, message: OK}
850- request:
851 body: null
852 headers:
853 accept-encoding: ['gzip, deflate']
854 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
855 user-agent: [GNU Mailman REST client v1.0.0b1]
856 method: GET
857 uri: http://localhost:9001/3.0/domains/example.com/lists
858 response:
859 body: {string: '{"entries": [{"display_name": "Test-one", "list_name": "test-one",
860 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-one@example.com",
861 "member_count": 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"",
862 "self_link": "http://localhost:9001/3.0/lists/test-one.example.com", "list_id":
863 "test-one.example.com"}, {"display_name": "Test-three", "list_name": "test-three",
864 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-three@example.com",
865 "member_count": 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"",
866 "self_link": "http://localhost:9001/3.0/lists/test-three.example.com", "list_id":
867 "test-three.example.com"}, {"display_name": "Test-two", "list_name": "test-two",
868 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-two@example.com",
869 "member_count": 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"",
870 "self_link": "http://localhost:9001/3.0/lists/test-two.example.com", "list_id":
871 "test-two.example.com"}], "http_etag": "\"abf9ade1d031e7c98d4b258a33f14ec9f00ba12a\"",
872 "total_size": 3, "start": 0}'}
873 headers:
874 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
875 Server: [WSGIServer/0.2 CPython/3.4.2]
876 content-length: ['1076']
877 content-type: [application/json; charset=utf-8]
878 status: {code: 200, message: OK}
879- request:
880 body: null
881 headers:
882 accept-encoding: ['gzip, deflate']
883 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
884 user-agent: [GNU Mailman REST client v1.0.0b1]
885 method: GET
886 uri: http://localhost:9001/3.0/lists/test-one.example.com
887 response:
888 body: {string: '{"display_name": "Test-one", "list_name": "test-one", "mail_host":
889 "example.com", "volume": 1, "fqdn_listname": "test-one@example.com", "member_count":
890 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"", "self_link":
891 "http://localhost:9001/3.0/lists/test-one.example.com", "list_id": "test-one.example.com"}'}
892 headers:
893 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
894 Server: [WSGIServer/0.2 CPython/3.4.2]
895 content-length: ['319']
896 content-type: [application/json; charset=utf-8]
897 status: {code: 200, message: OK}
898- request:
899 body: null
900 headers:
901 accept-encoding: ['gzip, deflate']
902 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
903 user-agent: [GNU Mailman REST client v1.0.0b1]
904 method: GET
905 uri: http://localhost:9001/3.0/lists/test-three.example.com
906 response:
907 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
908 "example.com", "volume": 1, "fqdn_listname": "test-three@example.com", "member_count":
909 0, "http_etag": "\"c168aa6f2589f789bf71e7f3146b5f2cfb1c87f9\"", "self_link":
910 "http://localhost:9001/3.0/lists/test-three.example.com", "list_id": "test-three.example.com"}'}
911 headers:
912 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
913 Server: [WSGIServer/0.2 CPython/3.4.2]
914 content-length: ['329']
915 content-type: [application/json; charset=utf-8]
916 status: {code: 200, message: OK}
917- request:
918 body: null
919 headers:
920 accept-encoding: ['gzip, deflate']
921 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
922 user-agent: [GNU Mailman REST client v1.0.0b1]
923 method: GET
924 uri: http://localhost:9001/3.0/lists/test-two.example.com
925 response:
926 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
927 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
928 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"", "self_link":
929 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
930 headers:
931 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
932 Server: [WSGIServer/0.2 CPython/3.4.2]
933 content-length: ['319']
934 content-type: [application/json; charset=utf-8]
935 status: {code: 200, message: OK}
936- request:
937 body: null
938 headers:
939 accept-encoding: ['gzip, deflate']
940 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
941 user-agent: [GNU Mailman REST client v1.0.0b1]
942 method: GET
943 uri: http://localhost:9001/3.0/lists/test-three@example.net
944 response:
945 body: {string: '{"display_name": "Test-three", "list_name": "test-three", "mail_host":
946 "example.net", "volume": 1, "fqdn_listname": "test-three@example.net", "member_count":
947 0, "http_etag": "\"aac838e6414aceb4bd94838ce8587acd14c82689\"", "self_link":
948 "http://localhost:9001/3.0/lists/test-three.example.net", "list_id": "test-three.example.net"}'}
949 headers:
950 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
951 Server: [WSGIServer/0.2 CPython/3.4.2]
952 content-length: ['329']
953 content-type: [application/json; charset=utf-8]
954 status: {code: 200, message: OK}
955- request:
956 body: null
957 headers:
958 accept-encoding: ['gzip, deflate']
959 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
960 user-agent: [GNU Mailman REST client v1.0.0b1]
961 method: DELETE
962 uri: http://localhost:9001/3.0/lists/test-three@example.net
963 response:
964 body: {string: ''}
965 headers:
966 Content-Length: ['0']
967 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
968 Server: [WSGIServer/0.2 CPython/3.4.2]
969 status: {code: 204, message: No Content}
970- request:
971 body: null
972 headers:
973 accept-encoding: ['gzip, deflate']
974 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
975 user-agent: [GNU Mailman REST client v1.0.0b1]
976 method: DELETE
977 uri: http://localhost:9001/3.0/lists/test-three@example.com
978 response:
979 body: {string: ''}
980 headers:
981 Content-Length: ['0']
982 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
983 Server: [WSGIServer/0.2 CPython/3.4.2]
984 status: {code: 204, message: No Content}
985- request:
986 body: null
987 headers:
988 accept-encoding: ['gzip, deflate']
989 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
990 user-agent: [GNU Mailman REST client v1.0.0b1]
991 method: GET
992 uri: http://localhost:9001/3.0/lists
993 response:
994 body: {string: '{"entries": [{"display_name": "Test-one", "list_name": "test-one",
995 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-one@example.com",
996 "member_count": 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"",
997 "self_link": "http://localhost:9001/3.0/lists/test-one.example.com", "list_id":
998 "test-one.example.com"}, {"display_name": "Test-two", "list_name": "test-two",
999 "mail_host": "example.com", "volume": 1, "fqdn_listname": "test-two@example.com",
1000 "member_count": 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"",
1001 "self_link": "http://localhost:9001/3.0/lists/test-two.example.com", "list_id":
1002 "test-two.example.com"}], "http_etag": "\"7576518b52cee8dd837ba7de06531325e23d8051\"",
1003 "total_size": 2, "start": 0}'}
1004 headers:
1005 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
1006 Server: [WSGIServer/0.2 CPython/3.4.2]
1007 content-length: ['745']
1008 content-type: [application/json; charset=utf-8]
1009 status: {code: 200, message: OK}
1010- request:
1011 body: null
1012 headers:
1013 accept-encoding: ['gzip, deflate']
1014 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1015 user-agent: [GNU Mailman REST client v1.0.0b1]
1016 method: GET
1017 uri: http://localhost:9001/3.0/lists/test-one.example.com
1018 response:
1019 body: {string: '{"display_name": "Test-one", "list_name": "test-one", "mail_host":
1020 "example.com", "volume": 1, "fqdn_listname": "test-one@example.com", "member_count":
1021 0, "http_etag": "\"37400908e98dea4024428dd7983a06b749c86582\"", "self_link":
1022 "http://localhost:9001/3.0/lists/test-one.example.com", "list_id": "test-one.example.com"}'}
1023 headers:
1024 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
1025 Server: [WSGIServer/0.2 CPython/3.4.2]
1026 content-length: ['319']
1027 content-type: [application/json; charset=utf-8]
1028 status: {code: 200, message: OK}
1029- request:
1030 body: null
1031 headers:
1032 accept-encoding: ['gzip, deflate']
1033 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1034 user-agent: [GNU Mailman REST client v1.0.0b1]
1035 method: GET
1036 uri: http://localhost:9001/3.0/lists/test-two.example.com
1037 response:
1038 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
1039 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
1040 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"", "self_link":
1041 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
1042 headers:
1043 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
1044 Server: [WSGIServer/0.2 CPython/3.4.2]
1045 content-length: ['319']
1046 content-type: [application/json; charset=utf-8]
1047 status: {code: 200, message: OK}
1048- request:
1049 body: null
1050 headers:
1051 accept-encoding: ['gzip, deflate']
1052 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1053 user-agent: [GNU Mailman REST client v1.0.0b1]
1054 method: GET
1055 uri: http://localhost:9001/3.0/members
1056 response:
1057 body: {string: '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
1058 "total_size": 0, "start": 0}'}
1059 headers:
1060 Date: ['Sun, 04 Jan 2015 22:42:45 GMT']
1061 Server: [WSGIServer/0.2 CPython/3.4.2]
1062 content-length: ['90']
1063 content-type: [application/json; charset=utf-8]
1064 status: {code: 200, message: OK}
1065- request:
1066 body: null
1067 headers:
1068 accept-encoding: ['gzip, deflate']
1069 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1070 user-agent: [GNU Mailman REST client v1.0.0b1]
1071 method: GET
1072 uri: http://localhost:9001/3.0/lists/test-two@example.com
1073 response:
1074 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
1075 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
1076 0, "http_etag": "\"2b786766b483232ecccef33e919016281990bc7f\"", "self_link":
1077 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
1078 headers:
1079 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1080 Server: [WSGIServer/0.2 CPython/3.4.2]
1081 content-length: ['319']
1082 content-type: [application/json; charset=utf-8]
1083 status: {code: 200, message: OK}
1084- request:
1085 body: subscriber=anna%40example.com&display_name=Anna&list_id=test-one.example.com
1086 headers:
1087 accept-encoding: ['gzip, deflate']
1088 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1089 content-type: [application/x-www-form-urlencoded]
1090 user-agent: [GNU Mailman REST client v1.0.0b1]
1091 method: POST
1092 uri: http://localhost:9001/3.0/members
1093 response:
1094 body: {string: ''}
1095 headers:
1096 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1097 Server: [WSGIServer/0.2 CPython/3.4.2]
1098 content-length: ['0']
1099 location: ['http://localhost:9001/3.0/members/104473260871439163529610165544142173708']
1100 status: {code: 201, message: Created}
1101- request:
1102 body: null
1103 headers:
1104 accept-encoding: ['gzip, deflate']
1105 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1106 user-agent: [GNU Mailman REST client v1.0.0b1]
1107 method: GET
1108 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1109 response:
1110 body: {string: '{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1111 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1112 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1113 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1114 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1115 headers:
1116 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1117 Server: [WSGIServer/0.2 CPython/3.4.2]
1118 content-length: ['410']
1119 content-type: [application/json; charset=utf-8]
1120 status: {code: 200, message: OK}
1121- request:
1122 body: subscriber=bill%40example.com&display_name=Bill&list_id=test-one.example.com
1123 headers:
1124 accept-encoding: ['gzip, deflate']
1125 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1126 content-type: [application/x-www-form-urlencoded]
1127 user-agent: [GNU Mailman REST client v1.0.0b1]
1128 method: POST
1129 uri: http://localhost:9001/3.0/members
1130 response:
1131 body: {string: ''}
1132 headers:
1133 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1134 Server: [WSGIServer/0.2 CPython/3.4.2]
1135 content-length: ['0']
1136 location: ['http://localhost:9001/3.0/members/275272594951032189318671732666193338856']
1137 status: {code: 201, message: Created}
1138- request:
1139 body: null
1140 headers:
1141 accept-encoding: ['gzip, deflate']
1142 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1143 user-agent: [GNU Mailman REST client v1.0.0b1]
1144 method: GET
1145 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
1146 response:
1147 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1148 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1149 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1150 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1151 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
1152 headers:
1153 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1154 Server: [WSGIServer/0.2 CPython/3.4.2]
1155 content-length: ['411']
1156 content-type: [application/json; charset=utf-8]
1157 status: {code: 200, message: OK}
1158- request:
1159 body: subscriber=anna%40example.com&display_name=None&list_id=test-two.example.com
1160 headers:
1161 accept-encoding: ['gzip, deflate']
1162 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1163 content-type: [application/x-www-form-urlencoded]
1164 user-agent: [GNU Mailman REST client v1.0.0b1]
1165 method: POST
1166 uri: http://localhost:9001/3.0/members
1167 response:
1168 body: {string: ''}
1169 headers:
1170 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1171 Server: [WSGIServer/0.2 CPython/3.4.2]
1172 content-length: ['0']
1173 location: ['http://localhost:9001/3.0/members/18090098823740248348445588761302258241']
1174 status: {code: 201, message: Created}
1175- request:
1176 body: null
1177 headers:
1178 accept-encoding: ['gzip, deflate']
1179 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1180 user-agent: [GNU Mailman REST client v1.0.0b1]
1181 method: GET
1182 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
1183 response:
1184 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1185 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1186 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1187 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1188 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1189 headers:
1190 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1191 Server: [WSGIServer/0.2 CPython/3.4.2]
1192 content-length: ['409']
1193 content-type: [application/json; charset=utf-8]
1194 status: {code: 200, message: OK}
1195- request:
1196 body: subscriber=cris%40example.com&display_name=Cris&list_id=test-two.example.com
1197 headers:
1198 accept-encoding: ['gzip, deflate']
1199 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1200 content-type: [application/x-www-form-urlencoded]
1201 user-agent: [GNU Mailman REST client v1.0.0b1]
1202 method: POST
1203 uri: http://localhost:9001/3.0/members
1204 response:
1205 body: {string: ''}
1206 headers:
1207 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1208 Server: [WSGIServer/0.2 CPython/3.4.2]
1209 content-length: ['0']
1210 location: ['http://localhost:9001/3.0/members/277964071707554096935986210544886743347']
1211 status: {code: 201, message: Created}
1212- request:
1213 body: null
1214 headers:
1215 accept-encoding: ['gzip, deflate']
1216 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1217 user-agent: [GNU Mailman REST client v1.0.0b1]
1218 method: GET
1219 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
1220 response:
1221 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
1222 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1223 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1224 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1225 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
1226 headers:
1227 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1228 Server: [WSGIServer/0.2 CPython/3.4.2]
1229 content-length: ['411']
1230 content-type: [application/json; charset=utf-8]
1231 status: {code: 200, message: OK}
1232- request:
1233 body: null
1234 headers:
1235 accept-encoding: ['gzip, deflate']
1236 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1237 user-agent: [GNU Mailman REST client v1.0.0b1]
1238 method: GET
1239 uri: http://localhost:9001/3.0/members
1240 response:
1241 body: {string: '{"entries": [{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1242 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1243 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1244 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1245 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1246 {"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"", "delivery_mode":
1247 "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1248 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1249 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1250 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"},
1251 {"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"", "delivery_mode":
1252 "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1253 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1254 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1255 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1256 {"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"", "delivery_mode":
1257 "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1258 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1259 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1260 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}],
1261 "http_etag": "\"52ccb218ea5b606545a0a1509ecb57fcea5c30da\"", "total_size":
1262 4, "start": 0}'}
1263 headers:
1264 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1265 Server: [WSGIServer/0.2 CPython/3.4.2]
1266 content-length: ['1752']
1267 content-type: [application/json; charset=utf-8]
1268 status: {code: 200, message: OK}
1269- request:
1270 body: null
1271 headers:
1272 accept-encoding: ['gzip, deflate']
1273 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1274 user-agent: [GNU Mailman REST client v1.0.0b1]
1275 method: GET
1276 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1277 response:
1278 body: {string: '{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1279 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1280 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1281 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1282 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1283 headers:
1284 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1285 Server: [WSGIServer/0.2 CPython/3.4.2]
1286 content-length: ['410']
1287 content-type: [application/json; charset=utf-8]
1288 status: {code: 200, message: OK}
1289- request:
1290 body: null
1291 headers:
1292 accept-encoding: ['gzip, deflate']
1293 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1294 user-agent: [GNU Mailman REST client v1.0.0b1]
1295 method: GET
1296 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
1297 response:
1298 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1299 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1300 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1301 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1302 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
1303 headers:
1304 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1305 Server: [WSGIServer/0.2 CPython/3.4.2]
1306 content-length: ['411']
1307 content-type: [application/json; charset=utf-8]
1308 status: {code: 200, message: OK}
1309- request:
1310 body: null
1311 headers:
1312 accept-encoding: ['gzip, deflate']
1313 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1314 user-agent: [GNU Mailman REST client v1.0.0b1]
1315 method: GET
1316 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
1317 response:
1318 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1319 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1320 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1321 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1322 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1323 headers:
1324 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1325 Server: [WSGIServer/0.2 CPython/3.4.2]
1326 content-length: ['409']
1327 content-type: [application/json; charset=utf-8]
1328 status: {code: 200, message: OK}
1329- request:
1330 body: null
1331 headers:
1332 accept-encoding: ['gzip, deflate']
1333 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1334 user-agent: [GNU Mailman REST client v1.0.0b1]
1335 method: GET
1336 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
1337 response:
1338 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
1339 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1340 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1341 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1342 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
1343 headers:
1344 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1345 Server: [WSGIServer/0.2 CPython/3.4.2]
1346 content-length: ['411']
1347 content-type: [application/json; charset=utf-8]
1348 status: {code: 200, message: OK}
1349- request:
1350 body: null
1351 headers:
1352 accept-encoding: ['gzip, deflate']
1353 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1354 user-agent: [GNU Mailman REST client v1.0.0b1]
1355 method: GET
1356 uri: http://localhost:9001/3.0/lists/test-one@example.com/roster/member
1357 response:
1358 body: {string: '{"entries": [{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1359 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1360 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1361 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1362 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1363 {"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"", "delivery_mode":
1364 "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1365 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1366 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1367 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}],
1368 "http_etag": "\"035b2ef6161ccb46df27b7a6bec02c1a85cf471f\"", "total_size":
1369 2, "start": 0}'}
1370 headers:
1371 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1372 Server: [WSGIServer/0.2 CPython/3.4.2]
1373 content-length: ['928']
1374 content-type: [application/json; charset=utf-8]
1375 status: {code: 200, message: OK}
1376- request:
1377 body: null
1378 headers:
1379 accept-encoding: ['gzip, deflate']
1380 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1381 user-agent: [GNU Mailman REST client v1.0.0b1]
1382 method: GET
1383 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1384 response:
1385 body: {string: '{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1386 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1387 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1388 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1389 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1390 headers:
1391 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1392 Server: [WSGIServer/0.2 CPython/3.4.2]
1393 content-length: ['410']
1394 content-type: [application/json; charset=utf-8]
1395 status: {code: 200, message: OK}
1396- request:
1397 body: null
1398 headers:
1399 accept-encoding: ['gzip, deflate']
1400 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1401 user-agent: [GNU Mailman REST client v1.0.0b1]
1402 method: GET
1403 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
1404 response:
1405 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1406 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1407 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1408 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1409 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
1410 headers:
1411 Date: ['Sun, 04 Jan 2015 22:42:46 GMT']
1412 Server: [WSGIServer/0.2 CPython/3.4.2]
1413 content-length: ['411']
1414 content-type: [application/json; charset=utf-8]
1415 status: {code: 200, message: OK}
1416- request:
1417 body: null
1418 headers:
1419 accept-encoding: ['gzip, deflate']
1420 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1421 user-agent: [GNU Mailman REST client v1.0.0b1]
1422 method: GET
1423 uri: http://localhost:9001/3.0/members?count=2&page=1
1424 response:
1425 body: {string: '{"entries": [{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1426 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1427 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1428 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1429 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1430 {"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"", "delivery_mode":
1431 "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1432 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1433 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1434 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}],
1435 "http_etag": "\"035b2ef6161ccb46df27b7a6bec02c1a85cf471f\"", "total_size":
1436 2, "start": 0}'}
1437 headers:
1438 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1439 Server: [WSGIServer/0.2 CPython/3.4.2]
1440 content-length: ['928']
1441 content-type: [application/json; charset=utf-8]
1442 status: {code: 200, message: OK}
1443- request:
1444 body: null
1445 headers:
1446 accept-encoding: ['gzip, deflate']
1447 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1448 user-agent: [GNU Mailman REST client v1.0.0b1]
1449 method: GET
1450 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1451 response:
1452 body: {string: '{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1453 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1454 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1455 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1456 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1457 headers:
1458 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1459 Server: [WSGIServer/0.2 CPython/3.4.2]
1460 content-length: ['410']
1461 content-type: [application/json; charset=utf-8]
1462 status: {code: 200, message: OK}
1463- request:
1464 body: null
1465 headers:
1466 accept-encoding: ['gzip, deflate']
1467 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1468 user-agent: [GNU Mailman REST client v1.0.0b1]
1469 method: GET
1470 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
1471 response:
1472 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1473 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1474 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1475 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1476 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
1477 headers:
1478 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1479 Server: [WSGIServer/0.2 CPython/3.4.2]
1480 content-length: ['411']
1481 content-type: [application/json; charset=utf-8]
1482 status: {code: 200, message: OK}
1483- request:
1484 body: null
1485 headers:
1486 accept-encoding: ['gzip, deflate']
1487 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1488 user-agent: [GNU Mailman REST client v1.0.0b1]
1489 method: GET
1490 uri: http://localhost:9001/3.0/members?count=2&page=2
1491 response:
1492 body: {string: '{"entries": [{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1493 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1494 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1495 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1496 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1497 {"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"", "delivery_mode":
1498 "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1499 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1500 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1501 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}],
1502 "http_etag": "\"1146a3a8fbea4f6d9cd141f0243f98a5c85e9c47\"", "total_size":
1503 2, "start": 0}'}
1504 headers:
1505 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1506 Server: [WSGIServer/0.2 CPython/3.4.2]
1507 content-length: ['927']
1508 content-type: [application/json; charset=utf-8]
1509 status: {code: 200, message: OK}
1510- request:
1511 body: null
1512 headers:
1513 accept-encoding: ['gzip, deflate']
1514 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1515 user-agent: [GNU Mailman REST client v1.0.0b1]
1516 method: GET
1517 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
1518 response:
1519 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1520 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1521 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1522 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1523 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1524 headers:
1525 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1526 Server: [WSGIServer/0.2 CPython/3.4.2]
1527 content-length: ['409']
1528 content-type: [application/json; charset=utf-8]
1529 status: {code: 200, message: OK}
1530- request:
1531 body: null
1532 headers:
1533 accept-encoding: ['gzip, deflate']
1534 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1535 user-agent: [GNU Mailman REST client v1.0.0b1]
1536 method: GET
1537 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
1538 response:
1539 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
1540 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1541 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1542 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1543 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
1544 headers:
1545 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1546 Server: [WSGIServer/0.2 CPython/3.4.2]
1547 content-length: ['411']
1548 content-type: [application/json; charset=utf-8]
1549 status: {code: 200, message: OK}
1550- request:
1551 body: null
1552 headers:
1553 accept-encoding: ['gzip, deflate']
1554 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1555 user-agent: [GNU Mailman REST client v1.0.0b1]
1556 method: GET
1557 uri: http://localhost:9001/3.0/lists/test-one@example.com/roster/member?count=1&page=1
1558 response:
1559 body: {string: '{"entries": [{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1560 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1561 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1562 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1563 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}],
1564 "http_etag": "\"ddb98e7ce39d8994d3b2de98bcae1650a7359e78\"", "total_size":
1565 1, "start": 0}'}
1566 headers:
1567 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1568 Server: [WSGIServer/0.2 CPython/3.4.2]
1569 content-length: ['515']
1570 content-type: [application/json; charset=utf-8]
1571 status: {code: 200, message: OK}
1572- request:
1573 body: null
1574 headers:
1575 accept-encoding: ['gzip, deflate']
1576 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1577 user-agent: [GNU Mailman REST client v1.0.0b1]
1578 method: GET
1579 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1580 response:
1581 body: {string: '{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1582 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1583 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1584 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1585 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1586 headers:
1587 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1588 Server: [WSGIServer/0.2 CPython/3.4.2]
1589 content-length: ['410']
1590 content-type: [application/json; charset=utf-8]
1591 status: {code: 200, message: OK}
1592- request:
1593 body: null
1594 headers:
1595 accept-encoding: ['gzip, deflate']
1596 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1597 user-agent: [GNU Mailman REST client v1.0.0b1]
1598 method: GET
1599 uri: http://localhost:9001/3.0/lists/test-one@example.com/roster/member?count=1&page=2
1600 response:
1601 body: {string: '{"entries": [{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1602 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1603 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1604 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1605 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}],
1606 "http_etag": "\"f0171d45c23ec5087836f92aaf8ff0f0f70a9294\"", "total_size":
1607 1, "start": 0}'}
1608 headers:
1609 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1610 Server: [WSGIServer/0.2 CPython/3.4.2]
1611 content-length: ['516']
1612 content-type: [application/json; charset=utf-8]
1613 status: {code: 200, message: OK}
1614- request:
1615 body: null
1616 headers:
1617 accept-encoding: ['gzip, deflate']
1618 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1619 user-agent: [GNU Mailman REST client v1.0.0b1]
1620 method: GET
1621 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
1622 response:
1623 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1624 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1625 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1626 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1627 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
1628 headers:
1629 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1630 Server: [WSGIServer/0.2 CPython/3.4.2]
1631 content-length: ['411']
1632 content-type: [application/json; charset=utf-8]
1633 status: {code: 200, message: OK}
1634- request:
1635 body: null
1636 headers:
1637 accept-encoding: ['gzip, deflate']
1638 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1639 user-agent: [GNU Mailman REST client v1.0.0b1]
1640 method: GET
1641 uri: http://localhost:9001/3.0/lists/test-two@example.com/roster/member
1642 response:
1643 body: {string: '{"entries": [{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1644 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1645 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1646 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1647 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1648 {"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"", "delivery_mode":
1649 "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1650 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1651 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1652 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}],
1653 "http_etag": "\"1146a3a8fbea4f6d9cd141f0243f98a5c85e9c47\"", "total_size":
1654 2, "start": 0}'}
1655 headers:
1656 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1657 Server: [WSGIServer/0.2 CPython/3.4.2]
1658 content-length: ['927']
1659 content-type: [application/json; charset=utf-8]
1660 status: {code: 200, message: OK}
1661- request:
1662 body: null
1663 headers:
1664 accept-encoding: ['gzip, deflate']
1665 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1666 user-agent: [GNU Mailman REST client v1.0.0b1]
1667 method: GET
1668 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
1669 response:
1670 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1671 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1672 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1673 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1674 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1675 headers:
1676 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1677 Server: [WSGIServer/0.2 CPython/3.4.2]
1678 content-length: ['409']
1679 content-type: [application/json; charset=utf-8]
1680 status: {code: 200, message: OK}
1681- request:
1682 body: null
1683 headers:
1684 accept-encoding: ['gzip, deflate']
1685 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1686 user-agent: [GNU Mailman REST client v1.0.0b1]
1687 method: GET
1688 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
1689 response:
1690 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
1691 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1692 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1693 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1694 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
1695 headers:
1696 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1697 Server: [WSGIServer/0.2 CPython/3.4.2]
1698 content-length: ['411']
1699 content-type: [application/json; charset=utf-8]
1700 status: {code: 200, message: OK}
1701- request:
1702 body: null
1703 headers:
1704 accept-encoding: ['gzip, deflate']
1705 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1706 user-agent: [GNU Mailman REST client v1.0.0b1]
1707 method: GET
1708 uri: http://localhost:9001/3.0/lists/test-two@example.com
1709 response:
1710 body: {string: '{"display_name": "Test-two", "list_name": "test-two", "mail_host":
1711 "example.com", "volume": 1, "fqdn_listname": "test-two@example.com", "member_count":
1712 2, "http_etag": "\"d08cd84bdb77efc54164c377e86a9540fffcf6ab\"", "self_link":
1713 "http://localhost:9001/3.0/lists/test-two.example.com", "list_id": "test-two.example.com"}'}
1714 headers:
1715 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1716 Server: [WSGIServer/0.2 CPython/3.4.2]
1717 content-length: ['319']
1718 content-type: [application/json; charset=utf-8]
1719 status: {code: 200, message: OK}
1720- request:
1721 body: null
1722 headers:
1723 accept-encoding: ['gzip, deflate']
1724 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1725 user-agent: [GNU Mailman REST client v1.0.0b1]
1726 method: GET
1727 uri: http://localhost:9001/3.0/lists/test-two@example.com/roster/member
1728 response:
1729 body: {string: '{"entries": [{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1730 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1731 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1732 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1733 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1734 {"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"", "delivery_mode":
1735 "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1736 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1737 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1738 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}],
1739 "http_etag": "\"1146a3a8fbea4f6d9cd141f0243f98a5c85e9c47\"", "total_size":
1740 2, "start": 0}'}
1741 headers:
1742 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1743 Server: [WSGIServer/0.2 CPython/3.4.2]
1744 content-length: ['927']
1745 content-type: [application/json; charset=utf-8]
1746 status: {code: 200, message: OK}
1747- request:
1748 body: null
1749 headers:
1750 accept-encoding: ['gzip, deflate']
1751 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1752 user-agent: [GNU Mailman REST client v1.0.0b1]
1753 method: GET
1754 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
1755 response:
1756 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1757 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1758 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1759 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1760 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1761 headers:
1762 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1763 Server: [WSGIServer/0.2 CPython/3.4.2]
1764 content-length: ['409']
1765 content-type: [application/json; charset=utf-8]
1766 status: {code: 200, message: OK}
1767- request:
1768 body: null
1769 headers:
1770 accept-encoding: ['gzip, deflate']
1771 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1772 user-agent: [GNU Mailman REST client v1.0.0b1]
1773 method: GET
1774 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
1775 response:
1776 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
1777 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1778 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1779 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1780 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
1781 headers:
1782 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1783 Server: [WSGIServer/0.2 CPython/3.4.2]
1784 content-length: ['411']
1785 content-type: [application/json; charset=utf-8]
1786 status: {code: 200, message: OK}
1787- request:
1788 body: null
1789 headers:
1790 accept-encoding: ['gzip, deflate']
1791 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1792 user-agent: [GNU Mailman REST client v1.0.0b1]
1793 method: GET
1794 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347/preferences
1795 response:
1796 body: {string: '{"http_etag": "\"c92a598f73d802965003673ce4b295c8ac99044e\"",
1797 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347/preferences"}'}
1798 headers:
1799 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1800 Server: [WSGIServer/0.2 CPython/3.4.2]
1801 content-length: ['191']
1802 content-type: [application/json; charset=utf-8]
1803 status: {code: 200, message: OK}
1804- request:
1805 body: null
1806 headers:
1807 accept-encoding: ['gzip, deflate']
1808 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1809 user-agent: [GNU Mailman REST client v1.0.0b1]
1810 method: GET
1811 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337
1812 response:
1813 body: {string: '{"display_name": "Cris", "created_on": "2015-01-04T22:42:46.585952",
1814 "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"", "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
1815 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
1816 "user_id": 124469682936455360048380387046363665337}'}
1817 headers:
1818 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1819 Server: [WSGIServer/0.2 CPython/3.4.2]
1820 content-length: ['404']
1821 content-type: [application/json; charset=utf-8]
1822 status: {code: 200, message: OK}
1823- request:
1824 body: null
1825 headers:
1826 accept-encoding: ['gzip, deflate']
1827 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1828 user-agent: [GNU Mailman REST client v1.0.0b1]
1829 method: GET
1830 uri: http://localhost:9001/3.0/lists/test-two@example.com/roster/member
1831 response:
1832 body: {string: '{"entries": [{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1833 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1834 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1835 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1836 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1837 {"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"", "delivery_mode":
1838 "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1839 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1840 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1841 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}],
1842 "http_etag": "\"1146a3a8fbea4f6d9cd141f0243f98a5c85e9c47\"", "total_size":
1843 2, "start": 0}'}
1844 headers:
1845 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1846 Server: [WSGIServer/0.2 CPython/3.4.2]
1847 content-length: ['927']
1848 content-type: [application/json; charset=utf-8]
1849 status: {code: 200, message: OK}
1850- request:
1851 body: null
1852 headers:
1853 accept-encoding: ['gzip, deflate']
1854 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1855 user-agent: [GNU Mailman REST client v1.0.0b1]
1856 method: GET
1857 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
1858 response:
1859 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
1860 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1861 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1862 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1863 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1864 headers:
1865 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1866 Server: [WSGIServer/0.2 CPython/3.4.2]
1867 content-length: ['409']
1868 content-type: [application/json; charset=utf-8]
1869 status: {code: 200, message: OK}
1870- request:
1871 body: null
1872 headers:
1873 accept-encoding: ['gzip, deflate']
1874 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1875 user-agent: [GNU Mailman REST client v1.0.0b1]
1876 method: GET
1877 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
1878 response:
1879 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
1880 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1881 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1882 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1883 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
1884 headers:
1885 Date: ['Sun, 04 Jan 2015 22:42:47 GMT']
1886 Server: [WSGIServer/0.2 CPython/3.4.2]
1887 content-length: ['411']
1888 content-type: [application/json; charset=utf-8]
1889 status: {code: 200, message: OK}
1890- request:
1891 body: null
1892 headers:
1893 accept-encoding: ['gzip, deflate']
1894 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1895 user-agent: [GNU Mailman REST client v1.0.0b1]
1896 method: GET
1897 uri: http://localhost:9001/3.0/lists/test-one@example.com/roster/member
1898 response:
1899 body: {string: '{"entries": [{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1900 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1901 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1902 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1903 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1904 {"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"", "delivery_mode":
1905 "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1906 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1907 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1908 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}],
1909 "http_etag": "\"035b2ef6161ccb46df27b7a6bec02c1a85cf471f\"", "total_size":
1910 2, "start": 0}'}
1911 headers:
1912 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
1913 Server: [WSGIServer/0.2 CPython/3.4.2]
1914 content-length: ['928']
1915 content-type: [application/json; charset=utf-8]
1916 status: {code: 200, message: OK}
1917- request:
1918 body: null
1919 headers:
1920 accept-encoding: ['gzip, deflate']
1921 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1922 user-agent: [GNU Mailman REST client v1.0.0b1]
1923 method: GET
1924 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1925 response:
1926 body: {string: '{"http_etag": "\"791c35b4fc3a7d325559ba98bf459a91f0ec0b97\"",
1927 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/104473260871439163529610165544142173708",
1928 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1929 "test-one.example.com", "email": "anna@example.com", "role": "member", "user":
1930 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
1931 headers:
1932 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
1933 Server: [WSGIServer/0.2 CPython/3.4.2]
1934 content-length: ['410']
1935 content-type: [application/json; charset=utf-8]
1936 status: {code: 200, message: OK}
1937- request:
1938 body: null
1939 headers:
1940 accept-encoding: ['gzip, deflate']
1941 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1942 user-agent: [GNU Mailman REST client v1.0.0b1]
1943 method: DELETE
1944 uri: http://localhost:9001/3.0/members/104473260871439163529610165544142173708
1945 response:
1946 body: {string: ''}
1947 headers:
1948 Content-Length: ['0']
1949 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
1950 Server: [WSGIServer/0.2 CPython/3.4.2]
1951 status: {code: 204, message: No Content}
1952- request:
1953 body: null
1954 headers:
1955 accept-encoding: ['gzip, deflate']
1956 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1957 user-agent: [GNU Mailman REST client v1.0.0b1]
1958 method: GET
1959 uri: http://localhost:9001/3.0/members
1960 response:
1961 body: {string: '{"entries": [{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1962 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1963 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1964 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1965 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"},
1966 {"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"", "delivery_mode":
1967 "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
1968 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
1969 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
1970 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"},
1971 {"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"", "delivery_mode":
1972 "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
1973 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
1974 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
1975 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}],
1976 "http_etag": "\"0dfdbb6a939f9d964c0aec89b14a11a3c5089eee\"", "total_size":
1977 3, "start": 0}'}
1978 headers:
1979 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
1980 Server: [WSGIServer/0.2 CPython/3.4.2]
1981 content-length: ['1340']
1982 content-type: [application/json; charset=utf-8]
1983 status: {code: 200, message: OK}
1984- request:
1985 body: null
1986 headers:
1987 accept-encoding: ['gzip, deflate']
1988 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
1989 user-agent: [GNU Mailman REST client v1.0.0b1]
1990 method: GET
1991 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
1992 response:
1993 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
1994 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
1995 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
1996 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
1997 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
1998 headers:
1999 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
2000 Server: [WSGIServer/0.2 CPython/3.4.2]
2001 content-length: ['411']
2002 content-type: [application/json; charset=utf-8]
2003 status: {code: 200, message: OK}
2004- request:
2005 body: null
2006 headers:
2007 accept-encoding: ['gzip, deflate']
2008 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2009 user-agent: [GNU Mailman REST client v1.0.0b1]
2010 method: GET
2011 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
2012 response:
2013 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
2014 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
2015 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
2016 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
2017 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
2018 headers:
2019 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
2020 Server: [WSGIServer/0.2 CPython/3.4.2]
2021 content-length: ['409']
2022 content-type: [application/json; charset=utf-8]
2023 status: {code: 200, message: OK}
2024- request:
2025 body: null
2026 headers:
2027 accept-encoding: ['gzip, deflate']
2028 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2029 user-agent: [GNU Mailman REST client v1.0.0b1]
2030 method: GET
2031 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
2032 response:
2033 body: {string: '{"http_etag": "\"7e9fbe757624318db74a977eb13491950d78fce7\"",
2034 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/277964071707554096935986210544886743347",
2035 "address": "http://localhost:9001/3.0/addresses/cris@example.com", "list_id":
2036 "test-two.example.com", "email": "cris@example.com", "role": "member", "user":
2037 "http://localhost:9001/3.0/users/124469682936455360048380387046363665337"}'}
2038 headers:
2039 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
2040 Server: [WSGIServer/0.2 CPython/3.4.2]
2041 content-length: ['411']
2042 content-type: [application/json; charset=utf-8]
2043 status: {code: 200, message: OK}
2044- request:
2045 body: null
2046 headers:
2047 accept-encoding: ['gzip, deflate']
2048 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2049 user-agent: [GNU Mailman REST client v1.0.0b1]
2050 method: DELETE
2051 uri: http://localhost:9001/3.0/members/277964071707554096935986210544886743347
2052 response:
2053 body: {string: ''}
2054 headers:
2055 Content-Length: ['0']
2056 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
2057 Server: [WSGIServer/0.2 CPython/3.4.2]
2058 status: {code: 204, message: No Content}
2059- request:
2060 body: null
2061 headers:
2062 accept-encoding: ['gzip, deflate']
2063 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2064 user-agent: [GNU Mailman REST client v1.0.0b1]
2065 method: GET
2066 uri: http://localhost:9001/3.0/members
2067 response:
2068 body: {string: '{"entries": [{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
2069 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
2070 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
2071 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
2072 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"},
2073 {"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"", "delivery_mode":
2074 "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
2075 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
2076 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
2077 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}],
2078 "http_etag": "\"0faf9fc88982999af8efa057d2f0871c072eb2bd\"", "total_size":
2079 2, "start": 0}'}
2080 headers:
2081 Date: ['Sun, 04 Jan 2015 22:42:49 GMT']
2082 Server: [WSGIServer/0.2 CPython/3.4.2]
2083 content-length: ['927']
2084 content-type: [application/json; charset=utf-8]
2085 status: {code: 200, message: OK}
2086- request:
2087 body: null
2088 headers:
2089 accept-encoding: ['gzip, deflate']
2090 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2091 user-agent: [GNU Mailman REST client v1.0.0b1]
2092 method: GET
2093 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
2094 response:
2095 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
2096 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
2097 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
2098 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
2099 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
2100 headers:
2101 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2102 Server: [WSGIServer/0.2 CPython/3.4.2]
2103 content-length: ['411']
2104 content-type: [application/json; charset=utf-8]
2105 status: {code: 200, message: OK}
2106- request:
2107 body: null
2108 headers:
2109 accept-encoding: ['gzip, deflate']
2110 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2111 user-agent: [GNU Mailman REST client v1.0.0b1]
2112 method: GET
2113 uri: http://localhost:9001/3.0/members/18090098823740248348445588761302258241
2114 response:
2115 body: {string: '{"http_etag": "\"cb2d6f0b4bed8456d32dc0f83a47ba2ee264e661\"",
2116 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/18090098823740248348445588761302258241",
2117 "address": "http://localhost:9001/3.0/addresses/anna@example.com", "list_id":
2118 "test-two.example.com", "email": "anna@example.com", "role": "member", "user":
2119 "http://localhost:9001/3.0/users/53219726604340771000788887326802581518"}'}
2120 headers:
2121 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2122 Server: [WSGIServer/0.2 CPython/3.4.2]
2123 content-length: ['409']
2124 content-type: [application/json; charset=utf-8]
2125 status: {code: 200, message: OK}
2126- request:
2127 body: null
2128 headers:
2129 accept-encoding: ['gzip, deflate']
2130 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2131 user-agent: [GNU Mailman REST client v1.0.0b1]
2132 method: GET
2133 uri: http://localhost:9001/3.0/lists/test-one@example.com/roster/member
2134 response:
2135 body: {string: '{"entries": [{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
2136 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
2137 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
2138 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
2139 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}],
2140 "http_etag": "\"f0171d45c23ec5087836f92aaf8ff0f0f70a9294\"", "total_size":
2141 1, "start": 0}'}
2142 headers:
2143 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2144 Server: [WSGIServer/0.2 CPython/3.4.2]
2145 content-length: ['516']
2146 content-type: [application/json; charset=utf-8]
2147 status: {code: 200, message: OK}
2148- request:
2149 body: null
2150 headers:
2151 accept-encoding: ['gzip, deflate']
2152 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2153 user-agent: [GNU Mailman REST client v1.0.0b1]
2154 method: GET
2155 uri: http://localhost:9001/3.0/members/275272594951032189318671732666193338856
2156 response:
2157 body: {string: '{"http_etag": "\"0e88aa304c672fe175da32e7ef6ee81d65d94856\"",
2158 "delivery_mode": "regular", "self_link": "http://localhost:9001/3.0/members/275272594951032189318671732666193338856",
2159 "address": "http://localhost:9001/3.0/addresses/bill@example.com", "list_id":
2160 "test-one.example.com", "email": "bill@example.com", "role": "member", "user":
2161 "http://localhost:9001/3.0/users/282238326831930934086115995946546408713"}'}
2162 headers:
2163 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2164 Server: [WSGIServer/0.2 CPython/3.4.2]
2165 content-length: ['411']
2166 content-type: [application/json; charset=utf-8]
2167 status: {code: 200, message: OK}
2168- request:
2169 body: list_id=test-one.example.com&role=nonmember
2170 headers:
2171 accept-encoding: ['gzip, deflate']
2172 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2173 content-type: [application/x-www-form-urlencoded]
2174 user-agent: [GNU Mailman REST client v1.0.0b1]
2175 method: POST
2176 uri: http://localhost:9001/3.0/members/find
2177 response:
2178 body: {string: '{"http_etag": "\"32223434a0f3af4cdc4673d1fbc5bac1f6d98fd3\"",
2179 "total_size": 0, "start": 0}'}
2180 headers:
2181 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2182 Server: [WSGIServer/0.2 CPython/3.4.2]
2183 content-length: ['90']
2184 content-type: [application/json; charset=utf-8]
2185 status: {code: 200, message: OK}
2186- request:
2187 body: null
2188 headers:
2189 accept-encoding: ['gzip, deflate']
2190 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2191 user-agent: [GNU Mailman REST client v1.0.0b1]
2192 method: GET
2193 uri: http://localhost:9001/3.0/users
2194 response:
2195 body: {string: '{"entries": [{"display_name": "Anna", "created_on": "2015-01-04T22:42:46.058449",
2196 "http_etag": "\"38cfaada6ec706c48e1a453e5b774aff209942e4\"", "password": "$6$rounds=104746$a6kjw9ZdJUX8E7Ig$lm4HU6MIyMcOgPteqwHqFpJuey7zc7WkO4.bqw4hmEc7hrfZFmN9iTdgAPc8zm04QT8HL8gfqQKXxnAe6uAFh1",
2197 "self_link": "http://localhost:9001/3.0/users/53219726604340771000788887326802581518",
2198 "user_id": 53219726604340771000788887326802581518}, {"display_name": "Bill",
2199 "created_on": "2015-01-04T22:42:46.289167", "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"",
2200 "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2201 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2202 "user_id": 282238326831930934086115995946546408713}, {"display_name": "Cris",
2203 "created_on": "2015-01-04T22:42:46.585952", "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"",
2204 "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
2205 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2206 "user_id": 124469682936455360048380387046363665337}], "http_etag": "\"5cdb208d747b21a3e3f8d7c04c8831d8713a2d02\"",
2207 "total_size": 3, "start": 0}'}
2208 headers:
2209 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2210 Server: [WSGIServer/0.2 CPython/3.4.2]
2211 content-length: ['1320']
2212 content-type: [application/json; charset=utf-8]
2213 status: {code: 200, message: OK}
2214- request:
2215 body: null
2216 headers:
2217 accept-encoding: ['gzip, deflate']
2218 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2219 user-agent: [GNU Mailman REST client v1.0.0b1]
2220 method: GET
2221 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337
2222 response:
2223 body: {string: '{"display_name": "Cris", "created_on": "2015-01-04T22:42:46.585952",
2224 "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"", "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
2225 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2226 "user_id": 124469682936455360048380387046363665337}'}
2227 headers:
2228 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2229 Server: [WSGIServer/0.2 CPython/3.4.2]
2230 content-length: ['404']
2231 content-type: [application/json; charset=utf-8]
2232 status: {code: 200, message: OK}
2233- request:
2234 body: null
2235 headers:
2236 accept-encoding: ['gzip, deflate']
2237 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2238 user-agent: [GNU Mailman REST client v1.0.0b1]
2239 method: GET
2240 uri: http://localhost:9001/3.0/users/282238326831930934086115995946546408713
2241 response:
2242 body: {string: '{"display_name": "Bill", "created_on": "2015-01-04T22:42:46.289167",
2243 "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"", "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2244 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2245 "user_id": 282238326831930934086115995946546408713}'}
2246 headers:
2247 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2248 Server: [WSGIServer/0.2 CPython/3.4.2]
2249 content-length: ['404']
2250 content-type: [application/json; charset=utf-8]
2251 status: {code: 200, message: OK}
2252- request:
2253 body: null
2254 headers:
2255 accept-encoding: ['gzip, deflate']
2256 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2257 user-agent: [GNU Mailman REST client v1.0.0b1]
2258 method: GET
2259 uri: http://localhost:9001/3.0/users/53219726604340771000788887326802581518
2260 response:
2261 body: {string: '{"display_name": "Anna", "created_on": "2015-01-04T22:42:46.058449",
2262 "http_etag": "\"38cfaada6ec706c48e1a453e5b774aff209942e4\"", "password": "$6$rounds=104746$a6kjw9ZdJUX8E7Ig$lm4HU6MIyMcOgPteqwHqFpJuey7zc7WkO4.bqw4hmEc7hrfZFmN9iTdgAPc8zm04QT8HL8gfqQKXxnAe6uAFh1",
2263 "self_link": "http://localhost:9001/3.0/users/53219726604340771000788887326802581518",
2264 "user_id": 53219726604340771000788887326802581518}'}
2265 headers:
2266 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2267 Server: [WSGIServer/0.2 CPython/3.4.2]
2268 content-length: ['403']
2269 content-type: [application/json; charset=utf-8]
2270 status: {code: 200, message: OK}
2271- request:
2272 body: null
2273 headers:
2274 accept-encoding: ['gzip, deflate']
2275 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2276 user-agent: [GNU Mailman REST client v1.0.0b1]
2277 method: GET
2278 uri: http://localhost:9001/3.0/users?count=2&page=1
2279 response:
2280 body: {string: '{"entries": [{"display_name": "Anna", "created_on": "2015-01-04T22:42:46.058449",
2281 "http_etag": "\"38cfaada6ec706c48e1a453e5b774aff209942e4\"", "password": "$6$rounds=104746$a6kjw9ZdJUX8E7Ig$lm4HU6MIyMcOgPteqwHqFpJuey7zc7WkO4.bqw4hmEc7hrfZFmN9iTdgAPc8zm04QT8HL8gfqQKXxnAe6uAFh1",
2282 "self_link": "http://localhost:9001/3.0/users/53219726604340771000788887326802581518",
2283 "user_id": 53219726604340771000788887326802581518}, {"display_name": "Bill",
2284 "created_on": "2015-01-04T22:42:46.289167", "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"",
2285 "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2286 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2287 "user_id": 282238326831930934086115995946546408713}], "http_etag": "\"5a99b5066025762287b4d885d50a920ec8f51ec3\"",
2288 "total_size": 2, "start": 0}'}
2289 headers:
2290 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2291 Server: [WSGIServer/0.2 CPython/3.4.2]
2292 content-length: ['914']
2293 content-type: [application/json; charset=utf-8]
2294 status: {code: 200, message: OK}
2295- request:
2296 body: null
2297 headers:
2298 accept-encoding: ['gzip, deflate']
2299 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2300 user-agent: [GNU Mailman REST client v1.0.0b1]
2301 method: GET
2302 uri: http://localhost:9001/3.0/users/53219726604340771000788887326802581518
2303 response:
2304 body: {string: '{"display_name": "Anna", "created_on": "2015-01-04T22:42:46.058449",
2305 "http_etag": "\"38cfaada6ec706c48e1a453e5b774aff209942e4\"", "password": "$6$rounds=104746$a6kjw9ZdJUX8E7Ig$lm4HU6MIyMcOgPteqwHqFpJuey7zc7WkO4.bqw4hmEc7hrfZFmN9iTdgAPc8zm04QT8HL8gfqQKXxnAe6uAFh1",
2306 "self_link": "http://localhost:9001/3.0/users/53219726604340771000788887326802581518",
2307 "user_id": 53219726604340771000788887326802581518}'}
2308 headers:
2309 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2310 Server: [WSGIServer/0.2 CPython/3.4.2]
2311 content-length: ['403']
2312 content-type: [application/json; charset=utf-8]
2313 status: {code: 200, message: OK}
2314- request:
2315 body: null
2316 headers:
2317 accept-encoding: ['gzip, deflate']
2318 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2319 user-agent: [GNU Mailman REST client v1.0.0b1]
2320 method: GET
2321 uri: http://localhost:9001/3.0/users/282238326831930934086115995946546408713
2322 response:
2323 body: {string: '{"display_name": "Bill", "created_on": "2015-01-04T22:42:46.289167",
2324 "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"", "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2325 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2326 "user_id": 282238326831930934086115995946546408713}'}
2327 headers:
2328 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2329 Server: [WSGIServer/0.2 CPython/3.4.2]
2330 content-length: ['404']
2331 content-type: [application/json; charset=utf-8]
2332 status: {code: 200, message: OK}
2333- request:
2334 body: null
2335 headers:
2336 accept-encoding: ['gzip, deflate']
2337 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2338 user-agent: [GNU Mailman REST client v1.0.0b1]
2339 method: GET
2340 uri: http://localhost:9001/3.0/users?count=2&page=2
2341 response:
2342 body: {string: '{"entries": [{"display_name": "Cris", "created_on": "2015-01-04T22:42:46.585952",
2343 "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"", "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
2344 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2345 "user_id": 124469682936455360048380387046363665337}], "http_etag": "\"36e84cef22a2eba7b77c527a1b8de775f70c3810\"",
2346 "total_size": 1, "start": 0}'}
2347 headers:
2348 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2349 Server: [WSGIServer/0.2 CPython/3.4.2]
2350 content-length: ['509']
2351 content-type: [application/json; charset=utf-8]
2352 status: {code: 200, message: OK}
2353- request:
2354 body: null
2355 headers:
2356 accept-encoding: ['gzip, deflate']
2357 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2358 user-agent: [GNU Mailman REST client v1.0.0b1]
2359 method: GET
2360 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337
2361 response:
2362 body: {string: '{"display_name": "Cris", "created_on": "2015-01-04T22:42:46.585952",
2363 "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"", "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
2364 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2365 "user_id": 124469682936455360048380387046363665337}'}
2366 headers:
2367 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2368 Server: [WSGIServer/0.2 CPython/3.4.2]
2369 content-length: ['404']
2370 content-type: [application/json; charset=utf-8]
2371 status: {code: 200, message: OK}
2372- request:
2373 body: null
2374 headers:
2375 accept-encoding: ['gzip, deflate']
2376 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2377 user-agent: [GNU Mailman REST client v1.0.0b1]
2378 method: GET
2379 uri: http://localhost:9001/3.0/users?count=2&page=1
2380 response:
2381 body: {string: '{"entries": [{"display_name": "Anna", "created_on": "2015-01-04T22:42:46.058449",
2382 "http_etag": "\"38cfaada6ec706c48e1a453e5b774aff209942e4\"", "password": "$6$rounds=104746$a6kjw9ZdJUX8E7Ig$lm4HU6MIyMcOgPteqwHqFpJuey7zc7WkO4.bqw4hmEc7hrfZFmN9iTdgAPc8zm04QT8HL8gfqQKXxnAe6uAFh1",
2383 "self_link": "http://localhost:9001/3.0/users/53219726604340771000788887326802581518",
2384 "user_id": 53219726604340771000788887326802581518}, {"display_name": "Bill",
2385 "created_on": "2015-01-04T22:42:46.289167", "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"",
2386 "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2387 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2388 "user_id": 282238326831930934086115995946546408713}], "http_etag": "\"5a99b5066025762287b4d885d50a920ec8f51ec3\"",
2389 "total_size": 2, "start": 0}'}
2390 headers:
2391 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2392 Server: [WSGIServer/0.2 CPython/3.4.2]
2393 content-length: ['914']
2394 content-type: [application/json; charset=utf-8]
2395 status: {code: 200, message: OK}
2396- request:
2397 body: null
2398 headers:
2399 accept-encoding: ['gzip, deflate']
2400 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2401 user-agent: [GNU Mailman REST client v1.0.0b1]
2402 method: GET
2403 uri: http://localhost:9001/3.0/users/53219726604340771000788887326802581518
2404 response:
2405 body: {string: '{"display_name": "Anna", "created_on": "2015-01-04T22:42:46.058449",
2406 "http_etag": "\"38cfaada6ec706c48e1a453e5b774aff209942e4\"", "password": "$6$rounds=104746$a6kjw9ZdJUX8E7Ig$lm4HU6MIyMcOgPteqwHqFpJuey7zc7WkO4.bqw4hmEc7hrfZFmN9iTdgAPc8zm04QT8HL8gfqQKXxnAe6uAFh1",
2407 "self_link": "http://localhost:9001/3.0/users/53219726604340771000788887326802581518",
2408 "user_id": 53219726604340771000788887326802581518}'}
2409 headers:
2410 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2411 Server: [WSGIServer/0.2 CPython/3.4.2]
2412 content-length: ['403']
2413 content-type: [application/json; charset=utf-8]
2414 status: {code: 200, message: OK}
2415- request:
2416 body: null
2417 headers:
2418 accept-encoding: ['gzip, deflate']
2419 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2420 user-agent: [GNU Mailman REST client v1.0.0b1]
2421 method: GET
2422 uri: http://localhost:9001/3.0/users/282238326831930934086115995946546408713
2423 response:
2424 body: {string: '{"display_name": "Bill", "created_on": "2015-01-04T22:42:46.289167",
2425 "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"", "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2426 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2427 "user_id": 282238326831930934086115995946546408713}'}
2428 headers:
2429 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2430 Server: [WSGIServer/0.2 CPython/3.4.2]
2431 content-length: ['404']
2432 content-type: [application/json; charset=utf-8]
2433 status: {code: 200, message: OK}
2434- request:
2435 body: null
2436 headers:
2437 accept-encoding: ['gzip, deflate']
2438 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2439 user-agent: [GNU Mailman REST client v1.0.0b1]
2440 method: GET
2441 uri: http://localhost:9001/3.0/users/cris@example.com
2442 response:
2443 body: {string: '{"display_name": "Cris", "created_on": "2015-01-04T22:42:46.585952",
2444 "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"", "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
2445 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2446 "user_id": 124469682936455360048380387046363665337}'}
2447 headers:
2448 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2449 Server: [WSGIServer/0.2 CPython/3.4.2]
2450 content-length: ['404']
2451 content-type: [application/json; charset=utf-8]
2452 status: {code: 200, message: OK}
2453- request:
2454 body: null
2455 headers:
2456 accept-encoding: ['gzip, deflate']
2457 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2458 user-agent: [GNU Mailman REST client v1.0.0b1]
2459 method: GET
2460 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337
2461 response:
2462 body: {string: '{"display_name": "Cris", "created_on": "2015-01-04T22:42:46.585952",
2463 "http_etag": "\"d90ffc1b68bce7104b233c1db8f845e99c7bd825\"", "password": "$6$rounds=92010$7YY2dmehop54XUlN$AmEKAOmx8038OgvF5/lXAJZuIW9ZWw.q.sEgT2BO9ypTD0GsTzkwQxKVgu2aCkcpkCQRJaw2sM/EjaeqUYfMY0",
2464 "self_link": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2465 "user_id": 124469682936455360048380387046363665337}'}
2466 headers:
2467 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2468 Server: [WSGIServer/0.2 CPython/3.4.2]
2469 content-length: ['404']
2470 content-type: [application/json; charset=utf-8]
2471 status: {code: 200, message: OK}
2472- request:
2473 body: null
2474 headers:
2475 accept-encoding: ['gzip, deflate']
2476 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2477 user-agent: [GNU Mailman REST client v1.0.0b1]
2478 method: GET
2479 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337/addresses
2480 response:
2481 body: {string: '{"entries": [{"display_name": "Cris", "http_etag": "\"34ebc29602ad70d31b728755584723a2e02238a5\"",
2482 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2483 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2484 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2485 "cris@example.com"}], "http_etag": "\"469ab74e2321ef1e1ab60af79835859cec5786ab\"",
2486 "total_size": 1, "start": 0}'}
2487 headers:
2488 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2489 Server: [WSGIServer/0.2 CPython/3.4.2]
2490 content-length: ['456']
2491 content-type: [application/json; charset=utf-8]
2492 status: {code: 200, message: OK}
2493- request:
2494 body: null
2495 headers:
2496 accept-encoding: ['gzip, deflate']
2497 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2498 user-agent: [GNU Mailman REST client v1.0.0b1]
2499 method: GET
2500 uri: http://localhost:9001/3.0/addresses/cris@example.com
2501 response:
2502 body: {string: '{"display_name": "Cris", "http_etag": "\"34ebc29602ad70d31b728755584723a2e02238a5\"",
2503 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2504 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2505 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2506 "cris@example.com"}'}
2507 headers:
2508 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2509 Server: [WSGIServer/0.2 CPython/3.4.2]
2510 content-length: ['351']
2511 content-type: [application/json; charset=utf-8]
2512 status: {code: 200, message: OK}
2513- request:
2514 body: email=cris.person%40example.org
2515 headers:
2516 accept-encoding: ['gzip, deflate']
2517 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2518 content-type: [application/x-www-form-urlencoded]
2519 user-agent: [GNU Mailman REST client v1.0.0b1]
2520 method: POST
2521 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337/addresses
2522 response:
2523 body: {string: ''}
2524 headers:
2525 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2526 Server: [WSGIServer/0.2 CPython/3.4.2]
2527 content-length: ['0']
2528 location: ['http://localhost:9001/3.0/addresses/cris.person@example.org']
2529 status: {code: 201, message: Created}
2530- request:
2531 body: null
2532 headers:
2533 accept-encoding: ['gzip, deflate']
2534 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2535 user-agent: [GNU Mailman REST client v1.0.0b1]
2536 method: GET
2537 uri: http://localhost:9001/3.0/addresses/cris.person@example.org
2538 response:
2539 body: {string: '{"http_etag": "\"c023ccd7bf2c69ff9dafae0e2bdd223a4bc14aef\"",
2540 "self_link": "http://localhost:9001/3.0/addresses/cris.person@example.org",
2541 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2542 "registered_on": "2015-01-04T22:42:50.455755", "email": "cris.person@example.org",
2543 "original_email": "cris.person@example.org"}'}
2544 headers:
2545 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2546 Server: [WSGIServer/0.2 CPython/3.4.2]
2547 content-length: ['348']
2548 content-type: [application/json; charset=utf-8]
2549 status: {code: 200, message: OK}
2550- request:
2551 body: null
2552 headers:
2553 accept-encoding: ['gzip, deflate']
2554 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2555 user-agent: [GNU Mailman REST client v1.0.0b1]
2556 method: GET
2557 uri: http://localhost:9001/3.0/users/124469682936455360048380387046363665337/addresses
2558 response:
2559 body: {string: '{"entries": [{"http_etag": "\"c023ccd7bf2c69ff9dafae0e2bdd223a4bc14aef\"",
2560 "self_link": "http://localhost:9001/3.0/addresses/cris.person@example.org",
2561 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2562 "registered_on": "2015-01-04T22:42:50.455755", "email": "cris.person@example.org",
2563 "original_email": "cris.person@example.org"}, {"display_name": "Cris", "http_etag":
2564 "\"34ebc29602ad70d31b728755584723a2e02238a5\"", "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2565 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2566 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2567 "cris@example.com"}], "http_etag": "\"e309820611085e383deb6897c40d36343c0c2d9c\"",
2568 "total_size": 2, "start": 0}'}
2569 headers:
2570 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2571 Server: [WSGIServer/0.2 CPython/3.4.2]
2572 content-length: ['806']
2573 content-type: [application/json; charset=utf-8]
2574 status: {code: 200, message: OK}
2575- request:
2576 body: null
2577 headers:
2578 accept-encoding: ['gzip, deflate']
2579 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2580 user-agent: [GNU Mailman REST client v1.0.0b1]
2581 method: GET
2582 uri: http://localhost:9001/3.0/addresses/cris@example.com
2583 response:
2584 body: {string: '{"display_name": "Cris", "http_etag": "\"34ebc29602ad70d31b728755584723a2e02238a5\"",
2585 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2586 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2587 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2588 "cris@example.com"}'}
2589 headers:
2590 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2591 Server: [WSGIServer/0.2 CPython/3.4.2]
2592 content-length: ['351']
2593 content-type: [application/json; charset=utf-8]
2594 status: {code: 200, message: OK}
2595- request:
2596 body: null
2597 headers:
2598 accept-encoding: ['gzip, deflate']
2599 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2600 user-agent: [GNU Mailman REST client v1.0.0b1]
2601 method: GET
2602 uri: http://localhost:9001/3.0/addresses/cris@example.com
2603 response:
2604 body: {string: '{"display_name": "Cris", "http_etag": "\"34ebc29602ad70d31b728755584723a2e02238a5\"",
2605 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2606 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2607 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2608 "cris@example.com"}'}
2609 headers:
2610 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2611 Server: [WSGIServer/0.2 CPython/3.4.2]
2612 content-length: ['351']
2613 content-type: [application/json; charset=utf-8]
2614 status: {code: 200, message: OK}
2615- request:
2616 body: null
2617 headers:
2618 accept-encoding: ['gzip, deflate']
2619 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2620 user-agent: [GNU Mailman REST client v1.0.0b1]
2621 method: POST
2622 uri: http://localhost:9001/3.0/addresses/cris@example.com/verify
2623 response:
2624 body: {string: ''}
2625 headers:
2626 Content-Length: ['0']
2627 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2628 Server: [WSGIServer/0.2 CPython/3.4.2]
2629 status: {code: 204, message: No Content}
2630- request:
2631 body: null
2632 headers:
2633 accept-encoding: ['gzip, deflate']
2634 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2635 user-agent: [GNU Mailman REST client v1.0.0b1]
2636 method: GET
2637 uri: http://localhost:9001/3.0/addresses/cris@example.com
2638 response:
2639 body: {string: '{"display_name": "Cris", "http_etag": "\"dafcd9b979858ed08be56c28e1d30036ecaaad7d\"",
2640 "verified_on": "2015-01-04T22:42:50.623274", "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2641 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2642 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2643 "cris@example.com"}'}
2644 headers:
2645 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2646 Server: [WSGIServer/0.2 CPython/3.4.2]
2647 content-length: ['396']
2648 content-type: [application/json; charset=utf-8]
2649 status: {code: 200, message: OK}
2650- request:
2651 body: null
2652 headers:
2653 accept-encoding: ['gzip, deflate']
2654 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2655 user-agent: [GNU Mailman REST client v1.0.0b1]
2656 method: POST
2657 uri: http://localhost:9001/3.0/addresses/cris@example.com/unverify
2658 response:
2659 body: {string: ''}
2660 headers:
2661 Content-Length: ['0']
2662 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2663 Server: [WSGIServer/0.2 CPython/3.4.2]
2664 status: {code: 204, message: No Content}
2665- request:
2666 body: null
2667 headers:
2668 accept-encoding: ['gzip, deflate']
2669 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2670 user-agent: [GNU Mailman REST client v1.0.0b1]
2671 method: GET
2672 uri: http://localhost:9001/3.0/addresses/cris@example.com
2673 response:
2674 body: {string: '{"display_name": "Cris", "http_etag": "\"34ebc29602ad70d31b728755584723a2e02238a5\"",
2675 "user": "http://localhost:9001/3.0/users/124469682936455360048380387046363665337",
2676 "self_link": "http://localhost:9001/3.0/addresses/cris@example.com", "registered_on":
2677 "2015-01-04T22:42:46.599496", "email": "cris@example.com", "original_email":
2678 "cris@example.com"}'}
2679 headers:
2680 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2681 Server: [WSGIServer/0.2 CPython/3.4.2]
2682 content-length: ['351']
2683 content-type: [application/json; charset=utf-8]
2684 status: {code: 200, message: OK}
2685- request:
2686 body: email=ler%40primus.org&password=somepass&display_name=Ler
2687 headers:
2688 accept-encoding: ['gzip, deflate']
2689 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2690 content-type: [application/x-www-form-urlencoded]
2691 user-agent: [GNU Mailman REST client v1.0.0b1]
2692 method: POST
2693 uri: http://localhost:9001/3.0/users
2694 response:
2695 body: {string: ''}
2696 headers:
2697 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2698 Server: [WSGIServer/0.2 CPython/3.4.2]
2699 content-length: ['0']
2700 location: ['http://localhost:9001/3.0/users/336996234976700619952769788325714110792']
2701 status: {code: 201, message: Created}
2702- request:
2703 body: null
2704 headers:
2705 accept-encoding: ['gzip, deflate']
2706 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2707 user-agent: [GNU Mailman REST client v1.0.0b1]
2708 method: GET
2709 uri: http://localhost:9001/3.0/users/336996234976700619952769788325714110792
2710 response:
2711 body: {string: '{"display_name": "Ler", "created_on": "2015-01-04T22:42:50.764436",
2712 "http_etag": "\"ea381267efb7cbd2d379699f091fc7b4d5cda6b4\"", "password": "$6$rounds=109126$U4DnRdYva2uDoAxg$3FLd0ADkfea9rWd33UaE0CWwp8VVRO9HB7BvYabK4OawXBdrV1kwMW4qO9QMHf67in2XM0So/Gc9cnnwMEf9h/",
2713 "self_link": "http://localhost:9001/3.0/users/336996234976700619952769788325714110792",
2714 "user_id": 336996234976700619952769788325714110792}'}
2715 headers:
2716 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2717 Server: [WSGIServer/0.2 CPython/3.4.2]
2718 content-length: ['404']
2719 content-type: [application/json; charset=utf-8]
2720 status: {code: 200, message: OK}
2721- request:
2722 body: null
2723 headers:
2724 accept-encoding: ['gzip, deflate']
2725 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2726 user-agent: [GNU Mailman REST client v1.0.0b1]
2727 method: GET
2728 uri: http://localhost:9001/3.0/users/ler@primus.org
2729 response:
2730 body: {string: '{"display_name": "Ler", "created_on": "2015-01-04T22:42:50.764436",
2731 "http_etag": "\"ea381267efb7cbd2d379699f091fc7b4d5cda6b4\"", "password": "$6$rounds=109126$U4DnRdYva2uDoAxg$3FLd0ADkfea9rWd33UaE0CWwp8VVRO9HB7BvYabK4OawXBdrV1kwMW4qO9QMHf67in2XM0So/Gc9cnnwMEf9h/",
2732 "self_link": "http://localhost:9001/3.0/users/336996234976700619952769788325714110792",
2733 "user_id": 336996234976700619952769788325714110792}'}
2734 headers:
2735 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2736 Server: [WSGIServer/0.2 CPython/3.4.2]
2737 content-length: ['404']
2738 content-type: [application/json; charset=utf-8]
2739 status: {code: 200, message: OK}
2740- request:
2741 body: null
2742 headers:
2743 accept-encoding: ['gzip, deflate']
2744 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2745 user-agent: [GNU Mailman REST client v1.0.0b1]
2746 method: GET
2747 uri: http://localhost:9001/3.0/users/336996234976700619952769788325714110792
2748 response:
2749 body: {string: '{"display_name": "Ler", "created_on": "2015-01-04T22:42:50.764436",
2750 "http_etag": "\"ea381267efb7cbd2d379699f091fc7b4d5cda6b4\"", "password": "$6$rounds=109126$U4DnRdYva2uDoAxg$3FLd0ADkfea9rWd33UaE0CWwp8VVRO9HB7BvYabK4OawXBdrV1kwMW4qO9QMHf67in2XM0So/Gc9cnnwMEf9h/",
2751 "self_link": "http://localhost:9001/3.0/users/336996234976700619952769788325714110792",
2752 "user_id": 336996234976700619952769788325714110792}'}
2753 headers:
2754 Date: ['Sun, 04 Jan 2015 22:42:50 GMT']
2755 Server: [WSGIServer/0.2 CPython/3.4.2]
2756 content-length: ['404']
2757 content-type: [application/json; charset=utf-8]
2758 status: {code: 200, message: OK}
2759- request:
2760 body: display_name=Sir+Ler
2761 headers:
2762 accept-encoding: ['gzip, deflate']
2763 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2764 content-type: [application/x-www-form-urlencoded]
2765 user-agent: [GNU Mailman REST client v1.0.0b1]
2766 method: PATCH
2767 uri: http://localhost:9001/3.0/users/336996234976700619952769788325714110792
2768 response:
2769 body: {string: ''}
2770 headers:
2771 Content-Length: ['0']
2772 Date: ['Sun, 04 Jan 2015 22:42:51 GMT']
2773 Server: [WSGIServer/0.2 CPython/3.4.2]
2774 status: {code: 204, message: No Content}
2775- request:
2776 body: null
2777 headers:
2778 accept-encoding: ['gzip, deflate']
2779 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2780 user-agent: [GNU Mailman REST client v1.0.0b1]
2781 method: GET
2782 uri: http://localhost:9001/3.0/users/ler@primus.org
2783 response:
2784 body: {string: '{"display_name": "Sir Ler", "created_on": "2015-01-04T22:42:50.764436",
2785 "http_etag": "\"d0ad1c90a176ce6e55d152de451c3dcdac8a9694\"", "password": "$6$rounds=109126$U4DnRdYva2uDoAxg$3FLd0ADkfea9rWd33UaE0CWwp8VVRO9HB7BvYabK4OawXBdrV1kwMW4qO9QMHf67in2XM0So/Gc9cnnwMEf9h/",
2786 "self_link": "http://localhost:9001/3.0/users/336996234976700619952769788325714110792",
2787 "user_id": 336996234976700619952769788325714110792}'}
2788 headers:
2789 Date: ['Sun, 04 Jan 2015 22:42:51 GMT']
2790 Server: [WSGIServer/0.2 CPython/3.4.2]
2791 content-length: ['408']
2792 content-type: [application/json; charset=utf-8]
2793 status: {code: 200, message: OK}
2794- request:
2795 body: null
2796 headers:
2797 accept-encoding: ['gzip, deflate']
2798 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2799 user-agent: [GNU Mailman REST client v1.0.0b1]
2800 method: GET
2801 uri: http://localhost:9001/3.0/users/336996234976700619952769788325714110792
2802 response:
2803 body: {string: '{"display_name": "Sir Ler", "created_on": "2015-01-04T22:42:50.764436",
2804 "http_etag": "\"d0ad1c90a176ce6e55d152de451c3dcdac8a9694\"", "password": "$6$rounds=109126$U4DnRdYva2uDoAxg$3FLd0ADkfea9rWd33UaE0CWwp8VVRO9HB7BvYabK4OawXBdrV1kwMW4qO9QMHf67in2XM0So/Gc9cnnwMEf9h/",
2805 "self_link": "http://localhost:9001/3.0/users/336996234976700619952769788325714110792",
2806 "user_id": 336996234976700619952769788325714110792}'}
2807 headers:
2808 Date: ['Sun, 04 Jan 2015 22:42:51 GMT']
2809 Server: [WSGIServer/0.2 CPython/3.4.2]
2810 content-length: ['408']
2811 content-type: [application/json; charset=utf-8]
2812 status: {code: 200, message: OK}
2813- request:
2814 body: display_name=Sir+Ler&cleartext_password=easy
2815 headers:
2816 accept-encoding: ['gzip, deflate']
2817 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2818 content-type: [application/x-www-form-urlencoded]
2819 user-agent: [GNU Mailman REST client v1.0.0b1]
2820 method: PATCH
2821 uri: http://localhost:9001/3.0/users/336996234976700619952769788325714110792
2822 response:
2823 body: {string: ''}
2824 headers:
2825 Content-Length: ['0']
2826 Date: ['Sun, 04 Jan 2015 22:42:51 GMT']
2827 Server: [WSGIServer/0.2 CPython/3.4.2]
2828 status: {code: 204, message: No Content}
2829- request:
2830 body: null
2831 headers:
2832 accept-encoding: ['gzip, deflate']
2833 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2834 user-agent: [GNU Mailman REST client v1.0.0b1]
2835 method: GET
2836 uri: http://localhost:9001/3.0/users/336996234976700619952769788325714110792
2837 response:
2838 body: {string: '{"display_name": "Sir Ler", "created_on": "2015-01-04T22:42:50.764436",
2839 "http_etag": "\"c2292e6d206ad3fae45d815699fab665ffd3152d\"", "password": "$6$rounds=93265$Z5DEe17fTAD3CuwU$mpVZgRg5m2mkoOAQutSUIjw1yNNxGhtKtkYV5s1Hc3OwKPyIa5p74yq/LIMcP4S50BfO.E814Fk4qwBwsJQC91",
2840 "self_link": "http://localhost:9001/3.0/users/336996234976700619952769788325714110792",
2841 "user_id": 336996234976700619952769788325714110792}'}
2842 headers:
2843 Date: ['Sun, 04 Jan 2015 22:42:51 GMT']
2844 Server: [WSGIServer/0.2 CPython/3.4.2]
2845 content-length: ['407']
2846 content-type: [application/json; charset=utf-8]
2847 status: {code: 200, message: OK}
2848- request:
2849 body: null
2850 headers:
2851 accept-encoding: ['gzip, deflate']
2852 authorization: [Basic cmVzdGFkbWluOnJlc3RwYXNz]
2853 user-agent: [GNU Mailman REST client v1.0.0b1]
2854 method: GET
2855 uri: http://localhost:9001/3.0/users/bill@example.com
2856 response:
2857 body: {string: '{"display_name": "Bill", "created_on": "2015-01-04T22:42:46.289167",
2858 "http_etag": "\"c084714d661a69fd433bac818a53cd121323d036\"", "password": "$6$rounds=93157$R872gB3lPaWHcG85$0BqbkmSBVfkjIHTeJZGGP0yXHAUVM/ys46Tquswpz5zEMIdV4Ya4AyBz.LMkKdsfKjo0P5dSFInFlOsE6W3Sd/",
2859 "self_link": "http://localhost:9001/3.0/users/282238326831930934086115995946546408713",
2860 "user_id": 282238326831930934086115995946546408713}'}
2861 headers:
2862 Date: ['Sun, 04 Jan 2015 22:42:51 GMT']
2863 Server: [WSGIServer/0.2 CPython/3.4.2]
2864 content-length: ['404']
2865 content-type: [application/json; charset=utf-8]
2866 status: {code: 200, message: OK}
2867- request:
2868 body: null
2869 headers:
2870 accept-encoding: ['gzip, deflate']
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches