src/eric7/Utilities/__init__.py

branch
eric7-maintenance
changeset 9654
7328efba128b
parent 9549
67295777d9fe
parent 9653
e67609152c5e
child 9668
e37c1752d50e
--- a/src/eric7/Utilities/__init__.py	Thu Dec 01 10:18:07 2022 +0100
+++ b/src/eric7/Utilities/__init__.py	Mon Jan 02 11:16:03 2023 +0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2003 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+# Copyright (c) 2003 - 2023 Detlev Offenbach <detlev@die-offenbachs.de>
 #
 
 """
@@ -9,22 +9,12 @@
 
 import codecs
 import contextlib
-import ctypes
-import fnmatch
-import functools
-import getpass
 import glob
 import json
 import os
-import pathlib
 import re
 import shlex
-import subprocess  # secok
 import sys
-
-with contextlib.suppress(ImportError):
-    import pwd  # only available on Unix systems
-
 import warnings
 
 from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF32
@@ -38,7 +28,6 @@
     QByteArray,
     QCoreApplication,
     QCryptographicHash,
-    QDir,
     QProcess,
     qVersion,
 )
@@ -46,23 +35,74 @@
 from eric7 import Preferences
 from eric7.EricWidgets.EricApplication import ericApp
 
-# import these methods into the Utilities namespace
-from eric7.Globals import (  # __IGNORE_WARNING__
+# TODO: remove these with release 23.4
+# imports from eric7.SystemUtilities are for backward compatibility
+from eric7.Globals import (  # __IGNORE_FLAKES_WARNING__
     desktopName,
     getConfig,
     getConfigDir,
-    getPyQt6ModulesDirectory,
-    getPyQtToolsPath,
     getPythonExecutable,
     getPythonLibraryDirectory,
     getPythonScriptsDirectory,
-    getQtBinariesPath,
+    sessionType,
+    setConfigDir,
+    toBool,
+)
+from eric7.SystemUtilities import DesktopUtilities
+from eric7.SystemUtilities.FileSystemUtilities import (  # __IGNORE_FLAKES_WARNING__
+    absolutePath,
+    absoluteUniversalPath,
+    compactPath,
+    direntries,
+    findVolume,
+    fromNativeSeparators,
+    getDirs,
+    getExecutablePath,
+    getExecutablePaths,
+    getWindowsExecutablePath,
+    isDrive,
+    isExecutable,
+    isinpath,
+    joinext,
+    normabsjoinpath,
+    normcaseabspath,
+    normcasepath,
+    normjoinpath,
+    relativeUniversalPath,
+    samefilepath,
+    samepath,
+    splitPath,
+    startswithPath,
+    toNativeSeparators,
+)
+from eric7.SystemUtilities.OSUtilities import (  # __IGNORE_FLAKES_WARNING__
+    getEnvironmentEntry,
+    getHomeDir,
+    getUserName,
+    hasEnvironmentEntry,
     isLinuxPlatform,
     isMacPlatform,
     isWindowsPlatform,
+    win32_getRealName,
+    win32_GetUserName,
+    win32_Kill,
+)
+from eric7.SystemUtilities.PythonUtilities import (  # __IGNORE_FLAKES_WARNING__
+    determinePythonVersion,
+    getPythonLibPath,
+    getPythonVersion,
+)
+from eric7.SystemUtilities.QtUtilities import (  # __IGNORE_FLAKES_WARNING__
+    checkPyside,
+    generatePyQtToolPath,
+    generatePySideToolPath,
+    generateQtToolName,
+    getPyQt6ModulesDirectory,
+    getPyQtToolsPath,
+    getQtBinariesPath,
+    getQtMacBundle,
+    prepareQtMacBundle,
     qVersionTuple,
-    sessionType,
-    setConfigDir,
 )
 from eric7.UI.Info import Program, Version
 
@@ -803,601 +843,6 @@
     return ntxt
 
 
-def toNativeSeparators(path):
-    """
-    Function returning a path, that is using native separator characters.
-
-    @param path path to be converted
-    @type str
-    @return path with converted separator characters
-    @rtype str
-    """
-    return str(pathlib.PurePath(path)) if bool(path) else ""
-
-
-def fromNativeSeparators(path):
-    """
-    Function returning a path, that is using "/" separator characters.
-
-    @param path path to be converted
-    @type str
-    @return path with converted separator characters
-    @rtype str
-    """
-    return pathlib.PurePath(path).as_posix() if bool(path) else ""
-
-
-def normcasepath(path):
-    """
-    Function returning a path, that is normalized with respect to its case
-    and references.
-
-    @param path file path (string)
-    @return case normalized path (string)
-    """
-    return os.path.normcase(os.path.normpath(path))
-
-
-def normcaseabspath(path):
-    """
-    Function returning an absolute path, that is normalized with respect to
-    its case and references.
-
-    @param path file path (string)
-    @return absolute, normalized path (string)
-    """
-    return os.path.normcase(os.path.abspath(path))
-
-
-def normjoinpath(a, *p):
-    """
-    Function returning a normalized path of the joined parts passed into it.
-
-    @param a first path to be joined (string)
-    @param p variable number of path parts to be joined (string)
-    @return normalized path (string)
-    """
-    return os.path.normpath(os.path.join(a, *p))
-
-
-def normabsjoinpath(a, *p):
-    """
-    Function returning a normalized, absolute path of the joined parts passed
-    into it.
-
-    @param a first path to be joined (string)
-    @param p variable number of path parts to be joind (string)
-    @return absolute, normalized path (string)
-    """
-    return os.path.abspath(os.path.join(a, *p))
-
-
-def isinpath(file):
-    """
-    Function to check for an executable file.
-
-    @param file filename of the executable to check (string)
-    @return flag to indicate, if the executable file is accessible
-        via the searchpath defined by the PATH environment variable.
-    """
-    if os.path.isabs(file):
-        return os.access(file, os.X_OK)
-
-    if os.path.exists(os.path.join(os.curdir, file)):
-        return os.access(os.path.join(os.curdir, file), os.X_OK)
-
-    path = getEnvironmentEntry("PATH")
-
-    # environment variable not defined
-    if path is None:
-        return False
-
-    dirs = path.split(os.pathsep)
-    return any(os.access(os.path.join(directory, file), os.X_OK) for directory in dirs)
-
-
-def startswithPath(path, start):
-    """
-    Function to check, if a path starts with a given start path.
-
-    @param path path to be checked
-    @type str
-    @param start start path
-    @type str
-    @return flag indicating that the path starts with the given start
-        path
-    @rtype bool
-    """
-    return bool(start) and (
-        path == start or normcasepath(path).startswith(normcasepath(start + "/"))
-    )
-
-
-def relativeUniversalPath(path, start):
-    """
-    Function to convert a file path to a path relative to a start path
-    with universal separators.
-
-    @param path file or directory name to convert (string)
-    @param start start path (string)
-    @return relative path or unchanged path, if path does not start with
-        the start path with universal separators (string)
-    """
-    return fromNativeSeparators(os.path.relpath(path, start))
-
-
-def absolutePath(path, start):
-    """
-    Public method to convert a path relative to a start path to an
-    absolute path.
-
-    @param path file or directory name to convert (string)
-    @param start start path (string)
-    @return absolute path (string)
-    """
-    if not os.path.isabs(path):
-        path = os.path.normpath(os.path.join(start, path))
-    return path
-
-
-def absoluteUniversalPath(path, start):
-    """
-    Public method to convert a path relative to a start path with
-    universal separators to an absolute path.
-
-    @param path file or directory name to convert (string)
-    @param start start path (string)
-    @return absolute path with native separators (string)
-    """
-    if not os.path.isabs(path):
-        path = toNativeSeparators(os.path.normpath(os.path.join(start, path)))
-    return path
-
-
-def getExecutablePath(file):
-    """
-    Function to build the full path of an executable file from the environment.
-
-    @param file filename of the executable to check (string)
-    @return full executable name, if the executable file is accessible
-        via the searchpath defined by the PATH environment variable, or an
-        empty string otherwise.
-    """
-    if os.path.isabs(file):
-        if os.access(file, os.X_OK):
-            return file
-        else:
-            return ""
-
-    cur_path = os.path.join(os.curdir, file)
-    if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
-        return cur_path
-
-    path = os.getenv("PATH")
-
-    # environment variable not defined
-    if path is None:
-        return ""
-
-    dirs = path.split(os.pathsep)
-    for directory in dirs:
-        exe = os.path.join(directory, file)
-        if os.access(exe, os.X_OK):
-            return exe
-
-    return ""
-
-
-def getExecutablePaths(file):
-    """
-    Function to build all full path of an executable file from the environment.
-
-    @param file filename of the executable (string)
-    @return list of full executable names (list of strings), if the executable
-        file is accessible via the searchpath defined by the PATH environment
-        variable, or an empty list otherwise.
-    """
-    paths = []
-
-    if os.path.isabs(file):
-        if os.access(file, os.X_OK):
-            return [file]
-        else:
-            return []
-
-    cur_path = os.path.join(os.curdir, file)
-    if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
-        paths.append(cur_path)
-
-    path = os.getenv("PATH")
-
-    # environment variable not defined
-    if path is not None:
-        dirs = path.split(os.pathsep)
-        for directory in dirs:
-            exe = os.path.join(directory, file)
-            if os.access(exe, os.X_OK) and exe not in paths:
-                paths.append(exe)
-
-    return paths
-
-
-def getWindowsExecutablePath(file):
-    """
-    Function to build the full path of an executable file from the environment
-    on Windows platforms.
-
-    First an executable with the extension .exe is searched for, thereafter
-    such with the extensions .cmd or .bat and finally the given file name as
-    is. The first match is returned.
-
-    @param file filename of the executable to check (string)
-    @return full executable name, if the executable file is accessible
-        via the searchpath defined by the PATH environment variable, or an
-        empty string otherwise.
-    """
-    if os.path.isabs(file):
-        if os.access(file, os.X_OK):
-            return file
-        else:
-            return ""
-
-    filenames = [file + ".exe", file + ".cmd", file + ".bat", file]
-
-    for filename in filenames:
-        cur_path = os.path.join(os.curdir, filename)
-        if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
-            return os.path.abspath(cur_path)
-
-    path = os.getenv("PATH")
-
-    # environment variable not defined
-    if path is None:
-        return ""
-
-    dirs = path.split(os.pathsep)
-    for directory in dirs:
-        for filename in filenames:
-            exe = os.path.join(directory, filename)
-            if os.access(exe, os.X_OK):
-                return exe
-
-    return ""
-
-
-def isExecutable(exe):
-    """
-    Function to check, if a file is executable.
-
-    @param exe filename of the executable to check (string)
-    @return flag indicating executable status (boolean)
-    """
-    return os.access(exe, os.X_OK)
-
-
-def isDrive(path):
-    """
-    Function to check, if a path is a Windows drive.
-
-    @param path path name to be checked
-    @type str
-    @return flag indicating a Windows drive
-    @rtype bool
-    """
-    isDrive = False
-    drive, directory = os.path.splitdrive(path)
-    if (
-        drive
-        and len(drive) == 2
-        and drive.endswith(":")
-        and directory in ["", "\\", "/"]
-    ):
-        isDrive = True
-
-    return isDrive
-
-
-def samepath(f1, f2):
-    """
-    Function to compare two paths.
-
-    @param f1 first path for the compare (string)
-    @param f2 second path for the compare (string)
-    @return flag indicating whether the two paths represent the
-        same path on disk.
-    """
-    if f1 is None or f2 is None:
-        return False
-
-    if normcaseabspath(os.path.realpath(f1)) == normcaseabspath(os.path.realpath(f2)):
-        return True
-
-    return False
-
-
-def samefilepath(f1, f2):
-    """
-    Function to compare two paths. Strips the filename.
-
-    @param f1 first filepath for the compare (string)
-    @param f2 second filepath for the compare (string)
-    @return flag indicating whether the two paths represent the
-        same path on disk.
-    """
-    if f1 is None or f2 is None:
-        return False
-
-    if normcaseabspath(os.path.dirname(os.path.realpath(f1))) == normcaseabspath(
-        os.path.dirname(os.path.realpath(f2))
-    ):
-        return True
-
-    return False
-
-
-try:
-    EXTSEP = os.extsep
-except AttributeError:
-    EXTSEP = "."
-
-
-def splitPath(name):
-    """
-    Function to split a pathname into a directory part and a file part.
-
-    @param name path name (string)
-    @return a tuple of 2 strings (dirname, filename).
-    """
-    if os.path.isdir(name):
-        dn = os.path.abspath(name)
-        fn = "."
-    else:
-        dn, fn = os.path.split(name)
-    return (dn, fn)
-
-
-def joinext(prefix, ext):
-    """
-    Function to join a file extension to a path.
-
-    The leading "." of ext is replaced by a platform specific extension
-    separator if necessary.
-
-    @param prefix the basepart of the filename (string)
-    @param ext the extension part (string)
-    @return the complete filename (string)
-    """
-    if ext[0] != ".":
-        ext = ".{0}".format(ext)
-        # require leading separator to match os.path.splitext
-    return prefix + EXTSEP + ext[1:]
-
-
-def compactPath(path, width, measure=len):
-    """
-    Function to return a compacted path fitting inside the given width.
-
-    @param path path to be compacted (string)
-    @param width width for the compacted path (integer)
-    @param measure reference to a function used to measure the length of the
-        string
-    @return compacted path (string)
-    """
-    if measure(path) <= width:
-        return path
-
-    ellipsis = "..."
-
-    head, tail = os.path.split(path)
-    mid = len(head) // 2
-    head1 = head[:mid]
-    head2 = head[mid:]
-    while head1:
-        # head1 is same size as head2 or one shorter
-        path = os.path.join("{0}{1}{2}".format(head1, ellipsis, head2), tail)
-        if measure(path) <= width:
-            return path
-        head1 = head1[:-1]
-        head2 = head2[1:]
-    path = os.path.join(ellipsis, tail)
-    if measure(path) <= width:
-        return path
-    while tail:
-        path = "{0}{1}".format(ellipsis, tail)
-        if measure(path) <= width:
-            return path
-        tail = tail[1:]
-    return ""
-
-
-def direntries(
-    path, filesonly=False, pattern=None, followsymlinks=True, checkStop=None
-):
-    """
-    Function returning a list of all files and directories.
-
-    @param path root of the tree to check
-    @type str
-    @param filesonly flag indicating that only files are wanted
-    @type bool
-    @param pattern a filename pattern or list of filename patterns to check
-        against
-    @type str or list of str
-    @param followsymlinks flag indicating whether symbolic links
-        should be followed
-    @type bool
-    @param checkStop function to be called to check for a stop
-    @type function
-    @return list of all files and directories in the tree rooted
-        at path. The names are expanded to start with path.
-    @rtype list of strs
-    """
-    patterns = pattern if isinstance(pattern, list) else [pattern]
-    files = [] if filesonly else [path]
-    try:
-        entries = os.listdir(path)
-        for entry in entries:
-            if checkStop and checkStop():
-                break
-
-            if entry in [
-                ".svn",
-                ".hg",
-                ".git",
-                ".ropeproject",
-                ".eric7project",
-                ".jedi",
-            ]:
-                continue
-
-            fentry = os.path.join(path, entry)
-            if (
-                pattern
-                and not os.path.isdir(fentry)
-                and not any(fnmatch.fnmatch(entry, p) for p in patterns)
-            ):
-                # entry doesn't fit the given pattern
-                continue
-
-            if os.path.isdir(fentry):
-                if os.path.islink(fentry) and not followsymlinks:
-                    continue
-                files += direntries(
-                    fentry, filesonly, pattern, followsymlinks, checkStop
-                )
-            else:
-                files.append(fentry)
-    except OSError:
-        pass
-    except UnicodeDecodeError:
-        pass
-    return files
-
-
-def getDirs(path, excludeDirs):
-    """
-    Function returning a list of all directories below path.
-
-    @param path root of the tree to check
-    @param excludeDirs basename of directories to ignore
-    @return list of all directories found
-    """
-    try:
-        names = os.listdir(path)
-    except OSError:
-        return []
-
-    dirs = []
-    for name in names:
-        if os.path.isdir(os.path.join(path, name)) and not os.path.islink(
-            os.path.join(path, name)
-        ):
-            exclude = 0
-            for e in excludeDirs:
-                if name.split(os.sep, 1)[0] == e:
-                    exclude = 1
-                    break
-            if not exclude:
-                dirs.append(os.path.join(path, name))
-
-    for name in dirs[:]:
-        if not os.path.islink(name):
-            dirs += getDirs(name, excludeDirs)
-
-    return dirs
-
-
-def findVolume(volumeName, findAll=False):
-    """
-    Function to find the directory belonging to a given volume name.
-
-    @param volumeName name of the volume to search for
-    @type str
-    @param findAll flag indicating to get the directories for all volumes
-        starting with the given name (defaults to False)
-    @type bool (optional)
-    @return directory path or list of directory paths for the given volume
-        name
-    @rtype str or list of str
-    """
-    volumeDirectories = []
-    volumeDirectory = None
-
-    if isWindowsPlatform():
-        # we are on a Windows platform
-        def getVolumeName(diskName):
-            """
-            Local function to determine the volume of a disk or device.
-
-            Each disk or external device connected to windows has an
-            attribute called "volume name". This function returns the
-            volume name for the given disk/device.
-
-            Code from http://stackoverflow.com/a/12056414
-            """
-            volumeNameBuffer = ctypes.create_unicode_buffer(1024)
-            ctypes.windll.kernel32.GetVolumeInformationW(
-                ctypes.c_wchar_p(diskName),
-                volumeNameBuffer,
-                ctypes.sizeof(volumeNameBuffer),
-                None,
-                None,
-                None,
-                None,
-                0,
-            )
-            return volumeNameBuffer.value
-
-        #
-        # In certain circumstances, volumes are allocated to USB
-        # storage devices which cause a Windows popup to raise if their
-        # volume contains no media. Wrapping the check in SetErrorMode
-        # with SEM_FAILCRITICALERRORS (1) prevents this popup.
-        #
-        oldMode = ctypes.windll.kernel32.SetErrorMode(1)
-        try:
-            for disk in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
-                dirpath = "{0}:\\".format(disk)
-                if os.path.exists(dirpath):
-                    if findAll:
-                        if getVolumeName(dirpath).startswith(volumeName):
-                            volumeDirectories.append(dirpath)
-                    else:
-                        if getVolumeName(dirpath) == volumeName:
-                            volumeDirectory = dirpath
-                            break
-        finally:
-            ctypes.windll.kernel32.SetErrorMode(oldMode)
-    else:
-        # we are on a Linux or macOS platform
-        for mountCommand in ["mount", "/sbin/mount", "/usr/sbin/mount"]:
-            with contextlib.suppress(FileNotFoundError):
-                mountOutput = subprocess.run(  # secok
-                    mountCommand, check=True, capture_output=True, text=True
-                ).stdout.splitlines()
-                mountedVolumes = [
-                    x.split(" type")[0].split(maxsplit=2)[2] for x in mountOutput
-                ]
-                if findAll:
-                    for volume in mountedVolumes:
-                        if volumeName in volume:
-                            volumeDirectories.append(volume)
-                    if volumeDirectories:
-                        break
-                else:
-                    for volume in mountedVolumes:
-                        if volume.endswith(volumeName):
-                            volumeDirectory = volume
-                            break
-                    if volumeDirectory:
-                        break
-
-    if findAll:
-        return volumeDirectories
-    else:
-        return volumeDirectory
-
-
 def getTestFileNames(fn):
     """
     Function to build the potential file names of a test file.
