[Python-checkins] distutils2: merged from upstream

tarek.ziade python-checkins at python.org
Sun Sep 19 10:20:22 CEST 2010


tarek.ziade pushed 4e62116dae8c to distutils2:

http://hg.python.org/distutils2/rev/4e62116dae8c
changeset:   612:4e62116dae8c
parent:      611:8e9ad8266328
parent:      553:80265368bda0
user:        Konrad Delong <konryd at gmail.com>
date:        Thu Aug 12 20:00:18 2010 +0200
summary:     merged from upstream
files:       src/distutils2/dist.py

diff --git a/src/distutils2/_trove.py b/src/distutils2/_trove.py
new file mode 100644
--- /dev/null
+++ b/src/distutils2/_trove.py
@@ -0,0 +1,552 @@
+# Temporary helper for mkpkg.
+
+# XXX get the list from PyPI and cache it instead of hardcoding
+
+# XXX see if it would be more useful to store it as another structure
+# than a list of strings
+
+all_classifiers = [
+    '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',
+    'Environment :: Console :: Curses',
+    'Environment :: Console :: Framebuffer',
+    'Environment :: Console :: Newt',
+    'Environment :: Console :: svgalib',
+    "Environment :: Handhelds/PDA's",
+    'Environment :: MacOS X',
+    'Environment :: MacOS X :: Aqua',
+    'Environment :: MacOS X :: Carbon',
+    'Environment :: MacOS X :: Cocoa',
+    'Environment :: No Input/Output (Daemon)',
+    'Environment :: Other Environment',
+    'Environment :: Plugins',
+    'Environment :: Web Environment',
+    'Environment :: Web Environment :: Buffet',
+    'Environment :: Web Environment :: Mozilla',
+    'Environment :: Web Environment :: ToscaWidgets',
+    'Environment :: Win32 (MS Windows)',
+    'Environment :: X11 Applications',
+    'Environment :: X11 Applications :: Gnome',
+    'Environment :: X11 Applications :: GTK',
+    'Environment :: X11 Applications :: KDE',
+    'Environment :: X11 Applications :: Qt',
+    'Framework :: BFG',
+    'Framework :: Buildout',
+    'Framework :: Chandler',
+    'Framework :: CubicWeb',
+    'Framework :: Django',
+    'Framework :: IDLE',
+    'Framework :: Paste',
+    'Framework :: Plone',
+    'Framework :: Pylons',
+    'Framework :: Setuptools Plugin',
+    'Framework :: Trac',
+    'Framework :: TurboGears',
+    'Framework :: TurboGears :: Applications',
+    'Framework :: TurboGears :: Widgets',
+    'Framework :: Twisted',
+    'Framework :: ZODB',
+    'Framework :: Zope2',
+    'Framework :: Zope3',
+    '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 :: European Union Public Licence 1.0 (EUPL 1.0)',
+    'License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)',
+    'License :: OSI Approved :: GNU Affero General Public License v3',
+    '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 :: ISC License (ISCL)',
+    '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',
+    'License :: Repoze Public License',
+    '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 :: Cython',
+    '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 :: Python :: 2',
+    'Programming Language :: Python :: 2.3',
+    'Programming Language :: Python :: 2.4',
+    'Programming Language :: Python :: 2.5',
+    'Programming Language :: Python :: 2.6',
+    'Programming Language :: Python :: 2.7',
+    'Programming Language :: Python :: 3',
+    'Programming Language :: Python :: 3.0',
+    'Programming Language :: Python :: 3.1',
+    'Programming Language :: Python :: 3.2',
+    '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 :: WWW/HTTP :: WSGI',
+    'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
+    'Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware',
+    'Topic :: Internet :: WWW/HTTP :: WSGI :: Server',
+    '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 :: Atmospheric Science',
+    '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 :: pygame',
+    '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/src/distutils2/dist.py b/src/distutils2/dist.py
--- a/src/distutils2/dist.py
+++ b/src/distutils2/dist.py
@@ -16,7 +16,7 @@
 from distutils2.errors import (DistutilsOptionError, DistutilsArgError,
                                DistutilsModuleError, DistutilsClassError)
 from distutils2.fancy_getopt import FancyGetopt, translate_longopt
-from distutils2.util import check_environ, strtobool, resolve_dotted_name
+from distutils2.util import check_environ, strtobool, resolve_name
 from distutils2 import log
 from distutils2.metadata import DistributionMetadata
 
@@ -969,7 +969,7 @@
         if hooks is None:
             return
         for hook in hooks.values():
-            hook_func = resolve_dotted_name(hook)
+            hook_func = resolve_name(hook)
             hook_func(cmd_obj)
 
     # -- Distribution query methods ------------------------------------
diff --git a/src/distutils2/metadata.py b/src/distutils2/metadata.py
--- a/src/distutils2/metadata.py
+++ b/src/distutils2/metadata.py
@@ -336,34 +336,28 @@
                 self._write_field(fileobject, field, value)
 
     def update(self, other=None, **kwargs):
-        """Set metadata values from the given mapping
+        """Set metadata values from the given iterable `other` and kwargs.
 
-        Convert the keys to Metadata fields. Given keys that don't match a
-        metadata argument will not be used.
+        Behavior is like `dict.update`: If `other` has a ``keys`` method,
+        they are looped over and ``self[key]`` is assigned ``other[key]``.
+        Else, ``other`` is an iterable of ``(key, value)`` iterables.
 
-        If overwrite is set to False, just add metadata values that are
-        actually not defined.
-
-        If there is existing values in conflict with the dictionary ones, the
-        new values prevails.
-
-        Empty values (e.g. None and []) are not setted this way.
+        Keys that don't match a metadata field or that have an empty value are
+        dropped.
         """
         def _set(key, value):
-            if value not in ([], None, '') and key in _ATTR2FIELD:
+            if key in _ATTR2FIELD and value:
                 self.set(self._convert_name(key), value)
 
         if other is None:
             pass
-        elif hasattr(other, 'iteritems'):  # iteritems saves memory and lookups
-            for k, v in other.iteritems():
-                _set(k, v)
         elif hasattr(other, 'keys'):
             for k in other.keys():
-                _set(k, v)
+                _set(k, other[k])
         else:
             for k, v in other:
                 _set(k, v)
+
         if kwargs:
             self.update(kwargs)
 
diff --git a/src/distutils2/mkpkg.py b/src/distutils2/mkpkg.py
old mode 100755
new mode 100644
--- a/src/distutils2/mkpkg.py
+++ b/src/distutils2/mkpkg.py
@@ -12,623 +12,75 @@
 #
 #  Written by Sean Reifschneider <jafo at tummy.com>
 #
-#  TODO:
-#
-#    Look for a license file and automatically add the category.
-#
-#    When a .c file is found during the walk, can we add it as an extension?
-#
-#    Ask if the author is the maintainer?
-#
-#    Ask for the platform (can we detect this via "import win32" or something)?
-#
-#    Ask for the dependencies.
-#
-#    Ask for the Requires-Dist
-#
-#    Ask for the Provides-Dist
-#
-#    Detect scripts (not sure how.  #! outside of package?)
+#  Original TODO list:
+#  Look for a license file and automatically add the category.
+#  When a .c file is found during the walk, can we add it as an extension?
+#  Ask if there is a maintainer different that the author
+#  Ask for the platform (can we detect this via "import win32" or something?)
+#  Ask for the dependencies.
+#  Ask for the Requires-Dist
+#  Ask for the Provides-Dist
+#  Detect scripts (not sure how.  #! outside of package?)
 
+import os
 import sys
-import os
 import re
 import shutil
-import ConfigParser
+from ConfigParser import RawConfigParser
+from textwrap import dedent
+# importing this with an underscore as it should be replaced by the
+# dict form or another structures for all purposes
+from distutils2._trove import all_classifiers as _CLASSIFIERS_LIST
 
 
-helpText = {
-   'name' : '''
+_helptext = {
+    'name': '''
 The name of the program to be packaged, usually a single word composed
 of lower-case characters such as "python", "sqlalchemy", or "CherryPy".
 ''',
-   'version' : '''
+    'version': '''
 Version number of the software, typically 2 or 3 numbers separated by dots
 such as "1.00", "0.6", or "3.02.01".  "0.1.0" is recommended for initial
 development.
 ''',
-   'description' : '''
+    'description': '''
 A short summary of what this package is or does, typically a sentence 80
 characters or less in length.
 ''',
-   'author' : '''
+    'author': '''
 The full name of the author (typically you).
 ''',
-   'author_email' : '''
+    'author_email': '''
 E-mail address of the package author (typically you).
 ''',
-   'do_classifier' : '''
+    'do_classifier': '''
 Trove classifiers are optional identifiers that allow you to specify the
 intended audience by saying things like "Beta software with a text UI
 for Linux under the PSF license.  However, this can be a somewhat involved
 process.
 ''',
-   'url' : '''
+    'url': '''
 The home page for the package, typically starting with "http://".
 ''',
-   'trove_license' : '''
+    'trove_license': '''
 Optionally you can specify a license.  Type a string that identifies a common
 license, and then you can select a list of license specifiers.
 ''',
-   'trove_generic' : '''
+    'trove_generic': '''
 Optionally, you can set other trove identifiers for things such as the
 human language, programming language, user interface, etc...
 ''',
 }
 
-# XXX this list should be asked at PyPI (it changes)
-# then cached, rather than hardcoded
-troveList = [
-        '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',
-        'Environment :: Console :: Curses',
-        'Environment :: Console :: Framebuffer',
-        'Environment :: Console :: Newt',
-        'Environment :: Console :: svgalib',
-        'Environment :: Handhelds/PDA\'s',
-        'Environment :: MacOS X',
-        'Environment :: MacOS X :: Aqua',
-        'Environment :: MacOS X :: Carbon',
-        'Environment :: MacOS X :: Cocoa',
-        'Environment :: No Input/Output (Daemon)',
-        'Environment :: Other Environment',
-        'Environment :: Plugins',
-        'Environment :: Web Environment',
-        'Environment :: Web Environment :: Buffet',
-        'Environment :: Web Environment :: Mozilla',
-        'Environment :: Web Environment :: ToscaWidgets',
-        'Environment :: Win32 (MS Windows)',
-        'Environment :: X11 Applications',
-        'Environment :: X11 Applications :: Gnome',
-        'Environment :: X11 Applications :: GTK',
-        'Environment :: X11 Applications :: KDE',
-        'Environment :: X11 Applications :: Qt',
-        'Framework :: BFG',
-        'Framework :: Buildout',
-        'Framework :: Chandler',
-        'Framework :: CubicWeb',
-        'Framework :: Django',
-        'Framework :: IDLE',
-        'Framework :: Paste',
-        'Framework :: Plone',
-        'Framework :: Pylons',
-        'Framework :: Setuptools Plugin',
-        'Framework :: Trac',
-        'Framework :: TurboGears',
-        'Framework :: TurboGears :: Applications',
-        'Framework :: TurboGears :: Widgets',
-        'Framework :: Twisted',
-        'Framework :: ZODB',
-        'Framework :: Zope2',
-        'Framework :: Zope3',
-        '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 :: European Union Public Licence 1.0 (EUPL 1.0)',
-        'License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)',
-        'License :: OSI Approved :: GNU Affero General Public License v3',
-        '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 :: ISC License (ISCL)',
-        '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',
-        'License :: Repoze Public License',
-        '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 :: Cython',
-        '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 :: Python :: 2',
-        'Programming Language :: Python :: 2.3',
-        'Programming Language :: Python :: 2.4',
-        'Programming Language :: Python :: 2.5',
-        'Programming Language :: Python :: 2.6',
-        'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.0',
-        'Programming Language :: Python :: 3.1',
-        'Programming Language :: Python :: 3.2',
-        '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 :: WWW/HTTP :: WSGI',
-        'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
-        'Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware',
-        'Topic :: Internet :: WWW/HTTP :: WSGI :: Server',
-        '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 :: Atmospheric Science',
-        '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 :: pygame',
-        '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',
-   ]
+# XXX everything needs docstrings and tests (both low-level tests of various
+# methods and functional tests of running the script)
 
-def askYn(question, default = None, helptext = None):
+
+def ask_yn(question, default=None, helptext=None):
     while True:
-        answer = ask(question, default, helptext, required = True)
+        answer = ask(question, default, helptext, required=True)
         if answer and answer[0].lower() in 'yn':
-            return(answer[0].lower())
+            return answer[0].lower()
 
         print '\nERROR: You must select "Y" or "N".\n'
 
@@ -659,7 +111,7 @@
             print '=' * 70
             continue
         if default and not line:
-            return(default)
+            return default
         if not line and required:
             print '*' * 70
             print 'This value cannot be empty.'
@@ -668,92 +120,104 @@
                 print helptext
             print '*' * 70
             continue
-        return(line)
+        return line
 
 
-def buildTroveDict(troveList):
-    dict = {}
-    for key in troveList:
-        subDict = dict
+def _build_classifiers_dict(classifiers):
+    d = {}
+    for key in classifiers:
+        subDict = d
         for subkey in key.split(' :: '):
             if not subkey in subDict:
                 subDict[subkey] = {}
             subDict = subDict[subkey]
-    return(dict)
-troveDict = buildTroveDict(troveList)
+    return d
 
+CLASSIFIERS = _build_classifiers_dict(_CLASSIFIERS_LIST)
 
-class SetupClass(object):
+
+class MainProgram(object):
     def __init__(self):
-        self.config = None
-        self.classifierDict = {}
-        self.setupData = {}
-        self.setupData['classifier'] = self.classifierDict
-        self.setupData['packages'] = {}
+        self.configparser = None
+        self.classifiers = {}
+        self.data = {}
+        self.data['classifier'] = self.classifiers
+        self.data['packages'] = {}
+        self.load_config_file()
 
-        self.loadConfigFile()
+    def lookup_option(self, key):
+        if not self.configparser.has_option('DEFAULT', key):
+            return None
+        return self.configparser.get('DEFAULT', key)
 
+    def load_config_file(self):
+        self.configparser = RawConfigParser()
+        # TODO replace with section in distutils config file
+        self.configparser.read(os.path.expanduser('~/.mkpkgpy'))
+        self.data['author'] = self.lookup_option('author')
+        self.data['author_email'] = self.lookup_option('author_email')
 
-    def lookupOption(self, key):
-        if not self.config.has_option('DEFAULT', key):
-            return(None)
-        return(self.config.get('DEFAULT', key))
-
-
-    def loadConfigFile(self):
-        self.config = ConfigParser.RawConfigParser()
-        self.config.read(os.path.expanduser('~/.mkpkgpy'))
-        self.setupData['author'] = self.lookupOption('author')
-        self.setupData['author_email'] = self.lookupOption('author_email')
-
-
-    def updateConfigFile(self):
+    def update_config_file(self):
         valuesDifferent = False
+        # FIXME looking only for those two fields seems wrong
         for compareKey in ('author', 'author_email'):
-            if self.lookupOption(compareKey) != self.setupData[compareKey]:
+            if self.lookup_option(compareKey) != self.data[compareKey]:
                 valuesDifferent = True
-                self.config.set('DEFAULT', compareKey,
-                    self.setupData[compareKey])
+                self.configparser.set('DEFAULT', compareKey,
+                                      self.data[compareKey])
 
         if not valuesDifferent:
             return
 
-        self.config.write(open(os.path.expanduser('~/.pygiver'), 'w'))
+        fp = open(os.path.expanduser('~/.mkpkgpy'), 'w')
+        try:
+            self.configparser.write(fp)
+        finally:
+            fp.close()
 
+    def load_existing_setup_script(self):
+        raise NotImplementedError
+        # Ideas:
+        # - define a mock module to assign to sys.modules['distutils'] before
+        # importing the setup script as a module (or executing it); it would
+        # provide setup (a function that just returns its args as a dict),
+        # Extension (ditto), find_packages (the real function)
+        # - we could even mock Distribution and commands to handle more setup
+        # scripts
+        # - we could use a sandbox (http://bugs.python.org/issue8680)
+        # - the cleanest way is to parse the file, not import it, but there is
+        # no way to do that across versions (the compiler package is
+        # deprecated or removed in recent Pythons, the ast module is not
+        # present before 2.6)
 
-    def loadExistingSetup(self):
-        raise NotImplementedError
-
-
-    def inspectFile(self, path):
+    def inspect_file(self, path):
         fp = open(path, 'r')
         try:
-            for line in [fp.readline() for x in range(10)]:
+            for line in [fp.readline() for _ in range(10)]:
                 m = re.match(r'^#!.*python((?P<major>\d)(\.\d+)?)?$', line)
                 if m:
                     if m.group('major') == '3':
-                        self.classifierDict['Programming Language :: Python :: 3'] = 1
+                        self.classifiers['Programming Language :: Python :: 3'] = 1
                     else:
-                        self.classifierDict['Programming Language :: Python :: 2'] = 1
+                        self.classifiers['Programming Language :: Python :: 2'] = 1
         finally:
             fp.close()
 
-
-    def inspectDirectory(self):
+    def inspect_directory(self):
         dirName = os.path.basename(os.getcwd())
-        self.setupData['name'] = dirName
+        self.data['name'] = dirName
         m = re.match(r'(.*)-(\d.+)', dirName)
         if m:
-            self.setupData['name'] = m.group(1)
-            self.setupData['version'] = m.group(2)
+            self.data['name'] = m.group(1)
+            self.data['version'] = m.group(2)
 
         for root, dirs, files in os.walk(os.curdir):
-            for file in files:
-                if root == os.curdir and file == 'setup.py': continue
-                fileName = os.path.join(root, file)
-                self.inspectFile(fileName)
+            for filename in files:
+                if root == os.curdir and filename == 'setup.py':
+                    continue
+                self.inspect_file(os.path.join(root, filename))
 
-                if file == '__init__.py':
+                if filename == '__init__.py':
                     trySrc = os.path.join(os.curdir, 'src')
                     tmpRoot = root
                     if tmpRoot.startswith(trySrc):
@@ -761,75 +225,69 @@
                     if tmpRoot.startswith(os.path.sep):
                         tmpRoot = tmpRoot[len(os.path.sep):]
 
-                    self.setupData['packages'][tmpRoot] = root[1 + len(os.path.sep):]
+                    self.data['packages'][tmpRoot] = root[1 + len(os.path.sep):]
 
+    def query_user(self):
+        self.data['name'] = ask('Package name', self.data['name'],
+              _helptext['name'])
+        self.data['version'] = ask('Current version number',
+              self.data.get('version'), _helptext['version'])
+        self.data['description'] = ask('Package description',
+              self.data.get('description'), _helptext['description'],
+              lengthy=True)
+        self.data['author'] = ask('Author name',
+              self.data.get('author'), _helptext['author'])
+        self.data['author_email'] = ask('Author e-mail address',
+              self.data.get('author_email'), _helptext['author_email'])
+        self.data['url'] = ask('Project URL',
+              self.data.get('url'), _helptext['url'], required=False)
 
-    def queryUser(self):
-        self.setupData['name'] = ask('Package name', self.setupData['name'],
-              helpText['name'])
-        self.setupData['version'] = ask('Current version number',
-              self.setupData.get('version'), helpText['version'])
-        self.setupData['description'] = ask('Package description',
-              self.setupData.get('description'), helpText['description'],
-              lengthy=True)
-        self.setupData['author'] = ask('Author name',
-              self.setupData.get('author'), helpText['author'])
-        self.setupData['author_email'] = ask('Author e-mail address',
-              self.setupData.get('author_email'), helpText['author_email'])
-        self.setupData['url'] = ask('Project URL',
-              self.setupData.get('url'), helpText['url'], required=False)
+        if ask_yn('Do you want to set Trove classifiers?',
+                  helptext=_helptext['do_classifier']) == 'y':
+            self.set_classifier()
 
-        if (askYn('Do you want to set Trove classifiers?',
-                helptext=helpText['do_classifier']) == 'y'):
-            self.setTroveClassifier()
+    def set_classifier(self):
+        self.set_devel_status(self.classifiers)
+        self.set_license(self.classifiers)
+        self.set_other_classifier(self.classifiers)
 
+    def set_other_classifier(self, classifiers):
+        if ask_yn('Do you want to set other trove identifiers', 'n',
+                  _helptext['trove_generic']) != 'y':
+            return
+        self.walk_classifiers(classifiers, [CLASSIFIERS], '')
 
-    def setTroveClassifier(self):
-        self.setTroveDevStatus(self.classifierDict)
-        self.setTroveLicense(self.classifierDict)
-        self.setTroveOther(self.classifierDict)
-
-
-    def setTroveOther(self, classifierDict):
-        if askYn('Do you want to set other trove identifiers',
-                'n',
-                helpText['trove_generic']) != 'y':
-            return
-
-        self.walkTrove(classifierDict, [troveDict], '')
-
-    def walkTrove(self, classifierDict, trovePath, desc):
-        trove = trovePath[-1]
+    def walk_classifiers(self, classifiers, trovepath, desc):
+        trove = trovepath[-1]
 
         if not trove:
             return
 
         for key in sorted(trove.keys()):
             if len(trove[key]) == 0:
-                if askYn('Add "%s"' % desc[4:] + ' :: ' + key, 'n') == 'y':
-                    classifierDict[desc[4:] + ' :: ' + key] = 1
+                if ask_yn('Add "%s"' % desc[4:] + ' :: ' + key, 'n') == 'y':
+                    classifiers[desc[4:] + ' :: ' + key] = 1
                 continue
 
-            if askYn('Do you want to set items under\n   "%s" (%d sub-items)'
-                    % (key, len(trove[key])), 'n',
-                    helpText['trove_generic']) == 'y':
-                self.walkTrove(classifierDict, trovePath + [trove[key]],
-                        desc + ' :: ' + key)
+            if ask_yn('Do you want to set items under\n   "%s" (%d sub-items)'
+                      % (key, len(trove[key])), 'n',
+                      _helptext['trove_generic']) == 'y':
+                self.walk_classifiers(classifiers, trovepath + [trove[key]],
+                                      desc + ' :: ' + key)
 
-
-    def setTroveLicense(self, classifierDict):
+    def set_license(self, classifiers):
         while True:
             license = ask('What license do you use',
-                        helptext=helpText['trove_license'],
-                        required=False)
+                          helptext=_helptext['trove_license'], required=False)
             if not license:
                 return
 
             licenseWords = license.lower().split(' ')
 
             foundList = []
-            for index in range(len(troveList)):
-                troveItem = troveList[index]
+            # TODO use enumerate
+            for index in range(len(_CLASSIFIERS_LIST)):
+                troveItem = _CLASSIFIERS_LIST[index]
                 if not troveItem.startswith('License :: '):
                     continue
                 troveItem = troveItem[11:].lower()
@@ -843,54 +301,55 @@
                     foundList.append(index)
 
             question = 'Matching licenses:\n\n'
+            # TODO use enumerate?
             for i in xrange(1, len(foundList) + 1):
-                question += '   %s) %s\n' % (i, troveList[foundList[i - 1]])
+                question += '   %s) %s\n' % (i, _CLASSIFIERS_LIST[foundList[i - 1]])
             question += ('\nType the number of the license you wish to use or '
-                     '? to try again:')
+                         '? to try again:')
             troveLicense = ask(question, required=False)
 
             if troveLicense == '?':
                 continue
             if troveLicense == '':
                 return
+            # FIXME the int conversion can fail
             foundIndex = foundList[int(troveLicense) - 1]
-            classifierDict[troveList[foundIndex]] = 1
+            classifiers[_CLASSIFIERS_LIST[foundIndex]] = 1
             try:
                 return
             except IndexError:
-                print("ERROR: Invalid selection, type a number from the list "
-                    "above.")
+                print ("ERROR: Invalid selection, type a number from the list "
+                       "above.")
 
+    def set_devel_status(self, classifiers):
+        while True:
+            choice = ask(dedent('''\
+                Please select the project status:
 
-    def setTroveDevStatus(self, classifierDict):
-        while True:
-            devStatus = ask('''Please select the project status:
+                1 - Planning
+                2 - Pre-Alpha
+                3 - Alpha
+                4 - Beta
+                5 - Production/Stable
+                6 - Mature
+                7 - Inactive
 
-1 - Planning
-2 - Pre-Alpha
-3 - Alpha
-4 - Beta
-5 - Production/Stable
-6 - Mature
-7 - Inactive
-
-Status''', required=False)
-            if devStatus:
+                Status'''), required=False)
+            if choice:
                 try:
-                    key = {
-                           '1' : 'Development Status :: 1 - Planning',
-                           '2' : 'Development Status :: 2 - Pre-Alpha',
-                           '3' : 'Development Status :: 3 - Alpha',
-                           '4' : 'Development Status :: 4 - Beta',
-                           '5' : 'Development Status :: 5 - Production/Stable',
-                           '6' : 'Development Status :: 6 - Mature',
-                           '7' : 'Development Status :: 7 - Inactive',
-                           }[devStatus]
-                    classifierDict[key] = 1
+                    choice = int(choice) - 1
+                    key = ['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'][choice]
+                    classifiers[key] = 1
                     return
-                except KeyError:
-                    print("ERROR: Invalid selection, type a single digit "
-                        "number.")
+                except (IndexError, ValueError):
+                    print ("ERROR: Invalid selection, type a single digit "
+                           "number.")
 
     def _dotted_packages(self, data):
         packages = sorted(data.keys())
@@ -901,33 +360,38 @@
             modified_pkgs.append(pkg)
         return modified_pkgs
 
-    def writeSetup(self):
+    def write_setup_script(self):
         if os.path.exists('setup.py'):
+            if os.path.exists('setup.py.old'):
+                print ("ERROR: setup.py.old backup exists, please check that "
+                        "current setup.py is correct and remove setup.py.old")
+                return
             shutil.move('setup.py', 'setup.py.old')
 
         fp = open('setup.py', 'w')
         try:
+            # XXX do LFs work on all platforms?
             fp.write('#!/usr/bin/env python\n\n')
             fp.write('from distutils2.core import setup\n\n')
-            fp.write('setup(name=%s,\n' % repr(self.setupData['name']))
-            fp.write('      version=%s,\n' % repr(self.setupData['version']))
+            fp.write('setup(name=%s,\n' % repr(self.data['name']))
+            fp.write('      version=%s,\n' % repr(self.data['version']))
             fp.write('      description=%s,\n'
-                    % repr(self.setupData['description']))
-            fp.write('      author=%s,\n' % repr(self.setupData['author']))
+                    % repr(self.data['description']))
+            fp.write('      author=%s,\n' % repr(self.data['author']))
             fp.write('      author_email=%s,\n'
-                    % repr(self.setupData['author_email']))
-            if self.setupData['url']:
-                fp.write('      url=%s,\n' % repr(self.setupData['url']))
-            if self.setupData['classifier']:
+                    % repr(self.data['author_email']))
+            if self.data['url']:
+                fp.write('      url=%s,\n' % repr(self.data['url']))
+            if self.data['classifier']:
                 fp.write('      classifier=[\n')
-                for classifier in sorted(self.setupData['classifier'].keys()):
+                for classifier in sorted(self.data['classifier'].keys()):
                     fp.write('            %s,\n' % repr(classifier))
                 fp.write('         ],\n')
-            if self.setupData['packages']:
+            if self.data['packages']:
                 fp.write('      packages=%s,\n'
-                        % repr(self._dotted_packages(self.setupData['packages'])))
+                        % repr(self._dotted_packages(self.data['packages'])))
                 fp.write('      package_dir=%s,\n'
-                        % repr(self.setupData['packages']))
+                        % repr(self.data['packages']))
             fp.write('      #scripts=[\'path/to/script\']\n')
 
             fp.write('      )\n')
@@ -939,11 +403,14 @@
 
 
 def main():
-    setup = SetupClass()
-    setup.inspectDirectory()
-    setup.queryUser()
-    setup.updateConfigFile()
-    setup.writeSetup()
+    """Main entry point."""
+    program = MainProgram()
+    # uncomment when implemented
+    #program.load_existing_setup_script()
+    program.inspect_directory()
+    program.query_user()
+    program.update_config_file()
+    program.write_setup()
 
 
 if __name__ == '__main__':
diff --git a/src/distutils2/tests/test_metadata.py b/src/distutils2/tests/test_metadata.py
--- a/src/distutils2/tests/test_metadata.py
+++ b/src/distutils2/tests/test_metadata.py
@@ -152,7 +152,11 @@
         self.assertIn('Version', metadata.keys())
         self.assertIn('0.5', metadata.values())
         self.assertIn(('Version', '0.5'), metadata.items())
-        #TODO test update
+
+        metadata.update({'version': '0.6'})
+        self.assertEqual(metadata['Version'], '0.6')
+        metadata.update([('version', '0.7')])
+        self.assertEqual(metadata['Version'], '0.7')
 
     def test_versions(self):
         metadata = DistributionMetadata()
diff --git a/src/distutils2/tests/test_util.py b/src/distutils2/tests/test_util.py
--- a/src/distutils2/tests/test_util.py
+++ b/src/distutils2/tests/test_util.py
@@ -18,7 +18,7 @@
                              _find_exe_version, _MAC_OS_X_LD_VERSION,
                              byte_compile, find_packages, spawn, find_executable,
                              _nt_quote_args, get_pypirc_path, generate_pypirc,
-                             read_pypirc, resolve_dotted_name)
+                             read_pypirc, resolve_name)
 
 from distutils2 import util
 from distutils2.tests import support
@@ -342,14 +342,14 @@
         res = find_packages([root], ['pkg1.pkg2'])
         self.assertEqual(set(res), set(['pkg1', 'pkg5', 'pkg1.pkg3', 'pkg1.pkg3.pkg6']))
 
-    def test_resolve_dotted_name(self):
-        self.assertEqual(UtilTestCase, resolve_dotted_name("distutils2.tests.test_util.UtilTestCase"))
-        self.assertEqual(UtilTestCase.test_resolve_dotted_name,
-                         resolve_dotted_name("distutils2.tests.test_util.UtilTestCase.test_resolve_dotted_name"))
+    def test_resolve_name(self):
+        self.assertEqual(UtilTestCase, resolve_name("distutils2.tests.test_util.UtilTestCase"))
+        self.assertEqual(UtilTestCase.test_resolve_name,
+                         resolve_name("distutils2.tests.test_util.UtilTestCase.test_resolve_name"))
 
-        self.assertRaises(ImportError, resolve_dotted_name,
+        self.assertRaises(ImportError, resolve_name,
                           "distutils2.tests.test_util.UtilTestCaseNot")
-        self.assertRaises(ImportError, resolve_dotted_name,
+        self.assertRaises(ImportError, resolve_name,
                           "distutils2.tests.test_util.UtilTestCase.nonexistent_attribute")
 
     def test_import_nested_first_time(self):
@@ -361,12 +361,11 @@
 
         try:
             sys.path.append(tmp_dir)
-            resolve_dotted_name("a.b.c.Foo")
+            resolve_name("a.b.c.Foo")
             # assert nothing raised
         finally:
             sys.path.remove(tmp_dir)
 
-        
     @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
     def test_run_2to3_on_code(self):
         content = "print 'test'"
diff --git a/src/distutils2/util.py b/src/distutils2/util.py
--- a/src/distutils2/util.py
+++ b/src/distutils2/util.py
@@ -636,8 +636,8 @@
                 packages.append(package_name)
     return packages
 
-def resolve_dotted_name(name):
-    """Resolves the name and returns the corresponding object."""
+def resolve_name(name):
+    """Resolve a name like ``module.object`` to an object and return it."""
     parts = name.split('.')
     cursor = len(parts)
     module_name, rest = parts[:cursor], parts[cursor:]
@@ -659,6 +659,7 @@
         except AttributeError:
             raise ImportError
     return ret
+
 # utility functions for 2to3 support
 
 def run_2to3(files, doctests_only=False, fixer_names=None, options=None,

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list