[Distutils] PEP 345: real-world examples of "virtual" projects (Provides-Release)
Sridhar Ratnakumar
sridharr at activestate.com
Thu Dec 23 19:13:14 CET 2010
Marius Gedminas wrote:
> On Tue, Dec 21, 2010 at 01:41:55PM -0800, Sridhar Ratnakumar wrote:
>> > Fromhttps://bitbucket.org/ametaireau/python-peps/src/tip/pep-0345.txt
>> >
>> > """
>> > Provides-Release (multiple use)
>> > :::::::::::::::::::::::::::::::
>> > [...]
>> > A release may also provide a "virtual" project name, which does
>> > not correspond to any separately-distributed project: such a name
>> > might be used to indicate an abstract capability which could be supplied
>> > by one of multiple projects. E.g., multiple projects might supply
>> > RDBMS bindings for use by a given ORM: each project might declare
>> > that it provides ``ORM-bindings``, allowing other projects to depend
>> > only on having at most one of them installed.
>> > """
>
> Perhaps it was supposed to say "depend only on having at*least* one of
> them installed"?
> That would be how Debian's virtual packages work, for example.
From http://www.debian.org/doc/FAQ/ch-pkg_basics.en.html#s-virtual
"A [Debian] virtual package is a generic name that applies to any one of
a group of packages, all of which provide similar basic functionality.
For example, both the tin and trn programs are news readers, and should
therefore satisfy any dependency of a program that required a news
reader on a system, in order to work or to be useful. They are therefore
both said to provide the "virtual package" called news-reader."
Is there a real-world example (in Python packaging) requiring such a
constraint?
...
To me, only "at most one of them installed" makes sense ... and *only*
for binary distributions (except 'setuptools' being provided by
Distribute), viz.
[quote]
4. Personally, I have needs for "virtual" packages from a binary (not
source) distribution perspective. For example, "MySQL-python" can be a
virtual package "provided by" the binary distributions: mysql5.1-python,
mysql5.0-python; similarly, "psycopg2" can be provided by psycopg2-pg8.4
and psycopg2-pg9.0. Or, "modwsgi" can be provided by modwsgi-apache2.2,
modwsgi-apache2.4. How would PEP 345's "Provides-Release" help, if at
all, in describing this scenario?
[endquote]
Just to provide a context, I'd like to add support for virtual packages
in PyPM[1] to facilitate providing such binary variants as above for
some Python packages. And I'd like to understand and stick to the
standards[2] as much as possible (instead of designing a proprietary
metadata extension).
...
This is how I understand the PEP:
$ cat psycopg2-pg9.0/DIST-INFO # binary
[...]
Version: 2.3.1
Provides-Release: psycopg2
$ cat psycopg2/DIST-INFO # source
[...]
Version: 2.2.9
Provides-Release: psycopg2
$ cat pgbrowser/DIST-INFO # source
Requires-Release: psycopg2 (>=2.3)
This is what I asked in regards to installing such a virtual package:
[quote]
2. What is the expected behavior of 'pip install ORM-bindings'? To pick
*one* of the many projects "providing" ORM-bindings?
[endquote] (emphasis added)
How is 'pip install pgbrowser'[3] expected resolve the `psycopg2'
dependency (it may not know yet that it is a virtual package)? I have an
idea as to how to do this in binary package repositories (such as those
of PyPM):
1. Index the `Provides-Release` field of all packages
2. If `Provides-Release` is missing, use the name of the distribution
itself
3. Resolve dependencies (and requests from user) by looking
at this `Provides` index, not the package *name* index.
For PyPI - step 3. will require, at the least, Simple Index to expose
"provides" in URLs, eg:
pypi.python.org/simple/@P/psycopg2
pypi.python.org/simple/@P/psycopg2/psycopg2-pg9.0-2.3.1.win32.egg
pypi.python.org/simple/@P/psycopg2/psycopg2-2.2.9.tar.gz
So `pip install pgbrowser` will have to resolve the dependency of
psycopg2 by looking at /simple/@P/psycopg2, but *not* /simple/psycopg2.
Further, how would pip know that "psycopg2-pg9.0-2.3.1.win32.egg" is
indeed the appropriate platform binary? The `Supported-Platform` field
would be useless to package installers as the PEP does not specify its
semantics (I wonder why it exists in first place).
Did I misunderstand anything? Has anyone thought of all this in regards
to PEP 345?
-srid
[1] http://code.activestate.com/pypm/
[2] I just incorporated "environment markers" support.
[3] I use `pip` only as an example; substitute it with any package installer
More information about the Distutils-SIG
mailing list