diff -r 8264ea1f42e5 -r 2114cc7275e8 src/eric7/Utilities/ModuleParser.py --- a/src/eric7/Utilities/ModuleParser.py Sat Feb 17 11:26:37 2024 +0100 +++ b/src/eric7/Utilities/ModuleParser.py Sat Feb 17 19:46:33 2024 +0100 @@ -26,6 +26,8 @@ from PyQt6.QtCore import QRegularExpression from eric7 import Utilities +from eric7.EricWidgets.EricApplication import ericApp +from eric7.SystemUtilities import FileSystemUtilities __all__ = [ "Attribute", @@ -1683,36 +1685,40 @@ _extensions = ( [".py", ".pyw", ".pyi", ".ptl", ".rb"] if extensions is None else extensions[:] ) - with contextlib.suppress(ValueError): - _extensions.remove(".py") + modname = module + isRemoteFileName = FileSystemUtilities.isRemoteFileName(module) - modname = module + if isRemoteFileName: + module, extension = os.path.splitext(os.path.basename(module)) + else: + with contextlib.suppress(ValueError): + _extensions.remove(".py") - if os.path.exists(module): - path = [os.path.dirname(module)] - if module.lower().endswith(".py"): - module = module[:-3] - if ( - os.path.exists(os.path.join(path[0], "__init__.py")) - or os.path.exists(os.path.join(path[0], "__init__.pyi")) - or os.path.exists(os.path.join(path[0], "__init__.rb")) - or inpackage - ): - if basename: - module = module.replace(basename, "") - if os.path.isabs(module): - modname = os.path.splitdrive(module)[1][len(os.sep) :] + if os.path.exists(module): + path = [os.path.dirname(module)] + if module.lower().endswith(".py"): + module = module[:-3] + if ( + os.path.exists(os.path.join(path[0], "__init__.py")) + or os.path.exists(os.path.join(path[0], "__init__.pyi")) + or os.path.exists(os.path.join(path[0], "__init__.rb")) + or inpackage + ): + if basename: + module = module.replace(basename, "") + if os.path.isabs(module): + modname = os.path.splitdrive(module)[1][len(os.sep) :] + else: + modname = module + modname = modname.replace(os.sep, ".") + inpackage = True else: - modname = module - modname = modname.replace(os.sep, ".") - inpackage = True - else: - modname = os.path.basename(module) - for ext in _extensions: - if modname.lower().endswith(ext): - modname = modname[: -len(ext)] - break - module = os.path.basename(module) + modname = os.path.basename(module) + for ext in _extensions: + if modname.lower().endswith(ext): + modname = modname[: -len(ext)] + break + module = os.path.basename(module) if caching and modname in _modules: # we've seen this module before... @@ -1725,19 +1731,48 @@ _modules[modname] = mod return mod - # search the path for the module - path = [] if path is None else path[:] - f = None - if inpackage: - try: - f, file, (suff, mode, moduleType) = find_module(module, path, _extensions) - except ImportError: - f = None - if f is None: - fullpath = path[:] + sys.path[:] - f, file, (suff, mode, moduleType) = find_module(module, fullpath, _extensions) - if f: - f.close() + if isRemoteFileName: + if ( + not ericApp() + .getObject("EricServer") + .getServiceInterface("FileSystem") + .exists(modname) + ): + raise ImportError + if extension == ".ptl": + moduleType = PTL_SOURCE + elif extension == ".rb": + moduleType = RB_SOURCE + elif extension in _extensions: + moduleType = PY_SOURCE + else: + raise ImportError + + file = modname + + modname = FileSystemUtilities.plainFileName(modname) + if modname.startswith(("/", "\\")): + modname = modname[1:] + modname = os.path.splitext(modname)[0].replace("/", ".").replace("\\", ".") + else: + # search the path for the module + path = [] if path is None else path[:] + f = None + if inpackage: + try: + f, file, (suff, mode, moduleType) = find_module( + module, path, _extensions + ) + except ImportError: + f = None + if f is None: + fullpath = path[:] + sys.path[:] + f, file, (suff, mode, moduleType) = find_module( + module, fullpath, _extensions + ) + if f: + f.close() + if moduleType not in SUPPORTED_TYPES: # not supported source, can't do anything with this module _modules[modname] = Module(modname, None, None) @@ -1745,7 +1780,16 @@ mod = Module(modname, file, moduleType) with contextlib.suppress(UnicodeError, OSError): - src = Utilities.readEncodedFile(file)[0] + if isRemoteFileName: + bSource = ( + ericApp() + .getObject("EricServer") + .getServiceInterface("FileSystem") + .readFile(file) + ) + src = Utilities.decode(bSource)[0] + else: + src = Utilities.readEncodedFile(file)[0] mod.scan(src) if caching: _modules[modname] = mod