[Distutils] Splitting distribute in several distributions
Sridhar Ratnakumar
SridharR at activestate.com
Wed Aug 12 03:00:36 CEST 2009
On Tue, 11 Aug 2009 17:44:01 -0700, Tarek Ziadé <ziade.tarek at gmail.com>
wrote:
> 2009/8/12 Sridhar Ratnakumar <SridharR at activestate.com>:
>> I am glad that you have started thinking about the module split.
>>
>> 1) Why are the distributions named in CamelCase? Why not
>> 'distribute.resources' instead of 'DistributeResources' (like, for
>> instance,
>> zope.interface instead of ZopeInterface).
> Because the distribution name is not the packages names.
> See for instance the Paste project : PasteScript, Paste, PasteDeploy.
Ok. So there are apparently two conventions for naming distributions.
However, zope.*, zc.*, z3c.* fall under more wide-namespaces (zope is a
large namespace with many sub-packages).
>> 2) In your proposal below, version comparison is part of
>> distribute.installer; this means distribute.resources (and other modules
>> needing version comparison) will be depending on distribute.installer,
>> correct? Is this intended, or should version comparison go to something
>> like
>> distribute.core?
> When would distribute.resources need version comparisons if its sole
> role is to provide query APIs
> for installed packages ? (pre-PEP 376, then PEP 376-compliant)
When multiple versions of a same package are installed, then perhaps
distribute.resources might have to return them in sorted order .. but,
well, I am not aware about the querying API yet .. so cannot say for sure.
Further, if you implement distribute.pypi .. then that too would require
version comparison, would it not? In that case, distribute.pypi would
depend upon distribute.installer .. and vice versa, I suppose, leading to
circular dependencies. Eg:
distribute.pypi.Distribution.find('PasteScript').get_releases() may have
to return the releases in sorted order (by version number).
There must be a reason why PJE kept parts of setuptools in
pkg_resources.py. What is it? We may have to consider it before splitting
pkg_resources.py itself.
>> 3) PyPM's backend uses a) pkg_resources' version comparison, b)
>> package_index's download logic (not API-friendly). I'd be interested to
>> see
>> distribute.installer provide this download logic (finding URLs,
>> tarballs and
>> fetching them) as an API. I believe pip and zc.buildout too relies on
>> this
>> download logic.
> pakage_index would be included in distribute.installer, and we could
> probably
> add simpler APIs to use it to drive a download
Note that package_index is not API-friendly. A few violations I can
think of: 1) it prints warning messages to stderr without programmer
control, 2) throws random network exceptions that should be handled in a
custom exception (see the issues I reported in distribute tracker) 3) no
ability to control URL types (eg: I want to fetch only tarballs/zipfiles,
not svn/hg/etc..) and so on.
This is roughly the code I currently use in PyPM (that uses setuptools):
(...)
class PackageIndex2(PackageIndex):
def _download_svn(self, url, filename):
raise SVNDisabled, 'svn not allowed at the moment'
(...)
def download_latest_sdist(req, directory):
(...)
# TODO: we need timeout on network operations (not just socket
timeouts)
try:
sdist = pi.fetch_distribution(req, directory, source=True)
except (DistutilsError, httplib.BadStatusLine, socket.timeout), e:
# catch BadStatusLine:
http://bitbucket.org/tarek/distribute/issue/18/
raise PackageError, e
if sdist == None:
raise SdistMissing, 'cannot find a sdist for %s' % req
if not exists(sdist.location):
raise SdistLocationMissing, 'downloaded sdist <%s> missing' %
sdist.location
return sdist
-srid
More information about the Distutils-SIG
mailing list