[pypy-commit] pypy default: Fix conftest to recognize both the old and the new format of --info,
arigo
noreply at buildbot.pypy.org
Wed May 9 09:42:26 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r54981:e63b94fbd72b
Date: 2012-05-09 09:42 +0200
http://bitbucket.org/pypy/pypy/changeset/e63b94fbd72b/
Log: Fix conftest to recognize both the old and the new format of --info,
based on a function that parses either.
diff --git a/lib-python/conftest.py b/lib-python/conftest.py
--- a/lib-python/conftest.py
+++ b/lib-python/conftest.py
@@ -18,6 +18,7 @@
from pypy.tool.pytest import appsupport
from pypy.tool.pytest.confpath import pypydir, testdir, testresultdir
+from pypy.config.parse import parse_info
pytest_plugins = "resultlog",
rsyncdirs = ['.', '../pypy/']
@@ -599,8 +600,9 @@
# check modules
info = py.process.cmdexec("%s --info" % execpath)
+ info = parse_info(info)
for mod in regrtest.usemodules:
- if "objspace.usemodules.%s: False" % mod in info:
+ if info.get('objspace.usemodules.%s' % mod) is not True:
py.test.skip("%s module not included in %s" % (mod,
execpath))
diff --git a/pypy/config/parse.py b/pypy/config/parse.py
new file mode 100644
--- /dev/null
+++ b/pypy/config/parse.py
@@ -0,0 +1,55 @@
+
+
+def parse_info(text):
+ """See test_parse.py."""
+ text = text.lstrip()
+ result = {}
+ if text.startswith('['):
+ # new format
+ current = {0: ''}
+ indentation_prefix = None
+ for line in text.splitlines():
+ line = line.rstrip()
+ if not line:
+ continue
+ realline = line.lstrip()
+ indent = len(line) - len(realline)
+ #
+ # 'indentation_prefix' is set when the previous line was a [group]
+ if indentation_prefix is not None:
+ assert indent > max(current) # missing indent?
+ current[indent] = indentation_prefix
+ indentation_prefix = None
+ #
+ else:
+ # in case of dedent, must kill the extra items from 'current'
+ for n in current.keys():
+ if n > indent:
+ del current[n]
+ #
+ prefix = current[indent] # KeyError if bad dedent
+ #
+ if realline.startswith('[') and realline.endswith(']'):
+ indentation_prefix = prefix + realline[1:-1] + '.'
+ else:
+ # build the whole dotted key and evaluate the value
+ i = realline.index(' = ')
+ key = prefix + realline[:i]
+ value = realline[i+3:]
+ value = eval(value, {})
+ result[key] = value
+ #
+ else:
+ # old format
+ for line in text.splitlines():
+ i = line.index(':')
+ key = line[:i].strip()
+ value = line[i+1:].strip()
+ try:
+ value = int(value)
+ except ValueError:
+ if value in ('True', 'False', 'None'):
+ value = eval(value, {})
+ result[key] = value
+ #
+ return result
diff --git a/pypy/config/test/test_parse.py b/pypy/config/test/test_parse.py
new file mode 100644
--- /dev/null
+++ b/pypy/config/test/test_parse.py
@@ -0,0 +1,35 @@
+from pypy.config.parse import parse_info
+
+
+def test_parse_new_format():
+ assert (parse_info("[foo]\n"
+ " bar = True\n")
+ == {'foo.bar': True})
+
+ assert (parse_info("[objspace]\n"
+ " x = 'hello'\n"
+ "[translation]\n"
+ " bar = 42\n"
+ " [egg]\n"
+ " something = None\n"
+ " foo = True\n")
+ == {
+ 'translation.foo': True,
+ 'translation.bar': 42,
+ 'translation.egg.something': None,
+ 'objspace.x': 'hello',
+ })
+
+def test_parse_old_format():
+ assert (parse_info(" objspace.allworkingmodules: True\n"
+ " objspace.disable_call_speedhacks: False\n"
+ " objspace.extmodules: None\n"
+ " objspace.name: std\n"
+ " objspace.std.prebuiltintfrom: -5\n")
+ == {
+ 'objspace.allworkingmodules': True,
+ 'objspace.disable_call_speedhacks': False,
+ 'objspace.extmodules': None,
+ 'objspace.name': 'std',
+ 'objspace.std.prebuiltintfrom': -5,
+ })
More information about the pypy-commit
mailing list