Mon, 01 Feb 2021 10:38:16 +0100
Merged with default branch to prepare a new release.
--- a/DTDs/Project-6.4.dtd Sun Jan 17 13:53:08 2021 +0100 +++ b/DTDs/Project-6.4.dtd Mon Feb 01 10:38:16 2021 +0100 @@ -1,4 +1,4 @@ -<!-- This is the DTD for eric's project file version 6.3 --> +<!-- This is the DTD for eric's project file version 6.4 --> <!-- This is a copy of the Basic DTD --> <!ELEMENT int (#PCDATA)>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DTDs/Project-6.5.dtd Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,191 @@ +<!-- This is the DTD for eric's project file version 6.4 --> + +<!-- This is a copy of the Basic DTD --> +<!ELEMENT int (#PCDATA)> +<!ELEMENT long (#PCDATA)> +<!ELEMENT float (#PCDATA)> +<!ELEMENT complex (#PCDATA)> +<!ELEMENT bool (#PCDATA)> +<!ELEMENT string (#PCDATA)> +<!ELEMENT bytes (#PCDATA)> +<!ELEMENT bytearray (#PCDATA)> +<!ELEMENT none EMPTY> + +<!ELEMENT pickle (#PCDATA)> +<!ATTLIST pickle + method CDATA #REQUIRED + encoding CDATA #REQUIRED> + +<!ELEMENT key (int | long | float | complex | string | bytes)> +<!ELEMENT value (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)> + +<!ELEMENT dict (key, value)*> + +<!ELEMENT tuple (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT list (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT set (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT frozenset (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> +<!-- End of the Basic DTD --> + +<!ELEMENT ProgLanguage (#PCDATA)> +<!ATTLIST ProgLanguage + mixed CDATA #REQUIRED> + +<!ELEMENT ProjectType (#PCDATA)> + +<!ELEMENT Description (#PCDATA)> + +<!ELEMENT Version (#PCDATA)> + +<!ELEMENT Author (#PCDATA)> + +<!ELEMENT Email (#PCDATA)> + +<!ELEMENT TranslationPattern (#PCDATA)> + +<!ELEMENT TranslationsBinPath (#PCDATA)> + +<!ELEMENT Source (#PCDATA)> + +<!ELEMENT Sources (Source*)> + +<!ELEMENT Form (#PCDATA)> + +<!ELEMENT Forms (Form*)> + +<!ELEMENT Translation (#PCDATA)> + +<!ELEMENT Translations (Translation*)> + +<!ELEMENT TranslationException (#PCDATA)> + +<!ELEMENT TranslationExceptions (TranslationException*)> + +<!ELEMENT Resource (#PCDATA)> + +<!ELEMENT Resources (Resource*)> + +<!ELEMENT Interface (#PCDATA)> + +<!ELEMENT Interfaces (Interface*)> + +<!ELEMENT Protocol (#PCDATA)> + +<!ELEMENT Protocols (Protocol*)> + +<!ELEMENT Other (#PCDATA)> + +<!ELEMENT Others (Other*)> + +<!ELEMENT MainScript (#PCDATA)> + +<!ELEMENT VcsType (#PCDATA)> +<!ELEMENT VcsOptions (dict)> +<!ELEMENT VcsOtherData (dict)> + +<!ELEMENT Vcs (VcsType?, + VcsOptions?, + VcsOtherData?)> + +<!ELEMENT FiletypeAssociation EMPTY> +<!ATTLIST FiletypeAssociation + pattern CDATA #REQUIRED + type CDATA #REQUIRED> + +<!ELEMENT FiletypeAssociations (FiletypeAssociation*)> + +<!ELEMENT LexerAssociation EMPTY> +<!ATTLIST LexerAssociation + pattern CDATA #REQUIRED + lexer CDATA #REQUIRED> + +<!ELEMENT LexerAssociations (LexerAssociation*)> + +<!ELEMENT MakeParameters (dict)> + +<!ELEMENT Make (MakeParameters?)> + +<!ELEMENT IdlCompiler (IdlCompilerParameters?)> + +<!ELEMENT UicCompiler (UicCompilerParameters?)> + +<!ELEMENT RccCompiler (RccCompilerParameters?)> + +<!ELEMENT DocstringStyle (#PCDATA) + +<!ELEMENT ProjectTypeSpecificData (dict)> + +<!ELEMENT ProjectTypeSpecific (ProjectTypeSpecific?)> + +<!ELEMENT DocumentationParams (dict)> + +<!ELEMENT Documentation (DocumentationParams?)> + +<!ELEMENT PackagersParams (dict)> + +<!ELEMENT Packagers (PackagersParams?)> + +<!ELEMENT CheckersParams (dict)> + +<!ELEMENT Checkers (CheckersParams?)> + +<!ELEMENT OtherToolsParams (dict)> + +<!ELEMENT OtherTools (OtherToolsParams?)> + +<!ELEMENT Language (#PCDATA)> + +<!ELEMENT ProjectWordList (#PCDATA)> + +<!ELEMENT ProjectExcludeList (#PCDATA)> + +<!ELEMENT Hash (#PCDATA)> + +<!ELEMENT Eol EMPTY> +<!ATTLIST Eol + index CDATA #REQUIRED> + +<!ELEMENT Project (Language, + ProjectWordList?, + ProjectExcludeList?, + Hash, + ProgLanguage, + ProjectType, + Description?, + Version?, + Author?, + Email?, + TranslationPattern?, + TranslationsBinPath?, + Eol?, + Sources, + Forms, + Translations, + TranslationExceptions?, + Resources, + Interfaces, + Others, + MainScript?, + Vcs, + FiletypeAssociations, + LexerAssociations?, + Make?, + IdlCompiler?, + UicCompiler?, + RccCompiler?, + DocstringStyle?, + ProjectTypeSpecific?, + Documentation?, + Packagers?, + Checkers?, + OtherTools?)> +<!ATTLIST Project + version CDATA #REQUIRED>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DTDs/Session-6.3.dtd Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,131 @@ +<!-- This is the DTD for eric's (project) session file version 6.3 --> + +<!ELEMENT MultiProject (#PCDATA)> + +<!ELEMENT Project (#PCDATA)> + +<!ELEMENT ViewManagerSplits (#PCDATA)> +<!ATTLIST ViewManagerSplits + count CDATA #REQUIRED + orientation CDATA #REQUIRED> + +<!ELEMENT Filename (#PCDATA)> +<!ATTLIST Filename + cline CDATA #REQUIRED + cindex CDATA #REQUIRED + folds CDATA #REQUIRED + zoom CDATA #REQUIRED + cloned CDATA #REQUIRED + splitindex CDATA #REQUIRED + editorindex CDATA #REQUIRED> + +<!ELEMENT Filenames (Filename*)> + +<!ELEMENT ActiveWindow (#PCDATA)> +<!ATTLIST ActiveWindow + cline CDATA #REQUIRED + cindex CDATA #REQUIRED> + +<!ELEMENT BpFilename (#PCDATA)> +<!ELEMENT Linenumber EMPTY> +<!ATTLIST Linenumber + value CDATA #REQUIRED> +<!ELEMENT Condition (#PCDATA)> +<!ELEMENT Temporary EMPTY> +<!ATTLIST Temporary + value CDATA #REQUIRED> +<!ELEMENT Enabled EMPTY> +<!ATTLIST Enabled + value CDATA #REQUIRED> +<!ELEMENT Count EMPTY> +<!ATTLIST Count + value CDATA #REQUIRED> + +<!ELEMENT Breakpoint (BpFilename, + Linenumber, + Condition, + Temporary, + Enabled, + Count)> + +<!ELEMENT Breakpoints (Breakpoint*)> + +<!ELEMENT Special (#PCDATA)> + +<!ELEMENT Watchexpression (Condition, + Temporary, + Enabled, + Count, + Special)> + +<!ELEMENT Watchexpressions (Watchexpression*)> + +<!ELEMENT Exception (#PCDATA)> + +<!ELEMENT IgnoredException (#PCDATA)> + +<!ELEMENT VirtualEnv (#PCDATA)> +<!ELEMENT CommandLine (#PCDATA)> +<!ELEMENT WorkingDirectory (#PCDATA)> +<!ELEMENT Environment (#PCDATA)> +<!ELEMENT ReportExceptions EMPTY> +<!ATTLIST ReportExceptions + value CDATA #REQUIRED> +<!ELEMENT Exceptions (Exception*)> +<!ELEMENT IgnoredExceptions (IgnoredException*)> +<!ELEMENT AutoClearShell EMPTY> +<!ATTLIST AutoClearShell + value CDATA #REQUIRED> +<!ELEMENT TracePython EMPTY> +<!ATTLIST TracePython + value CDATA #REQUIRED> +<!ELEMENT AutoContinue EMPTY> +<!ATTLIST AutoContinue + value CDATA #REQUIRED> +<!ELEMENT EnableMultiprocess EMPTY> +<!ATTLIST EnableMultiprocess + value CDATA #REQUIRED> +<!ELEMENT MultiprocessNoDebug (#PCDATA)> +<!ELEMENT CovexcPattern (#PCDATA)> + +<!ELEMENT DebugInfo (VirtualEnv, + CommandLine, + WorkingDirectory, + Environment, + ReportExceptions, + Exceptions, + IgnoredExceptions, + AutoClearShell, + TracePython, + AutoContinue, + EnableMultiprocess, + MultiprocessNoDebug, + CovexcPattern)> + +<!ELEMENT BmFilename (#PCDATA)> + +<!ELEMENT Bookmark (BmFilename, + Linenumber)> + +<!ELEMENT Bookmarks (Bookmark*)> + +<!ELEMENT ExpandedItemName (#PCDATA)> + +<!ELEMENT ProjectBrowserState (ExpandedItemName*)> +<!ATTLIST ProjectBrowserState + name CDATA #REQUIRED> + +<!ELEMENT ProjectBrowserStates (ProjectBrowserState*)> + +<!ELEMENT Session (MultiProject?, + Project?, + ViewManagerSplits?, + Filenames, + ActiveWindow?, + Breakpoints, + Watchexpressions, + DebugInfo, + Bookmarks, + ProjectBrowserStates?)> +<!ATTLIST Session + version CDATA #REQUIRED>
--- a/docs/changelog Sun Jan 17 13:53:08 2021 +0100 +++ b/docs/changelog Mon Feb 01 10:38:16 2021 +0100 @@ -1,5 +1,55 @@ Change Log ---------- +Version 21.2: +- bug fixes +- General + -- added support for PyQt6 + -- added support for PySide6 +- Code Style Checker + -- added a commented code whitelist patterns to the Miscellaneous Checker + -- added support for the '@yield' and '@ytype' tags +- Debugger + -- added support for debugging multiprocess scripts using these methods + --- QProcess.start(), QProcess.startDetached() + --- subprocess.Popen() + --- multiprocessing.Process() + --- os.spawnl...(), os.spawnv...(), os.posix_spawn...(), os.fork(), + os.fork_exec() + --- _winapi.CreateProcess(), _subprocess.CreateProcess() + -- added support for debugging code strings (-c, --code) or script modules + (-m, --module) + -- added support for the "Continue Until" action execution code until the + current cursor line (if it is greater than the current line) or until + returning from the current frame +- Documentation Generator + -- added support for the '@yield' and '@ytype' tags to document generators +- Editor + -- added code to enclose the current selection by entering ", ' or a bracket + ( (, ), [, ], {, }, <, > ) characters + -- extended the exporters to support sub-styles + -- added functionality to insert docstring templates via the context menu + (cursor placed on first line of function definition), after entering + the docstring start string (e.g. """ for Python) or via a keyboard + shortcut (default: Ctrl+Alt+D) when cursor is either placed on the + function definition line or after the end of the function definition +- Find File Dialog + -- added option to exclude hidden files and directories + -- changed directory tree search logic to derive the file patterns from the + project file type associations, if the directory to be searched is a + sub-directory of the project +- User Interface + -- added capability to show Qt6 documentation (configurable) +- VirtualEnv Manager + -- improved the handling of virtual environments slightly +- Web-Browser + -- added an error page for not supported eric: URLs +- Third Party packages + -- updated eradicate.py to 2.0.0 + -- updated chardet to 4.0.0 + -- updated coverage.py to 5.3.1 + -- updated editorconfig to 0.12.3 + -- updated Pygments to 2.7.4 + Version 21.1: - bug fixes
--- a/eric6.e4p Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6.e4p Mon Feb 01 10:38:16 2021 +0100 @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE Project SYSTEM "Project-6.3.dtd"> +<!DOCTYPE Project SYSTEM "Project-6.5.dtd"> <!-- eric project file for project eric6 --> -<!-- Copyright (C) 2020 Detlev Offenbach, detlev@die-offenbachs.de --> -<Project version="6.3"> +<!-- Copyright (C) 2021 Detlev Offenbach, detlev@die-offenbachs.de --> +<Project version="6.5"> <Language>en_US</Language> <ProjectWordList>Dictionaries/words.dic</ProjectWordList> <ProjectExcludeList>Dictionaries/excludes.dic</ProjectExcludeList> <Hash>df7daa8781250f7664e6ecaeaf1361fa2efd39ee</Hash> - <ProgLanguage mixed="1">Python3</ProgLanguage> + <ProgLanguage mixed="0">Python3</ProgLanguage> <ProjectType>PyQt5</ProjectType> - <Description>eric6 is an integrated development environment for the Python language. It uses the PyQt5 bindings and the QScintilla2 editor widget. It may be used with PyQt4 as well.</Description> + <Description>eric6 is an integrated development environment for the Python language. It uses the PyQt5 bindings and the QScintilla2 editor widget.</Description> <Version>6.x</Version> <Author>Detlev Offenbach</Author> <Email>detlev@die-offenbachs.de</Email> @@ -49,7 +49,12 @@ <Source>eric6/DebugClients/Python/DebugUtilities.py</Source> <Source>eric6/DebugClients/Python/DebugVariables.py</Source> <Source>eric6/DebugClients/Python/FlexCompleter.py</Source> + <Source>eric6/DebugClients/Python/ModuleLoader.py</Source> + <Source>eric6/DebugClients/Python/MultiProcessDebugExtension.py</Source> + <Source>eric6/DebugClients/Python/MultiprocessingExtension.py</Source> <Source>eric6/DebugClients/Python/PyProfile.py</Source> + <Source>eric6/DebugClients/Python/QProcessExtension.py</Source> + <Source>eric6/DebugClients/Python/SubprocessExtension.py</Source> <Source>eric6/DebugClients/Python/ThreadExtension.py</Source> <Source>eric6/DebugClients/Python/__init__.py</Source> <Source>eric6/DebugClients/Python/coverage/__init__.py</Source> @@ -133,6 +138,7 @@ <Source>eric6/E5Gui/E5Application.py</Source> <Source>eric6/E5Gui/E5ClickableLabel.py</Source> <Source>eric6/E5Gui/E5ComboBox.py</Source> + <Source>eric6/E5Gui/E5ComboSelectionDialog.py</Source> <Source>eric6/E5Gui/E5Completers.py</Source> <Source>eric6/E5Gui/E5ErrorMessage.py</Source> <Source>eric6/E5Gui/E5ErrorMessageFilterDialog.py</Source> @@ -180,7 +186,6 @@ <Source>eric6/E5Network/E5GoogleMail.py</Source> <Source>eric6/E5Network/E5GoogleMailHelpers.py</Source> <Source>eric6/E5Network/E5NetworkHeaderDetailsDialog.py</Source> - <Source>eric6/E5Network/E5NetworkIcon.py</Source> <Source>eric6/E5Network/E5NetworkProxyFactory.py</Source> <Source>eric6/E5Network/E5RFC6266.py</Source> <Source>eric6/E5Network/E5SslCertificateSelectionDialog.py</Source> @@ -325,6 +330,7 @@ <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/__init__.py</Source> <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/translations.py</Source> <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousChecker.py</Source> + <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousDefaults.py</Source> <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/__init__.py</Source> <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/translations.py</Source> <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/Naming/NamingStyleChecker.py</Source> @@ -808,12 +814,20 @@ <Source>eric6/Project/SpellingPropertiesDialog.py</Source> <Source>eric6/Project/TranslationPropertiesDialog.py</Source> <Source>eric6/Project/UicCompilerOptionsDialog.py</Source> - <Source>eric6/Project/UicLoadUi.py</Source> + <Source>eric6/Project/UicLoadUi5.py</Source> + <Source>eric6/Project/UicLoadUi6.py</Source> <Source>eric6/Project/UserPropertiesDialog.py</Source> <Source>eric6/Project/__init__.py</Source> <Source>eric6/PyUnit/UnittestDialog.py</Source> <Source>eric6/PyUnit/__init__.py</Source> <Source>eric6/QScintilla/APIsManager.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/BaseDocstringGenerator.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/EricdocGenerator.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/GoogledocGenerator.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/NumpydocGenerator.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/PyDocstringGenerator.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/SphinxdocGenerator.py</Source> + <Source>eric6/QScintilla/DocstringGenerator/__init__.py</Source> <Source>eric6/QScintilla/Editor.py</Source> <Source>eric6/QScintilla/EditorAssembly.py</Source> <Source>eric6/QScintilla/EditorButtonsWidget.py</Source> @@ -946,16 +960,18 @@ <Source>eric6/ThirdParty/CharDet/chardet/jisfreq.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/jpcntx.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/langbulgarianmodel.py</Source> - <Source>eric6/ThirdParty/CharDet/chardet/langcyrillicmodel.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/langgreekmodel.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/langhebrewmodel.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/langhungarianmodel.py</Source> + <Source>eric6/ThirdParty/CharDet/chardet/langrussianmodel.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/langthaimodel.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/langturkishmodel.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/latin1prober.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/mbcharsetprober.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/mbcsgroupprober.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/mbcssm.py</Source> + <Source>eric6/ThirdParty/CharDet/chardet/metadata/__init__.py</Source> + <Source>eric6/ThirdParty/CharDet/chardet/metadata/languages.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/sbcharsetprober.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/sbcsgroupprober.py</Source> <Source>eric6/ThirdParty/CharDet/chardet/sjisprober.py</Source> @@ -964,12 +980,13 @@ <Source>eric6/ThirdParty/CharDet/chardet/version.py</Source> <Source>eric6/ThirdParty/EditorConfig/__init__.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/__init__.py</Source> + <Source>eric6/ThirdParty/EditorConfig/editorconfig/__main__.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/compat.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/exceptions.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/fnmatch.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/handler.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/ini.py</Source> - <Source>eric6/ThirdParty/EditorConfig/editorconfig/main.py</Source> + <Source>eric6/ThirdParty/EditorConfig/editorconfig/version.py</Source> <Source>eric6/ThirdParty/EditorConfig/editorconfig/versiontools.py</Source> <Source>eric6/ThirdParty/Jasy/__init__.py</Source> <Source>eric6/ThirdParty/Jasy/jasy/__init__.py</Source> @@ -1636,6 +1653,7 @@ <Form>eric6/Debugger/StartRunDialog.ui</Form> <Form>eric6/Debugger/VariableDetailDialog.ui</Form> <Form>eric6/Debugger/VariablesFilterDialog.ui</Form> + <Form>eric6/E5Gui/E5ComboSelectionDialog.ui</Form> <Form>eric6/E5Gui/E5ErrorMessageFilterDialog.ui</Form> <Form>eric6/E5Gui/E5ListSelectionDialog.ui</Form> <Form>eric6/E5Gui/E5PlainTextDialog.ui</Form> @@ -1987,7 +2005,7 @@ <Form>eric6/UI/FindFileDialog.ui</Form> <Form>eric6/UI/FindFileNameDialog.ui</Form> <Form>eric6/UI/InstallInfoDialog.ui</Form> - <Form>eric6/UI/NotificationWidget.ui</Form> + <Form>eric6/UI/NotificationFrame.ui</Form> <Form>eric6/UI/NumbersWidget.ui</Form> <Form>eric6/UI/Previewers/PreviewerQSS.ui</Form> <Form>eric6/UI/PythonDisViewer.ui</Form> @@ -2262,6 +2280,7 @@ <Other>eric6/WebBrowser/UserAgent/UserAgentDefaults.xml</Other> <Other>eric6/WebBrowser/data/html/adblockPage.html</Other> <Other>eric6/WebBrowser/data/html/authenticationErrorPage.html</Other> + <Other>eric6/WebBrowser/data/html/ericErrorPage.html</Other> <Other>eric6/WebBrowser/data/html/speeddialPage.html</Other> <Other>eric6/WebBrowser/data/html/startPage.html</Other> <Other>eric6/WebBrowser/data/html/tabCrashPage.html</Other> @@ -2436,6 +2455,7 @@ </dict> </UicCompilerParameters> </UicCompiler> + <DocstringStyle>ericdoc</DocstringStyle> <Documentation> <DocumentationParams> <dict> @@ -2745,6 +2765,26 @@ <value> <bool>False</bool> </value> + <key> + <string>WhiteList</string> + </key> + <value> + <list> + <string>pylint</string> + <string>pyright</string> + <string>noqa</string> + <string>type:\s*ignore</string> + <string>fmt:\s*(on|off)</string> + <string>TODO</string> + <string>FIXME</string> + <string>WARNING</string> + <string>NOTE</string> + <string>TEST</string> + <string>DOCU</string> + <string>XXX</string> + <string>- </string> + </list> + </value> </dict> </value> <key>
--- a/eric6/APIs/Python3/eric6.api Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/APIs/Python3/eric6.api Mon Feb 01 10:38:16 2021 +0100 @@ -250,7 +250,7 @@ eric6.DebugClients.Python.DCTestResult.DCTestResult.stopTest?4(test) eric6.DebugClients.Python.DCTestResult.DCTestResult?1(dbgClient, failfast) eric6.DebugClients.Python.DebugBase.DebugBase._fnCache?8 -eric6.DebugClients.Python.DebugBase.DebugBase._set_stopinfo?5(stopframe, returnframe) +eric6.DebugClients.Python.DebugBase.DebugBase._set_stopinfo?5(stopframe, returnframe, stoplineno=0) eric6.DebugClients.Python.DebugBase.DebugBase.bootstrap?4(target, args, kwargs) eric6.DebugClients.Python.DebugBase.DebugBase.break_here?4(frame) eric6.DebugClients.Python.DebugBase.DebugBase.filesToSkip?7 @@ -265,7 +265,7 @@ eric6.DebugClients.Python.DebugBase.DebugBase.pollTimerEnabled?7 eric6.DebugClients.Python.DebugBase.DebugBase.profile?4(frame, event, arg) eric6.DebugClients.Python.DebugBase.DebugBase.profileWithRecursion?4(frame, event, arg) -eric6.DebugClients.Python.DebugBase.DebugBase.run?4(cmd, globalsDict=None, localsDict=None, debug=True) +eric6.DebugClients.Python.DebugBase.DebugBase.run?4(cmd, globalsDict=None, localsDict=None, debug=True, closeSession=True) eric6.DebugClients.Python.DebugBase.DebugBase.setRecursionDepth?4(frame) eric6.DebugClients.Python.DebugBase.DebugBase.set_continue?4(special) eric6.DebugClients.Python.DebugBase.DebugBase.set_next?4(frame) @@ -273,6 +273,7 @@ eric6.DebugClients.Python.DebugBase.DebugBase.set_return?4(frame) eric6.DebugClients.Python.DebugBase.DebugBase.set_step?4() eric6.DebugClients.Python.DebugBase.DebugBase.set_trace?4(frame=None) +eric6.DebugClients.Python.DebugBase.DebugBase.set_until?4(frame=None, lineno=None) eric6.DebugClients.Python.DebugBase.DebugBase.step?4(traceMode) eric6.DebugClients.Python.DebugBase.DebugBase.stepOut?4() eric6.DebugClients.Python.DebugBase.DebugBase.stop_here?4(frame) @@ -291,34 +292,34 @@ eric6.DebugClients.Python.DebugClientBase.DebugClientBase.arrayTypes?7 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.clientCapabilities?7 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.close?4(fd) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.connectDebugger?4(port, remoteAddress=None, redirect=True) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.connectDebugger?4(port, remoteAddress=None, redirect=True, name="") eric6.DebugClients.Python.DebugClientBase.DebugClientBase.eventLoop?4(disablePolling=False) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.eventPoll?4() -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.fork?4() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.getCoding?4() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.getRunning?4() eric6.DebugClients.Python.DebugClientBase.DebugClientBase.handleJsonCommand?4(jsonStr) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.input?4(prompt, echo=True) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.main?4() -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.progTerminated?4(status, message="") +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.progTerminated?4(status, message="", closeSession=True) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.readReady?4(stream) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.run_call?4(scriptname, func, *args) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendCallTrace?4(event, fromInfo, toInfo) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendClearTemporaryBreakpoint?4(filename, lineno) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendClearTemporaryWatch?4(condition) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendException?4(exceptionType, exceptionMessage, stack) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendDebuggerId?4(debuggerId) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendException?4(exceptionType, exceptionMessage, stack, threadName) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendJsonCommand?4(method, params) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendPassiveStartup?4(filename, exceptions) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendResponseLine?4(stack) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendSyntaxError?4(message, filename, lineno, charno) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendResponseLine?4(stack, threadName) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendSyntaxError?4(message, filename, lineno, charno, threadName) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sessionClose?4(terminate=True) eric6.DebugClients.Python.DebugClientBase.DebugClientBase.setDisassembly?4(disassembly) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.startDebugger?4(filename=None, host=None, port=None, enableTrace=True, exceptions=True, tracePython=False, redirect=True) -eric6.DebugClients.Python.DebugClientBase.DebugClientBase.startProgInDebugger?4(progargs, wd='', host=None, port=None, exceptions=True, tracePython=False, redirect=True) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.skipMultiProcessDebugging?4(scriptName) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.startDebugger?4(filename=None, host=None, port=None, enableTrace=True, exceptions=True, tracePython=False, redirect=True, passive=True, multiprocessSupport=False) +eric6.DebugClients.Python.DebugClientBase.DebugClientBase.startProgInDebugger?4(progargs, wd='', host=None, port=None, exceptions=True, tracePython=False, redirect=True, passive=True, multiprocessSupport=False, codeStr="", scriptModule="") eric6.DebugClients.Python.DebugClientBase.DebugClientBase.writeReady?4(stream) eric6.DebugClients.Python.DebugClientBase.DebugClientBase?1() eric6.DebugClients.Python.DebugClientBase.DebugClientClose?4(fd) -eric6.DebugClients.Python.DebugClientBase.DebugClientFork?4() eric6.DebugClients.Python.DebugClientBase.DebugClientInput?4(prompt="") eric6.DebugClients.Python.DebugClientBase.DebugClientInstance?7 eric6.DebugClients.Python.DebugClientBase.DebugClientSetRecursionLimit?4(limit) @@ -333,12 +334,22 @@ eric6.DebugClients.Python.DebugConfig.BatchSize?7 eric6.DebugClients.Python.DebugConfig.ConfigKnownQtTypes?7 eric6.DebugClients.Python.DebugConfig.ConfigQtNames?7 -eric6.DebugClients.Python.DebugConfig.ConfigVarTypeStrings?7 +eric6.DebugClients.Python.DebugConfig.SpecialAttributes?7 eric6.DebugClients.Python.DebugUtilities.ArgInfo?7 +eric6.DebugClients.Python.DebugUtilities.PYTHON_NAMES?7 eric6.DebugClients.Python.DebugUtilities._getfullargs?5(co) eric6.DebugClients.Python.DebugUtilities.formatargvalues?4(args, varargs, varkw, localsDict, formatarg=str, formatvarargs=lambda name: '*' + name, formatvarkw=lambda name: '**' + name, formatvalue=lambda value: '=' + repr(value)) eric6.DebugClients.Python.DebugUtilities.getargvalues?4(frame) +eric6.DebugClients.Python.DebugUtilities.isExecutable?4(program) +eric6.DebugClients.Python.DebugUtilities.isPythonProgram?4(program) +eric6.DebugClients.Python.DebugUtilities.isWindowsPlatform?4() +eric6.DebugClients.Python.DebugUtilities.patchArgumentStringWindows?4(debugClient, argStr) +eric6.DebugClients.Python.DebugUtilities.patchArguments?4(debugClient, arguments, noRedirect=False) eric6.DebugClients.Python.DebugUtilities.prepareJsonCommand?4(method, params) +eric6.DebugClients.Python.DebugUtilities.quoteArgs?4(args) +eric6.DebugClients.Python.DebugUtilities.removeQuotesFromArgs?4(args) +eric6.DebugClients.Python.DebugUtilities.startsWithShebang?4(program) +eric6.DebugClients.Python.DebugUtilities.stringToArgumentsWindows?4(args) eric6.DebugClients.Python.DebugVariables.ArrayResolver.TypeCodeMap?7 eric6.DebugClients.Python.DebugVariables.ArrayResolver.getDictionary?4(var) eric6.DebugClients.Python.DebugVariables.ArrayResolver.resolve?4(var, attribute) @@ -375,6 +386,39 @@ eric6.DebugClients.Python.FlexCompleter.Completer.global_matches?4(text) eric6.DebugClients.Python.FlexCompleter.Completer?1(namespace=None) eric6.DebugClients.Python.FlexCompleter.get_class_members?4(klass) +eric6.DebugClients.Python.ModuleLoader.ModuleLoader.create_module?4(spec) +eric6.DebugClients.Python.ModuleLoader.ModuleLoader.exec_module?4(module) +eric6.DebugClients.Python.ModuleLoader.ModuleLoader.find_spec?4(fullname, path, target=None) +eric6.DebugClients.Python.ModuleLoader.ModuleLoader?1(debugClient) +eric6.DebugClients.Python.MultiProcessDebugExtension._debugClient?8 +eric6.DebugClients.Python.MultiProcessDebugExtension._shallPatch?5() +eric6.DebugClients.Python.MultiProcessDebugExtension.createCreateProcess?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createExecl?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createExecv?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createExecve?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createFork?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createForkExec?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createPosixSpawn?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createSpawnl?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createSpawnv?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.createSpawnve?4(originalName) +eric6.DebugClients.Python.MultiProcessDebugExtension.newCreateProcess?4(appName, cmdline, *args) +eric6.DebugClients.Python.MultiProcessDebugExtension.newExecl?4(path, *args) +eric6.DebugClients.Python.MultiProcessDebugExtension.newExecv?4(path, args) +eric6.DebugClients.Python.MultiProcessDebugExtension.newExecve?4(path, args, env) +eric6.DebugClients.Python.MultiProcessDebugExtension.newFork?4() +eric6.DebugClients.Python.MultiProcessDebugExtension.newForkExec?4(args, *other_args) +eric6.DebugClients.Python.MultiProcessDebugExtension.newPosixSpawn?4(path, argv, env, **kwargs) +eric6.DebugClients.Python.MultiProcessDebugExtension.newSpawnl?4(mode, path, *args) +eric6.DebugClients.Python.MultiProcessDebugExtension.newSpawnv?4(mode, path, args) +eric6.DebugClients.Python.MultiProcessDebugExtension.newSpawnve?4(mode, path, args, env) +eric6.DebugClients.Python.MultiProcessDebugExtension.patchModule?4(module, functionName, createFunction) +eric6.DebugClients.Python.MultiProcessDebugExtension.patchNewProcessFunctions?4(multiprocessEnabled, debugClient) +eric6.DebugClients.Python.MultiprocessingExtension.ProcessWrapper._bootstrap?5(*args, **kwargs) +eric6.DebugClients.Python.MultiprocessingExtension._debugClient?8 +eric6.DebugClients.Python.MultiprocessingExtension._originalBootstrap?8 +eric6.DebugClients.Python.MultiprocessingExtension._originalProcess?8 +eric6.DebugClients.Python.MultiprocessingExtension.patchMultiprocessing?4(module, debugClient) eric6.DebugClients.Python.PyProfile.PyProfile.dispatch?7 eric6.DebugClients.Python.PyProfile.PyProfile.dump_stats?4(file) eric6.DebugClients.Python.PyProfile.PyProfile.erase?4() @@ -382,6 +426,16 @@ eric6.DebugClients.Python.PyProfile.PyProfile.save?4() eric6.DebugClients.Python.PyProfile.PyProfile.trace_dispatch_call?4(frame, t) eric6.DebugClients.Python.PyProfile.PyProfile?1(basename, timer=None, bias=None) +eric6.DebugClients.Python.QProcessExtension.QProcessWrapper._origQProcessStartDetached?8 +eric6.DebugClients.Python.QProcessExtension.QProcessWrapper.start?4(*args, **kwargs) +eric6.DebugClients.Python.QProcessExtension.QProcessWrapper.startDetached?4(*args, **kwargs) +eric6.DebugClients.Python.QProcessExtension.QProcessWrapper.startDetachedStatic?4(**kwargs) +eric6.DebugClients.Python.QProcessExtension.QProcessWrapper?1(parent=None) +eric6.DebugClients.Python.QProcessExtension._debugClient?8 +eric6.DebugClients.Python.QProcessExtension.patchQProcess?4(module, debugClient) +eric6.DebugClients.Python.SubprocessExtension.PopenWrapper?1(arguments, *args, **kwargs) +eric6.DebugClients.Python.SubprocessExtension._debugClient?8 +eric6.DebugClients.Python.SubprocessExtension.patchSubprocess?4(module, debugClient) eric6.DebugClients.Python.ThreadExtension.DummyThreadWrapper?1(*args, **kwargs) eric6.DebugClients.Python.ThreadExtension.QRunnableWrapper?1(*args, **kwargs) eric6.DebugClients.Python.ThreadExtension.QThreadWrapper?1(*args, **kwargs) @@ -389,10 +443,12 @@ eric6.DebugClients.Python.ThreadExtension.ThreadExtension._bootstrapQThread?5(run) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.attachThread?4(target=None, args=None, kwargs=None, mainThread=False) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.dumpThreadList?4() -eric6.DebugClients.Python.ThreadExtension.ThreadExtension.find_module?4(fullname, path=None) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.getExecutedFrame?4(frame) -eric6.DebugClients.Python.ThreadExtension.ThreadExtension.load_module?4(fullname) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.lockClient?4(blocking=True) +eric6.DebugClients.Python.ThreadExtension.ThreadExtension.patchGreenlet?4(module) +eric6.DebugClients.Python.ThreadExtension.ThreadExtension.patchPyThread?4(module) +eric6.DebugClients.Python.ThreadExtension.ThreadExtension.patchPyThreading?4(module) +eric6.DebugClients.Python.ThreadExtension.ThreadExtension.patchQThread?4(module) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.setCurrentThread?4(threadId) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.threadTerminated?4(threadId) eric6.DebugClients.Python.ThreadExtension.ThreadExtension.unlockClient?4() @@ -441,6 +497,7 @@ eric6.Debugger.BreakPointViewer.BreakPointViewer?1(parent=None) eric6.Debugger.CallStackViewer.CallStackViewer.FilenameRole?7 eric6.Debugger.CallStackViewer.CallStackViewer.LinenoRole?7 +eric6.Debugger.CallStackViewer.CallStackViewer.clear?4() eric6.Debugger.CallStackViewer.CallStackViewer.frameSelected?7 eric6.Debugger.CallStackViewer.CallStackViewer.setDebugger?4(debugUI) eric6.Debugger.CallStackViewer.CallStackViewer.setProjectMode?4(enabled) @@ -457,9 +514,8 @@ eric6.Debugger.CallTraceViewer.CallTraceViewer.on_stopTraceButton_clicked?4() eric6.Debugger.CallTraceViewer.CallTraceViewer.setProjectMode?4(enabled) eric6.Debugger.CallTraceViewer.CallTraceViewer.sourceFile?7 -eric6.Debugger.CallTraceViewer.CallTraceViewer?1(debugServer, parent=None) +eric6.Debugger.CallTraceViewer.CallTraceViewer?1(debugServer, debugViewer, parent=None) eric6.Debugger.Config.ConfigVarTypeDispStrings?7 -eric6.Debugger.Config.ConfigVarTypeFilters?7 eric6.Debugger.DebugClientCapabilities.HasAll?7 eric6.Debugger.DebugClientCapabilities.HasCompleter?7 eric6.Debugger.DebugClientCapabilities.HasCoverage?7 @@ -476,7 +532,9 @@ eric6.Debugger.DebugServer.DebugServer.clientClearBreak?7 eric6.Debugger.DebugServer.DebugServer.clientClearWatch?7 eric6.Debugger.DebugServer.DebugServer.clientCompletionList?7 +eric6.Debugger.DebugServer.DebugServer.clientDebuggerId?7 eric6.Debugger.DebugServer.DebugServer.clientDisassembly?7 +eric6.Debugger.DebugServer.DebugServer.clientDisconnected?7 eric6.Debugger.DebugServer.DebugServer.clientException?7 eric6.Debugger.DebugServer.DebugServer.clientExit?7 eric6.Debugger.DebugServer.DebugServer.clientGone?7 @@ -510,69 +568,78 @@ eric6.Debugger.DebugServer.DebugServer.getClientCapabilities?4(clientType) eric6.Debugger.DebugServer.DebugServer.getClientInterpreter?4() eric6.Debugger.DebugServer.DebugServer.getClientType?4() +eric6.Debugger.DebugServer.DebugServer.getDebuggerIds?4() eric6.Debugger.DebugServer.DebugServer.getExtensions?4(language) eric6.Debugger.DebugServer.DebugServer.getHostAddress?4(localhost) eric6.Debugger.DebugServer.DebugServer.getSupportedLanguages?4(shellOnly=False) eric6.Debugger.DebugServer.DebugServer.getWatchPointModel?4() +eric6.Debugger.DebugServer.DebugServer.initializeClient?4(debuggerId) eric6.Debugger.DebugServer.DebugServer.isClientProcessUp?4() eric6.Debugger.DebugServer.DebugServer.isConnected?4() eric6.Debugger.DebugServer.DebugServer.isDebugging?4() +eric6.Debugger.DebugServer.DebugServer.lastClientExited?7 +eric6.Debugger.DebugServer.DebugServer.masterClientConnected?4() eric6.Debugger.DebugServer.DebugServer.passiveDebugStarted?7 -eric6.Debugger.DebugServer.DebugServer.passiveStartUp?4(fn, exc) +eric6.Debugger.DebugServer.DebugServer.passiveStartUp?4(fn, exc, debuggerId) eric6.Debugger.DebugServer.DebugServer.preferencesChanged?4() eric6.Debugger.DebugServer.DebugServer.registerDebuggerInterface?4(interfaceName, getRegistryData, reregister=False) eric6.Debugger.DebugServer.DebugServer.remoteBanner?4() -eric6.Debugger.DebugServer.DebugServer.remoteBreakpoint?4(fn, line, setBreakpoint, cond=None, temp=False) +eric6.Debugger.DebugServer.DebugServer.remoteBreakpoint?4(debuggerId, fn, line, setBreakpoint, cond=None, temp=False) eric6.Debugger.DebugServer.DebugServer.remoteCapabilities?4() -eric6.Debugger.DebugServer.DebugServer.remoteClientDisassembly?4() -eric6.Debugger.DebugServer.DebugServer.remoteClientSetFilter?4(scope, filterStr) -eric6.Debugger.DebugServer.DebugServer.remoteClientVariable?4(scope, filterList, var, framenr=0) -eric6.Debugger.DebugServer.DebugServer.remoteClientVariables?4(scope, filterList, framenr=0) -eric6.Debugger.DebugServer.DebugServer.remoteCompletion?4(text) -eric6.Debugger.DebugServer.DebugServer.remoteContinue?4(special=False) +eric6.Debugger.DebugServer.DebugServer.remoteClientDisassembly?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.remoteClientSetFilter?4(debuggerId, scope, filterStr) +eric6.Debugger.DebugServer.DebugServer.remoteClientStack?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.remoteClientVariable?4(debuggerId, scope, filterList, var, framenr=0, maxSize=0) +eric6.Debugger.DebugServer.DebugServer.remoteClientVariables?4(debuggerId, scope, filterList, framenr=0) +eric6.Debugger.DebugServer.DebugServer.remoteCompletion?4(debuggerId, text) +eric6.Debugger.DebugServer.DebugServer.remoteContinue?4(debuggerId, special=False) +eric6.Debugger.DebugServer.DebugServer.remoteContinueUntil?4(debuggerId, line) eric6.Debugger.DebugServer.DebugServer.remoteCoverage?4(venvName, fn, argv, wd, env, autoClearShell=True, erase=False, forProject=False, runInConsole=False, clientType="") eric6.Debugger.DebugServer.DebugServer.remoteEnvironment?4(env) -eric6.Debugger.DebugServer.DebugServer.remoteLoad?4(venvName, fn, argv, wd, env, autoClearShell=True, tracePython=False, autoContinue=True, forProject=False, runInConsole=False, autoFork=False, forkChild=False, clientType="", enableCallTrace=False) -eric6.Debugger.DebugServer.DebugServer.remoteMoveIP?4(line) +eric6.Debugger.DebugServer.DebugServer.remoteLoad?4(venvName, fn, argv, wd, env, autoClearShell=True, tracePython=False, autoContinue=True, forProject=False, runInConsole=False, clientType="", enableCallTrace=False, enableMultiprocess=False, multiprocessNoDebug="") +eric6.Debugger.DebugServer.DebugServer.remoteMoveIP?4(debuggerId, line) eric6.Debugger.DebugServer.DebugServer.remoteProfile?4(venvName, fn, argv, wd, env, autoClearShell=True, erase=False, forProject=False, runInConsole=False, clientType="") -eric6.Debugger.DebugServer.DebugServer.remoteRawInput?4(s) -eric6.Debugger.DebugServer.DebugServer.remoteRun?4(venvName, fn, argv, wd, env, autoClearShell=True, forProject=False, runInConsole=False, autoFork=False, forkChild=False, clientType="") -eric6.Debugger.DebugServer.DebugServer.remoteSetThread?4(tid) -eric6.Debugger.DebugServer.DebugServer.remoteStatement?4(stmt) -eric6.Debugger.DebugServer.DebugServer.remoteStep?4() -eric6.Debugger.DebugServer.DebugServer.remoteStepOut?4() -eric6.Debugger.DebugServer.DebugServer.remoteStepOver?4() -eric6.Debugger.DebugServer.DebugServer.remoteStepQuit?4() -eric6.Debugger.DebugServer.DebugServer.remoteThreadList?4() +eric6.Debugger.DebugServer.DebugServer.remoteRawInput?4(debuggerId, inputString) +eric6.Debugger.DebugServer.DebugServer.remoteRun?4(venvName, fn, argv, wd, env, autoClearShell=True, forProject=False, runInConsole=False, clientType="") +eric6.Debugger.DebugServer.DebugServer.remoteSetThread?4(debuggerId, tid) +eric6.Debugger.DebugServer.DebugServer.remoteStatement?4(debuggerId, stmt) +eric6.Debugger.DebugServer.DebugServer.remoteStep?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.remoteStepOut?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.remoteStepOver?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.remoteStepQuit?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.remoteThreadList?4(debuggerId) eric6.Debugger.DebugServer.DebugServer.remoteUTDiscover?4(clientType, forProject, venvName, syspath, workdir, discoveryStart) eric6.Debugger.DebugServer.DebugServer.remoteUTPrepare?4(fn, tn, tfn, failed, cov, covname, coverase, clientType="", forProject=False, venvName="", syspath=None, workdir="", discover=False, discoveryStart="", testCases=None, debug=False) eric6.Debugger.DebugServer.DebugServer.remoteUTRun?4(debug=False, failfast=False) eric6.Debugger.DebugServer.DebugServer.remoteUTStop?4() -eric6.Debugger.DebugServer.DebugServer.setCallTraceEnabled?4(on) +eric6.Debugger.DebugServer.DebugServer.setCallTraceEnabled?4(debuggerId, on) eric6.Debugger.DebugServer.DebugServer.setDebugging?4(on) eric6.Debugger.DebugServer.DebugServer.shutdownServer?4() -eric6.Debugger.DebugServer.DebugServer.signalClientBanner?4(version, platform, debugClient, venvName) -eric6.Debugger.DebugServer.DebugServer.signalClientBreakConditionError?4(filename, lineno) -eric6.Debugger.DebugServer.DebugServer.signalClientCallTrace?4(isCall, fromFile, fromLine, fromFunction, toFile, toLine, toFunction) +eric6.Debugger.DebugServer.DebugServer.signalClientBanner?4(version, platform, venvName) +eric6.Debugger.DebugServer.DebugServer.signalClientBreakConditionError?4(filename, lineno, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientCallTrace?4(isCall, fromFile, fromLine, fromFunction, toFile, toLine, toFunction, debuggerId) eric6.Debugger.DebugServer.DebugServer.signalClientCapabilities?4(capabilities, clientType, venvName) -eric6.Debugger.DebugServer.DebugServer.signalClientClearBreak?4(filename, lineno) -eric6.Debugger.DebugServer.DebugServer.signalClientClearWatch?4(condition) -eric6.Debugger.DebugServer.DebugServer.signalClientCompletionList?4(completionList, text) -eric6.Debugger.DebugServer.DebugServer.signalClientDisassembly?4(disassembly) -eric6.Debugger.DebugServer.DebugServer.signalClientException?4(exceptionType, exceptionMessage, stackTrace) -eric6.Debugger.DebugServer.DebugServer.signalClientExit?4(status, message="") -eric6.Debugger.DebugServer.DebugServer.signalClientLine?4(filename, lineno, forStack=False) -eric6.Debugger.DebugServer.DebugServer.signalClientOutput?4(line) -eric6.Debugger.DebugServer.DebugServer.signalClientRawInput?4(prompt, echo) -eric6.Debugger.DebugServer.DebugServer.signalClientSignal?4(message, filename, lineNo, funcName, funcArgs) -eric6.Debugger.DebugServer.DebugServer.signalClientStack?4(stack) -eric6.Debugger.DebugServer.DebugServer.signalClientStatement?4(more) -eric6.Debugger.DebugServer.DebugServer.signalClientSyntaxError?4(message, filename, lineNo, characterNo) -eric6.Debugger.DebugServer.DebugServer.signalClientThreadList?4(currentId, threadList) -eric6.Debugger.DebugServer.DebugServer.signalClientThreadSet?4() -eric6.Debugger.DebugServer.DebugServer.signalClientVariable?4(scope, variables) -eric6.Debugger.DebugServer.DebugServer.signalClientVariables?4(scope, variables) -eric6.Debugger.DebugServer.DebugServer.signalClientWatchConditionError?4(condition) +eric6.Debugger.DebugServer.DebugServer.signalClientClearBreak?4(filename, lineno, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientClearWatch?4(condition, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientCompletionList?4(completionList, text, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientDebuggerId?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientDisassembly?4(disassembly, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientDisconnected?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientException?4(exceptionType, exceptionMessage, stackTrace, debuggerId, threadName="") +eric6.Debugger.DebugServer.DebugServer.signalClientExit?4(program, status, message, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientLine?4(filename, lineno, debuggerId, forStack=False, threadName="") +eric6.Debugger.DebugServer.DebugServer.signalClientOutput?4(line, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientRawInput?4(prompt, echo, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientSignal?4(message, filename, lineNo, funcName, funcArgs, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientStack?4(stack, debuggerId, threadName="") +eric6.Debugger.DebugServer.DebugServer.signalClientStatement?4(more, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientSyntaxError?4(message, filename, lineNo, characterNo, debuggerId, threadName="") +eric6.Debugger.DebugServer.DebugServer.signalClientThreadList?4(currentId, threadList, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientThreadSet?4(debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientVariable?4(scope, variables, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientVariables?4(scope, variables, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalClientWatchConditionError?4(condition, debuggerId) +eric6.Debugger.DebugServer.DebugServer.signalLastClientExited?4() eric6.Debugger.DebugServer.DebugServer.startClient?4(unplanned=True, clType=None, forProject=False, runInConsole=False, venvName="", workingDir=None) eric6.Debugger.DebugServer.DebugServer.unregisterDebuggerInterface?4(interfaceName) eric6.Debugger.DebugServer.DebugServer.utDiscovered?7 @@ -596,6 +663,7 @@ eric6.Debugger.DebugUI.DebugUI.exceptionInterrupt?7 eric6.Debugger.DebugUI.DebugUI.executeMake?7 eric6.Debugger.DebugUI.DebugUI.getActions?4() +eric6.Debugger.DebugUI.DebugUI.getSelectedDebuggerId?4() eric6.Debugger.DebugUI.DebugUI.initActions?4() eric6.Debugger.DebugUI.DebugUI.initMenus?4() eric6.Debugger.DebugUI.DebugUI.initToolbars?4(toolbarManager) @@ -603,24 +671,35 @@ eric6.Debugger.DebugUI.DebugUI.setArgvHistory?4(argsStr, clearHistories=False, history=None) eric6.Debugger.DebugUI.DebugUI.setAutoClearShell?4(autoClearShell) eric6.Debugger.DebugUI.DebugUI.setAutoContinue?4(autoContinue) +eric6.Debugger.DebugUI.DebugUI.setDebugActionsEnabled?4(enable) +eric6.Debugger.DebugUI.DebugUI.setEnableMultiprocess?4(enableMultiprocess) eric6.Debugger.DebugUI.DebugUI.setEnvHistory?4(envStr, clearHistories=False, history=None) eric6.Debugger.DebugUI.DebugUI.setExcIgnoreList?4(excIgnoreList) eric6.Debugger.DebugUI.DebugUI.setExcList?4(excList) eric6.Debugger.DebugUI.DebugUI.setExceptionReporting?4(exceptions) +eric6.Debugger.DebugUI.DebugUI.setMultiprocessNoDebugHistory?4(noDebugList, clearHistories=False, history=None) eric6.Debugger.DebugUI.DebugUI.setTracePython?4(tracePython) eric6.Debugger.DebugUI.DebugUI.setWdHistory?4(wdStr, clearHistories=False, history=None) +eric6.Debugger.DebugUI.DebugUI.showNotification?4(notification, kind=NotificationTypes.Information, timeout=None) eric6.Debugger.DebugUI.DebugUI.shutdown?4() eric6.Debugger.DebugUI.DebugUI.shutdownServer?4() eric6.Debugger.DebugUI.DebugUI.variablesFilter?4(scope) eric6.Debugger.DebugUI.DebugUI?1(ui, vm, debugServer, debugViewer, project) +eric6.Debugger.DebugViewer.DebugViewer.DebuggerStateRole?7 +eric6.Debugger.DebugViewer.DebugViewer.StateIcon?7 +eric6.Debugger.DebugViewer.DebugViewer.StateMessage?7 +eric6.Debugger.DebugViewer.DebugViewer.ThreadIdRole?7 eric6.Debugger.DebugViewer.DebugViewer.clearCallTrace?4() eric6.Debugger.DebugViewer.DebugViewer.currentWidget?4() -eric6.Debugger.DebugViewer.DebugViewer.handleClientStack?4(stack) +eric6.Debugger.DebugViewer.DebugViewer.getSelectedDebuggerId?4() +eric6.Debugger.DebugViewer.DebugViewer.getSelectedDebuggerState?4() +eric6.Debugger.DebugViewer.DebugViewer.handleClientStack?4(stack, debuggerId) eric6.Debugger.DebugViewer.DebugViewer.handleDebuggingStarted?4() eric6.Debugger.DebugViewer.DebugViewer.handlePreferencesChanged?4() -eric6.Debugger.DebugViewer.DebugViewer.handleResetUI?4() +eric6.Debugger.DebugViewer.DebugViewer.handleResetUI?4(fullReset) eric6.Debugger.DebugViewer.DebugViewer.initCallStackViewer?4(projectMode) eric6.Debugger.DebugViewer.DebugViewer.isCallTraceEnabled?4() +eric6.Debugger.DebugViewer.DebugViewer.isOnlyDebugger?4() eric6.Debugger.DebugViewer.DebugViewer.preferencesChanged?7 eric6.Debugger.DebugViewer.DebugViewer.setCallTraceToProjectMode?4(enabled) eric6.Debugger.DebugViewer.DebugViewer.setCurrentWidget?4(widget) @@ -628,7 +707,6 @@ eric6.Debugger.DebugViewer.DebugViewer.setGlobalsFilter?4() eric6.Debugger.DebugViewer.DebugViewer.setLocalsFilter?4() eric6.Debugger.DebugViewer.DebugViewer.setVariablesFilter?4(globalsFilter, localsFilter) -eric6.Debugger.DebugViewer.DebugViewer.showThreadList?4(currentID, threadList) eric6.Debugger.DebugViewer.DebugViewer.showVariable?4(vlist, showGlobals) eric6.Debugger.DebugViewer.DebugViewer.showVariables?4(vlist, showGlobals) eric6.Debugger.DebugViewer.DebugViewer.showVariablesTab?4(showGlobals) @@ -636,43 +714,46 @@ eric6.Debugger.DebugViewer.DebugViewer?1(debugServer, parent=None) eric6.Debugger.DebuggerInterfaceNone.ClientDefaultCapabilities?7 eric6.Debugger.DebuggerInterfaceNone.ClientTypeAssociations?7 -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.flush?4() eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.getClientCapabilities?4() +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.getDebuggerIds?4() eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.isConnected?4() eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.newConnection?4(sock) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBanner?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpoint?4(fn, line, setBreakpoint, cond=None, temp=False) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpointEnable?4(fn, line, enable) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpointIgnore?4(fn, line, count) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCapabilities?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientSetFilter?4(scope, filterStr) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariable?4(scope, filterList, var, framenr=0, maxSize=0) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariables?4(scope, filterList, framenr=0, maxSize=0) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCompletion?4(text) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteContinue?4(special=False) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpoint?4(debuggerId, fn, line, setBreakpoint, cond=None, temp=False) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpointEnable?4(debuggerId, fn, line, enable) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteBreakpointIgnore?4(debuggerId, fn, line, count) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCapabilities?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientDisassembly?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientSetFilter?4(debuggerId, scope, filterStr) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientStack?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariable?4(debuggerId, scope, filterList, var, framenr=0, maxSize=0) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteClientVariables?4(debuggerId, scope, filterList, framenr=0, maxSize=0) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCompletion?4(debuggerId, text) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteContinue?4(debuggerId, special=False) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteContinueUntil?4(debuggerId, line) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteCoverage?4(fn, argv, wd, erase=False) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteEnvironment?4(env) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteEval?4(arg) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteLoad?4(fn, argv, wd, traceInterpreter=False, autoContinue=True, autoFork=False, forkChild=False) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteMoveIP?4(line) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteLoad?4(fn, argv, wd, traceInterpreter=False, autoContinue=True, enableMultiprocess=False) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteMoveIP?4(debuggerId, line) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteNoDebugList?4(debuggerId, noDebugList) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteProfile?4(fn, argv, wd, erase=False) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteRawInput?4(s) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteRun?4(fn, argv, wd, autoFork=False, forkChild=False) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteSetThread?4(tid) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStatement?4(stmt) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStep?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStepOut?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStepOver?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStepQuit?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteThreadList?4() +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteRawInput?4(debuggerId, inputString) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteRun?4(fn, argv, wd) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteSetThread?4(debuggerId, tid) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStatement?4(debuggerId, stmt) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStep?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStepOut?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStepOver?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteStepQuit?4(debuggerId) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteThreadList?4(debuggerId) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteUTDiscover?4(syspath, workdir, discoveryStart) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteUTPrepare?4(fn, tn, tfn, failed, cov, covname, coverase, syspath, workdir, discover, discoveryStart, testCases, debug) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteUTRun?4(debug, failfast) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteUTStop?4() -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteWatchpoint?4(cond, setWatch, temp=False) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteWatchpointEnable?4(cond, enable) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteWatchpointIgnore?4(cond, count) -eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.setCallTraceEnabled?4(on) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteWatchpoint?4(debuggerId, cond, setWatch, temp=False) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteWatchpointEnable?4(debuggerId, cond, enable) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.remoteWatchpointIgnore?4(debuggerId, cond, count) +eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.setCallTraceEnabled?4(debuggerId, on) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.shutdown?4() eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.startRemote?4(port, runInConsole, venvName, originalPathString, workingDir=None) eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.startRemoteForProject?4(port, runInConsole, venvName, originalPathString, workingDir=None) @@ -680,43 +761,46 @@ eric6.Debugger.DebuggerInterfaceNone.createDebuggerInterfaceNone?4(debugServer, passive) eric6.Debugger.DebuggerInterfaceNone.getRegistryData?4() eric6.Debugger.DebuggerInterfacePython.ClientDefaultCapabilities?7 -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.flush?4() eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.getClientCapabilities?4() +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.getDebuggerIds?4() eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.isConnected?4() eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.newConnection?4(sock) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBanner?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpoint?4(fn, line, setBreakpoint, cond=None, temp=False) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpointEnable?4(fn, line, enable) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpointIgnore?4(fn, line, count) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCapabilities?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientDisassembly?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientSetFilter?4(scope, filterStr) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariable?4(scope, filterList, var, framenr=0, maxSize=0) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariables?4(scope, filterList, framenr=0, maxSize=0) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCompletion?4(text) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteContinue?4(special=False) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpoint?4(debuggerId, fn, line, setBreakpoint, cond=None, temp=False) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpointEnable?4(debuggerId, fn, line, enable) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteBreakpointIgnore?4(debuggerId, fn, line, count) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCapabilities?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientDisassembly?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientSetFilter?4(debuggerId, scope, filterStr) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientStack?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariable?4(debuggerId, scope, filterList, var, framenr=0, maxSize=0) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteClientVariables?4(debuggerId, scope, filterList, framenr=0, maxSize=0) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCompletion?4(debuggerId, text) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteContinue?4(debuggerId, special=False) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteContinueUntil?4(debuggerId, line) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteCoverage?4(fn, argv, wd, erase=False) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteEnvironment?4(env) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteLoad?4(fn, argv, wd, traceInterpreter=False, autoContinue=True, autoFork=False, forkChild=False) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteMoveIP?4(line) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteLoad?4(fn, argv, wd, traceInterpreter=False, autoContinue=True, enableMultiprocess=False) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteMoveIP?4(debuggerId, line) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteNoDebugList?4(debuggerId, noDebugList) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteProfile?4(fn, argv, wd, erase=False) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteRawInput?4(s) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteRun?4(fn, argv, wd, autoFork=False, forkChild=False) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteSetThread?4(tid) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStatement?4(stmt) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStep?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStepOut?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStepOver?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStepQuit?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteThreadList?4() +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteRawInput?4(debuggerId, inputString) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteRun?4(fn, argv, wd) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteSetThread?4(debuggerId, tid) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStatement?4(debuggerId, stmt) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStep?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStepOut?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStepOver?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteStepQuit?4(debuggerId) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteThreadList?4(debuggerId) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteUTDiscover?4(syspath, workdir, discoveryStart) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteUTPrepare?4(fn, tn, tfn, failed, cov, covname, coverase, syspath, workdir, discover, discoveryStart, testCases, debug) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteUTRun?4(debug, failfast) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteUTStop?4() -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteWatchpoint?4(cond, setWatch, temp=False) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteWatchpointEnable?4(cond, enable) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteWatchpointIgnore?4(cond, count) -eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.setCallTraceEnabled?4(on) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteWatchpoint?4(debuggerId, cond, setWatch, temp=False) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteWatchpointEnable?4(debuggerId, cond, enable) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.remoteWatchpointIgnore?4(debuggerId, cond, count) +eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.setCallTraceEnabled?4(debuggerId, on) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.shutdown?4() eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.startRemote?4(port, runInConsole, venvName, originalPathString, workingDir=None) eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.startRemoteForProject?4(port, runInConsole, venvName, originalPathString, workingDir=None) @@ -729,7 +813,7 @@ eric6.Debugger.EditBreakpointDialog.EditBreakpointDialog?1(breakPointId, properties, condHistory, parent=None, name=None, modal=False, addMode=False, filenameHistory=None) eric6.Debugger.EditWatchpointDialog.EditWatchpointDialog.getData?4() eric6.Debugger.EditWatchpointDialog.EditWatchpointDialog?1(properties, parent=None, name=None, modal=False) -eric6.Debugger.ExceptionLogger.ExceptionLogger.addException?4(exceptionType, exceptionMessage, stackTrace) +eric6.Debugger.ExceptionLogger.ExceptionLogger.addException?4(exceptionType, exceptionMessage, stackTrace, debuggerId) eric6.Debugger.ExceptionLogger.ExceptionLogger.debuggingStarted?4() eric6.Debugger.ExceptionLogger.ExceptionLogger.sourceFile?7 eric6.Debugger.ExceptionLogger.ExceptionLogger?1(parent=None) @@ -746,11 +830,10 @@ eric6.Debugger.StartDialog.StartDialog.getDebugData?4() eric6.Debugger.StartDialog.StartDialog.getHistories?4() eric6.Debugger.StartDialog.StartDialog.getProfilingData?4() -eric6.Debugger.StartDialog.StartDialog.getRunData?4() eric6.Debugger.StartDialog.StartDialog.historiesModified?4() eric6.Debugger.StartDialog.StartDialog.on_buttonBox_clicked?4(button) eric6.Debugger.StartDialog.StartDialog.on_modFuncCombo_editTextChanged?4() -eric6.Debugger.StartDialog.StartDialog?1(caption, lastUsedVenvName, argvList, wdList, envList, exceptions, parent=None, dialogType=0, modfuncList=None, tracePython=False, autoClearShell=True, autoContinue=True, autoFork=False, forkChild=False) +eric6.Debugger.StartDialog.StartDialog?1(caption, lastUsedVenvName, argvList, wdList, envList, exceptions, parent=None, dialogType=0, modfuncList=None, tracePython=False, autoClearShell=True, autoContinue=True, enableMultiprocess=False, multiprocessNoDebugHistory=None) eric6.Debugger.StartHistoryEditDialog.StartHistoryEditDialog.getHistory?4() eric6.Debugger.StartHistoryEditDialog.StartHistoryEditDialog.on_deleteAllButton_clicked?4() eric6.Debugger.StartHistoryEditDialog.StartHistoryEditDialog.on_deleteButton_clicked?4() @@ -768,7 +851,6 @@ eric6.Debugger.VariablesViewer.VariableItem.arrayTypes?7 eric6.Debugger.VariablesViewer.VariableItem.noOfItemsStr?7 eric6.Debugger.VariablesViewer.VariableItem.nonExpandableTypes?7 -eric6.Debugger.VariablesViewer.VariableItem.populated?4() eric6.Debugger.VariablesViewer.VariableItem.rx_nonprintable?7 eric6.Debugger.VariablesViewer.VariableItem.unsized?7 eric6.Debugger.VariablesViewer.VariableItem?1(parent, dvar, dtype, dvalue) @@ -881,6 +963,8 @@ eric6.DocumentationTools.TemplatesListsStyle.signalsListEntryTemplate?7 eric6.DocumentationTools.TemplatesListsStyle.signalsListTemplate?7 eric6.DocumentationTools.TemplatesListsStyle.sinceInfoTemplate?7 +eric6.DocumentationTools.TemplatesListsStyle.yieldTypesTemplate?7 +eric6.DocumentationTools.TemplatesListsStyle.yieldsTemplate?7 eric6.DocumentationTools.TemplatesListsStyleCSS.authorInfoTemplate?7 eric6.DocumentationTools.TemplatesListsStyleCSS.classTemplate?7 eric6.DocumentationTools.TemplatesListsStyleCSS.constructorTemplate?7 @@ -918,6 +1002,8 @@ eric6.DocumentationTools.TemplatesListsStyleCSS.signalsListEntryTemplate?7 eric6.DocumentationTools.TemplatesListsStyleCSS.signalsListTemplate?7 eric6.DocumentationTools.TemplatesListsStyleCSS.sinceInfoTemplate?7 +eric6.DocumentationTools.TemplatesListsStyleCSS.yieldTypesTemplate?7 +eric6.DocumentationTools.TemplatesListsStyleCSS.yieldsTemplate?7 eric6.DocumentationTools.supportedExtensionsDictForApis?7 eric6.E5Graphics.E5ArrowItem.ArrowheadAngleFactor?7 eric6.E5Graphics.E5ArrowItem.E5ArrowItem.boundingRect?4() @@ -993,6 +1079,9 @@ eric6.E5Gui.E5ComboBox.E5ComboBox.inactiveText?4() eric6.E5Gui.E5ComboBox.E5ComboBox.setInactiveText?4(inactiveText) eric6.E5Gui.E5ComboBox.E5ComboBox?1(parent=None, inactiveText="") +eric6.E5Gui.E5ComboSelectionDialog.E5ComboSelectionDialog.getSelection?4() +eric6.E5Gui.E5ComboSelectionDialog.E5ComboSelectionDialog.on_selectionComboBox_currentTextChanged?4(txt) +eric6.E5Gui.E5ComboSelectionDialog.E5ComboSelectionDialog?1(entries, title="", message="", parent=None) eric6.E5Gui.E5Completers.E5DirCompleter.rootPath?4() eric6.E5Gui.E5Completers.E5DirCompleter.setRootPath?4(path) eric6.E5Gui.E5Completers.E5DirCompleter?1(parent=None, completionMode=QCompleter.PopupCompletion, showHidden=False) @@ -1581,9 +1670,6 @@ eric6.E5Network.E5GoogleMailHelpers.isClientSecretFileAvailable?4() eric6.E5Network.E5NetworkHeaderDetailsDialog.E5NetworkHeaderDetailsDialog.setData?4(name, value) eric6.E5Network.E5NetworkHeaderDetailsDialog.E5NetworkHeaderDetailsDialog?1(parent=None) -eric6.E5Network.E5NetworkIcon.E5NetworkIcon.isOnline?4() -eric6.E5Network.E5NetworkIcon.E5NetworkIcon.onlineStateChanged?7 -eric6.E5Network.E5NetworkIcon.E5NetworkIcon?1(parent=None) eric6.E5Network.E5NetworkProxyFactory.E5NetworkProxyFactory.queryProxy?4(query) eric6.E5Network.E5NetworkProxyFactory.E5NetworkProxyFactory?1() eric6.E5Network.E5NetworkProxyFactory.HostnameMatcher.match?4(host) @@ -1728,6 +1814,7 @@ eric6.E5XML.Config.projectFileFormatVersionIdl?7 eric6.E5XML.Config.projectFileFormatVersionMake?7 eric6.E5XML.Config.projectFileFormatVersionProto?7 +eric6.E5XML.Config.projectFileFormatVersionRcc?7 eric6.E5XML.Config.projectFileFormatVersionUic?7 eric6.E5XML.Config.sessionFileFormatVersion?7 eric6.E5XML.Config.shortcutsFileFormatVersion?7 @@ -2315,6 +2402,7 @@ eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.canStartPlotter?4() eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.canStartRepl?4() eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.deviceName?4() +eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.downloadFirmware?4() eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.forceInterrupt?4() eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.getDocumentationUrl?4() eric6.MicroPython.MicroPythonDevices.MicroPythonDevice.getFirmwareUrl?4() @@ -2428,9 +2516,10 @@ eric6.MicroPython.MicrobitDevices.MicrobitDevice.canStartPlotter?4() eric6.MicroPython.MicrobitDevices.MicrobitDevice.canStartRepl?4() eric6.MicroPython.MicrobitDevices.MicrobitDevice.deviceName?4() +eric6.MicroPython.MicrobitDevices.MicrobitDevice.downloadFirmware?4() eric6.MicroPython.MicrobitDevices.MicrobitDevice.forceInterrupt?4() eric6.MicroPython.MicrobitDevices.MicrobitDevice.getDocumentationUrl?4() -eric6.MicroPython.MicrobitDevices.MicrobitDevice.getFirmwareUrl?4() +eric6.MicroPython.MicrobitDevices.MicrobitDevice.getFirmwareUrl?4(fwtype="mpy") eric6.MicroPython.MicrobitDevices.MicrobitDevice.getWorkspace?4() eric6.MicroPython.MicrobitDevices.MicrobitDevice.hasTimeCommands?4() eric6.MicroPython.MicrobitDevices.MicrobitDevice.runScript?4(script) @@ -2964,10 +3053,12 @@ eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.noFiles?7 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.noResults?7 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_addBuiltinButton_clicked?4() +eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_addWhitelistButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_builtinsAssignmentList_itemSelectionChanged?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_buttonBox_clicked?4(button) eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_cancelButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked?4() +eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_deleteWhitelistButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_excludeMessagesSelectButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_fixButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_fixIssuesSelectButton_clicked?4() @@ -2982,6 +3073,7 @@ eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_startButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_statisticsButton_clicked?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_storeDefaultButton_clicked?4() +eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_whitelistWidget_itemSelectionChanged?4() eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.positionRole?7 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.prepare?4(fileList, project) eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.start?4(fn, save=False, repeat=None) @@ -3086,6 +3178,7 @@ eric6.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousChecker.TextVisitor.visit_Str?4(node) eric6.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousChecker.TextVisitor?1() eric6.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousChecker.composeCallPath?4(node) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousDefaults.MiscellaneousCheckerDefaultArgs?7 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.translations._miscellaneousMessages?8 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.translations._miscellaneousMessagesSampleArgs?8 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Naming.NamingStyleChecker.NamingStyleChecker.CamelcaseRegexp?7 @@ -3239,16 +3332,30 @@ eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.SecurityUtils.namespacePathSplit?4(path) eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.translations._securityMessages?8 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.translations._securityMessagesSampleArgs?8 -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.MULTILINE_ASSIGNMENT_REGEX?7 -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.PARTIAL_DICTIONARY_REGEX?7 -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.comment_contains_code?4(line, aggressive=True) -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.commented_out_code_line_numbers?4(source, aggressive=True) -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.detect_encoding?4(filename) -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.filter_commented_out_code?4(source, aggressive=True) -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.fix_file?4(filename, args, standard_out) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.BRACKET_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.CODE_INDICATORS?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.CODE_KEYWORDS?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.CODE_KEYWORDS_AGGR?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.CODING_COMMENT_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.DEFAULT_WHITELIST?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.DEF_STATEMENT_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.FOR_STATEMENT_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.HASH_NUMBER?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.MULTILINE_ASSIGNMENT_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.PARTIAL_DICTIONARY_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.PRINT_RETURN_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.WHITELIST_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.WHITESPACE_HASH?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.WITH_STATEMENT_REGEX?7 +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.comment_contains_code?4(line, aggressive=True) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.commented_out_code_line_numbers?4(source, aggressive=True) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.detect_encoding?4(filename) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.filter_commented_out_code?4(source, aggressive=True) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.fix_file?4(filename, args, standard_out) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.multiline_case?4(line, aggressive=True) +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.open_with_encoding?4(filename, encoding, mode='r') +eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.Eradicator.update_whitelist?4(new_whitelist, extend_default=True) eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.main?4(argv, standard_out, standard_error) -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.multiline_case?4(line, aggressive=True) -eric6.Plugins.CheckerPlugins.CodeStyleChecker.eradicate.open_with_encoding?4(filename, encoding, mode='r') eric6.Plugins.CheckerPlugins.CodeStyleChecker.mccabe.ASTVisitor.default?4(node, *args) eric6.Plugins.CheckerPlugins.CodeStyleChecker.mccabe.ASTVisitor.dispatch?4(node, *args) eric6.Plugins.CheckerPlugins.CodeStyleChecker.mccabe.ASTVisitor.preorder?4(tree, visitor, *args) @@ -4561,12 +4668,12 @@ eric6.Plugins.VcsPlugins.vcsGit.git.Git?1(plugin, parent=None, name=None) eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog.on_headsList_itemSelectionChanged?4() -eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog?1(vcs, ppath, parent=None) +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.HgCloseHeadSelectionDialog.HgCloseHeadSelectionDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.initActions?4() eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.initMenu?4(mainMenu) eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.ProjectHelper.CloseheadProjectHelper?1() -eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead.hgCloseheads?4(name, revisions=None) +eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead.hgCloseheads?4(revisions=None) eric6.Plugins.VcsPlugins.vcsMercurial.CloseheadExtension.closehead.Closehead?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.Config.ConfigHgSchemes?7 eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.on_configButton_clicked?4() @@ -4588,15 +4695,15 @@ eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.HgGpgSignaturesDialog.HgGpgSignaturesDialog.on_rxEdit_textChanged?4(txt) eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.HgGpgSignaturesDialog.HgGpgSignaturesDialog.on_signaturesList_itemSelectionChanged?4() eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.HgGpgSignaturesDialog.HgGpgSignaturesDialog.on_verifyButton_clicked?4() -eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.HgGpgSignaturesDialog.HgGpgSignaturesDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.HgGpgSignaturesDialog.HgGpgSignaturesDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.HgGpgSignaturesDialog.HgGpgSignaturesDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.ProjectHelper.GpgProjectHelper.initActions?4() eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.ProjectHelper.GpgProjectHelper.initMenu?4(mainMenu) eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.ProjectHelper.GpgProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.ProjectHelper.GpgProjectHelper?1() -eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.hgGpgSign?4(path, revisions=None) -eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.hgGpgSignatures?4(path) -eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.hgGpgVerifySignatures?4(path, rev=None) +eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.hgGpgSign?4(revisions=None) +eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.hgGpgSignatures?4() +eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.hgGpgVerifySignatures?4(rev=None) eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg.shutdown?4() eric6.Plugins.VcsPlugins.vcsMercurial.GpgExtension.gpg.Gpg?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.HgAddSubrepositoryDialog.HgAddSubrepositoryDialog.getData?4() @@ -4645,13 +4752,13 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksInOutDialog.HgBookmarksInOutDialog.OUTGOING?7 eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksInOutDialog.HgBookmarksInOutDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksInOutDialog.HgBookmarksInOutDialog.on_buttonBox_clicked?4(button) -eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksInOutDialog.HgBookmarksInOutDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksInOutDialog.HgBookmarksInOutDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksInOutDialog.HgBookmarksInOutDialog?1(vcs, mode, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog.on_bookmarksList_customContextMenuRequested?4(pos) eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog.on_buttonBox_clicked?4(button) eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog.on_refreshButton_clicked?4() -eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog.start?4(path, bookmarksList) +eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog.start?4(bookmarksList) eric6.Plugins.VcsPlugins.vcsMercurial.HgBookmarksListDialog.HgBookmarksListDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgBranchInputDialog.HgBranchInputDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgBranchInputDialog.HgBranchInputDialog.on_branchComboBox_editTextChanged?4(txt) @@ -4673,6 +4780,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.ReturnFormat?7 eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.cancel?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.func?4() +eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.getRepository?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.isExecuting?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.myprompt?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgClient.HgClient.restartServer?4() @@ -4710,7 +4818,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgConflictsListDialog.HgConflictsListDialog.on_resolvedButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgConflictsListDialog.HgConflictsListDialog.on_unresolvedButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgConflictsListDialog.HgConflictsListDialog.show?4() -eric6.Plugins.VcsPlugins.vcsMercurial.HgConflictsListDialog.HgConflictsListDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.HgConflictsListDialog.HgConflictsListDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgConflictsListDialog.HgConflictsListDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgCopyDialog.HgCopyDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgCopyDialog.HgCopyDialog.on_targetPicker_textChanged?4(txt) @@ -4719,7 +4827,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgDialog.HgDialog.normalExit?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgDialog.HgDialog.normalExitWithoutErrors?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgDialog.HgDialog.on_buttonBox_clicked?4(button) -eric6.Plugins.VcsPlugins.vcsMercurial.HgDialog.HgDialog.startProcess?4(args, workingDir=None, showArgs=True, environment=None) +eric6.Plugins.VcsPlugins.vcsMercurial.HgDialog.HgDialog.startProcess?4(args, showArgs=True, environment=None, client=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgDialog.HgDialog?1(text, hg=None, useClient=True, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgDiffDialog.HgDiffDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.HgDiffDialog.HgDiffDialog.on_buttonBox_clicked?4(button) @@ -4802,7 +4910,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_toDate_dateChanged?4(date) eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.on_upButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.show?4() -eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.start?4(fn, bundle=None, isFile=False, noEntries=0) +eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog.start?4(name=None, bundle=None, isFile=False, noEntries=0) eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.HgLogBrowserDialog?1(vcs, mode="", parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgLogBrowserDialog.LIGHTCOLORS?7 eric6.Plugins.VcsPlugins.vcsMercurial.HgMergeDialog.HgMergeDialog.getParameters?4() @@ -4879,13 +4987,13 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HgStatusMonitorThread.HgStatusMonitorThread?1(interval, project, vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgSummaryDialog.HgSummaryDialog.on_buttonBox_clicked?4(button) eric6.Plugins.VcsPlugins.vcsMercurial.HgSummaryDialog.HgSummaryDialog.on_refreshButton_clicked?4() -eric6.Plugins.VcsPlugins.vcsMercurial.HgSummaryDialog.HgSummaryDialog.start?4(path, mq=False, largefiles=False) +eric6.Plugins.VcsPlugins.vcsMercurial.HgSummaryDialog.HgSummaryDialog.start?4(mq=False, largefiles=False) eric6.Plugins.VcsPlugins.vcsMercurial.HgSummaryDialog.HgSummaryDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog.on_buttonBox_clicked?4(button) eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog.on_refreshButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog.on_tagList_customContextMenuRequested?4(pos) -eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog.start?4(path, tags, tagsList, allTagsList) +eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog.start?4(tags, tagsList, allTagsList) eric6.Plugins.VcsPlugins.vcsMercurial.HgTagBranchListDialog.HgTagBranchListDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.HgTagDialog.HgTagDialog.CreateGlobalTag?7 eric6.Plugins.VcsPlugins.vcsMercurial.HgTagDialog.HgTagDialog.CreateLocalTag?7 @@ -4956,9 +5064,9 @@ eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.ProjectHelper.HisteditProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.ProjectHelper.HisteditProjectHelper?1() eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditAbort?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditContinue?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditEditPlan?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditStart?4(name, rev="") +eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditContinue?4() +eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditEditPlan?4() +eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit.hgHisteditStart?4(rev="") eric6.Plugins.VcsPlugins.vcsMercurial.HisteditExtension.histedit.Histedit?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.LfConvertDataDialog.LfConvertDataDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.LfConvertDataDialog.LfConvertDataDialog.on_newProjectPicker_textChanged?4(txt) @@ -4977,8 +5085,8 @@ eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.ProjectHelper.LargefilesProjectHelper?1() eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.getDefaults?4() eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles.hgAdd?4(names, mode) -eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles.hgLfPull?4(projectDir, revisions=None) -eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles.hgLfVerify?4(projectDir, mode) +eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles.hgLfPull?4(revisions=None) +eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles.hgLfVerify?4(mode) eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles.hgLfconvert?4(direction, projectFile) eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.Largefiles?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.ProjectBrowserHelper.HgProjectBrowserHelper._addVCSMenu?5(mainMenu) @@ -5006,8 +5114,8 @@ eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.ProjectHelper.PurgeProjectHelper.initMenu?4(mainMenu) eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.ProjectHelper.PurgeProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.ProjectHelper.PurgeProjectHelper?1() -eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.Purge.hgPurge?4(name, deleteAll=False) -eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.Purge.hgPurgeList?4(name, deleteAll=False) +eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.Purge.hgPurge?4(deleteAll=False) +eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.Purge.hgPurgeList?4(deleteAll=False) eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.Purge.shutdown?4() eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.Purge?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog.closeEvent?4(e) @@ -5017,7 +5125,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog.on_guardsList_itemSelectionChanged?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog.on_patchSelector_activated?4(patch) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog.on_removeButton_clicked?4() -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesDefineGuardsDialog.HgQueuesDefineGuardsDialog?1(vcs, extension, patchesList, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesFoldDialog.HgQueuesFoldDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesFoldDialog.HgQueuesFoldDialog.on_addButton_clicked?4() @@ -5031,17 +5139,17 @@ eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesGuardsSelectionDialog.HgQueuesGuardsSelectionDialog?1(guards, activeGuards=None, listOnly=False, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesHeaderDialog.HgQueuesHeaderDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesHeaderDialog.HgQueuesHeaderDialog.on_buttonBox_clicked?4(button) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesHeaderDialog.HgQueuesHeaderDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesHeaderDialog.HgQueuesHeaderDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesHeaderDialog.HgQueuesHeaderDialog?1(vcs, parent=None) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListAllGuardsDialog.HgQueuesListAllGuardsDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListAllGuardsDialog.HgQueuesListAllGuardsDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListAllGuardsDialog.HgQueuesListAllGuardsDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListDialog.HgQueuesListDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListDialog.HgQueuesListDialog.on_buttonBox_clicked?4(button) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListDialog.HgQueuesListDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListDialog.HgQueuesListDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListDialog.HgQueuesListDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListGuardsDialog.HgQueuesListGuardsDialog.closeEvent?4(e) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListGuardsDialog.HgQueuesListGuardsDialog.on_patchSelector_activated?4(patch) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListGuardsDialog.HgQueuesListGuardsDialog.start?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListGuardsDialog.HgQueuesListGuardsDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesListGuardsDialog.HgQueuesListGuardsDialog?1(vcs, patchesList, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesNewPatchDialog.HgQueuesNewPatchDialog.NEW_MODE?7 eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesNewPatchDialog.HgQueuesNewPatchDialog.REFRESH_MODE?7 @@ -5060,7 +5168,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesQueueManagementDialog.HgQueuesQueueManagementDialog.on_nameEdit_textChanged?4(txt) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesQueueManagementDialog.HgQueuesQueueManagementDialog.on_queuesList_itemSelectionChanged?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesQueueManagementDialog.HgQueuesQueueManagementDialog.refresh?4() -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesQueueManagementDialog.HgQueuesQueueManagementDialog?1(mode, title, suppressActive, repodir, vcs, parent=None) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesQueueManagementDialog.HgQueuesQueueManagementDialog?1(mode, title, suppressActive, vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesRenamePatchDialog.HgQueuesRenamePatchDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesRenamePatchDialog.HgQueuesRenamePatchDialog.on_nameCombo_currentIndexChanged?4(txt) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.HgQueuesRenamePatchDialog.HgQueuesRenamePatchDialog.on_nameEdit_textChanged?4(txt) @@ -5079,27 +5187,27 @@ eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.QUEUE_PURGE?7 eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.SERIES_LIST?7 eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.UNAPPLIED_LIST?7 -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.getGuardsList?4(repodir, allGuards=True) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueCreateRenameQueue?4(name, isCreate) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueDeletePatch?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueDeletePurgeActivateQueue?4(name, operation) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueFinishAppliedPatches?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueFoldUnappliedPatches?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsDeactivate?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsDefine?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsDropAll?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsIdentifyActive?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsList?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsListAll?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsSetActive?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.getGuardsList?4(allGuards=True) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueCreateRenameQueue?4(isCreate) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueDeletePatch?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueDeletePurgeActivateQueue?4(operation) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueFinishAppliedPatches?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueFoldUnappliedPatches?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsDeactivate?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsDefine?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsDropAll?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsIdentifyActive?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsList?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsListAll?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueGuardsSetActive?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueInit?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueListPatches?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueListQueues?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueNewPatch?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueuePushPopPatches?4(name, operation, doAll=False, named=False, force=False) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueRefreshPatch?4(name, editMessage=False) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueRenamePatch?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueShowHeader?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueListPatches?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueListQueues?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueNewPatch?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueuePushPopPatches?4(operation, doAll=False, named=False, force=False) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueRefreshPatch?4(editMessage=False) +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueRenamePatch?4() +eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueShowHeader?4() eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueShowPatch?4(name) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.hgQueueStatus?4(name) eric6.Plugins.VcsPlugins.vcsMercurial.QueuesExtension.queues.Queues.shutdown?4() @@ -5126,9 +5234,9 @@ eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.ProjectHelper.RebaseProjectHelper.initMenu?4(mainMenu) eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.ProjectHelper.RebaseProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.ProjectHelper.RebaseProjectHelper?1() -eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase.hgRebase?4(path) -eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase.hgRebaseAbort?4(path) -eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase.hgRebaseContinue?4(path) +eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase.hgRebase?4() +eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase.hgRebaseAbort?4() +eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase.hgRebaseContinue?4() eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.Rebase?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.AgeColumn?7 eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.MessageColumn?7 @@ -5139,7 +5247,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.on_shelveList_currentItemChanged?4(current, previous) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.on_shelveList_customContextMenuRequested?4(pos) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.show?4() -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.start?4(projectDir) +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog.start?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveBrowserDialog.HgShelveBrowserDialog?1(vcs, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog.getData?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.HgShelveDataDialog.HgShelveDataDialog?1(version, parent=None) @@ -5156,13 +5264,13 @@ eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.ProjectHelper.ShelveProjectHelper.initMenu?4(mainMenu) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.ProjectHelper.ShelveProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.ProjectHelper.ShelveProjectHelper?1() -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgCleanupShelves?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgDeleteShelves?4(name, shelveNames=None) +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgCleanupShelves?4() +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgDeleteShelves?4(shelveNames=None) eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgShelve?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgShelveBrowser?4(projectDir) -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgUnshelve?4(name, shelveName="") -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgUnshelveAbort?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgUnshelveContinue?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgShelveBrowser?4() +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgUnshelve?4(shelveName="") +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgUnshelveAbort?4() +eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.hgUnshelveContinue?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve.shutdown?4() eric6.Plugins.VcsPlugins.vcsMercurial.ShelveExtension.shelve.Shelve?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.HgStripDialog.HgStripDialog.getData?4() @@ -5179,12 +5287,12 @@ eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.ProjectHelper.StripProjectHelper.initMenu?4(mainMenu) eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.ProjectHelper.StripProjectHelper.menuTitle?4() eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.ProjectHelper.StripProjectHelper?1() -eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.strip.Strip.hgStrip?4(name, rev="") +eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.strip.Strip.hgStrip?4(rev="") eric6.Plugins.VcsPlugins.vcsMercurial.StripExtension.strip.Strip?1(vcs) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.IgnoreFileName?7 eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg._createStatusMonitorThread?5(interval, project) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.activeExtensionsChanged?7 -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.canCommitMerge?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.canCommitMerge?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.canPull?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.canPush?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.clearStatusCache?4() @@ -5195,65 +5303,65 @@ eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.getHgSubPath?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.getPlugin?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hasSubrepositories?4() -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgAbortMerge?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgAbortMerge?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgAddSubrepository?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgAnnotate?4(name) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgArchive?4() -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBackout?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBisect?4(name, subcommand) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkDefine?4(name, revision=None, bookmark=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkDelete?4(name, bookmark=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkIncoming?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkMove?4(name, revision=None, bookmark=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkOutgoing?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkPull?4(name, current=False, bookmark=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkPush?4(name, current=False, bookmark=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkRename?4(name, renameInfo=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBranch?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBundle?4(name, bundleData=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgConflicts?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBackout?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBisect?4(subcommand) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkDefine?4(revision=None, bookmark=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkDelete?4(bookmark=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkIncoming?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkMove?4(revision=None, bookmark=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkOutgoing?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkPull?4(current=False, bookmark=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkPush?4(current=False, bookmark=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBookmarkRename?4(renameInfo=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBranch?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgBundle?4(bundleData=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgConflicts?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgCopy?4(name, project) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgCreateIgnoreFile?4(name, autoAdd=False) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgDeleteBackups?4() -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgEditConfig?4(name, withLargefiles=True, largefilesData=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgEditConfig?4(repoName=None, withLargefiles=True, largefilesData=None) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgEditUserConfig?4() -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgExport?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgExport?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgExtendedDiff?4(name) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgForget?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetBookmarksList?4(repodir) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetBranchesList?4(repodir) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetCurrentBranch?4(repodir) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetTagsList?4(repodir, withType=False) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGraft?4(path, revs=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetBookmarksList?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetBranchesList?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetCurrentBranch?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGetTagsList?4(withType=False) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGraft?4(revs=None) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGraftAbort?4(path) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGraftContinue?4(path) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgGraftStop?4(path) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgIdentify?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgImport?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgIncoming?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgInfo?4(ppath, mode="heads") -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgListBookmarks?4(path) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgListTagBranch?4(path, tags=True) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgIdentify?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgImport?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgIncoming?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgInfo?4(mode="heads") +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgListBookmarks?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgListTagBranch?4(tags=True) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgNormalizeURL?4(url) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgOutgoing?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPhase?4(name, data=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPreviewBundle?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPull?4(name, revisions=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPush?4(name, force=False, newBranch=False, rev=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgOutgoing?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPhase?4(data=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPreviewBundle?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPull?4(revisions=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgPush?4(force=False, newBranch=False, rev=None) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgReMerge?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgRecover?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgRecover?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgRemoveSubrepositories?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgResolved?4(name, unresolve=False) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgRevert?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgRollback?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgRollback?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgSbsDiff?4(name, extended=False, revisions=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgServe?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgShowBranch?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgShowConfig?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgShowPaths?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgServe?4(repoPath) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgShowBranch?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgShowConfig?4() +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgShowPaths?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgSummary?4(mq=False, largefiles=False) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgUnbundle?4(name, files=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgVerify?4(name) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgUnbundle?4(files=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.hgVerify?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.iniFileChanged?7 eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.initCommand?4(command) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.isExtensionActive?4(extensionName) @@ -5275,7 +5383,7 @@ eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsImport?4(vcsDataDict, projectDir, noDialog=False, addAll=True) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsInit?4(vcsDir, noDialog=False) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsInitConfig?4(project) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsLogBrowser?4(name, isFile=False) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsLogBrowser?4(name=None, isFile=False) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsMerge?4(name, rev="") eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsMove?4(name, project, target=None, noDialog=False) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsName?4() @@ -5288,8 +5396,8 @@ eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsStatus?4(name) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsSupportCommandOptions?4() eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsSwitch?4(name) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsTag?4(name, revision=None, tagName=None) -eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsUpdate?4(name, noDialog=False, revision=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsTag?4(name=None, revision=None, tagName=None) +eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg.vcsUpdate?4(name=None, noDialog=False, revision=None) eric6.Plugins.VcsPlugins.vcsMercurial.hg.Hg?1(plugin, parent=None, name=None) eric6.Plugins.VcsPlugins.vcsPySvn.Config.ConfigSvnProtocols?7 eric6.Plugins.VcsPlugins.vcsPySvn.Config.DefaultConfig?7 @@ -6375,7 +6483,15 @@ eric6.Preferences.ConfigurationPages.NetworkPage.NetworkPage.setMode?4(displayMode) eric6.Preferences.ConfigurationPages.NetworkPage.NetworkPage?1(configDialog) eric6.Preferences.ConfigurationPages.NetworkPage.create?4(dlg) +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_criticalBgButton_clicked?4() +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_criticalDefaultButton_clicked?4() +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_criticalFgButton_clicked?4() +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_criticalResetButton_clicked?4() eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_visualButton_clicked?4(checked) +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_warningBgButton_clicked?4() +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_warningDefaultButton_clicked?4() +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_warningFgButton_clicked?4() +eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.on_warningResetButton_clicked?4() eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage.save?4() eric6.Preferences.ConfigurationPages.NotificationsPage.NotificationsPage?1() eric6.Preferences.ConfigurationPages.NotificationsPage.create?4(dlg) @@ -6407,6 +6523,10 @@ eric6.Preferences.ConfigurationPages.PythonPage.PythonPage.save?4() eric6.Preferences.ConfigurationPages.PythonPage.PythonPage?1() eric6.Preferences.ConfigurationPages.PythonPage.create?4(dlg) +eric6.Preferences.ConfigurationPages.QtPage.QtPage.on_pyqt5VenvDlgButton_clicked?4() +eric6.Preferences.ConfigurationPages.QtPage.QtPage.on_pyqt6VenvDlgButton_clicked?4() +eric6.Preferences.ConfigurationPages.QtPage.QtPage.on_pyside2VenvDlgButton_clicked?4() +eric6.Preferences.ConfigurationPages.QtPage.QtPage.on_pyside6VenvDlgButton_clicked?4() eric6.Preferences.ConfigurationPages.QtPage.QtPage.on_qtPostfixEdit_textChanged?4(txt) eric6.Preferences.ConfigurationPages.QtPage.QtPage.on_qtPrefixEdit_textChanged?4(txt) eric6.Preferences.ConfigurationPages.QtPage.QtPage.save?4() @@ -6644,8 +6764,8 @@ eric6.Preferences.getProjectBrowserFlags?4(key, prefClass=Prefs) eric6.Preferences.getProtobuf?4(key, prefClass=Prefs) eric6.Preferences.getPython?4(key, prefClass=Prefs) -eric6.Preferences.getQt5DocDir?4(prefClass=Prefs) eric6.Preferences.getQt?4(key, prefClass=Prefs) +eric6.Preferences.getQtDocDir?4(version, prefClass=Prefs) eric6.Preferences.getQtTranslationsDir?4(prefClass=Prefs) eric6.Preferences.getShell?4(key, prefClass=Prefs) eric6.Preferences.getSystem?4(key, prefClass=Prefs) @@ -6844,9 +6964,11 @@ eric6.Project.Project.Project.getDebuggerFilters?4(language) eric6.Project.Project.Project.getDefaultRccCompilerParameters?4() eric6.Project.Project.Project.getDefaultSourceExtension?4() +eric6.Project.Project.Project.getDocstringType?4() eric6.Project.Project.Project.getEditorLexerAssoc?4(filename) eric6.Project.Project.Project.getEolString?4() eric6.Project.Project.Project.getFiles?4(start) +eric6.Project.Project.Project.getFiletypeAssociations?4(associationType) eric6.Project.Project.Project.getHash?4() eric6.Project.Project.Project.getMainScript?4(normalized=False) eric6.Project.Project.Project.getMenu?4(menuName) @@ -6877,6 +6999,7 @@ eric6.Project.Project.Project.getVcs?4() eric6.Project.Project.Project.handleApplicationDiagram?4() eric6.Project.Project.Project.handlePreferencesChanged?4() +eric6.Project.Project.Project.hasDefaultDocstringParameter?4() eric6.Project.Project.Project.hasDefaultIdlCompilerParameters?4() eric6.Project.Project.Project.hasDefaultMakeParameters?4() eric6.Project.Project.Project.hasDefaultRccCompilerParameters?4() @@ -6953,7 +7076,7 @@ eric6.Project.Project.Project.saveProject?4() eric6.Project.Project.Project.saveProjectAs?4() eric6.Project.Project.Project.setData?4(category, key, data) -eric6.Project.Project.Project.setDbgInfo?4(venvName, argv, wd, env, excReporting, excList, excIgnoreList, autoClearShell, tracePython=None, autoContinue=None) +eric6.Project.Project.Project.setDbgInfo?4(venvName, argv, wd, env, excReporting, excList, excIgnoreList, autoClearShell, tracePython=None, autoContinue=None, enableMultiprocess=None, multiprocessNoDebug=None) eric6.Project.Project.Project.setDirty?4(dirty) eric6.Project.Project.Project.setStatusMonitorAutoUpdate?4(auto) eric6.Project.Project.Project.setStatusMonitorInterval?4(interval) @@ -7082,7 +7205,8 @@ eric6.Project.ProjectBrowserSortFilterProxyModel.ProjectBrowserSortFilterProxyModel.filterAcceptsRow?4(source_row, source_parent) eric6.Project.ProjectBrowserSortFilterProxyModel.ProjectBrowserSortFilterProxyModel.preferencesChanged?4() eric6.Project.ProjectBrowserSortFilterProxyModel.ProjectBrowserSortFilterProxyModel?1(filterType, parent=None) -eric6.Project.ProjectFormsBrowser.ProjectFormsBrowser.PyuicIndentDefault?7 +eric6.Project.ProjectFormsBrowser.ProjectFormsBrowser.Pyuic5IndentDefault?7 +eric6.Project.ProjectFormsBrowser.ProjectFormsBrowser.Pyuic6IndentDefault?7 eric6.Project.ProjectFormsBrowser.ProjectFormsBrowser._contextMenuRequested?5(coord) eric6.Project.ProjectFormsBrowser.ProjectFormsBrowser._createPopupMenus?5() eric6.Project.ProjectFormsBrowser.ProjectFormsBrowser._initHookMethods?5() @@ -7185,9 +7309,12 @@ eric6.Project.TranslationPropertiesDialog.TranslationPropertiesDialog?1(project, new, parent) eric6.Project.UicCompilerOptionsDialog.UicCompilerOptionsDialog.getData?4() eric6.Project.UicCompilerOptionsDialog.UicCompilerOptionsDialog?1(compilerOptions, compiler, parent=None) -eric6.Project.UicLoadUi.className?4(formFile, projectPath) -eric6.Project.UicLoadUi.objectName?4(formFile, projectPath) -eric6.Project.UicLoadUi.signatures?4(formFile, projectPath) +eric6.Project.UicLoadUi5.className?4(formFile, projectPath) +eric6.Project.UicLoadUi5.objectName?4(formFile, projectPath) +eric6.Project.UicLoadUi5.signatures?4(formFile, projectPath) +eric6.Project.UicLoadUi6.className?4(formFile, projectPath) +eric6.Project.UicLoadUi6.objectName?4(formFile, projectPath) +eric6.Project.UicLoadUi6.signatures?4(formFile, projectPath) eric6.Project.UserPropertiesDialog.UserPropertiesDialog.storeData?4() eric6.Project.UserPropertiesDialog.UserPropertiesDialog?1(project, parent=None, name=None) eric6.PyUnit.UnittestDialog.QtTestResult.addError?4(test, err) @@ -7199,6 +7326,12 @@ eric6.PyUnit.UnittestDialog.QtTestResult.stopTest?4(test) eric6.PyUnit.UnittestDialog.QtTestResult?1(parent, failfast) eric6.PyUnit.UnittestDialog.UnittestDialog.ErrorsInfoRole?7 +eric6.PyUnit.UnittestDialog.UnittestDialog.FailedExpectedColorDarkTheme?7 +eric6.PyUnit.UnittestDialog.UnittestDialog.FailedExpectedColorLightTheme?7 +eric6.PyUnit.UnittestDialog.UnittestDialog.SkippedColorDarkTheme?7 +eric6.PyUnit.UnittestDialog.UnittestDialog.SkippedColorLightTheme?7 +eric6.PyUnit.UnittestDialog.UnittestDialog.SucceededUnexpectedColorDarkTheme?7 +eric6.PyUnit.UnittestDialog.UnittestDialog.SucceededUnexpectedColorLightTheme?7 eric6.PyUnit.UnittestDialog.UnittestDialog.TestCaseFileRole?7 eric6.PyUnit.UnittestDialog.UnittestDialog.TestCaseNameRole?7 eric6.PyUnit.UnittestDialog.UnittestDialog.closeEvent?4(event) @@ -7243,6 +7376,33 @@ eric6.QScintilla.APIsManager.APIsManager.getAPIs?4(language, projectType="", forPreparation=False) eric6.QScintilla.APIsManager.APIsManager.reloadAPIs?4() eric6.QScintilla.APIsManager.APIsManager?1(parent=None) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator._generateDocstringList?5(functionInfo, docstringType) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator.getDocstringType?4() +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator.hasFunctionDefinition?4(cursorPosition) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator.insertDocstring?4(cursorPosition, fromStart=True) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator.insertDocstringFromShortcut?4(cursorPosition) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator.isDocstringIntro?4(cursorPosition) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator.isFunctionStart?4(text) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.BaseDocstringGenerator?1(editor) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.DocstringMenuForEnterOnly.keyPressEvent?4(evt) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.DocstringMenuForEnterOnly?1(editor) +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.FunctionInfo?1() +eric6.QScintilla.DocstringGenerator.BaseDocstringGenerator.getIndentStr?4(text) +eric6.QScintilla.DocstringGenerator.EricdocGenerator.generateEricDoc?4(functionInfo) +eric6.QScintilla.DocstringGenerator.GoogledocGenerator.generateGoogleDoc?4(functionInfo, editor) +eric6.QScintilla.DocstringGenerator.NumpydocGenerator.generateNumpyDoc?4(functionInfo, editor) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyDocstringGenerator.hasFunctionDefinition?4(cursorPosition) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyDocstringGenerator.insertDocstring?4(cursorPosition, fromStart=True) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyDocstringGenerator.insertDocstringFromShortcut?4(cursorPosition) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyDocstringGenerator.isDocstringIntro?4(cursorPosition) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyDocstringGenerator.isFunctionStart?4(text) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyDocstringGenerator?1(editor) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyFunctionInfo.parseBody?4(text) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyFunctionInfo.parseDefinition?4(text, quote, quoteReplace) +eric6.QScintilla.DocstringGenerator.PyDocstringGenerator.PyFunctionInfo?1() +eric6.QScintilla.DocstringGenerator.SphinxdocGenerator.generateSphinxDoc?4(functionInfo) +eric6.QScintilla.DocstringGenerator.getDocstringGenerator?4(editor) +eric6.QScintilla.DocstringGenerator.getSupportedDocstringTypes?4() eric6.QScintilla.Editor.Editor.AttributeID?7 eric6.QScintilla.Editor.Editor.AttributePrivateID?7 eric6.QScintilla.Editor.Editor.AttributeProtectedID?7 @@ -7250,6 +7410,7 @@ eric6.QScintilla.Editor.Editor.ClassID?7 eric6.QScintilla.Editor.Editor.ClassPrivateID?7 eric6.QScintilla.Editor.Editor.ClassProtectedID?7 +eric6.QScintilla.Editor.Editor.EncloseChars?7 eric6.QScintilla.Editor.Editor.EndEditToken?7 eric6.QScintilla.Editor.Editor.EnumID?7 eric6.QScintilla.Editor.Editor.FromDocumentID?7 @@ -7321,6 +7482,7 @@ eric6.QScintilla.Editor.Editor.editorCommand?4(cmd) eric6.QScintilla.Editor.Editor.editorRenamed?7 eric6.QScintilla.Editor.Editor.editorSaved?7 +eric6.QScintilla.Editor.Editor.encloseSelectedText?4() eric6.QScintilla.Editor.Editor.encodingChanged?7 eric6.QScintilla.Editor.Editor.ensureVisible?4(line, expand=False) eric6.QScintilla.Editor.Editor.ensureVisibleTop?4(line, expand=False) @@ -7344,6 +7506,7 @@ eric6.QScintilla.Editor.Editor.getCoverageLines?4() eric6.QScintilla.Editor.Editor.getCurrentWord?4() eric6.QScintilla.Editor.Editor.getCurrentWordBoundaries?4() +eric6.QScintilla.Editor.Editor.getDocstringGenerator?4() eric6.QScintilla.Editor.Editor.getEditorConfig?4(option) eric6.QScintilla.Editor.Editor.getEncoding?4() eric6.QScintilla.Editor.Editor.getFileName?4() @@ -7387,6 +7550,7 @@ eric6.QScintilla.Editor.Editor.highlight?4(line=None, error=False, syntaxError=False) eric6.QScintilla.Editor.Editor.highlightVisible?4() eric6.QScintilla.Editor.Editor.indentLineOrSelection?4() +eric6.QScintilla.Editor.Editor.insertDocstring?4() eric6.QScintilla.Editor.Editor.isClone?4(editor) eric6.QScintilla.Editor.Editor.isJavascriptFile?4() eric6.QScintilla.Editor.Editor.isLastEditPositionAvailable?4() @@ -8062,9 +8226,12 @@ eric6.QScintilla.MiniEditor.MiniEditor.showSearchWidget?4() eric6.QScintilla.MiniEditor.MiniEditor.textForFind?4() eric6.QScintilla.MiniEditor.MiniEditor?1(filename="", filetype="", parent=None, name=None) +eric6.QScintilla.MiniEditor.MiniScintilla.EncloseChars?7 +eric6.QScintilla.MiniEditor.MiniScintilla.encloseSelectedText?4() eric6.QScintilla.MiniEditor.MiniScintilla.focusInEvent?4(event) eric6.QScintilla.MiniEditor.MiniScintilla.focusOutEvent?4(event) eric6.QScintilla.MiniEditor.MiniScintilla.getFileName?4() +eric6.QScintilla.MiniEditor.MiniScintilla.keyPressEvent?4(ev) eric6.QScintilla.MiniEditor.MiniScintilla.removeTrailingWhitespace?4() eric6.QScintilla.MiniEditor.MiniScintilla?1(parent=None) eric6.QScintilla.Printer.Printer.formatPage?4(painter, drawing, area, pagenr) @@ -8120,6 +8287,7 @@ eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getEolIndicator?4() eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getFileName?4() eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getFoundTarget?4() +eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getGlobalCursorPosition?4() eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getIndicatorEndPos?4(indicator, pos) eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getIndicatorStartPos?4(indicator, pos) eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getLineSeparator?4() @@ -8127,6 +8295,7 @@ eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getSelectionCount?4() eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getSelectionN?4(index) eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getSelections?4() +eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getSubStyleRange?4(styleNr) eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getVisibleLineFromDocLine?4(docLine) eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.getZoom?4() eric6.QScintilla.QsciScintillaCompat.QsciScintillaCompat.gotoNextIndicator?4(indicator, wrap) @@ -8243,7 +8412,7 @@ eric6.QScintilla.Shell.Shell.keyPressEvent?4(ev) eric6.QScintilla.Shell.Shell.loadHistory?4(clientType) eric6.QScintilla.Shell.Shell.mousePressEvent?4(event) -eric6.QScintilla.Shell.Shell.paste?4() +eric6.QScintilla.Shell.Shell.paste?4(lines=None) eric6.QScintilla.Shell.Shell.queueText?7 eric6.QScintilla.Shell.Shell.reloadHistory?4() eric6.QScintilla.Shell.Shell.saveHistory?4(clientType) @@ -8895,14 +9064,18 @@ eric6.UI.LogView.LogViewerEdit.searchPrev?4(txt, caseSensitive, wholeWord, regexp) eric6.UI.LogView.LogViewerEdit.searchStringFound?7 eric6.UI.LogView.LogViewerEdit?1(parent=None) +eric6.UI.NotificationWidget.NotificationFrame.NotificationStyleSheetTemplate?7 +eric6.UI.NotificationWidget.NotificationFrame.getIcon?4(kind) +eric6.UI.NotificationWidget.NotificationFrame.getStyleSheet?4(kind) +eric6.UI.NotificationWidget.NotificationFrame?1(icon, heading, text, kind=NotificationTypes.Information, parent=None) +eric6.UI.NotificationWidget.NotificationTypes.Critical?7 +eric6.UI.NotificationWidget.NotificationTypes.Information?7 +eric6.UI.NotificationWidget.NotificationTypes.Other?7 +eric6.UI.NotificationWidget.NotificationTypes.Warning?7 eric6.UI.NotificationWidget.NotificationWidget.mouseMoveEvent?4(evt) eric6.UI.NotificationWidget.NotificationWidget.mousePressEvent?4(evt) eric6.UI.NotificationWidget.NotificationWidget.mouseReleaseEvent?4(evt) -eric6.UI.NotificationWidget.NotificationWidget.setHeading?4(heading) -eric6.UI.NotificationWidget.NotificationWidget.setPixmap?4(icon) -eric6.UI.NotificationWidget.NotificationWidget.setText?4(text) -eric6.UI.NotificationWidget.NotificationWidget.setTimeout?4(timeout) -eric6.UI.NotificationWidget.NotificationWidget.show?4() +eric6.UI.NotificationWidget.NotificationWidget.showNotification?4(icon, heading, text, kind=NotificationTypes.Information, timeout=0) eric6.UI.NotificationWidget.NotificationWidget?1(parent=None, setPosition=False) eric6.UI.NumbersWidget.BinaryModel.columnCount?4(parent) eric6.UI.NumbersWidget.BinaryModel.data?4(index, role=Qt.DisplayRole) @@ -9073,14 +9246,11 @@ eric6.UI.UserInterface.UserInterface.getToolbarsByCategory?4(category) eric6.UI.UserInterface.UserInterface.getViewProfile?4() eric6.UI.UserInterface.UserInterface.handleUrl?4(url) -eric6.UI.UserInterface.UserInterface.isOnline?4() eric6.UI.UserInterface.UserInterface.launchHelpViewer?4(home, searchWord=None, useSingle=False) eric6.UI.UserInterface.UserInterface.masterPasswordChanged?7 eric6.UI.UserInterface.UserInterface.maxFilePathLen?7 eric6.UI.UserInterface.UserInterface.maxMenuFilePathLen?7 eric6.UI.UserInterface.UserInterface.networkAccessManager?4() -eric6.UI.UserInterface.UserInterface.notificationsEnabled?4() -eric6.UI.UserInterface.UserInterface.onlineStateChanged?7 eric6.UI.UserInterface.UserInterface.performVersionCheck?4(manual=True, alternative=0, showVersions=False) eric6.UI.UserInterface.UserInterface.preferencesChanged?7 eric6.UI.UserInterface.UserInterface.processArgs?4(args) @@ -9098,7 +9268,7 @@ eric6.UI.UserInterface.UserInterface.showFindFilesDialog?4(txt="", searchDir="", openFiles=False) eric6.UI.UserInterface.UserInterface.showLogViewer?4() eric6.UI.UserInterface.UserInterface.showMenu?7 -eric6.UI.UserInterface.UserInterface.showNotification?4(icon, heading, text, timeout=None) +eric6.UI.UserInterface.UserInterface.showNotification?4(icon, heading, text, kind=NotificationTypes.Information, timeout=None) eric6.UI.UserInterface.UserInterface.showPluginsAvailable?4() eric6.UI.UserInterface.UserInterface.showPreferences?4(pageName=None) eric6.UI.UserInterface.UserInterface.showReplaceFilesDialog?4(txt="", searchDir="", openFiles=False) @@ -9314,7 +9484,7 @@ eric6.Utilities._uunescape?8 eric6.Utilities.absolutePath?4(path, start) eric6.Utilities.absoluteUniversalPath?4(path, start) -eric6.Utilities.checkPyside?4(variant="2") +eric6.Utilities.checkPyside?4(variant=2) eric6.Utilities.codingBytes_regexps?7 eric6.Utilities.coding_regexps?7 eric6.Utilities.compactPath?4(path, width, measure=len) @@ -9372,7 +9542,7 @@ eric6.Utilities.generateDistroInfo?4(linesep='\n') eric6.Utilities.generatePluginsVersionInfo?4(linesep='\n') eric6.Utilities.generatePyQtToolPath?4(toolname, alternatives=None) -eric6.Utilities.generatePySideToolPath?4(toolname, variant="2") +eric6.Utilities.generatePySideToolPath?4(toolname, variant=2) eric6.Utilities.generateQtToolName?4(toolname) eric6.Utilities.generateVersionInfo?4(linesep='\n') eric6.Utilities.getDirs?4(path, excludeDirs) @@ -9723,7 +9893,7 @@ eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_pythonExecPicker_textChanged?4(txt) eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_remoteCheckBox_toggled?4(checked) eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_targetDirectoryPicker_textChanged?4(txt) -eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None) +eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="", baseDir="", parent=None) eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.getData?4() eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_condaButton_toggled?4(checked) eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_condaCloneButton_clicked?4() @@ -9739,7 +9909,7 @@ eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_pyvenvButton_toggled?4(checked) eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_targetDirectoryPicker_textChanged?4(txt) eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_virtualenvButton_toggled?4(checked) -eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog?1(parent=None) +eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog?1(baseDir="", parent=None) eric6.VirtualEnv.VirtualenvExecDialog.VirtualenvExecDialog.on_buttonBox_clicked?4(button) eric6.VirtualEnv.VirtualenvExecDialog.VirtualenvExecDialog.start?4(arguments) eric6.VirtualEnv.VirtualenvExecDialog.VirtualenvExecDialog?1(configuration, venvManager, parent=None) @@ -9748,10 +9918,11 @@ eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog?1(venvName, venvDirectory, parent=None) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.DefaultKey?7 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="") -eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.createVirtualEnv?4() +eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.createVirtualEnv?4(baseDir="") eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.deleteVirtualEnvs?4(venvNames) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getDefaultEnvironment?4() eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getEnvironmentEntries?4() +eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualEnvironmentsBaseDir?4() eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvDirectory?4(venvName) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvExecPath?4(venvName) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvInterpreter?4(venvName) @@ -9763,6 +9934,7 @@ eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.removeVirtualEnvs?4(venvNames) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath) +eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnvironmentsBaseDir?4(baseDir) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.showVirtualenvManagerDialog?4(modal=False) eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.shutdown?4() eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.virtualEnvironmentAdded?7 @@ -9773,6 +9945,7 @@ eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.IsCondaRole?7 eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.IsGlobalRole?7 eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.IsRemoteRole?7 +eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.closeEvent?4(evt) eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.on_addButton_clicked?4() eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.on_deleteAllButton_clicked?4() eric6.VirtualEnv.VirtualenvManagerDialog.VirtualenvManagerDialog.on_deleteButton_clicked?4() @@ -10611,7 +10784,6 @@ eric6.WebBrowser.Navigation.ReloadStopButton.ReloadStopButton.setLoading?4(loading) eric6.WebBrowser.Navigation.ReloadStopButton.ReloadStopButton.stopClicked?7 eric6.WebBrowser.Navigation.ReloadStopButton.ReloadStopButton?1(parent=None) -eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeHandler.SupportedPages?7 eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeHandler.requestStarted?4(job) eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeHandler?1(parent=None) eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeReply._speedDialPage?8 @@ -10620,6 +10792,7 @@ eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeReply.closed?7 eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeReply.readData?4(maxlen) eric6.WebBrowser.Network.EricSchemeHandler.EricSchemeReply?1(job, parent=None) +eric6.WebBrowser.Network.EricSchemeHandler._SupportedPages?8 eric6.WebBrowser.Network.NetworkManager.NetworkManager.authentication?4(url, auth, page=None) eric6.WebBrowser.Network.NetworkManager.NetworkManager.certificateError?4(error, view) eric6.WebBrowser.Network.NetworkManager.NetworkManager.changed?7 @@ -11611,7 +11784,6 @@ eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newPrivateWindow?4(link=None) eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newTab?4(link=None, addNextTo=None, background=False) eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newWindow?4(link=None, restoreSession=False) -eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.notificationsEnabled?4() eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.openSearchManager?4() eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.openUrl?4(url, title=None) eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.openUrlNewBackgroundTab?4(url, title=None) @@ -11635,7 +11807,7 @@ eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.setLoadingActions?4(b) eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.setUseQtHelp?4(use) eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.showFullScreenNavigation?4() -eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.showNotification?4(icon, heading, text, timeout=None) +eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.showNotification?4(icon, heading, text, kind=NotificationTypes.Information, timeout=None) eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.shutdown?4() eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.speedDial?4() eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.syncManager?4() @@ -11801,6 +11973,7 @@ install.createGlobalPluginsDir?4() install.createInstallConfig?4() install.createInstallInfo?4() +install.createInstallInfoFile?7 install.createLinuxSpecifics?4() install.createMacAppBundle?4(pydir) install.createPyWrapper?4(pydir, wfile, saveDir, isGuiScript=True)
--- a/eric6/APIs/Python3/eric6.bas Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/APIs/Python3/eric6.bas Mon Feb 01 10:38:16 2021 +0100 @@ -60,7 +60,7 @@ BrowserSortFilterProxyModel QSortFilterProxyModel BrowserSysPathItem BrowserItem BugBearVisitor ast.NodeVisitor -CallStackViewer QTreeWidget +CallStackViewer QWidget CallTraceViewer QWidget Ui_CallTraceViewer ChangeBookmarkCommand QUndoCommand Charset str @@ -147,6 +147,7 @@ DispositionParm str DispositionParmList UniqueNamespace DispositionType peg.List +DocstringMenuForEnterOnly QMenu DocumentationViewerWidget QWidget DotDesktopListSelectionDialog QDialog Ui_DotDesktopListSelectionDialog DotDesktopWizard QObject @@ -169,6 +170,7 @@ E5ClickableLed E5Led E5ComboBox QComboBox E5ComboPathPicker E5PathPickerBase +E5ComboSelectionDialog QDialog Ui_E5ComboSelectionDialog E5DirCompleter QCompleter E5DnDTabBar E5WheelTabBar E5ErrorMessage QErrorMessage @@ -197,7 +199,6 @@ E5ModelToolBar QToolBar E5MutexLocker contextlib.AbstractContextManager E5NetworkHeaderDetailsDialog QDialog Ui_E5NetworkHeaderDetailsDialog -E5NetworkIcon QLabel E5NetworkProxyFactory QNetworkProxyFactory E5OverrideCursor contextlib.AbstractContextManager E5OverrideCursorProcess QProcess @@ -629,7 +630,9 @@ NewDialogClassDialog QDialog Ui_NewDialogClassDialog NewPythonPackageDialog QDialog Ui_NewPythonPackageDialog NoExtToken peg.Symbol -NotificationWidget QWidget Ui_NotificationWidget +NotificationFrame QFrame Ui_NotificationFrame +NotificationTypes Enum +NotificationWidget QWidget NotificationsPage ConfigurationPageBase Ui_NotificationsPage NsHtmlReader QObject NsHtmlWriter QObject @@ -688,6 +691,7 @@ PluginUninstallWidget QWidget Ui_PluginUninstallDialog PluginUninstallWindow E5MainWindow PluginWizardDialog QDialog Ui_PluginWizardDialog +PopenWrapper module.Popen PreferencesLexer QObject PreferencesLexerError Exception PreferencesLexerLanguageError PreferencesLexerError @@ -699,6 +703,7 @@ PrintToPdfDialog QDialog Ui_PrintToPdfDialog Printer QsciPrinter PrinterPage ConfigurationPageBase Ui_PrinterPage +ProcessWrapper _originalProcess ProfileTreeWidgetItem QTreeWidgetItem ProgramsDialog QDialog Ui_ProgramsDialog Project QObject @@ -730,6 +735,8 @@ PurgeProjectHelper HgExtensionProjectHelper PyBoardDevice MicroPythonDevice PyCoverageDialog QDialog Ui_PyCoverageDialog +PyDocstringGenerator BaseDocstringGenerator +PyFunctionInfo FunctionInfo PyProfile profile.Profile PyProfileDialog QDialog Ui_PyProfileDialog PyRegExpWizard QObject @@ -743,6 +750,7 @@ PythonDisViewer QWidget Ui_PythonDisViewer PythonDisViewerModes enum.Enum PythonPage ConfigurationPageBase Ui_PythonPage +QProcessWrapper module.QProcess QRegularExpressionWizard QObject QRegularExpressionWizardCharactersDialog QDialog Ui_QRegularExpressionWizardCharactersDialog QRegularExpressionWizardDialog QDialog
--- a/eric6/CodeTemplates/impl_pyqt5.py.tmpl Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/CodeTemplates/impl_pyqt5.py.tmpl Mon Feb 01 10:38:16 2021 +0100 @@ -18,8 +18,8 @@ """ Constructor - @param parent reference to the parent widget - @type QWidget + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) """ super($CLASSNAME$, self).__init__(parent) self.setupUi(self)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/CodeTemplates/impl_pyqt6.py.tmpl Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +Module implementing $CLASSNAME$. +""" + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import $SUPERCLASS$ + +from .Ui_$FORMFILE$ import Ui_$FORMCLASS$ + + +class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$): + """ + Class documentation goes here. + """ + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) + """ + super($CLASSNAME$, self).__init__(parent) + self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside2.py.tmpl Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/CodeTemplates/impl_pyside2.py.tmpl Mon Feb 01 10:38:16 2021 +0100 @@ -18,8 +18,8 @@ """ Constructor - @param parent reference to the parent widget - @type QWidget + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) """ super($CLASSNAME$, self).__init__(parent) self.setupUi(self)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/CodeTemplates/impl_pyside6.py.tmpl Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +Module implementing $CLASSNAME$. +""" + +from PySide6.QtCore import Slot +from PySide6.QtWidgets import $SUPERCLASS$ + +from .Ui_$FORMFILE$ import Ui_$FORMCLASS$ + + +class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$): + """ + Class documentation goes here. + """ + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) + """ + super($CLASSNAME$, self).__init__(parent) + self.setupUi(self)
--- a/eric6/DebugClients/Python/AsyncFile.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/AsyncFile.py Mon Feb 01 10:38:16 2021 +0100 @@ -9,6 +9,7 @@ """ import socket +import threading from DebugUtilities import prepareJsonCommand @@ -58,6 +59,7 @@ self.newlines = None self.line_buffering = False + self.writeLock = threading.RLock() self.wpending = [] def __checkMode(self, mode): @@ -99,6 +101,7 @@ """ Public method to write all pending entries. """ + self.writeLock.acquire() while self.wpending: try: buf = self.wpending.pop(0) @@ -116,6 +119,7 @@ self.nWriteErrors += 1 if self.nWriteErrors > self.maxtries: self.wpending = [] # delete all output + self.writeLock.release() def isatty(self): """ @@ -191,8 +195,10 @@ length = int(length) data = b'' while len(data) < length: - newData = self.sock.recv(length - len(data)) - data += newData + newByte = self.sock.recv(1) + data += newByte + if newByte == b'\n': + break # step 2: convert the data return data.decode('utf8', 'backslashreplace') @@ -337,15 +343,18 @@ """ self.__checkMode('w') + self.writeLock.acquire() if isinstance(s, (bytes, bytearray)): # convert to string to send it s = repr(s) cmd = prepareJsonCommand("ClientOutput", { "text": s, + "debuggerId": "", }) self.wpending.append(cmd) self.flush() + self.writeLock.release() def write_p(self, s): """
--- a/eric6/DebugClients/Python/BreakpointWatch.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/BreakpointWatch.py Mon Feb 01 10:38:16 2021 +0100 @@ -37,9 +37,9 @@ @type str @param lineno line number of the breakpoint @type int - @keyparam temporary flag to indicate a temporary breakpoint + @param temporary flag to indicate a temporary breakpoint @type bool - @keyparam cond Python expression which dynamically enables this bp + @param cond Python expression which dynamically enables this bp @type str """ filename = os.path.abspath(filename) @@ -109,7 +109,7 @@ """ Static method to get the breakpoint of a particular line. - Because eric6 supports only one breakpoint per line, this + Because eric supports only one breakpoint per line, this method will return only one breakpoint. @param filename file name of the bp to retrieve @@ -198,7 +198,7 @@ @type code object @param flag indicates type of watch (created or changed) @type str - @keyparam temporary flag for temporary watches + @param temporary flag for temporary watches @type bool """ # Should not occur
--- a/eric6/DebugClients/Python/DCTestResult.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DCTestResult.py Mon Feb 01 10:38:16 2021 +0100 @@ -4,7 +4,7 @@ # """ -Module implementing a TestResult derivative for the eric6 debugger. +Module implementing a TestResult derivative for the eric debugger. """ import select @@ -13,7 +13,7 @@ class DCTestResult(TestResult): """ - A TestResult derivative to work with eric6's debug client. + A TestResult derivative to work with eric's debug client. For more details see unittest.py of the standard python distribution. """
--- a/eric6/DebugClients/Python/DebugBase.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DebugBase.py Mon Feb 01 10:38:16 2021 +0100 @@ -14,7 +14,6 @@ import inspect import ctypes import time -from inspect import CO_GENERATOR import dis from BreakpointWatch import Breakpoint, Watch @@ -24,6 +23,15 @@ gRecursionLimit = 64 +try: + GENERATOR_AND_COROUTINE_FLAGS = ( + inspect.CO_GENERATOR | inspect.CO_COROUTINE | + inspect.CO_ASYNC_GENERATOR + ) +except AttributeError: + # Python < 3.7 + GENERATOR_AND_COROUTINE_FLAGS = inspect.CO_GENERATOR + def printerr(s): """ @@ -84,6 +92,7 @@ self.skipFrames = 0 self.isBroken = False + self.isException = False self.cFrame = None # current frame we are at @@ -105,7 +114,7 @@ # Use it like this: # if hasattr(sys, 'breakpoint): sys.breakpoint() sys.breakpoint = self.set_trace - if sys.version_info[:2] >= (3, 7): + if sys.version_info >= (3, 7): sys.breakpointhook = self.set_trace def __eventPollTimer(self): @@ -136,7 +145,7 @@ Public method to return the locals dictionary of the current frame or a frame below. - @keyparam frmnr distance of frame to get locals dictionary of. 0 is + @param frmnr distance of frame to get locals dictionary of. 0 is the current frame (int) @return locals dictionary of the frame """ @@ -151,7 +160,7 @@ Public method to store the locals into the frame, so an access to frame.f_locals returns the last data. - @keyparam frmnr distance of frame to store locals dictionary to. 0 is + @param frmnr distance of frame to store locals dictionary to. 0 is the current frame (int) """ cf = self.currentFrame @@ -309,8 +318,11 @@ if event == 'line': if self.stop_here(frame) or self.break_here(frame): - if (self.stop_everywhere and frame.f_back and - frame.f_back.f_code.co_name == "prepareJsonCommand"): + if ( + self.stop_everywhere and + frame.f_back and + frame.f_back.f_code.co_name == "prepareJsonCommand" + ): # Just stepped into print statement, so skip these frames self._set_stopinfo(None, frame.f_back) else: @@ -318,19 +330,33 @@ return self.trace_dispatch if event == 'call': - if (self.stop_here(frame) or - self.__checkBreakInFrame(frame) or - Watch.watches != []): + if ( + self.stop_here(frame) or + self.__checkBreakInFrame(frame) or + Watch.watches != [] + ): + return self.trace_dispatch + elif ( + self.stopframe and + frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS + ): return self.trace_dispatch else: # No need to trace this function return None if event == 'return': - if frame == self.returnframe: - # Only true if we didn't stopped in this frame, because it's + if self.stop_here(frame) or frame == self.returnframe: + # Ignore return events in generator except when stepping. + if ( + self.stopframe and + frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS + ): + return self.trace_dispatch + # Only true if we didn't stop in this frame, because it's # belonging to the eric debugger. - self._set_stopinfo(None, frame.f_back) + if self.stopframe is frame and self.stoplineno != -1: + self._set_stopinfo(None, frame.f_back) return None if event == 'exception': @@ -339,16 +365,23 @@ # skip the internal StopIteration exception (with no traceback) # triggered by a subiterator run with the 'yield from' # statement. - if not (frame.f_code.co_flags & CO_GENERATOR and - arg[0] is StopIteration and arg[2] is None): + if not ( + frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS and + arg[0] is StopIteration and + arg[2] is None + ): self.user_exception(arg) # Stop at the StopIteration or GeneratorExit exception when the # user has set stopframe in a generator by issuing a return # command, or a next/until command at the last statement in the # generator before the exception. - elif (self.stopframe and frame is not self.stopframe and - self.stopframe.f_code.co_flags & CO_GENERATOR and - arg[0] in (StopIteration, GeneratorExit)): + elif ( + self.stopframe and + frame is not self.stopframe and + (self.stopframe.f_code.co_flags & + GENERATOR_AND_COROUTINE_FLAGS) and + arg[0] in (StopIteration, GeneratorExit) + ): self.user_exception(arg) return None @@ -362,6 +395,7 @@ print('DebugBase.trace_dispatch:' # __IGNORE_WARNING_M801__ ' unknown debugging event: ', repr(event)) + return self.trace_dispatch def set_trace(self, frame=None): @@ -372,7 +406,7 @@ Because of jump optimizations it's not possible to use sys.breakpoint() as last instruction in a function or method. - @keyparam frame frame to start debugging from + @param frame frame to start debugging from @type frame object """ if frame is None: @@ -383,7 +417,7 @@ frame.f_trace = self.trace_dispatch while frame.f_back is not None: # stop at eric's debugger frame or a threading bootstrap - if (frame.f_back.f_code == stopOnHandleCommand): + if frame.f_back.f_code == stopOnHandleCommand: frame.f_trace = self.trace_dispatch break @@ -420,17 +454,23 @@ sys.settrace(None) sys.setprofile(None) - def run(self, cmd, globalsDict=None, localsDict=None, debug=True): + def run(self, cmd, globalsDict=None, localsDict=None, debug=True, + closeSession=True): """ Public method to start a given command under debugger control. @param cmd command / code to execute under debugger control @type str or CodeType - @keyparam globalsDict dictionary of global variables for cmd + @param globalsDict dictionary of global variables for cmd + @type dict + @param localsDict dictionary of local variables for cmd @type dict - @keyparam localsDict dictionary of local variables for cmd - @type dict - @keyparam debug flag if command should run under debugger control + @param debug flag if command should run under debugger control + @type bool + @return exit code of the program + @rtype int + @param closeSession flag indicating to close the debugger session + at exit @type bool """ if globalsDict is None: @@ -453,20 +493,24 @@ try: exec(cmd, globalsDict, localsDict) # secok atexit._run_exitfuncs() - self._dbgClient.progTerminated(0) + self._dbgClient.progTerminated(0, closeSession=closeSession) + exitcode = 0 except SystemExit: atexit._run_exitfuncs() excinfo = sys.exc_info() exitcode, message = self.__extractSystemExitMessage(excinfo) - self._dbgClient.progTerminated(exitcode, message) + self._dbgClient.progTerminated(exitcode, message=message, + closeSession=closeSession) except Exception: excinfo = sys.exc_info() self.user_exception(excinfo, True) + exitcode = 242 finally: self.quitting = True sys.settrace(None) + return exitcode - def _set_stopinfo(self, stopframe, returnframe): + def _set_stopinfo(self, stopframe, returnframe, stoplineno=0): """ Protected method to update the frame pointers. @@ -474,9 +518,17 @@ @type frame object @param returnframe the frame object where to stop on a function return @type frame object + @param stoplineno line number to stop at. If stoplineno is greater than + or equal to 0, then stop at line greater than or equal to the + stopline. If stoplineno is -1, then don't stop at all. + @type int """ self.stopframe = stopframe self.returnframe = returnframe + # stoplineno >= 0 means: stop at line >= the stoplineno + # stoplineno -1 means: don't stop at all + self.stoplineno = stoplineno + if returnframe is not None: # Ensure to be able to stop on the return frame returnframe.f_trace = self.trace_dispatch @@ -491,13 +543,30 @@ """ # Here we only set a new stop frame if it is a normal continue. if not special: - self._set_stopinfo(None, None) + self._set_stopinfo(None, None, -1) # Disable tracing if not started in debug mode if not self._dbgClient.debugging: sys.settrace(None) sys.setprofile(None) + def set_until(self, frame=None, lineno=None): + """ + Public method to stop when the line with the lineno greater than the + current one is reached or when returning from current frame. + + @param frame reference to the frame object + @type frame object + @param lineno line number to continue to + @type int + """ + # the name "until" is borrowed from gdb + if frame is None: + frame = self.currentFrame + if lineno is None: + lineno = frame.f_lineno + 1 + self._set_stopinfo(frame, frame, lineno) + def set_step(self): """ Public method to stop after one line of code. @@ -534,7 +603,7 @@ try: self.currentFrame.f_lineno = lineno stack = self.getStack(self.currentFrame) - self._dbgClient.sendResponseLine(stack) + self._dbgClient.sendResponseLine(stack, self.name) except Exception as e: printerr(e) @@ -692,9 +761,9 @@ """ Public method to get the stack. - @keyparam frame frame object to inspect + @param frame frame object to inspect @type frame object or list - @keyparam applyTrace flag to assign trace function to fr.f_trace + @param applyTrace flag to assign trace function to fr.f_trace @type bool @return list of lists with file name (string), line number (integer) and function name (string) @@ -720,8 +789,9 @@ fname = self._dbgClient.absPath(self.fix_frame_filename(fr)) # Always show at least one stack frame, even if it's from eric. if stack and os.path.basename(fname).startswith( - ("DebugBase.py", "DebugClientBase.py", - "ThreadExtension.py", "threading.py")): + ("DebugBase.py", "DebugClientBase.py", + "ThreadExtension.py", "threading.py") + ): break fline = tb_lineno or fr.f_lineno @@ -773,19 +843,21 @@ self._dbgClient.currentThread = self self._dbgClient.currentThreadExec = self - self._dbgClient.sendResponseLine(stack) + self._dbgClient.sendResponseLine(stack, self.name) self._dbgClient.eventLoop() self.isBroken = False self._dbgClient.unlockClient() + self._dbgClient.dumpThreadList() + def user_exception(self, excinfo, unhandled=False): """ Public method reimplemented to report an exception to the debug server. @param excinfo details about the exception @type tuple(Exception, excval object, traceback frame object) - @keyparam unhandled flag indicating an uncaught exception + @param unhandled flag indicating an uncaught exception @type bool """ exctype, excval, exctb = excinfo @@ -825,7 +897,7 @@ if realSyntaxError: self._dbgClient.sendSyntaxError( - message, filename, lineno, charno) + message, filename, lineno, charno, self.name) self._dbgClient.eventLoop() return @@ -865,6 +937,7 @@ self.stop_everywhere = False self.isBroken = True + self.isException = True disassembly = None stack = [] @@ -879,7 +952,7 @@ self._dbgClient.lockClient() self._dbgClient.currentThread = self self._dbgClient.currentThreadExec = self - self._dbgClient.sendException(exctypetxt, excvaltxt, stack) + self._dbgClient.sendException(exctypetxt, excvaltxt, stack, self.name) self._dbgClient.setDisassembly(disassembly) self._dbgClient.dumpThreadList() @@ -891,11 +964,14 @@ self.skipFrames = 0 self.isBroken = False + self.isException = False stop_everywhere = self.stop_everywhere self.stop_everywhere = False self.eventPollFlag = False self._dbgClient.unlockClient() self.stop_everywhere = stop_everywhere + + self._dbgClient.dumpThreadList() def __extractExceptionName(self, exctype): """ @@ -1009,6 +1085,9 @@ elif isinstance(code, int): exitcode = code message = "" + elif code is None: + exitcode = 0 + message = "" else: exitcode = 1 message = str(code) @@ -1017,7 +1096,7 @@ message = str(excval) return exitcode, message - + def stop_here(self, frame): """ Public method reimplemented to filter out debugger files. @@ -1033,9 +1112,11 @@ if self.__skipFrame(frame): return False - return (self.stop_everywhere or - frame is self.stopframe or - frame is self.returnframe) + if frame is self.stopframe: + if self.stoplineno == -1: + return False + return frame.f_lineno >= self.stoplineno + return self.stop_everywhere or frame is self.returnframe def tracePythonLibs(self, enable): """
--- a/eric6/DebugClients/Python/DebugClient.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DebugClient.py Mon Feb 01 10:38:16 2021 +0100 @@ -10,14 +10,12 @@ from DebugBase import DebugBase from DebugClientBase import DebugClientBase from ThreadExtension import ThreadExtension +from ModuleLoader import ModuleLoader class DebugClient(DebugClientBase, DebugBase, ThreadExtension): """ Class implementing the client side of the debugger. - - This variant of the debugger implements the standard debugger client - by subclassing all relevant base classes. """ def __init__(self): """ @@ -29,7 +27,7 @@ ThreadExtension.__init__(self) - self.variant = 'Standard' + self.__moduleLoader = ModuleLoader(self) # We are normally called by the debugger to execute directly.
--- a/eric6/DebugClients/Python/DebugClientBase.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DebugClientBase.py Mon Feb 01 10:38:16 2021 +0100 @@ -20,17 +20,19 @@ import signal import time import types -import importlib +import importlib.util +import fnmatch import DebugClientCapabilities import DebugVariables from DebugBase import setRecursionLimit, printerr # __IGNORE_WARNING__ from AsyncFile import AsyncFile, AsyncPendingWrite -from DebugConfig import ConfigQtNames, ConfigVarTypeStrings +from DebugConfig import ConfigQtNames, SpecialAttributes from FlexCompleter import Completer from DebugUtilities import prepareJsonCommand from BreakpointWatch import Breakpoint, Watch +from MultiProcessDebugExtension import patchNewProcessFunctions from DebugUtilities import getargvalues, formatargvalues @@ -67,25 +69,6 @@ ############################################################################### -def DebugClientFork(): - """ - Replacement for the standard os.fork(). - - @return result of the fork() call - """ - if DebugClientInstance is None: - return DebugClientOrigFork() - - return DebugClientInstance.fork() - -# use our own fork(). -if 'fork' in dir(os): - DebugClientOrigFork = os.fork - os.fork = DebugClientFork - -############################################################################### - - def DebugClientClose(fd): """ Replacement for the standard os.close(fd). @@ -179,20 +162,17 @@ self.running = None self.test = None self.debugging = False - - self.fork_auto = False - self.fork_child = False + self.multiprocessSupport = False + self.noDebugList = [] self.readstream = None self.writestream = None self.errorstream = None self.pollingDisabled = False - self.callTraceEnabled = None + self.__debuggerId = "" - self.disassembly = None - - self.variant = 'You should not see this' + self.callTraceEnabled = None self.compile_command = codeop.CommandCompiler() @@ -200,6 +180,8 @@ self.defaultCoding = 'utf-8' self.__coding = self.defaultCoding self.noencoding = False + + self.startOptions = None def getCoding(self): """ @@ -263,6 +245,8 @@ pass self.debugging = False + self.multiprocessSupport = False + self.noDebugList = [] # make sure we close down our end of the socket # might be overkill as normally stdin, stdout and stderr @@ -279,13 +263,29 @@ """ Private method to compile source code read from a file. - @param filename name of the source file (string) - @param mode kind of code to be generated (string, exec or eval) + @param filename name of the source file + @type str + @param mode kind of code to be generated (exec or eval) + @type str @return compiled code object (None in case of errors) """ with codecs.open(filename, encoding=self.__coding) as fp: statement = fp.read() + return self.__compileCommand(statement, filename=filename, mode=mode) + + def __compileCommand(self, statement, filename="<string>", mode="exec"): + """ + Private method to compile source code. + + @param statement source code string to be compiled + @type str + @param filename name of the source file + @type str + @param mode kind of code to be generated (exec or eval) + @type str + @return compiled code object (None in case of errors) + """ try: code = compile(statement + '\n', filename, mode) except SyntaxError: @@ -304,7 +304,7 @@ lineno = 0 charno = 0 - self.sendSyntaxError(message, filename, lineno, charno) + self.sendSyntaxError(message, filename, lineno, charno, self.name) return None return code @@ -316,7 +316,7 @@ @param jsonStr string containing the command received from the IDE @type str """ -## printerr(jsonStr) ##debug +## printerr(jsonStr) ## debug # __IGNORE_WARNING_M891__ try: commandDict = json.loads(jsonStr.strip()) @@ -337,16 +337,29 @@ params["variable"], params["frameNumber"], params["scope"], params["filters"]) + elif method == "RequestStack": + stack = self.mainThread.getStack() + self.sendResponseLine(stack, self.mainThread.name) + elif method == "RequestThreadList": self.dumpThreadList() elif method == "RequestThreadSet": - if params["threadID"] in self.threads: - self.setCurrentThread(params["threadID"]) + if params["threadID"] == -1: + # -1 is indication for the main thread + threadId = -1 + for thread in self.threads.values(): + if thread.name == "MainThread": + threadId = thread.id + else: + threadId = params["threadID"] + if threadId in self.threads: + self.setCurrentThread(threadId) self.sendJsonCommand("ResponseThreadSet", {}) stack = self.currentThread.getStack() self.sendJsonCommand("ResponseStack", { "stack": stack, + "threadName": self.currentThread.name, }) elif method == "RequestDisassembly": @@ -370,7 +383,6 @@ self.sendJsonCommand("ResponseBanner", { "version": "Python {0}".format(sys.version), "platform": socket.gethostname(), - "dbgclient": self.variant, }) elif method == "RequestSetFilter": @@ -414,9 +426,7 @@ self.running = sys.argv[0] self.debugging = True - - self.fork_auto = params["autofork"] - self.fork_child = params["forkChild"] + self.multiprocessSupport = params["multiprocess"] self.threads.clear() self.attachThread(mainThread=True) @@ -439,7 +449,8 @@ code = self.__compileFileSource(self.running) if code: sys.setprofile(self.callTraceEnabled) - self.mainThread.run(code, self.debugMod.__dict__, debug=True) + self.mainThread.run(code, self.debugMod.__dict__, debug=True, + closeSession=False) elif method == "RequestRun": self.disassembly = None @@ -456,9 +467,6 @@ self.running = sys.argv[0] self.botframe = None - self.fork_auto = params["autofork"] - self.fork_child = params["forkChild"] - self.threads.clear() self.attachThread(mainThread=True) @@ -474,7 +482,8 @@ res = 0 code = self.__compileFileSource(self.running) if code: - self.mainThread.run(code, self.debugMod.__dict__, debug=False) + self.mainThread.run(code, self.debugMod.__dict__, debug=False, + closeSession=False) elif method == "RequestCoverage": from coverage import Coverage @@ -508,7 +517,8 @@ if code: self.running = sys.argv[0] self.cover.start() - self.mainThread.run(code, self.debugMod.__dict__, debug=False) + self.mainThread.run(code, self.debugMod.__dict__, debug=False, + closeSession=False) self.cover.stop() self.cover.save() @@ -558,7 +568,7 @@ self.__unhandled_exception(*excinfo) self.prof.save() - self.progTerminated(res) + self.progTerminated(res, closeSession=False) elif method == "ExecuteStatement": if self.buffer: @@ -609,8 +619,8 @@ _locals = ( self.currentThread.getFrameLocals( self.framenr)) - ## reset sys.stdout to our redirector - ## (unconditionally) + #- reset sys.stdout to our redirector + #- (unconditionally) if "sys" in _globals: __stdout = _globals["sys"].stdout _globals["sys"].stdout = self.writestream @@ -679,6 +689,11 @@ self.currentThreadExec.go(params["special"]) self.eventExit = True + elif method == "RequestContinueUntil": + newLine = params["newLine"] + self.currentThreadExec.set_until(lineno=newLine) + self.eventExit = True + elif method == "RawInput": # If we are handling raw mode input then break out of the current # event loop. @@ -758,6 +773,9 @@ elif method == "RequestShutdown": self.sessionClose() + elif method == "RequestSetNoDebugList": + self.noDebugList = params["noDebug"][:] + elif method == "RequestCompletion": self.__completionList(params["text"]) @@ -809,14 +827,10 @@ elif method == "RequestUTPrepare": if params["syspath"]: sys.path = params["syspath"] + sys.path - sys.path.insert( - 0, os.path.dirname(os.path.abspath(params["filename"]))) top_level_dir = None if params["workdir"]: os.chdir(params["workdir"]) top_level_dir = params["workdir"] - else: - os.chdir(sys.path[0]) # set the system exception handling function to ensure, that # we report on all unhandled exceptions @@ -830,6 +844,8 @@ discoveryStart = params["discoverystart"] if not discoveryStart: discoveryStart = params["workdir"] + sys.path.insert( + 0, os.path.abspath(discoveryStart)) if params["testcases"]: self.test = testLoader.loadTestsFromNames( params["testcases"]) @@ -837,6 +853,10 @@ self.test = testLoader.discover( discoveryStart, top_level_dir=top_level_dir) else: + sys.path.insert( + 0, + os.path.dirname(os.path.abspath(params["filename"])) + ) if params["filename"]: spec = importlib.util.spec_from_file_location( params["testname"], params["filename"]) @@ -897,9 +917,13 @@ self.threads.clear() self.attachThread(mainThread=True) sys.setprofile(None) + self.running = sys.argv[0] self.mainThread.run( "result = self.test.run(self.testResult)\n", - localsDict=locals_) + self.debugMod.__dict__, + localsDict=locals_, + debug=True, + closeSession=False) result = locals_["result"] else: result = self.test.run(self.testResult) @@ -912,11 +936,6 @@ elif method == "RequestUTStop": self.testResult.stop() - - elif method == "ResponseForkTo": - # this results from a separate event loop - self.fork_child = (params["target"] == 'child') - self.eventExit = True def __assembleTestCasesList(self, suite, start): """ @@ -969,6 +988,10 @@ response @type dict """ + # send debugger ID with all responses + if "debuggerId" not in params: + params["debuggerId"] = self.__debuggerId + cmd = prepareJsonCommand(method, params) self.writestream.write_p(cmd) @@ -999,15 +1022,18 @@ "condition": condition, }) - def sendResponseLine(self, stack): + def sendResponseLine(self, stack, threadName): """ Public method to send the current call stack. @param stack call stack @type list + @param threadName name of the thread sending the event + @type str """ self.sendJsonCommand("ResponseLine", { "stack": stack, + "threadName": threadName, }) def sendCallTrace(self, event, fromInfo, toInfo): @@ -1029,7 +1055,8 @@ "to": toInfo, }) - def sendException(self, exceptionType, exceptionMessage, stack): + def sendException(self, exceptionType, exceptionMessage, stack, + threadName): """ Public method to send information for an exception. @@ -1039,14 +1066,17 @@ @type str @param stack stack trace information @type list + @param threadName name of the thread sending the event + @type str """ self.sendJsonCommand("ResponseException", { "type": exceptionType, "message": exceptionMessage, "stack": stack, + "threadName": threadName, }) - def sendSyntaxError(self, message, filename, lineno, charno): + def sendSyntaxError(self, message, filename, lineno, charno, threadName): """ Public method to send information for a syntax error. @@ -1058,12 +1088,15 @@ @type int @param charno character number info @type int + @param threadName name of the thread sending the event + @type str """ self.sendJsonCommand("ResponseSyntax", { "message": message, "filename": filename, "linenumber": lineno, "characternumber": charno, + "threadName": threadName, }) def sendPassiveStartup(self, filename, exceptions): @@ -1080,6 +1113,17 @@ "exceptions": exceptions, }) + def sendDebuggerId(self, debuggerId): + """ + Public method to send the debug client id. + + @param debuggerId id of this debug client instance (made up of + hostname and process ID) + @type str + """ + # debugger ID is added automatically by sendJsonCommand + self.sendJsonCommand("DebuggerId", {}) + def __clientCapabilities(self): """ Private method to determine the clients capabilities. @@ -1101,7 +1145,7 @@ """ Public method called when there is data ready to be read. - @param stream file like object that has data to be written + @param stream file like object that has data to be read @return flag indicating an error condition @rtype bool """ @@ -1177,6 +1221,9 @@ else: # give up for too many errors break + except ValueError: + # the client socket might already be closed, i.e. its fd is -1 + break # reset the select error counter selectErrors = 0 @@ -1224,7 +1271,8 @@ if self.errorstream in wrdy: self.writeReady(self.errorstream) - def connectDebugger(self, port, remoteAddress=None, redirect=True): + def connectDebugger(self, port, remoteAddress=None, redirect=True, + name=""): """ Public method to establish a session with the debugger. @@ -1232,19 +1280,28 @@ stdout and stderr and saves these file objects in case the application being debugged redirects them itself. - @param port the port number to connect to (int) + @param port the port number to connect to + @type int @param remoteAddress the network address of the debug server host - (string) + @type str @param redirect flag indicating redirection of stdin, stdout and - stderr (boolean) + stderr + @type bool + @param name name to be attached to the debugger ID + @type str """ if remoteAddress is None: remoteAddress = "127.0.0.1" elif "@@i" in remoteAddress: remoteAddress = remoteAddress.split("@@i")[0] sock = socket.create_connection((remoteAddress, port)) - - self.readstream = AsyncFile(sock, sys.stdin.mode, sys.stdin.name) + + stdinName = sys.stdin.name + # Special case if in a multiprocessing.Process + if isinstance(stdinName, int): + stdinName = '<stdin>' + + self.readstream = AsyncFile(sock, sys.stdin.mode, stdinName) self.writestream = AsyncFile(sock, sys.stdout.mode, sys.stdout.name) self.errorstream = AsyncFile(sock, sys.stderr.mode, sys.stderr.name) @@ -1256,6 +1313,14 @@ # attach to the main thread here self.attachThread(mainThread=True) + + if not name: + name = "main" + self.__debuggerId = "{0}/{1}/{2}".format( + socket.gethostname(), os.getpid(), name + ) + + self.sendDebuggerId(self.__debuggerId) def __unhandled_exception(self, exctype, excval, exctb): """ @@ -1375,7 +1440,7 @@ """ return self.running - def progTerminated(self, status, message=""): + def progTerminated(self, status, message="", closeSession=True): """ Public method to tell the debugger that the program has terminated. @@ -1383,23 +1448,32 @@ @type int @param message status message @type str + @param closeSession flag indicating to close the debugger session + @type bool """ if status is None: status = 0 elif not isinstance(status, int): message = str(status) status = 1 - + if message is None: + message = "" + if self.running: self.set_quit() + program = self.running self.running = None self.sendJsonCommand("ResponseExit", { "status": status, "message": message, + "program": program, }) # reset coding self.__coding = self.defaultCoding + + if closeSession: + self.sessionClose(False) def __dumpVariables(self, frmnr, scope, filterList): """ @@ -1409,8 +1483,8 @@ @type int @param scope 1 to report global variables, 0 for local variables @type int - @param filterList the indices of variable types to be filtered - @type list of int + @param filterList list of variable types to be filtered + @type list of str """ if self.currentThread is None: return @@ -1458,7 +1532,7 @@ @type int @param scope 1 to report global variables, 0 for local variables @type int - @param filterList the indices of variable types to be filtered + @param filterList list of variable types to be filtered @type list of int """ if self.currentThread is None: @@ -1714,10 +1788,10 @@ Variables are only added to the list, if their name do not match any of the filter expressions. @type int - @param filterList the indices of variable types to be filtered. + @param filterList list of variable types to be filtered. Variables are only added to the list, if their type is not contained in the filter list. - @type list of int + @type list of str @return A tuple consisting of a list of formatted variables. Each variable entry is a tuple of three elements, the variable name, its type and value. @@ -1748,15 +1822,25 @@ continue # filter hidden attributes (filter #0) - if 0 in filterList and str(key)[:2] == '__': + if '__' in filterList and str(key)[:2] == '__': continue # special handling for '__builtins__' (it's way too big) if key == '__builtins__': rvalue = '<module builtins (built-in)>' valtype = 'module' - if ConfigVarTypeStrings.index(valtype) in filterList: + if valtype in filterList: continue + elif ( + key in SpecialAttributes and + "special_attributes" in filterList + ): + continue + elif ( + key == "__hash__" and + "builtin_function_or_method" in filterList + ): + continue else: isQt = False # valtypestr, e.g. class 'PyQt5.QtCore.QPoint' @@ -1767,37 +1851,37 @@ # Strip 'instance' to be equal with Python 3 if valtype == "instancemethod": valtype = "method" - elif valtype == "type" or valtype == "classobj": + elif valtype in ("type", "classobj"): valtype = "class" + elif valtype == "method-wrapper": + valtype = "builtin_function_or_method" # valtypename, e.g. QPoint valtypename = type(value).__name__ - try: - if ConfigVarTypeStrings.index(valtype) in filterList: - continue - except ValueError: - if valtype in ("sip.enumtype", "sip.wrappertype"): - if ConfigVarTypeStrings.index('class') in filterList: - continue - elif (valtype == "sip.methoddescriptor" or - valtype == "method_descriptor"): - if ConfigVarTypeStrings.index('method') in filterList: - continue - elif valtype in ("numpy.ndarray", "array.array"): - if ConfigVarTypeStrings.index('list') in filterList: - continue - elif valtypename == "MultiValueDict": - if ConfigVarTypeStrings.index('dict') in filterList: - continue - elif ConfigVarTypeStrings.index('instance') in filterList: - continue - - isQt = valtype.startswith(ConfigQtNames) - if (not valtypestr.startswith('type ') and - valtypename not in ("ndarray", "MultiValueDict", - "array", "defaultdict") and - not isQt): - valtype = valtypestr + if valtype in filterList: + continue + elif ( + valtype in ("sip.enumtype", "sip.wrappertype") and + 'class' in filterList + ): + continue + elif ( + valtype in ( + "sip.methoddescriptor", "method_descriptor") and + 'method' in filterList + ): + continue + elif ( + valtype in ("numpy.ndarray", "array.array") and + 'list' in filterList + ): + continue + elif valtypename == "MultiValueDict" and 'dict' in filterList: + continue + elif 'instance' in filterList: + continue + + isQt = valtype.startswith(ConfigQtNames) try: if valtype in self.arrayTypes: @@ -1909,32 +1993,45 @@ comp = completer(text, state) except Exception: comp = None - + def startDebugger(self, filename=None, host=None, port=None, enableTrace=True, exceptions=True, tracePython=False, - redirect=True): + redirect=True, passive=True, multiprocessSupport=False): """ Public method used to start the remote debugger. - @param filename the program to be debugged (string) - @param host hostname of the debug server (string) - @param port portnumber of the debug server (int) - @param enableTrace flag to enable the tracing function (boolean) + @param filename the program to be debugged + @type str + @param host hostname of the debug server + @type str + @param port portnumber of the debug server + @type int + @param enableTrace flag to enable the tracing function + @type bool @param exceptions flag to enable exception reporting of the IDE - (boolean) + @type bool @param tracePython flag to enable tracing into the Python library - (boolean) + @type bool @param redirect flag indicating redirection of stdin, stdout and - stderr (boolean) + stderr + @type bool + @param passive flag indicating a passive debugging session + @type bool + @param multiprocessSupport flag indicating to enable multiprocess + debugging support + @type bool """ - global debugClient if host is None: host = os.getenv('ERICHOST', 'localhost') if port is None: port = os.getenv('ERICPORT', 42424) remoteAddress = self.__resolveHost(host) - self.connectDebugger(port, remoteAddress, redirect) + if filename is not None: + name = os.path.basename(filename) + else: + name = "" + self.connectDebugger(port, remoteAddress, redirect, name=name) if filename is not None: self.running = os.path.abspath(filename) else: @@ -1944,8 +2041,7 @@ self.running = None if self.running: self.__setCoding(self.running) - self.passive = True - self.sendPassiveStartup(self.running, exceptions) + self.passive = passive self.__interact() # setup the debugger variables @@ -1967,7 +2063,9 @@ def startProgInDebugger(self, progargs, wd='', host=None, port=None, exceptions=True, tracePython=False, - redirect=True): + redirect=True, passive=True, + multiprocessSupport=False, codeStr="", + scriptModule=""): """ Public method used to start the remote debugger. @@ -1982,6 +2080,17 @@ (boolean) @param redirect flag indicating redirection of stdin, stdout and stderr (boolean) + @param passive flag indicating a passive debugging session + @type bool + @param multiprocessSupport flag indicating to enable multiprocess + debugging support + @type bool + @param codeStr string containing Python code to execute + @type str + @param scriptModule name of a module to be executed as a script + @type str + @return exit code of the debugged program + @rtype int """ if host is None: host = os.getenv('ERICHOST', 'localhost') @@ -1989,24 +2098,36 @@ port = os.getenv('ERICPORT', 42424) remoteAddress = self.__resolveHost(host) - self.connectDebugger(port, remoteAddress, redirect) + if progargs: + if not progargs[0].startswith("-"): + name = os.path.basename(progargs[0]) + else: + name = "debug_client_code" + else: + name = "debug_client_code" + self.connectDebugger(port, remoteAddress, redirect, name=name) self._fncache = {} self.dircache = [] - sys.argv = progargs[:] - sys.argv[0] = os.path.abspath(sys.argv[0]) - sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) - if wd == '': - os.chdir(sys.path[1]) + if codeStr: + self.running = "<string>" + sys.argv = ["<string>"] + progargs[:] else: - os.chdir(wd) - self.running = sys.argv[0] - self.__setCoding(self.running) + sys.argv = progargs[:] + sys.argv[0] = os.path.abspath(sys.argv[0]) + sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) + if wd == '': + os.chdir(sys.path[1]) + else: + os.chdir(wd) + self.running = sys.argv[0] + self.__setCoding(self.running) self.debugging = True + self.multiprocessSupport = multiprocessSupport - self.passive = True - self.sendPassiveStartup(self.running, exceptions) - self.__interact() + self.passive = passive + if passive: + self.sendPassiveStartup(self.running, exceptions) self.attachThread(mainThread=True) self.mainThread.tracePythonLibs(tracePython) @@ -2019,12 +2140,28 @@ # This will eventually enter a local event loop. self.debugMod.__dict__['__file__'] = self.running sys.modules['__main__'] = self.debugMod - code = self.__compileFileSource(self.running) + if codeStr: + code = self.__compileCommand(codeStr) + elif scriptModule: + import runpy + modName, modSpec, code = runpy._get_module_details(scriptModule) + self.running = code.co_filename + self.debugMod.__dict__.clear() + self.debugMod.__dict__.update({ + "__name__": "__main__", + "__file__": self.running, + "__package__": modSpec.parent, + "__loader__": modSpec.loader, + "__spec__": modSpec, + "__builtins__": __builtins__, + }) + else: + code = self.__compileFileSource(self.running) if code: res = self.mainThread.run(code, self.debugMod.__dict__, debug=True) - self.progTerminated(res) else: - self.progTerminated(42) # should not happen + res = 42 # should not happen + return res def run_call(self, scriptname, func, *args): """ @@ -2037,7 +2174,7 @@ """ self.startDebugger(scriptname, enableTrace=False) res = self.mainThread.runcall(func, *args) - self.progTerminated(res) + self.progTerminated(res, closeSession=False) return res def __resolveHost(self, host): @@ -2079,6 +2216,10 @@ tracePython = False exceptions = True redirect = True + passive = True + multiprocess = False + codeStr = "" + scriptModule = "" while args[0]: if args[0] == '-h': host = args[1] @@ -2104,13 +2245,19 @@ elif args[0] == '--no-encoding': self.noencoding = True del args[0] - elif args[0] == '--fork-child': - self.fork_auto = True - self.fork_child = True + elif args[0] == '--no-passive': + passive = False + del args[0] + elif args[0] == '--multiprocess': + multiprocess = True del args[0] - elif args[0] == '--fork-parent': - self.fork_auto = True - self.fork_child = False + elif args[0] in ('-c', '--code'): + codeStr = args[1] + del args[0] + del args[0] + elif args[0] in ('-m', '--module'): + scriptModule = args[1] + del args[0] del args[0] elif args[0] == '--': del args[0] @@ -2120,18 +2267,34 @@ if not args: print("No program given. Aborting!") # __IGNORE_WARNING_M801__ + elif "-m" in args: + print("Running module as a script is not supported. Aborting!") + # __IGNORE_WARNING_M801__ else: + # Store options in case a new Python process is created + self.startOptions = ( + wd, host, port, exceptions, tracePython, redirect, + self.noencoding, + ) if not self.noencoding: self.__coding = self.defaultCoding - self.startProgInDebugger(args, wd, host, port, - exceptions=exceptions, - tracePython=tracePython, - redirect=redirect) + patchNewProcessFunctions(multiprocess, self) + res = self.startProgInDebugger( + args, wd, host, port, exceptions=exceptions, + tracePython=tracePython, redirect=redirect, + passive=passive, multiprocessSupport=multiprocess, + codeStr=codeStr, scriptModule=scriptModule, + ) + sys.exit(res) else: if sys.argv[1] == '--no-encoding': self.noencoding = True del sys.argv[1] + if sys.argv[1] == '--multiprocess': + self.multiprocessSupport = True + del sys.argv[1] + if sys.argv[1] == '': del sys.argv[1] @@ -2165,39 +2328,20 @@ sys.path.insert(0, '') if port >= 0: + # Store options in case a new Python process is created + self.startOptions = ( + '', remoteAddress, port, True, False, redirect, + self.noencoding, + ) if not self.noencoding: self.__coding = self.defaultCoding + patchNewProcessFunctions(self.multiprocessSupport, self) self.connectDebugger(port, remoteAddress, redirect) self.__interact() else: print("No network port given. Aborting...") # __IGNORE_WARNING_M801__ - - def fork(self): - """ - Public method implementing a fork routine deciding which branch - to follow. - - @return process ID (integer) - """ - if not self.fork_auto: - self.sendJsonCommand("RequestForkTo", {}) - self.eventLoop(True) - pid = DebugClientOrigFork() - if pid == 0: - # child - if not self.fork_child: - sys.settrace(None) - sys.setprofile(None) - self.sessionClose(False) - else: - # parent - if self.fork_child: - sys.settrace(None) - sys.setprofile(None) - self.sessionClose(False) - return pid - + def close(self, fd): """ Public method implementing a close method as a replacement for @@ -2212,7 +2356,7 @@ return DebugClientOrigClose(fd) - + def __getSysPath(self, firstEntry): """ Private slot to calculate a path list including the PYTHONPATH @@ -2229,3 +2373,18 @@ sysPath.insert(0, firstEntry) sysPath.insert(0, '') return sysPath + + def skipMultiProcessDebugging(self, scriptName): + """ + Public method to check, if the given script is eligible for debugging. + + @param scriptName name of the script to check + @type str + @return flag indicating eligibility + @rtype bool + """ + for pattern in self.noDebugList: + if fnmatch.fnmatch(scriptName, pattern): + return True + + return False
--- a/eric6/DebugClients/Python/DebugConfig.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DebugConfig.py Mon Feb 01 10:38:16 2021 +0100 @@ -7,23 +7,14 @@ Module defining type strings for the different Python types. """ -# -# Keep this list in sync with Debugger.Config.ConfigVarTypeFilters -# -ConfigVarTypeStrings = [ - '__', 'NoneType', 'type', - 'bool', 'int', 'long', 'float', 'complex', - 'str', 'unicode', 'tuple', 'list', - 'dict', 'dict-proxy', 'set', 'file', 'xrange', - 'slice', 'buffer', 'class', 'instance', - 'method', 'property', 'generator', - 'function', 'builtin_function_or_method', 'code', 'module', - 'ellipsis', 'traceback', 'frame', 'other', 'frozenset', 'bytes', -] +SpecialAttributes = ( + "__bases__", "__class__", "__dict__", "__doc__", "__mro__", "__name__", + "__qualname__", +) BatchSize = 200 ConfigQtNames = ( - 'PyQt5.', 'PySide2.', 'Shiboken.EnumType' + 'PyQt5.', 'PyQt6.', 'PySide2.', 'PySide6.', 'Shiboken.EnumType' ) ConfigKnownQtTypes = ( '.QChar', '.QByteArray', '.QString', '.QStringList', '.QPoint', '.QPointF',
--- a/eric6/DebugClients/Python/DebugUtilities.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DebugUtilities.py Mon Feb 01 10:38:16 2021 +0100 @@ -8,6 +8,9 @@ """ import json +import os +import traceback +import sys # # Taken from inspect.py of Python 3.4 @@ -101,13 +104,13 @@ @type str @param localsDict reference to the local variables dictionary @type dict - @keyparam formatarg argument formatting function + @param formatarg argument formatting function @type func - @keyparam formatvarargs variable arguments formatting function + @param formatvarargs variable arguments formatting function @type func - @keyparam formatvarkw keyword arguments formatting function + @param formatvarkw keyword arguments formatting function @type func - @keyparam formatvalue value formating functtion + @param formatvalue value formating functtion @type func @return formatted call signature @rtype str @@ -144,3 +147,349 @@ "params": params, } return json.dumps(commandDict) + '\n' + +########################################################################### +## Things related to monkey patching below +########################################################################### + + +PYTHON_NAMES = ["python", "pypy"] + + +def isWindowsPlatform(): + """ + Function to check, if this is a Windows platform. + + @return flag indicating Windows platform + @rtype bool + """ + return sys.platform.startswith(("win", "cygwin")) + + +def isExecutable(program): + """ + Function to check, if the given program is executable. + + @param program program path to be checked + @type str + @return flag indicating an executable program + @rtype bool + """ + return os.access(os.path.abspath(program), os.X_OK) + + +def startsWithShebang(program): + """ + Function to check, if the given program start with a Shebang line. + + @param program program path to be checked + @type str + @return flag indicating an existing and valid shebang line + @rtype bool + """ + try: + if os.path.exists(program): + with open(program) as f: + for line in f: + line = line.strip() + if line: + for name in PYTHON_NAMES: + if line.startswith( + '#!/usr/bin/env {0}'.format(name) + ): + return True + elif line.startswith('#!') and name in line: + return True + return False + else: + return False + except UnicodeDecodeError: + return False + except Exception: + traceback.print_exc() + return False + + +def isPythonProgram(program): + """ + Function to check, if the given program is a Python interpreter or + program. + + @param program program to be checked + @type str + @return flag indicating a Python interpreter or program + @rtype bool + """ + if not program: + return False + + prog = os.path.basename(program).lower() + for pyname in PYTHON_NAMES: + if pyname in prog: + return True + + return ( + not isWindowsPlatform() and + isExecutable(program) and + startsWithShebang(program) + ) + + +def removeQuotesFromArgs(args): + """ + Function to remove quotes from the arguments list. + + @param args list of arguments + @type list of str + @return list of unquoted strings + @rtype list of str + """ + if isWindowsPlatform(): + newArgs = [] + for x in args: + if len(x) > 1 and x.startswith('"') and x.endswith('"'): + x = x[1:-1] + newArgs.append(x) + return newArgs + else: + return args + + +def quoteArgs(args): + """ + Function to quote the given list of arguments. + + @param args list of arguments to be quoted + @type list of str + @return list of quoted arguments + @rtype list of str + """ + if isWindowsPlatform(): + quotedArgs = [] + for x in args: + if x.startswith('"') and x.endswith('"'): + quotedArgs.append(x) + else: + if ' ' in x: + x = x.replace('"', '\\"') + quotedArgs.append('"{0}"'.format(x)) + else: + quotedArgs.append(x) + return quotedArgs + else: + return args + + +def patchArguments(debugClient, arguments, noRedirect=False): + """ + Function to patch the arguments given to start a program in order to + execute it in our debugger. + + @param debugClient reference to the debug client object + @type DebugClient + @param arguments list of program arguments + @type list of str + @param noRedirect flag indicating to not redirect stdin and stdout + @type bool + @return modified argument list + @rtype list of str + """ + debugClientScript = os.path.join( + os.path.dirname(__file__), "DebugClient.py") + if debugClientScript in arguments: + # it is already patched + return arguments + + args = list(arguments[:]) # create a copy of the arguments list + args = removeQuotesFromArgs(args) + + # support for shebang line + program = os.path.basename(args[0]).lower() + for pyname in PYTHON_NAMES: + if pyname in program: + break + else: + if not isWindowsPlatform() and startsWithShebang(args[0]): + # insert our interpreter as first argument + args.insert(0, sys.executable) + elif isWindowsPlatform() and args[0].lower().endswith(".py"): + # it is a Python script; insert our interpreter as first argument + args.insert(0, sys.executable) + + # extract list of interpreter arguments, i.e. all arguments before the + # first one not starting with '-'. + interpreter = args.pop(0) + interpreterArgs = [] + hasCode = False + hasScriptModule = False + while args: + if args[0].startswith("-"): + if args[0] in ("-W", "-X"): + # take two elements off the list + interpreterArgs.append(args.pop(0)) + interpreterArgs.append(args.pop(0)) + elif args[0] == "-c": + # -c indicates code to be executed and ends the + # arguments list + args.pop(0) + hasCode = True + break + elif args[0] == "-m": + # -m indicates a module to be executed as a script + # and ends the arguments list + args.pop(0) + hasScriptModule = True + break + else: + interpreterArgs.append(args.pop(0)) + else: + break + + (wd, host, port, exceptions, tracePython, redirect, noencoding + ) = debugClient.startOptions[:7] + + modifiedArguments = [interpreter] + modifiedArguments.extend(interpreterArgs) + modifiedArguments.extend([ + debugClientScript, + "-h", host, + "-p", str(port), + "--no-passive", + ]) + + if wd: + modifiedArguments.extend(["-w", wd]) + if not exceptions: + modifiedArguments.append("-e") + if tracePython: + modifiedArguments.append("-t") + if noRedirect or not redirect: + modifiedArguments.append("-n") + if noencoding: + modifiedArguments.append("--no-encoding") + if debugClient.multiprocessSupport: + modifiedArguments.append("--multiprocess") + if hasCode: + modifiedArguments.append("--code") + modifiedArguments.append(args.pop(0)) + if hasScriptModule: + modifiedArguments.append("--module") + modifiedArguments.append(args.pop(0)) + modifiedArguments.append("--") + # end the arguments for DebugClient + + # append the arguments for the program to be debugged + modifiedArguments.extend(args) + modifiedArguments = quoteArgs(modifiedArguments) + + return modifiedArguments + + +def stringToArgumentsWindows(args): + """ + Function to prepare a string of arguments for Windows platform. + + @param args list of command arguments + @type str + @return list of command arguments + @rtype list of str + @exception RuntimeError raised to indicate an illegal arguments parsing + condition + """ + # see http:#msdn.microsoft.com/en-us/library/a1y7w461.aspx + result = [] + + DEFAULT = 0 + ARG = 1 + IN_DOUBLE_QUOTE = 2 + + state = DEFAULT + backslashes = 0 + buf = '' + + argsLen = len(args) + for i in range(argsLen): + ch = args[i] + if ch == '\\': + backslashes += 1 + continue + elif backslashes != 0: + if ch == '"': + while backslashes >= 2: + backslashes -= 2 + buf += '\\' + if backslashes == 1: + if state == DEFAULT: + state = ARG + + buf += '"' + backslashes = 0 + continue + else: + # false alarm, treat passed backslashes literally... + if state == DEFAULT: + state = ARG + + while backslashes > 0: + backslashes -= 1 + buf += '\\' + + if ch in (' ', '\t'): + if state == DEFAULT: + # skip + continue + elif state == ARG: + state = DEFAULT + result.append(buf) + buf = '' + continue + + if state in (DEFAULT, ARG): + if ch == '"': + state = IN_DOUBLE_QUOTE + else: + state = ARG + buf += ch + + elif state == IN_DOUBLE_QUOTE: + if ch == '"': + if i + 1 < argsLen and args[i + 1] == '"': + # Undocumented feature in Windows: + # Two consecutive double quotes inside a double-quoted + # argument are interpreted as a single double quote. + buf += '"' + i += 1 + elif len(buf) == 0: + result.append("\"\"") + state = DEFAULT + else: + state = ARG + else: + buf += ch + + else: + raise RuntimeError('Illegal condition') + + if len(buf) > 0 or state != DEFAULT: + result.append(buf) + + return result + + +def patchArgumentStringWindows(debugClient, argStr): + """ + Function to patch an argument string for Windows. + + @param debugClient reference to the debug client object + @type DebugClient + @param argStr argument string + @type str + @return patched argument string + @rtype str + """ + args = stringToArgumentsWindows(argStr) + if not args or not isPythonProgram(args[0]): + return argStr + + argStr = ' '.join(patchArguments(debugClient, args)) + return argStr
--- a/eric6/DebugClients/Python/DebugVariables.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/DebugVariables.py Mon Feb 01 10:38:16 2021 +0100 @@ -74,8 +74,9 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ names = dir(var) if not names and hasattr(var, "__members__"): @@ -138,9 +139,9 @@ """ if isinstance(key, str): key = repr(key) - # Special handling for Python2 unicode strings and bytes object - # Raw and f-Strings are always converted to (unicode) str - if key[0] in 'ub': + # Special handling for bytes object + # Raw and f-Strings are always converted to str + if key[0] == 'b': key = key[1:] return key # __IGNORE_WARNING_M834__ @@ -151,8 +152,9 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ d = {} start = count = 0 @@ -216,13 +218,14 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ d = {} start = count = 0 for idx, value in enumerate(var): - d[str(idx)] = value + d[idx] = value count += 1 if count >= BatchSize: yield start, d @@ -314,8 +317,9 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ d = {} start = count = 0 @@ -404,8 +408,9 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ d = {} start = count = 0 @@ -496,8 +501,9 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ d = {} start = count = 0 @@ -579,8 +585,9 @@ @param var variable to be converted @type any - @return dictionary containing the variable attributes - @rtype dict + @yield tuple containing the batch start index and a dictionary + containing the variable attributes + @ytype tuple of (int, dict) """ d = {} start = count = 0 @@ -652,11 +659,6 @@ pass # not available on all Python versions try: - _TypeMap.append((unicode, None)) # __IGNORE_WARNING__ - except Exception: # secok - pass # not available on all Python versions - - try: import array _TypeMap.append((array.array, arrayResolver)) except ImportError:
--- a/eric6/DebugClients/Python/FlexCompleter.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/FlexCompleter.py Mon Feb 01 10:38:16 2021 +0100 @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- """ -Word completion for the eric6 shell. +Word completion for the eric shell. -<h4>NOTE for eric6 variant</h4> +<h4>NOTE for eric variant</h4> This version is a re-implementation of rlcompleter - as found in the Python3 library. It is modified to work with the eric6 + as found in the Python3 library. It is modified to work with the eric debug clients. <h4>Original rlcompleter documentation</h4>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/DebugClients/Python/ModuleLoader.py Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2020 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing an import hook patching modules to support debugging. +""" + +import sys +import importlib + +from QProcessExtension import patchQProcess +from SubprocessExtension import patchSubprocess +from MultiprocessingExtension import patchMultiprocessing + + +class ModuleLoader(object): + """ + Class implementing an import hook patching modules to support debugging. + """ + def __init__(self, debugClient): + """ + Constructor + + @param debugClient reference to the debug client object + @type DebugClient + """ + self.__dbgClient = debugClient + + self.__enableImportHooks = True + + # reset already imported thread module to apply hooks at next import + for moduleName in ("thread", "_thread", "threading"): + if moduleName in sys.modules: + del sys.modules[moduleName] + + self.__modulesToPatch = ( + 'thread', '_thread', 'threading', + 'greenlet', + 'subprocess', + 'multiprocessing', + 'PyQt5.QtCore', + 'PyQt6.QtCore', + 'PySide2.QtCore', + 'PySide6.QtCore', + ) + + sys.meta_path.insert(0, self) + + def __loadModule(self, fullname): + """ + Private method to load a module. + + @param fullname name of the module to be loaded + @type str + @return reference to the loaded module + @rtype module + """ + module = importlib.import_module(fullname) + sys.modules[fullname] = module + + ## Add hook for _thread.start_new_thread + if ( + fullname in ('thread', '_thread') and + not hasattr(module, 'eric6_patched') + ): + module.eric6_patched = True + self.__dbgClient.patchPyThread(module) + + ## Add hook for threading.run() + elif ( + fullname == "threading" and + not hasattr(module, 'eric6_patched') + ): + module.eric6_patched = True + self.__dbgClient.patchPyThreading(module) + + ## greenlet support + elif ( + fullname == 'greenlet' and + not hasattr(module, 'eric6_patched') + ): + if self.__dbgClient.patchGreenlet(module): + module.eric6_patched = True + + ## Add hook for subprocess.Popen() + elif ( + fullname == 'subprocess' and + not hasattr(module, 'eric6_patched') + ): + module.eric6_patched = True + patchSubprocess(module, self.__dbgClient) + + ## Add hook for multiprocessing.Process + elif ( + fullname == 'multiprocessing' and + not hasattr(module, 'eric6_patched') + ): + module.eric6_patched = True + patchMultiprocessing(module, self.__dbgClient) + + ## Add hook for *.QThread and *.QProcess + elif ( + fullname in ('PyQt5.QtCore', 'PyQt6.QtCore', + 'PySide2.QtCore', 'PySide6.QtCore') and + not hasattr(module, 'eric6_patched') + ): + module.eric6_patched = True + self.__dbgClient.patchQThread(module) + patchQProcess(module, self.__dbgClient) + + self.__enableImportHooks = True + return module + + def find_spec(self, fullname, path, target=None): + """ + Public method returning the module spec. + + @param fullname name of the module to be loaded + @type str + @param path path to resolve the module name + @type str + @param target module object to use for a more educated guess + about what spec to return + @type module + @return module spec object pointing to the module loader + @rtype ModuleSpec + """ + if fullname in sys.modules or not self.__dbgClient.debugging: + return None + + if ( + fullname in self.__modulesToPatch and + self.__enableImportHooks + ): + # Disable hook to be able to import original module + self.__enableImportHooks = False + return importlib.machinery.ModuleSpec(fullname, self) + + return None + + def create_module(self, spec): + """ + Public method to create a module based on the passed in spec. + + @param spec module spec object for loading the module + @type ModuleSpec + @return created and patched module + @rtype module + """ + return self.__loadModule(spec.name) + + def exec_module(self, module): + """ + Public method to execute the created module. + + @param module module to be executed + @type module + """ + pass
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/DebugClients/Python/MultiProcessDebugExtension.py Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,410 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2002 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a function to patch the process creation functions to +support multiprocess debugging. +""" + + +from DebugUtilities import ( + patchArguments, patchArgumentStringWindows, isPythonProgram, + isWindowsPlatform +) + +_debugClient = None + + +def _shallPatch(): + """ + Function to determine, if the multiprocessing patches should be done. + + @return flag indicating patching should be performed + @rtype bool + """ + return _debugClient.debugging and _debugClient.multiprocessSupport + + +def patchModule(module, functionName, createFunction): + """ + Function to replace a function of a module with a modified one. + + @param module reference to the module + @type types.ModuleType + @param functionName name of the function to be replaced + @type str + @param createFunction function creating the replacement + @type types.FunctionType + """ + if hasattr(module, functionName): + originalName = 'original_' + functionName + if not hasattr(module, originalName): + setattr(module, originalName, getattr(module, functionName)) + setattr(module, functionName, createFunction(originalName)) + + +def createExecl(originalName): + """ + Function to patch the 'execl' process creation functions. + + <ul> + <li>os.execl(path, arg0, arg1, ...)</li> + <li>os.execle(path, arg0, arg1, ..., env)</li> + <li>os.execlp(file, arg0, arg1, ...)</li> + <li>os.execlpe(file, arg0, arg1, ..., env)</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newExecl(path, *args): + """ + Function replacing the 'execl' functions of the os module. + """ + import os + if _shallPatch(): + args = patchArguments(_debugClient, args) + if isPythonProgram(args[0]): + path = args[0] + return getattr(os, originalName)(path, *args) + return newExecl + + +def createExecv(originalName): + """ + Function to patch the 'execv' process creation functions. + + <ul> + <li>os.execv(path, args)</li> + <li>os.execvp(file, args)</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newExecv(path, args): + """ + Function replacing the 'execv' functions of the os module. + """ + import os + if _shallPatch(): + args = patchArguments(_debugClient, args) + if isPythonProgram(args[0]): + path = args[0] + return getattr(os, originalName)(path, args) + return newExecv + + +def createExecve(originalName): + """ + Function to patch the 'execve' process creation functions. + + <ul> + <li>os.execve(path, args, env)</li> + <li>os.execvpe(file, args, env)</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newExecve(path, args, env): + """ + Function replacing the 'execve' functions of the os module. + """ + import os + if _shallPatch(): + args = patchArguments(_debugClient, args) + if isPythonProgram(args[0]): + path = args[0] + return getattr(os, originalName)(path, args, env) + return newExecve + + +def createSpawnl(originalName): + """ + Function to patch the 'spawnl' process creation functions. + + <ul> + <li>os.spawnl(mode, path, arg0, arg1, ...)</li> + <li>os.spawnlp(mode, file, arg0, arg1, ...)</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newSpawnl(mode, path, *args): + """ + Function replacing the 'spawnl' functions of the os module. + """ + import os + args = patchArguments(_debugClient, args) + return getattr(os, originalName)(mode, path, *args) + return newSpawnl + + +def createSpawnv(originalName): + """ + Function to patch the 'spawnv' process creation functions. + + <ul> + <li>os.spawnv(mode, path, args)</li> + <li>os.spawnvp(mode, file, args)</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newSpawnv(mode, path, args): + """ + Function replacing the 'spawnv' functions of the os module. + """ + import os + args = patchArguments(_debugClient, args) + return getattr(os, originalName)(mode, path, args) + return newSpawnv + + +def createSpawnve(originalName): + """ + Function to patch the 'spawnve' process creation functions. + + <ul> + <li>os.spawnve(mode, path, args, env)</li> + <li>os.spawnvpe(mode, file, args, env)</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newSpawnve(mode, path, args, env): + """ + Function replacing the 'spawnve' functions of the os module. + """ + import os + args = patchArguments(_debugClient, args) + return getattr(os, originalName)(mode, path, args, env) + return newSpawnve + + +def createPosixSpawn(originalName): + """ + Function to patch the 'posix_spawn' process creation functions. + + <ul> + <li>os.posix_spawn(path, argv, env, *, file_actions=None, ... + (6 more))</li> + <li>os.posix_spawnp(path, argv, env, *, file_actions=None, ... + (6 more))</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newPosixSpawn(path, argv, env, **kwargs): + """ + Function replacing the 'posix_spawn' functions of the os module. + """ + import os + argv = patchArguments(_debugClient, argv) + return getattr(os, originalName)(path, argv, env, **kwargs) + return newPosixSpawn + + +def createForkExec(originalName): + """ + Function to patch the 'fork_exec' process creation functions. + + <ul> + <li>_posixsubprocess.fork_exec(args, executable_list, close_fds, + ... (13 more))</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newForkExec(args, *other_args): + """ + Function replacing the 'fork_exec' functions of the _posixsubprocess + module. + """ + import _posixsubprocess + if _shallPatch(): + args = patchArguments(_debugClient, args) + return getattr(_posixsubprocess, originalName)(args, *other_args) + return newForkExec + + +def createFork(originalName): + """ + Function to patch the 'fork' process creation functions. + + <ul> + <li>os.fork()</li> + </ul> + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newFork(): + """ + Function replacing the 'fork' function of the os module. + """ + import os + import sys + + # A simple fork will result in a new python process + isNewPythonProcess = True + frame = sys._getframe() + + multiprocess = _shallPatch() + + isSubprocessFork = False + isMultiprocessingPopen = False + while frame is not None: + if frame.f_code.co_name == "_Popen": + # fork() was called from multiprocessing; ignore this here + # because it is handled in 'MultiprocessingExtension.py'. + isMultiprocessingPopen = True + break + + elif ( + frame.f_code.co_name == '_execute_child' and + 'subprocess' in frame.f_code.co_filename + ): + isSubprocessFork = True + # If we're actually in subprocess.Popen creating a child, it + # may result in something which is not a Python process, (so, + # we don't want to connect with it in the forked version). + executable = frame.f_locals.get('executable') + if executable is not None: + isNewPythonProcess = False + if isPythonProgram(executable): + isNewPythonProcess = True + break + + frame = frame.f_back + frame = None # Just make sure we don't hold on to it. + + childProcess = getattr(os, originalName)() # fork + if not childProcess and not isMultiprocessingPopen: + if isNewPythonProcess: + (wd, host, port, exceptions, tracePython, redirect, + noencoding) = _debugClient.startOptions + _debugClient.startDebugger( + filename=sys.argv[0], + host=host, + port=port, + enableTrace=multiprocess and not isSubprocessFork, + exceptions=exceptions, + tracePython=tracePython, + redirect=redirect, + passive=False, + multiprocessSupport=multiprocess) + return childProcess + + return newFork + + +def createCreateProcess(originalName): + """ + Function to patch the 'CreateProcess' process creation function of + Windows. + + @param originalName original name of the function to be patched + @type str + @return function replacing the original one + @rtype function + """ + def newCreateProcess(appName, cmdline, *args): + """ + Function replacing the 'CreateProcess' function of the _subprocess + or _winapi module. + """ + try: + import _subprocess + except ImportError: + import _winapi as _subprocess + return getattr(_subprocess, originalName)( + appName, patchArgumentStringWindows(_debugClient, cmdline), *args) + return newCreateProcess + + +def patchNewProcessFunctions(multiprocessEnabled, debugClient): + """ + Function to patch the process creation functions to support multiprocess + debugging. + + @param multiprocessEnabled flag indicating multiprocess support + @type bool + @param debugClient reference to the debug client object + @type DebugClient + """ + global _debugClient + + if not multiprocessEnabled: + # return without patching + return + + import os + import sys + + # patch 'os.exec...()' functions +#- patchModule(os, "execl", createExecl) +#- patchModule(os, "execle", createExecl) +#- patchModule(os, "execlp", createExecl) +#- patchModule(os, "execlpe", createExecl) +#- patchModule(os, "execv", createExecv) +#- patchModule(os, "execve", createExecve) +#- patchModule(os, "execvp", createExecv) +#- patchModule(os, "execvpe", createExecve) + + # patch 'os.spawn...()' functions + patchModule(os, "spawnl", createSpawnl) + patchModule(os, "spawnle", createSpawnl) + patchModule(os, "spawnlp", createSpawnl) + patchModule(os, "spawnlpe", createSpawnl) + patchModule(os, "spawnv", createSpawnv) + patchModule(os, "spawnve", createSpawnve) + patchModule(os, "spawnvp", createSpawnv) + patchModule(os, "spawnvpe", createSpawnve) + + # patch 'os.posix_spawn...()' functions + if sys.version_info >= (3, 8) and not isWindowsPlatform(): + patchModule(os, "posix_spawn", createPosixSpawn) + patchModule(os, "posix_spawnp", createPosixSpawn) + + if isWindowsPlatform(): + try: + import _subprocess + except ImportError: + import _winapi as _subprocess + patchModule(_subprocess, 'CreateProcess', createCreateProcess) + else: + patchModule(os, "fork", createFork) + try: + import _posixsubprocess + patchModule(_posixsubprocess, "fork_exec", createForkExec) + except ImportError: + pass + + _debugClient = debugClient
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/DebugClients/Python/MultiprocessingExtension.py Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2020 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a function to patch multiprocessing.Process to support +debugging of the process. +""" + +import sys +import traceback + +_debugClient = None +_originalProcess = None +_originalBootstrap = None + + +def patchMultiprocessing(module, debugClient): + """ + Function to patch the multiprocessing module. + + @param module reference to the imported module to be patched + @type module + @param debugClient reference to the debug client object + @type DebugClient + """ # __IGNORE_WARNING_D234__ + global _debugClient, _originalProcess, _originalBootstrap + + _debugClient = debugClient + + _originalProcess = module.process.BaseProcess + _originalBootstrap = _originalProcess._bootstrap + + class ProcessWrapper(_originalProcess): + """ + Wrapper class for multiprocessing.Process. + """ + def _bootstrap(self, *args, **kwargs): + """ + Wrapper around _bootstrap to start debugger. + + @param args function arguments + @type list + @param kwargs keyword only arguments + @type dict + @return exit code of the process + @rtype int + """ + _debugging = False + if ( + _debugClient.debugging and + _debugClient.multiprocessSupport + ): + scriptName = sys.argv[0] + if not _debugClient.skipMultiProcessDebugging(scriptName): + _debugging = True + try: + (wd, host, port, exceptions, tracePython, redirect, + noencoding) = _debugClient.startOptions[:7] + _debugClient.startDebugger( + sys.argv[0], host=host, port=port, + exceptions=exceptions, tracePython=tracePython, + redirect=redirect, passive=False, + multiprocessSupport=True + ) + except Exception: + print( + # __IGNORE_WARNING_M801__ + "Exception during multiprocessing bootstrap init:" + ) + traceback.print_exc(file=sys.stdout) + sys.stdout.flush() + raise + + exitcode = _originalBootstrap(self, *args, **kwargs) + + if _debugging: + _debugClient.progTerminated(exitcode, "process finished") + + return exitcode + + _originalProcess._bootstrap = ProcessWrapper._bootstrap
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/DebugClients/Python/QProcessExtension.py Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2020 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a function to patch QProcess to support debugging of the +process. +""" + +import os + +from DebugUtilities import isPythonProgram, startsWithShebang, patchArguments + +_debugClient = None + + +def patchQProcess(module, debugClient): + """ + Function to patch the QtCore module's QProcess. + + @param module reference to the imported module to be patched + @type module + @param debugClient reference to the debug client object + @type DebugClient + """ # __IGNORE_WARNING_D234__ + global _debugClient + + class QProcessWrapper(module.QProcess): + """ + Wrapper class for *.QProcess. + """ + _origQProcessStartDetached = module.QProcess.startDetached + + def __init__(self, parent=None): + """ + Constructor + """ + super(QProcessWrapper, self).__init__(parent) + + ################################################################### + ## Handling of 'start(...)' below + ################################################################### + + def start(self, *args, **kwargs): + """ + Public method to start the process. + + This method patches the arguments such, that a debug client is + started for the Python script. A Python script is assumed, if the + program to be started contains the string 'python'. + + @param args arguments of the start call + @type list + @param kwargs keyword arguments of the start call + @type dict + """ + if ( + _debugClient.debugging and + _debugClient.multiprocessSupport and + ((len(args) >= 2 and isinstance(args[1], list)) or + (len(args) == 1 and not isinstance(args[0], str)) or + len(args) == 0) + ): + if len(args) >= 2: + program = args[0] + arguments = args[1] + if len(args) > 2: + mode = args[2] + else: + mode = module.QIODevice.ReadWrite + else: + program = self.program() + arguments = self.arguments() + if len(args) == 1: + mode = args[0] + else: + mode = module.QIODevice.ReadWrite + ok = isPythonProgram(program) + if ok: + if startsWithShebang(program): + scriptName = os.path.basename(program) + else: + scriptName = os.path.basename(arguments[0]) + if not _debugClient.skipMultiProcessDebugging(scriptName): + newArgs = patchArguments( + _debugClient, + [program] + arguments, + ) + super(QProcessWrapper, self).start( + newArgs[0], newArgs[1:], mode) + return + + super(QProcessWrapper, self).start(*args, **kwargs) + + ################################################################### + ## Handling of 'startDetached(...)' below + ################################################################### + + def startDetached(self, *args, **kwargs): + """ + Public method to start the detached process. + + This method patches the arguments such, that a debug client is + started for the Python script. A Python script is assumed, if the + program to be started contains the string 'python'. + + @param args arguments of the start call + @type list + @param kwargs keyword arguments of the start call + @type dict + @return flag indicating a successful start + @rtype bool + """ + if isinstance(self, str): + return QProcessWrapper.startDetachedStatic( + self, *args) + else: + return self.__startDetached(*args, **kwargs) + + def __startDetached(self, *args, **kwargs): + """ + Private method to start the detached process. + + This method patches the arguments such, that a debug client is + started for the Python script. A Python script is assumed, if the + program to be started contains the string 'python'. + + @param args arguments of the start call + @type list + @param kwargs keyword arguments of the start call + @type dict + @return flag indicating a successful start + @rtype bool + """ + if ( + _debugClient.debugging and + _debugClient.multiprocessSupport and + len(args) == 0 + ): + program = self.program() + arguments = self.arguments() + wd = self.workingDirectory() + + ok = isPythonProgram(program) + if ok: + return QProcessWrapper.startDetachedStatic( + program, arguments, wd) + + return super(QProcessWrapper, self).startDetached(*args, **kwargs) + + @staticmethod + def startDetachedStatic(*args, **kwargs): + """ + Static method to start the detached process. + + This method patches the arguments such, that a debug client is + started for the Python script. A Python script is assumed, if the + program to be started contains the string 'python'. + + @param args arguments of the start call + @type list + @param kwargs keyword arguments of the start call + @type dict + @return flag indicating a successful start + @rtype bool + """ + if ( + _debugClient.debugging and + _debugClient.multiprocessSupport and + (len(args) >= 2 and isinstance(args[1], list)) + ): + program = args[0] + arguments = args[1] + if len(args) >= 3: + wd = args[2] + else: + wd = "" + ok = isPythonProgram(program) + if ok: + if startsWithShebang(program): + scriptName = os.path.basename(program) + else: + scriptName = os.path.basename(arguments[0]) + if not _debugClient.skipMultiProcessDebugging(scriptName): + newArgs = patchArguments( + _debugClient, + [program] + arguments, + ) + return QProcessWrapper._origQProcessStartDetached( + newArgs[0], newArgs[1:], wd) + + return QProcessWrapper._origQProcessStartDetached( + *args, **kwargs) + + _debugClient = debugClient + module.QProcess = QProcessWrapper
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/DebugClients/Python/SubprocessExtension.py Mon Feb 01 10:38:16 2021 +0100 @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2020 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a function to patch subprocess.Popen to support debugging +of the process. +""" + +import os +import shlex + +from DebugUtilities import isPythonProgram, patchArguments + +_debugClient = None + + +def patchSubprocess(module, debugClient): + """ + Function to patch the subprocess module. + + @param module reference to the imported module to be patched + @type module + @param debugClient reference to the debug client object + @type DebugClient + """ # __IGNORE_WARNING_D234__ + global _debugClient + + class PopenWrapper(module.Popen): + """ + Wrapper class for subprocess.Popen. + """ + def __init__(self, arguments, *args, **kwargs): + """ + Constructor + + @param arguments command line arguments for the new process + @type list of str or str + @param args constructor arguments of Popen + @type list + @param kwargs constructor keyword only arguments of Popen + @type dict + """ + if ( + _debugClient.debugging and + _debugClient.multiprocessSupport and + isinstance(arguments, (str, list)) + ): + if isinstance(arguments, str): + # convert to arguments list + arguments = shlex.split(arguments) + else: + # create a copy of the arguments + arguments = arguments[:] + ok = isPythonProgram(arguments[0]) + if ok: + scriptName = os.path.basename(arguments[0]) + if not _debugClient.skipMultiProcessDebugging(scriptName): + arguments = patchArguments( + _debugClient, arguments, noRedirect=True + ) + + super(PopenWrapper, self).__init__(arguments, *args, **kwargs) + + _debugClient = debugClient + module.Popen = PopenWrapper
--- a/eric6/DebugClients/Python/ThreadExtension.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/ThreadExtension.py Mon Feb 01 10:38:16 2021 +0100 @@ -7,9 +7,8 @@ Module implementing an import hook patching thread modules to get debugged too. """ -import os.path +import os import sys -import importlib import _thread import threading @@ -23,7 +22,7 @@ """ Class implementing the thread support for the debugger. - Provides methods for intercepting thread creation, retriving the running + Provides methods for intercepting thread creation, retrieving the running threads and their name and state. """ def __init__(self): @@ -31,11 +30,7 @@ Constructor """ self.threadNumber = 1 - self.enableImportHooks = True self._original_start_new_thread = None - self.threadingAttached = False - self.qtThreadAttached = False - self.greenlet = False self.clientLock = threading.RLock() @@ -49,12 +44,6 @@ # special objects representing the main scripts thread and frame self.mainThread = self - - # reset already imported thread module to apply hooks at next import - del sys.modules['_thread'] - del sys.modules['threading'] - - sys.meta_path.insert(0, self) def attachThread(self, target=None, args=None, kwargs=None, mainThread=False): @@ -121,10 +110,7 @@ @return flag indicating successful locking @rtype bool """ - if blocking: - return self.clientLock.acquire() - else: - return self.clientLock.acquire(blocking) + return self.clientLock.acquire(blocking) def unlockClient(self): """ @@ -132,7 +118,7 @@ """ try: self.clientLock.release() - except AssertionError: + except RuntimeError: pass def setCurrentThread(self, threadId): @@ -156,27 +142,23 @@ Public method to send the list of threads. """ self.updateThreadList() + threadList = [] - if len(self.threads) > 1: - currentId = _thread.get_ident() - # update thread names set by user (threading.setName) - threadNames = {t.ident: t.getName() for t in threading.enumerate()} + currentId = _thread.get_ident() + # update thread names set by user (threading.setName) + threadNames = {t.ident: t.getName() for t in threading.enumerate()} + + for threadId, thd in self.threads.items(): + d = {"id": threadId} + try: + d["name"] = threadNames.get(threadId, thd.name) + d["broken"] = thd.isBroken + d["except"] = thd.isException + except Exception: + d["name"] = 'UnknownThread' + d["broken"] = False + d["except"] = False - for threadId, thd in self.threads.items(): - d = {"id": threadId} - try: - d["name"] = threadNames.get(threadId, thd.name) - d["broken"] = thd.isBroken - except Exception: - d["name"] = 'UnknownThread' - d["broken"] = False - - threadList.append(d) - else: - currentId = -1 - d = {"id": -1} - d["name"] = "MainThread" - d["broken"] = self.isBroken threadList.append(d) self.sendJsonCommand("ResponseThreadList", { @@ -237,198 +219,193 @@ self.threads = {id_: thrd for id_, thrd in self.threads.items() if id_ in frames} - def find_module(self, fullname, path=None): - """ - Public method returning the module loader. - - @param fullname name of the module to be loaded - @type str - @param path path to resolve the module name - @type str - @return module loader object - @rtype object + ####################################################################### + ## Methods below deal with patching various modules to support + ## debugging of threads. + ####################################################################### + + def patchPyThread(self, module): """ - if fullname in sys.modules or not self.debugging: - return None + Public method to patch Python _thread (Python3) and thread (Python2) + modules. - if fullname in ['_thread', 'PyQt5.QtCore', 'PySide2.QtCore', - 'greenlet', 'threading' - ] and self.enableImportHooks: - # Disable hook to be able to import original module - self.enableImportHooks = False - return self - - return None + @param module reference to the imported module to be patched + @type module + """ + # make thread hooks available to system + self._original_start_new_thread = module.start_new_thread + module.start_new_thread = self.attachThread - def load_module(self, fullname): + def patchGreenlet(self, module): """ - Public method to load a module. + Public method to patch the 'greenlet' module. - @param fullname name of the module to be loaded - @type str - @return reference to the loaded module - @rtype module + @param module reference to the imported module to be patched + @type module + @return flag indicating that the module was processed + @rtype bool """ - module = importlib.import_module(fullname) - sys.modules[fullname] = module - if (fullname == '_thread' and - self._original_start_new_thread is None): - # make thread hooks available to system - self._original_start_new_thread = module.start_new_thread - module.start_new_thread = self.attachThread - - elif (fullname == 'greenlet' and self.greenlet is False): - # Check for greenlet.settrace - if hasattr(module, 'settrace'): - self.greenlet = True - DebugBase.pollTimerEnabled = False + # Check for greenlet.settrace + if hasattr(module, 'settrace'): + DebugBase.pollTimerEnabled = False + return True + return False + + def patchPyThreading(self, module): + """ + Public method to patch the Python threading module. + + @param module reference to the imported module to be patched + @type module + """ + # _debugClient as a class attribute can't be accessed in following + # class. Therefore we need a global variable. + _debugClient = self - # Add hook for threading.run() - elif (fullname == "threading" and self.threadingAttached is False): - self.threadingAttached = True + def _bootstrap(self, run): + """ + Bootstrap for threading, which reports exceptions correctly. + + @param run the run method of threading.Thread + @type method pointer + """ + newThread = DebugBase(_debugClient) + newThread.name = self.name + + _debugClient.threads[self.ident] = newThread + _debugClient.dumpThreadList() - # _debugClient as a class attribute can't be accessed in following - # class. Therefore we need a global variable. - _debugClient = self - - def _bootstrap(self, run): - """ - Bootstrap for threading, which reports exceptions correctly. - - @param run the run method of threading.Thread - @type method pointer + # see DebugBase.bootstrap + sys.settrace(newThread.trace_dispatch) + try: + run() + except Exception: + excinfo = sys.exc_info() + newThread.user_exception(excinfo, True) + finally: + sys.settrace(None) + _debugClient.dumpThreadList() + + class ThreadWrapper(module.Thread): + """ + Wrapper class for threading.Thread. + """ + def __init__(self, *args, **kwargs): """ - newThread = DebugBase(_debugClient) - _debugClient.threads[self.ident] = newThread - newThread.name = self.name - # see DebugBase.bootstrap - sys.settrace(newThread.trace_dispatch) - try: - run() - except Exception: - excinfo = sys.exc_info() - newThread.user_exception(excinfo, True) - finally: - sys.settrace(None) - - class ThreadWrapper(module.Thread): - """ - Wrapper class for threading.Thread. + Constructor """ - def __init__(self, *args, **kwargs): - """ - Constructor - """ - # Overwrite the provided run method with our own, to - # intercept the thread creation by threading.Thread - self.run = lambda s=self, run=self.run: _bootstrap(s, run) - - super(ThreadWrapper, self).__init__(*args, **kwargs) + # Overwrite the provided run method with our own, to + # intercept the thread creation by threading.Thread + self.run = lambda s=self, run=self.run: _bootstrap(s, run) + + super(ThreadWrapper, self).__init__(*args, **kwargs) + + module.Thread = ThreadWrapper + + # Special handling of threading.(_)Timer + timer = module.Timer - module.Thread = ThreadWrapper - - # Special handling of threading.(_)Timer - timer = module.Timer - - class TimerWrapper(timer, ThreadWrapper): + class TimerWrapper(timer, ThreadWrapper): + """ + Wrapper class for threading.(_)Timer. + """ + def __init__(self, interval, function, *args, **kwargs): """ - Wrapper class for threading.(_)Timer. + Constructor """ - def __init__(self, interval, function, *args, **kwargs): - """ - Constructor - """ - super(TimerWrapper, self).__init__( - interval, function, *args, **kwargs) - - module.Timer = TimerWrapper + super(TimerWrapper, self).__init__( + interval, function, *args, **kwargs) - # Special handling of threading._DummyThread - class DummyThreadWrapper(module._DummyThread, ThreadWrapper): - """ - Wrapper class for threading._DummyThread. + module.Timer = TimerWrapper + + # Special handling of threading._DummyThread + class DummyThreadWrapper(module._DummyThread, ThreadWrapper): + """ + Wrapper class for threading._DummyThread. + """ + def __init__(self, *args, **kwargs): """ - def __init__(self, *args, **kwargs): - """ - Constructor - """ - super(DummyThreadWrapper, self).__init__(*args, **kwargs) - - module._DummyThread = DummyThreadWrapper + Constructor + """ + super(DummyThreadWrapper, self).__init__(*args, **kwargs) + + module._DummyThread = DummyThreadWrapper + + def patchQThread(self, module): + """ + Public method to patch the QtCore module's QThread. - # Add hook for *.QThread - elif (fullname in ['PyQt5.QtCore', 'PySide2.QtCore'] and - self.qtThreadAttached is False): - self.qtThreadAttached = True - # _debugClient as a class attribute can't be accessed in following - # class. Therefore we need a global variable. - _debugClient = self + @param module reference to the imported module to be patched + @type module + """ + # _debugClient as a class attribute can't be accessed in following + # class. Therefore we need a global variable. + _debugClient = self - def _bootstrapQThread(self, run): + def _bootstrapQThread(self, run): + """ + Bootstrap for QThread, which reports exceptions correctly. + + @param run the run method of *.QThread + @type method pointer + """ + global _qtThreadNumber + + newThread = DebugBase(_debugClient) + ident = _thread.get_ident() + name = 'QtThread-{0}'.format(_qtThreadNumber) + + _qtThreadNumber += 1 + + newThread.id = ident + newThread.name = name + + _debugClient.threads[ident] = newThread + _debugClient.dumpThreadList() + + # see DebugBase.bootstrap + sys.settrace(newThread.trace_dispatch) + try: + run() + except SystemExit: + # *.QThreads doesn't like SystemExit + pass + except Exception: + excinfo = sys.exc_info() + newThread.user_exception(excinfo, True) + finally: + sys.settrace(None) + _debugClient.dumpThreadList() + + class QThreadWrapper(module.QThread): + """ + Wrapper class for *.QThread. + """ + def __init__(self, *args, **kwargs): """ - Bootstrap for QThread, which reports exceptions correctly. - - @param run the run method of *.QThread - @type method pointer + Constructor """ - global _qtThreadNumber - - newThread = DebugBase(_debugClient) - ident = _thread.get_ident() - name = 'QtThread-{0}'.format(_qtThreadNumber) - - _qtThreadNumber += 1 - - newThread.id = ident - newThread.name = name + # Overwrite the provided run method with our own, to + # intercept the thread creation by Qt + self.run = lambda s=self, run=self.run: ( + _bootstrapQThread(s, run)) - _debugClient.threads[ident] = newThread - - # see DebugBase.bootstrap - sys.settrace(newThread.trace_dispatch) - try: - run() - except SystemExit: - # *.QThreads doesn't like SystemExit - pass - except Exception: - excinfo = sys.exc_info() - newThread.user_exception(excinfo, True) - finally: - sys.settrace(None) + super(QThreadWrapper, self).__init__(*args, **kwargs) - class QThreadWrapper(module.QThread): + class QRunnableWrapper(module.QRunnable): + """ + Wrapper class for *.QRunnable. + """ + def __init__(self, *args, **kwargs): """ - Wrapper class for *.QThread. + Constructor """ - def __init__(self, *args, **kwargs): - """ - Constructor - """ - # Overwrite the provided run method with our own, to - # intercept the thread creation by Qt - self.run = lambda s=self, run=self.run: ( - _bootstrapQThread(s, run)) - - super(QThreadWrapper, self).__init__(*args, **kwargs) - - class QRunnableWrapper(module.QRunnable): - """ - Wrapper class for *.QRunnable. - """ - def __init__(self, *args, **kwargs): - """ - Constructor - """ - # Overwrite the provided run method with our own, to - # intercept the thread creation by Qt - self.run = lambda s=self, run=self.run: ( - _bootstrapQThread(s, run)) - - super(QRunnableWrapper, self).__init__(*args, **kwargs) - - module.QThread = QThreadWrapper - module.QRunnable = QRunnableWrapper + # Overwrite the provided run method with our own, to + # intercept the thread creation by Qt + self.run = lambda s=self, run=self.run: ( + _bootstrapQThread(s, run)) + + super(QRunnableWrapper, self).__init__(*args, **kwargs) - self.enableImportHooks = True - return module + module.QThread = QThreadWrapper + module.QRunnable = QRunnableWrapper
--- a/eric6/DebugClients/Python/coverage/control.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/control.py Mon Feb 01 10:38:16 2021 +0100 @@ -4,6 +4,7 @@ """Core control stuff for coverage.py.""" import atexit +import collections import contextlib import os import os.path @@ -737,9 +738,12 @@ # Touch all the files that could have executed, so that we can # mark completely unexecuted files as 0% covered. if self._data is not None: + file_paths = collections.defaultdict(list) for file_path, plugin_name in self._inorout.find_possibly_unexecuted_files(): file_path = self._file_mapper(file_path) - self._data.touch_file(file_path, plugin_name) + file_paths[plugin_name].append(file_path) + for plugin_name, paths in file_paths.items(): + self._data.touch_files(paths, plugin_name) if self.config.note: self._warn("The '[run] note' setting is no longer supported.")
--- a/eric6/DebugClients/Python/coverage/doc/CHANGES.rst Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/doc/CHANGES.rst Mon Feb 01 10:38:16 2021 +0100 @@ -21,6 +21,159 @@ .. Version 9.8.1 --- 2027-07-27 .. ---------------------------- +.. _changes_531: + +Version 5.3.1 --- 2020-12-19 +---------------------------- + +- When using ``--source`` on a large source tree, v5.x was slower than previous + versions. This performance regression is now fixed, closing `issue 1037`_. + +- Mysterious SQLite errors can happen on PyPy, as reported in `issue 1010`_. An + immediate retry seems to fix the problem, although it is an unsatisfying + solution. + +- The HTML report now saves the sort order in a more widely supported way, + fixing `issue 986`_. Thanks, Sebastián Ramírez (`pull request 1066`_). + +- The HTML report pages now have a :ref:`Sleepy Snake <sleepy>` favicon. + +- Wheels are now provided for manylinux2010, and for PyPy3 (pp36 and pp37). + +- Continuous integration has moved from Travis and AppVeyor to GitHub Actions. + +.. _issue 986: https://github.com/nedbat/coveragepy/issues/986 +.. _issue 1037: https://github.com/nedbat/coveragepy/issues/1037 +.. _issue 1010: https://github.com/nedbat/coveragepy/issues/1010 +.. _pull request 1066: https://github.com/nedbat/coveragepy/pull/1066 + +.. _changes_53: + +Version 5.3 --- 2020-09-13 +-------------------------- + +- The ``source`` setting has always been interpreted as either a file path or a + module, depending on which existed. If both interpretations were valid, it + was assumed to be a file path. The new ``source_pkgs`` setting can be used + to name a package to disambiguate this case. Thanks, Thomas Grainger. Fixes + `issue 268`_. + +- If a plugin was disabled due to an exception, we used to still try to record + its information, causing an exception, as reported in `issue 1011`_. This is + now fixed. + +.. _issue 268: https://github.com/nedbat/coveragepy/issues/268 +.. _issue 1011: https://github.com/nedbat/coveragepy/issues/1011 + + +.. _changes_521: + +Version 5.2.1 --- 2020-07-23 +---------------------------- + +- The dark mode HTML report still used light colors for the context listing, + making them unreadable (`issue 1009`_). This is now fixed. + +- The time stamp on the HTML report now includes the time zone. Thanks, Xie + Yanbo (`pull request 960`_). + +.. _pull request 960: https://github.com/nedbat/coveragepy/pull/960 +.. _issue 1009: https://github.com/nedbat/coveragepy/issues/1009 + + +.. _changes_52: + +Version 5.2 --- 2020-07-05 +-------------------------- + +- The HTML report has been redesigned by Vince Salvino. There is now a dark + mode, the code text is larger, and system sans serif fonts are used, in + addition to other small changes (`issue 858`_ and `pull request 931`_). + +- The ``coverage report`` and ``coverage html`` commands now accept a + ``--precision`` option to control the number of decimal points displayed. + Thanks, Teake Nutma (`pull request 982`_). + +- The ``coverage report`` and ``coverage html`` commands now accept a + ``--no-skip-covered`` option to negate ``--skip-covered``. Thanks, Anthony + Sottile (`issue 779`_ and `pull request 932`_). + +- The ``--skip-empty`` option is now available for the XML report, closing + `issue 976`_. + +- The ``coverage report`` command now accepts a ``--sort`` option to specify + how to sort the results. Thanks, Jerin Peter George (`pull request 1005`_). + +- If coverage fails due to the coverage total not reaching the ``--fail-under`` + value, it will now print a message making the condition clear. Thanks, + Naveen Yadav (`pull request 977`_). + +- TOML configuration files with non-ASCII characters would cause errors on + Windows (`issue 990`_). This is now fixed. + +- The output of ``--debug=trace`` now includes information about how the + ``--source`` option is being interpreted, and the module names being + considered. + +.. _pull request 931: https://github.com/nedbat/coveragepy/pull/931 +.. _pull request 932: https://github.com/nedbat/coveragepy/pull/932 +.. _pull request 977: https://github.com/nedbat/coveragepy/pull/977 +.. _pull request 982: https://github.com/nedbat/coveragepy/pull/982 +.. _pull request 1005: https://github.com/nedbat/coveragepy/pull/1005 +.. _issue 779: https://github.com/nedbat/coveragepy/issues/779 +.. _issue 858: https://github.com/nedbat/coveragepy/issues/858 +.. _issue 976: https://github.com/nedbat/coveragepy/issues/976 +.. _issue 990: https://github.com/nedbat/coveragepy/issues/990 + + +.. _changes_51: + +Version 5.1 --- 2020-04-12 +-------------------------- + +- The JSON report now includes counts of covered and missing branches. Thanks, + Salvatore Zagaria. + +- On Python 3.8, try-finally-return reported wrong branch coverage with + decorated async functions (`issue 964`_). This is now fixed. Thanks, Kjell + Braden. + +- The :meth:`~coverage.Coverage.get_option` and + :meth:`~coverage.Coverage.set_option` methods can now manipulate the + ``[paths]`` configuration setting. Thanks to Bernát Gábor for the fix for + `issue 967`_. + +.. _issue 964: https://github.com/nedbat/coveragepy/issues/964 +.. _issue 967: https://github.com/nedbat/coveragepy/issues/967 + + +.. _changes_504: + +Version 5.0.4 --- 2020-03-16 +---------------------------- + +- If using the ``[run] relative_files`` setting, the XML report will use + relative files in the ``<source>`` elements indicating the location of source + code. Closes `issue 948`_. + +- The textual summary report could report missing lines with negative line + numbers on PyPy3 7.1 (`issue 943`_). This is now fixed. + +- Windows wheels for Python 3.8 were incorrectly built, but are now fixed. + (`issue 949`_) + +- Updated Python 3.9 support to 3.9a4. + +- HTML reports couldn't be sorted if localStorage wasn't available. This is now + fixed: sorting works even though the sorting setting isn't retained. (`issue + 944`_ and `pull request 945`_). Thanks, Abdeali Kothari. + +.. _issue 943: https://github.com/nedbat/coveragepy/issues/943 +.. _issue 944: https://github.com/nedbat/coveragepy/issues/944 +.. _pull request 945: https://github.com/nedbat/coveragepy/pull/945 +.. _issue 948: https://github.com/nedbat/coveragepy/issues/948 +.. _issue 949: https://github.com/nedbat/coveragepy/issues/949 + .. _changes_503: @@ -463,7 +616,7 @@ - pickle2json, for converting v3 data files to v4 data files, has been removed. -.. _Bitbucket: https://bitbucket.org/ned/coveragepy +.. _Bitbucket: https://bitbucket.org .. _GitHub: https://github.com/nedbat/coveragepy .. _issue 611: https://github.com/nedbat/coveragepy/issues/611 @@ -491,8 +644,8 @@ - Large HTML report pages load faster. Thanks, Pankaj Pandey. -.. _issue 625: https://bitbucket.org/ned/coveragepy/issues/625/lstat-dominates-in-the-case-of-small -.. _issue 650: https://bitbucket.org/ned/coveragepy/issues/650/allow-setting-configuration-file-location +.. _issue 625: https://github.com/nedbat/coveragepy/issues/625 +.. _issue 650: https://github.com/nedbat/coveragepy/issues/650 .. _issue 700: https://github.com/nedbat/coveragepy/issues/700 @@ -532,7 +685,7 @@ .. _issue 707: https://github.com/nedbat/coveragepy/issues/707 .. _issue 714: https://github.com/nedbat/coveragepy/issues/714 -.. _Bitbucket: https://bitbucket.org/ned/coveragepy +.. _Bitbucket: https://bitbucket.org .. _GitHub: https://github.com/nedbat/coveragepy @@ -552,8 +705,8 @@ - Configurer plugins are now reported in the output of ``--debug=sys``. -.. _issue 638: https://bitbucket.org/ned/coveragepy/issues/638/run-omit-is-ignored-since-45 -.. _issue 640: https://bitbucket.org/ned/coveragepy/issues/640/indexerror-reporting-on-an-empty-decorated +.. _issue 638: https://github.com/nedbat/coveragepy/issues/638 +.. _issue 640: https://github.com/nedbat/coveragepy/issues/640 .. _changes_45: @@ -592,13 +745,13 @@ maximum. Now filenames will never get much larger than 200 characters, fixing `issue 627`_. Thanks to Alex Sandro for helping with the fix. -.. _issue 563: https://bitbucket.org/ned/coveragepy/issues/563/platform-specific-configuration -.. _issue 618: https://bitbucket.org/ned/coveragepy/issues/618/problem-when-combining-windows-generated -.. _issue 621: https://bitbucket.org/ned/coveragepy/issues/621/include-ignored-warning-when-using -.. _issue 622: https://bitbucket.org/ned/coveragepy/issues/622/report-omit-overwrites-run-omit -.. _issue 627: https://bitbucket.org/ned/coveragepy/issues/627/failure-generating-html-reports-when-the -.. _issue 629: https://bitbucket.org/ned/coveragepy/issues/629/multiple-use-of-combine-leads-to-empty -.. _issue 631: https://bitbucket.org/ned/coveragepy/issues/631/precise-coverage-percentage-value +.. _issue 563: https://github.com/nedbat/coveragepy/issues/563 +.. _issue 618: https://github.com/nedbat/coveragepy/issues/618 +.. _issue 621: https://github.com/nedbat/coveragepy/issues/621 +.. _issue 622: https://github.com/nedbat/coveragepy/issues/622 +.. _issue 627: https://github.com/nedbat/coveragepy/issues/627 +.. _issue 629: https://github.com/nedbat/coveragepy/issues/629 +.. _issue 631: https://github.com/nedbat/coveragepy/issues/631 .. _changes_442: @@ -630,11 +783,11 @@ - Be more flexible about the command name displayed by help, fixing `issue 600`_. Thanks, Ben Finney. -.. _issue 101: https://bitbucket.org/ned/coveragepy/issues/101/settings-under-report-affect-running -.. _issue 581: https://bitbucket.org/ned/coveragepy/issues/581/race-condition-when-saving-data-under -.. _issue 588: https://bitbucket.org/ned/coveragepy/issues/588/using-rcfile-path-to-toxini-uses-run -.. _issue 589: https://bitbucket.org/ned/coveragepy/issues/589/allow-expansion-in-coveragerc -.. _issue 600: https://bitbucket.org/ned/coveragepy/issues/600/get-program-name-from-command-line-when +.. _issue 101: https://github.com/nedbat/coveragepy/issues/101 +.. _issue 581: https://github.com/nedbat/coveragepy/issues/581 +.. _issue 588: https://github.com/nedbat/coveragepy/issues/588 +.. _issue 589: https://github.com/nedbat/coveragepy/issues/589 +.. _issue 600: https://github.com/nedbat/coveragepy/issues/600 .. _changes_441: @@ -670,10 +823,10 @@ - Running ``coverage xml`` in a directory named with non-ASCII characters would fail under Python 2. This is now fixed. (`issue 573`_) -.. _issue 526: https://bitbucket.org/ned/coveragepy/issues/526/generated-xml-invalid-paths-for-cobertura -.. _issue 572: https://bitbucket.org/ned/coveragepy/issues/572/no-python-source-warning-for-namespace -.. _issue 573: https://bitbucket.org/ned/coveragepy/issues/573/cant-generate-xml-report-if-some-source -.. _issue 575: https://bitbucket.org/ned/coveragepy/issues/575/running-doctest-prevents-complete-coverage +.. _issue 526: https://github.com/nedbat/coveragepy/issues/526 +.. _issue 572: https://github.com/nedbat/coveragepy/issues/572 +.. _issue 573: https://github.com/nedbat/coveragepy/issues/573 +.. _issue 575: https://github.com/nedbat/coveragepy/issues/575 Version 4.4b1 --- 2017-04-04 @@ -705,11 +858,11 @@ the coverage of the standard library tests. This code was not installed by kitted versions of coverage.py. Now it is. -.. _issue 79: https://bitbucket.org/ned/coveragepy/issues/79/save-prevents-harvesting-on-stop -.. _issue 96: https://bitbucket.org/ned/coveragepy/issues/96/unhelpful-warnings-produced-when-using -.. _issue 355: https://bitbucket.org/ned/coveragepy/issues/355/warnings-should-be-suppressable -.. _issue 448: https://bitbucket.org/ned/coveragepy/issues/448/save-and-html_report-prevent-further -.. _issue 570: https://bitbucket.org/ned/coveragepy/issues/570/cobertura-coverage-04dtd-support +.. _issue 79: https://github.com/nedbat/coveragepy/issues/79 +.. _issue 96: https://github.com/nedbat/coveragepy/issues/96 +.. _issue 355: https://github.com/nedbat/coveragepy/issues/355 +.. _issue 448: https://github.com/nedbat/coveragepy/issues/448 +.. _issue 570: https://github.com/nedbat/coveragepy/issues/570 .. _changes_434: @@ -721,7 +874,7 @@ exception wasn't properly derived from Exception, described in `issue 556`_. A newb mistake; it hasn't been a good few days. -.. _issue 556: https://bitbucket.org/ned/coveragepy/issues/556/43-fails-if-there-are-html-files-in-the +.. _issue 556: https://github.com/nedbat/coveragepy/issues/556 .. _changes_433: @@ -733,7 +886,7 @@ benefit of the coverage.py test suite. Properly conditionalizing it fixed `issue 554`_ so that Python 2.6 works again. -.. _issue 554: https://bitbucket.org/ned/coveragepy/issues/554/traceback-on-python-26-starting-with-432 +.. _issue 554: https://github.com/nedbat/coveragepy/issues/554 .. _changes_432: @@ -776,11 +929,11 @@ coverage.py 4.3, the old HTML file with the less-than-100% coverage would be left behind. This file is now properly deleted. -.. _issue 322: https://bitbucket.org/ned/coveragepy/issues/322/cannot-use-coverage-with-jython -.. _issue 426: https://bitbucket.org/ned/coveragepy/issues/426/difference-between-coverage-results-with -.. _issue 522: https://bitbucket.org/ned/coveragepy/issues/522/incorrect-branch-reporting -.. _issue 549: https://bitbucket.org/ned/coveragepy/issues/549/skip-covered-with-100-coverage-throws-a-no -.. _issue 551: https://bitbucket.org/ned/coveragepy/issues/551/coveragepy-cannot-be-imported-in-jython27 +.. _issue 322: https://github.com/nedbat/coveragepy/issues/322 +.. _issue 426: https://github.com/nedbat/coveragepy/issues/426 +.. _issue 522: https://github.com/nedbat/coveragepy/issues/522 +.. _issue 549: https://github.com/nedbat/coveragepy/issues/549 +.. _issue 551: https://github.com/nedbat/coveragepy/issues/551 .. _changes_431: @@ -796,8 +949,8 @@ in `issue 541`_. The check has been reverted while we re-think the fix for `issue 265`_. -.. _issue 540: https://bitbucket.org/ned/coveragepy/issues/540/cant-install-coverage-v43-into-under -.. _issue 541: https://bitbucket.org/ned/coveragepy/issues/541/coverage-43-breaks-nosetest-with-coverage +.. _issue 540: https://github.com/nedbat/coveragepy/issues/540 +.. _issue 541: https://github.com/nedbat/coveragepy/issues/541 .. _changes_43: @@ -909,24 +1062,24 @@ author string in setup.py, though this might be too cute. .. _sys.excepthook: https://docs.python.org/3/library/sys.html#sys.excepthook -.. _issue 265: https://bitbucket.org/ned/coveragepy/issues/265/when-using-source-include-is-silently -.. _issue 412: https://bitbucket.org/ned/coveragepy/issues/412/coverage-combine-should-error-if-no -.. _issue 433: https://bitbucket.org/ned/coveragepy/issues/433/coverage-html-does-not-suport-skip-covered -.. _issue 493: https://bitbucket.org/ned/coveragepy/issues/493/confusing-branching-failure -.. _issue 496: https://bitbucket.org/ned/coveragepy/issues/496/incorrect-coverage-with-branching-and -.. _issue 502: https://bitbucket.org/ned/coveragepy/issues/502/incorrect-coverage-report-with-cover -.. _issue 505: https://bitbucket.org/ned/coveragepy/issues/505/use-canonical-filename-for-debounce -.. _issue 514: https://bitbucket.org/ned/coveragepy/issues/514/path-to-problem-file-not-reported-when -.. _issue 510: https://bitbucket.org/ned/coveragepy/issues/510/erase-still-needed-in-42 -.. _issue 511: https://bitbucket.org/ned/coveragepy/issues/511/version-42-coverage-combine-empties -.. _issue 516: https://bitbucket.org/ned/coveragepy/issues/516/running-coverage-combine-twice-deletes-all -.. _issue 519: https://bitbucket.org/ned/coveragepy/issues/519/coverage-run-sections-in-toxini-or-as -.. _issue 524: https://bitbucket.org/ned/coveragepy/issues/524/coverage-report-with-skip-covered-column -.. _issue 525: https://bitbucket.org/ned/coveragepy/issues/525/coverage-combine-when-not-in-parallel-mode -.. _issue 529: https://bitbucket.org/ned/coveragepy/issues/529/encoding-marker-may-only-appear-on-the -.. _issue 530: https://bitbucket.org/ned/coveragepy/issues/530/deprecationwarning-you-passed-a-bytestring -.. _issue 533: https://bitbucket.org/ned/coveragepy/issues/533/exception-on-unencodable-file-name -.. _issue 535: https://bitbucket.org/ned/coveragepy/issues/535/sysexcepthook-is-not-called +.. _issue 265: https://github.com/nedbat/coveragepy/issues/265 +.. _issue 412: https://github.com/nedbat/coveragepy/issues/412 +.. _issue 433: https://github.com/nedbat/coveragepy/issues/433 +.. _issue 493: https://github.com/nedbat/coveragepy/issues/493 +.. _issue 496: https://github.com/nedbat/coveragepy/issues/496 +.. _issue 502: https://github.com/nedbat/coveragepy/issues/502 +.. _issue 505: https://github.com/nedbat/coveragepy/issues/505 +.. _issue 514: https://github.com/nedbat/coveragepy/issues/514 +.. _issue 510: https://github.com/nedbat/coveragepy/issues/510 +.. _issue 511: https://github.com/nedbat/coveragepy/issues/511 +.. _issue 516: https://github.com/nedbat/coveragepy/issues/516 +.. _issue 519: https://github.com/nedbat/coveragepy/issues/519 +.. _issue 524: https://github.com/nedbat/coveragepy/issues/524 +.. _issue 525: https://github.com/nedbat/coveragepy/issues/525 +.. _issue 529: https://github.com/nedbat/coveragepy/issues/529 +.. _issue 530: https://github.com/nedbat/coveragepy/issues/530 +.. _issue 533: https://github.com/nedbat/coveragepy/issues/533 +.. _issue 535: https://github.com/nedbat/coveragepy/issues/535 .. _changes_42: @@ -944,7 +1097,7 @@ - Filtering the HTML report is now faster, thanks to Ville Skyttä. -.. _issue 495: https://bitbucket.org/ned/coveragepy/issues/495/branch-and-concurrency-are-conflicting +.. _issue 495: https://github.com/nedbat/coveragepy/issues/495 Version 4.2b1 --- 2016-07-04 @@ -997,14 +1150,14 @@ package: `unittest-mixins`_. .. _automatic subprocess measurement: https://coverage.readthedocs.io/en/latest/subprocess.html -.. _issue 199: https://bitbucket.org/ned/coveragepy/issues/199/add-a-way-to-sort-the-text-report -.. _issue 231: https://bitbucket.org/ned/coveragepy/issues/231/various-default-behavior-in-report-phase -.. _issue 298: https://bitbucket.org/ned/coveragepy/issues/298/show-in-html-report-that-the-columns-are -.. _issue 396: https://bitbucket.org/ned/coveragepy/issues/396/coverage-xml-shouldnt-bail-out-on-parse -.. _issue 454: https://bitbucket.org/ned/coveragepy/issues/454/coverage-debug-config-should-be -.. _issue 478: https://bitbucket.org/ned/coveragepy/issues/478/help-shows-silly-program-name-when-running -.. _issue 484: https://bitbucket.org/ned/coveragepy/issues/484/multiprocessing-greenlet-concurrency -.. _issue 492: https://bitbucket.org/ned/coveragepy/issues/492/subprocess-coverage-strange-detection-of +.. _issue 199: https://github.com/nedbat/coveragepy/issues/199 +.. _issue 231: https://github.com/nedbat/coveragepy/issues/231 +.. _issue 298: https://github.com/nedbat/coveragepy/issues/298 +.. _issue 396: https://github.com/nedbat/coveragepy/issues/396 +.. _issue 454: https://github.com/nedbat/coveragepy/issues/454 +.. _issue 478: https://github.com/nedbat/coveragepy/issues/478 +.. _issue 484: https://github.com/nedbat/coveragepy/issues/484 +.. _issue 492: https://github.com/nedbat/coveragepy/issues/492 .. _unittest-mixins: https://pypi.org/project/unittest-mixins/ @@ -1071,17 +1224,17 @@ - Make a small tweak to how we compare threads, to avoid buggy custom comparison code in thread classes. (`issue 245`_) -.. _issue 90: https://bitbucket.org/ned/coveragepy/issues/90/lambda-expression-confuses-branch -.. _issue 245: https://bitbucket.org/ned/coveragepy/issues/245/change-solution-for-issue-164 -.. _issue 440: https://bitbucket.org/ned/coveragepy/issues/440/yielded-twisted-failure-marked-as-missed -.. _issue 456: https://bitbucket.org/ned/coveragepy/issues/456/coverage-breaks-with-implicit-namespaces -.. _issue 460: https://bitbucket.org/ned/coveragepy/issues/460/confusing-html-report-for-certain-partial -.. _issue 469: https://bitbucket.org/ned/coveragepy/issues/469/strange-1-line-number-in-branch-coverage -.. _issue 472: https://bitbucket.org/ned/coveragepy/issues/472/html-report-indents-incorrectly-for-one -.. _issue 475: https://bitbucket.org/ned/coveragepy/issues/475/generator-expression-is-marked-as-not -.. _issue 479: https://bitbucket.org/ned/coveragepy/issues/479/clarify-the-need-for-the-c-extension -.. _issue 481: https://bitbucket.org/ned/coveragepy/issues/481/asyncioprocesspoolexecutor-tracing-not -.. _issue 485: https://bitbucket.org/ned/coveragepy/issues/485/coveragereport-ignores-show_missing-and +.. _issue 90: https://github.com/nedbat/coveragepy/issues/90 +.. _issue 245: https://github.com/nedbat/coveragepy/issues/245 +.. _issue 440: https://github.com/nedbat/coveragepy/issues/440 +.. _issue 456: https://github.com/nedbat/coveragepy/issues/456 +.. _issue 460: https://github.com/nedbat/coveragepy/issues/460 +.. _issue 469: https://github.com/nedbat/coveragepy/issues/469 +.. _issue 472: https://github.com/nedbat/coveragepy/issues/472 +.. _issue 475: https://github.com/nedbat/coveragepy/issues/475 +.. _issue 479: https://github.com/nedbat/coveragepy/issues/479 +.. _issue 481: https://github.com/nedbat/coveragepy/issues/481 +.. _issue 485: https://github.com/nedbat/coveragepy/issues/485 Version 4.1b2 --- 2016-01-23 @@ -1104,8 +1257,8 @@ - ``coverage report`` won't produce trailing whitespace. -.. _issue 465: https://bitbucket.org/ned/coveragepy/issues/465/coveragexml-produces-package-names-with-an -.. _issue 466: https://bitbucket.org/ned/coveragepy/issues/466/impossible-missed-branch-to-a-negative +.. _issue 465: https://github.com/nedbat/coveragepy/issues/465 +.. _issue 466: https://github.com/nedbat/coveragepy/issues/466 Version 4.1b1 --- 2016-01-10 @@ -1153,15 +1306,15 @@ - Form-feed characters would prevent accurate determination of the beginning of statements in the rest of the file. This is now fixed, closing `issue 461`_. -.. _issue 129: https://bitbucket.org/ned/coveragepy/issues/129/misleading-branch-coverage-of-empty -.. _issue 131: https://bitbucket.org/ned/coveragepy/issues/131/pragma-on-a-decorator-line-should-affect -.. _issue 146: https://bitbucket.org/ned/coveragepy/issues/146/context-managers-confuse-branch-coverage -.. _issue 212: https://bitbucket.org/ned/coveragepy/issues/212/coverage-erroneously-reports-partial -.. _issue 422: https://bitbucket.org/ned/coveragepy/issues/422/python35-partial-branch-marked-as-fully -.. _issue 434: https://bitbucket.org/ned/coveragepy/issues/434/indexerror-in-python-35 -.. _issue 453: https://bitbucket.org/ned/coveragepy/issues/453/source-code-encoding-can-only-be-specified -.. _issue 455: https://bitbucket.org/ned/coveragepy/issues/455/unusual-exclusions-stopped-working-in -.. _issue 461: https://bitbucket.org/ned/coveragepy/issues/461/multiline-asserts-need-too-many-pragma +.. _issue 129: https://github.com/nedbat/coveragepy/issues/129 +.. _issue 131: https://github.com/nedbat/coveragepy/issues/131 +.. _issue 146: https://github.com/nedbat/coveragepy/issues/146 +.. _issue 212: https://github.com/nedbat/coveragepy/issues/212 +.. _issue 422: https://github.com/nedbat/coveragepy/issues/422 +.. _issue 434: https://github.com/nedbat/coveragepy/issues/434 +.. _issue 453: https://github.com/nedbat/coveragepy/issues/453 +.. _issue 455: https://github.com/nedbat/coveragepy/issues/455 +.. _issue 461: https://github.com/nedbat/coveragepy/issues/461 .. _changes_403: @@ -1184,11 +1337,11 @@ command name, which might be different than "coverage". Thanks to Ben Finney, this closes `issue 438`_. -.. _issue 420: https://bitbucket.org/ned/coveragepy/issues/420/coverage-40-hangs-indefinitely-on-python27 -.. _issue 438: https://bitbucket.org/ned/coveragepy/issues/438/parameterise-coverage-command-name -.. _issue 439: https://bitbucket.org/ned/coveragepy/issues/439/incorrect-cobertura-file-sources-generated -.. _issue 443: https://bitbucket.org/ned/coveragepy/issues/443/coverage-gets-confused-when-encoding -.. _issue 445: https://bitbucket.org/ned/coveragepy/issues/445/django-app-cannot-connect-to-cassandra +.. _issue 420: https://github.com/nedbat/coveragepy/issues/420 +.. _issue 438: https://github.com/nedbat/coveragepy/issues/438 +.. _issue 439: https://github.com/nedbat/coveragepy/issues/439 +.. _issue 443: https://github.com/nedbat/coveragepy/issues/443 +.. _issue 445: https://github.com/nedbat/coveragepy/issues/445 .. _changes_402: @@ -1207,9 +1360,9 @@ - Officially support PyPy 4.0, which required no changes, just updates to the docs. -.. _issue 431: https://bitbucket.org/ned/coveragepy/issues/431/couldnt-parse-python-file-with-cp1252 -.. _issue 432: https://bitbucket.org/ned/coveragepy/issues/432/path-with-unicode-characters-various -.. _issue 436: https://bitbucket.org/ned/coveragepy/issues/436/disabled-coverage-ctracer-may-rise-from +.. _issue 431: https://github.com/nedbat/coveragepy/issues/431 +.. _issue 432: https://github.com/nedbat/coveragepy/issues/432 +.. _issue 436: https://github.com/nedbat/coveragepy/issues/436 .. _changes_401: @@ -1250,14 +1403,14 @@ - The source kit now contains all of the files needed to have a complete source tree, re-fixing `issue 137`_ and closing `issue 281`_. -.. _issue 281: https://bitbucket.org/ned/coveragepy/issues/281/supply-scripts-for-testing-in-the -.. _issue 397: https://bitbucket.org/ned/coveragepy/issues/397/stopping-and-resuming-coverage-with -.. _issue 410: https://bitbucket.org/ned/coveragepy/issues/410/attributeerror-module-object-has-no -.. _issue 415: https://bitbucket.org/ned/coveragepy/issues/415/repeated-coveragedataupdates-cause -.. _issue 416: https://bitbucket.org/ned/coveragepy/issues/416/mocking-ospathexists-causes-failures -.. _issue 418: https://bitbucket.org/ned/coveragepy/issues/418/json-parse-error -.. _issue 419: https://bitbucket.org/ned/coveragepy/issues/419/nosource-no-source-for-code-path-to-c -.. _issue 423: https://bitbucket.org/ned/coveragepy/issues/423/skip_covered-changes-reported-total +.. _issue 281: https://github.com/nedbat/coveragepy/issues/281 +.. _issue 397: https://github.com/nedbat/coveragepy/issues/397 +.. _issue 410: https://github.com/nedbat/coveragepy/issues/410 +.. _issue 415: https://github.com/nedbat/coveragepy/issues/415 +.. _issue 416: https://github.com/nedbat/coveragepy/issues/416 +.. _issue 418: https://github.com/nedbat/coveragepy/issues/418 +.. _issue 419: https://github.com/nedbat/coveragepy/issues/419 +.. _issue 423: https://github.com/nedbat/coveragepy/issues/423 .. _changes_40: @@ -1284,8 +1437,8 @@ include tests and docs. If you were using them from the older packages, get in touch and help me understand how. -.. _issue 403: https://bitbucket.org/ned/coveragepy/issues/403/hasherupdate-fails-with-typeerror-nonetype -.. _issue 404: https://bitbucket.org/ned/coveragepy/issues/404/shiningpanda-jenkins-plugin-cant-find-html +.. _issue 403: https://github.com/nedbat/coveragepy/issues/403 +.. _issue 404: https://github.com/nedbat/coveragepy/issues/404 Version 4.0b2 --- 2015-08-22 @@ -1315,9 +1468,9 @@ - A new version identifier is available, `coverage.version_info`, a plain tuple of values similar to `sys.version_info`_. -.. _issue 392: https://bitbucket.org/ned/coveragepy/issues/392/run-append-doesnt-create-coverage-file -.. _issue 395: https://bitbucket.org/ned/coveragepy/issues/395/rfe-read-pickled-files-as-well-for -.. _issue 399: https://bitbucket.org/ned/coveragepy/issues/399/coverageexception-cant-combine-line-data +.. _issue 392: https://github.com/nedbat/coveragepy/issues/392 +.. _issue 395: https://github.com/nedbat/coveragepy/issues/395 +.. _issue 399: https://github.com/nedbat/coveragepy/issues/399 .. _sys.version_info: https://docs.python.org/3/library/sys.html#sys.version_info @@ -1387,15 +1540,15 @@ - The speed is back to 3.7.1 levels, after having slowed down due to plugin support, finishing up `issue 387`_. -.. _issue 236: https://bitbucket.org/ned/coveragepy/issues/236/pickles-are-bad-and-you-should-feel-bad -.. _issue 252: https://bitbucket.org/ned/coveragepy/issues/252/coverage-wont-run-a-program-with -.. _issue 262: https://bitbucket.org/ned/coveragepy/issues/262/when-parallel-true-erase-should-erase-all -.. _issue 275: https://bitbucket.org/ned/coveragepy/issues/275/refer-consistently-to-project-as-coverage -.. _issue 313: https://bitbucket.org/ned/coveragepy/issues/313/add-license-file-containing-2-3-or-4 -.. _issue 380: https://bitbucket.org/ned/coveragepy/issues/380/code-executed-by-exec-excluded-from -.. _issue 385: https://bitbucket.org/ned/coveragepy/issues/385/coverage-combine-doesnt-work-with-rcfile -.. _issue 386: https://bitbucket.org/ned/coveragepy/issues/386/error-on-unrecognised-configuration -.. _issue 387: https://bitbucket.org/ned/coveragepy/issues/387/performance-degradation-from-371-to-40 +.. _issue 236: https://github.com/nedbat/coveragepy/issues/236 +.. _issue 252: https://github.com/nedbat/coveragepy/issues/252 +.. _issue 262: https://github.com/nedbat/coveragepy/issues/262 +.. _issue 275: https://github.com/nedbat/coveragepy/issues/275 +.. _issue 313: https://github.com/nedbat/coveragepy/issues/313 +.. _issue 380: https://github.com/nedbat/coveragepy/issues/380 +.. _issue 385: https://github.com/nedbat/coveragepy/issues/385 +.. _issue 386: https://github.com/nedbat/coveragepy/issues/386 +.. _issue 387: https://github.com/nedbat/coveragepy/issues/387 .. 40 issues closed in 4.0 below here @@ -1449,17 +1602,17 @@ - Plugin support had some bugs fixed, closing `issue 374`_ and `issue 375`_. Thanks, Stefan Behnel. -.. _issue 299: https://bitbucket.org/ned/coveragepy/issues/299/inserted-created-on-yyyy-mm-dd-hh-mm-in -.. _issue 308: https://bitbucket.org/ned/coveragepy/issues/308/yield-lambda-branch-coverage -.. _issue 324: https://bitbucket.org/ned/coveragepy/issues/324/yield-in-loop-confuses-branch-coverage -.. _issue 351: https://bitbucket.org/ned/coveragepy/issues/351/files-with-incorrect-encoding-are-ignored -.. _issue 354: https://bitbucket.org/ned/coveragepy/issues/354/coverage-combine-should-take-a-list-of -.. _issue 359: https://bitbucket.org/ned/coveragepy/issues/359/xml-report-chunk-error -.. _issue 360: https://bitbucket.org/ned/coveragepy/issues/360/html-reports-get-confused-by-l-in-the-code -.. _issue 361: https://bitbucket.org/ned/coveragepy/issues/361/use-double-quotes-in-html-output-to -.. _issue 363: https://bitbucket.org/ned/coveragepy/issues/363/annotate-command-hits-unicode-happy-fun -.. _issue 374: https://bitbucket.org/ned/coveragepy/issues/374/c-tracer-lookups-fail-in -.. _issue 375: https://bitbucket.org/ned/coveragepy/issues/375/ctracer_handle_return-reads-byte-code +.. _issue 299: https://github.com/nedbat/coveragepy/issues/299 +.. _issue 308: https://github.com/nedbat/coveragepy/issues/308 +.. _issue 324: https://github.com/nedbat/coveragepy/issues/324 +.. _issue 351: https://github.com/nedbat/coveragepy/issues/351 +.. _issue 354: https://github.com/nedbat/coveragepy/issues/354 +.. _issue 359: https://github.com/nedbat/coveragepy/issues/359 +.. _issue 360: https://github.com/nedbat/coveragepy/issues/360 +.. _issue 361: https://github.com/nedbat/coveragepy/issues/361 +.. _issue 363: https://github.com/nedbat/coveragepy/issues/363 +.. _issue 374: https://github.com/nedbat/coveragepy/issues/374 +.. _issue 375: https://github.com/nedbat/coveragepy/issues/375 Version 4.0a5 --- 2015-02-16 @@ -1489,11 +1642,11 @@ - Added 3.5.0a1 to the list of supported CPython versions. -.. _issue 117: https://bitbucket.org/ned/coveragepy/issues/117/enable-coverage-measurement-of-code-run-by -.. _issue 340: https://bitbucket.org/ned/coveragepy/issues/340/keyerror-subpy -.. _issue 353: https://bitbucket.org/ned/coveragepy/issues/353/40a3-introduces-an-unexpected-third-case -.. _issue 357: https://bitbucket.org/ned/coveragepy/issues/357/behavior-changed-when-coveragerc-is -.. _issue 358: https://bitbucket.org/ned/coveragepy/issues/358/all-coverage-commands-should-adjust +.. _issue 117: https://github.com/nedbat/coveragepy/issues/117 +.. _issue 340: https://github.com/nedbat/coveragepy/issues/340 +.. _issue 353: https://github.com/nedbat/coveragepy/issues/353 +.. _issue 357: https://github.com/nedbat/coveragepy/issues/357 +.. _issue 358: https://github.com/nedbat/coveragepy/issues/358 Version 4.0a4 --- 2015-01-25 @@ -1533,11 +1686,11 @@ - Regexes in the configuration file are now compiled as soon as they are read, to provide error messages earlier (`issue 349`_). -.. _issue 69: https://bitbucket.org/ned/coveragepy/issues/69/coverage-html-overwrite-files-that-doesnt -.. _issue 235: https://bitbucket.org/ned/coveragepy/issues/235/package-name-is-missing-in-xml-report -.. _issue 290: https://bitbucket.org/ned/coveragepy/issues/290/running-programmatically-with-pyw-files -.. _issue 345: https://bitbucket.org/ned/coveragepy/issues/345/xml-reports-line-rate-0-for-empty-files -.. _issue 349: https://bitbucket.org/ned/coveragepy/issues/349/bad-regex-in-config-should-get-an-earlier +.. _issue 69: https://github.com/nedbat/coveragepy/issues/69 +.. _issue 235: https://github.com/nedbat/coveragepy/issues/235 +.. _issue 290: https://github.com/nedbat/coveragepy/issues/290 +.. _issue 345: https://github.com/nedbat/coveragepy/issues/345 +.. _issue 349: https://github.com/nedbat/coveragepy/issues/349 Version 4.0a2 --- 2015-01-14 @@ -1597,15 +1750,15 @@ haven't changed is now a JSON file instead of a pickle file. This obviates `issue 287`_ and `issue 237`_. -.. _issue 237: https://bitbucket.org/ned/coveragepy/issues/237/htmlcov-with-corrupt-statusdat -.. _issue 287: https://bitbucket.org/ned/coveragepy/issues/287/htmlpy-doesnt-specify-pickle-protocol -.. _issue 293: https://bitbucket.org/ned/coveragepy/issues/293/number-of-statement-detection-wrong-if-no -.. _issue 314: https://bitbucket.org/ned/coveragepy/issues/314/fail_under-param-not-working-in-coveragerc -.. _issue 315: https://bitbucket.org/ned/coveragepy/issues/315/option-to-omit-empty-files-eg-__init__py -.. _issue 328: https://bitbucket.org/ned/coveragepy/issues/328/misbehavior-in-run-source -.. _issue 334: https://bitbucket.org/ned/coveragepy/issues/334/pragma-not-recognized-if-tab-character -.. _issue 342: https://bitbucket.org/ned/coveragepy/issues/342/console-and-html-coverage-reports-differ -.. _issue 343: https://bitbucket.org/ned/coveragepy/issues/343/an-explicitly-named-non-existent-config +.. _issue 237: https://github.com/nedbat/coveragepy/issues/237 +.. _issue 287: https://github.com/nedbat/coveragepy/issues/287 +.. _issue 293: https://github.com/nedbat/coveragepy/issues/293 +.. _issue 314: https://github.com/nedbat/coveragepy/issues/314 +.. _issue 315: https://github.com/nedbat/coveragepy/issues/315 +.. _issue 328: https://github.com/nedbat/coveragepy/issues/328 +.. _issue 334: https://github.com/nedbat/coveragepy/issues/334 +.. _issue 342: https://github.com/nedbat/coveragepy/issues/342 +.. _issue 343: https://github.com/nedbat/coveragepy/issues/343 Version 4.0a1 --- 2014-09-27 @@ -1650,16 +1803,16 @@ - Encoding declarations in source files are only considered if they are truly comments. Thanks, Anthony Sottile. -.. _issue 57: https://bitbucket.org/ned/coveragepy/issues/57/annotate-command-fails-to-annotate-many -.. _issue 94: https://bitbucket.org/ned/coveragepy/issues/94/coverage-xml-doesnt-produce-sources -.. _issue 149: https://bitbucket.org/ned/coveragepy/issues/149/coverage-gevent-looks-broken -.. _issue 230: https://bitbucket.org/ned/coveragepy/issues/230/show-line-no-for-missing-branches-in -.. _issue 284: https://bitbucket.org/ned/coveragepy/issues/284/fail-under-should-show-more-precision -.. _issue 285: https://bitbucket.org/ned/coveragepy/issues/285/xml-report-fails-if-output-file-directory -.. _issue 303: https://bitbucket.org/ned/coveragepy/issues/303/unicodedecodeerror -.. _issue 304: https://bitbucket.org/ned/coveragepy/issues/304/attempt-to-get-configuration-from-setupcfg -.. _issue 305: https://bitbucket.org/ned/coveragepy/issues/305/pendingdeprecationwarning-the-imp-module -.. _issue 331: https://bitbucket.org/ned/coveragepy/issues/331/failure-of-encoding-detection-on-python2 +.. _issue 57: https://github.com/nedbat/coveragepy/issues/57 +.. _issue 94: https://github.com/nedbat/coveragepy/issues/94 +.. _issue 149: https://github.com/nedbat/coveragepy/issues/149 +.. _issue 230: https://github.com/nedbat/coveragepy/issues/230 +.. _issue 284: https://github.com/nedbat/coveragepy/issues/284 +.. _issue 285: https://github.com/nedbat/coveragepy/issues/285 +.. _issue 303: https://github.com/nedbat/coveragepy/issues/303 +.. _issue 304: https://github.com/nedbat/coveragepy/issues/304 +.. _issue 305: https://github.com/nedbat/coveragepy/issues/305 +.. _issue 331: https://github.com/nedbat/coveragepy/issues/331 .. _changes_371: @@ -1718,18 +1871,18 @@ - The source kit now includes the ``__main__.py`` file in the root coverage directory, fixing `issue 255`_. -.. _issue 92: https://bitbucket.org/ned/coveragepy/issues/92/finally-clauses-arent-treated-properly-in -.. _issue 164: https://bitbucket.org/ned/coveragepy/issues/164/trace-function-changed-warning-when-using -.. _issue 175: https://bitbucket.org/ned/coveragepy/issues/175/branch-coverage-gets-confused-in-certain -.. _issue 207: https://bitbucket.org/ned/coveragepy/issues/207/run-m-cannot-find-module-or-package-in -.. _issue 242: https://bitbucket.org/ned/coveragepy/issues/242/running-a-two-level-package-doesnt-work -.. _issue 218: https://bitbucket.org/ned/coveragepy/issues/218/run-command-does-not-respect-the-omit-flag -.. _issue 250: https://bitbucket.org/ned/coveragepy/issues/250/uncaught-zerodivisionerror-when-generating -.. _issue 255: https://bitbucket.org/ned/coveragepy/issues/255/directory-level-__main__py-not-included-in -.. _issue 259: https://bitbucket.org/ned/coveragepy/issues/259/allow-use-of-system-installed-third-party -.. _issue 261: https://bitbucket.org/ned/coveragepy/issues/261/pyw-files-arent-reported-properly -.. _issue 264: https://bitbucket.org/ned/coveragepy/issues/264/coverage-wont-run-pyc-files -.. _issue 267: https://bitbucket.org/ned/coveragepy/issues/267/relative-path-aliases-dont-work +.. _issue 92: https://github.com/nedbat/coveragepy/issues/92 +.. _issue 164: https://github.com/nedbat/coveragepy/issues/164 +.. _issue 175: https://github.com/nedbat/coveragepy/issues/175 +.. _issue 207: https://github.com/nedbat/coveragepy/issues/207 +.. _issue 242: https://github.com/nedbat/coveragepy/issues/242 +.. _issue 218: https://github.com/nedbat/coveragepy/issues/218 +.. _issue 250: https://github.com/nedbat/coveragepy/issues/250 +.. _issue 255: https://github.com/nedbat/coveragepy/issues/255 +.. _issue 259: https://github.com/nedbat/coveragepy/issues/259 +.. _issue 261: https://github.com/nedbat/coveragepy/issues/261 +.. _issue 264: https://github.com/nedbat/coveragepy/issues/264 +.. _issue 267: https://github.com/nedbat/coveragepy/issues/267 .. _changes_36: @@ -1740,8 +1893,8 @@ - Added a page to the docs about troublesome situations, closing `issue 226`_, and added some info to the TODO file, closing `issue 227`_. -.. _issue 226: https://bitbucket.org/ned/coveragepy/issues/226/make-readme-section-to-describe-when -.. _issue 227: https://bitbucket.org/ned/coveragepy/issues/227/update-todo +.. _issue 226: https://github.com/nedbat/coveragepy/issues/226 +.. _issue 227: https://github.com/nedbat/coveragepy/issues/227 Version 3.6b3 --- 2012-12-29 @@ -1749,7 +1902,7 @@ - Beta 2 broke the nose plugin. It's fixed again, closing `issue 224`_. -.. _issue 224: https://bitbucket.org/ned/coveragepy/issues/224/36b2-breaks-nosexcover +.. _issue 224: https://github.com/nedbat/coveragepy/issues/224 Version 3.6b2 --- 2012-12-23 @@ -1769,7 +1922,7 @@ file name, coverage.py no longer associates it with the directory name, fixing `issue 221`_. -.. _issue 221: https://bitbucket.org/ned/coveragepy/issues/221/coveragepy-incompatible-with-pyratemp +.. _issue 221: https://github.com/nedbat/coveragepy/issues/221 Version 3.6b1 --- 2012-11-28 @@ -1863,27 +2016,27 @@ ``'NoneType' object has no attribute 'isabs'``. It no longer does, so kiss `issue 153`_ goodbye. -.. _issue 60: https://bitbucket.org/ned/coveragepy/issues/60/incorrect-path-to-orphaned-pyc-files -.. _issue 67: https://bitbucket.org/ned/coveragepy/issues/67/xml-report-filenames-may-be-generated -.. _issue 89: https://bitbucket.org/ned/coveragepy/issues/89/on-windows-all-packages-are-reported-in -.. _issue 97: https://bitbucket.org/ned/coveragepy/issues/97/allow-environment-variables-to-be -.. _issue 100: https://bitbucket.org/ned/coveragepy/issues/100/source-directive-doesnt-work-for-packages -.. _issue 111: https://bitbucket.org/ned/coveragepy/issues/111/when-installing-coverage-with-pip-not -.. _issue 137: https://bitbucket.org/ned/coveragepy/issues/137/provide-docs-with-source-distribution -.. _issue 139: https://bitbucket.org/ned/coveragepy/issues/139/easy-check-for-a-certain-coverage-in-tests -.. _issue 143: https://bitbucket.org/ned/coveragepy/issues/143/omit-doesnt-seem-to-work-in-coverage -.. _issue 153: https://bitbucket.org/ned/coveragepy/issues/153/non-existent-filename-triggers -.. _issue 156: https://bitbucket.org/ned/coveragepy/issues/156/a-completely-unexecuted-file-shows-14 -.. _issue 163: https://bitbucket.org/ned/coveragepy/issues/163/problem-with-include-and-omit-filename -.. _issue 171: https://bitbucket.org/ned/coveragepy/issues/171/how-to-contribute-and-run-tests -.. _issue 193: https://bitbucket.org/ned/coveragepy/issues/193/unicodedecodeerror-on-htmlpy -.. _issue 201: https://bitbucket.org/ned/coveragepy/issues/201/coverage-using-django-14-with-pydb-on -.. _issue 202: https://bitbucket.org/ned/coveragepy/issues/202/get-rid-of-ez_setuppy-and -.. _issue 203: https://bitbucket.org/ned/coveragepy/issues/203/duplicate-filenames-reported-when-filename -.. _issue 205: https://bitbucket.org/ned/coveragepy/issues/205/make-pydoc-coverage-more-friendly -.. _issue 206: https://bitbucket.org/ned/coveragepy/issues/206/pydoc-coveragecoverage-fails-with-an-error -.. _issue 210: https://bitbucket.org/ned/coveragepy/issues/210/if-theres-no-coverage-data-coverage-xml -.. _issue 214: https://bitbucket.org/ned/coveragepy/issues/214/coveragepy-measures-itself-on-precise +.. _issue 60: https://github.com/nedbat/coveragepy/issues/60 +.. _issue 67: https://github.com/nedbat/coveragepy/issues/67 +.. _issue 89: https://github.com/nedbat/coveragepy/issues/89 +.. _issue 97: https://github.com/nedbat/coveragepy/issues/97 +.. _issue 100: https://github.com/nedbat/coveragepy/issues/100 +.. _issue 111: https://github.com/nedbat/coveragepy/issues/111 +.. _issue 137: https://github.com/nedbat/coveragepy/issues/137 +.. _issue 139: https://github.com/nedbat/coveragepy/issues/139 +.. _issue 143: https://github.com/nedbat/coveragepy/issues/143 +.. _issue 153: https://github.com/nedbat/coveragepy/issues/153 +.. _issue 156: https://github.com/nedbat/coveragepy/issues/156 +.. _issue 163: https://github.com/nedbat/coveragepy/issues/163 +.. _issue 171: https://github.com/nedbat/coveragepy/issues/171 +.. _issue 193: https://github.com/nedbat/coveragepy/issues/193 +.. _issue 201: https://github.com/nedbat/coveragepy/issues/201 +.. _issue 202: https://github.com/nedbat/coveragepy/issues/202 +.. _issue 203: https://github.com/nedbat/coveragepy/issues/203 +.. _issue 205: https://github.com/nedbat/coveragepy/issues/205 +.. _issue 206: https://github.com/nedbat/coveragepy/issues/206 +.. _issue 210: https://github.com/nedbat/coveragepy/issues/210 +.. _issue 214: https://github.com/nedbat/coveragepy/issues/214 .. _changes_353: @@ -1918,12 +2071,12 @@ - Testing is now done with `tox`_, thanks, Marc Abramowitz. -.. _issue 147: https://bitbucket.org/ned/coveragepy/issues/147/massive-memory-usage-by-ctracer -.. _issue 179: https://bitbucket.org/ned/coveragepy/issues/179/htmlreporter-fails-when-source-file-is -.. _issue 183: https://bitbucket.org/ned/coveragepy/issues/183/install-fails-for-python-23 -.. _issue 194: https://bitbucket.org/ned/coveragepy/issues/194/filelocatorrelative_filename-could-mangle -.. _issue 195: https://bitbucket.org/ned/coveragepy/issues/195/pyo-file-handling-in-codeunit -.. _issue 197: https://bitbucket.org/ned/coveragepy/issues/197/line-numbers-in-html-report-do-not-align +.. _issue 147: https://github.com/nedbat/coveragepy/issues/147 +.. _issue 179: https://github.com/nedbat/coveragepy/issues/179 +.. _issue 183: https://github.com/nedbat/coveragepy/issues/183 +.. _issue 194: https://github.com/nedbat/coveragepy/issues/194 +.. _issue 195: https://github.com/nedbat/coveragepy/issues/195 +.. _issue 197: https://github.com/nedbat/coveragepy/issues/197 .. _tox: https://tox.readthedocs.io/ @@ -1971,12 +2124,12 @@ - When installing into pypy, we no longer attempt (and fail) to compile the C tracer function, closing `issue 166`_. -.. _issue 142: https://bitbucket.org/ned/coveragepy/issues/142/executing-python-file-syspath-is-replaced -.. _issue 155: https://bitbucket.org/ned/coveragepy/issues/155/cant-use-coverage-run-m-unittest-discover -.. _issue 157: https://bitbucket.org/ned/coveragepy/issues/157/chokes-on-source-files-with-non-utf-8 -.. _issue 166: https://bitbucket.org/ned/coveragepy/issues/166/dont-try-to-compile-c-extension-on-pypy -.. _issue 168: https://bitbucket.org/ned/coveragepy/issues/168/dont-be-alarmed-by-emacs-droppings -.. _issue 173: https://bitbucket.org/ned/coveragepy/issues/173/theres-no-way-to-specify-show-missing-in +.. _issue 142: https://github.com/nedbat/coveragepy/issues/142 +.. _issue 155: https://github.com/nedbat/coveragepy/issues/155 +.. _issue 157: https://github.com/nedbat/coveragepy/issues/157 +.. _issue 166: https://github.com/nedbat/coveragepy/issues/166 +.. _issue 168: https://github.com/nedbat/coveragepy/issues/168 +.. _issue 173: https://github.com/nedbat/coveragepy/issues/173 .. _changes_351: @@ -2020,12 +2173,12 @@ into running some coverage.py code before anything else in the process. See the coverage/fullcoverage directory if you are interested. -.. _issue 17: https://bitbucket.org/ned/coveragepy/issues/17/support-combining-coverage-data-from -.. _issue 122: https://bitbucket.org/ned/coveragepy/issues/122/for-else-always-reports-missing-branch -.. _issue 124: https://bitbucket.org/ned/coveragepy/issues/124/no-arbitrary-unicode-in-html-reports-in -.. _issue 128: https://bitbucket.org/ned/coveragepy/issues/128/branch-coverage-of-with-statement-in-27 -.. _issue 138: https://bitbucket.org/ned/coveragepy/issues/138/include-should-take-precedence-over-is -.. _issue 144: https://bitbucket.org/ned/coveragepy/issues/144/failure-generating-html-output-for +.. _issue 17: https://github.com/nedbat/coveragepy/issues/17 +.. _issue 122: https://github.com/nedbat/coveragepy/issues/122 +.. _issue 124: https://github.com/nedbat/coveragepy/issues/124 +.. _issue 128: https://github.com/nedbat/coveragepy/issues/128 +.. _issue 138: https://github.com/nedbat/coveragepy/issues/138 +.. _issue 144: https://github.com/nedbat/coveragepy/issues/144 .. _changes_35: @@ -2107,15 +2260,15 @@ - Internally, files are now closed explicitly, fixing `issue 104`_. Thanks, Brett Cannon. -.. _issue 80: https://bitbucket.org/ned/coveragepy/issues/80/is-there-a-duck-typing-way-to-know-we-cant -.. _issue 93: https://bitbucket.org/ned/coveragepy/issues/93/copying-a-mock-object-breaks-coverage -.. _issue 95: https://bitbucket.org/ned/coveragepy/issues/95/run-subcommand-should-take-a-module-name -.. _issue 104: https://bitbucket.org/ned/coveragepy/issues/104/explicitly-close-files -.. _issue 107: https://bitbucket.org/ned/coveragepy/issues/107/codeparser-not-opening-source-files-with -.. _issue 115: https://bitbucket.org/ned/coveragepy/issues/115/fail-gracefully-when-reporting-on-file -.. _issue 121: https://bitbucket.org/ned/coveragepy/issues/121/filename-patterns-are-applied-stupidly -.. _issue 123: https://bitbucket.org/ned/coveragepy/issues/123/pyeval_settrace-used-in-way-that-breaks -.. _issue 125: https://bitbucket.org/ned/coveragepy/issues/125/coverage-removes-decoratortoolss-tracing +.. _issue 80: https://github.com/nedbat/coveragepy/issues/80 +.. _issue 93: https://github.com/nedbat/coveragepy/issues/93 +.. _issue 95: https://github.com/nedbat/coveragepy/issues/95 +.. _issue 104: https://github.com/nedbat/coveragepy/issues/104 +.. _issue 107: https://github.com/nedbat/coveragepy/issues/107 +.. _issue 115: https://github.com/nedbat/coveragepy/issues/115 +.. _issue 121: https://github.com/nedbat/coveragepy/issues/121 +.. _issue 123: https://github.com/nedbat/coveragepy/issues/123 +.. _issue 125: https://github.com/nedbat/coveragepy/issues/125 .. _changes_34: @@ -2128,7 +2281,7 @@ - Programs that exited with ``sys.exit()`` with no argument weren't handled properly, producing a coverage.py stack trace. That is now fixed. -.. _issue 88: https://bitbucket.org/ned/coveragepy/issues/88/xml-report-lists-packages-in-random-order +.. _issue 88: https://github.com/nedbat/coveragepy/issues/88 Version 3.4b2 --- 2010-09-06 @@ -2153,12 +2306,12 @@ would report no coverage for the `run` method. This is now fixed, closing `issue 85`_. -.. _issue 16: https://bitbucket.org/ned/coveragepy/issues/16/allow-configuration-of-accuracy-of-percentage-totals -.. _issue 41: https://bitbucket.org/ned/coveragepy/issues/41/report-says-100-when-it-isnt-quite-there -.. _issue 65: https://bitbucket.org/ned/coveragepy/issues/65/branch-option-not-reported-in-cobertura -.. _issue 70: https://bitbucket.org/ned/coveragepy/issues/70/text-report-and-html-report-disagree-on-coverage -.. _issue 81: https://bitbucket.org/ned/coveragepy/issues/81/xml-report-does-not-have-condition-coverage-attribute-for-lines-with-a -.. _issue 85: https://bitbucket.org/ned/coveragepy/issues/85/threadrun-isnt-measured +.. _issue 16: https://github.com/nedbat/coveragepy/issues/16 +.. _issue 41: https://github.com/nedbat/coveragepy/issues/41 +.. _issue 65: https://github.com/nedbat/coveragepy/issues/65 +.. _issue 70: https://github.com/nedbat/coveragepy/issues/70 +.. _issue 81: https://github.com/nedbat/coveragepy/issues/81 +.. _issue 85: https://github.com/nedbat/coveragepy/issues/85 Version 3.4b1 --- 2010-08-21 @@ -2234,17 +2387,17 @@ - Asking for an HTML report with no files now shows a nice error message rather than a cryptic failure ('int' object is unsubscriptable). Fixes `issue 59`_. -.. _issue 1: https://bitbucket.org/ned/coveragepy/issues/1/empty-__init__py-files-are-reported-as-1-executable -.. _issue 34: https://bitbucket.org/ned/coveragepy/issues/34/enhanced-omit-globbing-handling -.. _issue 36: https://bitbucket.org/ned/coveragepy/issues/36/provide-regex-style-omit -.. _issue 46: https://bitbucket.org/ned/coveragepy/issues/46 -.. _issue 53: https://bitbucket.org/ned/coveragepy/issues/53 -.. _issue 52: https://bitbucket.org/ned/coveragepy/issues/52/doctesttestfile-confuses-source-detection -.. _issue 56: https://bitbucket.org/ned/coveragepy/issues/56 -.. _issue 61: https://bitbucket.org/ned/coveragepy/issues/61/annotate-i-doesnt-work -.. _issue 62: https://bitbucket.org/ned/coveragepy/issues/62 -.. _issue 59: https://bitbucket.org/ned/coveragepy/issues/59/html-report-fails-with-int-object-is -.. _issue 82: https://bitbucket.org/ned/coveragepy/issues/82/tokenerror-when-generating-html-report +.. _issue 1: https://github.com/nedbat/coveragepy/issues/1 +.. _issue 34: https://github.com/nedbat/coveragepy/issues/34 +.. _issue 36: https://github.com/nedbat/coveragepy/issues/36 +.. _issue 46: https://github.com/nedbat/coveragepy/issues/46 +.. _issue 53: https://github.com/nedbat/coveragepy/issues/53 +.. _issue 52: https://github.com/nedbat/coveragepy/issues/52 +.. _issue 56: https://github.com/nedbat/coveragepy/issues/56 +.. _issue 61: https://github.com/nedbat/coveragepy/issues/61 +.. _issue 62: https://github.com/nedbat/coveragepy/issues/62 +.. _issue 59: https://github.com/nedbat/coveragepy/issues/59 +.. _issue 82: https://github.com/nedbat/coveragepy/issues/82 .. _changes_331: @@ -2258,8 +2411,8 @@ - When running your code with "coverage run", if you call `sys.exit()`, coverage.py will exit with that status code, fixing `issue 50`_. -.. _issue 49: https://bitbucket.org/ned/coveragepy/issues/49 -.. _issue 50: https://bitbucket.org/ned/coveragepy/issues/50 +.. _issue 49: https://github.com/nedbat/coveragepy/issues/49 +.. _issue 50: https://github.com/nedbat/coveragepy/issues/50 .. _changes_33: @@ -2298,9 +2451,9 @@ - Added an AUTHORS.txt file. -.. _issue 39: https://bitbucket.org/ned/coveragepy/issues/39 -.. _issue 40: https://bitbucket.org/ned/coveragepy/issues/40 -.. _issue 47: https://bitbucket.org/ned/coveragepy/issues/47 +.. _issue 39: https://github.com/nedbat/coveragepy/issues/39 +.. _issue 40: https://github.com/nedbat/coveragepy/issues/40 +.. _issue 47: https://github.com/nedbat/coveragepy/issues/47 .. _changes_32: @@ -2358,12 +2511,12 @@ - The --omit option now works much better than before, fixing `issue 14`_ and `issue 33`_. Thanks, Danek Duvall. -.. _issue 14: https://bitbucket.org/ned/coveragepy/issues/14 -.. _issue 30: https://bitbucket.org/ned/coveragepy/issues/30 -.. _issue 31: https://bitbucket.org/ned/coveragepy/issues/31 -.. _issue 32: https://bitbucket.org/ned/coveragepy/issues/32 -.. _issue 33: https://bitbucket.org/ned/coveragepy/issues/33 -.. _issue 35: https://bitbucket.org/ned/coveragepy/issues/35 +.. _issue 14: https://github.com/nedbat/coveragepy/issues/14 +.. _issue 30: https://github.com/nedbat/coveragepy/issues/30 +.. _issue 31: https://github.com/nedbat/coveragepy/issues/31 +.. _issue 32: https://github.com/nedbat/coveragepy/issues/32 +.. _issue 33: https://github.com/nedbat/coveragepy/issues/33 +.. _issue 35: https://github.com/nedbat/coveragepy/issues/35 Version 3.2b1 --- 2009-11-10 @@ -2378,7 +2531,7 @@ - Some exceptions reported by the command line interface have been cleaned up so that tracebacks inside coverage.py aren't shown. Fixes `issue 23`_. -.. _issue 23: https://bitbucket.org/ned/coveragepy/issues/23 +.. _issue 23: https://github.com/nedbat/coveragepy/issues/23 .. _changes_31: @@ -2389,7 +2542,7 @@ - Source code can now be read from eggs. Thanks, Ross Lawley. Fixes `issue 25`_. -.. _issue 25: https://bitbucket.org/ned/coveragepy/issues/25 +.. _issue 25: https://github.com/nedbat/coveragepy/issues/25 Version 3.1b1 --- 2009-09-27 @@ -2419,10 +2572,10 @@ - Added a "coverage debug" command for getting diagnostic information about the coverage.py installation. -.. _issue 11: https://bitbucket.org/ned/coveragepy/issues/11 -.. _issue 12: https://bitbucket.org/ned/coveragepy/issues/12 -.. _issue 13: https://bitbucket.org/ned/coveragepy/issues/13 -.. _issue 24: https://bitbucket.org/ned/coveragepy/issues/24 +.. _issue 11: https://github.com/nedbat/coveragepy/issues/11 +.. _issue 12: https://github.com/nedbat/coveragepy/issues/12 +.. _issue 13: https://github.com/nedbat/coveragepy/issues/13 +.. _issue 24: https://github.com/nedbat/coveragepy/issues/24 .. _changes_301: @@ -2447,9 +2600,9 @@ mode just like Python does. This lets it run Windows files on Mac, for example. -.. _issue 9: https://bitbucket.org/ned/coveragepy/issues/9 -.. _issue 10: https://bitbucket.org/ned/coveragepy/issues/10 -.. _issue 8: https://bitbucket.org/ned/coveragepy/issues/8 +.. _issue 9: https://github.com/nedbat/coveragepy/issues/9 +.. _issue 10: https://github.com/nedbat/coveragepy/issues/10 +.. _issue 8: https://github.com/nedbat/coveragepy/issues/8 .. _changes_30: @@ -2465,7 +2618,7 @@ - Nested modules now get a proper flat_rootname. Thanks, Christian Heimes. -.. _issue 6: https://bitbucket.org/ned/coveragepy/issues/6 +.. _issue 6: https://github.com/nedbat/coveragepy/issues/6 Version 3.0b3 --- 2009-05-16
--- a/eric6/DebugClients/Python/coverage/doc/CONTRIBUTORS.txt Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/doc/CONTRIBUTORS.txt Mon Feb 01 10:38:16 2021 +0100 @@ -4,6 +4,7 @@ Other contributions, including writing code, updating docs, and submitting useful bug reports, have been made by: +Abdeali Kothari Adi Roiban Agbonze O. Jeremiah Albertas Agejevas @@ -19,9 +20,11 @@ Aron Griffis Artem Dayneko Ben Finney +Bernát Gábor Bill Hart Brandon Rhodes Brett Cannon +Bruno P. Kinoshita Buck Evan Calen Pennington Carl Gieringer @@ -68,6 +71,7 @@ Imri Goldberg Ionel Cristian Mărieș JT Olds +Jerin Peter George Jessamyn Smith Joe Doherty Joe Jevnik @@ -78,6 +82,7 @@ Julian Berman Julien Voisin Justas Sadzevičius +Kjell Braden Krystian Kichewko Kyle Altendorf Lars Hupfeldt Nielsen @@ -96,6 +101,7 @@ Michał Bultrowicz Mickie Betz Mike Fiedler +Naveen Yadav Nathan Land Noel O'Boyle Olivier Grisel @@ -111,8 +117,10 @@ Roger Hu Ross Lawley Roy Williams +Salvatore Zagaria Sandra Martocchia Scott Belden +Sebastián Ramírez Sigve Tjora Simon Willison Stan Hu @@ -122,10 +130,14 @@ Steve Leonard Steve Peak S. Y. Lee +Teake Nutma Ted Wexler Thijs Triemstra +Thomas Grainger Titus Brown +Vince Salvino Ville Skyttä +Xie Yanbo Yury Selivanov Zac Hatfield-Dodds Zooko Wilcox-O'Hearn
--- a/eric6/DebugClients/Python/coverage/doc/README.rst Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/doc/README.rst Mon Feb 01 10:38:16 2021 +0100 @@ -8,8 +8,8 @@ Code coverage testing for Python. | |license| |versions| |status| -| |ci-status| |win-ci-status| |docs| |codecov| -| |kit| |format| |repos| +| |ci-status| |docs| |codecov| +| |kit| |format| |repos| |downloads| | |stars| |forks| |contributors| | |tidelift| |twitter-coveragepy| |twitter-nedbat| @@ -20,8 +20,8 @@ Coverage.py runs on many versions of Python: * CPython 2.7. -* CPython 3.5 through 3.9 alpha 2. -* PyPy2 7.0 and PyPy3 7.0. +* CPython 3.5 through 3.10 alpha. +* PyPy2 7.3.1 and PyPy3 7.3.1. Documentation is on `Read the Docs`_. Code repository and issue tracker are on `GitHub`_. @@ -30,7 +30,7 @@ .. _GitHub: https://github.com/nedbat/coveragepy -**New in 5.0:** SQLite data storage, JSON report, contexts, relative filenames, +**New in 5.x:** SQLite data storage, JSON report, contexts, relative filenames, dropped support for Python 2.6, 3.3 and 3.4. @@ -38,7 +38,6 @@ -------------- .. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logo_small.png - :width: 75 :alt: Tidelift :target: https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=readme @@ -96,12 +95,9 @@ .. _NOTICE.txt: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt -.. |ci-status| image:: https://travis-ci.com/nedbat/coveragepy.svg?branch=master - :target: https://travis-ci.com/nedbat/coveragepy +.. |ci-status| image:: https://github.com/nedbat/coveragepy/workflows/Test%20Suite/badge.svg + :target: https://github.com/nedbat/coveragepy/actions?query=workflow%3A%22Test+Suite%22 :alt: Build status -.. |win-ci-status| image:: https://ci.appveyor.com/api/projects/status/kmeqpdje7h9r6vsf/branch/master?svg=true - :target: https://ci.appveyor.com/project/nedbat/coveragepy - :alt: Windows build status .. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat :target: https://coverage.readthedocs.io/ :alt: Documentation
--- a/eric6/DebugClients/Python/coverage/env.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/env.py Mon Feb 01 10:38:16 2021 +0100 @@ -66,7 +66,7 @@ # used to be an empty string (meaning the current directory). It changed # to be the actual path to the current directory, so that os.chdir wouldn't # affect the outcome. - actual_syspath0_dash_m = (PYVERSION >= (3, 7, 0, 'beta', 3)) + actual_syspath0_dash_m = (not PYPY) and (PYVERSION >= (3, 7, 0, 'beta', 3)) # When a break/continue/return statement in a try block jumps to a finally # block, does the finally block do the break/continue/return (pre-3.8), or
--- a/eric6/DebugClients/Python/coverage/html.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/html.py Mon Feb 01 10:38:16 2021 +0100 @@ -166,6 +166,7 @@ ("coverage_html.js", ""), ("keybd_closed.png", ""), ("keybd_open.png", ""), + ("favicon_32.png", ""), ] def __init__(self, cov):
--- a/eric6/DebugClients/Python/coverage/optional.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/optional.py Mon Feb 01 10:38:16 2021 +0100 @@ -15,6 +15,14 @@ Bad:: # MyModule.py + import unsure + + def use_unsure(): + unsure.something() + +Also bad:: + + # MyModule.py from coverage.optional import unsure def use_unsure():
--- a/eric6/DebugClients/Python/coverage/pytracer.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/pytracer.py Mon Feb 01 10:38:16 2021 +0100 @@ -107,7 +107,7 @@ if event == 'call': # Should we start a new context? if self.should_start_context and self.context is None: - context_maybe = self.should_start_context(frame) + context_maybe = self.should_start_context(frame) # pylint: disable=not-callable if context_maybe is not None: self.context = context_maybe self.started_context = True @@ -132,15 +132,15 @@ self.cur_file_name = filename disp = self.should_trace_cache.get(filename) if disp is None: - disp = self.should_trace(filename, frame) - self.should_trace_cache[filename] = disp + disp = self.should_trace(filename, frame) # pylint: disable=not-callable + self.should_trace_cache[filename] = disp # pylint: disable=unsupported-assignment-operation self.cur_file_dict = None if disp.trace: tracename = disp.source_filename - if tracename not in self.data: - self.data[tracename] = {} - self.cur_file_dict = self.data[tracename] + if tracename not in self.data: # pylint: disable=unsupported-membership-test + self.data[tracename] = {} # pylint: disable=unsupported-assignment-operation + self.cur_file_dict = self.data[tracename] # pylint: disable=unsubscriptable-object # The call event is really a "start frame" event, and happens for # function calls and re-entering generators. The f_lasti field is # -1 for calls, and a real offset for generators. Use <0 as the @@ -227,7 +227,7 @@ # has changed to None. dont_warn = (env.PYPY and env.PYPYVERSION >= (5, 4) and self.in_atexit and tf is None) if (not dont_warn) and tf != self._trace: # pylint: disable=comparison-with-callable - self.warn( + self.warn( # pylint: disable=not-callable "Trace function changed, measurement is likely wrong: %r" % (tf,), slug="trace-changed", )
--- a/eric6/DebugClients/Python/coverage/sqldata.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/sqldata.py Mon Feb 01 10:38:16 2021 +0100 @@ -167,7 +167,8 @@ To record data for contexts, use :meth:`set_context` to set a context to be used for subsequent :meth:`add_lines` and :meth:`add_arcs` calls. - To add a source file without any measured data, use :meth:`touch_file`. + To add a source file without any measured data, use :meth:`touch_file`, + or :meth:`touch_files` for a list of such files. Write the data to its file with :meth:`write`. @@ -536,16 +537,26 @@ `plugin_name` is the name of the plugin responsible for this file. It is used to associate the right filereporter, etc. """ + self.touch_files([filename], plugin_name) + + def touch_files(self, filenames, plugin_name=""): + """Ensure that `filenames` appear in the data, empty if needed. + + `plugin_name` is the name of the plugin responsible for these files. It is used + to associate the right filereporter, etc. + """ if self._debug.should('dataop'): - self._debug.write("Touching %r" % (filename,)) + self._debug.write("Touching %r" % (filenames,)) self._start_using() - if not self._has_arcs and not self._has_lines: - raise CoverageException("Can't touch files in an empty CoverageData") + with self._connect(): # Use this to get one transaction. + if not self._has_arcs and not self._has_lines: + raise CoverageException("Can't touch files in an empty CoverageData") - self._file_id(filename, add=True) - if plugin_name: - # Set the tracer for this file - self.add_file_tracers({filename: plugin_name}) + for filename in filenames: + self._file_id(filename, add=True) + if plugin_name: + # Set the tracer for this file + self.add_file_tracers({filename: plugin_name}) def update(self, other_data, aliases=None): """Update this data with data from several other :class:`CoverageData` instances. @@ -1045,7 +1056,13 @@ tail = " with {!r}".format(parameters) if parameters else "" self.debug.write("Executing {!r}{}".format(sql, tail)) try: - return self.con.execute(sql, parameters) + try: + return self.con.execute(sql, parameters) + except Exception: + # In some cases, an error might happen that isn't really an + # error. Try again immediately. + # https://github.com/nedbat/coveragepy/issues/1010 + return self.con.execute(sql, parameters) except sqlite3.Error as exc: msg = str(exc) try:
--- a/eric6/DebugClients/Python/coverage/version.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/coverage/version.py Mon Feb 01 10:38:16 2021 +0100 @@ -5,7 +5,7 @@ # This file is exec'ed in setup.py, don't import anything! # Same semantics as sys.version_info. -version_info = (5, 3, 0, "final", 0) +version_info = (5, 3, 1, "final", 0) def _make_version(major, minor, micro, releaselevel, serial):
--- a/eric6/DebugClients/Python/eric6dbgstub.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/DebugClients/Python/eric6dbgstub.py Mon Feb 01 10:38:16 2021 +0100 @@ -73,12 +73,12 @@ """ Module function used to start the remote debugger. - @keyparam enableTrace flag to enable the tracing function (boolean) - @keyparam exceptions flag to enable exception reporting of the IDE + @param enableTrace flag to enable the tracing function (boolean) + @param exceptions flag to enable exception reporting of the IDE (boolean) - @keyparam tracePython flag to enable tracing into the Python library + @param tracePython flag to enable tracing into the Python library (boolean) - @keyparam redirect flag indicating redirection of stdin, stdout and + @param redirect flag indicating redirection of stdin, stdout and stderr (boolean) """ global debugger
--- a/eric6/Debugger/BreakPointModel.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Debugger/BreakPointModel.py Mon Feb 01 10:38:16 2021 +0100 @@ -23,7 +23,8 @@ """ Constructor - @param parent reference to the parent widget (QObject) + @param parent reference to the parent widget + @type QObject """ super(BreakPointModel, self).__init__(parent) @@ -49,8 +50,10 @@ """ Public method to get the current column count. - @param parent reference to parent index (QModelIndex) (Unused) - @return column count (integer) + @param parent reference to parent index (Unused) + @type QModelIndex + @return column count + @rtype int """ return len(self.header) @@ -58,8 +61,10 @@ """ Public method to get the current row count. - @param parent reference to parent index (QModelIndex) - @return row count (integer) + @param parent reference to parent index + @type QModelIndex + @return row count + @rtype int """ # we do not have a tree, parent should always be invalid if parent is None or not parent.isValid(): @@ -71,9 +76,12 @@ """ Public method to get the requested data. - @param index index of the requested data (QModelIndex) - @param role role of the requested data (Qt.ItemDataRole) + @param index index of the requested data + @type QModelIndex + @param role role of the requested data + @type Qt.ItemDataRole @return the requested data + @rtype any """ if not index.isValid(): return None @@ -100,10 +108,14 @@ """ Public method to change data in the model. - @param index index of the changed data (QModelIndex) + @param index index of the changed data + @type QModelIndex @param value value of the changed data - @param role role of the changed data (Qt.ItemDataRole) - @return flag indicating success (boolean) + @type any + @param role role of the changed data + @type Qt.ItemDataRole + @return flag indicating success + @rtype bool """ if (not index.isValid() or index.column() >= len(self.header) or @@ -119,8 +131,10 @@ """ Public method to get item flags. - @param index index of the requested flags (QModelIndex) - @return item flags for the given index (Qt.ItemFlags) + @param index index of the requested flags + @type QModelIndex + @return item flags for the given index + @rtype Qt.ItemFlags """ if not index.isValid(): return Qt.ItemIsEnabled @@ -131,10 +145,14 @@ """ Public method to get header data. - @param section section number of the requested header data (integer) - @param orientation orientation of the header (Qt.Orientation) - @param role role of the requested data (Qt.ItemDataRole) + @param section section number of the requested header data + @type int + @param orientation orientation of the header + @type Qt.Orientation + @param role role of the requested data + @type Qt.ItemDataRole @return header data + @rtype str """ if orientation == Qt.Horizontal and role == Qt.DisplayRole: if section >= len(self.header): @@ -148,10 +166,14 @@ """ Public method to create an index. - @param row row number for the index (integer) - @param column column number for the index (integer) - @param parent index of the parent item (QModelIndex) - @return requested index (QModelIndex) + @param row row number for the index + @type int + @param column column number for the index + @type int + @param parent index of the parent item + @type QModelIndex + @return requested index + @rtype QModelIndex """ if ((parent and parent.isValid()) or row < 0 or row >= len(self.breakpoints) or @@ -164,8 +186,10 @@ """ Public method to get the parent index. - @param index index of item to get parent (QModelIndex) - @return index of parent (QModelIndex) + @param index index of item to get parent + @type QModelIndex + @return index of parent + @rtype QModelIndex """ return QModelIndex() @@ -173,8 +197,10 @@ """ Public method to check for the presence of child items. - @param parent index of parent item (QModelIndex) - @return flag indicating the presence of child items (boolean) + @param parent index of parent item + @type QModelIndex + @return flag indicating the presence of child items + @rtype bool """ if parent is None or not parent.isValid(): return len(self.breakpoints) > 0 @@ -187,11 +213,13 @@ """ Public method to add a new breakpoint to the list. - @param fn filename of the breakpoint (string) - @param line line number of the breakpoint (integer) + @param fn filename of the breakpoint + @type str + @param line line number of the breakpoint + @type int @param properties properties of the breakpoint - (tuple of condition (string), temporary flag (bool), - enabled flag (bool), ignore count (integer)) + (tuple of condition, temporary flag, enabled flag, ignore count) + @type tuple of (str, bool, bool, int) """ bp = [fn, line] + list(properties) cnt = len(self.breakpoints) @@ -203,12 +231,15 @@ """ Public method to set the values of a breakpoint given by index. - @param index index of the breakpoint (QModelIndex) - @param fn filename of the breakpoint (string) - @param line line number of the breakpoint (integer) + @param index index of the breakpoint + @type QModelIndex + @param fn filename of the breakpoint + @type str + @param line line number of the breakpoint + @type int @param properties properties of the breakpoint - (tuple of condition (string), temporary flag (bool), - enabled flag (bool), ignore count (integer)) + (tuple of condition, temporary flag, enabled flag, ignore count) + @type tuple of (str, bool, bool, int) """ if index.isValid(): row = index.row() @@ -223,8 +254,10 @@ """ Public method to set the enabled state of a breakpoint given by index. - @param index index of the breakpoint (QModelIndex) - @param enabled flag giving the enabled state (boolean) + @param index index of the breakpoint + @type QModelIndex + @param enabled flag giving the enabled state + @type bool """ if index.isValid(): row = index.row() @@ -238,7 +271,8 @@ """ Public method to set the values of a breakpoint given by index. - @param index index of the breakpoint (QModelIndex) + @param index index of the breakpoint + @type QModelIndex """ if index.isValid(): row = index.row() @@ -250,7 +284,8 @@ """ Public method to delete a list of breakpoints given by their indexes. - @param idxList list of breakpoint indexes (list of QModelIndex) + @param idxList list of breakpoint indexes + @type list of QModelIndex """ rows = [] for index in idxList: @@ -276,9 +311,11 @@ """ Public method to get the values of a breakpoint given by index. - @param index index of the breakpoint (QModelIndex) - @return breakpoint (list of seven values (filename, line number, + @param index index of the breakpoint + @type QModelIndex + @return breakpoint (list of six values (filename, line number, condition, temporary flag, enabled flag, ignore count)) + @rtype list of (str, int, str, bool, bool, int) """ if index.isValid(): return self.breakpoints[index.row()][:] # return a copy @@ -290,9 +327,12 @@ Public method to get the index of a breakpoint given by filename and line number. - @param fn filename of the breakpoint (string) - @param lineno line number of the breakpoint (integer) - @return index (QModelIndex) + @param fn filename of the breakpoint + @type str + @param lineno line number of the breakpoint + @type int + @return index + @rtype QModelIndex """ for row in range(len(self.breakpoints)): bp = self.breakpoints[row] @@ -305,8 +345,10 @@ """ Public method to test, if a breakpoint given by its index is temporary. - @param index index of the breakpoint to test (QModelIndex) - @return flag indicating a temporary breakpoint (boolean) + @param index index of the breakpoint to test + @type QModelIndex + @return flag indicating a temporary breakpoint + @rtype bool """ if index.isValid(): return self.breakpoints[index.row()][3]
--- a/eric6/Debugger/BreakPointViewer.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Debugger/BreakPointViewer.py Mon Feb 01 10:38:16 2021 +0100 @@ -67,7 +67,8 @@ """ Public slot to set the breakpoint model. - @param model reference to the breakpoint model (BreakPointModel) + @param model reference to the breakpoint model + @type BreakPointModel """ self.__model = model @@ -111,8 +112,10 @@ """ Private slot to convert an index to a source index. - @param index index to be converted (QModelIndex) - @return mapped index (QModelIndex) + @param index index to be converted + @type QModelIndex + @return mapped index + @rtype QModelIndex """ return self.sortingModel.mapToSource(index) @@ -120,8 +123,10 @@ """ Private slot to convert a source index to an index. - @param sindex source index to be converted (QModelIndex) - @return mapped index (QModelIndex) + @param sindex source index to be converted + @type QModelIndex + @return mapped index + @rtype QModelIndex """ return self.sortingModel.mapFromSource(sindex) @@ -129,8 +134,10 @@ """ Private slot to select a complete row. - @param index index determining the row to be selected (QModelIndex) - @param selected flag indicating the action (bool) + @param index index determining the row to be selected + @type QModelIndex + @param selected flag indicating the action + @type bool """ if not index.isValid(): return @@ -205,7 +212,8 @@ """ Private slot to show the context menu. - @param coord the position of the mouse pointer (QPoint) + @param coord the position of the mouse pointer + @type QPoint """ cnt = self.__getSelectedItemsCount() if cnt <= 1: @@ -259,7 +267,8 @@ """ Private slot to handle the double clicked signal. - @param index index of the entry that was double clicked (QModelIndex) + @param index index of the entry that was double clicked + @type QModelIndex """ if index.isValid(): self.__editBreakpoint(index) @@ -276,7 +285,8 @@ """ Private slot to edit a breakpoint. - @param index index of breakpoint to be edited (QModelIndex) + @param index index of breakpoint to be edited + @type QModelIndex """ sindex = self.__toSourceIndex(index) if sindex.isValid(): @@ -308,8 +318,10 @@ """ Private method to set the enabled status of a breakpoint. - @param index index of breakpoint to be enabled/disabled (QModelIndex) - @param enabled flag indicating the enabled status to be set (boolean) + @param index index of breakpoint to be enabled/disabled + @type QModelIndex + @param enabled flag indicating the enabled status to be set + @type bool """ sindex = self.__toSourceIndex(index) if sindex.isValid(): @@ -421,8 +433,10 @@ """ Public slot to handle the clientLine signal. - @param fn filename of the breakpoint (string) - @param lineno line number of the breakpoint (integer) + @param fn filename of the breakpoint + @type str + @param lineno line number of the breakpoint + @type int """ sindex = self.__model.getBreakPointIndex(fn, lineno) if sindex.isValid(): @@ -456,7 +470,8 @@ """ Private method to get the count of items selected. - @return count of items selected (integer) + @return count of items selected + @rtype int """ count = len(self.selectedIndexes()) // (self.__model.columnCount() - 1) # column count is 1 greater than selectable
--- a/eric6/Debugger/CallStackViewer.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Debugger/CallStackViewer.py Mon Feb 01 10:38:16 2021 +0100 @@ -8,7 +8,9 @@ """ from PyQt5.QtCore import pyqtSignal, Qt, QFileInfo -from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QMenu +from PyQt5.QtWidgets import ( + QTreeWidget, QTreeWidgetItem, QMenu, QWidget, QVBoxLayout, QLabel +) from E5Gui.E5Application import e5App from E5Gui import E5FileDialog, E5MessageBox @@ -16,7 +18,7 @@ import Utilities -class CallStackViewer(QTreeWidget): +class CallStackViewer(QWidget): """ Class implementing the Call Stack viewer widget. @@ -33,25 +35,35 @@ """ Constructor - @param debugServer reference to the debug server object (DebugServer) - @param parent reference to the parent widget (QWidget) + @param debugServer reference to the debug server object + @type DebugServer + @param parent reference to the parent widget + @type QWidget """ super(CallStackViewer, self).__init__(parent) - self.setHeaderHidden(True) - self.setAlternatingRowColors(True) - self.setItemsExpandable(False) - self.setRootIsDecorated(False) + self.__layout = QVBoxLayout(self) + self.setLayout(self.__layout) + self.__debuggerLabel = QLabel(self) + self.__layout.addWidget(self.__debuggerLabel) + self.__callStackList = QTreeWidget(self) + self.__layout.addWidget(self.__callStackList) + + self.__callStackList.setHeaderHidden(True) + self.__callStackList.setAlternatingRowColors(True) + self.__callStackList.setItemsExpandable(False) + self.__callStackList.setRootIsDecorated(False) self.setWindowTitle(self.tr("Call Stack")) - self.__menu = QMenu(self) + self.__menu = QMenu(self.__callStackList) self.__sourceAct = self.__menu.addAction( self.tr("Show source"), self.__openSource) - self.__menu.addAction(self.tr("Clear"), self.clear) + self.__menu.addAction(self.tr("Clear"), self.__callStackList.clear) self.__menu.addSeparator() self.__menu.addAction(self.tr("Save"), self.__saveStackTrace) - self.setContextMenuPolicy(Qt.CustomContextMenu) - self.customContextMenuRequested.connect(self.__showContextMenu) + self.__callStackList.setContextMenuPolicy(Qt.CustomContextMenu) + self.__callStackList.customContextMenuRequested.connect( + self.__showContextMenu) self.__dbs = debugServer @@ -64,13 +76,15 @@ self.__project = None self.__dbs.clientStack.connect(self.__showCallStack) - self.itemDoubleClicked.connect(self.__itemDoubleClicked) + self.__callStackList.itemDoubleClicked.connect( + self.__itemDoubleClicked) def setDebugger(self, debugUI): """ Public method to set a reference to the Debug UI. - @param debugUI reference to the DebugUI object (DebugUI) + @param debugUI reference to the DebugUI object + @type DebugUI """ debugUI.clientStack.connect(self.__showCallStack) @@ -81,7 +95,8 @@ In project mode the call trace info is shown with project relative path names. - @param enabled flag indicating to enable the project mode (boolean) + @param enabled flag indicating to enable the project mode + @type bool """ self.__projectMode = enabled if enabled and self.__project is None: @@ -91,21 +106,34 @@ """ Private slot to show the context menu. - @param coord the position of the mouse pointer (QPoint) + @param coord the position of the mouse pointer + @type QPoint """ - if self.topLevelItemCount() > 0: - itm = self.currentItem() + if self.__callStackList.topLevelItemCount() > 0: + itm = self.__callStackList.currentItem() self.__sourceAct.setEnabled(itm is not None) - self.__menu.popup(self.mapToGlobal(coord)) + self.__menu.popup(self.__callStackList.mapToGlobal(coord)) - def __showCallStack(self, stack): + def clear(self): + """ + Public method to clear the stack viewer data. + """ + self.__debuggerLabel.clear() + self.__callStackList.clear() + + def __showCallStack(self, stack, debuggerId): """ Private slot to show the call stack of the program being debugged. @param stack list of tuples with call stack data (file name, line number, function name, formatted argument/values list) + @type list of tuples of (str, str, str, str) + @param debuggerId ID of the debugger backend + @type str """ - self.clear() + self.__debuggerLabel.setText(debuggerId) + + self.__callStackList.clear() for fname, fline, ffunc, fargs in stack: if self.__projectMode: dfname = self.__project.getRelativePath(fname) @@ -114,22 +142,26 @@ if ffunc and not ffunc.startswith("<"): # use normal format itm = QTreeWidgetItem( - self, - [self.__entryFormat.format(dfname, fline, ffunc, fargs)]) + self.__callStackList, + [self.__entryFormat.format(dfname, fline, ffunc, fargs)] + ) else: # use short format itm = QTreeWidgetItem( - self, [self.__entryFormatShort.format(dfname, fline)]) + self.__callStackList, + [self.__entryFormatShort.format(dfname, fline)] + ) itm.setData(0, self.FilenameRole, fname) itm.setData(0, self.LinenoRole, fline) - self.resizeColumnToContents(0) + self.__callStackList.resizeColumnToContents(0) def __itemDoubleClicked(self, itm): """ Private slot to handle a double click of a stack entry. - @param itm reference to the double clicked item (QTreeWidgetItem) + @param itm reference to the double clicked item + @type QTreeWidgetItem """ fname = itm.data(0, self.FilenameRole) fline = itm.data(0, self.LinenoRole) @@ -137,14 +169,14 @@ fname = self.__project.getAbsolutePath(fname) self.sourceFile.emit(fname, fline) - index = self.indexOfTopLevelItem(itm) + index = self.__callStackList.indexOfTopLevelItem(itm) self.frameSelected.emit(index) def __openSource(self): """ Private slot to show the source for the selected stack entry. """ - itm = self.currentItem() + itm = self.__callStackList.currentItem() if itm: self.__itemDoubleClicked(itm) @@ -152,7 +184,7 @@ """ Private slot to save the stack trace info to a file. """ - if self.topLevelItemCount() > 0: + if self.__callStackList.topLevelItemCount() > 0: fname, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( self, self.tr("Save Call Stack Info"), @@ -178,12 +210,16 @@ fname = Utilities.toNativeSeparators(fname) try: + title = self.tr("Call Stack of '{0}'").format( + self.__debuggerLabel.text()) with open(fname, "w", encoding="utf-8") as f: - itm = self.topLevelItem(0) + f.write("{0}\n".format(title)) + f.write("{0}\n\n".format(len(title) * "=")) + itm = self.__callStackList.topLevelItem(0) while itm is not None: f.write("{0}\n".format(itm.text(0))) - f.write(78 * "=" + "\n") - itm = self.itemBelow(itm) + f.write("{0}\n".format(78 * "=")) + itm = self.__callStackList.itemBelow(itm) except OSError as err: E5MessageBox.critical( self,
--- a/eric6/Debugger/CallTraceViewer.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Debugger/CallTraceViewer.py Mon Feb 01 10:38:16 2021 +0100 @@ -31,17 +31,22 @@ """ sourceFile = pyqtSignal(str, int) - def __init__(self, debugServer, parent=None): + def __init__(self, debugServer, debugViewer, parent=None): """ Constructor - @param debugServer reference to the debug server object (DebugServer) - @param parent reference to the parent widget (QWidget) + @param debugServer reference to the debug server object + @type DebugServer + @param debugViewer reference to the debug viewer object + @type DebugViewer + @param parent reference to the parent widget + @type QWidget """ super(CallTraceViewer, self).__init__(parent) self.setupUi(self) self.__dbs = debugServer + self.__debugViewer = debugViewer self.startTraceButton.setIcon( UI.PixmapCache.getIcon("callTraceStart")) @@ -63,6 +68,7 @@ self.__projectMode = False self.__project = None + self.__tracedDebuggerId = "" stopOnExit = Preferences.toBool( Preferences.Prefs.settings.value("CallTrace/StopOnExit", True)) @@ -84,9 +90,14 @@ """ Private slot to set the call trace enabled status. - @param enabled flag indicating the new state (boolean) + @param enabled flag indicating the new state + @type bool """ - self.__dbs.setCallTraceEnabled(enabled) + if enabled: + self.__tracedDebuggerId = ( + self.__debugViewer.getSelectedDebuggerId() + ) + self.__dbs.setCallTraceEnabled(self.__tracedDebuggerId, enabled) self.stopTraceButton.setEnabled(enabled) self.startTraceButton.setEnabled(not enabled) self.__callTraceEnabled = enabled @@ -166,7 +177,11 @@ fname = Utilities.toNativeSeparators(fname) try: + title = self.tr("Call Trace Info of '{0}'").format( + self.__tracedDebuggerId) with open(fname, "w", encoding="utf-8") as f: + f.write("{0}\n".format(title)) + f.write("{0}\n\n".format(len(title) * "=")) itm = self.callTrace.topLevelItem(0) while itm is not None: isCall = itm.data(0, Qt.UserRole) @@ -192,8 +207,10 @@ """ Private slot to open the double clicked file in an editor. - @param item reference to the double clicked item (QTreeWidgetItem) - @param column column that was double clicked (integer) + @param item reference to the double clicked item + @type QTreeWidgetItem + @param column column that was double clicked + @type int """ if item is not None and column > 0: columnStr = item.text(column) @@ -223,63 +240,88 @@ In project mode the call trace info is shown with project relative path names. - @param enabled flag indicating to enable the project mode (boolean) + @param enabled flag indicating to enable the project mode + @type bool """ self.__projectMode = enabled if enabled and self.__project is None: self.__project = e5App().getObject("Project") def __addCallTraceInfo(self, isCall, fromFile, fromLine, fromFunction, - toFile, toLine, toFunction): + toFile, toLine, toFunction, debuggerId): """ Private method to add an entry to the call trace viewer. - @param isCall flag indicating a 'call' (boolean) - @param fromFile name of the originating file (string) - @param fromLine line number in the originating file (string) - @param fromFunction name of the originating function (string) - @param toFile name of the target file (string) - @param toLine line number in the target file (string) - @param toFunction name of the target function (string) + @param isCall flag indicating a 'call' + @type bool + @param fromFile name of the originating file + @type str + @param fromLine line number in the originating file + @type str + @param fromFunction name of the originating function + @type str + @param toFile name of the target file + @type str + @param toLine line number in the target file + @type str + @param toFunction name of the target function + @type str + @param debuggerId ID of the debugger backend + @type str """ - if isCall: - icon = UI.PixmapCache.getIcon("forward") - else: - icon = UI.PixmapCache.getIcon("back") - parentItem = ( - self.__callStack[-1] if self.__callStack else self.callTrace) - - if self.__projectMode: - fromFile = self.__project.getRelativePath(fromFile) - toFile = self.__project.getRelativePath(toFile) - - itm = QTreeWidgetItem( - parentItem, - ["", - self.__entryFormat.format(fromFile, fromLine, fromFunction), - self.__entryFormat.format(toFile, toLine, toFunction)]) - itm.setIcon(0, icon) - itm.setData(0, Qt.UserRole, isCall) - itm.setExpanded(True) - - if isCall: - self.__callStack.append(itm) - else: - if self.__callStack: - self.__callStack.pop(-1) + if debuggerId == self.__tracedDebuggerId: + if isCall: + icon = UI.PixmapCache.getIcon("forward") + else: + icon = UI.PixmapCache.getIcon("back") + parentItem = ( + self.__callStack[-1] if self.__callStack else self.callTrace) + + if self.__projectMode: + fromFile = self.__project.getRelativePath(fromFile) + toFile = self.__project.getRelativePath(toFile) + + itm = QTreeWidgetItem( + parentItem, + ["", + self.__entryFormat.format(fromFile, fromLine, fromFunction), + self.__entryFormat.format(toFile, toLine, toFunction)]) + itm.setIcon(0, icon) + itm.setData(0, Qt.UserRole, isCall) + itm.setExpanded(True) + + if isCall: + self.__callStack.append(itm) + else: + if self.__callStack: + self.__callStack.pop(-1) def isCallTraceEnabled(self): """ Public method to get the state of the call trace function. - @return flag indicating the state of the call trace function (boolean) + @return flag indicating the state of the call trace function + @rtype bool """ return self.__callTraceEnabled - @pyqtSlot() - def __clientExit(self): + @pyqtSlot(str, int, str, bool, str) + def __clientExit(self, program, status, message, quiet, debuggerId): """ - Private slot handling a client exiting. + Private slot to handle a debug client terminating. + + @param program name of the exited program + @type str + @param status exit code of the debugged program + @type int + @param message exit message of the debugged program + @type str + @param quiet flag indicating to suppress exit info display + @type bool + @param debuggerId ID of the debugger backend + @type str """ - if self.stopCheckBox.isChecked(): - self.__setCallTraceEnabled(False) + if debuggerId == self.__tracedDebuggerId: + if self.stopCheckBox.isChecked(): + self.__setCallTraceEnabled(False) + self.__tracedDebuggerId = ""
--- a/eric6/Debugger/Config.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Debugger/Config.py Mon Feb 01 10:38:16 2021 +0100 @@ -9,7 +9,7 @@ from PyQt5.QtCore import QT_TRANSLATE_NOOP -# Variables type definition +# Variable type definitions ConfigVarTypeDispStrings = { '__': QT_TRANSLATE_NOOP('Variable Types', 'Hidden Attributes'), 'NoneType': QT_TRANSLATE_NOOP('Variable Types', 'None'), @@ -20,7 +20,6 @@ 'float': QT_TRANSLATE_NOOP('Variable Types', 'Float'), 'complex': QT_TRANSLATE_NOOP('Variable Types', 'Complex'), 'str': QT_TRANSLATE_NOOP('Variable Types', 'String'), - 'unicode': QT_TRANSLATE_NOOP('Variable Types', 'Unicode String'), 'tuple': QT_TRANSLATE_NOOP('Variable Types', 'Tuple'), 'list': QT_TRANSLATE_NOOP('Variable Types', 'List/Array'), 'dict': QT_TRANSLATE_NOOP('Variable Types', 'Dictionary/Hash/Map'), @@ -45,42 +44,6 @@ 'traceback': QT_TRANSLATE_NOOP('Variable Types', 'Traceback'), 'frame': QT_TRANSLATE_NOOP('Variable Types', 'Frame'), 'bytes': QT_TRANSLATE_NOOP('Variable Types', 'Bytes'), + "special_attributes": QT_TRANSLATE_NOOP( + 'Variable Types', "Special Attributes"), } - - -ConfigVarTypeFilters = { - '__': 0, - 'NoneType': 1, - 'type': 2, - 'bool': 3, - 'int': 4, - 'long': 5, - 'float': 6, - 'complex': 7, - 'str': 8, - 'unicode': 9, # Not used anymore but keep to avoid reassignment - 'tuple': 10, - 'list': 11, - 'dict': 12, - 'dict-proxy': 13, - 'set': 14, - 'file': 15, - 'xrange': 16, - 'slice': 17, - 'buffer': 18, - 'class': 19, - 'instance': 20, - 'method': 21, - 'property': 22, - 'generator': 23, - 'function': 24, - 'builtin_function_or_method': 25, - 'code': 26, - 'module': 27, - 'ellipsis': 28, - 'traceback': 29, - 'frame': 30, - 'other': 31, # Not used anymore but keep to avoid reassignment - 'frozenset': 32, - 'bytes': 33, -}
--- a/eric6/Debugger/DebugServer.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Debugger/DebugServer.py Mon Feb 01 10:38:16 2021 +0100 @@ -9,7 +9,7 @@ import os -from PyQt5.QtCore import pyqtSignal, QModelIndex +from PyQt5.QtCore import pyqtSignal, pyqtSlot, QModelIndex from PyQt5.QtNetwork import ( QTcpServer, QHostAddress, QHostInfo, QNetworkInterface ) @@ -40,49 +40,57 @@ @signal clientProcessStderr(str) emitted after the client has sent some output via stderr @signal clientOutput(str) emitted after the client has sent some output - @signal clientRawInputSent() emitted after the data was sent to the - debug client - @signal clientLine(filename, lineno, forStack) emitted after the + @signal clientRawInputSent(debuggerId) emitted after the data was sent + to the indicated debug client + @signal clientLine(filename, lineno, debuggerId, threadName, forStack) + emitted after the debug client has executed a line of code + @signal clientStack(stack, debuggerId, threadName) emitted after the debug client has executed a line of code - @signal clientStack(stack) emitted after the debug client has executed a - line of code - @signal clientThreadList(currentId, threadList) emitted after a thread list - has been received - @signal clientThreadSet() emitted after the client has acknowledged the - change of the current thread - @signal clientVariables(scope, variables) emitted after a variables dump - has been received - @signal clientVariable(scope, variables) emitted after a dump for one class - variable has been received - @signal clientStatement(bool) emitted after an interactive command has - been executed. The parameter is 0 to indicate that the command is - complete and 1 if it needs more input. - @signal clientDisassembly(disassembly) emitted after the client has sent - a disassembly of the code raising an exception - @signal clientException(exception) emitted after an exception occured on - the client side - @signal clientSyntaxError(exception) emitted after a syntax error has been - detected on the client side - @signal clientSignal(signal) emitted after a signal has been generated on - the client side - @signal clientExit(int, str, bool) emitted after the client has exited - giving the exit status, an exit message and an indication to be quiet - @signal clientClearBreak(filename, lineno) emitted after the debug client - has decided to clear a temporary breakpoint - @signal clientBreakConditionError(fn, lineno) emitted after the client has - signaled a syntax error in a breakpoint condition - @signal clientClearWatch(condition) emitted after the debug client - has decided to clear a temporary watch expression - @signal clientWatchConditionError(condition) emitted after the client has - signaled a syntax error in a watch expression - @signal clientRawInput(prompt, echo) emitted after a raw input request was - received - @signal clientBanner(version, platform, dbgclient, venvname) emitted after + @signal clientThreadList(currentId, threadList, debuggerId) emitted after + a thread list has been received + @signal clientThreadSet(debuggerId) emitted after the client has + acknowledged the change of the current thread + @signal clientVariables(scope, variables, debuggerId) emitted after a + variables dump has been received + @signal clientVariable(scope, variables, debuggerId) emitted after a dump + for one class variable has been received + @signal clientStatement(continue, debuggerId) emitted after an interactive + command has been executed. The parameter is False to indicate that the + command is complete and True if it needs more input. + @signal clientDisassembly(disassembly, debuggerId) emitted after the client + has sent a disassembly of the code raising an exception + @signal clientException(exceptionType, exceptionMessage, stackTrace, + debuggerId, threadName) emitted after an exception occured on the + client side + @signal clientSyntaxError(message, filename, linenumber, characternumber, + debuggerId, threadName) emitted after a syntax error has been detected + on the client side + @signal clientSignal(message, filename, linenumber, function name, + function arguments, debuggerId) emitted after a signal has been + generated on the client side + @signal clientDisconnected(str) emitted after a debug client has + disconnected (i.e. closed the network socket) + @signal clientExit(str, int, str, bool, str) emitted after the client has + exited giving the program name, the exit status, an exit message, an + indication to be quiet and the ID of the exited client + @signal lastClientExited() emitted to indicate that the last connected + debug client has terminated + @signal clientClearBreak(filename, lineno, debuggerId) emitted after the + debug client has decided to clear a temporary breakpoint + @signal clientBreakConditionError(fn, lineno, debuggerId) emitted after the + client has signaled a syntax error in a breakpoint condition + @signal clientClearWatch(condition, debuggerId) emitted after the debug + client has decided to clear a temporary watch expression + @signal clientWatchConditionError(condition, debuggerId) emitted after the + client has signaled a syntax error in a watch expression + @signal clientRawInput(prompt, echo, debuggerId) emitted after a raw input + request was received + @signal clientBanner(version, platform, venvname) emitted after the client banner data was received @signal clientCapabilities(capabilities, cltype, venvname) emitted after the clients capabilities were received - @signal clientCompletionList(completionList, text) emitted after the client - the commandline completion list and the reworked searchstring was + @signal clientCompletionList(completionList, text) emitted after the + commandline completion list and the reworked search string was received from the client @signal passiveDebugStarted(str, bool) emitted after the debug client has connected in passive debug mode @@ -111,36 +119,41 @@ reported an unexpected test success @signal callTraceInfo emitted after the client reported the call trace data (isCall, fromFile, fromLine, fromFunction, toFile, toLine, - toFunction) + toFunction, debuggerId) @signal appendStdout(msg) emitted when a passive debug connection is established or lost + @signal clientDebuggerId(debuggerId) emitted to indicate a newly connected + debugger backend """ - clientClearBreak = pyqtSignal(str, int) - clientClearWatch = pyqtSignal(str) + clientClearBreak = pyqtSignal(str, int, str) + clientClearWatch = pyqtSignal(str, str) clientGone = pyqtSignal(bool) clientProcessStdout = pyqtSignal(str) clientProcessStderr = pyqtSignal(str) - clientRawInputSent = pyqtSignal() + clientRawInputSent = pyqtSignal(str) clientOutput = pyqtSignal(str) - clientLine = pyqtSignal(str, int, bool) - clientStack = pyqtSignal(list) - clientThreadList = pyqtSignal('PyQt_PyObject', list) - clientThreadSet = pyqtSignal() - clientVariables = pyqtSignal(int, list) - clientVariable = pyqtSignal(int, list) - clientStatement = pyqtSignal(bool) - clientDisassembly = pyqtSignal(dict) - clientException = pyqtSignal(str, str, list) - clientSyntaxError = pyqtSignal(str, str, int, int) - clientSignal = pyqtSignal(str, str, int, str, str) - clientExit = pyqtSignal(int, str, bool) - clientBreakConditionError = pyqtSignal(str, int) - clientWatchConditionError = pyqtSignal(str) - clientRawInput = pyqtSignal(str, bool) - clientBanner = pyqtSignal(str, str, str, str) + clientLine = pyqtSignal(str, int, str, str, bool) + clientStack = pyqtSignal(list, str, str) + clientThreadList = pyqtSignal('PyQt_PyObject', list, str) + clientThreadSet = pyqtSignal(str) + clientVariables = pyqtSignal(int, list, str) + clientVariable = pyqtSignal(int, list, str) + clientStatement = pyqtSignal(bool, str) + clientDisassembly = pyqtSignal(dict, str) + clientException = pyqtSignal(str, str, list, str, str) + clientSyntaxError = pyqtSignal(str, str, int, int, str, str) + clientSignal = pyqtSignal(str, str, int, str, str, str) + clientDisconnected = pyqtSignal(str) + clientExit = pyqtSignal(str, int, str, bool, str) + lastClientExited = pyqtSignal() + clientBreakConditionError = pyqtSignal(str, int, str) + clientWatchConditionError = pyqtSignal(str, str) + clientRawInput = pyqtSignal(str, bool, str) + clientBanner = pyqtSignal(str, str, str) clientCapabilities = pyqtSignal(int, str, str) clientCompletionList = pyqtSignal(list, str) clientInterpreterChanged = pyqtSignal(str) + clientDebuggerId = pyqtSignal(str) utDiscovered = pyqtSignal(list, str, str) utPrepared = pyqtSignal(int, str, str) utStartTest = pyqtSignal(str, str) @@ -152,7 +165,7 @@ utTestSucceededUnexpected = pyqtSignal(str, str) utFinished = pyqtSignal() passiveDebugStarted = pyqtSignal(str, bool) - callTraceInfo = pyqtSignal(bool, str, str, str, str, str, str) + callTraceInfo = pyqtSignal(bool, str, str, str, str, str, str, str) appendStdout = pyqtSignal(str) def __init__(self, originalPathString, preventPassiveDebugging=False): @@ -187,6 +200,10 @@ self.watchSpecialChanged = self.tr( "changed", "must be same as in EditWatchpointDialog") + # arrays to track already reported issues + self.__reportedBreakpointIssues = [] + self.__reportedWatchpointIssues = [] + self.networkInterface = Preferences.getDebugger("NetworkInterface") if self.networkInterface == "all": hostAddress = QHostAddress("0.0.0.0") # QHostAddress.Any) # secok @@ -242,16 +259,19 @@ self.__maxVariableSize = Preferences.getDebugger("MaxVariableSize") + self.__multiprocessNoDebugList = [] + self.__registerDebuggerInterfaces() - + def getHostAddress(self, localhost): """ Public method to get the IP address or hostname the debug server is listening. @param localhost flag indicating to return the address for localhost - (boolean) - @return IP address or hostname (string) + @type bool + @return IP address or hostname + @rtype str """ if self.networkInterface == "all": if localhost: @@ -266,14 +286,16 @@ else: return "{0}@@i{1}".format(self.networkInterface, self.networkInterfaceIndex) - + def __getNetworkInterfaceAndIndex(self, address): """ Private method to determine the network interface and the interface index. - @param address address to determine the info for (string) - @return tuple of network interface name (string) and index (integer) + @param address address to determine the info for + @type str + @return tuple of network interface name and index + @rtype tuple of (str, int) """ if address not in ["all", "allv6"]: for networkInterface in QNetworkInterface.allInterfaces(): @@ -286,7 +308,7 @@ networkInterface.index()) return "", 0 - + def preferencesChanged(self): """ Public slot to handle the preferencesChanged signal. @@ -302,7 +324,7 @@ reregister=True) self.__maxVariableSize = Preferences.getDebugger("MaxVariableSize") - + def registerDebuggerInterface(self, interfaceName, getRegistryData, reregister=False): """ @@ -336,7 +358,7 @@ self.__debuggerInterfaceRegistry[clientLanguage] = [ clientCapabilities, clientExtensions, interfaceCreator, interfaceName] - + def unregisterDebuggerInterface(self, interfaceName): """ Public method to unregister a debugger interface. @@ -353,7 +375,7 @@ for clientLanguage in clientLanguages: del self.__debuggerInterfaceRegistry[clientLanguage] del self.__debuggerInterfaces[interfaceName] - + def __findLanguageForExtension(self, ext): """ Private method to get the language associated with a file extension. @@ -368,7 +390,7 @@ return language return "" - + def __registerDebuggerInterfaces(self): """ Private method to register the available internal debugger interfaces. @@ -381,14 +403,16 @@ mod = getattr(mod, comp) self.registerDebuggerInterface(name, mod.getRegistryData) - + def getSupportedLanguages(self, shellOnly=False): """ Public slot to return the supported programming languages. @param shellOnly flag indicating only languages supporting an interactive shell should be returned - @return list of supported languages (list of strings) + @type bool + @return list of supported languages + @rtype list of str """ languages = list(self.__debuggerInterfaceRegistry.keys()) try: @@ -402,25 +426,27 @@ DebugClientCapabilities.HasShell] return languages[:] - + def getExtensions(self, language): """ Public slot to get the extensions associated with the given language. - @param language language to get extensions for (string) + @param language language to get extensions for + @type str @return tuple of extensions associated with the language - (tuple of strings) + @rtype tuple of str """ if language in self.__debuggerInterfaceRegistry: return tuple(self.__debuggerInterfaceRegistry[language][1]) else: return () - + def __createDebuggerInterface(self, clientType=None): """ Private slot to create the debugger interface object. - @param clientType type of the client interface to be created (string) + @param clientType type of the client interface to be created + @type str """ if self.lastClientType != self.clientType or clientType is not None: if clientType is None: @@ -434,35 +460,36 @@ self.__debuggerInterfaceRegistry["None"][2]( self, self.passive)) self.clientType = "None" - + def __setClientType(self, clType): """ Private method to set the client type. - @param clType type of client to be started (string) + @param clType type of client to be started + @type str """ if clType is not None and clType in self.getSupportedLanguages(): self.clientType = clType Preferences.Prefs.settings.setValue( 'DebugClient/Type', self.clientType) - + def startClient(self, unplanned=True, clType=None, forProject=False, runInConsole=False, venvName="", workingDir=None): """ Public method to start a debug client. - @keyparam unplanned flag indicating that the client has died + @param unplanned flag indicating that the client has died @type bool - @keyparam clType type of client to be started + @param clType type of client to be started @type str - @keyparam forProject flag indicating a project related action + @param forProject flag indicating a project related action @type bool - @keyparam runInConsole flag indicating to start the debugger in a + @param runInConsole flag indicating to start the debugger in a console window @type bool - @keyparam venvName name of the virtual environment to be used + @param venvName name of the virtual environment to be used @type str - @keyparam workingDir directory to start the debugger client in + @param workingDir directory to start the debugger client in @type str """ self.running = False @@ -521,8 +548,6 @@ elif self.__autoClearShell: self.__autoClearShell = False self.remoteBanner() -## self.remoteClientVariables(0, [], 0) -## self.remoteClientVariables(1, [], 0) else: if clType and self.lastClientType: self.__setClientType(self.lastClientType) @@ -533,7 +558,7 @@ if clientInterpreter != self.clientInterpreter: self.clientInterpreter = clientInterpreter self.clientInterpreterChanged.emit(clientInterpreter) - + def __clientProcessOutput(self): """ Private slot to process client output received via stdout. @@ -542,7 +567,7 @@ Preferences.getSystem("IOEncoding"), 'replace') self.clientProcessStdout.emit(output) - + def __clientProcessError(self): """ Private slot to process client output received via stderr. @@ -551,82 +576,112 @@ Preferences.getSystem("IOEncoding"), 'replace') self.clientProcessStderr.emit(error) - + + @pyqtSlot(str, int) def __clientClearBreakPoint(self, fn, lineno): """ Private slot to handle the clientClearBreak signal. - @param fn filename of breakpoint to clear (string) - @param lineno line number of breakpoint to clear (integer) + @param fn filename of breakpoint to clear + @type str + @param lineno line number of breakpoint to clear + @type int """ if self.debugging: index = self.breakpointModel.getBreakPointIndex(fn, lineno) self.breakpointModel.deleteBreakPointByIndex(index) - + if (fn, lineno) in self.__reportedBreakpointIssues: + self.__reportedBreakpointIssues.remove((fn, lineno)) + def __deleteBreakPoints(self, parentIndex, start, end): """ Private slot to delete breakpoints. - @param parentIndex index of parent item (QModelIndex) - @param start start row (integer) - @param end end row (integer) + @param parentIndex index of parent item + @type QModelIndex + @param start start row + @type int + @param end end row + @type int """ if self.debugging: for row in range(start, end + 1): index = self.breakpointModel.index(row, 0, parentIndex) fn, lineno = ( self.breakpointModel.getBreakPointByIndex(index)[0:2]) - self.remoteBreakpoint(fn, lineno, False) - + # delete the breakpoints of all connected backends + self.remoteBreakpoint("", fn, lineno, False) + if (fn, lineno) in self.__reportedBreakpointIssues: + self.__reportedBreakpointIssues.remove((fn, lineno)) + def __changeBreakPoints(self, startIndex, endIndex): """ Private slot to set changed breakpoints. - @param startIndex starting index of the change breakpoins (QModelIndex) - @param endIndex ending index of the change breakpoins (QModelIndex) + @param startIndex starting index of the change breakpoins + @type QModelIndex + @param endIndex ending index of the change breakpoins + @type QModelIndex """ if self.debugging: self.__addBreakPoints( QModelIndex(), startIndex.row(), endIndex.row()) - + def __breakPointDataAboutToBeChanged(self, startIndex, endIndex): """ Private slot to handle the dataAboutToBeChanged signal of the breakpoint model. - @param startIndex start index of the rows to be changed (QModelIndex) - @param endIndex end index of the rows to be changed (QModelIndex) + @param startIndex start index of the rows to be changed + @type QModelIndex + @param endIndex end index of the rows to be changed + @type QModelIndex """ if self.debugging: self.__deleteBreakPoints( QModelIndex(), startIndex.row(), endIndex.row()) - - def __addBreakPoints(self, parentIndex, start, end): + + def __addBreakPoints(self, parentIndex, start, end, debuggerId=""): """ Private slot to add breakpoints. - @param parentIndex index of parent item (QModelIndex) - @param start start row (inte