src/eric7/Utilities/ModuleParser.py

branch
server
changeset 10583
2114cc7275e8
parent 10482
72d9b5ea39b4
child 10585
83e5a9a64543
--- 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

eric ide

mercurial