Wed, 06 Dec 2023 14:23:36 +0100
Made the code dealing with "device:" and "remote:" file names generally available in FileSystemUtilities.
--- a/src/eric7/APIs/Python3/eric7.api Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/APIs/Python3/eric7.api Wed Dec 06 14:23:36 2023 +0100 @@ -8588,15 +8588,12 @@ eric7.QScintilla.Editor.Editor.insertDocstring?4() eric7.QScintilla.Editor.Editor.isClone?4(editor) eric7.QScintilla.Editor.Editor.isCythonFile?4() -eric7.QScintilla.Editor.Editor.isDeviceFile?4() eric7.QScintilla.Editor.Editor.isJavascriptFile?4() eric7.QScintilla.Editor.Editor.isLastEditPositionAvailable?4() -eric7.QScintilla.Editor.Editor.isLocalFile?4() eric7.QScintilla.Editor.Editor.isMicroPythonFile?4() eric7.QScintilla.Editor.Editor.isProjectFile?4() eric7.QScintilla.Editor.Editor.isPy3File?4() eric7.QScintilla.Editor.Editor.isPyFile?4() -eric7.QScintilla.Editor.Editor.isRemoteFile?4() eric7.QScintilla.Editor.Editor.isRubyFile?4() eric7.QScintilla.Editor.Editor.isSpellCheckRegion?4(pos) eric7.QScintilla.Editor.Editor.joinLines?4() @@ -9816,9 +9813,12 @@ eric7.SystemUtilities.DesktopUtilities.isKdeDesktop?4() eric7.SystemUtilities.DesktopUtilities.isWaylandSession?4() eric7.SystemUtilities.DesktopUtilities.sessionType?4() +eric7.SystemUtilities.FileSystemUtilities._DeviceFileMarker?8 +eric7.SystemUtilities.FileSystemUtilities._RemoteFileMarker?8 eric7.SystemUtilities.FileSystemUtilities.absolutePath?4(path, start) eric7.SystemUtilities.FileSystemUtilities.absoluteUniversalPath?4(path, start) eric7.SystemUtilities.FileSystemUtilities.compactPath?4(path, width, measure=len) +eric7.SystemUtilities.FileSystemUtilities.deviceFileName?4(fileName) eric7.SystemUtilities.FileSystemUtilities.direntries?4(path, filesonly=False, pattern=None, followsymlinks=True, checkStop=None, ignore=None, ) eric7.SystemUtilities.FileSystemUtilities.findVolume?4(volumeName, findAll=False) eric7.SystemUtilities.FileSystemUtilities.fromNativeSeparators?4(path) @@ -9828,15 +9828,20 @@ eric7.SystemUtilities.FileSystemUtilities.getUserMounts?4() eric7.SystemUtilities.FileSystemUtilities.getVolumeName?4(diskName) eric7.SystemUtilities.FileSystemUtilities.getWindowsExecutablePath?4(file) +eric7.SystemUtilities.FileSystemUtilities.isDeviceFileName?4(fileName) eric7.SystemUtilities.FileSystemUtilities.isDrive?4(path) eric7.SystemUtilities.FileSystemUtilities.isExecutable?4(exe) +eric7.SystemUtilities.FileSystemUtilities.isPlainFileName?4(fileName) +eric7.SystemUtilities.FileSystemUtilities.isRemoteFileName?4(fileName) eric7.SystemUtilities.FileSystemUtilities.isinpath?4(file) eric7.SystemUtilities.FileSystemUtilities.joinext?4(prefix, ext) eric7.SystemUtilities.FileSystemUtilities.normabsjoinpath?4(a, *p) eric7.SystemUtilities.FileSystemUtilities.normcaseabspath?4(path) eric7.SystemUtilities.FileSystemUtilities.normcasepath?4(path) eric7.SystemUtilities.FileSystemUtilities.normjoinpath?4(a, *p) +eric7.SystemUtilities.FileSystemUtilities.plainFileName?4(fileName) eric7.SystemUtilities.FileSystemUtilities.relativeUniversalPath?4(path, start) +eric7.SystemUtilities.FileSystemUtilities.remoteFileName?4(fileName) eric7.SystemUtilities.FileSystemUtilities.samefilepath?4(f1, f2) eric7.SystemUtilities.FileSystemUtilities.samepath?4(f1, f2) eric7.SystemUtilities.FileSystemUtilities.splitPath?4(name)
--- a/src/eric7/Documentation/Help/source.qhp Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/Documentation/Help/source.qhp Wed Dec 06 14:23:36 2023 +0100 @@ -4859,15 +4859,12 @@ <keyword name="Editor.insertDocstring" id="Editor.insertDocstring" ref="eric7.QScintilla.Editor.html#Editor.insertDocstring" /> <keyword name="Editor.isClone" id="Editor.isClone" ref="eric7.QScintilla.Editor.html#Editor.isClone" /> <keyword name="Editor.isCythonFile" id="Editor.isCythonFile" ref="eric7.QScintilla.Editor.html#Editor.isCythonFile" /> - <keyword name="Editor.isDeviceFile" id="Editor.isDeviceFile" ref="eric7.QScintilla.Editor.html#Editor.isDeviceFile" /> <keyword name="Editor.isJavascriptFile" id="Editor.isJavascriptFile" ref="eric7.QScintilla.Editor.html#Editor.isJavascriptFile" /> <keyword name="Editor.isLastEditPositionAvailable" id="Editor.isLastEditPositionAvailable" ref="eric7.QScintilla.Editor.html#Editor.isLastEditPositionAvailable" /> - <keyword name="Editor.isLocalFile" id="Editor.isLocalFile" ref="eric7.QScintilla.Editor.html#Editor.isLocalFile" /> <keyword name="Editor.isMicroPythonFile" id="Editor.isMicroPythonFile" ref="eric7.QScintilla.Editor.html#Editor.isMicroPythonFile" /> <keyword name="Editor.isProjectFile" id="Editor.isProjectFile" ref="eric7.QScintilla.Editor.html#Editor.isProjectFile" /> <keyword name="Editor.isPy3File" id="Editor.isPy3File" ref="eric7.QScintilla.Editor.html#Editor.isPy3File" /> <keyword name="Editor.isPyFile" id="Editor.isPyFile" ref="eric7.QScintilla.Editor.html#Editor.isPyFile" /> - <keyword name="Editor.isRemoteFile" id="Editor.isRemoteFile" ref="eric7.QScintilla.Editor.html#Editor.isRemoteFile" /> <keyword name="Editor.isRubyFile" id="Editor.isRubyFile" ref="eric7.QScintilla.Editor.html#Editor.isRubyFile" /> <keyword name="Editor.isSpellCheckRegion" id="Editor.isSpellCheckRegion" ref="eric7.QScintilla.Editor.html#Editor.isSpellCheckRegion" /> <keyword name="Editor.joinLines" id="Editor.joinLines" ref="eric7.QScintilla.Editor.html#Editor.joinLines" /> @@ -19868,6 +19865,7 @@ <keyword name="deepgetattr" id="deepgetattr" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Security.SecurityUtils.html#deepgetattr" /> <keyword name="desktopName" id="desktopName" ref="eric7.SystemUtilities.DesktopUtilities.html#desktopName" /> <keyword name="determinePythonVersion" id="determinePythonVersion" ref="eric7.SystemUtilities.PythonUtilities.html#determinePythonVersion" /> + <keyword name="deviceFileName" id="deviceFileName" ref="eric7.SystemUtilities.FileSystemUtilities.html#deviceFileName" /> <keyword name="direntries" id="direntries" ref="eric7.SystemUtilities.FileSystemUtilities.html#direntries" /> <keyword name="displayString" id="displayString" ref="eric7.Plugins.PluginVcsGit.html#displayString" /> <keyword name="displayString" id="displayString" ref="eric7.Plugins.PluginVcsMercurial.html#displayString" /> @@ -20270,6 +20268,7 @@ <keyword name="isCondaAvailable" id="isCondaAvailable" ref="eric7.CondaInterface.__init__.html#isCondaAvailable" /> <keyword name="isConfigured" id="isConfigured" ref="eric7.Preferences.__init__.html#isConfigured" /> <keyword name="isCupsAvailable" id="isCupsAvailable" ref="eric7.WebBrowser.WebBrowserView.html#isCupsAvailable" /> + <keyword name="isDeviceFileName" id="isDeviceFileName" ref="eric7.SystemUtilities.FileSystemUtilities.html#isDeviceFileName" /> <keyword name="isDrive" id="isDrive" ref="eric7.SystemUtilities.FileSystemUtilities.html#isDrive" /> <keyword name="isEllipsis" id="isEllipsis" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isEllipsis" /> <keyword name="isExecutable" id="isExecutable" ref="eric7.DebugClients.Python.DebugUtilities.html#isExecutable" /> @@ -20282,7 +20281,9 @@ <keyword name="isMacPlatform" id="isMacPlatform" ref="eric7.SystemUtilities.OSUtilities.html#isMacPlatform" /> <keyword name="isNameConstant" id="isNameConstant" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isNameConstant" /> <keyword name="isNumber" id="isNumber" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isNumber" /> + <keyword name="isPlainFileName" id="isPlainFileName" ref="eric7.SystemUtilities.FileSystemUtilities.html#isPlainFileName" /> <keyword name="isPythonProgram" id="isPythonProgram" ref="eric7.DebugClients.Python.DebugUtilities.html#isPythonProgram" /> + <keyword name="isRemoteFileName" id="isRemoteFileName" ref="eric7.SystemUtilities.FileSystemUtilities.html#isRemoteFileName" /> <keyword name="isString" id="isString" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isString" /> <keyword name="isSupportedType" id="isSupportedType" ref="eric7.Utilities.ClassBrowsers.__init__.html#isSupportedType" /> <keyword name="isTextFile" id="isTextFile" ref="eric7.Utilities.MimeTypes.html#isTextFile" /> @@ -20405,6 +20406,7 @@ <keyword name="pixmapFromByteArray" id="pixmapFromByteArray" ref="eric7.WebBrowser.Tools.WebBrowserTools.html#pixmapFromByteArray" /> <keyword name="pixmapToByteArray" id="pixmapToByteArray" ref="eric7.WebBrowser.Tools.WebBrowserTools.html#pixmapToByteArray" /> <keyword name="pixmapToDataUrl" id="pixmapToDataUrl" ref="eric7.WebBrowser.Tools.WebBrowserTools.html#pixmapToDataUrl" /> + <keyword name="plainFileName" id="plainFileName" ref="eric7.SystemUtilities.FileSystemUtilities.html#plainFileName" /> <keyword name="prepareDocumentationViewerHtmlDocWarningDocument" id="prepareDocumentationViewerHtmlDocWarningDocument" ref="eric7.UI.CodeDocumentationViewerTemplate.html#prepareDocumentationViewerHtmlDocWarningDocument" /> <keyword name="prepareDocumentationViewerHtmlDocument" id="prepareDocumentationViewerHtmlDocument" ref="eric7.UI.CodeDocumentationViewerTemplate.html#prepareDocumentationViewerHtmlDocument" /> <keyword name="prepareDocumentationViewerHtmlWarningDocument" id="prepareDocumentationViewerHtmlWarningDocument" ref="eric7.UI.CodeDocumentationViewerTemplate.html#prepareDocumentationViewerHtmlWarningDocument" /> @@ -20468,6 +20470,7 @@ <keyword name="register_check" id="register_check" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#register_check" /> <keyword name="rehashPassword" id="rehashPassword" ref="eric7.Utilities.crypto.py3PBKDF2.html#rehashPassword" /> <keyword name="relativeUniversalPath" id="relativeUniversalPath" ref="eric7.SystemUtilities.FileSystemUtilities.html#relativeUniversalPath" /> + <keyword name="remoteFileName" id="remoteFileName" ref="eric7.SystemUtilities.FileSystemUtilities.html#remoteFileName" /> <keyword name="removeMarkers" id="removeMarkers" ref="eric7.UI.CompareDialog.html#removeMarkers" /> <keyword name="removeProjectBrowsers" id="removeProjectBrowsers" ref="eric7.Preferences.__init__.html#removeProjectBrowsers" /> <keyword name="removeQuotesFromArgs" id="removeQuotesFromArgs" ref="eric7.DebugClients.Python.DebugUtilities.html#removeQuotesFromArgs" />
--- a/src/eric7/Documentation/Source/eric7.QScintilla.Editor.html Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/Documentation/Source/eric7.QScintilla.Editor.html Wed Dec 06 14:23:36 2023 +0100 @@ -1439,10 +1439,6 @@ <td>Public method to return a flag indicating a Cython file.</td> </tr> <tr> -<td><a href="#Editor.isDeviceFile">isDeviceFile</a></td> -<td>Public method to check, if the editor contains a MCU device file.</td> -</tr> -<tr> <td><a href="#Editor.isJavascriptFile">isJavascriptFile</a></td> <td>Public method to return a flag indicating a Javascript file.</td> </tr> @@ -1451,10 +1447,6 @@ <td>Public method to check, if a last edit position is available.</td> </tr> <tr> -<td><a href="#Editor.isLocalFile">isLocalFile</a></td> -<td>Public method to check, if the editor contains a local file.</td> -</tr> -<tr> <td><a href="#Editor.isMicroPythonFile">isMicroPythonFile</a></td> <td>Public method to return a flag indicating a MicroPython file.</td> </tr> @@ -1471,10 +1463,6 @@ <td>Public method to return a flag indicating a Python (2 or 3) file.</td> </tr> <tr> -<td><a href="#Editor.isRemoteFile">isRemoteFile</a></td> -<td>Public method to check, if the editor contains a remote file.</td> -</tr> -<tr> <td><a href="#Editor.isRubyFile">isRubyFile</a></td> <td>Public method to return a flag indicating a Ruby file.</td> </tr> @@ -6155,25 +6143,6 @@ bool </dd> </dl> -<a NAME="Editor.isDeviceFile" ID="Editor.isDeviceFile"></a> -<h4>Editor.isDeviceFile</h4> -<b>isDeviceFile</b>(<i></i>) - -<p> - Public method to check, if the editor contains a MCU device file. -</p> -<dl> -<dt>Return:</dt> -<dd> -flag indicating a MCU device file -</dd> -</dl> -<dl> -<dt>Return Type:</dt> -<dd> -bool -</dd> -</dl> <a NAME="Editor.isJavascriptFile" ID="Editor.isJavascriptFile"></a> <h4>Editor.isJavascriptFile</h4> <b>isJavascriptFile</b>(<i></i>) @@ -6200,25 +6169,6 @@ flag indicating availability (boolean) </dd> </dl> -<a NAME="Editor.isLocalFile" ID="Editor.isLocalFile"></a> -<h4>Editor.isLocalFile</h4> -<b>isLocalFile</b>(<i></i>) - -<p> - Public method to check, if the editor contains a local file. -</p> -<dl> -<dt>Return:</dt> -<dd> -flag indicating a local file -</dd> -</dl> -<dl> -<dt>Return Type:</dt> -<dd> -bool -</dd> -</dl> <a NAME="Editor.isMicroPythonFile" ID="Editor.isMicroPythonFile"></a> <h4>Editor.isMicroPythonFile</h4> <b>isMicroPythonFile</b>(<i></i>) @@ -6284,25 +6234,6 @@ flag indicating a Python3 file (boolean) </dd> </dl> -<a NAME="Editor.isRemoteFile" ID="Editor.isRemoteFile"></a> -<h4>Editor.isRemoteFile</h4> -<b>isRemoteFile</b>(<i></i>) - -<p> - Public method to check, if the editor contains a remote file. -</p> -<dl> -<dt>Return:</dt> -<dd> -flag indicating a remote file -</dd> -</dl> -<dl> -<dt>Return Type:</dt> -<dd> -bool -</dd> -</dl> <a NAME="Editor.isRubyFile" ID="Editor.isRubyFile"></a> <h4>Editor.isRubyFile</h4> <b>isRubyFile</b>(<i></i>)
--- a/src/eric7/Documentation/Source/eric7.SystemUtilities.FileSystemUtilities.html Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/Documentation/Source/eric7.SystemUtilities.FileSystemUtilities.html Wed Dec 06 14:23:36 2023 +0100 @@ -14,7 +14,7 @@ <h3>Global Attributes</h3> <table> -<tr><td>None</td></tr> +<tr><td>_DeviceFileMarker</td></tr><tr><td>_RemoteFileMarker</td></tr> </table> <h3>Classes</h3> @@ -38,6 +38,10 @@ <td>Function to return a compacted path fitting inside the given width.</td> </tr> <tr> +<td><a href="#deviceFileName">deviceFileName</a></td> +<td>Function to create a device (MicroPython) file name given a plain file name.</td> +</tr> +<tr> <td><a href="#direntries">direntries</a></td> <td>Function returning a list of all files and directories.</td> </tr> @@ -74,6 +78,10 @@ <td>Function to build the full path of an executable file from the environment on Windows platforms.</td> </tr> <tr> +<td><a href="#isDeviceFileName">isDeviceFileName</a></td> +<td>Function to check, if the given file name is a device file name.</td> +</tr> +<tr> <td><a href="#isDrive">isDrive</a></td> <td>Function to check, if a path is a Windows drive.</td> </tr> @@ -82,6 +90,14 @@ <td>Function to check, if a file is executable.</td> </tr> <tr> +<td><a href="#isPlainFileName">isPlainFileName</a></td> +<td>Function to check, if the given file name is a plain (i.e.</td> +</tr> +<tr> +<td><a href="#isRemoteFileName">isRemoteFileName</a></td> +<td>Function to check, if the given file name is a remote file name.</td> +</tr> +<tr> <td><a href="#isinpath">isinpath</a></td> <td>Function to check for an executable file.</td> </tr> @@ -106,10 +122,18 @@ <td>Function returning a normalized path of the joined parts passed into it.</td> </tr> <tr> +<td><a href="#plainFileName">plainFileName</a></td> +<td>Function to create a plain file name given a device or remote file name.</td> +</tr> +<tr> <td><a href="#relativeUniversalPath">relativeUniversalPath</a></td> <td>Function to convert a file path to a path relative to a start path with universal separators.</td> </tr> <tr> +<td><a href="#remoteFileName">remoteFileName</a></td> +<td>Function to create a remote file name given a plain file name.</td> +</tr> +<tr> <td><a href="#samefilepath">samefilepath</a></td> <td>Function to compare two paths.</td> </tr> @@ -220,6 +244,35 @@ <div align="right"><a href="#top">Up</a></div> <hr /> <hr /> +<a NAME="deviceFileName" ID="deviceFileName"></a> +<h2>deviceFileName</h2> +<b>deviceFileName</b>(<i>fileName</i>) + +<p> + Function to create a device (MicroPython) file name given a plain file name. +</p> +<dl> + +<dt><i>fileName</i> (str)</dt> +<dd> +plain file name +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +device file name +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> <a NAME="direntries" ID="direntries"></a> <h2>direntries</h2> <b>direntries</b>(<i>path, filesonly=False, pattern=None, followsymlinks=True, checkStop=None, ignore=None, </i>) @@ -487,6 +540,35 @@ <div align="right"><a href="#top">Up</a></div> <hr /> <hr /> +<a NAME="isDeviceFileName" ID="isDeviceFileName"></a> +<h2>isDeviceFileName</h2> +<b>isDeviceFileName</b>(<i>fileName</i>) + +<p> + Function to check, if the given file name is a device file name. +</p> +<dl> + +<dt><i>fileName</i> (str)</dt> +<dd> +file name to be checked +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +flag indicating a device file name +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> <a NAME="isDrive" ID="isDrive"></a> <h2>isDrive</h2> <b>isDrive</b>(<i>path</i>) @@ -539,6 +621,64 @@ <div align="right"><a href="#top">Up</a></div> <hr /> <hr /> +<a NAME="isPlainFileName" ID="isPlainFileName"></a> +<h2>isPlainFileName</h2> +<b>isPlainFileName</b>(<i>fileName</i>) + +<p> + Function to check, if the given file name is a plain (i.e. local) file name. +</p> +<dl> + +<dt><i>fileName</i> (str)</dt> +<dd> +file name to be checked +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +flag indicating a local file name +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> +<a NAME="isRemoteFileName" ID="isRemoteFileName"></a> +<h2>isRemoteFileName</h2> +<b>isRemoteFileName</b>(<i>fileName</i>) + +<p> + Function to check, if the given file name is a remote file name. +</p> +<dl> + +<dt><i>fileName</i> (str)</dt> +<dd> +file name to be checked +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +flag indicating a remote file name +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> <a NAME="isinpath" ID="isinpath"></a> <h2>isinpath</h2> <b>isinpath</b>(<i>file</i>) @@ -697,6 +837,35 @@ <div align="right"><a href="#top">Up</a></div> <hr /> <hr /> +<a NAME="plainFileName" ID="plainFileName"></a> +<h2>plainFileName</h2> +<b>plainFileName</b>(<i>fileName</i>) + +<p> + Function to create a plain file name given a device or remote file name. +</p> +<dl> + +<dt><i>fileName</i> (str)</dt> +<dd> +device or remote file name +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +plain file name +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> <a NAME="relativeUniversalPath" ID="relativeUniversalPath"></a> <h2>relativeUniversalPath</h2> <b>relativeUniversalPath</b>(<i>path, start</i>) @@ -726,6 +895,35 @@ <div align="right"><a href="#top">Up</a></div> <hr /> <hr /> +<a NAME="remoteFileName" ID="remoteFileName"></a> +<h2>remoteFileName</h2> +<b>remoteFileName</b>(<i>fileName</i>) + +<p> + Function to create a remote file name given a plain file name. +</p> +<dl> + +<dt><i>fileName</i> (str)</dt> +<dd> +plain file name +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +remote file name +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +<hr /> <a NAME="samefilepath" ID="samefilepath"></a> <h2>samefilepath</h2> <b>samefilepath</b>(<i>f1, f2</i>)
--- a/src/eric7/MicroPython/MicroPythonFileManagerWidget.py Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/MicroPython/MicroPythonFileManagerWidget.py Wed Dec 06 14:23:36 2023 +0100 @@ -27,6 +27,7 @@ from eric7.EricWidgets.EricApplication import ericApp from eric7.EricWidgets.EricFileSaveConfirmDialog import confirmOverwrite from eric7.EricWidgets.EricPathPicker import EricPathPickerModes +from eric7.SystemUtilities import FileSystemUtilities from eric7.UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog from .MicroPythonFileSystemUtilities import ( @@ -175,7 +176,7 @@ dirname = "" vm = ericApp().getObject("ViewManager") aw = vm.activeWindow() - if aw and aw.isLocalFile(): + if aw and FileSystemUtilities.isPlainFileName(aw.getFileName()): dirname = os.path.dirname(aw.getFileName()) if not dirname: dirname = ( @@ -410,7 +411,7 @@ try: text = data.decode(encoding="utf-8") ericApp().getObject("ViewManager").newEditorWithText( - text, fileName="device:{0}".format(name) + text, fileName=FileSystemUtilities.deviceFileName(name) ) except UnicodeDecodeError: EricMessageBox.warning( @@ -732,7 +733,7 @@ data = self.__fileManager.getData(name) text = data.decode(encoding="utf-8") ericApp().getObject("ViewManager").newEditorWithText( - text, "Python3", "device:{0}".format(name) + text, "Python3", FileSystemUtilities.deviceFileName(name) ) @pyqtSlot() @@ -769,7 +770,9 @@ if not saveAs: # check editor and selected file names for an implicit 'save as' - editorFileName = os.path.basename(aw.getFileName().replace("device:", "")) + editorFileName = os.path.basename( + FileSystemUtilities.plainFileName(aw.getFileName()) + ) if editorFileName != filename: saveAs = True @@ -807,7 +810,7 @@ dirname = filename.rsplit("/", 1)[0] self.__fileManager.makedirs(dirname) self.__fileManager.putData(filename, text.encode("utf-8")) - aw.setFileName("device:" + filename) + aw.setFileName(FileSystemUtilities.deviceFileName(filename)) aw.setModified(False) aw.resetOnlineChangeTraceInfo()
--- a/src/eric7/QScintilla/Editor.py Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/QScintilla/Editor.py Wed Dec 06 14:23:36 2023 +0100 @@ -51,7 +51,7 @@ from eric7.EricWidgets import EricFileDialog, EricMessageBox from eric7.EricWidgets.EricApplication import ericApp from eric7.Globals import recentNameBreakpointConditions -from eric7.SystemUtilities import OSUtilities, PythonUtilities +from eric7.SystemUtilities import FileSystemUtilities, OSUtilities, PythonUtilities from eric7.UI import PythonDisViewer from eric7.Utilities import MouseUtilities @@ -418,7 +418,10 @@ if not Utilities.MimeTypes.isTextFile(self.fileName): raise OSError() - if self.isLocalFile() and pathlib.Path(self.fileName).exists(): + if ( + FileSystemUtilities.isPlainFileName(self.fileName) + and pathlib.Path(self.fileName).exists() + ): fileSizeKB = pathlib.Path(self.fileName).stat().st_size // 1024 if fileSizeKB > Preferences.getEditor("RejectFilesize"): EricMessageBox.warning( @@ -645,33 +648,6 @@ else: self.__fileNameExtension = "" - def isLocalFile(self): - """ - Public method to check, if the editor contains a local file. - - @return flag indicating a local file - @rtype bool - """ - return not self.fileName.startswith(("device:", "remote:")) - - def isDeviceFile(self): - """ - Public method to check, if the editor contains a MCU device file. - - @return flag indicating a MCU device file - @rtype bool - """ - return self.fileName.startswith("device:") - - def isRemoteFile(self): - """ - Public method to check, if the editor contains a remote file. - - @return flag indicating a remote file - @rtype bool - """ - return self.fileName.startswith("remote:") - def __registerImages(self): """ Private method to register images for autocompletion lists. @@ -3350,7 +3326,9 @@ self, self.tr("File Modified"), self.tr("<p>The file <b>{0}</b> has unsaved changes.</p>").format(fn), - self.saveFile if not self.isRemoteFile() else None, + self.saveFile + if not FileSystemUtilities.isRemoteFileName(self.fileName) + else None, ) if res: self.vm.setEditorName(self, self.fileName) @@ -3634,11 +3612,13 @@ @param path directory to save the file in (string) @return flag indicating success (boolean) """ - if not saveas and (not self.isModified() or self.isRemoteFile()): + if not saveas and ( + not self.isModified() or FileSystemUtilities.isRemoteFileName(self.fileName) + ): # do nothing if text wasn't changed or is a remote file return False - if self.isDeviceFile(): + if FileSystemUtilities.isDeviceFileName(self.fileName): return self.__saveDeviceFile(saveas=saveas) newName = None @@ -3748,8 +3728,10 @@ fn = fn.replace("\\", "/") if "/" in fn: dn = fn.rsplit("/", 1)[0] - filemanager.makedirs(dn.replace("device:", "")) - success = filemanager.writeFile(fn.replace("device:", ""), self.text()) + filemanager.makedirs(FileSystemUtilities.plainFileName(dn)) + success = filemanager.writeFile( + FileSystemUtilities.plainFileName(fn), self.text() + ) if success: self.setFileName(fn) self.setModified(False) @@ -7978,7 +7960,9 @@ @param bForce True to force change, False to only update and emit signal if there was an attribute change. """ - if self.fileName == "" or not self.isLocalFile(): + if self.fileName == "" or not FileSystemUtilities.isPlainFileName( + self.fileName + ): return readOnly = self.checkReadOnly() @@ -8000,7 +7984,8 @@ @rtype bool """ return ( - self.isLocalFile() and not os.access(self.fileName, os.W_OK) + FileSystemUtilities.isPlainFileName(self.fileName) + and not os.access(self.fileName, os.W_OK) ) or self.isReadOnly() @pyqtSlot() @@ -9455,7 +9440,7 @@ """ editorConfig = {} - if fileName and self.isLocalFile(): + if fileName and FileSystemUtilities.isPlainFileName(self.fileName): try: editorConfig = editorconfig.get_properties(fileName) except editorconfig.EditorConfigError:
--- a/src/eric7/SystemUtilities/FileSystemUtilities.py Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/SystemUtilities/FileSystemUtilities.py Wed Dec 06 14:23:36 2023 +0100 @@ -664,3 +664,86 @@ break return mountedPaths + + +################################################################################ +## Functions below handle (MicroPython) device and remote file names. +################################################################################ + + +_DeviceFileMarker = "device:" + + +def deviceFileName(fileName): + """ + Function to create a device (MicroPython) file name given a plain file name. + + @param fileName plain file name + @type str + @return device file name + @rtype str + """ + return f"{_DeviceFileMarker}{fileName}" + + +def isDeviceFileName(fileName): + """ + Function to check, if the given file name is a device file name. + + @param fileName file name to be checked + @type str + @return flag indicating a device file name + @rtype bool + """ + return fileName.startswith(_DeviceFileMarker) + + +_RemoteFileMarker = "remote:" + + +def remoteFileName(fileName): + """ + Function to create a remote file name given a plain file name. + + @param fileName plain file name + @type str + @return remote file name + @rtype str + """ + return f"{_RemoteFileMarker}{fileName}" + + +def isRemoteFileName(fileName): + """ + Function to check, if the given file name is a remote file name. + + @param fileName file name to be checked + @type str + @return flag indicating a remote file name + @rtype bool + """ + return fileName.startswith(_RemoteFileMarker) + + +def isPlainFileName(fileName): + """ + Function to check, if the given file name is a plain (i.e. local) file name. + + @param fileName file name to be checked + @type str + @return flag indicating a local file name + @rtype bool + """ + return not fileName.startswith((_DeviceFileMarker, _RemoteFileMarker)) + + +def plainFileName(fileName): + """ + Function to create a plain file name given a device or remote file name. + + @param fileName device or remote file name + @type str + @return plain file name + @rtype str + """ + return fileName.replace(_DeviceFileMarker, "").replace(_RemoteFileMarker, "")
--- a/src/eric7/ViewManager/ViewManager.py Wed Dec 06 14:20:35 2023 +0100 +++ b/src/eric7/ViewManager/ViewManager.py Wed Dec 06 14:23:36 2023 +0100 @@ -5391,7 +5391,9 @@ "ViewManager", """<p>The file <b>{0}</b> has unsaved changes.</p>""", ).format(fn), - editor.saveFile if not editor.isRemoteFile() else None, + editor.saveFile + if not FileSystemUtilities.isRemoteFileName(editor.getFileName()) + else None, ) if res: self.setEditorName(editor, editor.getFileName()) @@ -7492,7 +7494,10 @@ (boolean) """ if editor is not None: - self.saveAct.setEnabled(editor.isModified() and not editor.isRemoteFile()) + self.saveAct.setEnabled( + editor.isModified() + and not FileSystemUtilities.isRemoteFileName(editor.getFileName()) + ) self.revertAct.setEnabled(editor.isModified()) self.undoAct.setEnabled(editor.isUndoAvailable())