Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
setuptools
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jérome Perrin
setuptools
Commits
1541dc71
Commit
1541dc71
authored
Jun 08, 2013
by
Jason R. Coombs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use markerlib for markers in 'extras'
parent
34160eb2
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
10 additions
and
79 deletions
+10
-79
CHANGES.txt
CHANGES.txt
+1
-0
pkg_resources.py
pkg_resources.py
+9
-79
No files found.
CHANGES.txt
View file @
1541dc71
...
@@ -6,6 +6,7 @@ CHANGES
...
@@ -6,6 +6,7 @@ CHANGES
0.7.2
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.
* Issue #10: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.
-----
-----
...
...
pkg_resources.py
View file @
1541dc71
...
@@ -1211,86 +1211,16 @@ def invalid_marker(text):
...
@@ -1211,86 +1211,16 @@ def invalid_marker(text):
return sys.exc_info()[1]
return sys.exc_info()[1]
return False
return False
def evaluate_marker(text
, extra=None, _ops={}
):
def evaluate_marker(text):
"""Evaluate a PEP 426 environment marker; SyntaxError if marker is invalid"""
"""Evaluate a PEP 426 environment marker; SyntaxError if marker is invalid"""
import _markerlib
if not _ops:
# markerlib implements Metadata 1.2 (PEP 345) environment markers.
# Translate the variables to Metadata 2.0 (PEP 426).
from token import NAME, STRING
env = _markerlib.default_environment()
import token, symbol, operator
for key in env.keys():
new_key = key.replace('.', '_')
def and_test(nodelist):
env[new_key] = env.pop(key)
# MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
return _markerlib.interpret(text, env)
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])
class NullProvider:
class NullProvider:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment