robotframework 7.0.1rc2__zip → 7.1rc1__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/src/robotframework.egg-info → robotframework-7.1rc1}/PKG-INFO +3 -2
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/setup.py +2 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/interfaces.py +32 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/languages.py +73 -18
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/settings.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/model.js +22 -33
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/jsonbuilder.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/BuiltIn.py +16 -3
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/DateTime.py +3 -2
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Dialogs.py +12 -4
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/OperatingSystem.py +4 -4
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Process.py +7 -3
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/String.py +4 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/dialogs_py.py +17 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/modelobject.py +1 -6
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/dotted.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/highlighting.py +69 -56
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/verbose.py +3 -3
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/listeners.py +61 -217
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/logger.py +30 -14
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/loggerapi.py +11 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/loggerhelper.py +6 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/output.py +2 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/statements.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/executionresult.py +1 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/model.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/resultbuilder.py +12 -11
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/xmlelementhandlers.py +12 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/__init__.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentresolver.py +15 -11
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentspec.py +2 -2
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentvalidator.py +0 -8
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/embedded.py +2 -2
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/invalidkeyword.py +4 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/keywordimplementation.py +9 -5
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/librarykeyword.py +19 -9
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/librarykeywordrunner.py +25 -19
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/model.py +45 -26
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/namespace.py +20 -26
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/resourcemodel.py +9 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/statusreporter.py +9 -4
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/testlibraries.py +2 -2
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/userkeywordrunner.py +10 -7
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/encodingsniffer.py +3 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robottime.py +5 -3
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/evaluation.py +1 -4
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/tablesetter.py +17 -20
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/version.py +1 -1
- {robotframework-7.0.1rc2 → robotframework-7.1rc1/src/robotframework.egg-info}/PKG-INFO +3 -2
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/AUTHORS.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/BUILD.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/CONTRIBUTING.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/COPYRIGHT.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/INSTALL.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/LICENSE.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/MANIFEST.in +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/README.rst +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/setup.cfg +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/__main__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/deco.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/exceptions.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/logger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/parsing.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/py.typed +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/gatherfailed.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/errors.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/htmlfilewriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/report.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/testdata.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/template.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdoc.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/builder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/datatypes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/htmlutils.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/model.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/robotbuilder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/standardtypes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/xmlwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Collections.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Easter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Remote.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/XML.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/body.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/configurer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/control.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/filter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/fixture.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/itemlist.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/keyword.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/message.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/metadata.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/modifier.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/namepatterns.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/statistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/stats.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tags.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tagsetter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/testcase.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/testsuite.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/visitor.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/quiet.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/debugfile.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/filelogger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/librarylogger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/stdoutlogsplitter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/xmllogger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/blocklexers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/context.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/lexer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/settings.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/statementlexers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/tokens.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/blocks.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/visitor.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/rebot.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsbuildingcontext.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsmodelbuilders.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/outputwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/stringcache.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/xunitwriter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/configurer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/executionerrors.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/flattenkeywordmatcher.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/keywordremover.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/merger.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/messagefilter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/modeldeprecation.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/visitor.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/run.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentconverter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentmapper.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/customconverters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeconverters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeinfo.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeinfoparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typevalidator.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/bodyrunner.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/builders.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/parsers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/settings.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/transformers.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/context.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/importer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/keywordfinder.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/outputcapture.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/randomizer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/runkwregister.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/signalhandler.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/status.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/suiterunner.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/nosupport.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/testdoc.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/application.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/asserts.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/charwidth.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/compress.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/connectioncache.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/dotdict.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/encoding.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/error.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/escaping.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/filereader.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/frange.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/importer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/markuputils.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/markupwriters.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/match.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/misc.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/normalizing.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/notset.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/platform.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/recommendations.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/restreader.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotenv.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotio.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotpath.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robottypes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/setter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/sortable.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/text.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/typehints.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/unic.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/__init__.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/assigner.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/filesetter.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/finders.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/notfound.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/replacer.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/resolvable.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/scopes.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/search.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/store.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/variables.py +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/SOURCES.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/top_level.txt +0 -0
- {robotframework-7.0.1rc2 → robotframework-7.1rc1}/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
|
|
@@ -78,18 +88,14 @@ class HighlightingStream:
|
|
|
78
88
|
self.stream.flush()
|
|
79
89
|
|
|
80
90
|
def highlight(self, text, status=None, flush=True):
|
|
81
|
-
|
|
91
|
+
# Must flush before and after highlighting when using Windows APIs to make
|
|
92
|
+
# sure colors only affects the actual highlighted text.
|
|
93
|
+
if isinstance(self._highlighter, DosHighlighter):
|
|
82
94
|
self.flush()
|
|
83
95
|
flush = True
|
|
84
96
|
with self._highlighting(status or text):
|
|
85
97
|
self.write(text, flush)
|
|
86
98
|
|
|
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
99
|
def error(self, message, level):
|
|
94
100
|
self.write('[ ', flush=False)
|
|
95
101
|
self.highlight(level, flush=False)
|
|
@@ -109,33 +115,44 @@ class HighlightingStream:
|
|
|
109
115
|
finally:
|
|
110
116
|
highlighter.reset()
|
|
111
117
|
|
|
118
|
+
def result_file(self, kind, path):
|
|
119
|
+
path = self._highlighter.link(path)
|
|
120
|
+
self.write(f"{kind + ':':8} {path}\n")
|
|
121
|
+
|
|
112
122
|
|
|
113
123
|
def Highlighter(stream):
|
|
114
124
|
if os.sep == '/':
|
|
115
125
|
return AnsiHighlighter(stream)
|
|
116
|
-
|
|
126
|
+
if not windll:
|
|
127
|
+
return NoHighlighting(stream)
|
|
128
|
+
if virtual_terminal_enabled(stream):
|
|
129
|
+
return AnsiHighlighter(stream)
|
|
130
|
+
return DosHighlighter(stream)
|
|
117
131
|
|
|
118
132
|
|
|
119
133
|
class AnsiHighlighter:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
134
|
+
GREEN = '\033[32m'
|
|
135
|
+
RED = '\033[31m'
|
|
136
|
+
YELLOW = '\033[33m'
|
|
137
|
+
RESET = '\033[0m'
|
|
124
138
|
|
|
125
139
|
def __init__(self, stream):
|
|
126
140
|
self._stream = stream
|
|
127
141
|
|
|
128
142
|
def green(self):
|
|
129
|
-
self._set_color(self.
|
|
143
|
+
self._set_color(self.GREEN)
|
|
130
144
|
|
|
131
145
|
def red(self):
|
|
132
|
-
self._set_color(self.
|
|
146
|
+
self._set_color(self.RED)
|
|
133
147
|
|
|
134
148
|
def yellow(self):
|
|
135
|
-
self._set_color(self.
|
|
149
|
+
self._set_color(self.YELLOW)
|
|
136
150
|
|
|
137
151
|
def reset(self):
|
|
138
|
-
self._set_color(self.
|
|
152
|
+
self._set_color(self.RESET)
|
|
153
|
+
|
|
154
|
+
def link(self, path):
|
|
155
|
+
return f'\033]8;;file:///{path}\033\\{path}\033]8;;\033\\'
|
|
139
156
|
|
|
140
157
|
def _set_color(self, color):
|
|
141
158
|
self._stream.write(color)
|
|
@@ -143,71 +160,67 @@ class AnsiHighlighter:
|
|
|
143
160
|
|
|
144
161
|
class NoHighlighting(AnsiHighlighter):
|
|
145
162
|
|
|
163
|
+
def link(self, path):
|
|
164
|
+
return path
|
|
165
|
+
|
|
146
166
|
def _set_color(self, color):
|
|
147
167
|
pass
|
|
148
168
|
|
|
149
169
|
|
|
150
170
|
class DosHighlighter:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
_STDOUT_HANDLE = -11
|
|
158
|
-
_STDERR_HANDLE = -12
|
|
171
|
+
FOREGROUND_GREEN = 0x2
|
|
172
|
+
FOREGROUND_RED = 0x4
|
|
173
|
+
FOREGROUND_YELLOW = 0x6
|
|
174
|
+
FOREGROUND_GREY = 0x7
|
|
175
|
+
FOREGROUND_INTENSITY = 0x8
|
|
176
|
+
BACKGROUND_MASK = 0xF0
|
|
159
177
|
|
|
160
178
|
def __init__(self, stream):
|
|
161
|
-
self._handle =
|
|
179
|
+
self._handle = get_std_handle(stream)
|
|
162
180
|
self._orig_colors = self._get_colors()
|
|
163
|
-
self._background = self._orig_colors & self.
|
|
181
|
+
self._background = self._orig_colors & self.BACKGROUND_MASK
|
|
164
182
|
|
|
165
183
|
def green(self):
|
|
166
|
-
self._set_foreground_colors(self.
|
|
184
|
+
self._set_foreground_colors(self.FOREGROUND_GREEN)
|
|
167
185
|
|
|
168
186
|
def red(self):
|
|
169
|
-
self._set_foreground_colors(self.
|
|
187
|
+
self._set_foreground_colors(self.FOREGROUND_RED)
|
|
170
188
|
|
|
171
189
|
def yellow(self):
|
|
172
|
-
self._set_foreground_colors(self.
|
|
190
|
+
self._set_foreground_colors(self.FOREGROUND_YELLOW)
|
|
173
191
|
|
|
174
192
|
def reset(self):
|
|
175
193
|
self._set_colors(self._orig_colors)
|
|
176
194
|
|
|
177
|
-
def
|
|
178
|
-
|
|
179
|
-
if stream is sys.__stdout__ else self._STDERR_HANDLE
|
|
180
|
-
return windll.kernel32.GetStdHandle(handle)
|
|
195
|
+
def link(self, path):
|
|
196
|
+
return path
|
|
181
197
|
|
|
182
198
|
def _get_colors(self):
|
|
183
|
-
|
|
184
|
-
ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(
|
|
199
|
+
info = ConsoleScreenBufferInfo()
|
|
200
|
+
ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(info))
|
|
185
201
|
if not ok: # Call failed, return default console colors (gray on black)
|
|
186
|
-
return self.
|
|
187
|
-
return
|
|
202
|
+
return self.FOREGROUND_GREY
|
|
203
|
+
return info.wAttributes
|
|
188
204
|
|
|
189
205
|
def _set_foreground_colors(self, colors):
|
|
190
|
-
self._set_colors(colors | self.
|
|
206
|
+
self._set_colors(colors | self.FOREGROUND_INTENSITY | self._background)
|
|
191
207
|
|
|
192
208
|
def _set_colors(self, colors):
|
|
193
209
|
windll.kernel32.SetConsoleTextAttribute(self._handle, colors)
|
|
194
210
|
|
|
195
211
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
_fields_ = [("X", c_short),
|
|
200
|
-
("Y", c_short)]
|
|
212
|
+
def get_std_handle(stream):
|
|
213
|
+
handle = -11 if stream is sys.__stdout__ else -12
|
|
214
|
+
return windll.kernel32.GetStdHandle(handle)
|
|
201
215
|
|
|
202
|
-
class _SMALL_RECT(Structure):
|
|
203
|
-
_fields_ = [("Left", c_short),
|
|
204
|
-
("Top", c_short),
|
|
205
|
-
("Right", c_short),
|
|
206
|
-
("Bottom", c_short)]
|
|
207
216
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
217
|
+
def virtual_terminal_enabled(stream):
|
|
218
|
+
handle = get_std_handle(stream)
|
|
219
|
+
enable_vt = 0x0004
|
|
220
|
+
mode = DWORD()
|
|
221
|
+
if not windll.kernel32.GetConsoleMode(handle, byref(mode)):
|
|
222
|
+
return False # Calling GetConsoleMode failed.
|
|
223
|
+
if mode.value & enable_vt:
|
|
224
|
+
return True # VT already enabled.
|
|
225
|
+
# Try to enable VT.
|
|
226
|
+
return windll.kernel32.SetConsoleMode(handle, mode.value | enable_vt) != 0
|
|
@@ -67,7 +67,7 @@ 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:
|
|
@@ -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
|
|
|
@@ -56,8 +56,8 @@ class Logger(AbstractLogger):
|
|
|
56
56
|
self._console_logger = None
|
|
57
57
|
self._syslog = None
|
|
58
58
|
self._xml_logger = None
|
|
59
|
-
self.
|
|
60
|
-
self.
|
|
59
|
+
self._cli_listeners = None
|
|
60
|
+
self._lib_listeners = None
|
|
61
61
|
self._other_loggers = []
|
|
62
62
|
self._message_cache = []
|
|
63
63
|
self._log_message_cache = None
|
|
@@ -70,17 +70,25 @@ class Logger(AbstractLogger):
|
|
|
70
70
|
if register_console_logger:
|
|
71
71
|
self.register_console_logger()
|
|
72
72
|
|
|
73
|
+
@property
|
|
74
|
+
def _listeners(self):
|
|
75
|
+
cli_listeners = list(self._cli_listeners or [])
|
|
76
|
+
lib_listeners = list(self._lib_listeners or [])
|
|
77
|
+
return sorted(cli_listeners + lib_listeners, key=lambda li: -li.priority)
|
|
78
|
+
|
|
73
79
|
@property
|
|
74
80
|
def start_loggers(self):
|
|
75
|
-
loggers =
|
|
76
|
-
self.
|
|
77
|
-
|
|
81
|
+
loggers = (self._other_loggers
|
|
82
|
+
+ [self._console_logger, self._syslog, self._xml_logger]
|
|
83
|
+
+ self._listeners)
|
|
84
|
+
return [logger for logger in loggers if logger]
|
|
78
85
|
|
|
79
86
|
@property
|
|
80
87
|
def end_loggers(self):
|
|
81
|
-
loggers =
|
|
82
|
-
self._console_logger, self._syslog, self._xml_logger]
|
|
83
|
-
|
|
88
|
+
loggers = (self._listeners
|
|
89
|
+
+ [self._console_logger, self._syslog, self._xml_logger]
|
|
90
|
+
+ self._other_loggers)
|
|
91
|
+
return [logger for logger in loggers if logger]
|
|
84
92
|
|
|
85
93
|
def __iter__(self):
|
|
86
94
|
return iter(self.end_loggers)
|
|
@@ -132,10 +140,10 @@ class Logger(AbstractLogger):
|
|
|
132
140
|
self._xml_logger = None
|
|
133
141
|
|
|
134
142
|
def register_listeners(self, listeners, library_listeners):
|
|
135
|
-
self.
|
|
136
|
-
self.
|
|
137
|
-
|
|
138
|
-
self._relay_cached_messages(
|
|
143
|
+
self._cli_listeners = listeners
|
|
144
|
+
self._lib_listeners = library_listeners
|
|
145
|
+
for listener in listeners or ():
|
|
146
|
+
self._relay_cached_messages(listener)
|
|
139
147
|
|
|
140
148
|
def register_logger(self, *loggers):
|
|
141
149
|
for logger in loggers:
|
|
@@ -398,9 +406,17 @@ class Logger(AbstractLogger):
|
|
|
398
406
|
for logger in self.end_loggers:
|
|
399
407
|
logger.end_error(data, result)
|
|
400
408
|
|
|
401
|
-
def
|
|
409
|
+
def library_import(self, library, importer):
|
|
410
|
+
for logger in self:
|
|
411
|
+
logger.library_import(library, importer)
|
|
412
|
+
|
|
413
|
+
def resource_import(self, resource, importer):
|
|
414
|
+
for logger in self:
|
|
415
|
+
logger.resource_import(resource, importer)
|
|
416
|
+
|
|
417
|
+
def variables_import(self, variables, importer):
|
|
402
418
|
for logger in self:
|
|
403
|
-
logger.
|
|
419
|
+
logger.variables_import(variables, importer)
|
|
404
420
|
|
|
405
421
|
def output_file(self, path):
|
|
406
422
|
for logger in self:
|