aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2013-06-08 11:51:21 -0400
committerJason R. Coombs <jaraco@jaraco.com>2013-06-08 11:51:21 -0400
commit1541dc716cc580c95883347832b689d3b8eb009b (patch)
tree5ad4d864961e6fafff1b2eb1f46d9fcf2b0fc769
parent34160eb2ed3da6bf4f57c882ccdd5d6fab3bc76b (diff)
downloadexternal_python_setuptools-1541dc716cc580c95883347832b689d3b8eb009b.tar.gz
external_python_setuptools-1541dc716cc580c95883347832b689d3b8eb009b.tar.bz2
external_python_setuptools-1541dc716cc580c95883347832b689d3b8eb009b.zip
Use markerlib for markers in 'extras'
-rw-r--r--CHANGES.txt1
-rw-r--r--pkg_resources.py88
2 files changed, 10 insertions, 79 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index a7bf1ac6..0a679ec3 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -6,6 +6,7 @@ CHANGES
0.7.2
-----
+* Issue #14: Prefer markerlib for evaluation of marker expressions in extras.
* Issue #10: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.
-----
diff --git a/pkg_resources.py b/pkg_resources.py
index ea6cf8bb..cdd732d2 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -1211,86 +1211,16 @@ def invalid_marker(text):
return sys.exc_info()[1]
return False
-def evaluate_marker(text, extra=None, _ops={}):
+def evaluate_marker(text):
"""Evaluate a PEP 426 environment marker; SyntaxError if marker is invalid"""
-
- if not _ops:
-
- from token import NAME, STRING
- import token, symbol, operator
-
- def and_test(nodelist):
- # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
- return reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])
-
- def test(nodelist):
- # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
- return reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])
-
- def atom(nodelist):
- t = nodelist[1][0]
- if t == token.LPAR:
- if nodelist[2][0] == token.RPAR:
- raise SyntaxError("Empty parentheses")
- return interpret(nodelist[2])
- raise SyntaxError("Language feature not supported in environment markers")
-
- def comparison(nodelist):
- if len(nodelist)>4:
- raise SyntaxError("Chained comparison not allowed in environment markers")
- comp = nodelist[2][1]
- cop = comp[1]
- if comp[0] == NAME:
- if len(nodelist[2]) == 3:
- if cop == 'not':
- cop = 'not in'
- else:
- cop = 'is not'
- try:
- cop = _ops[cop]
- except KeyError:
- raise SyntaxError(repr(cop)+" operator not allowed in environment markers")
- return cop(evaluate(nodelist[1]), evaluate(nodelist[3]))
-
- _ops.update({
- symbol.test: test, symbol.and_test: and_test, symbol.atom: atom,
- symbol.comparison: comparison, 'not in': lambda x,y: x not in y,
- 'in': lambda x,y: x in y, '==': operator.eq, '!=': operator.ne,
- })
- if hasattr(symbol,'or_test'):
- _ops[symbol.or_test] = test
-
- def interpret(nodelist):
- while len(nodelist)==2: nodelist = nodelist[1]
- try:
- op = _ops[nodelist[0]]
- except KeyError:
- raise SyntaxError("Comparison or logical expression expected")
- raise SyntaxError("Language feature not supported in environment markers: "+symbol.sym_name[nodelist[0]])
- return op(nodelist)
-
- def evaluate(nodelist):
- while len(nodelist)==2: nodelist = nodelist[1]
- kind = nodelist[0]
- name = nodelist[1]
- #while len(name)==2: name = name[1]
- if kind==NAME:
- try:
- op = _marker_values[name]
- except KeyError:
- raise SyntaxError("Unknown name %r" % name)
- return op()
- if kind==STRING:
- s = nodelist[1]
- if s[:1] not in "'\"" or s.startswith('"""') or s.startswith("'''") \
- or '\\' in s:
- raise SyntaxError(
- "Only plain strings allowed in environment markers")
- return s[1:-1]
- raise SyntaxError("Language feature not supported in environment markers")
-
- import parser
- return interpret(parser.expr(text).totuple(1)[1])
+ import _markerlib
+ # markerlib implements Metadata 1.2 (PEP 345) environment markers.
+ # Translate the variables to Metadata 2.0 (PEP 426).
+ env = _markerlib.default_environment()
+ for key in env.keys():
+ new_key = key.replace('.', '_')
+ env[new_key] = env.pop(key)
+ return _markerlib.interpret(text, env)
class NullProvider: