Jens W. Klein wrote:
Am Wed, 24 Jun 2009 09:59:14 -0400 schrieb Tres Seaver:
[..]
Missing is a version fixation like done in ZTK, Grok, Plone, ... I'd
really like to see such a version.cfg for each repoze release. Creation
could be automated.
You shouldn't need to pin the versions if you would use the index as an
index:

   index = http://dist.repoze.org/bfg/1.0/simple

That index is a "known good set" for the 1.0 release line of BFG.

If one uses only stuff from the given index it works. Now, using stuff from pypi like repoze.what make live difficult using an own index server.

I agree it's useful to have a versions.cfg, so I wrote a WSGI script that generates a versions.cfg from a package index. I have attached it. It probably needs some battle testing and TLC.

Shane

URI = 'http://dist.repoze.org/bfg/1.0/'

import lxml.html
import os
import pkg_resources
import urlparse

def application(environ, start_response):
    packages = get_index_versions(URI)
    lines = ['[versions]']
    for pkg_name, version in sorted(packages.items()):
        lines.append('%s = %s' % (pkg_name, version))
    text = '\n'.join(lines)
    start_response([
        ('Content-Type', 'text/plain'),
        ('Content-Length', str(len(text))),
        ])
    return [text]

def get_index_versions(uri):
    packages = {}  # pkg_name -> [(parsed version, version)]
    doc = lxml.html.parse(uri)
    for e in doc.findall('//a'):
        href = e.get('href')
        if not href:
            continue
        path = urlparse.urlsplit(href)[2]
        parts = filter(None, path.split('/'))
        if not parts:
            continue
        basename, ext = os.path.splitext(parts[-1])
        ext = ext.lower()
        if ext == '.egg':
            # remove the '-pyX.Y-Z' suffixes
            basename = '-'.join(basename.split('-')[:-2])
        elif ext in ('.gz', '.bz2'):
            basename, ext = os.path.splitext(basename)
            ext = ext.lower()
        if ext not in ('.tar', '.zip', '.egg', '.tgz', '.tbz2'):
            continue
        pkg_name, version = basename.split('-', 1)
        parsed_version = pkg_resources.parse_version(version)
        versions = packages.setdefault(pkg_name, [])
        versions.append((parsed_version, version))
    res = {}
    for pkg_name, versions in packages.items():
        versions.sort()
        res[pkg_name] = versions[-1][1]
    return res

if __name__ == '__main__':
    print ''.join(application({}, lambda headers: None))
_______________________________________________
Repoze-dev mailing list
Repoze-dev@lists.repoze.org
http://lists.repoze.org/listinfo/repoze-dev

Reply via email to