robotframework 7.0.1rc2__zip → 7.1__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {robotframework-7.0.1rc2 → robotframework-7.1}/PKG-INFO +3 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/setup.py +2 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/interfaces.py +32 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/conf/languages.py +73 -18
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/conf/settings.py +8 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/model.js +22 -33
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/template.py +0 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/jsonbuilder.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/BuiltIn.py +16 -3
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Collections.py +2 -3
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/DateTime.py +3 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Dialogs.py +12 -4
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/OperatingSystem.py +4 -4
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Process.py +7 -3
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/String.py +4 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/dialogs_py.py +17 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/modelobject.py +1 -6
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/console/__init__.py +3 -3
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/console/dotted.py +4 -4
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/console/highlighting.py +90 -65
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/console/verbose.py +10 -10
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/listeners.py +61 -217
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/logger.py +32 -16
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/loggerapi.py +11 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/loggerhelper.py +6 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/output.py +2 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/model/statements.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/rebot.py +3 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/executionresult.py +1 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/model.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/resultbuilder.py +12 -11
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/xmlelementhandlers.py +12 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/run.py +3 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/__init__.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/argumentresolver.py +15 -11
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/argumentspec.py +2 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/argumentvalidator.py +0 -8
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/embedded.py +2 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/bodyrunner.py +34 -19
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/invalidkeyword.py +4 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/keywordimplementation.py +9 -5
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/librarykeyword.py +19 -9
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/librarykeywordrunner.py +25 -19
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/model.py +45 -26
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/namespace.py +20 -26
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/resourcemodel.py +9 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/statusreporter.py +9 -4
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/testlibraries.py +2 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/userkeywordrunner.py +10 -7
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/encodingsniffer.py +3 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/robottime.py +5 -3
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/evaluation.py +1 -4
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/scopes.py +2 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/tablesetter.py +17 -20
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/version.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robotframework.egg-info/PKG-INFO +3 -2
- {robotframework-7.0.1rc2 → robotframework-7.1}/AUTHORS.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/BUILD.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/CONTRIBUTING.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/COPYRIGHT.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/INSTALL.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/LICENSE.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/MANIFEST.in +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/README.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/setup.cfg +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/__main__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/deco.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/exceptions.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/logger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/parsing.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/api/py.typed +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/conf/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/conf/gatherfailed.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/errors.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/htmlfilewriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/log.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/log.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/report.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/testdata.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdoc.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/builder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/datatypes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/htmlutils.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/model.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/robotbuilder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/standardtypes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libdocpkg/xmlwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Easter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Remote.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/XML.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/libraries/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/body.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/configurer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/control.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/filter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/fixture.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/itemlist.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/keyword.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/message.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/metadata.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/modifier.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/namepatterns.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/statistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/stats.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/tags.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/tagsetter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/testcase.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/testsuite.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/model/visitor.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/console/quiet.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/debugfile.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/filelogger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/librarylogger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/stdoutlogsplitter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/output/xmllogger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/blocklexers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/context.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/lexer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/settings.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/statementlexers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/lexer/tokens.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/model/blocks.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/model/visitor.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/jsbuildingcontext.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/jsmodelbuilders.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/outputwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/stringcache.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/reporting/xunitwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/configurer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/executionerrors.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/flattenkeywordmatcher.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/keywordremover.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/merger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/messagefilter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/modeldeprecation.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/result/visitor.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/argumentconverter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/argumentmapper.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/argumentparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/customconverters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/typeconverters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/typeinfo.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/typeinfoparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/arguments/typevalidator.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/builder/builders.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/builder/parsers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/builder/settings.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/builder/transformers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/context.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/importer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/keywordfinder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/outputcapture.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/randomizer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/runkwregister.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/signalhandler.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/status.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/suiterunner.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/timeouts/nosupport.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/testdoc.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/application.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/asserts.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/charwidth.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/compress.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/connectioncache.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/dotdict.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/encoding.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/error.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/escaping.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/filereader.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/frange.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/importer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/markuputils.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/markupwriters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/match.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/misc.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/normalizing.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/notset.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/platform.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/recommendations.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/restreader.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/robotenv.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/robotio.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/robotpath.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/robottypes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/setter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/sortable.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/text.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/typehints.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/utils/unic.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/assigner.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/filesetter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/finders.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/notfound.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/replacer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/resolvable.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/search.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/store.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robot/variables/variables.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robotframework.egg-info/SOURCES.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/src/robotframework.egg-info/top_level.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1}/tasks.py +0 -0
|
@@ -17,14 +17,24 @@
|
|
|
17
17
|
# Andre Burgaud, licensed under the MIT License, and available here:
|
|
18
18
|
# http://www.burgaud.com/bring-colors-to-the-windows-console-with-python/
|
|
19
19
|
|
|
20
|
-
from contextlib import contextmanager
|
|
21
20
|
import errno
|
|
22
21
|
import os
|
|
23
22
|
import sys
|
|
23
|
+
from contextlib import contextmanager
|
|
24
24
|
try:
|
|
25
|
-
from ctypes import windll
|
|
25
|
+
from ctypes import windll
|
|
26
26
|
except ImportError: # Not on Windows
|
|
27
27
|
windll = None
|
|
28
|
+
else:
|
|
29
|
+
from ctypes import byref, c_ushort, Structure
|
|
30
|
+
from ctypes.wintypes import _COORD, DWORD, SMALL_RECT
|
|
31
|
+
|
|
32
|
+
class ConsoleScreenBufferInfo(Structure):
|
|
33
|
+
_fields_ = [('dwSize', _COORD),
|
|
34
|
+
('dwCursorPosition', _COORD),
|
|
35
|
+
('wAttributes', c_ushort),
|
|
36
|
+
('srWindow', SMALL_RECT),
|
|
37
|
+
('dwMaximumWindowSize', _COORD)]
|
|
28
38
|
|
|
29
39
|
from robot.errors import DataError
|
|
30
40
|
from robot.utils import console_encode, isatty, WINDOWS
|
|
@@ -32,11 +42,11 @@ from robot.utils import console_encode, isatty, WINDOWS
|
|
|
32
42
|
|
|
33
43
|
class HighlightingStream:
|
|
34
44
|
|
|
35
|
-
def __init__(self, stream, colors='AUTO'):
|
|
45
|
+
def __init__(self, stream, colors='AUTO', links='AUTO'):
|
|
36
46
|
self.stream = stream
|
|
37
|
-
self._highlighter = self._get_highlighter(stream, colors)
|
|
47
|
+
self._highlighter = self._get_highlighter(stream, colors, links)
|
|
38
48
|
|
|
39
|
-
def _get_highlighter(self, stream, colors):
|
|
49
|
+
def _get_highlighter(self, stream, colors, links):
|
|
40
50
|
options = {'AUTO': Highlighter if isatty(stream) else NoHighlighting,
|
|
41
51
|
'ON': Highlighter,
|
|
42
52
|
'OFF': NoHighlighting,
|
|
@@ -44,9 +54,12 @@ class HighlightingStream:
|
|
|
44
54
|
try:
|
|
45
55
|
highlighter = options[colors.upper()]
|
|
46
56
|
except KeyError:
|
|
47
|
-
raise DataError("Invalid console color value '
|
|
48
|
-
"'AUTO', 'ON', 'OFF' and 'ANSI'."
|
|
49
|
-
|
|
57
|
+
raise DataError(f"Invalid console color value '{colors}'. "
|
|
58
|
+
f"Available 'AUTO', 'ON', 'OFF' and 'ANSI'.")
|
|
59
|
+
if links.upper() not in ('AUTO', 'OFF'):
|
|
60
|
+
raise DataError(f"Invalid console link value '{links}. "
|
|
61
|
+
f"Available 'AUTO' and 'OFF'.")
|
|
62
|
+
return highlighter(stream, links.upper() == 'AUTO')
|
|
50
63
|
|
|
51
64
|
def write(self, text, flush=True):
|
|
52
65
|
self._write(console_encode(text, stream=self.stream))
|
|
@@ -78,18 +91,14 @@ class HighlightingStream:
|
|
|
78
91
|
self.stream.flush()
|
|
79
92
|
|
|
80
93
|
def highlight(self, text, status=None, flush=True):
|
|
81
|
-
|
|
94
|
+
# Must flush before and after highlighting when using Windows APIs to make
|
|
95
|
+
# sure colors only affects the actual highlighted text.
|
|
96
|
+
if isinstance(self._highlighter, DosHighlighter):
|
|
82
97
|
self.flush()
|
|
83
98
|
flush = True
|
|
84
99
|
with self._highlighting(status or text):
|
|
85
100
|
self.write(text, flush)
|
|
86
101
|
|
|
87
|
-
def _must_flush_before_and_after_highlighting(self):
|
|
88
|
-
# Must flush on Windows before and after highlighting to make sure set
|
|
89
|
-
# console colors only affect the actual highlighted text. Problems
|
|
90
|
-
# only encountered with Python 3, but better to be safe than sorry.
|
|
91
|
-
return WINDOWS and not isinstance(self._highlighter, NoHighlighting)
|
|
92
|
-
|
|
93
102
|
def error(self, message, level):
|
|
94
103
|
self.write('[ ', flush=False)
|
|
95
104
|
self.highlight(level, flush=False)
|
|
@@ -109,33 +118,53 @@ class HighlightingStream:
|
|
|
109
118
|
finally:
|
|
110
119
|
highlighter.reset()
|
|
111
120
|
|
|
121
|
+
def result_file(self, kind, path):
|
|
122
|
+
path = self._highlighter.link(path)
|
|
123
|
+
self.write(f"{kind + ':':8} {path}\n")
|
|
124
|
+
|
|
112
125
|
|
|
113
|
-
def Highlighter(stream):
|
|
126
|
+
def Highlighter(stream, links=True):
|
|
114
127
|
if os.sep == '/':
|
|
115
|
-
return AnsiHighlighter(stream)
|
|
116
|
-
|
|
128
|
+
return AnsiHighlighter(stream, links)
|
|
129
|
+
if not windll:
|
|
130
|
+
return NoHighlighting(stream)
|
|
131
|
+
if virtual_terminal_enabled(stream):
|
|
132
|
+
return AnsiHighlighter(stream, links)
|
|
133
|
+
return DosHighlighter(stream)
|
|
117
134
|
|
|
118
135
|
|
|
119
136
|
class AnsiHighlighter:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
137
|
+
GREEN = '\033[32m'
|
|
138
|
+
RED = '\033[31m'
|
|
139
|
+
YELLOW = '\033[33m'
|
|
140
|
+
RESET = '\033[0m'
|
|
124
141
|
|
|
125
|
-
def __init__(self, stream):
|
|
142
|
+
def __init__(self, stream, links=True):
|
|
126
143
|
self._stream = stream
|
|
144
|
+
self._links = links
|
|
127
145
|
|
|
128
146
|
def green(self):
|
|
129
|
-
self._set_color(self.
|
|
147
|
+
self._set_color(self.GREEN)
|
|
130
148
|
|
|
131
149
|
def red(self):
|
|
132
|
-
self._set_color(self.
|
|
150
|
+
self._set_color(self.RED)
|
|
133
151
|
|
|
134
152
|
def yellow(self):
|
|
135
|
-
self._set_color(self.
|
|
153
|
+
self._set_color(self.YELLOW)
|
|
136
154
|
|
|
137
155
|
def reset(self):
|
|
138
|
-
self._set_color(self.
|
|
156
|
+
self._set_color(self.RESET)
|
|
157
|
+
|
|
158
|
+
def link(self, path):
|
|
159
|
+
if not self._links:
|
|
160
|
+
return path
|
|
161
|
+
try:
|
|
162
|
+
uri = path.as_uri()
|
|
163
|
+
except ValueError:
|
|
164
|
+
return path
|
|
165
|
+
# Terminal hyperlink syntax is documented here:
|
|
166
|
+
# https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
|
|
167
|
+
return f'\033]8;;{uri}\033\\{path}\033]8;;\033\\'
|
|
139
168
|
|
|
140
169
|
def _set_color(self, color):
|
|
141
170
|
self._stream.write(color)
|
|
@@ -143,71 +172,67 @@ class AnsiHighlighter:
|
|
|
143
172
|
|
|
144
173
|
class NoHighlighting(AnsiHighlighter):
|
|
145
174
|
|
|
175
|
+
def link(self, path):
|
|
176
|
+
return path
|
|
177
|
+
|
|
146
178
|
def _set_color(self, color):
|
|
147
179
|
pass
|
|
148
180
|
|
|
149
181
|
|
|
150
182
|
class DosHighlighter:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
_STDOUT_HANDLE = -11
|
|
158
|
-
_STDERR_HANDLE = -12
|
|
183
|
+
FOREGROUND_GREEN = 0x2
|
|
184
|
+
FOREGROUND_RED = 0x4
|
|
185
|
+
FOREGROUND_YELLOW = 0x6
|
|
186
|
+
FOREGROUND_GREY = 0x7
|
|
187
|
+
FOREGROUND_INTENSITY = 0x8
|
|
188
|
+
BACKGROUND_MASK = 0xF0
|
|
159
189
|
|
|
160
190
|
def __init__(self, stream):
|
|
161
|
-
self._handle =
|
|
191
|
+
self._handle = get_std_handle(stream)
|
|
162
192
|
self._orig_colors = self._get_colors()
|
|
163
|
-
self._background = self._orig_colors & self.
|
|
193
|
+
self._background = self._orig_colors & self.BACKGROUND_MASK
|
|
164
194
|
|
|
165
195
|
def green(self):
|
|
166
|
-
self._set_foreground_colors(self.
|
|
196
|
+
self._set_foreground_colors(self.FOREGROUND_GREEN)
|
|
167
197
|
|
|
168
198
|
def red(self):
|
|
169
|
-
self._set_foreground_colors(self.
|
|
199
|
+
self._set_foreground_colors(self.FOREGROUND_RED)
|
|
170
200
|
|
|
171
201
|
def yellow(self):
|
|
172
|
-
self._set_foreground_colors(self.
|
|
202
|
+
self._set_foreground_colors(self.FOREGROUND_YELLOW)
|
|
173
203
|
|
|
174
204
|
def reset(self):
|
|
175
205
|
self._set_colors(self._orig_colors)
|
|
176
206
|
|
|
177
|
-
def
|
|
178
|
-
|
|
179
|
-
if stream is sys.__stdout__ else self._STDERR_HANDLE
|
|
180
|
-
return windll.kernel32.GetStdHandle(handle)
|
|
207
|
+
def link(self, path):
|
|
208
|
+
return path
|
|
181
209
|
|
|
182
210
|
def _get_colors(self):
|
|
183
|
-
|
|
184
|
-
ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(
|
|
211
|
+
info = ConsoleScreenBufferInfo()
|
|
212
|
+
ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(info))
|
|
185
213
|
if not ok: # Call failed, return default console colors (gray on black)
|
|
186
|
-
return self.
|
|
187
|
-
return
|
|
214
|
+
return self.FOREGROUND_GREY
|
|
215
|
+
return info.wAttributes
|
|
188
216
|
|
|
189
217
|
def _set_foreground_colors(self, colors):
|
|
190
|
-
self._set_colors(colors | self.
|
|
218
|
+
self._set_colors(colors | self.FOREGROUND_INTENSITY | self._background)
|
|
191
219
|
|
|
192
220
|
def _set_colors(self, colors):
|
|
193
221
|
windll.kernel32.SetConsoleTextAttribute(self._handle, colors)
|
|
194
222
|
|
|
195
223
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
_fields_ = [("X", c_short),
|
|
200
|
-
("Y", c_short)]
|
|
224
|
+
def get_std_handle(stream):
|
|
225
|
+
handle = -11 if stream is sys.__stdout__ else -12
|
|
226
|
+
return windll.kernel32.GetStdHandle(handle)
|
|
201
227
|
|
|
202
|
-
class _SMALL_RECT(Structure):
|
|
203
|
-
_fields_ = [("Left", c_short),
|
|
204
|
-
("Top", c_short),
|
|
205
|
-
("Right", c_short),
|
|
206
|
-
("Bottom", c_short)]
|
|
207
228
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
229
|
+
def virtual_terminal_enabled(stream):
|
|
230
|
+
handle = get_std_handle(stream)
|
|
231
|
+
enable_vt = 0x0004
|
|
232
|
+
mode = DWORD()
|
|
233
|
+
if not windll.kernel32.GetConsoleMode(handle, byref(mode)):
|
|
234
|
+
return False # Calling GetConsoleMode failed.
|
|
235
|
+
if mode.value & enable_vt:
|
|
236
|
+
return True # VT already enabled.
|
|
237
|
+
# Try to enable VT.
|
|
238
|
+
return windll.kernel32.SetConsoleMode(handle, mode.value | enable_vt) != 0
|
|
@@ -24,9 +24,9 @@ from ..loggerapi import LoggerApi
|
|
|
24
24
|
|
|
25
25
|
class VerboseOutput(LoggerApi):
|
|
26
26
|
|
|
27
|
-
def __init__(self, width=78, colors='AUTO',
|
|
28
|
-
stderr=None):
|
|
29
|
-
self.writer = VerboseWriter(width, colors, markers, stdout, stderr)
|
|
27
|
+
def __init__(self, width=78, colors='AUTO', links='AUTO', markers='AUTO',
|
|
28
|
+
stdout=None, stderr=None):
|
|
29
|
+
self.writer = VerboseWriter(width, colors, links, markers, stdout, stderr)
|
|
30
30
|
self.started = False
|
|
31
31
|
self.started_keywords = 0
|
|
32
32
|
self.running_test = False
|
|
@@ -67,17 +67,17 @@ class VerboseOutput(LoggerApi):
|
|
|
67
67
|
self.writer.error(msg.message, msg.level, clear=self.running_test)
|
|
68
68
|
|
|
69
69
|
def result_file(self, kind, path):
|
|
70
|
-
self.writer.
|
|
70
|
+
self.writer.result_file(kind, path)
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
class VerboseWriter:
|
|
74
74
|
_status_length = len('| PASS |')
|
|
75
75
|
|
|
76
|
-
def __init__(self, width=78, colors='AUTO',
|
|
77
|
-
stderr=None):
|
|
76
|
+
def __init__(self, width=78, colors='AUTO', links='AUTO', markers='AUTO',
|
|
77
|
+
stdout=None, stderr=None):
|
|
78
78
|
self.width = width
|
|
79
|
-
self.stdout = HighlightingStream(stdout or sys.__stdout__, colors)
|
|
80
|
-
self.stderr = HighlightingStream(stderr or sys.__stderr__, colors)
|
|
79
|
+
self.stdout = HighlightingStream(stdout or sys.__stdout__, colors, links)
|
|
80
|
+
self.stderr = HighlightingStream(stderr or sys.__stderr__, colors, links)
|
|
81
81
|
self._keyword_marker = KeywordMarker(self.stdout, markers)
|
|
82
82
|
self._last_info = None
|
|
83
83
|
|
|
@@ -146,8 +146,8 @@ class VerboseWriter:
|
|
|
146
146
|
if self._should_clear_markers(clear):
|
|
147
147
|
self._write_info()
|
|
148
148
|
|
|
149
|
-
def
|
|
150
|
-
self.stdout.
|
|
149
|
+
def result_file(self, kind, path):
|
|
150
|
+
self.stdout.result_file(kind, path)
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
class KeywordMarker:
|
|
@@ -27,13 +27,18 @@ from .loggerhelper import IsLogged
|
|
|
27
27
|
from .logger import LOGGER
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
class Listeners
|
|
30
|
+
class Listeners:
|
|
31
31
|
_listeners: 'list[ListenerFacade]'
|
|
32
32
|
|
|
33
33
|
def __init__(self, listeners=(), log_level='INFO'):
|
|
34
34
|
self._is_logged = IsLogged(log_level)
|
|
35
35
|
self._listeners = self._import_listeners(listeners)
|
|
36
36
|
|
|
37
|
+
# Must be property to allow LibraryListeners to override it.
|
|
38
|
+
@property
|
|
39
|
+
def listeners(self):
|
|
40
|
+
return self._listeners
|
|
41
|
+
|
|
37
42
|
def _import_listeners(self, listeners, library=None) -> 'list[ListenerFacade]':
|
|
38
43
|
imported = []
|
|
39
44
|
for listener_source in listeners:
|
|
@@ -62,8 +67,8 @@ class Listeners(LoggerApi):
|
|
|
62
67
|
# Modules have `__name__`, with others better to use `type_name`.
|
|
63
68
|
name = getattr(listener, '__name__', None) or type_name(listener)
|
|
64
69
|
if self._get_version(listener) == 2:
|
|
65
|
-
return ListenerV2Facade(listener, name, library)
|
|
66
|
-
return ListenerV3Facade(listener, name, library)
|
|
70
|
+
return ListenerV2Facade(listener, name, self._is_logged, library)
|
|
71
|
+
return ListenerV3Facade(listener, name, self._is_logged, library)
|
|
67
72
|
|
|
68
73
|
def _get_version(self, listener):
|
|
69
74
|
version = getattr(listener, 'ROBOT_LISTENER_API_VERSION', 3)
|
|
@@ -75,205 +80,14 @@ class Listeners(LoggerApi):
|
|
|
75
80
|
raise DataError(f"Unsupported API version '{version}'.")
|
|
76
81
|
return version
|
|
77
82
|
|
|
78
|
-
# Must be property to allow LibraryListeners to override it.
|
|
79
|
-
@property
|
|
80
|
-
def listeners(self):
|
|
81
|
-
return self._listeners
|
|
82
|
-
|
|
83
|
-
def start_suite(self, data, result):
|
|
84
|
-
for listener in self.listeners:
|
|
85
|
-
listener.start_suite(data, result)
|
|
86
|
-
|
|
87
|
-
def end_suite(self, data, result):
|
|
88
|
-
for listener in self.listeners:
|
|
89
|
-
listener.end_suite(data, result)
|
|
90
|
-
|
|
91
|
-
def start_test(self, data, result):
|
|
92
|
-
for listener in self.listeners:
|
|
93
|
-
listener.start_test(data, result)
|
|
94
|
-
|
|
95
|
-
def end_test(self, data, result):
|
|
96
|
-
for listener in self.listeners:
|
|
97
|
-
listener.end_test(data, result)
|
|
98
|
-
|
|
99
|
-
def start_keyword(self, data, result):
|
|
100
|
-
for listener in self.listeners:
|
|
101
|
-
listener.start_keyword(data, result)
|
|
102
|
-
|
|
103
|
-
def end_keyword(self, data, result):
|
|
104
|
-
for listener in self.listeners:
|
|
105
|
-
listener.end_keyword(data, result)
|
|
106
|
-
|
|
107
|
-
def start_user_keyword(self, data, implementation, result):
|
|
108
|
-
for listener in self.listeners:
|
|
109
|
-
listener.start_user_keyword(data, implementation, result)
|
|
110
|
-
|
|
111
|
-
def end_user_keyword(self, data, implementation, result):
|
|
112
|
-
for listener in self.listeners:
|
|
113
|
-
listener.end_user_keyword(data, implementation, result)
|
|
114
|
-
|
|
115
|
-
def start_library_keyword(self, data, implementation, result):
|
|
116
|
-
for listener in self.listeners:
|
|
117
|
-
listener.start_library_keyword(data, implementation, result)
|
|
118
|
-
|
|
119
|
-
def end_library_keyword(self, data, implementation, result):
|
|
120
|
-
for listener in self.listeners:
|
|
121
|
-
listener.end_library_keyword(data, implementation, result)
|
|
122
|
-
|
|
123
|
-
def start_invalid_keyword(self, data, implementation, result):
|
|
124
|
-
for listener in self.listeners:
|
|
125
|
-
listener.start_invalid_keyword(data, implementation, result)
|
|
126
|
-
|
|
127
|
-
def end_invalid_keyword(self, data, implementation, result):
|
|
128
|
-
for listener in self.listeners:
|
|
129
|
-
listener.end_invalid_keyword(data, implementation, result)
|
|
130
|
-
|
|
131
|
-
def start_for(self, data, result):
|
|
132
|
-
for listener in self.listeners:
|
|
133
|
-
listener.start_for(data, result)
|
|
134
|
-
|
|
135
|
-
def end_for(self, data, result):
|
|
136
|
-
for listener in self.listeners:
|
|
137
|
-
listener.end_for(data, result)
|
|
138
|
-
|
|
139
|
-
def start_for_iteration(self, data, result):
|
|
140
|
-
for listener in self.listeners:
|
|
141
|
-
listener.start_for_iteration(data, result)
|
|
142
|
-
|
|
143
|
-
def end_for_iteration(self, data, result):
|
|
144
|
-
for listener in self.listeners:
|
|
145
|
-
listener.end_for_iteration(data, result)
|
|
146
|
-
|
|
147
|
-
def start_while(self, data, result):
|
|
148
|
-
for listener in self.listeners:
|
|
149
|
-
listener.start_while(data, result)
|
|
150
|
-
|
|
151
|
-
def end_while(self, data, result):
|
|
152
|
-
for listener in self.listeners:
|
|
153
|
-
listener.end_while(data, result)
|
|
154
|
-
|
|
155
|
-
def start_while_iteration(self, data, result):
|
|
156
|
-
for listener in self.listeners:
|
|
157
|
-
listener.start_while_iteration(data, result)
|
|
158
|
-
|
|
159
|
-
def end_while_iteration(self, data, result):
|
|
160
|
-
for listener in self.listeners:
|
|
161
|
-
listener.end_while_iteration(data, result)
|
|
162
|
-
|
|
163
|
-
def start_if(self, data, result):
|
|
164
|
-
for listener in self.listeners:
|
|
165
|
-
listener.start_if(data, result)
|
|
166
|
-
|
|
167
|
-
def end_if(self, data, result):
|
|
168
|
-
for listener in self.listeners:
|
|
169
|
-
listener.end_if(data, result)
|
|
170
|
-
|
|
171
|
-
def start_if_branch(self, data, result):
|
|
172
|
-
for listener in self.listeners:
|
|
173
|
-
listener.start_if_branch(data, result)
|
|
174
|
-
|
|
175
|
-
def end_if_branch(self, data, result):
|
|
176
|
-
for listener in self.listeners:
|
|
177
|
-
listener.end_if_branch(data, result)
|
|
178
|
-
|
|
179
|
-
def start_try(self, data, result):
|
|
180
|
-
for listener in self.listeners:
|
|
181
|
-
listener.start_try(data, result)
|
|
182
|
-
|
|
183
|
-
def end_try(self, data, result):
|
|
184
|
-
for listener in self.listeners:
|
|
185
|
-
listener.end_try(data, result)
|
|
186
|
-
|
|
187
|
-
def start_try_branch(self, data, result):
|
|
188
|
-
for listener in self.listeners:
|
|
189
|
-
listener.start_try_branch(data, result)
|
|
190
|
-
|
|
191
|
-
def end_try_branch(self, data, result):
|
|
192
|
-
for listener in self.listeners:
|
|
193
|
-
listener.end_try_branch(data, result)
|
|
194
|
-
|
|
195
|
-
def start_return(self, data, result):
|
|
196
|
-
for listener in self.listeners:
|
|
197
|
-
listener.start_return(data, result)
|
|
198
|
-
|
|
199
|
-
def end_return(self, data, result):
|
|
200
|
-
for listener in self.listeners:
|
|
201
|
-
listener.end_return(data, result)
|
|
202
|
-
|
|
203
|
-
def start_continue(self, data, result):
|
|
204
|
-
for listener in self.listeners:
|
|
205
|
-
listener.start_continue(data, result)
|
|
206
|
-
|
|
207
|
-
def end_continue(self, data, result):
|
|
208
|
-
for listener in self.listeners:
|
|
209
|
-
listener.end_continue(data, result)
|
|
210
|
-
|
|
211
|
-
def start_break(self, data, result):
|
|
212
|
-
for listener in self.listeners:
|
|
213
|
-
listener.start_break(data, result)
|
|
214
|
-
|
|
215
|
-
def end_break(self, data, result):
|
|
216
|
-
for listener in self.listeners:
|
|
217
|
-
listener.end_break(data, result)
|
|
218
|
-
|
|
219
|
-
def start_error(self, data, result):
|
|
220
|
-
for listener in self.listeners:
|
|
221
|
-
listener.start_error(data, result)
|
|
222
|
-
|
|
223
|
-
def end_error(self, data, result):
|
|
224
|
-
for listener in self.listeners:
|
|
225
|
-
listener.end_error(data, result)
|
|
226
|
-
|
|
227
|
-
def start_var(self, data, result):
|
|
228
|
-
for listener in self.listeners:
|
|
229
|
-
listener.start_var(data, result)
|
|
230
|
-
|
|
231
|
-
def end_var(self, data, result):
|
|
232
|
-
for listener in self.listeners:
|
|
233
|
-
listener.end_var(data, result)
|
|
234
|
-
|
|
235
83
|
def set_log_level(self, level):
|
|
236
84
|
self._is_logged.set_level(level)
|
|
237
85
|
|
|
238
|
-
def
|
|
239
|
-
|
|
240
|
-
for listener in self.listeners:
|
|
241
|
-
listener.log_message(message)
|
|
242
|
-
|
|
243
|
-
def message(self, message):
|
|
244
|
-
for listener in self.listeners:
|
|
245
|
-
listener.message(message)
|
|
246
|
-
|
|
247
|
-
def imported(self, import_type, name, attrs):
|
|
248
|
-
for listener in self.listeners:
|
|
249
|
-
listener.imported(import_type, name, attrs)
|
|
250
|
-
|
|
251
|
-
def output_file(self, path):
|
|
252
|
-
for listener in self.listeners:
|
|
253
|
-
listener.output_file(path)
|
|
86
|
+
def __iter__(self):
|
|
87
|
+
return iter(self.listeners)
|
|
254
88
|
|
|
255
|
-
def
|
|
256
|
-
|
|
257
|
-
listener.report_file(path)
|
|
258
|
-
|
|
259
|
-
def log_file(self, path):
|
|
260
|
-
for listener in self.listeners:
|
|
261
|
-
listener.log_file(path)
|
|
262
|
-
|
|
263
|
-
def xunit_file(self, path):
|
|
264
|
-
for listener in self.listeners:
|
|
265
|
-
listener.xunit_file(path)
|
|
266
|
-
|
|
267
|
-
def debug_file(self, path):
|
|
268
|
-
for listener in self.listeners:
|
|
269
|
-
listener.debug_file(path)
|
|
270
|
-
|
|
271
|
-
def close(self):
|
|
272
|
-
for listener in self.listeners:
|
|
273
|
-
listener.close()
|
|
274
|
-
|
|
275
|
-
def __bool__(self):
|
|
276
|
-
return bool(self.listeners)
|
|
89
|
+
def __len__(self):
|
|
90
|
+
return len(self.listeners)
|
|
277
91
|
|
|
278
92
|
|
|
279
93
|
class LibraryListeners(Listeners):
|
|
@@ -296,9 +110,6 @@ class LibraryListeners(Listeners):
|
|
|
296
110
|
listeners = self._import_listeners(library.listeners, library=library)
|
|
297
111
|
self._listeners[-1].extend(listeners)
|
|
298
112
|
|
|
299
|
-
def close(self):
|
|
300
|
-
pass
|
|
301
|
-
|
|
302
113
|
def unregister(self, library, close=False):
|
|
303
114
|
remaining = []
|
|
304
115
|
for listener in self._listeners[-1]:
|
|
@@ -311,10 +122,19 @@ class LibraryListeners(Listeners):
|
|
|
311
122
|
|
|
312
123
|
class ListenerFacade(LoggerApi, ABC):
|
|
313
124
|
|
|
314
|
-
def __init__(self, listener, name, library=None):
|
|
125
|
+
def __init__(self, listener, name, is_logged, library=None):
|
|
315
126
|
self.listener = listener
|
|
316
127
|
self.name = name
|
|
128
|
+
self._is_logged = is_logged
|
|
317
129
|
self.library = library
|
|
130
|
+
self.priority = self._get_priority(listener)
|
|
131
|
+
|
|
132
|
+
def _get_priority(self, listener):
|
|
133
|
+
priority = getattr(listener, 'ROBOT_LISTENER_PRIORITY', 0)
|
|
134
|
+
try:
|
|
135
|
+
return float(priority)
|
|
136
|
+
except (ValueError, TypeError):
|
|
137
|
+
raise DataError(f"Invalid listener priority '{priority}'.")
|
|
318
138
|
|
|
319
139
|
def _get_method(self, name, fallback=None):
|
|
320
140
|
for method_name in self._get_method_names(name):
|
|
@@ -336,8 +156,8 @@ class ListenerFacade(LoggerApi, ABC):
|
|
|
336
156
|
|
|
337
157
|
class ListenerV3Facade(ListenerFacade):
|
|
338
158
|
|
|
339
|
-
def __init__(self, listener, name, library=None):
|
|
340
|
-
super().__init__(listener, name, library)
|
|
159
|
+
def __init__(self, listener, name, is_logged, library=None):
|
|
160
|
+
super().__init__(listener, name, is_logged, library)
|
|
341
161
|
get = self._get_method
|
|
342
162
|
# Suite
|
|
343
163
|
self.start_suite = get('start_suite')
|
|
@@ -393,14 +213,18 @@ class ListenerV3Facade(ListenerFacade):
|
|
|
393
213
|
self.start_error = get('start_error', start_body_item)
|
|
394
214
|
self.end_error = get('end_error', end_body_item)
|
|
395
215
|
# Messages
|
|
396
|
-
self.
|
|
216
|
+
self._log_message = get('log_message')
|
|
397
217
|
self.message = get('message')
|
|
218
|
+
# Imports
|
|
219
|
+
self.library_import = get('library_import')
|
|
220
|
+
self.resource_import = get('resource_import')
|
|
221
|
+
self.variables_import = get('variables_import')
|
|
398
222
|
# Result files
|
|
399
|
-
self.output_file =
|
|
400
|
-
self.report_file =
|
|
401
|
-
self.log_file =
|
|
402
|
-
self.xunit_file =
|
|
403
|
-
self.debug_file =
|
|
223
|
+
self.output_file = get('output_file')
|
|
224
|
+
self.report_file = get('report_file')
|
|
225
|
+
self.log_file = get('log_file')
|
|
226
|
+
self.xunit_file = get('xunit_file')
|
|
227
|
+
self.debug_file = get('debug_file')
|
|
404
228
|
# Close
|
|
405
229
|
self.close = get('close')
|
|
406
230
|
|
|
@@ -440,11 +264,15 @@ class ListenerV3Facade(ListenerFacade):
|
|
|
440
264
|
else:
|
|
441
265
|
self.end_keyword(data, result)
|
|
442
266
|
|
|
267
|
+
def log_message(self, message):
|
|
268
|
+
if self._is_logged(message.level):
|
|
269
|
+
self._log_message(message)
|
|
270
|
+
|
|
443
271
|
|
|
444
272
|
class ListenerV2Facade(ListenerFacade):
|
|
445
273
|
|
|
446
|
-
def __init__(self, listener, name, library=None):
|
|
447
|
-
super().__init__(listener, name, library)
|
|
274
|
+
def __init__(self, listener, name, is_logged, library=None):
|
|
275
|
+
super().__init__(listener, name, is_logged, library)
|
|
448
276
|
# Suite
|
|
449
277
|
self._start_suite = self._get_method('start_suite')
|
|
450
278
|
self._end_suite = self._get_method('end_suite')
|
|
@@ -457,6 +285,10 @@ class ListenerV2Facade(ListenerFacade):
|
|
|
457
285
|
# Messages
|
|
458
286
|
self._log_message = self._get_method('log_message')
|
|
459
287
|
self._message = self._get_method('message')
|
|
288
|
+
# Imports
|
|
289
|
+
self._library_import = self._get_method('library_import')
|
|
290
|
+
self._resource_import = self._get_method('resource_import')
|
|
291
|
+
self._variables_import = self._get_method('variables_import')
|
|
460
292
|
# Result files
|
|
461
293
|
self._output_file = self._get_method('output_file')
|
|
462
294
|
self._report_file = self._get_method('report_file')
|
|
@@ -466,10 +298,6 @@ class ListenerV2Facade(ListenerFacade):
|
|
|
466
298
|
# Close
|
|
467
299
|
self._close = self._get_method('close')
|
|
468
300
|
|
|
469
|
-
def imported(self, import_type: str, name: str, attrs):
|
|
470
|
-
method = self._get_method(f'{import_type.lower()}_import')
|
|
471
|
-
method(name, attrs)
|
|
472
|
-
|
|
473
301
|
def start_suite(self, data, result):
|
|
474
302
|
self._start_suite(result.name, self._suite_attrs(data, result))
|
|
475
303
|
|
|
@@ -602,11 +430,27 @@ class ListenerV2Facade(ListenerFacade):
|
|
|
602
430
|
return {'name': result.name, 'value': value, 'scope': result.scope or 'LOCAL'}
|
|
603
431
|
|
|
604
432
|
def log_message(self, message):
|
|
605
|
-
self.
|
|
433
|
+
if self._is_logged(message.level):
|
|
434
|
+
self._log_message(self._message_attributes(message))
|
|
606
435
|
|
|
607
436
|
def message(self, message):
|
|
608
437
|
self._message(self._message_attributes(message))
|
|
609
438
|
|
|
439
|
+
def library_import(self, library, importer):
|
|
440
|
+
self._library_import(library.name, {'args': list(importer.args),
|
|
441
|
+
'originalname': library.real_name,
|
|
442
|
+
'source': str(library.source or ''),
|
|
443
|
+
'importer': str(importer.source)})
|
|
444
|
+
|
|
445
|
+
def resource_import(self, resource, importer):
|
|
446
|
+
self._resource_import(resource.name, {'source': str(resource.source),
|
|
447
|
+
'importer': str(importer.source)})
|
|
448
|
+
|
|
449
|
+
def variables_import(self, attrs: dict, importer):
|
|
450
|
+
self._variables_import(attrs['name'], {'args': list(attrs['args']),
|
|
451
|
+
'source': str(attrs['source']),
|
|
452
|
+
'importer': str(importer.source)})
|
|
453
|
+
|
|
610
454
|
def output_file(self, path: Path):
|
|
611
455
|
self._output_file(str(path))
|
|
612
456
|
|