# -*- coding: utf-8 -*- """ grumpy.vdb.pypi ~~~~~~~~~~~~~~~ This module contains version check lookups for packages in PyPi. :copyright: (c) by 2010 Priit Laes. :license: BSD, see LICENSE for details. """ from lxml.html import fromstring import urllib class pypi_checker(object): # TODO: Shall we use some kind of yaml or json based format instead? # Or move this data into DB? pkgs = { # Package in Portage : Package in PyPi 'app-admin/supervisor' : 'supervisor', 'app-editors/editra' : 'Editra', 'app-editors/leo' : 'leo', 'app-misc/hachoir-metadata' : 'hachoir-metadata', 'app-misc/hachoir-subfile' : 'hachoir-subfile', 'app-misc/hachoir-urwid' : 'hachoir-urwid', 'app-text/pytextile' : 'textile', 'dev-python/4suite' : '4suite', 'dev-python/amara' : 'amara', 'dev-python/anyvc' : 'anyvc', 'dev-python/apptools' : 'AppTools', 'dev-python/aquarium' : 'aquarium', 'dev-python/argparse' : 'argparse', 'dev-python/arrayterator' : 'arrayterator', 'dev-python/astng' : 'astng', 'dev-python/axiom' : 'Axiom', 'dev-python/Babel' : 'Babel', 'dev-python/basemap' : 'basemap', 'dev-python/beaker' : 'Beaker', 'dev-python/beanstalkc' : 'beanstalkc', 'dev-python/beautifulsoup' : 'BeautifulSoup', 'dev-python/blockcanvas' : 'BlockCanvas', 'dev-python/boto' : 'boto', 'dev-python/bpython' : 'bpython', 'dev-python/bsddb3' : 'bsddb3', 'dev-python/buildutils' : 'buildutils', 'dev-python/buzhug' : 'buzhug', 'dev-python/celementtree' : 'celementtree', 'dev-python/cfgparse' : 'cfgparse', 'dev-python/chaco' : 'Chaco', 'dev-python/cheetah' : 'Cheetah', 'dev-python/cherrypy' : 'cherrypy', 'dev-python/clientcookie' : 'clientcookie', 'dev-python/clientform' : 'clientform', 'dev-python/columnize' : 'columnize', 'dev-python/configobj' : 'configobj', 'dev-python/couchdb-python' : 'CouchDB', 'dev-python/coverage' : 'coverage', 'dev-python/cssutils' : 'cssutils', 'dev-python/cython' : 'Cython', 'dev-python/dap' : 'dap', 'dev-python/dbutils' : 'DBUtils', 'dev-python/decorator' : 'decorator', 'dev-python/decoratortools' : 'DecoratorTools', 'dev-python/demjson' : 'demjson', 'dev-python/django' : 'django', 'dev-python/dnspython' : 'dnspython', 'dev-python/docutils' : 'docutils', 'dev-python/dulwich' : 'dulwich', 'dev-python/egenix-mx-base' : 'egenix-mx-base', 'dev-python/elementtree' : 'elementtree', 'dev-python/elixir' : 'Elixir', 'dev-python/enable' : 'Enable', 'dev-python/enthoughtbase' : 'EnthoughtBase', 'dev-python/envisagecore' : 'EnvisageCore', 'dev-python/envisageplugins' : 'EnvisagePlugins', 'dev-python/epsilon' : 'Epsilon', 'dev-python/ets' : 'ets', 'dev-python/etsdevtools' : 'ETSDevTools', 'dev-python/execnet' : 'execnet', 'dev-python/fabric' : 'Fabric', 'dev-python/flask' : 'Flask', 'dev-python/flask-openid' : 'Flask-OpenID', 'dev-python/flask-sqlalchemy' : 'Flask-SQLAlchemy', 'dev-python/flup' : 'flup', 'dev-python/foolscap' : 'foolscap', 'dev-python/formencode' : 'FormEncode', 'dev-python/fpconst' : 'fpconst', 'dev-python/functest' : 'functest', 'dev-python/fusil' : 'fusil', 'dev-python/gdata' : 'gdata', 'dev-python/genshi' : 'genshi', 'dev-python/git-python' : 'GitPython', 'dev-python/gmpy' : 'gmpy', 'dev-python/guppy' : 'guppy', 'dev-python/h5py' : 'h5py', 'dev-python/hachoir-core' : 'hachoir-core', 'dev-python/hachoir-parser' : 'hachoir-parser', 'dev-python/hachoir-regex' : 'hachoir-regex', 'dev-python/hcluster' : 'hcluster', 'dev-python/html5lib' : 'html5lib', 'dev-python/httplib2' : 'httplib2', 'dev-python/icalendar' : 'icalendar', 'dev-python/imaging' : 'imaging', 'dev-python/imdbpy' : 'IMDbPY', 'dev-python/ipdb' : 'ipdb', 'dev-python/ipy' : 'IPy', 'dev-python/ipython' : 'ipython', 'dev-python/jinja' : 'Jinja2', 'dev-python/jonpy' : 'jonpy', 'dev-python/jsonpickle' : 'jsonpickle', 'dev-python/kid' : 'kid', 'dev-python/librharris' : 'librharris', 'dev-python/lockfile' : 'lockfile', 'dev-python/logilab-common' : 'logilab-common', 'dev-python/louie' : 'louie', 'dev-python/lupy' : 'Lupy', 'dev-python/lxml' : 'lxml', 'dev-python/m2crypto' : 'M2Crypto', 'dev-python/mako' : 'mako', 'dev-python/mantissa' : 'Mantissa', 'dev-python/markdown' : 'Markdown', 'dev-python/markupsafe' : 'MarkupSafe', 'dev-python/matplotlib' : 'matplotlib', 'dev-python/mechanize' : 'mechanize', 'dev-python/medusa' : 'medusa', 'dev-python/meld3' : 'meld3', 'dev-python/minimock' : 'MiniMock', 'dev-python/mock' : 'mock', 'dev-python/mocker' : 'mocker', 'dev-python/morbid' : 'morbid', 'dev-python/mozrunner' : 'mozrunner', 'dev-python/mpi4py' : 'mpi4py', 'dev-python/mpmath' : 'mpmath', 'dev-python/mwlib' : 'mwlib', 'dev-python/mwlib-ext' : 'mwlib.ext', 'dev-python/myghty' : 'Myghty', 'dev-python/myghtyutils' : 'MyghtyUtils', 'dev-python/nevow' : 'Nevow', 'dev-python/nose' : 'nose', 'dev-python/numexpr' : 'numexpr', 'dev-python/numpy' : 'numpy', 'dev-python/oauth' : 'oauth', 'dev-python/odfpy' : 'odfpy', 'dev-python/optcomplete' : 'optcomplete', 'dev-python/paisley' : 'paisley', 'dev-python/paramiko' : 'paramiko', 'dev-python/paste' : 'Paste', 'dev-python/pastedeploy' : 'PasteDeploy', 'dev-python/pastescript' : 'PasteScript', 'dev-python/paver' : 'Paver', 'dev-python/pexpect' : 'pexpect', 'dev-python/ply' : 'ply', 'dev-python/processing' : 'processing', 'dev-python/promise' : 'promise', 'dev-python/psycopg' : 'psycopg', 'dev-python/pudb' : 'pudb', 'dev-python/pudge' : 'pudge', 'dev-python/pupynere' : 'pupynere', 'dev-python/py' : 'py', 'dev-python/pyalsaaudio' : 'pyalsaaudio', 'dev-python/pycairo' : 'pycairo', 'dev-python/pycdio' : 'pycdio', 'dev-python/pyclamav' : 'pyclamav', 'dev-python/pyconstruct' : 'pyconstruct', 'dev-python/pycountry' : 'pycountry', 'dev-python/pycrypto' : 'pycrypto', 'dev-python/pycuda' : 'pycuda', 'dev-python/pycurl' : 'pycurl', 'dev-python/pydispatcher' : 'PyDispatcher', 'dev-python/pydns' : 'pydns', 'dev-python/pyenchant' : 'pyenchant', 'dev-python/pyflakes' : 'pyflakes', 'dev-python/pygments' : 'Pygments', 'dev-python/pygraphviz' : 'pygraphviz', 'dev-python/pygtkhelpers' : 'pygtkhelpers', 'dev-python/pyinotify' : 'pyinotify', 'dev-python/pylibacl' : 'pylibacl', 'dev-python/pylint' : 'pylint', 'dev-python/pylirc' : 'pylirc', 'dev-python/pylons' : 'Pylons', 'dev-python/pylzma' : 'pylzma', 'dev-python/pymssql' : 'pymssql', 'dev-python/pyopencl' : 'pyopencl', 'dev-python/pyopengl' : 'PyOpenGL', 'dev-python/pyopenssl' : 'pyOpenSSL', 'dev-python/pyparsing' : 'pyparsing', 'dev-python/pyPdf' : 'pyPdf', 'dev-python/pypgsql' : 'pypgsql', 'dev-python/pyproj' : 'pyproj', 'dev-python/pyprotocols' : 'PyProtocols', 'dev-python/PyQt4' : 'PyQt4', 'dev-python/pyro' : 'pyro', 'dev-python/pyrtf' : 'PyRTF', 'dev-python/pyserial' : 'pyserial', 'dev-python/pysnmp' : 'pysnmp', 'dev-python/pysnmp-apps' : 'pysnmp-apps', 'dev-python/pysnmp-mibs' : 'pysnmp-mibs', 'dev-python/pyspf' : 'pyspf', 'dev-python/pysqlite' : 'pysqlite', 'dev-python/pytables' : 'pytables', 'dev-python/python-daemon' : 'python-daemon', 'dev-python/python-dateutil' : 'python-dateutil', 'dev-python/python-fastcgi' : 'python-fastcgi', 'dev-python/python-gnutls' : 'python-gnutls', 'dev-python/python-ldap' : 'python-ldap', 'dev-python/python-memcached' : 'python-memcached', 'dev-python/python-mpd' : 'python-mpd', 'dev-python/python-openid' : 'python-openid', 'dev-python/python-ptrace' : 'python-ptrace', 'dev-python/pytools' : 'pytools', 'dev-python/pytz' : 'pytz', 'dev-python/pyudev' : 'pyudev', 'dev-python/pywavelets' : 'PyWavelets', 'dev-python/pywebdav' : 'pywebdav', 'dev-python/pyyaml' : 'pyyaml', 'dev-python/rdflib' : 'rdflib', 'dev-python/reportlab' : 'ReportLab', 'dev-python/restrictedpython' : 'RestrictedPython', 'dev-python/reverend' : 'Reverend', 'dev-python/rlcompleter2' : 'rlcompleter2', 'dev-python/rope' : 'rope', 'dev-python/ropeide' : 'ropeide', 'dev-python/routes' : 'Routes', 'dev-python/rpy' : 'rpy', 'dev-python/rst2pdf' : 'rst2pdf', 'dev-python/setproctitle' : 'setproctitle', 'dev-python/setupdocs' : 'SetupDocs', 'dev-python/setuptools' : 'distribute', 'dev-python/simplejson' : 'simplejson', 'dev-python/simpleparse' : 'simpleparse', 'dev-python/simplesettings' : 'simplesettings', 'dev-python/simpletal' : 'SimpleTAL', 'dev-python/sip' : 'sip', 'dev-python/sphinx' : 'Sphinx', 'dev-python/spyder' : 'spyder', 'dev-python/sqlalchemy' : 'SQLAlchemy', 'dev-python/sqlalchemy-migrate' : 'sqlalchemy-migrate', 'dev-python/sqlobject' : 'SQLObject', 'dev-python/stomper' : 'stomper', 'dev-python/storm' : 'storm', 'dev-python/subunit' : 'subunit', 'dev-python/subvertpy' : 'subvertpy', 'dev-python/tagpy' : 'tagpy', 'dev-python/tempita' : 'Tempita', 'dev-python/testoob' : 'testoob', 'dev-python/testtools' : 'testtools', 'dev-python/tgmochikit' : 'tgMochiKit', 'dev-python/timelib' : 'timelib', 'dev-python/traits' : 'Traits', 'dev-python/traitsbackendqt' : 'TraitsBackendQt', 'dev-python/traitsbackendwx' : 'TraitsBackendWX', 'dev-python/traitsgui' : 'TraitsGUI', 'dev-python/ttfquery' : 'TTFQuery', 'dev-python/turbocheetah' : 'TurboCheetah', 'dev-python/turbojson' : 'TurboJson', 'dev-python/turbokid' : 'TurboKid', 'dev-python/twisted' : 'twisted', 'dev-python/unittest2' : 'unittest2', 'dev-python/urwid' : 'urwid', 'dev-python/weberror' : 'WebError', 'dev-python/webhelpers' : 'WebHelpers', 'dev-python/webob' : 'WebOb', 'dev-python/webpy' : 'web.py', 'dev-python/webtest' : 'WebTest', 'dev-python/werkzeug' : 'werkzeug', 'dev-python/vertex' : 'Vertex', 'dev-python/winpdb' : 'winpdb', 'dev-python/virtualenv' : 'virtualenv', 'dev-python/vobject' : 'vobject', 'dev-python/workingenv' : 'workingenv.py', 'dev-python/wtforms' : 'WTForms', 'dev-python/xlrd' : 'xlrd', 'dev-python/xlwt' : 'xlwt', 'dev-python/yolk' : 'yolk', 'dev-python/yolk-portage' : 'yolk-portage', 'dev-util/buildbot' : 'buildbot', 'dev-util/pida' : 'pida', 'dev-vcs/hg-git' : 'hg-git', 'dev-vcs/hgsubversion' : 'hgsubversion', 'dev-vcs/hgsvn' : 'hgsvn', 'media-gfx/pydot' : 'pydot', 'media-libs/mutagen' : 'mutagen', 'net-misc/orbited' : 'orbited', 'net-news/rawdog' : 'rawdog', 'net-zope/accesscontrol' : 'AccessControl', 'net-zope/acquisition' : 'Acquisition', 'net-zope/datetime' : 'DateTime', 'net-zope/documenttemplate' : 'DocumentTemplate', 'net-zope/extensionclass' : 'ExtensionClass', 'net-zope/five-formlib' : 'five.formlib', 'net-zope/initgroups' : 'initgroups', 'net-zope/missing' : 'Missing', 'net-zope/multimapping' : 'MultiMapping', 'net-zope/persistence' : 'Persistence', 'net-zope/record' : 'Record', 'net-zope/zc-buildout' : 'zc.buildout', 'net-zope/zc-lockfile' : 'zc.lockfile', 'net-zope/zconfig' : 'ZConfig', 'net-zope/zdaemon' : 'zdaemon', 'net-zope/zexceptions' : 'zExceptions', 'net-zope/zlog' : 'zLOG', 'net-zope/zodb' : 'ZODB3', 'net-zope/zope' : 'zope', 'net-zope/zope-annotation' : 'zope.annotation', 'net-zope/zope-app-appsetup' : 'zope.app.appsetup', 'net-zope/zope-app-basicskin' : 'zope.app.basicskin', 'net-zope/zope-app-debug' : 'zope.app.debug', 'net-zope/zope-app-dependable' : 'zope.app.dependable', 'net-zope/zope-app-form' : 'zope.app.form', 'net-zope/zope-app-pagetemplate' : 'zope.app.pagetemplate', 'net-zope/zope-app-publication' : 'zope.app.publication', 'net-zope/zope-app-publisher' : 'zope.app.publisher', 'net-zope/zope-app-schema' : 'zope.app.schema', 'net-zope/zope-app-testing' : 'zope.app.testing', 'net-zope/zope-authentication' : 'zope.authentication', 'net-zope/zope-broken' : 'zope.broken', 'net-zope/zope-browser' : 'zope.browser', 'net-zope/zope-browsermenu' : 'zope.browsermenu', 'net-zope/zope-browserpage' : 'zope.browserpage', 'net-zope/zope-browserresource' : 'zope.browserresource', 'net-zope/zope-cachedescriptors' : 'zope.cachedescriptors', 'net-zope/zope-component' : 'zope.component', 'net-zope/zope-componentvocabulary' : 'zope.componentvocabulary', 'net-zope/zope-configuration' : 'zope.configuration', 'net-zope/zope-container' : 'zope.container', 'net-zope/zope-contentprovider' : 'zope.contentprovider', 'net-zope/zope-contenttype' : 'zope.contenttype', 'net-zope/zope-copy' : 'zope.copy', 'net-zope/zope-datetime' : 'zope.datetime', 'net-zope/zope-deferredimport' : 'zope.deferredimport', 'net-zope/zope-dottedname' : 'zope.dottedname', 'net-zope/zope-dublincore' : 'zope.dublincore', 'net-zope/zope-error' : 'zope.error', 'net-zope/zope-event' : 'zope.event', 'net-zope/zope-exceptions' : 'zope.exceptions', 'net-zope/zope-filerepresentation' : 'zope.filerepresentation', 'net-zope/zope-fixers' : 'zope.fixers', 'net-zope/zope-formlib' : 'zope.formlib', 'net-zope/zope-hookable' : 'zope.hookable', 'net-zope/zope-i18n' : 'zope.i18n', 'net-zope/zope-i18nmessageid' : 'zope.i18nmessageid', 'net-zope/zope-interface' : 'zope.interface', 'net-zope/zope-lifecycleevent' : 'zope.lifecycleevent', 'net-zope/zope-location' : 'zope.location', 'net-zope/zope-minmax' : 'zope.minmax', 'net-zope/zope-mkzeoinstance' : 'zope.mkzeoinstance', 'net-zope/zope-pagetemplate' : 'zope.pagetemplate', 'net-zope/zope-password' : 'zope.password', 'net-zope/zope-processlifetime' : 'zope.processlifetime', 'net-zope/zope-proxy' : 'zope.proxy', 'net-zope/zope-ptresource' : 'zope.ptresource', 'net-zope/zope-publisher' : 'zope.publisher', 'net-zope/zope-schema' : 'zope.schema', 'net-zope/zope-security' : 'zope.security', 'net-zope/zope-sendmail' : 'zope.sendmail', 'net-zope/zope-sequencesort' : 'zope.sequencesort', 'net-zope/zope-session' : 'zope.session', 'net-zope/zope-size' : 'zope.size', 'net-zope/zope-site' : 'zope.site', 'net-zope/zopeskel' : 'ZopeSkel', 'net-zope/zope-structuredtext' : 'zope.structuredtext', 'net-zope/zope-tal' : 'zope.tal', 'net-zope/zope-tales' : 'zope.tales', 'net-zope/zope-testbrowser' : 'zope.testbrowser', 'net-zope/zope-testing' : 'zope.testing', 'net-zope/zope-traversing' : 'zope.traversing', 'net-zope/zopeundo' : 'ZopeUndo', 'net-zope/zope-viewlet' : 'zope.viewlet', 'net-zope/tempstorage' : 'tempstorage', 'net-zope/threadlock' : 'ThreadLock', 'net-zope/transaction' : 'transaction', 'sci-astronomy/pyephem' : 'pyephem', 'sci-biology/biopython' : 'biopython', 'sci-libs/scipy' : 'scipy', 'sci-visualization/mayavi' : 'Mayavi', 'sci-visualization/veusz' : 'veusz', 'www-apps/roundup' : 'roundup', 'x11-libs/xpyb' : 'xpyb' } # Url for fetching version information url = 'http://pypi.python.org/pypi?:action=index' def __init__(self): pass def fetch_and_parse_all(self): """Download and parse package version information.""" items = {} f = urllib.urlopen(self.url) #f = open('utils/pypi.html') if f: data = fromstring(f.read()).cssselect('table.list')[0] for row in data.getchildren(): val = row[0].getchildren() if len(val) > 0: pkg = val[0].text.encode('utf-8').split('\xc2\xa0') if len(pkg) == 2: if pkg[0] not in items.keys(): items[pkg[0]] = [] items[pkg[0]].append(pkg[1]) f.close() return items if __name__ == '__main__': print pypi_checker().fetch_and_parse_all()