Skip to content

Commit

Permalink
make install of unpinned setuptools much quicker
Browse files Browse the repository at this point in the history
by patching `pkg_resources.Distribution`.
  • Loading branch information
gotcha committed May 9, 2020
1 parent 2aeca59 commit 20de921
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 2 deletions.
3 changes: 2 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ Change History
2.13.4 (unreleased)
===================

- Nothing changed yet.
- Patch ``pkg_resources.Distribution`` to make install of unpinned versions quicker.
Most obvious with ``setuptools``.


2.13.3 (2020-02-11)
Expand Down
4 changes: 3 additions & 1 deletion src/zc/buildout/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
##############################################################################
"""Buildout package
"""
import zc.buildout.patches # NOQA


class UserError(Exception):
"""Errors made by a user
"""Errors made by a user
"""

def __str__(self):
Expand Down
58 changes: 58 additions & 0 deletions src/zc/buildout/patches.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
##############################################################################
#
# Copyright (c) 2006 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################


def patch_Distribution():
try:
from pkg_resources import _remove_md5_fragment
from pkg_resources import Distribution

if hasattr(Distribution, 'location'):
return

# prepare any Distribution built before monkeypatch
from pkg_resources import working_set
for dist in working_set:
dist._location = dist.location
dist._location_without_md5 = _remove_md5_fragment(dist.location)

def hashcmp(self):
without_md5 = getattr(self, '_location_without_md5', '')
return (
self.parsed_version,
self.precedence,
self.key,
without_md5,
self.py_version or '',
self.platform or '',
)

def get_location(self):
try:
result = self._location
except AttributeError:
result = ''
return result

def set_location(self, l):
self._location = l
self._location_without_md5 = _remove_md5_fragment(l)

setattr(Distribution, 'location', property(get_location, set_location))
setattr(Distribution, 'hashcmp', property(hashcmp))
except ImportError:
return


patch_Distribution()

0 comments on commit 20de921

Please sign in to comment.