@@ -1633,146 +1078,6 @@
     )
 
 
-def getUserName():
-    """
-    Function to get the user name.
-
-    @return user name (string)
-    """
-    user = getpass.getuser()
-
-    if isWindowsPlatform() and not user:
-        return win32_GetUserName()
-
-    return user
-
-
-def getRealName():
-    """
-    Function to get the real name of the user.
-
-    @return real name of the user (string)
-    """
-    if isWindowsPlatform():
-        return win32_getRealName()
-    else:
-        user = getpass.getuser()
-        return pwd.getpwnam(user).pw_gecos
-
-
-def getHomeDir():
-    """
-    Function to get a users home directory.
-
-    @return home directory (string)
-    """
-    return QDir.homePath()
-
-
-def getPythonLibPath():
-    """
-    Function to determine the path to Python's library.
-
-    @return path to the Python library (string)
-    """
-    pyFullVers = sys.version.split()[0]
-
-    vl = re.findall("[0-9.]*", pyFullVers)[0].split(".")
-    major = vl[0]
-    minor = vl[1]
-
-    pyVers = major + "." + minor
-
-    if isWindowsPlatform():
-        libDir = sys.prefix + "\\Lib"
-    else:
-        try:
-            syslib = sys.lib
-        except AttributeError:
-            syslib = "lib"
-        libDir = sys.prefix + "/" + syslib + "/python" + pyVers
-
-    return libDir
-
-
-def getPythonVersion():
-    """
-    Function to get the Python version (major, minor) as an integer value.
-
-    @return An integer representing major and minor version number (integer)
-    """
-    return sys.hexversion >> 16
-
-
-def determinePythonVersion(filename, source, editor=None):
-    """
-    Function to determine the python version of a given file.
-
-    @param filename name of the file with extension (str)
-    @param source of the file (str)
-    @param editor reference to the editor, if the file is opened
-        already (Editor object)
-    @return Python version if file is Python3 (int)
-    """
-    pyAssignment = {
-        "Python3": 3,
-        "MicroPython": 3,
-        "Cython": 3,
-    }
-
-    if not editor:
-        viewManager = ericApp().getObject("ViewManager")
-        editor = viewManager.getOpenEditor(filename)
-
-    # Maybe the user has changed the language
-    if editor and editor.getFileType() in pyAssignment:
-        return pyAssignment[editor.getFileType()]
-
-    pyVer = 0
-    if filename:
-        if not source:
-            source = readEncodedFile(filename)[0]
-        flags = extractFlags(source)
-        ext = os.path.splitext(filename)[1]
-        py3Ext = Preferences.getPython("Python3Extensions")
-        project = ericApp().getObject("Project")
-        basename = os.path.basename(filename)
-
-        if "FileType" in flags:
-            pyVer = pyAssignment.get(flags["FileType"], 0)
-        elif project.isOpen() and project.isProjectFile(filename):
-            language = project.getEditorLexerAssoc(basename)
-            if not language:
-                language = Preferences.getEditorLexerAssoc(basename)
-            if language == "Python3":
-                pyVer = pyAssignment[language]
-
-        if pyVer:
-            # Skip the next tests
-            pass
-        elif (
-            Preferences.getProject("DeterminePyFromProject")
-            and project.isOpen()
-            and project.isProjectFile(filename)
-            and ext in py3Ext
-        ):
-            pyVer = pyAssignment.get(project.getProjectLanguage(), 0)
-        elif ext in py3Ext:
-            pyVer = 3
-        elif source:
-            if isinstance(source, str):
-                line0 = source.splitlines()[0]
-            else:
-                line0 = source[0]
-            if line0.startswith("#!") and (("python3" in line0) or ("python" in line0)):
-                pyVer = 3
-
-        if pyVer == 0 and ext in py3Ext:
-            pyVer = 3
-
-    return pyVer
-
-
 def rxIndex(rx, txt):
     """
     Function to get the index (start position) of a regular expression match
@@ -1793,247 +1098,6 @@
 
 
 ###############################################################################
-## functions for environment handling
-###############################################################################
-
-
-def getEnvironmentEntry(key, default=None):
-    """
-    Module function to get an environment entry.
-
-    @param key key of the requested environment entry (string)
-    @param default value to be returned, if the environment doesn't contain
-        the requested entry (string)
-    @return the requested entry or the default value, if the entry wasn't
-        found (string or None)
-    """
-    pattern = "^{0}[ \t]*=".format(key)
-    filterRe = (
-        re.compile(pattern, re.IGNORECASE)
-        if isWindowsPlatform()
-        else re.compile(pattern)
-    )
-
-    entries = [
-        e for e in QProcess.systemEnvironment() if filterRe.search(e) is not None
-    ]
-    if not entries:
-        return default
-
-    # if there are multiple entries, just consider the first one
-    ename, value = entries[0].split("=", 1)
-    return value.strip()
-
-
-def hasEnvironmentEntry(key):
-    """
-    Module function to check, if the environment contains an entry.
-
-    @param key key of the requested environment entry
-    @type str
-    @return flag indicating the presence of the requested entry
-    @rtype bool
-    """
-    pattern = "^{0}[ \t]*=".format(key)
-    filterRe = (
-        re.compile(pattern, re.IGNORECASE)
-        if isWindowsPlatform()
-        else re.compile(pattern)
-    )
-
-    entries = [
-        e for e in QProcess.systemEnvironment() if filterRe.search(e) is not None
-    ]
-    return len(entries) > 0
-
-
-###############################################################################
-## Qt utility functions below
-###############################################################################
-
-
-def generateQtToolName(toolname):
-    """
-    Module function to generate the executable name for a Qt tool like
-    designer.
-
-    @param toolname base name of the tool (string)
-    @return the Qt tool name without extension (string)
-    """
-    return "{0}{1}{2}".format(
-        Preferences.getQt("QtToolsPrefix"),
-        toolname,
-        Preferences.getQt("QtToolsPostfix"),
-    )
-
-
-def getQtMacBundle(toolname):
-    """
-    Module function to determine the correct Mac OS X bundle name for Qt tools.
-
-    @param toolname  plain name of the tool (e.g. "designer") (string)
-    @return bundle name of the Qt tool (string)
-    """
-    qtDir = getQtBinariesPath()
-    bundles = [
-        os.path.join(qtDir, "bin", generateQtToolName(toolname.capitalize())) + ".app",
-        os.path.join(qtDir, "bin", generateQtToolName(toolname)) + ".app",
-        os.path.join(qtDir, generateQtToolName(toolname.capitalize())) + ".app",
-        os.path.join(qtDir, generateQtToolName(toolname)) + ".app",
-    ]
-    if toolname == "designer":
-        # support the standalone Qt Designer installer from
-        # https://build-system.fman.io/qt-designer-download
-        designer = "Qt Designer.app"
-        bundles.extend(
-            [
-                os.path.join(qtDir, "bin", designer),
-                os.path.join(qtDir, designer),
-            ]
-        )
-    for bundle in bundles:
-        if os.path.exists(bundle):
-            return bundle
-    return ""
-
-
-def prepareQtMacBundle(toolname, args):
-    """
-    Module function for starting Qt tools that are Mac OS X bundles.
-
-    @param toolname  plain name of the tool (e.g. "designer")
-    @type str
-    @param args    name of input file for tool, if any
-    @type list of str
-    @return command-name and args for QProcess
-    @rtype tuple of (str, list of str)
-    """
-    fullBundle = getQtMacBundle(toolname)
-    if fullBundle == "":
-        return ("", [])
-
-    newArgs = []
-    newArgs.append("-a")
-    newArgs.append(fullBundle)
-    if args:
-        newArgs.append("--args")
-        newArgs += args
-
-    return ("open", newArgs)
-
-
-###############################################################################
-## PyQt utility functions below
-###############################################################################
-
-
-def generatePyQtToolPath(toolname, alternatives=None):
-    """
-    Module function to generate the executable path for a PyQt tool.
-
-    @param toolname base name of the tool
-    @type str
-    @param alternatives list of alternative tool names to try
-    @type list of str
-    @return executable path name of the tool
-    @rtype str
-    """
-    pyqtVariant = int(toolname[-1])
-    pyqtToolsPath = getPyQtToolsPath(pyqtVariant)
-    if pyqtToolsPath:
-        exe = os.path.join(pyqtToolsPath, toolname)
-        if isWindowsPlatform():
-            exe += ".exe"
-    else:
-        if isWindowsPlatform():
-            exe = getWindowsExecutablePath(toolname)
-        else:
-            exe = toolname
-
-    if not isinpath(exe) and alternatives:
-        ex_ = generatePyQtToolPath(alternatives[0], alternatives[1:])
-        if isinpath(ex_):
-            exe = ex_
-
-    return exe
-
-
-###############################################################################
-## PySide2/PySide6 utility functions below
-###############################################################################
-
-
-def generatePySideToolPath(toolname, variant=2):
-    """
-    Module function to generate the executable path for a PySide2/PySide6 tool.
-
-    @param toolname base name of the tool
-    @type str
-    @param variant indicator for the PySide variant
-    @type int or str
-    @return the PySide2/PySide6 tool path with extension
-    @rtype str
-    """
-    if isWindowsPlatform():
-        hasPyside = checkPyside(variant)
-        if not hasPyside:
-            return ""
-
-        venvName = Preferences.getQt("PySide{0}VenvName".format(variant))
-        if not venvName:
-            venvName = Preferences.getDebugger("Python3VirtualEnv")
-        interpreter = (
-            ericApp().getObject("VirtualEnvManager").getVirtualenvInterpreter(venvName)
-        )
-        if interpreter == "" or not isinpath(interpreter):
-            interpreter = getPythonExecutable()
-        prefix = os.path.dirname(interpreter)
-        if not prefix.endswith("Scripts"):
-            prefix = os.path.join(prefix, "Scripts")
-        return os.path.join(prefix, toolname + ".exe")
-    else:
-        # step 1: check, if the user has configured a tools path
-        path = Preferences.getQt("PySide{0}ToolsDir".format(variant))
-        if path:
-            return os.path.join(path, toolname)
-
-        # step 2: determine from used Python interpreter
-        dirName = os.path.dirname(sys.executable)
-        if os.path.exists(os.path.join(dirName, toolname)):
-            return os.path.join(dirName, toolname)
-
-        return toolname
-
-
-@functools.lru_cache()
-def checkPyside(variant=2):
-    """
-    Module function to check the presence of PySide2/PySide6.
-
-    @param variant indicator for the PySide variant
-    @type int or str
-    @return flags indicating the presence of PySide2/PySide6
-    @rtype bool
-    """
-    venvName = Preferences.getQt("PySide{0}VenvName".format(variant))
-    if not venvName:
-        venvName = Preferences.getDebugger("Python3VirtualEnv")
-    interpreter = (
-        ericApp().getObject("VirtualEnvManager").getVirtualenvInterpreter(venvName)
-    )
-    if interpreter == "" or not isinpath(interpreter):
-        interpreter = getPythonExecutable()
-
-    checker = os.path.join(getConfig("ericDir"), "Utilities", "PySideImporter.py")
-    args = [checker, "--variant={0}".format(variant)]
-    proc = QProcess()
-    proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
-    proc.start(interpreter, args)
-    finished = proc.waitForFinished(30000)
-    return finished and proc.exitCode() == 0
-
-
-###############################################################################
 ## Other utility functions below
 ###############################################################################
 
@@ -2093,11 +1157,11 @@
     if os.environ.get("SOMMELIER_VERSION", ""):
         info[-1] += ", ChromeOS"
     info.append(sys.version)
-    desktop = desktopName()
+    desktop = DesktopUtilities.desktopName()
     if desktop:
         info.append("")
         info.append("Desktop: {0}".format(desktop))
-    session = sessionType()
+    session = DesktopUtilities.sessionType()
     if session:
         info.append("")
         info.append("Session Type: {0}".format(session))
@@ -2160,21 +1224,6 @@
     return linesep.join(info)
 
 
-def toBool(dataStr):
-    """
-    Module function to convert a string to a boolean value.
-
-    @param dataStr string to be converted (string)
-    @return converted boolean value (boolean)
-    """
-    if dataStr in ["True", "true", "1", "Yes", "yes"]:
-        return True
-    elif dataStr in ["False", "false", "0", "No", "no"]:
-        return False
-    else:
-        return bool(dataStr)
-
-
 def getSysPath(interpreter):
     """
     Module function to get the Python path (sys.path) of a specific
