summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrichard <devnull@localhost>2002-11-01 05:19:40 +0000
committerrichard <devnull@localhost>2002-11-01 05:19:40 +0000
commit98725a72613714a7a73c4ac6d900cd8476450796 (patch)
tree193da310b1c9d5d0ffff7882cd7fe0f279c8828d
downloaddecorator-98725a72613714a7a73c4ac6d900cd8476450796.tar.gz
Initial revision
-rw-r--r--config.ini6
-rw-r--r--config.py13
-rw-r--r--config.pycbin0 -> 812 bytes
-rw-r--r--doc/discriminators.txt501
-rw-r--r--doc/discussion.anthony.20021024.txt20
-rw-r--r--doc/feedback.anthony.20021024.txt125
-rw-r--r--doc/fm.txt494
-rw-r--r--doc/freshmeat.trove.discriminators.txt460
-rw-r--r--doc/freshmeat.trove.txt14
-rw-r--r--doc/naming.txt83
-rw-r--r--doc/pep.txt287
-rw-r--r--doc/rest.doc639
-rw-r--r--doc/sourceforge.trove.discriminators.txt386
-rw-r--r--doc/sourceforge.trove.txt29
-rwxr-xr-xpypi.cgi65
-rw-r--r--register.py227
-rw-r--r--webui.py573
17 files changed, 3922 insertions, 0 deletions
diff --git a/config.ini b/config.ini
new file mode 100644
index 0000000..01a09c7
--- /dev/null
+++ b/config.ini
@@ -0,0 +1,6 @@
+[webui]
+database = /tmp/pkgbase/db
+mailhost = crown
+adminemail = rjones@ekit-inc.com
+url = http://localhost/cgi-bin/package_server.cgi
+
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..3547cca
--- /dev/null
+++ b/config.py
@@ -0,0 +1,13 @@
+import ConfigParser
+
+class Config:
+ ''' Read in the config and set up the vars with the correct type.
+ '''
+ def __init__(self, configfile, name):
+ c = ConfigParser.ConfigParser()
+ c.read(configfile)
+ self.database = c.get(name, 'database')
+ self.mailhost = c.get(name, 'mailhost')
+ self.adminemail = c.get(name, 'adminemail')
+ self.url = c.get(name, 'url')
+
diff --git a/config.pyc b/config.pyc
new file mode 100644
index 0000000..6b1054e
--- /dev/null
+++ b/config.pyc
Binary files differ
diff --git a/doc/discriminators.txt b/doc/discriminators.txt
new file mode 100644
index 0000000..5fb03f8
--- /dev/null
+++ b/doc/discriminators.txt
@@ -0,0 +1,501 @@
+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
+Topic :: System :: Networking :: Firewalls
+Topic :: System :: Networking :: Monitoring
+Topic :: System :: Networking :: Monitoring :: Hardware Watchdog
+Topic :: System :: Networking :: Time Synchronization
+Topic :: System :: Operating System
+Topic :: System :: Operating System Kernels
+Topic :: System :: Operating System Kernels :: BSD
+Topic :: System :: Operating System Kernels :: GNU Hurd
+Topic :: System :: Operating System Kernels :: Linux
+Topic :: System :: Power (UPS)
+Topic :: System :: Recovery Tools
+Topic :: System :: Shells
+Topic :: System :: Software Distribution
+Topic :: System :: Systems Administration
+Topic :: System :: Systems Administration :: Authentication/Directory
+Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP
+Topic :: System :: Systems Administration :: Authentication/Directory :: NIS
+Topic :: System :: System Shells
+Topic :: Terminals
+Topic :: Terminals :: Serial
+Topic :: Terminals :: Telnet
+Topic :: Terminals :: Terminal Emulators/X Terminals
+Topic :: Text Editors
+Topic :: Text Editors :: Documentation
+Topic :: Text Editors :: Emacs
+Topic :: Text Editors :: Integrated Development Environments (IDE)
+Topic :: Text Editors :: Text Processing
+Topic :: Text Editors :: Word Processors
+Topic :: Text Processing
+Topic :: Text Processing :: Filters
+Topic :: Text Processing :: Fonts
+Topic :: Text Processing :: General
+Topic :: Text Processing :: Indexing
+Topic :: Text Processing :: Linguistic
+Topic :: Text Processing :: Markup
+Topic :: Text Processing :: Markup :: HTML
+Topic :: Text Processing :: Markup :: LaTeX
+Topic :: Text Processing :: Markup :: SGML
+Topic :: Text Processing :: Markup :: VRML
+Topic :: Text Processing :: Markup :: XML
+Topic :: Utilities
diff --git a/doc/discussion.anthony.20021024.txt b/doc/discussion.anthony.20021024.txt
new file mode 100644
index 0000000..41308b4
--- /dev/null
+++ b/doc/discussion.anthony.20021024.txt
@@ -0,0 +1,20 @@
+> the user stuff was kinda thrown in on the train this morning. had a look
+> at PAUSE when I got in: mostly it's about registering users and they then
+> own namespaces. I
+'m not sure how the owning
+> stuff will work - trove talks about it a bit. trove is also pretty thin on
+> the ground in places ;)
+
+**** A message has arrived from pluto on Thu Oct 24 17:19! ****
+From: anthony [To: richard]
+for trove, I'd suggest something like a trove browser (but better
+than the SF one, pleeeease) that allows you to extract the data for
+insertion into your setup.py.
+Or else, categorise it via the web, and if you post a new setup.py
+register with no discriminators, tell it to leave the current one alone.
+
+
+**** A message has arrived from pluto on Thu Oct 24 17:19! ****
+From: anthony [To: richard]
+you might also want some sort of two-stage "the following things will
+be changed, do you want to proceed" thing.
diff --git a/doc/feedback.anthony.20021024.txt b/doc/feedback.anthony.20021024.txt
new file mode 100644
index 0000000..f999fd0
--- /dev/null
+++ b/doc/feedback.anthony.20021024.txt
@@ -0,0 +1,125 @@
+From anthony@interlink.com.au Thu Oct 24 17:08:22 2002
+X-Sieve: cmu-sieve 2.0
+Return-Path: <anthony@interlink.com.au>
+Received: (from uucp@localhost)
+ by crown.off.ekorp.com (8.9.3/8.9.3) id HAA08779
+ for rjones@ekit-inc.com; Thu, 24 Oct 2002 07:10:04 GMT
+Received: from cirrus.netspace.net.au(203.10.110.75)
+ via SMTP by mx3.ekorp.com, id smtpdAAAYMa4fr; Thu Oct 24 07:09:59 2002
+Received: from localhost.localdomain (dsl-203-113-236-58.VIC.netspace.net.au [203.113.236.58])
+ by cirrus.netspace.net.au (8.11.3/8.11.3) with ESMTP id g9O79w786906
+ for <rjones@ekit-inc.com>; Thu, 24 Oct 2002 17:09:58 +1000 (EST)
+Received: from arbhome.com.au (anthony@localhost)
+ by localhost.localdomain (8.11.6/8.11.6) with ESMTP id g9O78MG02368
+ for <rjones@ekit-inc.com>; Thu, 24 Oct 2002 17:08:22 +1000
+Message-Id: <200210240708.g9O78MG02368@localhost.localdomain>
+X-Authentication-Warning: localhost.localdomain: anthony owned process doing -bs
+X-Mailer: exmh version 2.5 07/13/2001 with nmh-1.0.4
+X-Exmh-Isig-CompType: repl
+X-Exmh-Isig-Folder: inbox
+To: Richard Jones <rjones@ekit-inc.com>
+From: Anthony Baxter <anthony@interlink.com.au>
+Reply-to: Anthony Baxter <anthony@interlink.com.au>
+Subject: Re: PEP draft
+In-Reply-To: <200210241657.55412.rjones@ekit-inc.com>
+Mime-Version: 1.0
+Content-Type: text/plain
+Date: Thu, 24 Oct 2002 17:08:22 +1000
+Status: R
+X-Status: N
+X-KMail-EncryptionState:
+X-KMail-SignatureState:
+
+
+>>> Richard Jones wrote
+> PEP: XXX
+> Title: Distutils Enhancements
+> Version: $Revision$
+> Last-Modified: $Date$
+> Author: Richard Jones <rjones@ekit-inc.com>
+> Status: Draft
+> Type: Standards Track
+> Content-Type: text/x-rst
+> Created: 24-Oct-2002
+> Python-Version: 2.3
+> Post-History:
+>
+>
+> Abstract
+> ========
+>
+> This PEP proposes several extensions to the distutils packaging
+> system [1]_. These enhancements include a central package index, tools
+> for submitting package information to the index and extensions to the
+> package metadata to include Trove [2]_ information.
+>
+Include Vaults of Parnassus in the "prior art" investigation.
+
+> This PEP does not address either issues of package dependency, nor
+> central storage of packages.
+ centralised
+
+> existing (name, version) will result in an *update* operation.
+>
+> The web interface implement the following commands:
+ implements
+>
+> the index view. The index will include a customisation form at the
+> bottom a-la Roundup. The results will be paginated, sorted
+Give a reference (web site) for this.
+
+> **user**
+> Registers a new user with the index. Requires username, password and
+> email address. Passwords will be stored as SHA hashes. If the
+> username exists:
+
+Should require a confirmation email, as with mailman &c.
+
+> Notification of changes to a package entry will be sent to all users
+> who have created submitted information about the package.
+
+What does this mean?
+
+> discriminators = [
+> 'Development Status :: 4 - Beta',
+> 'Environment :: Console (Text Based)',
+> 'Environment :: Web Environment',
+> 'Intended Audience :: End Users/Desktop',
+> 'Intended Audience :: Developers',
+> 'Intended Audience :: System Administrators',
+> 'License :: OSI Approved :: Python License',
+> 'Operating System :: MacOS X',
+> 'Operating System :: Microsoft :: Windows',
+> 'Operating System :: POSIX',
+> 'Programming Language :: Python',
+> 'Topic :: Communications :: Email',
+> 'Topic :: Office/Business',
+> 'Topic :: Software Development :: Bug Tracking',
+
+Why strings like this, rather than proper structures? e.g.
+
+ discriminators = {
+ 'Development Status': '4 - Beta',
+ 'Environment' : ('Console (Text Based)', 'Web Environment')
+ 'Intended Audience' : ('End Users/Desktop', 'Developers', 'System Administrators'),
+.....
+
+How do people know that their trove categorisation is correct (e.g.
+that it doesn't have speling mistaiks?)
+
+> The list of discriminator values on the module index has been snarfed
+> from Freshmeat, without their permission.
+
+Should check that this is ok with them.
+
+There should be some sort of simple "check categorisation" or "update
+categorisation" thing.
+
+Who can update a package entry? ACLs? How and what can be updated
+with 'register'? Only a new version? What about changing trove
+categorisations, homepages, or the like? What about clashes of
+names (I don't know if there are any out there, but it wouldn't
+suprise me).
+
+
+
diff --git a/doc/fm.txt b/doc/fm.txt
new file mode 100644
index 0000000..1baed57
--- /dev/null
+++ b/doc/fm.txt
@@ -0,0 +1,494 @@
+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 :: Artistic License
+License :: OSI Approved :: BSD License
+License :: OSI Approved :: Common Public License
+License :: OSI Approved :: GNAT Modified GPL (GMGPL)
+License :: OSI Approved :: GNU Free Documentation License (FDL)
+License :: OSI Approved :: GNU General Public License (GPL)
+License :: OSI Approved :: GNU Lesser General Public License (LGPL)
+License :: OSI Approved :: Guile license
+License :: OSI Approved :: IBM Public License
+License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)
+License :: OSI Approved :: MIT/X Consortium License
+License :: OSI Approved :: Mozilla Public License (MPL)
+License :: OSI Approved :: Open Software License
+License :: OSI Approved :: Perl License
+License :: OSI Approved :: Python License
+License :: OSI Approved :: Q Public License (QPL)
+License :: OSI Approved :: Ricoh Source Code Public License
+License :: OSI Approved :: SUN Public License
+License :: OSI Approved :: W3C License
+License :: OSI Approved :: zlib/libpng License
+License :: Other/Proprietary License
+License :: Other/Proprietary License with Free Trial
+License :: Other/Proprietary License with Source
+License :: Public Domain
+License :: Shareware
+License :: SUN Binary Code License
+License :: SUN Community Source License
+License :: The Apache License
+License :: The Clarified Artistic License
+License :: The Latex Project Public License (LPPL)
+License :: The Open Content License
+License :: The PHP License
+License :: Voxel Public License (VPL)
+License :: Zope Public License (ZPL)
+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 :: Application Themes
+Topic :: Desktop Environment :: Application Themes :: Galeon
+Topic :: Desktop Environment :: Application Themes :: GKrellM
+Topic :: Desktop Environment :: Application Themes :: Login Managers
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: GDM
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: KDM
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: WDM
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: XDM
+Topic :: Desktop Environment :: Application Themes :: Mozilla
+Topic :: Desktop Environment :: Application Themes :: Nautilus
+Topic :: Desktop Environment :: Application Themes :: Shells
+Topic :: Desktop Environment :: Application Themes :: XMMS
+Topic :: Desktop Environment :: File Managers
+Topic :: Desktop Environment :: Fonts
+Topic :: Desktop Environment :: Gnome
+Topic :: Desktop Environment :: Gnome :: GTK 1.x Themes
+Topic :: Desktop Environment :: Gnome :: GTK 2.x Themes
+Topic :: Desktop Environment :: Gnome :: Metathemes
+Topic :: Desktop Environment :: GNUstep
+Topic :: Desktop Environment :: K Desktop Environment (KDE)
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes KDE 1.x
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes KDE 2.x
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes KDE 3.x
+Topic :: Desktop Environment :: PicoGUI
+Topic :: Desktop Environment :: PicoGUI :: Applications
+Topic :: Desktop Environment :: PicoGUI :: Themes
+Topic :: Desktop Environment :: Screen Savers
+Topic :: Desktop Environment :: Theme
+Topic :: Desktop Environment :: Theme :: Adult
+Topic :: Desktop Environment :: Theme :: Animals
+Topic :: Desktop Environment :: Theme :: Anime
+Topic :: Desktop Environment :: Theme :: Art
+Topic :: Desktop Environment :: Theme :: Cartoons
+Topic :: Desktop Environment :: Theme :: Computers
+Topic :: Desktop Environment :: Theme :: Engine
+Topic :: Desktop Environment :: Theme :: Fantasy
+Topic :: Desktop Environment :: Theme :: Holiday
+Topic :: Desktop Environment :: Theme :: Misc
+Topic :: Desktop Environment :: Theme :: Movies
+Topic :: Desktop Environment :: Theme :: Music
+Topic :: Desktop Environment :: Theme :: Nature
+Topic :: Desktop Environment :: Theme :: Operating Systems
+Topic :: Desktop Environment :: Theme :: People
+Topic :: Desktop Environment :: Theme :: Pixmap
+Topic :: Desktop Environment :: Theme :: Places
+Topic :: Desktop Environment :: Theme :: Plain
+Topic :: Desktop Environment :: Theme :: Products
+Topic :: Desktop Environment :: Theme Resources
+Topic :: Desktop Environment :: Theme Resources :: Backgrounds
+Topic :: Desktop Environment :: Theme Resources :: Cursors
+Topic :: Desktop Environment :: Theme Resources :: Fonts
+Topic :: Desktop Environment :: Theme Resources :: Icons
+Topic :: Desktop Environment :: Theme :: Science Fiction
+Topic :: Desktop Environment :: Theme :: Sports
+Topic :: Desktop Environment :: Theme :: Vehicles
+Topic :: Desktop Environment :: Theme :: Video Games
+Topic :: Desktop Environment :: Theme :: Web
+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 :: Bioinformatics
+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
+Topic :: System :: Networking :: Firewalls
+Topic :: System :: Networking :: Monitoring
+Topic :: System :: Networking :: Monitoring :: Hardware Watchdog
+Topic :: System :: Networking :: Time Synchronization
+Topic :: System :: Operating System
+Topic :: System :: Operating System Kernels
+Topic :: System :: Operating System Kernels :: BSD
+Topic :: System :: Operating System Kernels :: GNU Hurd
+Topic :: System :: Operating System Kernels :: Linux
+Topic :: System :: Power (UPS)
+Topic :: System :: Recovery Tools
+Topic :: System :: Shells
+Topic :: System :: Software Distribution
+Topic :: System :: Systems Administration
+Topic :: System :: Systems Administration :: Authentication/Directory
+Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP
+Topic :: System :: Systems Administration :: Authentication/Directory :: NIS
+Topic :: System :: System Shells
+Topic :: Terminals
+Topic :: Terminals :: Serial
+Topic :: Terminals :: Telnet
+Topic :: Terminals :: Terminal Emulators/X Terminals
+Topic :: Text Editors
+Topic :: Text Editors :: Documentation
+Topic :: Text Editors :: Emacs
+Topic :: Text Editors :: Integrated Development Environments (IDE)
+Topic :: Text Editors :: Text Processing
+Topic :: Text Editors :: Word Processors
+Topic :: Text Processing
+Topic :: Text Processing :: Filters
+Topic :: Text Processing :: Fonts
+Topic :: Text Processing :: General
+Topic :: Text Processing :: Indexing
+Topic :: Text Processing :: Linguistic
+Topic :: Text Processing :: Markup
+Topic :: Text Processing :: Markup :: HTML
+Topic :: Text Processing :: Markup :: LaTeX
+Topic :: Text Processing :: Markup :: SGML
+Topic :: Text Processing :: Markup :: VRML
+Topic :: Text Processing :: Markup :: XML
+Topic :: Utilities
diff --git a/doc/freshmeat.trove.discriminators.txt b/doc/freshmeat.trove.discriminators.txt
new file mode 100644
index 0000000..f51379b
--- /dev/null
+++ b/doc/freshmeat.trove.discriminators.txt
@@ -0,0 +1,460 @@
+Development Status :: 1 - Planning (disabled category)
+Development Status :: 2 - Pre-Alpha
+Development Status :: 3 - Alpha
+Development Status :: 4 - Beta
+Development Status :: 5 - Production/Stable
+Development Status :: 6 - Mature
+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 :: No Input/Output (Daemon)
+Environment :: Plugins
+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 :: End Users/Desktop
+Intended Audience :: Developers
+Intended Audience :: System Administrators
+Intended Audience :: Quality Engineers
+Intended Audience :: Other Audience
+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 :: Free To Use But Restricted
+License :: Freely Distributable
+License :: Freeware
+License :: Netscape Public License (NPL)
+License :: Nokia Open Source License (NOKOS)
+License :: OSI Approved
+License :: OSI Approved :: Artistic License
+License :: OSI Approved :: BSD License
+License :: OSI Approved :: Common Public License
+License :: OSI Approved :: GNAT Modified GPL (GMGPL)
+License :: OSI Approved :: GNU Free Documentation License (FDL)
+License :: OSI Approved :: GNU General Public License (GPL)
+License :: OSI Approved :: GNU Lesser General Public License (LGPL)
+License :: OSI Approved :: Guile license
+License :: OSI Approved :: IBM Public License
+License :: OSI Approved :: MIT/X Consortium License
+License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)
+License :: OSI Approved :: Mozilla Public License (MPL)
+License :: OSI Approved :: Open Software License
+License :: OSI Approved :: Perl License
+License :: OSI Approved :: Python License
+License :: OSI Approved :: Q Public License (QPL)
+License :: OSI Approved :: Ricoh Source Code Public License
+License :: OSI Approved :: SUN Public License
+License :: OSI Approved :: W3C License
+License :: OSI Approved :: zlib/libpng License
+License :: Other/Proprietary License
+License :: Other/Proprietary License with Free Trial
+License :: Other/Proprietary License with Source
+License :: Public Domain
+License :: Shareware
+License :: SUN Binary Code License
+License :: SUN Community Source License
+License :: The Apache License
+License :: The Clarified Artistic License
+License :: The Latex Project Public License (LPPL)
+License :: The Open Content License
+License :: The PHP License
+License :: Voxel Public License (VPL)
+License :: Zope Public License (ZPL)
+Operating System :: BeOS
+Operating System :: MacOS
+Operating System :: 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 Independent
+Operating System :: OS/2
+Operating System :: Other OS
+Operating System :: PalmOS
+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
+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 :: Object Pascal
+Programming Language :: Objective C
+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 :: PL/SQL
+Programming Language :: Pliant
+Programming Language :: PROGRESS
+Programming Language :: Prolog
+Programming Language :: Python
+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 :: Mail Transport Agents
+Topic :: Communications :: Email :: Mailing List Servers
+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 :: 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 :: Application Themes
+Topic :: Desktop Environment :: Application Themes :: Galeon
+Topic :: Desktop Environment :: Application Themes :: GKrellM
+Topic :: Desktop Environment :: Application Themes :: Login Managers
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: GDM
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: KDM
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: WDM
+Topic :: Desktop Environment :: Application Themes :: Login Managers :: XDM
+Topic :: Desktop Environment :: Application Themes :: Mozilla
+Topic :: Desktop Environment :: Application Themes :: Nautilus
+Topic :: Desktop Environment :: Application Themes :: Shells
+Topic :: Desktop Environment :: Application Themes :: XMMS
+Topic :: Desktop Environment :: File Managers
+Topic :: Desktop Environment :: Fonts
+Topic :: Desktop Environment :: Gnome
+Topic :: Desktop Environment :: Gnome :: GTK 1.x Themes
+Topic :: Desktop Environment :: Gnome :: GTK 2.x Themes
+Topic :: Desktop Environment :: Gnome :: Metathemes
+Topic :: Desktop Environment :: GNUstep
+Topic :: Desktop Environment :: K Desktop Environment (KDE)
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes KDE 1.x
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes KDE 2.x
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes KDE 3.x
+Topic :: Desktop Environment :: PicoGUI
+Topic :: Desktop Environment :: PicoGUI :: Applications
+Topic :: Desktop Environment :: PicoGUI :: Themes
+Topic :: Desktop Environment :: Screen Savers
+Topic :: Desktop Environment :: Theme
+Topic :: Desktop Environment :: Theme :: Adult
+Topic :: Desktop Environment :: Theme :: Animals
+Topic :: Desktop Environment :: Theme :: Anime
+Topic :: Desktop Environment :: Theme :: Art
+Topic :: Desktop Environment :: Theme :: Cartoons
+Topic :: Desktop Environment :: Theme :: Computers
+Topic :: Desktop Environment :: Theme :: Engine
+Topic :: Desktop Environment :: Theme :: Fantasy
+Topic :: Desktop Environment :: Theme :: Holiday
+Topic :: Desktop Environment :: Theme :: Misc
+Topic :: Desktop Environment :: Theme :: Movies
+Topic :: Desktop Environment :: Theme :: Music
+Topic :: Desktop Environment :: Theme :: Nature
+Topic :: Desktop Environment :: Theme :: Operating Systems
+Topic :: Desktop Environment :: Theme :: People
+Topic :: Desktop Environment :: Theme :: Pixmap
+Topic :: Desktop Environment :: Theme :: Places
+Topic :: Desktop Environment :: Theme :: Plain
+Topic :: Desktop Environment :: Theme :: Products
+Topic :: Desktop Environment :: Theme :: Science Fiction
+Topic :: Desktop Environment :: Theme :: Sports
+Topic :: Desktop Environment :: Theme :: Vehicles
+Topic :: Desktop Environment :: Theme :: Video Games
+Topic :: Desktop Environment :: Theme :: Web
+Topic :: Desktop Environment :: Theme Resources
+Topic :: Desktop Environment :: Theme Resources :: Backgrounds
+Topic :: Desktop Environment :: Theme Resources :: Cursors
+Topic :: Desktop Environment :: Theme Resources :: Fonts
+Topic :: Desktop Environment :: Theme Resources :: Icons
+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 :: 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 :: 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 :: 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 :: Bioinformatics
+Topic :: Scientific/Engineering :: Chemistry
+Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
+Topic :: Scientific/Engineering :: Image Recognition
+Topic :: Scientific/Engineering :: Mathematics
+Topic :: Scientific/Engineering :: Medical Science Apps.
+Topic :: Scientific/Engineering :: Visualization
+Topic :: Security
+Topic :: Security :: Cryptography
+Topic :: Software Development
+Topic :: Software Development :: Assemblers
+Topic :: Software Development :: Build Tools
+Topic :: Software Development :: Bug Tracking
+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/Distributed Networks
+Topic :: System :: Console Fonts
+Topic :: System :: Emulators
+Topic :: System :: Filesystems
+Topic :: System :: Hardware
+Topic :: System :: Installation/Setup
+Topic :: System :: Logging
+Topic :: System :: Monitoring
+Topic :: System :: Networking
+Topic :: System :: Networking :: Firewalls
+Topic :: System :: Networking :: Monitoring
+Topic :: System :: Networking :: Monitoring :: Hardware Watchdog
+Topic :: System :: Networking :: Time Synchronization
+Topic :: System :: Operating System
+Topic :: System :: Operating System Kernels
+Topic :: System :: Operating System Kernels :: BSD
+Topic :: System :: Operating System Kernels :: GNU Hurd
+Topic :: System :: Operating System Kernels :: Linux
+Topic :: System :: Power (UPS)
+Topic :: System :: Recovery Tools
+Topic :: System :: Shells
+Topic :: System :: Software Distribution
+Topic :: System :: Software Distribution Tools
+Topic :: System :: Systems Administration
+Topic :: Terminals
+Topic :: Terminals :: Serial
+Topic :: Terminals :: Telnet
+Topic :: Terminals :: Terminal Emulators/X Terminals
+Topic :: Text Editors
+Topic :: Text Editors :: Documentation
+Topic :: Text Editors :: Emacs
+Topic :: Text Editors :: Integrated Development Environments (IDE)
+Topic :: Text Editors :: Word Processors
+Topic :: Text Processing
+Topic :: Text Processing :: Filters
+Topic :: Text Processing :: Fonts
+Topic :: Text Processing :: General
+Topic :: Text Processing :: Indexing
+Topic :: Text Processing :: Linguistic
+Topic :: Text Processing :: Markup
+Topic :: Text Processing :: Markup :: HTML
+Topic :: Text Processing :: Markup :: LaTeX
+Topic :: Text Processing :: Markup :: SGML
+Topic :: Text Processing :: Markup :: VRML
+Topic :: Text Processing :: Markup :: XML
+Topic :: Utilities
+
diff --git a/doc/freshmeat.trove.txt b/doc/freshmeat.trove.txt
new file mode 100644
index 0000000..b6cf1a4
--- /dev/null
+++ b/doc/freshmeat.trove.txt
@@ -0,0 +1,14 @@
+[fm #21421] (news-admins) [fmII/contact] Trove categories
+Date: Friday 1:12:51 am
+From: Patrick Lenz via RT <news-admins@freshmeat.net>
+To: rjones@ekit-inc.com
+
+rjones@ekit-inc.com wrote (Wed, Oct 23 2002 23:49:21):
+
+> I'd like to use your list of Trove categories (or discriminators in the
+> original Trove parlance). Do you have any objections to this? Are you the
+> original authors of the list, and if not, do you know who is?
+
+We originally started out with the trove category set SourceForge.net had. We
+both expanded that tree so we're not really in sync anymore. I don't have any
+objections wrt you re-using the list.
diff --git a/doc/naming.txt b/doc/naming.txt
new file mode 100644
index 0000000..78a330d
--- /dev/null
+++ b/doc/naming.txt
@@ -0,0 +1,83 @@
+Published on The O'Reilly Network (http://www.oreillynet.com/)
+ http://www.oreillynet.com/cs/user/wlg/2225
+
+
+On The Naming of Things
+
+ by Simon Cozens
+ Oct. 29, 2002
+
+
+
+As in certain cults it is possible to kill a process if you know its true
+name.
+
+
+-- Ken Thompson and Dennis M. Ritchie
+
+
+I've been thinking recently about what accounts for the CPAN's success;
+well, that's not quite true. I've been trying to work out what accounts for
+the Ruby Application Archive and Python's Vaults of Parnassus comparative
+failure.
+
+
+There are many reasons. First, there's a clear distinction in CPAN between
+libraries and applications; the RAA the Vaults don't have such a thing. But
+I've come to the conclusion that a major factor, and one which applies both
+to collections of software such as those we're looking at and the
+development world in general, is the way that libraries and aplications are
+named. (To be fair, Ruby is getting better at this and beginning to solve
+the problem the Perl way.)
+
+
+I'd like to give a couple of principles for naming software.
+
+Definitive names discourage wheel reinvention
+
+Perl's modules are generally given simple, definitive names. If I want an
+XML parser, I head for XML::Parser. It's that simple. (Of course, if it's
+not that simple, I head for XML::Simple which is.) If I want to write a
+module for parsing XML and I know that XML::Parser exists, I'm forced to
+choose a name which correctly denotes what sets my parser apart; I have to
+do something new, and hence I'm not reinventing the wheel.
+
+Descriptive names are best for libraries
+
+There's a temptation to make up cutesy names for software projects.
+However, when it comes to libraries, this is more of a hindrance than a
+help. When I see a module called XML::Parser I know exactly what it does.
+It doesn't require any more description. If, on the other hand, it had a
+cutesy name - Expat - I would have no idea. Similarly, good naming helps me
+quickly locate the library I need. If I'm writing C code to deal with
+Unicode, I'd look for a libunicode. And behold, there is indeed a
+libunicode which does what I want and I need look no further. That would
+not have been quite so easy if it had been called libgeoff. Cutesy acronyms
+don't help either - you might know that libgail is the GNOME Accessibility
+Implementation Library, but at first sight, that might have been called
+libgeoff too. Why not, say, libaccess, or libgaccess if you must have the g
+for GNOME.
+
+End-user projects can have non-descriptive names
+
+There is a place for cute naming, and that's in applications and other
+end-user projects; this is because there's more space for competition.
+You'd never get away with calling a web browser "webbrowser", so "Mozilla"
+is as good a name as any. However, if you're building that as a Perl
+module, then Web::Browser (or Tk::WebBrowser) would be just fine. This
+should remind you that some things that you think are applications can turn
+out to be libraries, and vice versa - consider spamassassin as an example.
+Thankfully, that has both a catchy and a descriptive name, so turns out to
+work very well as both a library and an end-user tool.
+
+
+Shamans have long known the value of the correct and definitive naming of
+things; programmers of libraries and modules would do well to rediscover
+it.
+
+
+Simon Cozens
+
+
+oreillynet.com Copyright © 2000 O'Reilly & Associates, Inc.
+
diff --git a/doc/pep.txt b/doc/pep.txt
new file mode 100644
index 0000000..c574745
--- /dev/null
+++ b/doc/pep.txt
@@ -0,0 +1,287 @@
+PEP: XXX
+Title: Distutils Enhancements
+Version: $Revision$
+Last-Modified: $Date$
+Author: Richard Jones <rjones@ekit-inc.com>
+Status: Draft
+Type: Standards Track
+Content-Type: text/x-rst
+Created: 24-Oct-2002
+Python-Version: 2.3
+Post-History:
+
+
+Abstract
+========
+
+This PEP proposes several extensions to the distutils packaging
+system [1]_. These enhancements include a central package index, tools
+for submitting package information to the index and extensions to the
+package metadata to include Trove [2]_ information.
+
+This PEP does not address either issues of package dependency, nor
+centralised storage of packages. Nor is it proposing a local
+database of packages as described in PEP 262 [6]_.
+
+Existing package repositories such as the Vaults of Parnassus [3]_,
+CPAN [4]_ and PAUSE [5]_ will be investigated as prior art in this
+field.
+
+
+Rationale
+=========
+
+Python programmers have long needed a simple method of discovering
+existing modules and systems available for their use. It is arguable
+that the existence of these systems for other languages have been a
+significant contribution to their popularity. The existence of the
+catalog-sig, and the many discussions there indicate that there is a
+large population of users who recognise this need.
+
+The introduction of the distutils packaging system to Python
+simplified the process of distributing shareable code, and included
+mechanisms for capture of package metadata, but did little with the
+metadata save ship it with the package.
+
+The server should be hosted in the python.org domain, giving it an air
+of legitimacy that existing catalog efforts do not have.
+
+The interface for submitting information to the catalog should be as
+simple as possible - hopefully just one command-line command for
+more regular users.
+
+Issues of package dependency are not addressed due to the complexity
+of such a system. The original PEP which proposed such a system was
+dropped as the author realised that platform packaging system (RPM,
+apt, etc) already handle dependencies, installation and removal.
+
+Issues of package dissemination (storage on a central server) are
+not addressed because they require assumptions about availability of
+storage and bandwidth that I am not in a position to make.
+
+
+Specification
+=============
+
+The specification takes three parts, the `web interface`_, the
+`distutils register command`_ and the `distutils trove
+categorisation`_.
+
+Web Interface
+-------------
+
+A web interface is implemented over a simple store. The interface is
+available through the python.org domain, either directly or as
+packages.python.org.
+
+The store has columns for all metadata fields. The (name, version)
+double is used as a uniqueness key. Additional submissions for an
+existing (name, version) will result in an *update* operation.
+
+The web interface implements the following commands/interfaces:
+
+**index**
+ Lists known packages, optionally filtered. An additional HTML page,
+ **search**, presents a form to the user which is used to customise
+ the index view. The index will include a browsing interface like
+ that presented in the Trove interface design section 4.3. The
+ results will be paginated, sorted alphabetically and only showing
+ the most recent version. Most recent version information will be
+ determined using the distutils LooseVersion class.
+**display**
+ Displays information about the package. All fields are displayed as
+ plain text. The "url" (or "home_page") field is hyperlinked.
+**submit**
+ Accepts a POST form submission of metadata about a package. The
+ "name" and "version" fields are mandatory, as they uniquely identify
+ an entry in the index. Submit will automatically determine whether
+ to create a new entry or updating an existing entry. The metadata
+ is checked for correctness where appropriate - specifically the
+ Trove discriminators are compared with the allowed set. An update will
+ update all information about the package based on the new submitted
+ information.
+
+ There will also be a submit/edit form that will allow manual submission
+ and updating for those who do not use distutils.
+**user**
+ Registers a new user with the index. Requires username, password and
+ email address. Passwords will be stored on the server as SHA hashes.
+ If the username already exists in the database:
+
+ 1. If valid HTTP Basic auth is provided, the password and email
+ address are updated with the submission information, or
+ 2. If no valid auth is provided, the user is informed that the login
+ is already taken.
+
+ Registration will be a three-step process, involving:
+
+ 1. User submission of details via the distutils *register* command,
+ 2. Package server sending email to the user's email address with a URL
+ to visit to confirm registration with a random one-time key, and
+ 3. User visits URL with the key and confirms registration.
+
+ Several user Roles will exist:
+
+ Admin
+ Can assign Owner Role - they decide who may submit for a given
+ package name.
+ Owner
+ Owns a package name, may assign Maintainer Role for that name
+ Maintainer
+ Can submit and update info for a particular package name
+
+**password_reset**
+ Using a supplied email address as the key, this resets a user's
+ password and send an email with the new password.
+
+The **submit** command will require HTTP Basic authentication,
+preferrably over an HTTPS connection.
+
+
+Distutils Register Command
+--------------------------
+
+An additional distutils command, "register" is implemented which
+posts the package metadata to the central server. The register command
+automatically handles user registration; the user is presented with
+three options:
+
+1. login and submit package information
+2. register as a new packager
+3. send password reminder email
+
+On UN*X systems, the user will be prompted at exit to save their
+username/password to a file in their home directory in the file
+``.pythonpackagerc``. A similar system could be used on Windows, I
+suppose.
+
+Notification of changes to a package entry will be sent to all users
+who have submitted information about the package. That is, the original
+submitter and any subsequent updaters.
+
+The register command will include a --verify option which performs a
+test submission to the server without actually committing the data.
+The server will perform its submission verification checks as usual
+and report any errors it would have reported during a normal
+submission. This is useful for verifying correctness of Trove
+discriminators.
+
+
+Distutils Trove Categorisation
+------------------------------
+
+The Trove concept of *discrimination* will be added to the metadata
+set available to package authors through the new attribute
+"classifiers". The list of classifiers will be available through the
+web, and added to the package like so::
+
+ setup(
+ name = "roundup",
+ version = __version__,
+ classifiers = [
+ 'Development Status :: 4 - Beta',
+ 'Environment :: Console (Text Based)',
+ 'Environment :: Web Environment',
+ 'Intended Audience :: End Users/Desktop',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: System Administrators',
+ 'License :: OSI Approved :: Python License',
+ 'Operating System :: MacOS X',
+ 'Operating System :: Microsoft :: Windows',
+ 'Operating System :: POSIX',
+ 'Programming Language :: Python',
+ 'Topic :: Communications :: Email',
+ 'Topic :: Office/Business',
+ 'Topic :: Software Development :: Bug Tracking',
+ ],
+ url = 'http://sourceforge.net/projects/roundup/',
+ ...
+ )
+
+It was decided that strings would be used for the classification
+entries due to the deep nesting that would be involved in a more
+formal Python structure.
+
+The original Trove specification that classification namespaces be
+separated by slashes ("/") unfortunately collides with many of the
+names having slashes in them (eg. "OS/2"). The double-colon solution
+(" :: ") implemented by Sourceforge and Freshmeat gets around this
+limitation.
+
+The list of classification values on the module index has been merged
+from Freshmeat and Sourceforge (with their permission). This list will
+be made available through the web interface as a text list which may
+then be copied to the ``setup.py`` file. The register command's
+``--verify`` option will also check classifiers values.
+
+
+Reference Implementation
+========================
+
+Reference code and demonstration server are available at
+
+ http://mechanicalcat.net:8081/
+
+===== ===================================================
+Done Feature
+===== ===================================================
+ Y Submission
+ Y Index
+ Y Display
+ Y Search
+ Y User rego
+ Y User verification
+ Y Password reset
+ Y Admin interfaces for user/package maintenance
+ N Trove
+===== ===================================================
+
+In the two days 22nd and 23rd October after the first announcement to
+the catalog-sig (22nd) and distutils-sig (23rd), the prototype had 45
+visitors (not including myself), two of whom used the register command
+to submit package information.
+
+
+References
+==========
+
+.. [1] distutils packaging system
+ (http://www.python.org/doc/current/lib/module-distutils.html)
+
+.. [2] Trove
+ (http://tuxedo.org/~esr/trove/)
+
+.. [3] Vaults of Parnassus
+ (http://www.vex.net/parnassus/)
+
+.. [4] CPAN
+ (http://www.cpan.org/)
+
+.. [5] PAUSE
+ (http://pause.cpan.org/)
+
+.. [6] PEP 262, A Database of Installed Python Packages
+ (http://www.python.org/peps/pep-0262.html)
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+Acknowledgements
+================
+
+Anthony Baxter for encouragement and feedback during initial drafting.
+
+The many participants of the distutils and catalog SIGs for their
+ideas over the years.
+
+
+..
+ Local Variables:
+ mode: indented-text
+ indent-tabs-mode: nil
+ sentence-end-double-space: t
+ fill-column: 70
+ End:
diff --git a/doc/rest.doc b/doc/rest.doc
new file mode 100644
index 0000000..b9d84f4
--- /dev/null
+++ b/doc/rest.doc
@@ -0,0 +1,639 @@
+PEP: 12
+Title: Sample reStructuredText PEP Template
+Version: $Revision$
+Last-Modified: $Date$
+Author: David Goodger <goodger@users.sourceforge.net>,
+ Barry A. Warsaw <barry@zope.com>
+Status: Active
+Type: Informational
+Content-Type: text/x-rst
+Created: 05-Aug-2002
+Post-History: 30-Aug-2002
+
+
+Abstract
+========
+
+This PEP provides a boilerplate or sample template for creating your
+own reStructuredText PEPs. In conjunction with the content guidelines
+in PEP 1 [1]_, this should make it easy for you to conform your own
+PEPs to the format outlined below.
+
+Note: if you are reading this PEP via the web, you should first grab
+the text (reStructuredText) source of this PEP in order to complete
+the steps below. **DO NOT USE THE HTML FILE AS YOUR TEMPLATE!**
+
+To get the source of this (or any) PEP, look at the top of the HTML
+page and click on the link titled "PEP Source".
+
+If you would prefer not to use markup in your PEP, please see PEP 9,
+"Sample Plaintext PEP Template" [2]_.
+
+
+Rationale
+=========
+
+PEP submissions come in a wide variety of forms, not all adhering
+to the format guidelines set forth below. Use this template, in
+conjunction with the format guidelines below, to ensure that your
+PEP submission won't get automatically rejected because of form.
+
+ReStructuredText is offered as an alternative to plaintext PEPs, to
+allow PEP authors more functionality and expressivity, while
+maintaining easy readability in the source text. The processed HTML
+form makes the functionality accessible to readers: live hyperlinks,
+styled text, tables, images, and automatic tables of contents, among
+other advantages. For an example of a PEP marked up with
+reStructuredText, see PEP 287.
+
+
+How to Use This Template
+========================
+
+To use this template you must first decide whether your PEP is going
+to be an Informational or Standards Track PEP. Most PEPs are
+Standards Track because they propose a new feature for the Python
+language or standard library. When in doubt, read PEP 1 for details
+or contact the PEP editors <peps@python.org>.
+
+Once you've decided which type of PEP yours is going to be, follow the
+directions below.
+
+- Make a copy of this file (``.txt`` file, **not** HTML!) and perform
+ the following edits.
+
+- Replace the "PEP: 9" header with "PEP: XXX" since you don't yet have
+ a PEP number assignment.
+
+- Change the Title header to the title of your PEP.
+
+- Leave the Version and Last-Modified headers alone; we'll take care
+ of those when we check your PEP into CVS.
+
+- Change the Author header to include your name, and optionally your
+ email address. Be sure to follow the format carefully: your name
+ must appear first, and it must not be contained in parentheses.
+ Your email address may appear second (or it can be omitted) and if
+ it appears, it must appear in angle brackets. It is okay to
+ obfuscate your email address.
+
+- If there is a mailing list for discussion of your new feature, add a
+ Discussions-To header right after the Author header. You should not
+ add a Discussions-To header if the mailing list to be used is either
+ python-list@python.org or python-dev@python.org, or if discussions
+ should be sent to you directly. Most Informational PEPs don't have
+ a Discussions-To header.
+
+- Change the Status header to "Draft".
+
+- For Standards Track PEPs, change the Type header to "Standards
+ Track".
+
+- For Informational PEPs, change the Type header to "Informational".
+
+- For Standards Track PEPs, if your feature depends on the acceptance
+ of some other currently in-development PEP, add a Requires header
+ right after the Type header. The value should be the PEP number of
+ the PEP yours depends on. Don't add this header if your dependent
+ feature is described in a Final PEP.
+
+- Change the Created header to today's date. Be sure to follow the
+ format carefully: it must be in ``dd-mmm-yyyy`` format, where the
+ ``mmm`` is the 3 English letter month abbreviation, i.e. one of Jan,
+ Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec.
+
+- For Standards Track PEPs, after the Created header, add a
+ Python-Version header and set the value to the next planned version
+ of Python, i.e. the one your new feature will hopefully make its
+ first appearance in. Do not use an alpha or beta release
+ designation here. Thus, if the last version of Python was 2.2 alpha
+ 1 and you're hoping to get your new feature into Python 2.2, set the
+ header to::
+
+ Python-Version: 2.2
+
+- Leave Post-History alone for now; you'll add dates to this header
+ each time you post your PEP to python-list@python.org or
+ python-dev@python.org. If you posted your PEP to the lists on
+ August 14, 2001 and September 3, 2001, the Post-History header would
+ look like::
+
+ Post-History: 14-Aug-2001, 03-Sept-2001
+
+ You must manually add new dates and check them in. If you don't
+ have check-in privileges, send your changes to the PEP editors.
+
+- Add a Replaces header if your PEP obsoletes an earlier PEP. The
+ value of this header is the number of the PEP that your new PEP is
+ replacing. Only add this header if the older PEP is in "final"
+ form, i.e. is either Accepted, Final, or Rejected. You aren't
+ replacing an older open PEP if you're submitting a competing idea.
+
+- Now write your Abstract, Rationale, and other content for your PEP,
+ replacing all this gobbledygook with your own text. Be sure to
+ adhere to the format guidelines below, specifically on the
+ prohibition of tab characters and the indentation requirements.
+
+- Update your References and Copyright section. Usually you'll place
+ your PEP into the public domain, in which case just leave the
+ Copyright section alone. Alternatively, you can use the `Open
+ Publication License`__, but public domain is still strongly
+ preferred.
+
+ __ http://www.opencontent.org/openpub/
+
+- Leave the Emacs stanza at the end of this file alone, including the
+ formfeed character ("^L", or ``\f``).
+
+- Send your PEP submission to the PEP editors at peps@python.org.
+
+
+ReStructuredText PEP Formatting Requirements
+============================================
+
+The following is a PEP-specific summary of reStructuredText syntax.
+For the sake of simplicity and brevity, much detail is omitted. For
+more detail, see `Resources`_ below. `Literal blocks`_ (in which no
+markup processing is done) are used for examples throughout, to
+illustrate the plaintext markup.
+
+
+General
+-------
+
+You must adhere to the Emacs convention of adding two spaces at the
+end of every sentence. You should fill your paragraphs to column 70,
+but under no circumstances should your lines extend past column 79.
+If your code samples spill over column 79, you should rewrite them.
+
+Tab characters must never appear in the document at all. A PEP should
+include the standard Emacs stanza included by example at the bottom of
+this PEP.
+
+
+Section Headings
+----------------
+
+PEP headings must begin in column zero and the initial letter of each
+word must be capitalized as in book titles. Acronyms should be in all
+capitals. Section titles must be adorned with an underline, a single
+repeated punctuation character, which begins in column zero and must
+extend at least as far as the right edge of the title text (4
+characters minimum). First-level section titles are underlined with
+"=" (equals signs), second-level section titles with "-" (hyphens),
+and third-level section titles with "'" (single quotes or
+apostrophes). For example::
+
+ First-Level Title
+ =================
+
+ Second-Level Title
+ ------------------
+
+ Third-Level Title
+ '''''''''''''''''
+
+If there are more than three levels of sections in your PEP, you may
+insert overline/underline-adorned titles for the first and second
+levels as follows::
+
+ ============================
+ First-Level Title (optional)
+ ============================
+
+ -----------------------------
+ Second-Level Title (optional)
+ -----------------------------
+
+ Third-Level Title
+ =================
+
+ Fourth-Level Title
+ ------------------
+
+ Fifth-Level Title
+ '''''''''''''''''
+
+You shouldn't have more than five levels of sections in your PEP. If
+you do, you should consider rewriting it.
+
+You must use two blank lines between the last line of a section's body
+and the next section heading. If a subsection heading immediately
+follows a section heading, a single blank line in-between is
+sufficient.
+
+The body of each section is not normally indented, although some
+constructs do use indentation, as described below. Blank lines are
+used to separate constructs.
+
+
+Paragraphs
+----------
+
+Paragraphs are left-aligned text blocks separated by blank lines.
+Paragraphs are not indented unless they are part of an indented
+construct (such as a block quote or a list item).
+
+
+Inline Markup
+-------------
+
+Portions of text within paragraphs and other text blocks may be
+styled. For example::
+
+ Text may be marked as *emphasized* (single asterisk markup,
+ typically shown in italics) or **strongly emphasized** (double
+ asterisks, typically boldface). ``Inline literals`` (using double
+ backquotes) are typically rendered in a monospaced typeface. No
+ further markup recognition is done within the double backquotes,
+ so they're safe for any kind of code snippets.
+
+
+Block Quotes
+------------
+
+Block quotes consist of indented body elements. For example::
+
+ This is a paragraph.
+
+ This is a block quote.
+
+ A block quote may contain many paragraphs.
+
+Block quotes are used to quote extended passages from other sources.
+Block quotes may be nested inside other body elements. Use 4 spaces
+per indent level.
+
+
+Literal Blocks
+--------------
+
+..
+ In the text below, double backquotes are used to denote inline
+ literals. "``::``" is written so that the colons will appear in a
+ monospaced font; the backquotes (``) are markup, not part of the
+ text. See "Inline Markup" above.
+
+ By the way, this is a comment, described in "Comments" below.
+
+Literal blocks are used for code samples or preformatted ASCII art. To
+indicate a literal block, preface the indented text block with
+"``::``" (two colons). The literal block continues until the end of
+the indentation. Indent the text block by 4 spaces. For example::
+
+ This is a typical paragraph. A literal block follows.
+
+ ::
+
+ for a in [5,4,3,2,1]: # this is program code, shown as-is
+ print a
+ print "it's..."
+ # a literal block continues until the indentation ends
+
+The paragraph containing only "``::``" will be completely removed from
+the output; no empty paragraph will remain. "``::``" is also
+recognized at the end of any paragraph. If immediately preceded by
+whitespace, both colons will be removed from the output. When text
+immediately precedes the "``::``", *one* colon will be removed from
+the output, leaving only one colon visible (i.e., "``::``" will be
+replaced by "``:``"). For example, one colon will remain visible
+here::
+
+ Paragraph::
+
+ Literal block
+
+
+Lists
+-----
+
+Bullet list items begin with one of "-", "*", or "+" (hyphen,
+asterisk, or plus sign), followed by whitespace and the list item
+body. List item bodies must be left-aligned and indented relative to
+the bullet; the text immediately after the bullet determines the
+indentation. For example::
+
+ This paragraph is followed by a list.
+
+ * This is the first bullet list item. The blank line above the
+ first list item is required; blank lines between list items
+ (such as below this paragraph) are optional.
+
+ * This is the first paragraph in the second item in the list.
+
+ This is the second paragraph in the second item in the list.
+ The blank line above this paragraph is required. The left edge
+ of this paragraph lines up with the paragraph above, both
+ indented relative to the bullet.
+
+ - This is a sublist. The bullet lines up with the left edge of
+ the text blocks above. A sublist is a new list so requires a
+ blank line above and below.
+
+ * This is the third item of the main list.
+
+ This paragraph is not part of the list.
+
+Enumerated (numbered) list items are similar, but use an enumerator
+instead of a bullet. Enumerators are numbers (1, 2, 3, ...), letters
+(A, B, C, ...; uppercase or lowercase), or Roman numerals (i, ii, iii,
+iv, ...; uppercase or lowercase), formatted with a period suffix
+("1.", "2."), parentheses ("(1)", "(2)"), or a right-parenthesis
+suffix ("1)", "2)"). For example::
+
+ 1. As with bullet list items, the left edge of paragraphs must
+ align.
+
+ 2. Each list item may contain multiple paragraphs, sublists, etc.
+
+ This is the second paragraph of the second list item.
+
+ a) Enumerated lists may be nested.
+ b) Blank lines may be omitted between list items.
+
+Definition lists are written like this::
+
+ what
+ Definition lists associate a term with a definition.
+
+ how
+ The term is a one-line phrase, and the definition is one
+ or more paragraphs or body elements, indented relative to
+ the term.
+
+
+Tables
+------
+
+Simple tables are easy and compact::
+
+ ===== ===== =======
+ A B A and B
+ ===== ===== =======
+ False False False
+ True False False
+ False True False
+ True True True
+ ===== ===== =======
+
+There must be at least two columns in a table (to differentiate from
+section titles). Column spans use underlines of hyphens ("Inputs"
+spans the first two columns)::
+
+ ===== ===== ======
+ Inputs Output
+ ------------ ------
+ A B A or B
+ ===== ===== ======
+ False False False
+ True False True
+ False True True
+ True True True
+ ===== ===== ======
+
+Text in a first-column cell starts a new row. No text in the first
+column indicates a continuation line; the rest of the cells may
+consist of multiple lines. For example::
+
+ ===== =========================
+ col 1 col 2
+ ===== =========================
+ 1 Second column of row 1.
+ 2 Second column of row 2.
+ Second line of paragraph.
+ 3 - Second column of row 3.
+
+ - Second item in bullet
+ list (row 3, column 2).
+ ===== =========================
+
+
+Hyperlinks
+----------
+
+When referencing an external web page in the body of a PEP, you should
+include the title of the page in the text, with either an inline
+hyperlink reference to the URL or a footnote reference (see
+`Footnotes`_ below). Do not include the URL in the body text of the
+PEP.
+
+Hyperlink references use backquotes and a trailing underscore to mark
+up the reference text; backquotes are optional if the reference text
+is a single word. For example::
+
+ In this paragraph, we refer to the `Python web site`_.
+
+An explicit target provides the URL. Put targets in a References
+section at the end of the PEP, or immediately after the reference.
+Hyperlink targets begin with two periods and a space (the "explicit
+markup start"), followed by a leading underscore, the reference text,
+a colon, and the URL (absolute or relative)::
+
+ .. _Python web site: http://www.python.org/
+
+The reference text and the target text must match (although the match
+is case-insensitive and ignores differences in whitespace). Note that
+the underscore trails the reference text but precedes the target text.
+If you think of the underscore as a right-pointing arrow, it points
+*away* from the reference and *toward* the target.
+
+The same mechanism can be used for internal references. Every unique
+section title implicitly defines an internal hyperlink target. We can
+make a link to the Abstract section like this::
+
+ Here is a hyperlink reference to the `Abstract`_ section. The
+ backquotes are optional since the reference text is a single word;
+ we can also just write: Abstract_.
+
+Footnotes containing the URLs from external targets will be generated
+automatically at the end of the References section of the PEP, along
+with footnote references linking the reference text to the footnotes.
+
+Text of the form "PEP x" or "RFC x" (where "x" is a number) will be
+linked automatically to the appropriate URLs.
+
+
+Footnotes
+---------
+
+Footnote references consist of a left square bracket, a number, a
+right square bracket, and a trailing underscore::
+
+ This sentence ends with a footnote reference [1]_.
+
+Whitespace must precede the footnote reference. Leave a space between
+the footnote reference and the preceding word.
+
+When referring to another PEP, include the PEP number in the body
+text, such as "PEP 1". The title may optionally appear. Add a
+footnote reference following the title. For example::
+
+ Refer to PEP 1 [2]_ for more information.
+
+Add a footnote that includes the PEP's title and author. It may
+optionally include the explicit URL on a separate line, but only in
+the References section. Footnotes begin with ".. " (the explicit
+markup start), followed by the footnote marker (no underscores),
+followed by the footnote body. For example::
+
+ References
+ ==========
+
+ .. [2] PEP 1, "PEP Purpose and Guidelines", Warsaw, Hylton
+ (http://www.python.org/peps/pep-0001.html)
+
+If you decide to provide an explicit URL for a PEP, please use this as
+the URL template::
+
+ http://www.python.org/peps/pep-xxxx.html
+
+PEP numbers in URLs must be padded with zeros from the left, so as to
+be exactly 4 characters wide, however PEP numbers in the text are
+never padded.
+
+During the course of developing your PEP, you may have to add, remove,
+and rearrange footnote references, possibly resulting in mismatched
+references, obsolete footnotes, and confusion. Auto-numbered
+footnotes allow more freedom. Instead of a number, use a label of the
+form "#word", where "word" is a mnemonic consisting of alphanumerics
+plus internal hyphens, underscores, and periods (no whitespace or
+other characters are allowed). For example::
+
+ Refer to PEP 1 [#PEP-1]_ for more information.
+
+ References
+ ==========
+
+ .. [#PEP-1] PEP 1, "PEP Purpose and Guidelines", Warsaw, Hylton
+
+ http://www.python.org/peps/pep-0001.html
+
+Footnotes and footnote references will be numbered automatically, and
+the numbers will always match. Once a PEP is finalized, auto-numbered
+labels should be replaced by numbers for simplicity.
+
+
+Images
+------
+
+If your PEP contains a diagram, you may include it in the processed
+output using the "image" directive::
+
+ .. image:: diagram.png
+
+Any browser-friendly graphics format is possible: .png, .jpeg, .gif,
+.tiff, etc.
+
+Since this image will not be visible to readers of the PEP in source
+text form, you should consider including a description or ASCII art
+alternative, using a comment (below).
+
+
+Comments
+--------
+
+A comment block is an indented block of arbitrary text immediately
+following an explicit markup start: two periods and whitespace. Leave
+the ".." on a line by itself to ensure that the comment is not
+misinterpreted as another explicit markup construct. Comments are not
+visible in the processed document. For the benefit of those reading
+your PEP in source form, please consider including a descriptions of
+or ASCII art alternatives to any images you include. For example::
+
+ .. image:: dataflow.png
+
+ ..
+ Data flows from the input module, through the "black box"
+ module, and finally into (and through) the output module.
+
+The Emacs stanza at the bottom of this document is inside a comment.
+
+
+Escaping Mechanism
+------------------
+
+reStructuredText uses backslashes ("``\``") to override the special
+meaning given to markup characters and get the literal characters
+themselves. To get a literal backslash, use an escaped backslash
+("``\\``"). There are two contexts in which backslashes have no
+special meaning: `literal blocks`_ and inline literals (see `Inline
+Markup`_ above). In these contexts, no markup recognition is done,
+and a single backslash represents a literal backslash, without having
+to double up.
+
+If you find that you need to use a backslash in your text, consider
+using inline literals or a literal block instead.
+
+
+Habits to Avoid
+===============
+
+Many programmers who are familiar with TeX often write quotation marks
+like this::
+
+ `single-quoted' or ``double-quoted''
+
+Backquotes are significant in reStructuredText, so this practice
+should be avoided. For ordinary text, use ordinary 'single-quotes' or
+"double-quotes". For inline literal text (see `Inline Markup`_
+above), use double-backquotes::
+
+ ``literal text: in here, anything goes!``
+
+
+Resources
+=========
+
+Many other constructs and variations are possible. For more details
+about the reStructuredText markup, in increasing order of
+thoroughness, please see:
+
+* `A ReStructuredText Primer`__, a gentle introduction.
+
+ __ http://docutils.sourceforge.net/docs/rst/quickstart.html
+
+* `Quick reStructuredText`__, a users' quick reference.
+
+ __ http://docutils.sourceforge.net/docs/rst/quickref.html
+
+* `reStructuredText Markup Specification`__, the final authority.
+
+ __ http://docutils.sourceforge.net/spec/rst/reStructuredText.html
+
+The processing of reStructuredText PEPs is done using Docutils_. If
+you have a question or require assistance with reStructuredText or
+Docutils, please `post a message`_ to the `Docutils-Users mailing
+list`_. The `Docutils project web site`_ has more information.
+
+.. _Docutils: http://docutils.sourceforge.net/
+.. _post a message:
+ mailto:docutils-users@lists.sourceforge.net?subject=PEPs
+.. _Docutils-Users mailing list:
+ http://lists.sourceforge.net/lists/listinfo/docutils-users
+.. _Docutils project web site: http://docutils.sourceforge.net/
+
+
+References
+==========
+
+.. [1] PEP 1, PEP Purpose and Guidelines, Warsaw, Hylton
+ (http://www.python.org/peps/pep-0001.html)
+
+.. [2] PEP 9, Sample Plaintext PEP Template, Warsaw
+ (http://www.python.org/peps/pep-0009.html)
+
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+
+..
+ Local Variables:
+ mode: indented-text
+ indent-tabs-mode: nil
+ sentence-end-double-space: t
+ fill-column: 70
+ End:
diff --git a/doc/sourceforge.trove.discriminators.txt b/doc/sourceforge.trove.discriminators.txt
new file mode 100644
index 0000000..092c6d6
--- /dev/null
+++ b/doc/sourceforge.trove.discriminators.txt
@@ -0,0 +1,386 @@
+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 Independent
+Operating System :: OS/2
+Operating System :: Other OS
+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 :: PalmOS
+
+Environment :: Cocoa (MacOS X)
+Environment :: Console (Text Based)
+Environment :: Console (Text Based) :: Curses
+Environment :: Console (Text Based) :: Newt
+Environment :: Handhelds/PDA's
+Environment :: No Input/Output (Daemon)
+Environment :: Other Environment
+Environment :: Web Environment
+Environment :: Win32 (MS Windows)
+Environment :: X11 Applications
+Environment :: X11 Applications :: Gnome
+Environment :: X11 Applications :: KDE
+
+Programming Language :: APL
+Programming Language :: ASP
+Programming Language :: Ada
+Programming Language :: Assembly
+Programming Language :: Assembly
+Programming Language :: C
+Programming Language :: C#
+Programming Language :: C++
+Programming Language :: Cold Fusion
+Programming Language :: Delphi/Kylix
+Programming Language :: Eiffel
+Programming Language :: Erlang
+Programming Language :: Euler
+Programming Language :: Euphoria
+Programming Language :: Forth
+Programming Language :: Fortran
+Programming Language :: Java
+Programming Language :: JavaScript
+Programming Language :: Lisp
+Programming Language :: Logo
+Programming Language :: ML
+Programming Language :: Modula
+Programming Language :: Object Pascal
+Programming Language :: Objective C
+Programming Language :: PHP
+Programming Language :: PL/SQL
+Programming Language :: PROGRESS
+Programming Language :: Pascal
+Programming Language :: Perl
+Programming Language :: Pike
+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 :: Tcl
+Programming Language :: Unix Shell
+Programming Language :: Visual Basic
+Programming Language :: XBasic
+Programming Language :: Zope
+
+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 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 :: Zope Public License
+License :: OSI Approved :: zlib/libpng License
+License :: Other/Proprietary License
+License :: Public Domain
+
+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
+
+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
+
+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
+
+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 :: Email Clients (MUA)
+Topic :: Communications :: Email :: Filters
+Topic :: Communications :: Email :: Mail Transport Agents
+Topic :: Communications :: Email :: Mailing List Servers
+Topic :: Communications :: Email :: Post-Office
+Topic :: Communications :: Email :: Post-Office :: IMAP
+Topic :: Communications :: Email :: Post-Office :: POP3
+Topic :: Communications :: FIDO
+Topic :: Communications :: Fax
+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 :: Gnome
+Topic :: Desktop Environment :: K Desktop Environment (KDE)
+Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes
+Topic :: Desktop Environment :: Screen Savers
+Topic :: Desktop Environment :: Window Managers
+Topic :: Desktop Environment :: Window Managers :: Enlightenment
+Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes
+Topic :: Education
+Topic :: Education :: Computer Aided Instruction (CAI)
+Topic :: Education :: Testing
+Topic :: Games/Entertainment
+Topic :: Games/Entertainment :: Board Games
+Topic :: Games/Entertainment :: First Person Shooters
+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 :: Internet
+Topic :: Internet :: File Transfer Protocol (FTP)
+Topic :: Internet :: Finger
+Topic :: Internet :: Log Analysis
+Topic :: Internet :: Name Service (DNS)
+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 :: 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 :: 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 :: CD Audio
+Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing
+Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping
+Topic :: Multimedia :: Sound/Audio :: Capture/Recording
+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 :: 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 :: 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 :: Build Tools
+Topic :: Software Development :: Code Generators
+Topic :: Software Development :: Compilers
+Topic :: Software Development :: Debuggers
+Topic :: Software Development :: Interpreters
+Topic :: Software Development :: Object Brokering
+Topic :: Software Development :: Object Brokering :: CORBA
+Topic :: Software Development :: Version Control
+Topic :: Software Development :: Version Control :: CVS
+Topic :: Software Development :: Version Control :: RCS
+Topic :: Software Development :: Version Control :: SCCS
+Topic :: System
+Topic :: System :: Archiving
+Topic :: System :: Archiving :: Backup
+Topic :: System :: Archiving :: Compression
+Topic :: System :: Archiving :: Packaging
+Topic :: System :: Benchmark
+Topic :: System :: Boot
+Topic :: System :: Boot :: Init
+Topic :: System :: Clustering
+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 :: Networking
+Topic :: System :: Networking :: Firewalls
+Topic :: System :: Networking :: Monitoring
+Topic :: System :: Networking :: Monitoring :: Hardware Watchdog
+Topic :: System :: Operating System Kernels
+Topic :: System :: Operating System Kernels :: BSD
+Topic :: System :: Operating System Kernels :: GNU Hurd
+Topic :: System :: Operating System Kernels :: Linux
+Topic :: System :: Power (UPS)
+Topic :: System :: Software Distribution
+Topic :: System :: System Shells
+Topic :: System :: Systems Administration
+Topic :: System :: Systems Administration :: Authentication/Directory
+Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP
+Topic :: System :: Systems Administration :: Authentication/Directory :: NIS
+Topic :: Terminals
+Topic :: Terminals :: Serial
+Topic :: Terminals :: Telnet
+Topic :: Terminals :: Terminal Emulators/X Terminals
+Topic :: Text Editors
+Topic :: Text Editors :: Documentation
+Topic :: Text Editors :: Emacs
+Topic :: Text Editors :: Integrated Development Environments (IDE)
+Topic :: Text Editors :: Text Processing
+Topic :: Text Editors :: Word Processors
+
diff --git a/doc/sourceforge.trove.txt b/doc/sourceforge.trove.txt
new file mode 100644
index 0000000..605b2a0
--- /dev/null
+++ b/doc/sourceforge.trove.txt
@@ -0,0 +1,29 @@
+Re: Trove stuff from sf.net
+Date: Today 1:13:53 pm
+From: Patrick McGovern <pmcgovern@vasoftware.com>
+To: Richard Jones <rjones@ekit-inc.com>
+
+Thank you for the clarification.
+
+It's not clear to me if our trove categorization is Open Source or not. It's
+something I would have to ponder with our Legal folks here....
+
+Regardless, for your application I'm granting you the right to use the Trove
+info.
+
+Pat-
+
+On Tue, Oct 29, 2002 at 01:02:46PM +1100, Richard Jones wrote:
+> Hiya, regarding alexandria-Support Requests-628367, I'd like to use the Trove
+> info in setting up a python modules index at python.org. The set from your
+> site will be made available to python programmers to classify their modules.
+> That's it in a nutshell. Because it's a one-off application, it's unlikely
+> that the source will be released - but if necessary it can.
+>
+>
+> Richard
+>
+
+--
+Patrick McGovern
+Director, SourceForge.net pmcgovern@vasoftware.com
diff --git a/pypi.cgi b/pypi.cgi
new file mode 100755
index 0000000..71309b4
--- /dev/null
+++ b/pypi.cgi
@@ -0,0 +1,65 @@
+#!/usr/bin/env python2
+#
+# $Id$
+
+import sys, os, cgi, StringIO, traceback
+
+#
+# Provide interface to CGI HTTP response handling
+#
+class RequestWrapper:
+ '''Used to make the CGI server look like a BaseHTTPRequestHandler
+ '''
+ def __init__(self, config, wfile):
+ self.wfile = wfile
+ self.config = config
+ def send_response(self, code):
+ self.wfile.write('Status: %s\r\n'%code)
+ def send_header(self, keyword, value):
+ self.wfile.write("%s: %s\r\n" % (keyword, value))
+ def end_headers(self):
+ self.wfile.write("\r\n")
+
+#
+# Main CGI handler
+#
+def main(request):
+ handler = WebUI(request, os.environ)
+ try:
+ handler.run()
+ except Unauthorised:
+ request.send_response(403)
+ request.send_header('Content-Type', 'text/html')
+ request.end_headers()
+ request.wfile.write('Unauthorised')
+ except NotFound:
+ request.send_response(404)
+ request.send_header('Content-Type', 'text/html')
+ request.end_headers()
+ request.wfile.write('Not found: %s'%client.path)
+
+#
+# Now do the actual CGI handling
+#
+out, err = sys.stdout, sys.stderr
+try:
+ sys.path.insert(0, '/home/rjones/src/distutils_rego')
+ from webui import WebUI
+ import config
+ cfg = config.Config('/home/rjones/src/distutils_rego/config.ini', 'webui')
+ request = RequestWrapper(cfg, out)
+ # force input/output to binary (important for file up/downloads)
+ main(request)
+except SystemExit:
+ pass
+except:
+ out.write('Status: 400\nContent-Type: text/html\n\n')
+ out.write("<pre>")
+ s = StringIO.StringIO()
+ traceback.print_exc(None, s)
+ out.write(cgi.escape(s.getvalue()))
+ out.write("</pre>\n")
+
+sys.stdout.flush()
+
+# vim: set filetype=python ts=4 sw=4 et si
diff --git a/register.py b/register.py
new file mode 100644
index 0000000..eb58037
--- /dev/null
+++ b/register.py
@@ -0,0 +1,227 @@
+"""distutils.command.register
+
+Implements the Distutils 'register' command (register with the repository).
+"""
+
+# created 2002/10/21, Richard Jones
+
+__revision__ = "$Id$"
+
+import sys, os, string, urllib2, getpass, urlparse
+import StringIO, ConfigParser
+
+from distutils.core import Command
+from distutils.errors import *
+
+class register(Command):
+
+ description = "register the distribution with the repository"
+
+ DEFAULT_REPOSITORY = 'http://localhost/cgi-bin/package_server.cgi'
+
+ user_options = [
+ ('repository=', 'r',
+ "url of repository [default: %s]"%DEFAULT_REPOSITORY),
+ ]
+
+ def initialize_options(self):
+ self.repository = None
+
+ def finalize_options(self):
+ if self.repository is None:
+ self.repository = self.DEFAULT_REPOSITORY
+
+ def run(self):
+ self.check_metadata()
+ self.send_metadata()
+
+ def check_metadata(self):
+ """Ensure that all required elements of meta-data (name, version,
+ URL, (author and author_email) or (maintainer and
+ maintainer_email)) are supplied by the Distribution object; warn if
+ any are missing.
+ """
+ metadata = self.distribution.metadata
+
+ missing = []
+ for attr in ('name', 'version', 'url'):
+ if not (hasattr(metadata, attr) and getattr(metadata, attr)):
+ missing.append(attr)
+
+ if missing:
+ self.warn("missing required meta-data: " +
+ string.join(missing, ", "))
+
+ if metadata.author:
+ if not metadata.author_email:
+ self.warn("missing meta-data: if 'author' supplied, " +
+ "'author_email' must be supplied too")
+ elif metadata.maintainer:
+ if not metadata.maintainer_email:
+ self.warn("missing meta-data: if 'maintainer' supplied, " +
+ "'maintainer_email' must be supplied too")
+ else:
+ self.warn("missing meta-data: either (author and author_email) " +
+ "or (maintainer and maintainer_email) " +
+ "must be supplied")
+
+ def send_metadata(self):
+ ''' Send the metadata to the package index server.
+
+ Well, do the following:
+ 1. figure who the user is, and then
+ 2. send the data as a Basic auth'ed POST.
+
+ First we try to read the username/password from
+ $HOME/.pythonpackagerc, which is a ConfigParser-formatted
+ file with a section [server-login] containing username and
+ password entries (both in clear text). Eg:
+
+ [server-login]
+ username: fred
+ password: sekrit
+
+ Otherwise, to figure who the user is, we offer the user three
+ choices:
+
+ 1. use existing login,
+ 2. register as a new user, or
+ 3. set the password to a random string and email the user.
+
+ '''
+ choice = 'x'
+ username = password = ''
+
+ # see if we can short-cut and get the username/password from the
+ # config
+ if os.environ.has_key('HOME'):
+ rc = os.path.join(os.environ['HOME'], '.pythonpackagerc')
+ if os.path.exists(rc):
+ config = ConfigParser.ConfigParser()
+ config.read(rc)
+ username = config.get('server-login', 'username')
+ password = config.get('server-login', 'password')
+ choice = '1'
+
+ # get the user's login info
+ while choice not in '1234':
+ print '''We need to know who you are, so please choose either:
+ 1. use your existing login,
+ 2. register as a new user,
+ 3. have the server generate a new password for you (and email it to you), or
+ 4. quit
+Your selection [default 1]: ''',
+ choice = raw_input()
+ if choice not in '1234':
+ print 'Please choose one of the four options!'
+
+ if choice == '1':
+ # get the username and password
+ while not username:
+ username = raw_input('Username: ')
+ while not password:
+ password = getpass.getpass('Password: ')
+
+ # set up the authentication
+ auth = urllib2.HTTPPasswordMgr()
+ host = urlparse.urlparse(self.repository)[1]
+ auth.add_password('python packages index', host,
+ username, password)
+
+ # figure the data to send - the metadata plus some additional
+ # information used by the package server
+ meta = self.distribution.metadata
+ data = {
+ ':action': 'submit',
+ 'metadata-version' : '1.0',
+ 'name': meta.get_name(),
+ 'version': meta.get_version(),
+ 'summary': meta.get_description(),
+ 'home-page': meta.get_url(),
+ 'author': meta.get_contact(),
+ 'author-email': meta.get_contact_email(),
+ 'license': meta.get_licence(),
+ 'description': meta.get_long_description(),
+ 'keywords': meta.get_keywords(),
+ 'platform': meta.get_platforms(),
+ }
+
+ # send the info to the server and report the result
+ (code, result) = self.post_to_server(data, auth)
+ print 'Server response: %s'%result
+ elif choice == '2':
+ data = {':action': 'user'}
+ data['name'] = data['password'] = data['email'] = ''
+ data['confirm'] = None
+ while not data['name']:
+ data['name'] = raw_input('Username: ')
+ while data['password'] != data['confirm']:
+ while not data['password']:
+ data['password'] = getpass.getpass('Password: ')
+ while not data['confirm']:
+ data['confirm'] = getpass.getpass(' Confirm: ')
+ if data['password'] != data['confirm']:
+ data['password'] = ''
+ data['confirm'] = None
+ print "Password and confirm don't match!"
+ while not data['email']:
+ data['email'] = raw_input(' EMail: ')
+ (code, result) = self.post_to_server(data)
+ if result != 'Registration OK':
+ print 'Server response: %s'%result
+ else:
+ print 'You will receive an email shortly.'
+ print 'Follow the instructions in it to complete registration.'
+ elif choice == '3':
+ data = {':action': 'password_reset'}
+ data['email'] = ''
+ while not data['email']:
+ data['email'] = raw_input('Your email address: ')
+ (code, result) = self.post_to_server(data)
+ print 'Server response: %s'%result
+
+ def post_to_server(self, data, auth=None):
+ ''' Post a query to the server, and return a string response.
+ '''
+ # Build up the MIME payload for the urllib2 POST
+ boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+ sep_boundary = '\n--' + boundary
+ end_boundary = sep_boundary + '--'
+
+ # MIME encode the POST data
+ body = StringIO.StringIO()
+ for key, value in data.items():
+ # handle multiple entries for the same name
+ if type(value) != type([]):
+ value = [value]
+ for value in value:
+ body.write(sep_boundary)
+ body.write('\nContent-Disposition: form-data; name="%s"'%key)
+ body.write("\n\n")
+ body.write(str(value))
+ if value and value[-1] == '\r':
+ body.write('\n') # write an extra newline (lurve Macs)
+ body.write(end_boundary)
+ body.write("\n")
+ body = body.getvalue()
+
+ # build the Request
+ headers = {
+ 'Content-type': 'multipart/form-data; boundary=%s'%boundary,
+ 'Content-length': str(len(body))
+ }
+ req = urllib2.Request(self.repository, body, headers)
+
+ # handle HTTP and include the Basic Auth handler
+ opener = urllib2.build_opener(
+ urllib2.HTTPBasicAuthHandler(password_mgr=auth)
+ )
+ try:
+ result = opener.open(req)
+ except urllib2.HTTPError, e:
+ return (e.code, e.fp.read())
+ except urllib2.URLError, e:
+ return (None, str(e))
+
+ return (200, result.read())
+
diff --git a/webui.py b/webui.py
new file mode 100644
index 0000000..2c767e8
--- /dev/null
+++ b/webui.py
@@ -0,0 +1,573 @@
+
+import sys, os, urllib, StringIO, traceback, cgi, binascii, getopt
+import time, whrandom, smtplib, base64, sha
+
+import store, config
+
+class NotFound(Exception):
+ pass
+class Unauthorised(Exception):
+ pass
+class Redirect(Exception):
+ pass
+class FormError(Exception):
+ pass
+
+rego_message = '''Subject: Complete your registration
+To: %(email)s
+
+To complete your registration of the user "%(name)s" with the python module
+index, please visit the following URL:
+
+ %(url)s?:action=user&otk=%(otk)s
+
+'''
+
+password_message = '''Subject: Password has been reset
+To: %(email)s
+
+Your login is: %(name)s
+Your password is now: %(password)s
+'''
+
+chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+
+class WebUI:
+ ''' Handle a request as defined by the "env" and "cgi" parameters. Use
+ the "handler" to respond to the user.
+ '''
+ def __init__(self, handler, env):
+ self.handler = handler
+ self.config = handler.config
+ self.wfile = handler.wfile
+ self.env = env
+ self.form = cgi.FieldStorage(fp=handler.rfile, environ=env)
+ whrandom.seed(int(time.time())%256)
+
+ def run(self):
+ ''' Run the request, handling all uncaught errors and finishing off
+ cleanly.
+ '''
+ self.store = store.Store(self.config)
+ self.store.open()
+ try:
+ try:
+ self.inner_run()
+ except NotFound:
+ self.handler.send_error(404)
+ except Unauthorised, message:
+ self.handler.send_response(401)
+ self.handler.send_header('Content-Type', 'text/plain')
+ self.handler.send_header('WWW-Authenticate',
+ 'Basic realm="python packages index"')
+ self.handler.end_headers()
+ self.wfile.write(str(message))
+ except Redirect, path:
+ self.handler.send_response(301)
+ self.handler.send_header('Location', path)
+ except FormError, message:
+ self.page_head('Python Packages Index', 'Error processing form',
+ 400)
+ self.wfile.write('<p class="errror">Error processing form:'\
+ ' %s</p>'%message)
+ except:
+ self.page_head('Python Packages Index', 'Error...', 400)
+ self.wfile.write("<pre>")
+ s = StringIO.StringIO()
+ traceback.print_exc(None, s)
+ self.wfile.write(cgi.escape(s.getvalue()))
+ self.wfile.write("</pre>\n")
+ finally:
+ self.store.close()
+
+ def inner_run(self):
+ ''' Figure out what the request is, and farm off to the appropriate
+ handler.
+ '''
+ # see if the user has provided a username/password
+ self.username = None
+ auth = self.env.get('HTTP_CGI_AUTHORIZATION', '').strip()
+ if auth:
+ authtype, auth = auth.split()
+ if authtype.lower() == 'basic':
+ un, pw = base64.decodestring(auth).split(':')
+ if self.store.has_user(un):
+ pw = sha.sha(pw).hexdigest()
+ user = self.store.get_user(un)
+ if pw != user['password']:
+ raise Unauthorised, 'Incorrect password'
+ self.username = un
+ self.store.set_user(un, self.env['REMOTE_ADDR'])
+
+ # now handle the request
+ if self.form.has_key(':action'):
+ action = self.form[':action'].value
+ else:
+ action = 'index'
+
+ # make sure the user has permission
+ if action in ('submit', ):
+ if self.username is None:
+ raise Unauthorised
+ if self.store.get_otk(self.username):
+ raise Unauthorised
+
+ # handle the action
+ if action == 'submit':
+ self.submit()
+ elif action == 'submit_form':
+ self.submit_form()
+ elif action == 'display':
+ self.display()
+ elif action == 'search_form':
+ self.search_form()
+ elif action == 'register_form':
+ self.register_form()
+ elif action == 'user':
+ self.user()
+ elif action == 'password_reset':
+ self.password_reset()
+ elif action == 'index':
+ self.index()
+ elif action == 'role':
+ self.role()
+ elif action == 'role_form':
+ self.role_form()
+ else:
+ raise ValueError, 'Unknown action'
+
+ # commit any database changes
+ self.store.commit()
+
+ def page_head(self, title, heading=None, code=200):
+ ''' Page header
+ '''
+ self.handler.send_response(code)
+ self.handler.send_header('Content-Type', 'text/html')
+ self.handler.end_headers()
+ if heading is None: heading = title
+ self.wfile.write('''
+<html><head><title>%s</title>
+<link rel="stylesheet" type="text/css" href="http://mechanicalcat.net/style.css">
+<link rel="stylesheet" type="text/css" href="http://mechanicalcat.net/page.css">
+</head>
+<body>
+<div id="header"><h1>%s</h1></div>
+<div id="content">
+'''%(title, heading))
+
+ def page_foot(self):
+ self.wfile.write('\n</div>\n</body></html>\n')
+
+ def index(self):
+ ''' Print up an index page
+ '''
+ self.page_head('Python modules index')
+ w = self.wfile.write
+ w('<a href="?:action=search_form">search</a>\n')
+ w('| <a href="?:action=role_form">admin</a>\n')
+ w('| <a href="?:action=submit_form">manual submission</a>\n')
+ w('| <a href="?:action=register_form">register for a login</a>\n')
+ w('<ul>\n')
+ spec = {}
+ for k in self.form.keys():
+ if k.startswith(':'):
+ continue
+ value = self.form[k]
+ k = k.replace('-', '_')
+ if type(value) == type([]):
+ spec[k] = filter(None, [x.value.strip() for x in value])
+ else:
+ spec[k] = filter(None, [value.value.strip()])
+ for name, version in self.store.query_packages(spec):
+ w('<li><a href="?:action=display&name=%s&version=%s">%s %s</a>\n'%(
+ urllib.quote(name), urllib.quote(version), name, version))
+ w('''
+</ul>
+<hr>
+To list your <b>distutils</b>-packaged distribution here:
+<ol>
+<li>Copy <a href="http://mechanicalcat.net/tech/distutils_rego/register.py">register.py</a> to your
+python lib "distutils/command" directory (typically something like
+"/usr/lib/python2.1/distutils/command/").
+<li>Run "setup.py register" as you would normally run "setup.py" for your
+distribution - this will register your distribution's metadata with the
+index.
+<li>... that's <em>it</em>
+</ol>
+<p>In a nutshell, this server is a set of three modules (
+<a href="http://mechanicalcat.net/tech/distutils_rego/config.py">config.py</a>
+, <a
+href="http://mechanicalcat.net/tech/distutils_rego/store.py">store.py</a> and <a
+href="http://mechanicalcat.net/tech/distutils_rego/webui.py">webui.py</a>)
+and one config file (<a
+href="http://mechanicalcat.net/tech/distutils_rego/config.ini">config.ini</a>)
+which sit over a single <a href="http://www.hwaci.com/sw/sqlite/">sqlite</a> (simple, speedy) table. The register command posts the
+metadata and the web interface stores it away. The storage layer handles
+searching, but the web interface doesn't expose it yet :)</p>
+<p>Entries are unique by (name, version) and multiple submissions of the same
+(name, version) result in updates to the existing entry.</p>
+''')
+ self.page_foot()
+
+ def search_form(self):
+ ''' A form used to generate filtered index displays
+ '''
+ self.page_head('Python modules search')
+ self.wfile.write('''
+<form>
+<input type="hidden" name=":action" value="index">
+<table class="form">
+<tr><th>Name:</th>
+ <td><input name="name"></td>
+</tr>
+<tr><th>Version:</th>
+ <td><input name="version"></td>
+</tr>
+<tr><th>Summary:</th>
+ <td><input name="summary"></td>
+</tr>
+<tr><th>Description:</th>
+ <td><input name="description"></td>
+</tr>
+<tr><th>Long Description:</th>
+ <td><input name="long_description"></td>
+</tr>
+<tr><th>Keywords:</th>
+ <td><input name="keywords"></td>
+</tr>
+
+<tr><th>Hidden:</th>
+ <td><select name="hidden">
+ <option value="0">No</option>
+ <option value="1">Yes</option>
+ <option value="">Don't Care</option>
+ </select></td>
+</tr>
+<tr><td>&nbsp;</td><td><input type="submit" value="Search"></td></tr>
+</table>
+</form>
+''')
+ self.page_foot()
+
+ def role_form(self):
+ ''' A form used to maintain user Roles
+ '''
+ package_name = ''
+ if self.form.has_key('package_name'):
+ package_name = self.form['package_name'].value
+ if not (self.store.has_role('Admin', package_name) or
+ self.store.has_role('Owner', package_name)):
+ raise Unauthorised
+ package = '''
+<tr><th>Package Name:</th>
+ <td><input type="hidden" name="package_name" value="%s">%s</td>
+</tr>
+'''%(urllib.quote(package_name), cgi.escape(package_name))
+ elif not self.store.has_role('Admin', ''):
+ raise Unauthorised
+ else:
+ package = '''
+<tr><th>Package Name:</th>
+ <td><input name="package_name"></td>
+</tr>
+'''
+ # now write the body
+ self.page_head('Python package index', 'Role maintenance')
+ self.wfile.write('''
+<form>
+<input type="hidden" name=":action" value="role">
+<table class="form">
+<tr><th>User Name:</th>
+ <td><input name="user_name"></td>
+</tr>
+%s
+<tr><th>Role to Add:</th>
+ <td><select name="role_name">
+ <option value="Owner">Owner</option>
+ <option value="Maintainer">Maintainer</option>
+ </select></td>
+</tr>
+<tr><td>&nbsp;</td><td><input type="submit" value="Add Role"></td></tr>
+</table>
+</form>
+'''%package)
+ self.page_foot()
+
+ def role(self):
+ ''' Add a Role to a user.
+ '''
+ # required fields
+ if not self.form.has_key('package_name'):
+ raise FormError, 'package_name is required'
+ if not self.form.has_key('user_name'):
+ raise FormError, 'user_name is required'
+ if not self.form.has_key('role_name'):
+ raise FormError, 'role_name is required'
+
+ # get the values
+ package_name = self.form['package_name'].value
+ user_name = self.form['user_name'].value
+ role_name = self.form['role_name'].value
+
+ # further validation
+ if role_name not in ('Owner', 'Maintainer'):
+ raise FormError, 'role_name not Owner or Maintainer'
+ if not self.store.has_user(user_name):
+ raise FormError, "user doesn't exist"
+ if self.store.has_role(role_name, package_name, user_name):
+ raise FormError, 'user has that role already'
+
+ self.store.add_role(user_name, role_name, package_name)
+
+ self.plain_response('Role Added OK')
+
+ def display(self):
+ ''' Print up an entry
+ '''
+ w = self.wfile.write
+ name = self.form['name'].value
+ version = self.form['version'].value
+ info = self.store.get_package(name, version)
+ self.page_head('Python module: %s %s'%(name, version))
+ un = urllib.quote(name)
+ uv = urllib.quote(version)
+ w('<a href="?:action=index">index</a>\n')
+ w('| <a href="?:action=role_form&package_name=%s">admin</a>\n'%un)
+ w('| <a href="?:action=submit_form&name=%s&version=%s"'
+ '>edit</a><br>'%(un, uv))
+ w('<table class="form">\n')
+ keys = info.keys()
+ keys.sort()
+ for key in keys:
+ value = info[key]
+ if value is None:
+ value = ''
+ label = key.capitalize().replace('_', ' ')
+ if key in ('url', 'home_page') and value != 'UNKNOWN':
+ w('<tr><th nowrap>%s: </th><td><a href="%s">%s</a></td></tr>\n'%(label,
+ value, value))
+ else:
+ w('<tr><th nowrap>%s: </th><td>%s</td></tr>\n'%(label, value))
+ w('\n</table>\n')
+
+ w('<table class="journal">\n')
+ w('<tr><th>Date</th><th>User</th><th>IP Address</th><th>Action</th></tr>\n')
+ for entry in self.store.get_journal(name, version):
+ w('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n'%(
+ entry['submitted_date'], entry['submitted_by'],
+ entry['submitted_from'], entry['action']))
+ w('\n</table>\n')
+
+ self.page_foot()
+
+ def submit_form(self):
+ ''' A form used to submit or edit package metadata.
+ '''
+ # are we editing a specific entry?
+ info = {}
+ if self.form.has_key('name') and self.form.has_key('version'):
+ name = self.form['name'].value
+ version = self.form['version'].value
+
+ # permission to do this?
+ if not (self.store.has_role('Owner', name) or
+ self.store.has_role('Maintainer', name)):
+ raise Unauthorised, 'Not Owner or Maintainer'
+
+ # get the stored info
+ for k,v in self.store.get_package(name, version).items():
+ info[k] = v
+
+ self.page_head('Python package index', 'Manual submission')
+ w = self.wfile.write
+ w('''
+<form>
+<input type="hidden" name=":action" value="submit">
+<input type="hidden" name=":display" value="html">
+<table class="form">
+''')
+
+ # display all the properties
+ for property in 'name version author author_email maintainer maintainer_email home_page license summary description long_description keywords platform download_url hidden'.split():
+ # get the existing entry
+ if self.form.has_key(property):
+ value = self.form[property].value
+ else:
+ value = info.get(property, '')
+ if value is None:
+ value = ''
+
+ # form field
+ if property == 'hidden':
+ a = value=='1' and ' selected' or ''
+ b = value=='0' and ' selected' or ''
+ field = '''<select name="hidden">
+ <option value="1"%s>Yes</option>
+ <option value="0"%s>No</option>
+ </select>'''%(a,b)
+ elif property.endswith('description'):
+ field = '<textarea name="%s" rows="5" cols="80">%s</textarea>'%(
+ property, value)
+ else:
+ field = '<input size="40" name="%s" value="%s">'%(property, value)
+
+ # now spit out the form line
+ label = property.replace('_', ' ').capitalize()
+ w('<tr><th>%s:</th><td>%s</td></tr>'%(label, field))
+
+ w('''
+<tr><td>&nbsp;</td><td><input type="submit" value="Add Information"></td></tr>
+</table>
+</form>
+''')
+ self.page_foot()
+
+ def submit(self):
+ ''' Handle the submission of distro metadata.
+ '''
+ data = {}
+ for k in self.form.keys():
+ if k.startswith(':'): continue
+ v = self.form[k]
+ if type(v) == type([]):
+ data[k.lower().replace('-','_')]=','.join([x.value for x in v])
+ else:
+ data[k.lower().replace('-','_')] = v.value
+ result = 'plain'
+ if self.form.has_key(':display'):
+ result = self.form[':display'].value
+ try:
+ self.validate_metadata(data)
+ except ValueError, message:
+ if result == 'html':
+ raise FormError, message
+ raise
+ self.store.store_package(data['name'], data['version'], data)
+ self.store.commit()
+ if result == 'html':
+ self.display()
+ else:
+ self.plain_response('Submission OK')
+
+ def validate_metadata(self, data):
+ ''' Validate the contents of the metadata.
+
+ XXX actually _do_ this
+ XXX implement the "validate" :action
+ '''
+ if not data.has_key('name'):
+ raise ValueError, 'Missing required field: name'
+ if not data.has_key('version'):
+ raise ValueError, 'Missing required field: version'
+ if data.has_key('metadata_version'):
+ del data['metadata_version']
+
+ def plain_response(self, message):
+ ''' Return a plain-text response to the user.
+ '''
+ self.handler.send_response(200)
+ self.handler.send_header('Content-Type', 'text/plain')
+ self.handler.end_headers()
+ self.wfile.write(message)
+
+ def register_form(self):
+ ''' Throw up a form for regstering.
+ '''
+ self.page_head('Python package index', 'Manual user registration')
+ w = self.wfile.write
+ w('''
+<form>
+<input type="hidden" name=":action" value="user">
+<table class="form">
+<tr><th>Username:</th>
+ <td><input name="name"></td>
+</tr>
+<tr><th>Password:</th>
+ <td><input type="password" name="password"></td>
+</tr>
+<tr><th>Confirm:</th>
+ <td><input type="password" name="confirm"></td>
+</tr>
+<tr><th>Email Address:</th>
+ <td><input name="email"></td>
+</tr>
+<tr><td>&nbsp;</td><td><input type="submit" value="Register"></td></tr>
+</table>
+<p>A confirmation email will be sent to the address you nominate above.</p>
+<p>To complete the registration process, visit the link indicated in the
+email.</p>
+''')
+
+ def user(self):
+ ''' Register, update or validate a user.
+
+ This interface handles one of three cases:
+ 1. new user sending in name, password and email
+ 2. completion of rego with One Time Key
+ 3. updating existing user details for currently authed user
+ '''
+ info = {}
+ for param in 'name password email otk confirm'.split():
+ if self.form.has_key(param):
+ info[param] = self.form[param].value
+
+ if info.has_key('otk'):
+ if self.username is None:
+ raise Unauthorised
+ # finish off rego
+ if info['otk'] != self.store.get_otk(self.username):
+ response = 'Error: One Time Key invalid'
+ else:
+ # OK, delete the key
+ self.store.delete_otk(info['otk'])
+ response = 'Registration complete'
+
+ elif self.username is None:
+ # validate a complete set of stuff
+ # new user, create entry and email otk
+ name = info['name']
+ if self.store.has_user(name):
+ self.plain_response('Error: user "%s" already exists'%name)
+ return
+ if info.has_key('confirm') and info['password'] != info['confirm']:
+ self.plain_response("Error: password and confirm don't match")
+ return
+ info['otk'] = self.store.store_user(name, info['password'],
+ info['email'])
+ info['url'] = self.config.url
+ self.send_email(info['email'], rego_message%info)
+ response = 'Registration OK'
+
+ else:
+ # update details
+ user = self.store.get_user(self.username)
+ password = info.get('password', user['password'])
+ email = info.get('email', user['email'])
+ self.store.store_user(self.username, password, email)
+ response = 'Details updated OK'
+
+ self.plain_response(response)
+
+ def password_reset(self):
+ ''' Reset the user's password and send an email to the address given.
+ '''
+ email = self.form['email'].value
+ user = self.store.get_user_by_email(email)
+ if user is None:
+ response = 'Error: email address unknown to me'
+ else:
+ pw = ''.join([whrandom.choice(chars) for x in range(10)])
+ self.store.store_user(user['name'], pw, user['email'])
+ info = {'name': user['name'], 'password': pw,
+ 'email':user['email']}
+ self.send_email(email, password_message%info)
+ response = 'Email sent OK'
+ self.plain_response(response)
+
+ def send_email(self, recipient, message):
+ ''' Send an administrative email to the recipient
+ '''
+ smtp = smtplib.SMTP(self.config.mailhost)
+ smtp.sendmail(self.config.adminemail, recipient, message)
+