[Checkins] SVN: zope.pypisupport/trunk/ A first version for adding and deleting roles for a user in PyPI.

Stephan Richter srichter at cosmos.phy.tufts.edu
Mon Nov 5 16:32:15 EST 2007


Log message for revision 81550:
  A first version for adding and deleting roles for a user in PyPI.
  

Changed:
  A   zope.pypisupport/trunk/
  A   zope.pypisupport/trunk/.installed.cfg
  A   zope.pypisupport/trunk/CHANGES.txt
  A   zope.pypisupport/trunk/README.txt
  A   zope.pypisupport/trunk/bootstrap.py
  A   zope.pypisupport/trunk/buildout.cfg
  A   zope.pypisupport/trunk/setup.py
  A   zope.pypisupport/trunk/src/
  A   zope.pypisupport/trunk/src/zope/
  A   zope.pypisupport/trunk/src/zope/__init__.py
  A   zope.pypisupport/trunk/src/zope/pypisupport/
  A   zope.pypisupport/trunk/src/zope/pypisupport/__init__.py
  A   zope.pypisupport/trunk/src/zope/pypisupport/role.py
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/PKG-INFO
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/SOURCES.txt
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/dependency_links.txt
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/entry_points.txt
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/requires.txt
  A   zope.pypisupport/trunk/src/zope.pypisupport.egg-info/top_level.txt

-=-
Added: zope.pypisupport/trunk/.installed.cfg
===================================================================
--- zope.pypisupport/trunk/.installed.cfg	                        (rev 0)
+++ zope.pypisupport/trunk/.installed.cfg	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,42 @@
+[buildout]
+installed_develop_eggs = /opt/zope/packages/zope.pypisupport/develop-eggs/zope.pypisupport.egg-link
+parts = addrole delrole
+
+[addrole]
+__buildout_installed__ = /opt/zope/packages/zope.pypisupport/bin/addrole
+__buildout_signature__ = zc.recipe.egg-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg zc.buildout-1.0.0b31-py2.4.egg
+_b = /opt/zope/packages/zope.pypisupport/bin
+_d = /opt/zope/packages/zope.pypisupport/develop-eggs
+_e = /opt/zope/packages/eggs
+bin-directory = /opt/zope/packages/zope.pypisupport/bin
+develop-eggs-directory = /opt/zope/packages/zope.pypisupport/develop-eggs
+eggs = zope.pypisupport
+eggs-directory = /opt/zope/packages/eggs
+executable = /usr/bin/py24
+index = http://download.zope.org/ppix
+recipe = zc.recipe.egg:scripts
+scripts = addrole
+
+[delrole]
+__buildout_installed__ = /opt/zope/packages/zope.pypisupport/bin/delrole
+__buildout_signature__ = zc.recipe.egg-1.0.0-py2.4.egg setuptools-0.6c7-py2.4.egg zc.buildout-1.0.0b31-py2.4.egg
+_b = /opt/zope/packages/zope.pypisupport/bin
+_d = /opt/zope/packages/zope.pypisupport/develop-eggs
+_e = /opt/zope/packages/eggs
+bin-directory = /opt/zope/packages/zope.pypisupport/bin
+develop-eggs-directory = /opt/zope/packages/zope.pypisupport/develop-eggs
+eggs = zope.pypisupport
+eggs-directory = /opt/zope/packages/eggs
+executable = /usr/bin/py24
+index = http://download.zope.org/ppix
+recipe = zc.recipe.egg:scripts
+scripts = delrole
+
+[buildout]
+installed_develop_eggs = /opt/zope/packages/zope.pypisupport/develop-eggs/zope.pypisupport.egg-link
+
+[buildout]
+parts = delrole addrole
+
+[buildout]
+parts = addrole delrole

Added: zope.pypisupport/trunk/CHANGES.txt
===================================================================
--- zope.pypisupport/trunk/CHANGES.txt	                        (rev 0)
+++ zope.pypisupport/trunk/CHANGES.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,11 @@
+=======
+CHANGES
+=======
+
+0.1.0 (2007-11-05)
+------------------
+
+- Initial release.
+
+  * Implemented `addrole` and `delrole` scripts, which allow one to add and
+    remove roles for a user from one or more packages.


Property changes on: zope.pypisupport/trunk/CHANGES.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: zope.pypisupport/trunk/README.txt
===================================================================
--- zope.pypisupport/trunk/README.txt	                        (rev 0)
+++ zope.pypisupport/trunk/README.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,2 @@
+This package provides a few simple scripts to administrate the Python Package
+Index (PyPI).


