Thanks for all the great updates. Things look pretty good, and I have only a few minor issues to comment on. I think we're almost ready to merge it! Great work. On the dump_json() issue, i just thought of something: since you're only displaying dictionaries, perhaps pprint will do the trick. In Python 2.6, pprint.pprint() sorts the dictionary elements I believe. >>> import os >>> from pprint import pprint >>> pprint(dict(os.environ)) {'COLUMNS': '79', ... 'DISPLAY': ':0.0', 'EMACS': 't', ... You asked: >No user object yet: What do you think: Are we talking about a User with n >email addresses and n memberships here or more like User = Membership? I think we should stick fairly close to the internal model here. So 'Users' represent people, 'Addresses' represent their email addresses, which are usually associated with a user, and 'Member' joins an address to a mailing list with a given role. Only indirectly can you get at the user for a member (i.e. through its address). I agree about singular/plural terms. -B === added file 'src/mailman/rest/docs/restclient.txt' --- src/mailman/rest/docs/restclient.txt 1970-01-01 00:00:00 +0000 +++ src/mailman/rest/docs/restclient.txt 2010-07-15 14:02:55 +0000 > @@ -0,0 +1,129 @@ > +=================== > +Mailman REST Client > +=================== > + > + # The test framework starts out with an example domain, so let's delete > + # that first. > + >>> from mailman.interfaces.domain import IDomainManager > + >>> from zope.component import getUtility > + >>> domain_manager = getUtility(IDomainManager) > + > + >>> domain_manager.remove('example.com') > + > + >>> transaction.commit() > + > +First let's get an instance of MailmanRESTClient. > + > + >>> from mailmanclient.rest import MailmanRESTClient, MailmanRESTClientError > + >>> client = MailmanRESTClient('localhost:8001') > + > +So far there are no lists. > + > + >>> lists = client.get_lists() > + >>> print lists > + [] I think you can just do >>> client.get_lists() [] > + > + > +Domains > +======= > + > +In order to add new lists first a new domain has to be added. > + > + >>> new_domain = client.create_domain('example.com') > + >>> new_domaininfo = new_domain.get_domaininfo() > + >>> for key in sorted(new_domaininfo): > + ... print '{0}: {1}'.format(key, new_domaininfo[key]) > + base_url: http://example.com > + ... > + > +Later the domain object can be instanciated using get_domain() > + > + >>> my_domain = client.get_domain('example.com') > + > + > +Mailing lists > +============= > + > +Now let's add some mailing lists. > + > + >>> new_list = my_domain.create_list('test-one') > + > +Lets add another list and get some information on the list. s/Lets/let's/ > + > + >>> another_list = my_domain.create_list('test-two') > + >>> another_listinfo = another_list.get_listinfo() > + >>> for key in sorted(another_listinfo): > + ... print '{0}: {1}'.format(key, another_listinfo[key]) > + fqdn_listname: