You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by ad...@apache.org on 2014/06/30 19:35:37 UTC
svn commit: r1606846 - in /labs/panopticon: pan-commands/bin/moderator
pan-utils/src/asf/data/lists.py pan-utils/src/asf/utils/test.py
pan-utils/tests/test_lists.py
Author: adc
Date: Mon Jun 30 17:35:36 2014
New Revision: 1606846
URL: http://svn.apache.org/r1606846
Log:
moderator command now "talks" to hermes
Or will talk to hermes once the WSGI api is set up.
Added:
labs/panopticon/pan-utils/src/asf/data/lists.py
labs/panopticon/pan-utils/tests/test_lists.py
Modified:
labs/panopticon/pan-commands/bin/moderator
labs/panopticon/pan-utils/src/asf/utils/test.py
Modified: labs/panopticon/pan-commands/bin/moderator
URL: http://svn.apache.org/viewvc/labs/panopticon/pan-commands/bin/moderator?rev=1606846&r1=1606845&r2=1606846&view=diff
==============================================================================
--- labs/panopticon/pan-commands/bin/moderator (original)
+++ labs/panopticon/pan-commands/bin/moderator Mon Jun 30 17:35:36 2014
@@ -20,21 +20,21 @@
"""
Mailing list moderator tool used to manage mailing lists from the command line.
"""
-import argparse
-import sys
+import restkit
from asf.cli import entrypoint
-from asf.data.aliases import get_mail_aliases
-from asf.utils.committers import get_committer
+from asf.data import aliases
+from asf.data import lists
+from asf.utils import committers
from asf.utils.emails import email_from_alias, is_apache_email_address, username_from_apache_email
def cmd_lookup(args):
- mail_aliases = get_mail_aliases(args.username, args.password)
+ mail_aliases = aliases.get_mail_aliases(args.username, args.password)
email_alias = args.email_alias
asf_email = email_alias if is_apache_email_address(email_alias) else email_from_alias(email_alias, mail_aliases)
if asf_email:
- committer = get_committer(username_from_apache_email(asf_email), args.username, args.password)
+ committer = committers.get_committer(username_from_apache_email(asf_email), args.username, args.password)
if committer:
print committer.fullname, '-', committer.username
if committer.member:
@@ -60,22 +60,46 @@ def cmd_lookup(args):
def cmd_add(args):
- print 'Email list additions is not supported yet'
+ try:
+ if args.moderator:
+ lists.add_ezmlm_moderator(args.mailing_list, args.email_address, args.username, args.password)
+ else:
+ lists.add_ezmlm_subscriber(args.mailing_list, args.email_address, args.username, args.password)
+
+ print 'Added %s to %s' % ('moderator %s' % args.email_address if args.moderator else args.email_address, args.mailing_list)
+ except restkit.ResourceNotFound:
+ print 'Mailing list %s not found' % args.mailing_list
def cmd_remove(args):
- print 'Email list removals is not supported yet'
+ try:
+ if args.moderator:
+ lists.remove_ezmlm_moderator(args.mailing_list, args.email_address, args.username, args.password)
+ else:
+ lists.remove_ezmlm_subscriber(args.mailing_list, args.email_address, args.username, args.password)
+
+ print 'Removed %s to %s' % ('moderator %s' % args.email_address if args.moderator else args.email_address, args.mailing_list)
+ except restkit.ResourceNotFound:
+ print 'Mailing list %s not found' % args.mailing_list
def cmd_list(args):
- print 'dev@mock.apache.org'
- print 'user@mock.apache.org'
- print 'commit@mock.apache.org'
+ for address, groups in lists.get_ezmlm_lists().iteritems():
+ for group in groups:
+ print group + '@' + address
def cmd_members(args):
- print 'john.doe@gmail.com'
- print 'jane.doe@gmail.com*'
+ try:
+ if args.moderator:
+ members = lists.get_ezmlm_moderators(args.mailing_list, args.username, args.password)
+ else:
+ members = lists.get_ezmlm_subscribers(args.mailing_list, args.username, args.password)
+
+ for member in members:
+ print member
+ except restkit.ResourceNotFound:
+ print 'Mailing list %s not found' % args.mailing_list
@entrypoint
@@ -93,11 +117,13 @@ def main(cli):
add_parser = subparsers.add_parser('add', description='Add an email address to a mailing list')
add_parser.add_argument('mailing_list', help='The mailing list that the email address is attempting to join')
add_parser.add_argument('email_address', help='The email address to add')
+ add_parser.add_argument('-m', '--moderator', default=False, action='store_true', help='Email address is for moderator')
add_parser.set_defaults(func=cmd_add)
remove_parser = subparsers.add_parser('remove', description='Remove an email address to a mailing list')
remove_parser.add_argument('mailing_list', help='The mailing list that the email address is being removed from')
remove_parser.add_argument('email_address', help='The email address to remove')
+ remove_parser.add_argument('-m', '--moderator', default=False, action='store_true', help='Email address is for moderator')
remove_parser.set_defaults(func=cmd_remove)
list_parser = subparsers.add_parser('list', description='List the ASF mailing lists')
@@ -105,6 +131,7 @@ def main(cli):
list_parser = subparsers.add_parser('members', description='List the members of a mailing list')
list_parser.add_argument('mailing_list', help='The mailing list whose membership is to be listed')
+ list_parser.add_argument('-m', '--moderator', default=False, action='store_true', help='List moderators of mailing list')
list_parser.set_defaults(func=cmd_members)
with cli.run():
Added: labs/panopticon/pan-utils/src/asf/data/lists.py
URL: http://svn.apache.org/viewvc/labs/panopticon/pan-utils/src/asf/data/lists.py?rev=1606846&view=auto
==============================================================================
--- labs/panopticon/pan-utils/src/asf/data/lists.py (added)
+++ labs/panopticon/pan-utils/src/asf/data/lists.py Mon Jun 30 17:35:36 2014
@@ -0,0 +1,103 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+import json
+import urlparse
+
+from restkit import Resource
+
+
+EZMLM_URL = 'http://hermes.apache.org/ezmlm/'
+
+
+def get_ezmlm_lists():
+ """ Obtain a dictionary of ASF addresses and their lists
+ :return: a dictionary of ASF addresses and their lists
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/public/lists')
+ return json.load(Resource(ezmlm_lists_url).get().body_stream())
+
+
+def get_ezmlm_subscribers(mailing_list, username, password):
+ """ Obtain the list of subscriber emails belonging to a particular mailing list
+ :param mailing_list: the mailing list that the subscribers belong to
+ :param username: the username to use to obtain the list of mailing list subscribers
+ :param password: the password for the username
+ :return: the list of subscriber emails
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/asf/lists/%s/subscribers' % mailing_list)
+ return json.load(Resource(ezmlm_lists_url).get().body_stream())['subscribers']
+
+
+def get_ezmlm_moderators(mailing_list, username, password):
+ """ Obtain the list of moderator emails belonging to a particular mailing list
+ :param mailing_list: the mailing list that the moderators belong to
+ :param username: the username to use to obtain the list of mailing list moderators
+ :param password: the password for the username
+ :return: the list of moderator emails
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/asf/lists/%s/moderators' % mailing_list)
+ return json.load(Resource(ezmlm_lists_url).get().body_stream())['moderators']
+
+
+def add_ezmlm_subscriber(mailing_list, address, username, password):
+ """ Add a subscriber email address to a particular mailing list
+ :param mailing_list: the mailing list that the subscribers belong to
+ :param address: the email address to add to the mailing list
+ :param username: the username to use to manage the list of mailing list subscribers
+ :param password: the password for the username
+ :return: the list of subscriber emails
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/asf/lists/%s/subscribers/%s' % (mailing_list, address))
+ return json.load(Resource(ezmlm_lists_url).put().body_stream())['added']
+
+
+def add_ezmlm_moderator(mailing_list, address, username, password):
+ """ Add a moderator email address to a particular mailing list
+ :param mailing_list: the mailing list that the moderators belong to
+ :param address: the email address to add to the mailing list moderators
+ :param username: the username to use to manage the list of mailing list moderators
+ :param password: the password for the username
+ :return: the list of moderator emails
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/asf/lists/%s/moderators/%s' % (mailing_list, address))
+ return json.load(Resource(ezmlm_lists_url).put().body_stream())['added']
+
+
+def remove_ezmlm_subscriber(mailing_list, address, username, password):
+ """ Remove a subscriber email address to a particular mailing list
+ :param mailing_list: the mailing list that the subscribers belong to
+ :param address: the email address to remove from the mailing list
+ :param username: the username to use to manage the list of mailing list subscribers
+ :param password: the password for the username
+ :return: the list of subscriber emails
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/asf/lists/%s/subscribers/%s' % (mailing_list, address))
+ return json.load(Resource(ezmlm_lists_url).delete().body_stream())['removed']
+
+
+def remove_ezmlm_moderator(mailing_list, address, username, password):
+ """ Remove a moderator email address to a particular mailing list
+ :param mailing_list: the mailing list that the moderators belong to
+ :param address: the email address to remove from the mailing list moderators
+ :param username: the username to use to manage the list of mailing list moderators
+ :param password: the password for the username
+ :return: the list of moderator emails
+ """
+ ezmlm_lists_url = urlparse.urljoin(EZMLM_URL, 'v1/asf/lists/%s/moderators/%s' % (mailing_list, address))
+ return json.load(Resource(ezmlm_lists_url).delete().body_stream())['removed']
Modified: labs/panopticon/pan-utils/src/asf/utils/test.py
URL: http://svn.apache.org/viewvc/labs/panopticon/pan-utils/src/asf/utils/test.py?rev=1606846&r1=1606845&r2=1606846&view=diff
==============================================================================
--- labs/panopticon/pan-utils/src/asf/utils/test.py (original)
+++ labs/panopticon/pan-utils/src/asf/utils/test.py Mon Jun 30 17:35:36 2014
@@ -17,10 +17,11 @@
# under the License.
#
import ConfigParser
-import gnupg
+import gnupg
import pytest
-from asf.data import ldap
+
+from asf.data import ldap, lists
from asf.utils.auth import get_stored_credentials
from asf.utils.file import temp_directory
@@ -60,3 +61,15 @@ def test_gpg():
ensure_gpg = pytest.mark.skipif(test_gpg(),
reason="Need to ensure that gpg is available")
+
+
+def test_hermes():
+ try:
+ lists.get_ezmlm_lists()
+ return False
+ except Exception:
+ return True
+
+
+ensure_hermes = pytest.mark.skipif(test_hermes(),
+ reason="Hermes is not up")
Added: labs/panopticon/pan-utils/tests/test_lists.py
URL: http://svn.apache.org/viewvc/labs/panopticon/pan-utils/tests/test_lists.py?rev=1606846&view=auto
==============================================================================
--- labs/panopticon/pan-utils/tests/test_lists.py (added)
+++ labs/panopticon/pan-utils/tests/test_lists.py Mon Jun 30 17:35:36 2014
@@ -0,0 +1,63 @@
+import pytest
+import restkit
+
+from asf.data import lists
+from asf.utils import test
+
+
+@test.ensure_hermes
+def test_get_ezmlm_lists():
+ print lists.get_ezmlm_lists()
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_get_ezmlm_subscribers(username, password):
+ print lists.get_ezmlm_subscribers('dev@mrql.apache.org', username, password)
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_get_ezmlm_subscribers_errors(username, password):
+ with pytest.raises(restkit.ResourceNotFound):
+ lists.get_ezmlm_subscribers('Zdev@mrql.apache.org', username, password)
+ with pytest.raises(restkit.ResourceNotFound):
+ lists.get_ezmlm_subscribers('dev@Zmrql.apache.org', username, password)
+ with pytest.raises(restkit.RequestFailed):
+ lists.get_ezmlm_subscribers('dev.mrql.apache.org', username, password)
+
+
+@test.ensure_hermes
+def test_get_ezmlm_subscribers_unauthorized():
+ with pytest.raises(restkit.Unauthorized):
+ lists.get_ezmlm_subscribers('dev.mrql.apache.org', 'BAD_USER', 'BAD_PASSWORD')
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_get_ezmlm_moderators(username, password):
+ print lists.get_ezmlm_moderators('dev@mrql.apache.org', username, password)
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_add_ezmlm_subscribers(username, password):
+ print lists.add_ezmlm_subscriber('dev@mrql.apache.org', 'adc@apache.org', username, password)
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_add_ezmlm_moderators(username, password):
+ print lists.add_ezmlm_moderator('dev@mrql.apache.org', 'adc@apache.org', username, password)
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_remove_ezmlm_subscribers(username, password):
+ print lists.remove_ezmlm_subscriber('dev@mrql.apache.org', 'adc@apache.org', username, password)
+
+
+@test.ensure_hermes
+@test.ensure_credentials_stored
+def test_remove_ezmlm_moderators(username, password):
+ print lists.remove_ezmlm_moderator('dev@mrql.apache.org', 'adc@apache.org', username, password)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org