Property changes on: zope.pypisupport/trunk/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: zope.pypisupport/trunk/bootstrap.py
===================================================================
--- zope.pypisupport/trunk/bootstrap.py	                        (rev 0)
+++ zope.pypisupport/trunk/bootstrap.py	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id$
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+ez = {}
+exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+                     ).read() in ez
+ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+import pkg_resources
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+if sys.platform == 'win32':
+    cmd = '"%s"' % cmd # work around spawn lamosity on windows
+
+ws = pkg_resources.working_set
+assert os.spawnle(
+    os.P_WAIT, sys.executable, sys.executable,
+    '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
+    dict(os.environ,
+         PYTHONPATH=
+         ws.find(pkg_resources.Requirement.parse('setuptools')).location
+         ),
+    ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+shutil.rmtree(tmpeggs)


Property changes on: zope.pypisupport/trunk/bootstrap.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: zope.pypisupport/trunk/buildout.cfg
===================================================================
--- zope.pypisupport/trunk/buildout.cfg	                        (rev 0)
+++ zope.pypisupport/trunk/buildout.cfg	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,13 @@
+[buildout]
+develop = .
+parts = addrole delrole
+
+[addrole]
+recipe = zc.recipe.egg:scripts
+eggs = zope.pypisupport
+scripts = addrole
+
+[delrole]
+recipe = zc.recipe.egg:scripts
+eggs = zope.pypisupport
+scripts = delrole

Added: zope.pypisupport/trunk/setup.py
===================================================================
--- zope.pypisupport/trunk/setup.py	                        (rev 0)
+++ zope.pypisupport/trunk/setup.py	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,60 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Setup for ``zope.pypisupport`` project
+
+$Id$
+"""
+import os
+from setuptools import setup
+
+def read(*rnames):
+    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+setup(
+    name='zope.pypisupport',
+    version='0.1.0',
+    author='Zope Corporation and Contributors',
+    author_email='zope3-dev at zope.org',
+    description='Zope Viewlets',
+    long_description=(
+        read('README.txt')
+        + '\n\n' +
+        read('CHANGES.txt')
+        ),
+    keywords = "pypi console tools",
+    classifiers = [
+        'Development Status :: 4 - Beta',
+        'Environment :: Console',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved :: Zope Public License',
+        'Programming Language :: Python',
+        'Natural Language :: English',
+        'Operating System :: OS Independent',
+        'Topic :: Internet :: WWW/HTTP'],
+    url='http://cheeseshop.python.org/pypi/zope.pypisupport',
+    license='ZPL 2.1',
+    packages=find_packages('src'),
+    package_dir = {'': 'src'},
+    namespace_packages=['zope'],
+    install_requires=[
+        'lxml',
+        'zope.testbrowser',
+        ],
+    entry_points = dict(console_scripts=[
+        'addrole = zope.pypisupport.role:addrole',
+        'delrole = zope.pypisupport.role:delrole',
+        ]),
+    include_package_data = True,
+    zip_safe = False,
+    )


Property changes on: zope.pypisupport/trunk/setup.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: zope.pypisupport/trunk/src/zope/__init__.py
===================================================================
--- zope.pypisupport/trunk/src/zope/__init__.py	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope/__init__.py	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,7 @@
+# this is a namespace package
+try:
+    import pkg_resources
+    pkg_resources.declare_namespace(__name__)
+except ImportError:
+    import pkgutil
+    __path__ = pkgutil.extend_path(__path__, __name__)


Property changes on: zope.pypisupport/trunk/src/zope/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: zope.pypisupport/trunk/src/zope/pypisupport/__init__.py
===================================================================
--- zope.pypisupport/trunk/src/zope/pypisupport/__init__.py	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope/pypisupport/__init__.py	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: zope.pypisupport/trunk/src/zope/pypisupport/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: zope.pypisupport/trunk/src/zope/pypisupport/role.py
===================================================================
--- zope.pypisupport/trunk/src/zope/pypisupport/role.py	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope/pypisupport/role.py	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,149 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""PyPI Role Management
+"""
+import sys
+import optparse
+import base64
+import lxml.etree
+import mechanize
+import zope.testbrowser.browser
+
+BASE_URL = 'http://pypi.python.org/pypi/'
+
+ALL_PACKAGES_XPATH = ("//html:div[@id='document-navigation']/"
+                      "html:ul/html:li[position()=1]/html:a/text()")
+PACKAGE_DISTS_XPATH = "//html:table[@class='list']/html:tr/html:td/html:a/@href"
+NS_MAP = {'html': 'http://www.w3.org/1999/xhtml'}
+
+def getPackages(options, browser):
+    if not options.allPackages:
+        return options.packages
+    browser.open(BASE_URL)
+    tree = lxml.etree.fromstring(browser.contents)
+    return tree.xpath(ALL_PACKAGES_XPATH, NS_MAP)
+
+def changeRole(browser, user, action):
+    # Try to get to the admin link and click it.
+     try:
+         browser.getLink('admin', index=0).click()
+     except mechanize._mechanize.LinkNotFoundError:
+         print '    +-> Error/Warning: admin link not found'
+         return
+     # Fill in the user whose roles are modified.
+     browser.getControl(name='user_name').value = user
+     # Execute the action
+     try:
+         browser.getControl(action + ' Role').click()
+     except Exception, err:
+         msg = err.read().strip().split('\n')[-1]
+         print '    +-> Error/Warning: ' + msg
+
+def manipulateRole(options):
+    # Create a browser instance.
+    browser = zope.testbrowser.browser.Browser()
+    # Log in as the specified user.
+    creds = base64.b64encode('%s:%s' %(options.username, options.password))
+    browser.addHeader('Authorization', 'Basic ' + creds)
+    # Execute the action for each specified package.
+    for package in getPackages(options, browser):
+        url = BASE_URL + package
+        print '%s %s as Owner to: %s' %(options.action, options.targetUser, url)
+        try:
+            browser.open(url)
+        except Exception, err:
+            print '    +-> Error/Warning: package does not exist'
+            continue
+        # Some packages list all of their versions
+        if 'Index of Packages' in browser.contents:
+            tree = lxml.etree.fromstring(browser.contents)
+            for href in tree.xpath(PACKAGE_DISTS_XPATH, NS_MAP):
+                browser.open(href)
+                changeRole(browser, options.targetUser, options.action)
+        else:
+            changeRole(browser, options.targetUser, options.action)
+
+###############################################################################
+# Command-line UI
+
+parser = optparse.OptionParser("%prog [options] USERNAME [PACKAGE, ...]")
+
+config = optparse.OptionGroup(
+    parser, "Configuration", "Options that deal with configuring the browser.")
+
+config.add_option(
+    '--username', '--user', action="store", dest='username',
+    help="""Username to access the PyPI Web site.""")
+
+config.add_option(
+    '--password', '--pwd', action="store", dest='password',
+    help="""Password to access the PyPI Web site.""")
+
+config.add_option(
+    '--all', '-a', action="store_true", dest='allPackages',
+    help=("When specified, all packages that the user has access "
+          "to are modified."))
+
+# Default setup
+default_setup_args = []
+
+def merge_options(options, defaults):
+    odict = options.__dict__
+    for name, value in defaults.__dict__.items():
+        if (value is not None) and (odict[name] is None):
+            odict[name] = value
+
+def get_options(args=None, defaults=None):
+
+    default_setup, _ = parser.parse_args(default_setup_args)
+    assert not _
+    if defaults:
+        defaults, _ = parser.parse_args(defaults)
+        assert not _
+        merge_options(defaults, default_setup)
+    else:
+        defaults = default_setup
+
+    if args is None:
+        args = sys.argv
+    original_args = args
+    options, positional = parser.parse_args(args)
+    merge_options(options, defaults)
+    options.original_args = original_args
+
+    if not positional or len(positional) < 1:
+        parser.error("No target user and/or packages specified.")
+    options.targetUser = positional[0]
+    options.packages = positional[1:]
+
+    return options
+
+# Command-line UI
+###############################################################################
+
+def addrole(args=None):
+    if args is None:
+        args = sys.argv[1:]
+
+    options = get_options(args)
+    options.action = 'Add'
+    manipulateRole(options)
+
+def delrole(args=None):
+    if args is None:
+        args = sys.argv[1:]
+
+    options = get_options(args)
+    options.action = 'Remove'
+    manipulateRole(options)


Property changes on: zope.pypisupport/trunk/src/zope/pypisupport/role.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/PKG-INFO
===================================================================
--- zope.pypisupport/trunk/src/zope.pypisupport.egg-info/PKG-INFO	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope.pypisupport.egg-info/PKG-INFO	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: zope.pypisupport
+Version: 0.1.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN

Added: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/SOURCES.txt
===================================================================
--- zope.pypisupport/trunk/src/zope.pypisupport.egg-info/SOURCES.txt	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope.pypisupport.egg-info/SOURCES.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,8 @@
+README.txt
+setup.py
+src/zope.pypisupport.egg-info/PKG-INFO
+src/zope.pypisupport.egg-info/SOURCES.txt
+src/zope.pypisupport.egg-info/dependency_links.txt
+src/zope.pypisupport.egg-info/entry_points.txt
+src/zope.pypisupport.egg-info/requires.txt
+src/zope.pypisupport.egg-info/top_level.txt


Property changes on: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/SOURCES.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/dependency_links.txt
===================================================================
--- zope.pypisupport/trunk/src/zope.pypisupport.egg-info/dependency_links.txt	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope.pypisupport.egg-info/dependency_links.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1 @@
+


Property changes on: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/dependency_links.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/entry_points.txt
===================================================================
--- zope.pypisupport/trunk/src/zope.pypisupport.egg-info/entry_points.txt	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope.pypisupport.egg-info/entry_points.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,4 @@
+[console_scripts]
+addrole = zope.pypisupport.role:addrole
+delrole = zope.pypisupport.role:delrole
+


Property changes on: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/entry_points.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/requires.txt
===================================================================
--- zope.pypisupport/trunk/src/zope.pypisupport.egg-info/requires.txt	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope.pypisupport.egg-info/requires.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1,2 @@
+lxml
+zope.testbrowser
\ No newline at end of file


Property changes on: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/requires.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/top_level.txt
===================================================================
--- zope.pypisupport/trunk/src/zope.pypisupport.egg-info/top_level.txt	                        (rev 0)
+++ zope.pypisupport/trunk/src/zope.pypisupport.egg-info/top_level.txt	2007-11-05 21:32:15 UTC (rev 81550)
@@ -0,0 +1 @@
+


Property changes on: zope.pypisupport/trunk/src/zope.pypisupport.egg-info/top_level.txt
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list