diff env/lib/python3.7/site-packages/virtualenv/discovery/windows/pep514.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/virtualenv/discovery/windows/pep514.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-"""Implement https://www.python.org/dev/peps/pep-0514/ to discover interpreters - Windows only"""
-from __future__ import absolute_import, print_function, unicode_literals
-
-import os
-import re
-from logging import basicConfig, getLogger
-
-import six
-
-if six.PY3:
-    import winreg
-else:
-    # noinspection PyUnresolvedReferences
-    import _winreg as winreg
-
-LOGGER = getLogger(__name__)
-
-
-def enum_keys(key):
-    at = 0
-    while True:
-        try:
-            yield winreg.EnumKey(key, at)
-        except OSError:
-            break
-        at += 1
-
-
-def get_value(key, value_name):
-    try:
-        return winreg.QueryValueEx(key, value_name)[0]
-    except OSError:
-        return None
-
-
-def discover_pythons():
-    for hive, hive_name, key, flags, default_arch in [
-        (winreg.HKEY_CURRENT_USER, "HKEY_CURRENT_USER", r"Software\Python", 0, 64),
-        (winreg.HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", r"Software\Python", winreg.KEY_WOW64_64KEY, 64),
-        (winreg.HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", r"Software\Python", winreg.KEY_WOW64_32KEY, 32),
-    ]:
-        for spec in process_set(hive, hive_name, key, flags, default_arch):
-            yield spec
-
-
-def process_set(hive, hive_name, key, flags, default_arch):
-    try:
-        with winreg.OpenKeyEx(hive, key, 0, winreg.KEY_READ | flags) as root_key:
-            for company in enum_keys(root_key):
-                if company == "PyLauncher":  # reserved
-                    continue
-                for spec in process_company(hive_name, company, root_key, default_arch):
-                    yield spec
-    except OSError:
-        pass
-
-
-def process_company(hive_name, company, root_key, default_arch):
-    with winreg.OpenKeyEx(root_key, company) as company_key:
-        for tag in enum_keys(company_key):
-            spec = process_tag(hive_name, company, company_key, tag, default_arch)
-            if spec is not None:
-                yield spec
-
-
-def process_tag(hive_name, company, company_key, tag, default_arch):
-    with winreg.OpenKeyEx(company_key, tag) as tag_key:
-        version = load_version_data(hive_name, company, tag, tag_key)
-        if version is not None:  # if failed to get version bail
-            major, minor, _ = version
-            arch = load_arch_data(hive_name, company, tag, tag_key, default_arch)
-            if arch is not None:
-                exe_data = load_exe(hive_name, company, company_key, tag)
-                if exe_data is not None:
-                    exe, args = exe_data
-                    name = str("python") if company == "PythonCore" else company
-                    return name, major, minor, arch, exe, args
-
-
-def load_exe(hive_name, company, company_key, tag):
-    key_path = "{}/{}/{}".format(hive_name, company, tag)
-    try:
-        with winreg.OpenKeyEx(company_key, r"{}\InstallPath".format(tag)) as ip_key:
-            with ip_key:
-                exe = get_value(ip_key, "ExecutablePath")
-                if exe is None:
-                    ip = get_value(ip_key, None)
-                    if ip is None:
-                        msg(key_path, "no ExecutablePath or default for it")
-
-                    else:
-                        exe = os.path.join(ip, str("python.exe"))
-                if exe is not None and os.path.exists(exe):
-                    args = get_value(ip_key, "ExecutableArguments")
-                    return exe, args
-                else:
-                    msg(key_path, "exe does not exists {}".format(key_path, exe))
-    except OSError:
-        msg("{}/{}".format(key_path, "InstallPath"), "missing")
-    return None
-
-
-def load_arch_data(hive_name, company, tag, tag_key, default_arch):
-    arch_str = get_value(tag_key, "SysArchitecture")
-    if arch_str is not None:
-        key_path = "{}/{}/{}/SysArchitecture".format(hive_name, company, tag)
-        try:
-            return parse_arch(arch_str)
-        except ValueError as sys_arch:
-            msg(key_path, sys_arch)
-    return default_arch
-
-
-def parse_arch(arch_str):
-    if isinstance(arch_str, six.string_types):
-        match = re.match(r"^(\d+)bit$", arch_str)
-        if match:
-            return int(next(iter(match.groups())))
-        error = "invalid format {}".format(arch_str)
-    else:
-        error = "arch is not string: {}".format(repr(arch_str))
-    raise ValueError(error)
-
-
-def load_version_data(hive_name, company, tag, tag_key):
-    for candidate, key_path in [
-        (get_value(tag_key, "SysVersion"), "{}/{}/{}/SysVersion".format(hive_name, company, tag)),
-        (tag, "{}/{}/{}".format(hive_name, company, tag)),
-    ]:
-        if candidate is not None:
-            try:
-                return parse_version(candidate)
-            except ValueError as sys_version:
-                msg(key_path, sys_version)
-    return None
-
-
-def parse_version(version_str):
-    if isinstance(version_str, six.string_types):
-        match = re.match(r"^(\d+)(?:\.(\d+))?(?:\.(\d+))?$", version_str)
-        if match:
-            return tuple(int(i) if i is not None else None for i in match.groups())
-        error = "invalid format {}".format(version_str)
-    else:
-        error = "version is not string: {}".format(repr(version_str))
-    raise ValueError(error)
-
-
-def msg(path, what):
-    LOGGER.warning("PEP-514 violation in Windows Registry at {} error: {}".format(path, what))
-
-
-def _run():
-    basicConfig()
-    interpreters = []
-    for spec in discover_pythons():
-        interpreters.append(repr(spec))
-    print("\n".join(sorted(interpreters)))
-
-
-if __name__ == "__main__":
-    _run()