Commits

Tarek Ziadé committed aaa68ac

initial commit for the PEP 345 branch

Comments (0)

Files changed (175)

+2005-12-14
+- added more sanity checks on input (empty description, name, version)
+- check supplied user email addresses for '@' and '.'
+- more robustness around various places
+- don't show package Journal to non-admin/owner/maintainer
+
+
+2005-05-21
+- added database password option
+
+2004-03-19
+- migrated from sqlite to postgres
+- upload of files for releases, and removal of files
+
+
+2004-07-14
+- fixed editing of package information in package summary page (bug 989597)
+
+
+2004-06-23
+- fixed the display of latest release (bug 977432)
+
+
+2004-06-21
+- when displaying a package and no version is given, try to determine
+  the latest release  (bug #958515)
+- better error handling in display action
+- fixed page titles for search_form and forgotten_password_form
+- fixed typo in store.py which prevented indexes being created
+
+2003-04-01
+- PKG-INFO download now has "obfuscated" email addresses
+
+
+2003-03-02
+- fixed deletion of packages where there were no versions (bugs #907317 and
+  #908118)
+- list only new releases in RSS and front page, not any old edit (bug
+  #907315)
+
+
+2004-03-01
+- add meaningful titles to pages (uses page heading)
+- properly unquote version numbers for release editing page (bug #855883)
+- allow removal of more than one release at a time
+- make "delete whole package" a form button
+- made wording of role admin link more helpful
+- hide all current releases when a new release is added
+
+
+2004-06-20
+- when displaying a package and no version is given, try to determine
+  the latest release  (bug #958515)
+- better error handling in display action
+- fixed page titles for search_form and forgotten_password_form
+- fixed typo in store.py which prevented indexes being created
+Python Package Index
+~~~~~~~~~~~~~~~~~~~~
+
+Copyright (c) 2009 Python Software Foundation
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2004-2005 Simplistix Ltd
+# Copyright (c) 2001-2003 New Information Paradigms Ltd
+#
+# This Software is released under the MIT License:
+# http://www.opensource.org/licenses/mit-license.html
+# See license.txt for more details.
+
+import datetime
+import os
+import smtplib
+import socket
+
+from email.MIMEText import MIMEText
+from logging.handlers import SMTPHandler
+from logging import Formatter, LogRecord, CRITICAL
+
+now = datetime.datetime.now
+
+class SubjectFormatter(Formatter):
+    
+    def format(self,record):
+        record.message = record.getMessage()
+        if self._fmt.find('%(line)') >= 0:
+            record.line = record.message.split('\n')[0]
+        if self._fmt.find("%(asctime)") >= 0:
+            record.asctime = self.formatTime(record, self.datefmt)
+        if self._fmt.find("%(hostname)") >= 0:
+            record.hostname = socket.gethostname()
+        return self._fmt % record.__dict__
+    
+class MailingLogger(SMTPHandler):
+
+    def __init__(self, mailhost, fromaddr, toaddrs, subject, send_empty_entries,flood_level=None):
+        SMTPHandler.__init__(self,mailhost,fromaddr,toaddrs,subject)
+        self.subject_formatter = SubjectFormatter(subject)
+        self.send_empty_entries = send_empty_entries
+        self.flood_level = flood_level
+        self.hour = now().hour
+        self.sent = 0
+        
+    def getSubject(self,record):
+        return self.subject_formatter.format(record)
+
+    def emit(self,record):
+        if not self.send_empty_entries and not record.msg.strip():
+            return
+        current_time = now()
+        current_hour = current_time.hour
+        if current_hour > self.hour:
+            self.hour = current_hour
+            self.sent = 0
+        if self.sent == self.flood_level:
+            # send critical error
+            record = LogRecord(
+                name = 'flood',
+                level = CRITICAL,
+                pathname = '',
+                lineno = 0,
+                msg = """Too Many Log Entries
+                
+More than %s entries have been logged that would have resulted in
+emails being sent.
+
+No further emails will be sent for log entries generated between
+%s and %i:00:00
+
+Please consult any other configured logs, such as a File Logger,
+that may contain important entries that have not been emailed.
+""" % (self.sent,current_time.strftime('%H:%M:%S'),current_hour+1),
+                args = (),
+                exc_info = None)
+        elif self.sent > self.flood_level:
+            # do nothing, we've sent too many emails already
+            return
+        self.sent += 1
+
+        # actually send the mail
+        try:
+            import smtplib
+            port = self.mailport
+            if not port:
+                port = smtplib.SMTP_PORT
+            smtp = smtplib.SMTP(self.mailhost, port)
+            msg = self.format(record)
+            email = MIMEText(msg)
+            email['Subject']=self.getSubject(record)
+            email['From']=self.fromaddr
+            email['To']=', '.join(self.toaddrs)
+            email['X-Mailer']='MailingLogger'
+            smtp.sendmail(self.fromaddr, self.toaddrs, email.as_string())
+            smtp.quit()
+        except:
+            self.handleError(record)
+
+serve:
+	if [ ! -e cgi-bin ] ; then ln -s . cgi-bin ; fi
+	python cgi-server.py &
+
+sshkeys_update:	sshkeys_update.c
+	cc -o sshkeys_update sshkeys_update.c
+	chown submit sshkeys_update
+	chmod +s sshkeys_update
+Required packages
+-----------------
+
+To run the PyPI software, you need PostgreSQL, and all 
+these packages located at PyPI:
+
+- cElementTree
+- zope.interface
+- zope.pagetemplate
+- zope.tal
+- zope.tales
+- zope.i18nmessageid
+- psycopg2 
+- M2Crypto
+- BeautifulSoup
+
+You can create a development environment like this, if you
+have virtualenv installed::
+
+    $ virtualenv --no-site-packages --distribute .
+    $ bin/easy_install cElementTree zope.interface zope.pagetemplate zope.tal zope.tales zope.i18nmessageid psycopg2 M2Crypto BeautifulSoup
+
+Now:
+
+- patch python 2.5 to use the name "Cheese Shop" and the new URL
+- PEP for metadata 1.2
+  http://www.python.org/peps/pep-0345.html
+- support .egg format uploads
+  https://sourceforge.net/tracker/?func=detail&atid=513503&aid=1229137&group_id=66150
+- incorporate Ian Bicking's XML-RPC API
+  http://mail.python.org/pipermail/catalog-sig/2005-May/000634.html
+- auto-generate download_urls for package uploads
+
+
+Sooner:
+
+- command-line tool to query pypi and fetch entries
+- table structure and query support for checking dependencies
+  - table structure has columns for identification of the release
+    - add a specification ID to release_*?
+    - or just use release, name
+  - table also has a column for each of <, <=, ==, >=, > so queries are
+    easier to form
+
+Later:
+
+- change notification emails
+- "latest changes"
+- admin interface for user details editing (and fix theller@python.net)
+- "does this release supercede the existing release?"
+
+

__init__.py

Empty file added.
+
+import sys, os, urllib, StringIO, traceback, cgi, binascii, getopt, shutil
+#sys.path.append('/usr/local/pypi/lib')
+
+import store, config
+
+def set_password(store, name, pw):
+    """ Reset the user's password and send an email to the address given.
+    """
+    user = store.get_user(name.strip())
+    if user is None:
+        raise ValueError, 'user name unknown to me'
+    store.store_user(user['name'], pw.strip(), user['email'], None)
+    print 'done'
+
+
+def remove_package(store, name):
+    ''' Remove a package from the database
+    '''
+    store.remove_package(name)
+    print 'done'
+
+def add_owner(store, package, owner):
+    user = store.get_user(owner)
+    if user is None:
+        raise ValueError, 'user name unknown to me'
+    if not store.has_package(package):
+        raise ValueError, 'no such package'
+    store.add_role(owner, 'Owner', package)
+
+def delete_owner(store, package, owner):
+    user = store.get_user(owner)
+    if user is None:
+        raise ValueError, 'user name unknown to me'
+    if not store.has_package(package):
+        raise ValueError, 'no such package'
+    for role in store.get_package_roles(package):
+        if role['role_name']=='Owner' and role['user_name']==owner:
+            break
+    else:
+        raise ValueError, "user is not currently owner"
+    store.delete_role(owner, 'Owner', package)
+
+def add_classifier(store, classifier):
+    ''' Add a classifier to the trove_classifiers list
+    '''
+    cursor = store.get_cursor()
+    cursor.execute("select max(id) from trove_classifiers")
+    id = int(cursor.fetchone()[0]) + 1
+    fields = [f.strip() for f in classifier.split('::')]
+    for f in fields:
+        assert ':' not in f
+    levels = []
+    for l in range(2, len(fields)):
+        c2 = ' :: '.join(fields[:l])
+        cursor.execute('select id from trove_classifiers where classifier=%s', (c2,))
+        l = cursor.fetchone()
+        if not l:
+            raise ValueError, c2 + " is not a known classifier"
+        levels.append(l[0])
+    levels += [id] + [0]*(3-len(levels))
+    cursor.execute('insert into trove_classifiers (id, classifier, l2, l3, l4, l5) '
+        'values (%s,%s,%s,%s,%s,%s)', [id, classifier]+levels)
+    print 'done'
+
+def rename_package(store, old, new):
+    ''' Rename a package. '''
+    if not store.has_package(old):
+        raise ValueError, 'no such package'
+    if store.has_package(new):
+        raise ValueError, new+' exists'
+    store.rename_package(old, new)
+    
+
+def add_mirror(store, root, user):
+    ''' Add a mirror to the mirrors list
+    '''
+    store.add_mirror(root, user)
+
+    print 'done'
+
+def delete_mirror(store, root):
+    ''' Delete a mirror
+    '''
+    store.delete_mirror(root)
+    print 'done'
+
+def delete_old_docs(config, store):
+    '''Delete documentation directories for packages that have been deleted'''
+    for i in os.listdir(config.database_docs_dir):
+        if not store.has_package(i):
+           path = os.path.join(config.database_docs_dir, i)
+           print "Deleting", path
+           shutil.rmtree(path)
+
+def send_comments(store):
+    '''Send out comments to package owners. Normally, this will
+    be done automatically, but the very first comments had not been sent.'''
+    import webui
+    c = store.get_cursor()
+    c.execute("select name, version, user_name, message from ratings where message!=''")
+    for package, version, author, comment in c.fetchall():
+        webui.comment_email(store, package, version, author, comment)
+
+def merge_user(store, old, new):
+    c = store.get_cursor()
+    if not store.get_user(old):
+        print "Old does not exist"
+        raise SystemExit
+    if not store.get_user(new):
+        print "New does not exist"
+        raise SystemExit
+
+    c.execute('update openids set name=%s where name=%s', (new, old))
+    c.execute('update sshkeys set name=%s where name=%s', (new, old))
+    c.execute('update roles set user_name=%s where user_name=%s', (new, old))
+    c.execute('delete from rego_otk where name=%s', (old,))
+    c.execute('update journals set submitted_by=%s where submitted_by=%s', (new, old))
+    c.execute('update mirrors set user_name=%s where user_name=%s', (new, old))
+    c.execute('update comments set user_name=%s where user_name=%s', (new, old))
+    c.execute('update ratings set user_name=%s where user_name=%s', (new, old))
+    c.execute('update comments_journal set submitted_by=%s where submitted_by=%s', (new, old))
+    c.execute('delete from users where name=%s', (old,))
+
+if __name__ == '__main__':
+    config = config.Config('/data/pypi/config.ini')
+    store = store.Store(config)
+    store.open()
+    command = sys.argv[1]
+    args = (store, ) + tuple(sys.argv[2:])
+    try:
+        if command == 'password':
+            set_password(*args)
+        elif command == 'rmpackage':
+            remove_package(*args)
+        elif command == 'addclass':
+            add_classifier(*args)
+        elif command == 'addowner':
+            add_owner(*args)
+        elif command == 'delowner':
+            delete_owner(*args)
+        elif command == 'rename':
+            rename_package(*args)
+        elif command == 'addmirror':
+            add_mirror(*args)
+        elif command == 'delmirror':
+            delete_mirror(*args)
+        elif command == 'delolddocs':
+            delete_old_docs(config, *args)
+        elif command == 'send_comments':
+            send_comments(*args)
+        elif command == 'mergeuser':
+            merge_user(*args)
+        else:
+            print "unknown command '%s'!"%command
+        store.changed()
+    finally:
+        store.close()
+
+#!/usr/bin/python
+# 
+
+from CGIHTTPServer import CGIHTTPRequestHandler
+import BaseHTTPServer, SimpleHTTPServer
+
+def main ():
+    SimpleHTTPServer.test(CGIHTTPRequestHandler, BaseHTTPServer.HTTPServer)
+
+if __name__ == '__main__':
+    main()
+[database]
+name = packages
+user = pypi
+files_dir = /MacDev/svn.python.org/pypi-pep345/files
+docs_dir = /MacDev/svn.python.org/pypi-pep345/docs
+
+[webui]
+mailhost = mail.commonground.com.au
+adminemail = richard@commonground.com.au
+replyto = richard@commonground.com.au
+url = http://localhost/cgi-bin/pypi.cgi
+pydotorg = http://www.python.org/
+simple_script = /simple
+files_url = http://localhost/pypi_files
+rss_file = /MacDev/svn.python.org/pypi-pep345/pypi_rss.xml
+debug_mode = yes
+cheesecake_password = secret
+privkey = privkey
+simple_sign_script = /serversig
+
+[logging]
+file = 
+mailhost = 
+fromaddr = 
+toaddrs =
+
+[mirrors]
+folder = mirrors
+local-stats = local-stats
+global-stats = global-stats
+
+import ConfigParser
+
+class Config:
+    ''' Read in the config and set up the vars with the correct type.
+    '''
+    def __init__(self, configfile):
+        c = ConfigParser.ConfigParser()
+        c.read(configfile)
+        self.database_name = c.get('database', 'name')
+        self.database_user = c.get('database', 'user')
+        if c.has_option('database', 'password'):
+            self.database_pw = c.get('database', 'password')
+        else:
+            self.database_pw = None
+        self.database_files_dir = c.get('database', 'files_dir')
+        self.database_docs_dir = c.get('database', 'docs_dir')
+        if c.has_option('database', 'pubsubhubbub'):
+            self.pubsubhubbub = c.get('database', 'pubsubhubbub')
+        else:
+            self.pubsubhubbub = None
+        self.mailhost = c.get('webui', 'mailhost')
+        self.adminemail = c.get('webui', 'adminemail')
+        self.replyto = c.get('webui', 'replyto')
+        self.url = c.get('webui', 'url')
+        self.pydotorg = c.get('webui', 'pydotorg')
+        self.simple_script = c.get('webui', 'simple_script')
+        self.files_url = c.get('webui', 'files_url')
+        self.rss_file = c.get('webui', 'rss_file')
+        self.debug_mode = c.get('webui', 'debug_mode')
+        self.cheesecake_password = c.get('webui', 'cheesecake_password')
+        self.privkey = c.get('webui', 'privkey')
+        self.simple_sign_script = c.get('webui', 'simple_sign_script')
+        if c.has_option('webui', 'sshkeys_update'):
+            self.sshkeys_update = c.get('webui', 'sshkeys_update')
+        else:
+            self.sshkeys_update = None
+
+        self.logfile = c.get('logging', 'file')
+        self.logging_mailhost = c.get('logging', 'mailhost')
+        self.fromaddr = c.get('logging', 'fromaddr')
+        self.toaddrs = c.get('logging', 'toaddrs').split(',')
+

doc/.svn/all-wcprops

+K 25
+svn:wc:ra_dav:version-url
+V 57
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc
+END
+fm.txt
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/fm.txt
+END
+rest.doc
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/rest.doc
+END
+pep-0301.txt
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/pep-0301.txt
+END
+freshmeat.trove.discriminators.txt
+K 25
+svn:wc:ra_dav:version-url
+V 92
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/freshmeat.trove.discriminators.txt
+END
+mirroring.txt
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/mirroring.txt
+END
+naming.txt
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/naming.txt
+END
+operational_manual.txt
+K 25
+svn:wc:ra_dav:version-url
+V 80
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/operational_manual.txt
+END
+dist.py.patch
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/dist.py.patch
+END
+sourceforge.trove.discriminators.txt
+K 25
+svn:wc:ra_dav:version-url
+V 94
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/sourceforge.trove.discriminators.txt
+END
+freshmeat.trove.txt
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/freshmeat.trove.txt
+END
+sourceforge.trove.txt
+K 25
+svn:wc:ra_dav:version-url
+V 79
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/sourceforge.trove.txt
+END
+pep.editor.feedback.20021102.txt
+K 25
+svn:wc:ra_dav:version-url
+V 90
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/pep.editor.feedback.20021102.txt
+END
+dist.tex.patch
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/dist.tex.patch
+END
+discriminators.txt
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/discriminators.txt
+END
+download.ideas.txt
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/download.ideas.txt
+END
+discussion.anthony.20021024.txt
+K 25
+svn:wc:ra_dav:version-url
+V 89
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/discussion.anthony.20021024.txt
+END
+feedback.anthony.20021024.txt
+K 25
+svn:wc:ra_dav:version-url
+V 87
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/feedback.anthony.20021024.txt
+END
+metadata-1.2-pep.txt
+K 25
+svn:wc:ra_dav:version-url
+V 78
+/packages/!svn/ver/740/branches/tarek-pep-345-support/doc/metadata-1.2-pep.txt
+END
+10
+
+dir
+740
+https://svn.python.org/packages/branches/tarek-pep-345-support/doc
+https://svn.python.org/packages
+
+
+
+2009-03-27T19:07:38.828443Z
+594
+martin.von.loewis
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+072f9a9a-8cf7-0310-8ca5-bf92c90cb7c1
+
+fm.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+460b75c66f3e64b63324a118182c0b3b
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+21772
+
+rest.doc
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+5c9b2cca4b0b4a06b392c08909aec15b
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+22196
+
+pep-0301.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+4ee1dde45120094f04599dbf5bb54b10
+2002-12-24T03:24:34.000000Z
+68
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+15126
+
+freshmeat.trove.discriminators.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+9a831e89eb5e1167210799dbf61860fe
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+20271
+
+mirroring.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+18717b5fc5485596855eebc5506f8d9a
+2009-03-27T19:07:38.828443Z
+594
+martin.von.loewis
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1678
+
+naming.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+658dbf19734dd61af029d0836ebac8d1
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3393
+
+operational_manual.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+0cdb3159fa660c37ca2725c38f7a498a
+2006-07-07T08:45:41.357547Z
+366
+jlg
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+600
+
+dist.py.patch
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+78ae17ef94f1f4dd8c4e6a60bb76ebe5
+2006-07-07T08:45:41.357547Z
+366
+jlg
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2425
+
+sourceforge.trove.discriminators.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+2050e3226b6dc9dbc3d17131242726fc
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+15272
+
+freshmeat.trove.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+eb83e03986de4b8dcff2975e3c8d2301
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+627
+
+sourceforge.trove.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+1ae777a72003c7253ad6f347081392c6
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+962
+
+pep.editor.feedback.20021102.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+911afd576b28f58c269d733640aad636
+2002-11-15T23:26:28.000000Z
+34
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2981
+
+dist.tex.patch
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+3cd4405507b33eea80cd77138f17eab6
+2006-07-07T08:45:41.357547Z
+366
+jlg
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5708
+
+discriminators.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+b04c0789fbe81b3adb207312cfa61d11
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+21046
+
+discussion.anthony.20021024.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+66c12405f6cf68727d80850be57d960b
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+905
+
+download.ideas.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+97639dcad17cdb191ed0b453b43c4170
+2002-11-06T06:05:55.000000Z
+14
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+571
+
+feedback.anthony.20021024.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+14e94d0cb95368f0e2598a95f3ea0357
+2002-11-01T05:19:40.000000Z
+3
+richard
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4653
+
+metadata-1.2-pep.txt
+file
+
+
+
+
+2010-03-13T22:20:31.000000Z
+74ca8dde0ae75e9a92f6d24081e54382
+2006-07-07T08:45:41.357547Z
+366
+jlg
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+12245
+

doc/.svn/prop-base/discriminators.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/discussion.anthony.20021024.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/dist.py.patch.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/dist.tex.patch.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/download.ideas.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/feedback.anthony.20021024.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/fm.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/freshmeat.trove.discriminators.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/freshmeat.trove.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/metadata-1.2-pep.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/naming.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/operational_manual.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/pep-0301.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/pep.editor.feedback.20021102.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/rest.doc.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/sourceforge.trove.discriminators.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/prop-base/sourceforge.trove.txt.svn-base

+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END

doc/.svn/text-base/discriminators.txt.svn-base

+Development Status :: 1 - Planning
+Development Status :: 2 - Pre-Alpha
+Development Status :: 3 - Alpha
+Development Status :: 4 - Beta
+Development Status :: 5 - Production/Stable
+Development Status :: 6 - Mature
+Development Status :: 7 - Inactive
+Environment :: Console (Framebuffer Based)
+Environment :: Console (svgalib Based)
+Environment :: Console (Text Based)
+Environment :: Console (Text Based) :: Curses
+Environment :: Console (Text Based) :: Newt
+Environment :: MacOS X
+Environment :: MacOS X :: Aqua
+Environment :: MacOS X :: Carbon
+Environment :: MacOS X :: Cocoa
+Environment :: Handhelds/PDA's
+Environment :: No Input/Output (Daemon)
+Environment :: Plugins
+Environment :: Other Environment
+Environment :: Web Environment
+Environment :: Web Environment :: Mozilla
+Environment :: Win32 (MS Windows)
+Environment :: X11 Applications
+Environment :: X11 Applications :: Gnome
+Environment :: X11 Applications :: GTK
+Environment :: X11 Applications :: KDE
+Environment :: X11 Applications :: Qt
+Intended Audience :: Customer Service
+Intended Audience :: Developers
+Intended Audience :: Education
+Intended Audience :: End Users/Desktop
+Intended Audience :: Financial and Insurance Industry
+Intended Audience :: Healthcare Industry
+Intended Audience :: Information Technology
+Intended Audience :: Legal Industry
+Intended Audience :: Manufacturing
+Intended Audience :: Other Audience
+Intended Audience :: Religion
+Intended Audience :: Science/Research
+Intended Audience :: System Administrators
+Intended Audience :: Telecommunications Industry
+License :: Aladdin Free Public License (AFPL)
+License :: DFSG approved
+License :: Eiffel Forum License (EFL)
+License :: Free For Educational Use
+License :: Free For Home Use
+License :: Free for non-commercial use
+License :: Freely Distributable
+License :: Free To Use But Restricted
+License :: Freeware
+License :: Netscape Public License (NPL)
+License :: Nokia Open Source License (NOKOS)
+License :: OSI Approved
+License :: OSI Approved :: Academic Free License (AFL)
+License :: OSI Approved :: Apache Software License
+License :: OSI Approved :: Apple Public Source License
+License :: OSI Approved :: Artistic License
+License :: OSI Approved :: Attribution Assurance License
+License :: OSI Approved :: BSD License
+License :: OSI Approved :: Common Public License
+License :: OSI Approved :: Eiffel Forum License
+License :: OSI Approved :: GNU Free Documentation License (FDL)
+License :: OSI Approved :: GNU General Public License (GPL)
+License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
+License :: OSI Approved :: IBM Public License
+License :: OSI Approved :: Intel Open Source License
+License :: OSI Approved :: Jabber Open Source License
+License :: OSI Approved :: MIT License
+License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)
+License :: OSI Approved :: Motosoto License
+License :: OSI Approved :: Mozilla Public License 1.0 (MPL)
+License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)
+License :: OSI Approved :: Nethack General Public License
+License :: OSI Approved :: Nokia Open Source License
+License :: OSI Approved :: Open Group Test Suite License
+License :: OSI Approved :: Python License (CNRI Python License)
+License :: OSI Approved :: Python Software Foundation License
+License :: OSI Approved :: Qt Public License (QPL)
+License :: OSI Approved :: Ricoh Source Code Public License
+License :: OSI Approved :: Sleepycat License
+License :: OSI Approved :: Sun Industry Standards Source License (SISSL)
+License :: OSI Approved :: Sun Public License
+License :: OSI Approved :: University of Illinois/NCSA Open Source License
+License :: OSI Approved :: Vovida Software License 1.0
+License :: OSI Approved :: W3C License
+License :: OSI Approved :: X.Net License
+License :: OSI Approved :: zlib/libpng License
+License :: OSI Approved :: Zope Public License
+License :: Other/Proprietary License
+License :: Public Domain
+Natural Language :: Afrikaans
+Natural Language :: Arabic
+Natural Language :: Bengali
+Natural Language :: Bosnian
+Natural Language :: Bulgarian
+Natural Language :: Catalan
+Natural Language :: Chinese (Simplified)
+Natural Language :: Chinese (Traditional)
+Natural Language :: Croatian
+Natural Language :: Czech
+Natural Language :: Danish
+Natural Language :: Dutch
+Natural Language :: English
+Natural Language :: Esperanto
+Natural Language :: Finnish
+Natural Language :: French
+Natural Language :: German
+Natural Language :: Greek
+Natural Language :: Hebrew
+Natural Language :: Hindi
+Natural Language :: Hungarian
+Natural Language :: Icelandic
+Natural Language :: Indonesian
+Natural Language :: Italian
+Natural Language :: Japanese
+Natural Language :: Javanese
+Natural Language :: Korean
+Natural Language :: Latin
+Natural Language :: Latvian
+Natural Language :: Macedonian
+Natural Language :: Malay
+Natural Language :: Marathi
+Natural Language :: Norwegian
+Natural Language :: Panjabi
+Natural Language :: Persian
+Natural Language :: Polish
+Natural Language :: Portuguese
+Natural Language :: Portuguese (Brazilian)
+Natural Language :: Romanian
+Natural Language :: Russian
+Natural Language :: Serbian
+Natural Language :: Slovak
+Natural Language :: Slovenian
+Natural Language :: Spanish
+Natural Language :: Swedish
+Natural Language :: Tamil
+Natural Language :: Telugu
+Natural Language :: Thai
+Natural Language :: Turkish
+Natural Language :: Ukranian
+Natural Language :: Urdu
+Natural Language :: Vietnamese
+Operating System :: BeOS
+Operating System :: MacOS
+Operating System :: MacOS :: MacOS 9
+Operating System :: MacOS :: MacOS X
+Operating System :: Microsoft
+Operating System :: Microsoft :: MS-DOS
+Operating System :: Microsoft :: Windows
+Operating System :: Microsoft :: Windows :: Windows 3.1 or Earlier
+Operating System :: Microsoft :: Windows :: Windows 95/98/2000
+Operating System :: Microsoft :: Windows :: Windows CE
+Operating System :: Microsoft :: Windows :: Windows NT/2000
+Operating System :: OS/2
+Operating System :: OS Independent
+Operating System :: Other OS
+Operating System :: PalmOS
+Operating System :: PDA Systems
+Operating System :: POSIX
+Operating System :: POSIX :: AIX
+Operating System :: POSIX :: BSD
+Operating System :: POSIX :: BSD :: BSD/OS
+Operating System :: POSIX :: BSD :: FreeBSD
+Operating System :: POSIX :: BSD :: NetBSD
+Operating System :: POSIX :: BSD :: OpenBSD
+Operating System :: POSIX :: GNU Hurd
+Operating System :: POSIX :: HP-UX
+Operating System :: POSIX :: IRIX
+Operating System :: POSIX :: Linux
+Operating System :: POSIX :: Other
+Operating System :: POSIX :: SCO
+Operating System :: POSIX :: SunOS/Solaris
+Operating System :: Unix
+Programming Language :: Ada
+Programming Language :: APL
+Programming Language :: ASP
+Programming Language :: Assembly
+Programming Language :: Awk
+Programming Language :: Basic
+Programming Language :: C
+Programming Language :: C#
+Programming Language :: C++
+Programming Language :: Cold Fusion
+Programming Language :: Delphi/Kylix
+Programming Language :: Dylan
+Programming Language :: Eiffel
+Programming Language :: Emacs-Lisp
+Programming Language :: Erlang
+Programming Language :: Euler
+Programming Language :: Euphoria
+Programming Language :: Forth
+Programming Language :: Fortran
+Programming Language :: Haskell
+Programming Language :: Java
+Programming Language :: JavaScript
+Programming Language :: Lisp
+Programming Language :: Logo
+Programming Language :: ML
+Programming Language :: Modula
+Programming Language :: Objective C
+Programming Language :: Object Pascal
+Programming Language :: OCaml
+Programming Language :: Other
+Programming Language :: Other Scripting Engines
+Programming Language :: Pascal
+Programming Language :: Perl
+Programming Language :: PHP
+Programming Language :: Pike
+Programming Language :: Pliant
+Programming Language :: PL/SQL
+Programming Language :: PROGRESS
+Programming Language :: Prolog
+Programming Language :: Python
+Programming Language :: REBOL
+Programming Language :: Rexx
+Programming Language :: Ruby
+Programming Language :: Scheme
+Programming Language :: Simula
+Programming Language :: Smalltalk
+Programming Language :: SQL
+Programming Language :: Tcl
+Programming Language :: Unix Shell
+Programming Language :: Visual Basic
+Programming Language :: XBasic
+Programming Language :: YACC
+Programming Language :: Zope
+Topic :: Adaptive Technologies
+Topic :: Artistic Software
+Topic :: Communications
+Topic :: Communications :: BBS
+Topic :: Communications :: Chat
+Topic :: Communications :: Chat :: AOL Instant Messenger
+Topic :: Communications :: Chat :: ICQ
+Topic :: Communications :: Chat :: Internet Relay Chat
+Topic :: Communications :: Chat :: Unix Talk
+Topic :: Communications :: Conferencing
+Topic :: Communications :: Email
+Topic :: Communications :: Email :: Address Book
+Topic :: Communications :: Email :: Email Clients (MUA)
+Topic :: Communications :: Email :: Filters
+Topic :: Communications :: Email :: Mailing List Servers
+Topic :: Communications :: Email :: Mail Transport Agents
+Topic :: Communications :: Email :: Post-Office
+Topic :: Communications :: Email :: Post-Office :: IMAP
+Topic :: Communications :: Email :: Post-Office :: POP3
+Topic :: Communications :: Fax
+Topic :: Communications :: FIDO
+Topic :: Communications :: File Sharing
+Topic :: Communications :: File Sharing :: Gnutella
+Topic :: Communications :: File Sharing :: Napster
+Topic :: Communications :: Ham Radio
+Topic :: Communications :: Internet Phone
+Topic :: Communications :: Telephony
+Topic :: Communications :: Usenet News
+Topic :: Database
+Topic :: Database :: Database Engines/Servers
+Topic :: Database :: Front-Ends
+Topic :: Desktop Environment
+Topic :: Desktop Environment :: File Managers
+Topic :: Desktop Environment :: Gnome
+Topic :: Desktop Environment :: GNUstep
+Topic :: Desktop Environment :: K Desktop Environment (KDE)
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes
+Topic :: Desktop Environment :: PicoGUI
+Topic :: Desktop Environment :: PicoGUI :: Applications
+Topic :: Desktop Environment :: PicoGUI :: Themes
+Topic :: Desktop Environment :: Screen Savers
+Topic :: Desktop Environment :: Window Managers
+Topic :: Desktop Environment :: Window Managers :: Afterstep
+Topic :: Desktop Environment :: Window Managers :: Afterstep :: Themes
+Topic :: Desktop Environment :: Window Managers :: Applets
+Topic :: Desktop Environment :: Window Managers :: Blackbox
+Topic :: Desktop Environment :: Window Managers :: Blackbox :: Themes
+Topic :: Desktop Environment :: Window Managers :: CTWM
+Topic :: Desktop Environment :: Window Managers :: CTWM :: Themes
+Topic :: Desktop Environment :: Window Managers :: Enlightenment
+Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Epplets
+Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR15
+Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR16
+Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR17
+Topic :: Desktop Environment :: Window Managers :: Fluxbox
+Topic :: Desktop Environment :: Window Managers :: Fluxbox :: Themes
+Topic :: Desktop Environment :: Window Managers :: FVWM
+Topic :: Desktop Environment :: Window Managers :: FVWM :: Themes
+Topic :: Desktop Environment :: Window Managers :: IceWM
+Topic :: Desktop Environment :: Window Managers :: IceWM :: Themes
+Topic :: Desktop Environment :: Window Managers :: MetaCity
+Topic :: Desktop Environment :: Window Managers :: MetaCity :: Themes
+Topic :: Desktop Environment :: Window Managers :: Oroborus
+Topic :: Desktop Environment :: Window Managers :: Oroborus :: Themes
+Topic :: Desktop Environment :: Window Managers :: Sawfish
+Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes 0.30
+Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes pre-0.30
+Topic :: Desktop Environment :: Window Managers :: Waimea
+Topic :: Desktop Environment :: Window Managers :: Waimea :: Themes
+Topic :: Desktop Environment :: Window Managers :: Window Maker
+Topic :: Desktop Environment :: Window Managers :: Window Maker :: Applets
+Topic :: Desktop Environment :: Window Managers :: Window Maker :: Themes
+Topic :: Desktop Environment :: Window Managers :: XFCE
+Topic :: Desktop Environment :: Window Managers :: XFCE :: Themes
+Topic :: Documentation
+Topic :: Education
+Topic :: Education :: Computer Aided Instruction (CAI)
+Topic :: Education :: Testing
+Topic :: Games/Entertainment
+Topic :: Games/Entertainment :: Arcade
+Topic :: Games/Entertainment :: Board Games
+Topic :: Games/Entertainment :: First Person Shooters
+Topic :: Games/Entertainment :: Fortune Cookies
+Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)
+Topic :: Games/Entertainment :: Puzzle Games
+Topic :: Games/Entertainment :: Real Time Strategy
+Topic :: Games/Entertainment :: Role-Playing
+Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games
+Topic :: Games/Entertainment :: Simulation
+Topic :: Games/Entertainment :: Turn Based Strategy
+Topic :: Home Automation
+Topic :: Internet
+Topic :: Internet :: File Transfer Protocol (FTP)
+Topic :: Internet :: Finger
+Topic :: Internet :: Log Analysis
+Topic :: Internet :: Name Service (DNS)
+Topic :: Internet :: Proxy Servers
+Topic :: Internet :: WAP
+Topic :: Internet :: WWW/HTTP
+Topic :: Internet :: WWW/HTTP :: Browsers
+Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries
+Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards
+Topic :: Internet :: WWW/HTTP :: Dynamic Content :: News/Diary
+Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters
+Topic :: Internet :: WWW/HTTP :: HTTP Servers
+Topic :: Internet :: WWW/HTTP :: Indexing/Search
+Topic :: Internet :: WWW/HTTP :: Site Management
+Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking
+Topic :: Internet :: Z39.50
+Topic :: Multimedia
+Topic :: Multimedia :: Graphics
+Topic :: Multimedia :: Graphics :: 3D Modeling
+Topic :: Multimedia :: Graphics :: 3D Rendering
+Topic :: Multimedia :: Graphics :: Capture
+Topic :: Multimedia :: Graphics :: Capture :: Digital Camera
+Topic :: Multimedia :: Graphics :: Capture :: Scanners
+Topic :: Multimedia :: Graphics :: Capture :: Screen Capture
+Topic :: Multimedia :: Graphics :: Editors
+Topic :: Multimedia :: Graphics :: Editors :: Raster-Based
+Topic :: Multimedia :: Graphics :: Editors :: Vector-Based
+Topic :: Multimedia :: Graphics :: Graphics Conversion
+Topic :: Multimedia :: Graphics :: Presentation
+Topic :: Multimedia :: Graphics :: Viewers
+Topic :: Multimedia :: Sound/Audio
+Topic :: Multimedia :: Sound/Audio :: Analysis
+Topic :: Multimedia :: Sound/Audio :: Capture/Recording
+Topic :: Multimedia :: Sound/Audio :: CD Audio
+Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing
+Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping
+Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Writing
+Topic :: Multimedia :: Sound/Audio :: Conversion
+Topic :: Multimedia :: Sound/Audio :: Editors
+Topic :: Multimedia :: Sound/Audio :: MIDI
+Topic :: Multimedia :: Sound/Audio :: Mixers
+Topic :: Multimedia :: Sound/Audio :: Players
+Topic :: Multimedia :: Sound/Audio :: Players :: MP3
+Topic :: Multimedia :: Sound/Audio :: Sound Synthesis
+Topic :: Multimedia :: Sound/Audio :: Speech
+Topic :: Multimedia :: Video
+Topic :: Multimedia :: Video :: Capture
+Topic :: Multimedia :: Video :: Conversion
+Topic :: Multimedia :: Video :: Display
+Topic :: Multimedia :: Video :: Non-Linear Editor
+Topic :: Office/Business
+Topic :: Office/Business :: Financial
+Topic :: Office/Business :: Financial :: Accounting
+Topic :: Office/Business :: Financial :: Investment
+Topic :: Office/Business :: Financial :: Point-Of-Sale
+Topic :: Office/Business :: Financial :: Spreadsheet
+Topic :: Office/Business :: Groupware
+Topic :: Office/Business :: News/Diary
+Topic :: Office/Business :: Office Suites
+Topic :: Office/Business :: Scheduling
+Topic :: Other/Nonlisted Topic
+Topic :: Printing
+Topic :: Religion
+Topic :: Scientific/Engineering
+Topic :: Scientific/Engineering :: Artificial Intelligence
+Topic :: Scientific/Engineering :: Astronomy
+Topic :: Scientific/Engineering :: Bio-Informatics
+Topic :: Scientific/Engineering :: Chemistry
+Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
+Topic :: Scientific/Engineering :: GIS
+Topic :: Scientific/Engineering :: Human Machine Interfaces
+Topic :: Scientific/Engineering :: Image Recognition
+Topic :: Scientific/Engineering :: Information Analysis
+Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator
+Topic :: Scientific/Engineering :: Mathematics
+Topic :: Scientific/Engineering :: Medical Science Apps.
+Topic :: Scientific/Engineering :: Physics
+Topic :: Scientific/Engineering :: Visualization
+Topic :: Security
+Topic :: Security :: Cryptography
+Topic :: Sociology
+Topic :: Sociology :: Genealogy
+Topic :: Sociology :: History
+Topic :: Software Development
+Topic :: Software Development :: Assemblers
+Topic :: Software Development :: Bug Tracking
+Topic :: Software Development :: Build Tools
+Topic :: Software Development :: Code Generators
+Topic :: Software Development :: Compilers
+Topic :: Software Development :: Debuggers
+Topic :: Software Development :: Disassemblers
+Topic :: Software Development :: Documentation
+Topic :: Software Development :: Embedded Systems
+Topic :: Software Development :: Internationalization
+Topic :: Software Development :: Interpreters
+Topic :: Software Development :: Libraries
+Topic :: Software Development :: Libraries :: Application Frameworks
+Topic :: Software Development :: Libraries :: Java Libraries
+Topic :: Software Development :: Libraries :: Perl Modules
+Topic :: Software Development :: Libraries :: PHP Classes
+Topic :: Software Development :: Libraries :: Pike Modules
+Topic :: Software Development :: Libraries :: Python Modules
+Topic :: Software Development :: Libraries :: Ruby Modules
+Topic :: Software Development :: Libraries :: Tcl Extensions
+Topic :: Software Development :: Localization
+Topic :: Software Development :: Object Brokering
+Topic :: Software Development :: Object Brokering :: CORBA
+Topic :: Software Development :: Pre-processors
+Topic :: Software Development :: Quality Assurance
+Topic :: Software Development :: Testing
+Topic :: Software Development :: Testing :: Traffic Generation
+Topic :: Software Development :: User Interfaces
+Topic :: Software Development :: Version Control
+Topic :: Software Development :: Version Control :: CVS
+Topic :: Software Development :: Version Control :: RCS
+Topic :: Software Development :: Version Control :: SCCS
+Topic :: Software Development :: Widget Sets
+Topic :: System
+Topic :: System :: Archiving
+Topic :: System :: Archiving :: Backup
+Topic :: System :: Archiving :: Compression
+Topic :: System :: Archiving :: Mirroring
+Topic :: System :: Archiving :: Packaging
+Topic :: System :: Benchmark
+Topic :: System :: Boot
+Topic :: System :: Boot :: Init
+Topic :: System :: Clustering
+Topic :: System :: Console Fonts
+Topic :: System :: Distributed Computing
+Topic :: System :: Emulators
+Topic :: System :: Filesystems
+Topic :: System :: Hardware
+Topic :: System :: Hardware :: Hardware Drivers
+Topic :: System :: Hardware :: Mainframes
+Topic :: System :: Hardware :: Symmetric Multi-processing
+Topic :: System :: Installation/Setup
+Topic :: System :: Logging
+Topic :: System :: Monitoring
+Topic :: System :: Networking