diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2013-06-08 11:51:21 -0400 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2013-06-08 11:51:21 -0400 |
commit | 1541dc716cc580c95883347832b689d3b8eb009b (patch) | |
tree | 5ad4d864961e6fafff1b2eb1f46d9fcf2b0fc769 | |
parent | 34160eb2ed3da6bf4f57c882ccdd5d6fab3bc76b (diff) | |
download | external_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.txt | 1 | ||||
-rw-r--r-- | pkg_resources.py | 88 |
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: |