Add parameter sys_version to _sys_version().

Change the cache for _sys_version() to take the parameter into account.

Add support for parsing the IronPython 1.0.1 sys.version value - even
though it still returns '1.0.0'; the version string no longer includes
the patch level.
This commit is contained in:
Marc-André Lemburg 2007-01-13 22:32:21 +00:00
parent 4b86f8b88b
commit 2be9d43c18
1 changed files with 47 additions and 16 deletions

View File

@ -1201,9 +1201,10 @@ _ironpython_sys_version_parser = re.compile(
'([\d\.]+)'
'(?: \(([\d\.]+)\))?'
' on (.NET [\d\.]+)')
_sys_version_cache = None
def _sys_version():
_sys_version_cache = {}
def _sys_version(sys_version=None):
""" Returns a parsed version of Python's sys.version as tuple
(name, version, branch, revision, buildno, builddate, compiler)
@ -1218,21 +1219,30 @@ def _sys_version():
The function returns empty strings for tuple entries that
cannot be determined.
sys_version may be given to parse an alternative version
string, e.g. if the version was read from a different Python
interpreter.
"""
global _sys_version_cache
# Get the Python version
if sys_version is None:
sys_version = sys.version
if _sys_version_cache is not None:
return _sys_version_cache
# Try the cache first
result = _sys_version_cache.get(sys_version, None)
if result is not None:
return result
if sys.version[:10] == 'IronPython':
# Parse it
if sys_version[:10] == 'IronPython':
# IronPython
name = 'IronPython'
match = _ironpython_sys_version_parser.match(sys.version)
match = _ironpython_sys_version_parser.match(sys_version)
if match is None:
raise ValueError(
'failed to parse IronPython sys.version: %s' %
repr(sys.version))
version, compiler = match.groups()
repr(sys_version))
version, alt_version, compiler = match.groups()
branch = ''
revision = ''
buildno = ''
@ -1241,11 +1251,11 @@ def _sys_version():
elif sys.platform[:4] == 'java':
# Jython
name = 'Jython'
match = _jython_sys_version_parser.match(sys.version)
match = _jython_sys_version_parser.match(sys_version)
if match is None:
raise ValueError(
'failed to parse Jython sys.version: %s' %
repr(sys.version))
repr(sys_version))
version, = match.groups()
branch = ''
revision = ''
@ -1255,27 +1265,47 @@ def _sys_version():
else:
# CPython
match = _sys_version_parser.match(sys.version)
match = _sys_version_parser.match(sys_version)
if match is None:
raise ValueError(
'failed to parse CPython sys.version: %s' %
repr(sys.version))
repr(sys_version))
version, buildno, builddate, buildtime, compiler = \
match.groups()
if hasattr(sys, 'subversion'):
# sys.subversion was added in Python 2.5
name, branch, revision = sys.subversion
else:
name = 'CPython'
branch = ''
revision = ''
builddate = builddate + ' ' + buildtime
# Add the patchlevel version if missing
l = string.split(version, '.')
if len(l) == 2:
l.append('0')
version = string.join(l, '.')
_sys_version_cache = (name, version, branch, revision, buildno,
builddate, compiler)
return _sys_version_cache
# Build and cache the result
result = (name, version, branch, revision, buildno, builddate, compiler)
_sys_version_cache[sys_version] = result
return result
def _test_sys_version():
_sys_version_cache.clear()
for input, output in (
('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]',
('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')),
('IronPython 1.0.60816 on .NET 2.0.50727.42',
('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')),
('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42',
('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')),
):
parsed = _sys_version(input)
if parsed != output:
print (input, parsed)
def python_implementation():
@ -1325,6 +1355,7 @@ def python_branch():
If not available, an empty string is returned.
"""
return _sys_version()[2]
def python_revision():