@@ -2203,62 +1252,3 @@
                 sysPath.remove("")
 
     return sysPath
-
-
-###############################################################################
-## posix compatibility functions below
-###############################################################################
-
-# None right now
-
-###############################################################################
-## win32 compatibility functions below
-###############################################################################
-
-
-def win32_Kill(pid):
-    """
-    Function to provide an os.kill equivalent for Win32.
-
-    @param pid process id (integer)
-    @return result of the kill (boolean)
-    """
-    import win32api  # __IGNORE_WARNING_I102__
-
-    handle = win32api.OpenProcess(1, 0, pid)
-    return 0 != win32api.TerminateProcess(handle, 0)
-
-
-def win32_GetUserName():
-    """
-    Function to get the user name under Win32.
-
-    @return user name (string)
-    """
-    try:
-        import win32api  # __IGNORE_WARNING_I10__
-
-        return win32api.GetUserName()
-    except ImportError:
-        try:
-            u = getEnvironmentEntry("USERNAME")
-        except KeyError:
-            u = getEnvironmentEntry("username", None)
-        return u
-
-
-def win32_getRealName():
-    """
-    Function to get the user's real name (aka. display name) under Win32.
-
-    @return real name of the current user (string)
-    """
-    GetUserNameEx = ctypes.windll.secur32.GetUserNameExW
-    NameDisplay = 3
-
-    size = ctypes.pointer(ctypes.c_ulong(0))
-    GetUserNameEx(NameDisplay, None, size)
-
-    nameBuffer = ctypes.create_unicode_buffer(size.contents.value)
-    GetUserNameEx(NameDisplay, nameBuffer, size)
-    return nameBuffer.value

eric ide

mercurial