'test_fail_if_path_exists' : ('function',),
}
-def parse_directive_value(name, value):
+def parse_directive_value(name, value, relaxed_bool=False):
"""
Parses value as an option value for the given name and returns
the interpreted value. None is returned if the option does not exist.
type = directive_types.get(name)
if not type: return None
if type is bool:
- if value == "True": return True
- elif value == "False": return False
- else: raise ValueError("%s directive must be set to True or False" % name)
+ value = str(value)
+ if value == 'True': return True
+ if value == 'False': return False
+ if relaxed_bool:
+ value = value.lower()
+ if value in ("true", "yes"): return True
+ elif value in ("false", "no"): return False
+ raise ValueError("%s directive must be set to True or False" % name)
elif type is int:
try:
return int(value)
else:
assert False
-def parse_directive_list(s):
+def parse_directive_list(s, relaxed_bool=False):
"""
Parses a comma-seperated list of pragma options. Whitespace
is not considered.
>>> parse_directive_list('boundscheck=hey')
Traceback (most recent call last):
...
- ValueError: Must pass a boolean value for option "boundscheck"
+ ValueError: boundscheck directive must be set to True or False
>>> parse_directive_list('unknown=True')
Traceback (most recent call last):
...
item = item.strip()
if not item: continue
if not '=' in item: raise ValueError('Expected "=" in option "%s"' % item)
- name, value = item.strip().split('=')
- try:
- type = directive_types[name]
- except KeyError:
+ name, value = [ s.strip() for s in item.strip().split('=', 1) ]
+ parsed_value = parse_directive_value(name, value, relaxed_bool=relaxed_bool)
+ if parsed_value is None:
raise ValueError('Unknown option: "%s"' % name)
- if type is bool:
- value = value.lower()
- if value in ('true', 'yes'):
- value = True
- elif value in ('false', 'no'):
- value = False
- else: raise ValueError('Must pass a boolean value for option "%s"' % name)
- result[name] = value
- else:
- assert False
+ result[name] = parsed_value
return result
repr(s.sy), repr(s.systring)))
return body
-COMPILER_DIRECTIVE_COMMENT_RE = re.compile(r"^#\s*cython:\s*(\w+)\s*=(.*)$")
+COMPILER_DIRECTIVE_COMMENT_RE = re.compile(r"^#\s*cython:\s*(\w+\s*=.*)$")
def p_compiler_directive_comments(s):
result = {}
while s.sy == 'commentline':
m = COMPILER_DIRECTIVE_COMMENT_RE.match(s.systring)
if m:
- name = m.group(1)
+ directives = m.group(1).strip()
try:
- value = Options.parse_directive_value(str(name), str(m.group(2).strip()))
- if value is not None: # can be False!
- result[name] = value
+ result.update( Options.parse_directive_list(directives) )
except ValueError, e:
s.error(e.args[0], fatal=False)
s.next()