Skip to content

Commit 43aeaef

Browse files
authored
Merge pull request #285 from jayvdb/envmarker-monkeypatching
Monkeypatch pkg_resources to always use _markerlib; r=gsnedders
2 parents 14d4851 + 6cd93c8 commit 43aeaef

File tree

4 files changed

+48
-10
lines changed

4 files changed

+48
-10
lines changed

requirements-install.sh

-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ if [[ $USE_OPTIONAL != "true" && $USE_OPTIONAL != "false" ]]; then
55
exit 1
66
fi
77

8-
# Make sure we're running setuptools >= 18.5
9-
pip install -U pip setuptools>=18.5
10-
118
pip install -U -r requirements-test.txt
129

1310
if [[ $USE_OPTIONAL == "true" ]]; then

requirements-test.txt

-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,3 @@ flake8
44
pytest
55
pytest-expect>=1.1,<2.0
66
mock
7-
ordereddict ; python_version < '2.7'

requirements.txt

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
six
22
webencodings
33
ordereddict ; python_version < '2.7'
4-
setuptools>=18.5

setup.py

+48-5
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,54 @@
88
from setuptools import setup, find_packages, __version__ as setuptools_version
99
from pkg_resources import parse_version
1010

11-
if parse_version(setuptools_version) < parse_version("18.5"):
12-
print("html5lib requires setuptools version 18.5 or above; "
13-
"please upgrade before installing (you have %s)" % setuptools_version)
14-
sys.exit(1)
11+
import pkg_resources
12+
13+
try:
14+
import _markerlib.markers
15+
except ImportError:
16+
_markerlib = None
17+
18+
19+
# _markerlib.default_environment() obtains its data from _VARS
20+
# and wraps it in another dict, but _markerlib_evaluate writes
21+
# to the dict while it is iterating the keys, causing an error
22+
# on Python 3 only.
23+
# Replace _markerlib.default_environment to return a custom dict
24+
# that has all the necessary markers, and ignores any writes.
25+
26+
class Python3MarkerDict(dict):
27+
28+
def __setitem__(self, key, value):
29+
pass
30+
31+
def pop(self, i=-1):
32+
return self[i]
33+
34+
35+
if _markerlib and sys.version_info[0] == 3:
36+
env = _markerlib.markers._VARS
37+
for key in list(env.keys()):
38+
new_key = key.replace('.', '_')
39+
if new_key != key:
40+
env[new_key] = env[key]
41+
42+
_markerlib.markers._VARS = Python3MarkerDict(env)
43+
44+
def default_environment():
45+
return _markerlib.markers._VARS
46+
47+
_markerlib.default_environment = default_environment
48+
49+
# Avoid the very buggy pkg_resources.parser, which doesnt consistently
50+
# recognise the markers needed by this setup.py
51+
# Change this to setuptools 20.10.0 to support all markers.
52+
if pkg_resources:
53+
if parse_version(setuptools_version) < parse_version('18.5'):
54+
MarkerEvaluation = pkg_resources.MarkerEvaluation
55+
56+
del pkg_resources.parser
57+
pkg_resources.evaluate_marker = MarkerEvaluation._markerlib_evaluate
58+
MarkerEvaluation.evaluate_marker = MarkerEvaluation._markerlib_evaluate
1559

1660
classifiers = [
1761
'Development Status :: 5 - Production/Stable',
@@ -60,7 +104,6 @@
60104
install_requires=[
61105
'six',
62106
'webencodings',
63-
'setuptools>=18.5'
64107
],
65108
extras_require={
66109
# A empty extra that only has a conditional marker will be

0 commit comments

Comments
 (0)