robotframework 7.1rc2__zip → 7.2b1__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.1rc2 → robotframework-7.2b1}/BUILD.rst +7 -7
- {robotframework-7.1rc2 → robotframework-7.2b1}/PKG-INFO +2 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/setup.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/__init__.py +33 -9
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/deco.py +8 -6
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/interfaces.py +66 -15
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/parsing.py +72 -68
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/languages.py +4 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/settings.py +11 -10
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/errors.py +3 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/htmlfilewriter.py +3 -0
- robotframework-7.2b1/src/robot/htmldata/libdoc/libdoc.html +408 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/log.html +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/report.html +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/testdata.js +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/template.py +0 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdoc.py +19 -11
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/htmlwriter.py +7 -4
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/model.py +7 -5
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/writer.py +2 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/BuiltIn.py +121 -32
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Collections.py +20 -7
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/__init__.py +3 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/body.py +48 -57
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/control.py +35 -4
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/message.py +13 -8
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/modelobject.py +26 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/statistics.py +13 -9
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/stats.py +12 -14
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/suitestatistics.py +8 -9
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/tags.py +10 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/tagstatistics.py +7 -8
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/testcase.py +1 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/testsuite.py +1 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/totalstatistics.py +14 -21
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/visitor.py +29 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/__init__.py +3 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/dotted.py +6 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/highlighting.py +18 -10
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/debugfile.py +3 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/filelogger.py +7 -3
- robotframework-7.2b1/src/robot/output/jsonlogger.py +338 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/librarylogger.py +12 -11
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/listeners.py +49 -47
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/logger.py +33 -20
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/loggerapi.py +6 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/loggerhelper.py +29 -57
- robotframework-7.2b1/src/robot/output/loglevel.py +54 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/output.py +21 -17
- robotframework-7.2b1/src/robot/output/outputfile.py +174 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/pyloggingconf.py +2 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/xmllogger.py +40 -169
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/blocklexers.py +25 -12
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/statementlexers.py +16 -7
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/tokens.py +2 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/__init__.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/blocks.py +34 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/statements.py +32 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/blockparsers.py +7 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/rebot.py +10 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jsmodelbuilders.py +1 -1
- robotframework-7.2b1/src/robot/reporting/outputwriter.py +30 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/__init__.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/executionerrors.py +9 -9
- robotframework-7.2b1/src/robot/result/executionresult.py +331 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/messagefilter.py +14 -10
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/model.py +90 -18
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/resultbuilder.py +2 -5
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/xmlelementhandlers.py +20 -9
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/run.py +18 -6
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/__init__.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/embedded.py +7 -6
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typeconverters.py +14 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typeinfo.py +23 -4
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/bodyrunner.py +41 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/settings.py +2 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/transformers.py +46 -20
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/context.py +22 -11
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/librarykeyword.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/librarykeywordrunner.py +29 -23
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/model.py +31 -4
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/outputcapture.py +2 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/signalhandler.py +7 -3
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/status.py +49 -38
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/statusreporter.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/suiterunner.py +22 -15
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/userkeywordrunner.py +4 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/importer.py +39 -23
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/unic.py +7 -8
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/evaluation.py +21 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/replacer.py +20 -24
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/scopes.py +19 -9
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/variables.py +4 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/version.py +1 -1
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/PKG-INFO +2 -2
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/SOURCES.txt +3 -4
- robotframework-7.1rc2/src/robot/htmldata/libdoc/doc_formatting.css +0 -74
- robotframework-7.1rc2/src/robot/htmldata/libdoc/libdoc.css +0 -747
- robotframework-7.1rc2/src/robot/htmldata/libdoc/libdoc.html +0 -702
- robotframework-7.1rc2/src/robot/htmldata/libdoc/print.css +0 -11
- robotframework-7.1rc2/src/robot/htmldata/libdoc/pygments.css +0 -162
- robotframework-7.1rc2/src/robot/reporting/outputwriter.py +0 -48
- robotframework-7.1rc2/src/robot/result/executionresult.py +0 -201
- {robotframework-7.1rc2 → robotframework-7.2b1}/AUTHORS.rst +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/CONTRIBUTING.rst +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/COPYRIGHT.txt +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/INSTALL.rst +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/LICENSE.txt +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/MANIFEST.in +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/README.rst +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/setup.cfg +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/__main__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/exceptions.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/logger.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/py.typed +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/gatherfailed.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/log.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/model.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/builder.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/datatypes.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/htmlutils.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/jsonbuilder.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/robotbuilder.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/standardtypes.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/xmlwriter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/DateTime.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Easter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/OperatingSystem.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Process.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Remote.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/String.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/XML.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/dialogs_py.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/configurer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/filter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/fixture.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/itemlist.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/keyword.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/metadata.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/modifier.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/namepatterns.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/tagsetter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/quiet.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/verbose.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/stdoutlogsplitter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/context.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/lexer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/settings.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/visitor.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jsbuildingcontext.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/stringcache.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/xunitwriter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/configurer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/flattenkeywordmatcher.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/keywordremover.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/merger.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/modeldeprecation.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/visitor.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentconverter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentmapper.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentparser.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentresolver.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentspec.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentvalidator.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/customconverters.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typeinfoparser.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typevalidator.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/builders.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/parsers.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/importer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/invalidkeyword.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/keywordfinder.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/keywordimplementation.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/namespace.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/randomizer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/resourcemodel.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/runkwregister.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/testlibraries.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/nosupport.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/testdoc.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/application.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/asserts.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/charwidth.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/compress.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/connectioncache.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/dotdict.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/encoding.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/encodingsniffer.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/error.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/escaping.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/filereader.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/frange.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/markuputils.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/markupwriters.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/match.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/misc.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/normalizing.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/notset.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/platform.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/recommendations.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/restreader.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotenv.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotio.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotpath.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robottime.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robottypes.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/setter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/sortable.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/text.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/typehints.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/__init__.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/assigner.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/filesetter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/finders.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/notfound.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/resolvable.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/search.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/store.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/tablesetter.py +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/top_level.txt +0 -0
- {robotframework-7.1rc2 → robotframework-7.2b1}/tasks.py +0 -0
|
@@ -131,7 +131,7 @@ function addExecutionLog(main) {
|
|
|
131
131
|
|
|
132
132
|
<script type="text/x-jquery-tmpl" id="tagStatisticsRowTemplate">
|
|
133
133
|
<tr class="row-${$item.index}">
|
|
134
|
-
<td class="stats-col-name" title="{
|
|
134
|
+
<td class="stats-col-name" title="${doc}">
|
|
135
135
|
<div class="stat-name">
|
|
136
136
|
<span>{{html label}}</span>
|
|
137
137
|
{{if info}}(${info}){{/if}}
|
|
@@ -467,7 +467,7 @@ function hideHiddenDetailsColumns(elem) {
|
|
|
467
467
|
|
|
468
468
|
<script type="text/x-jquery-tmpl" id="tagStatisticsRowTemplate">
|
|
469
469
|
<tr onclick="tagDetailSelected('${label}')" class="row-${$item.index}">
|
|
470
|
-
<td class="stats-col-name" title="{
|
|
470
|
+
<td class="stats-col-name" title="${doc}">
|
|
471
471
|
<div class="stat-name">
|
|
472
472
|
<a href="#tags?${label}">{{html label}}</a>
|
|
473
473
|
{{if info}}(${info}){{/if}}
|
|
@@ -7,7 +7,7 @@ window.testdata = function () {
|
|
|
7
7
|
var STATUSES = ['FAIL', 'PASS', 'SKIP', 'NOT RUN'];
|
|
8
8
|
var KEYWORD_TYPES = ['KEYWORD', 'SETUP', 'TEARDOWN', 'FOR', 'ITERATION', 'IF',
|
|
9
9
|
'ELSE IF', 'ELSE', 'RETURN', 'VAR', 'TRY', 'EXCEPT', 'FINALLY',
|
|
10
|
-
'WHILE', 'CONTINUE', 'BREAK', 'ERROR'];
|
|
10
|
+
'WHILE', 'GROUP', 'CONTINUE', 'BREAK', 'ERROR'];
|
|
11
11
|
|
|
12
12
|
function addElement(elem) {
|
|
13
13
|
if (!elem.id)
|
|
@@ -20,8 +20,6 @@ from pathlib import Path
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
if sys.version_info < (3, 9) and not Path(__file__).exists(): # zipsafe
|
|
23
|
-
# `importlib.resources.files` is new in Python 3.9, but that version does
|
|
24
|
-
# not seem to be compatible with zipapp.
|
|
25
23
|
try:
|
|
26
24
|
from importlib_resources import files
|
|
27
25
|
except ImportError:
|
|
@@ -67,9 +67,6 @@ the normal installation. Alternatively it is possible to execute the
|
|
|
67
67
|
can be replaced with any supported Python interpreter. Yet another alternative
|
|
68
68
|
is running the module as a script like `python path/to/robot/libdoc.py`.
|
|
69
69
|
|
|
70
|
-
The separate `libdoc` command and the support for JSON spec files are new in
|
|
71
|
-
Robot Framework 4.0.
|
|
72
|
-
|
|
73
70
|
Options
|
|
74
71
|
=======
|
|
75
72
|
|
|
@@ -85,7 +82,7 @@ Options
|
|
|
85
82
|
documentation format and HTML means converting
|
|
86
83
|
documentation to HTML. The default is RAW with XML
|
|
87
84
|
spec files and HTML with JSON specs and when using
|
|
88
|
-
the special LIBSPEC format.
|
|
85
|
+
the special LIBSPEC format.
|
|
89
86
|
-F --docformat ROBOT|HTML|TEXT|REST
|
|
90
87
|
Specifies the source documentation format. Possible
|
|
91
88
|
values are Robot Framework's documentation format,
|
|
@@ -96,11 +93,14 @@ Options
|
|
|
96
93
|
Use dark or light HTML theme. If this option is not
|
|
97
94
|
used, or the value is NONE, the theme is selected
|
|
98
95
|
based on the browser color scheme. New in RF 6.0.
|
|
96
|
+
--language lang Set the default language in documentation. `lang`
|
|
97
|
+
must be a code of a built-in language, which are
|
|
98
|
+
`en` and `fi`. New in RF 7.2.
|
|
99
99
|
-n --name name Sets the name of the documented library or resource.
|
|
100
100
|
-v --version version Sets the version of the documented library or
|
|
101
101
|
resource.
|
|
102
102
|
--quiet Do not print the path of the generated output file
|
|
103
|
-
to the console.
|
|
103
|
+
to the console.
|
|
104
104
|
-P --pythonpath path * Additional locations where to search for libraries
|
|
105
105
|
and resources.
|
|
106
106
|
-h -? --help Print this help.
|
|
@@ -179,7 +179,7 @@ class LibDoc(Application):
|
|
|
179
179
|
return options, arguments
|
|
180
180
|
|
|
181
181
|
def main(self, args, name='', version='', format=None, docformat=None,
|
|
182
|
-
specdocformat=None, theme=None, pythonpath=None, quiet=False):
|
|
182
|
+
specdocformat=None, theme=None, language=None, pythonpath=None, quiet=False):
|
|
183
183
|
if pythonpath:
|
|
184
184
|
sys.path = pythonpath + sys.path
|
|
185
185
|
lib_or_res, output = args[:2]
|
|
@@ -194,7 +194,8 @@ class LibDoc(Application):
|
|
|
194
194
|
or specdocformat == 'HTML'
|
|
195
195
|
or format in ('JSON', 'LIBSPEC') and specdocformat != 'RAW'):
|
|
196
196
|
libdoc.convert_docs_to_html()
|
|
197
|
-
libdoc.save(output, format, self._validate_theme(theme, format)
|
|
197
|
+
libdoc.save(output, format, self._validate_theme(theme, format),
|
|
198
|
+
self._validate_lang(language, format))
|
|
198
199
|
if not quiet:
|
|
199
200
|
self.console(Path(output).absolute())
|
|
200
201
|
|
|
@@ -229,13 +230,21 @@ class LibDoc(Application):
|
|
|
229
230
|
raise DataError("The --theme option is only applicable with HTML outputs.")
|
|
230
231
|
return theme
|
|
231
232
|
|
|
233
|
+
def _validate_lang(self, lang, format):
|
|
234
|
+
theme = self._validate('Language', lang, 'FI', 'EN', 'NONE')
|
|
235
|
+
if not theme or theme == 'NONE':
|
|
236
|
+
return None
|
|
237
|
+
if format != 'HTML':
|
|
238
|
+
raise DataError("The --theme option is only applicable with HTML outputs.")
|
|
239
|
+
return theme
|
|
240
|
+
|
|
232
241
|
|
|
233
242
|
def libdoc_cli(arguments=None, exit=True):
|
|
234
243
|
"""Executes Libdoc similarly as from the command line.
|
|
235
244
|
|
|
236
245
|
:param arguments: Command line options and arguments as a list of strings.
|
|
237
|
-
|
|
238
|
-
:param exit: If ``True``, call ``sys.exit`` automatically.
|
|
246
|
+
Defaults to ``sys.argv[1:]`` if not given.
|
|
247
|
+
:param exit: If ``True``, call ``sys.exit`` automatically.
|
|
239
248
|
|
|
240
249
|
The :func:`libdoc` function may work better in programmatic usage.
|
|
241
250
|
|
|
@@ -271,9 +280,8 @@ def libdoc(library_or_resource, outfile, name='', version='', format=None,
|
|
|
271
280
|
files is converted to HTML regardless of the original documentation
|
|
272
281
|
format. Possible values are ``'HTML'`` (convert to HTML) and ``'RAW'``
|
|
273
282
|
(use original format). The default depends on the output format.
|
|
274
|
-
New in Robot Framework 4.0.
|
|
275
283
|
:param quiet: When true, the path of the generated output file is not
|
|
276
|
-
printed the console.
|
|
284
|
+
printed the console.
|
|
277
285
|
|
|
278
286
|
Arguments have same semantics as Libdoc command line options with same names.
|
|
279
287
|
Run ``libdoc --help`` or consult the Libdoc section in the Robot Framework
|
|
@@ -18,23 +18,26 @@ from robot.htmldata import HtmlFileWriter, ModelWriter, LIBDOC
|
|
|
18
18
|
|
|
19
19
|
class LibdocHtmlWriter:
|
|
20
20
|
|
|
21
|
-
def __init__(self, theme=None):
|
|
21
|
+
def __init__(self, theme=None, lang=None):
|
|
22
22
|
self.theme = theme
|
|
23
|
+
self.lang = lang
|
|
23
24
|
|
|
24
25
|
def write(self, libdoc, output):
|
|
25
|
-
model_writer = LibdocModelWriter(output, libdoc, self.theme)
|
|
26
|
+
model_writer = LibdocModelWriter(output, libdoc, self.theme, self.lang)
|
|
26
27
|
HtmlFileWriter(output, model_writer).write(LIBDOC)
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
class LibdocModelWriter(ModelWriter):
|
|
30
31
|
|
|
31
|
-
def __init__(self, output, libdoc, theme=None):
|
|
32
|
+
def __init__(self, output, libdoc, theme=None, lang=None):
|
|
32
33
|
self.output = output
|
|
33
34
|
self.libdoc = libdoc
|
|
34
35
|
self.theme = theme
|
|
36
|
+
self.lang = lang
|
|
35
37
|
|
|
36
38
|
def write(self, line):
|
|
37
|
-
data = self.libdoc.to_json(include_private=False, theme=self.theme
|
|
39
|
+
data = self.libdoc.to_json(include_private=False, theme=self.theme,
|
|
40
|
+
lang=self.lang)
|
|
38
41
|
self.output.write(f'<script type="text/javascript">\n'
|
|
39
42
|
f'libdoc = {data}\n'
|
|
40
43
|
f'</script>\n')
|
|
@@ -89,9 +89,9 @@ class LibraryDoc:
|
|
|
89
89
|
def all_tags(self):
|
|
90
90
|
return Tags(chain.from_iterable(kw.tags for kw in self.keywords))
|
|
91
91
|
|
|
92
|
-
def save(self, output=None, format='HTML', theme=None):
|
|
92
|
+
def save(self, output=None, format='HTML', theme=None, lang=None):
|
|
93
93
|
with LibdocOutput(output, format) as outfile:
|
|
94
|
-
LibdocWriter(format, theme).write(self, outfile)
|
|
94
|
+
LibdocWriter(format, theme, lang).write(self, outfile)
|
|
95
95
|
|
|
96
96
|
def convert_docs_to_html(self):
|
|
97
97
|
formatter = DocFormatter(self.keywords, self.type_docs, self.doc, self.doc_format)
|
|
@@ -111,7 +111,7 @@ class LibraryDoc:
|
|
|
111
111
|
type_doc.doc = formatter.html(type_doc.doc)
|
|
112
112
|
self.doc_format = 'HTML'
|
|
113
113
|
|
|
114
|
-
def to_dictionary(self, include_private=False, theme=None):
|
|
114
|
+
def to_dictionary(self, include_private=False, theme=None, lang=None):
|
|
115
115
|
data = {
|
|
116
116
|
'specversion': 3,
|
|
117
117
|
'name': self.name,
|
|
@@ -131,10 +131,12 @@ class LibraryDoc:
|
|
|
131
131
|
}
|
|
132
132
|
if theme:
|
|
133
133
|
data['theme'] = theme.lower()
|
|
134
|
+
if lang:
|
|
135
|
+
data['lang'] = lang.lower()
|
|
134
136
|
return data
|
|
135
137
|
|
|
136
|
-
def to_json(self, indent=None, include_private=True, theme=None):
|
|
137
|
-
data = self.to_dictionary(include_private, theme)
|
|
138
|
+
def to_json(self, indent=None, include_private=True, theme=None, lang=None):
|
|
139
|
+
data = self.to_dictionary(include_private, theme, lang)
|
|
138
140
|
return json.dumps(data, indent=indent)
|
|
139
141
|
|
|
140
142
|
|
|
@@ -20,10 +20,10 @@ from .xmlwriter import LibdocXmlWriter
|
|
|
20
20
|
from .jsonwriter import LibdocJsonWriter
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
def LibdocWriter(format=None, theme=None):
|
|
23
|
+
def LibdocWriter(format=None, theme=None, lang=None):
|
|
24
24
|
format = (format or 'HTML')
|
|
25
25
|
if format == 'HTML':
|
|
26
|
-
return LibdocHtmlWriter(theme)
|
|
26
|
+
return LibdocHtmlWriter(theme, lang)
|
|
27
27
|
if format == 'XML':
|
|
28
28
|
return LibdocXmlWriter()
|
|
29
29
|
if format == 'LIBSPEC':
|
|
@@ -24,7 +24,7 @@ from robot.api.deco import keyword
|
|
|
24
24
|
from robot.errors import (BreakLoop, ContinueLoop, DataError, ExecutionFailed,
|
|
25
25
|
ExecutionFailures, ExecutionPassed, PassExecution,
|
|
26
26
|
ReturnFromKeyword, VariableError)
|
|
27
|
-
from robot.running import Keyword, RUN_KW_REGISTER
|
|
27
|
+
from robot.running import Keyword, RUN_KW_REGISTER, TypeInfo
|
|
28
28
|
from robot.running.context import EXECUTION_CONTEXTS
|
|
29
29
|
from robot.utils import (DotDict, escape, format_assign_message, get_error_message,
|
|
30
30
|
get_time, html_escape, is_falsy, is_integer, is_list_like,
|
|
@@ -341,8 +341,8 @@ class _Converter(_BuiltInBase):
|
|
|
341
341
|
- ``text:`` Converts text to bytes character by character. All
|
|
342
342
|
characters with ordinal below 256 can be used and are converted to
|
|
343
343
|
bytes with same values. Many characters are easiest to represent
|
|
344
|
-
using escapes like ``\x00`` or ``\xff``.
|
|
345
|
-
|
|
344
|
+
using escapes like ``\x00`` or ``\xff``. In practice this is the same
|
|
345
|
+
as Latin-1 encoding.
|
|
346
346
|
|
|
347
347
|
- ``int:`` Converts integers separated by spaces to bytes. Similarly as
|
|
348
348
|
with `Convert To Integer`, it is possible to use binary, octal, or
|
|
@@ -380,10 +380,10 @@ class _Converter(_BuiltInBase):
|
|
|
380
380
|
"""
|
|
381
381
|
try:
|
|
382
382
|
try:
|
|
383
|
-
|
|
383
|
+
get_ordinals = getattr(self, f'_get_ordinals_from_{input_type}')
|
|
384
384
|
except AttributeError:
|
|
385
385
|
raise RuntimeError(f"Invalid input type '{input_type}'.")
|
|
386
|
-
return bytes(
|
|
386
|
+
return bytes(o for o in get_ordinals(input))
|
|
387
387
|
except:
|
|
388
388
|
raise RuntimeError("Creating bytes failed: " + get_error_message())
|
|
389
389
|
|
|
@@ -583,8 +583,8 @@ class _Verify(_BuiltInBase):
|
|
|
583
583
|
|
|
584
584
|
def should_be_equal(self, first, second, msg=None, values=True,
|
|
585
585
|
ignore_case=False, formatter='str', strip_spaces=False,
|
|
586
|
-
collapse_spaces=False):
|
|
587
|
-
"""Fails if the given objects are unequal.
|
|
586
|
+
collapse_spaces=False, type=None, types=None):
|
|
587
|
+
r"""Fails if the given objects are unequal.
|
|
588
588
|
|
|
589
589
|
Optional ``msg``, ``values`` and ``formatter`` arguments specify how
|
|
590
590
|
to construct the error message if this keyword fails:
|
|
@@ -614,15 +614,33 @@ class _Verify(_BuiltInBase):
|
|
|
614
614
|
arguments are strings, the comparison is done with all white spaces replaced by
|
|
615
615
|
a single space character.
|
|
616
616
|
|
|
617
|
+
The ``type`` and ``types`` arguments control optional type conversion:
|
|
618
|
+
- If ``type`` is used, the argument ``second`` is converted to that type.
|
|
619
|
+
In addition to that, the argument ``first`` is validated to match the type.
|
|
620
|
+
- If ``types`` is used, both ``first`` and ``second`` are converted.
|
|
621
|
+
- Supported types are the same as supported by
|
|
622
|
+
[https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#supported-conversions|
|
|
623
|
+
automatic argument conversion] such as ``int``, ``bytes`` and ``list``.
|
|
624
|
+
Also parameterized types like ``list[int]`` and unions like ``int | float``
|
|
625
|
+
are supported.
|
|
626
|
+
- When using ``type``, a special value ``auto`` can be used to convert
|
|
627
|
+
``second`` to the same type that ``first`` has.
|
|
628
|
+
- Using both ``type`` and ``types`` at the same time is an error.
|
|
629
|
+
|
|
617
630
|
Examples:
|
|
618
631
|
| Should Be Equal | ${x} | expected |
|
|
619
632
|
| Should Be Equal | ${x} | expected | Custom error message |
|
|
620
633
|
| Should Be Equal | ${x} | expected | Custom message | values=False |
|
|
621
634
|
| Should Be Equal | ${x} | expected | ignore_case=True | formatter=repr |
|
|
635
|
+
| Should Be Equal | ${x} | \x00\x01 | type=bytes |
|
|
636
|
+
| Should Be Equal | ${x} | ${y} | types=int|float |
|
|
622
637
|
|
|
623
638
|
``strip_spaces`` is new in Robot Framework 4.0 and
|
|
624
639
|
``collapse_spaces`` is new in Robot Framework 4.1.
|
|
640
|
+
``type`` and ``types`` are new in Robot Framework 7.2.
|
|
625
641
|
"""
|
|
642
|
+
if type or types:
|
|
643
|
+
first, second = self._type_convert(first, second, type, types)
|
|
626
644
|
self._log_types_at_info_if_different(first, second)
|
|
627
645
|
if is_string(first) and is_string(second):
|
|
628
646
|
if ignore_case:
|
|
@@ -636,6 +654,21 @@ class _Verify(_BuiltInBase):
|
|
|
636
654
|
second = self._collapse_spaces(second)
|
|
637
655
|
self._should_be_equal(first, second, msg, values, formatter)
|
|
638
656
|
|
|
657
|
+
def _type_convert(self, first, second, type, types, type_builtin=type):
|
|
658
|
+
if type and types:
|
|
659
|
+
raise TypeError("Cannot use both 'type' and 'types' arguments.")
|
|
660
|
+
elif types:
|
|
661
|
+
type = types
|
|
662
|
+
elif isinstance(type, str) and type.upper() == 'AUTO':
|
|
663
|
+
type = type_builtin(first)
|
|
664
|
+
converter = TypeInfo.from_type_hint(type).get_converter()
|
|
665
|
+
if types:
|
|
666
|
+
first = converter.convert(first, 'first')
|
|
667
|
+
elif not converter.no_conversion_needed(first):
|
|
668
|
+
raise ValueError(f"Argument 'first' got value {first!r} that "
|
|
669
|
+
f"does not match type {type!r}.")
|
|
670
|
+
return first, converter.convert(second, 'second')
|
|
671
|
+
|
|
639
672
|
def _should_be_equal(self, first, second, msg, values, formatter='str'):
|
|
640
673
|
include_values = self._include_values(values)
|
|
641
674
|
formatter = self._get_formatter(formatter)
|
|
@@ -1527,8 +1560,12 @@ class _Variables(_BuiltInBase):
|
|
|
1527
1560
|
For the reasons explained in the `Using variables with keywords creating
|
|
1528
1561
|
or accessing variables` section, using the escaped format is recommended.
|
|
1529
1562
|
|
|
1563
|
+
Notice that ``default`` must be given positionally like ``example`` and
|
|
1564
|
+
not using the named-argument syntax like ``default=example``. We hope to
|
|
1565
|
+
be able to remove this limitation in the future.
|
|
1566
|
+
|
|
1530
1567
|
Examples:
|
|
1531
|
-
| ${x} = `Get Variable Value` $a
|
|
1568
|
+
| ${x} = `Get Variable Value` $a example
|
|
1532
1569
|
| ${y} = `Get Variable Value` $a ${b}
|
|
1533
1570
|
| ${z} = `Get Variable Value` $z
|
|
1534
1571
|
=>
|
|
@@ -1567,7 +1604,7 @@ class _Variables(_BuiltInBase):
|
|
|
1567
1604
|
return name, value
|
|
1568
1605
|
|
|
1569
1606
|
@run_keyword_variant(resolve=0)
|
|
1570
|
-
def variable_should_exist(self, name,
|
|
1607
|
+
def variable_should_exist(self, name, message=None):
|
|
1571
1608
|
r"""Fails unless the given variable exists within the current scope.
|
|
1572
1609
|
|
|
1573
1610
|
The name of the variable can be given either as a normal variable name
|
|
@@ -1575,7 +1612,10 @@ class _Variables(_BuiltInBase):
|
|
|
1575
1612
|
For the reasons explained in the `Using variables with keywords creating
|
|
1576
1613
|
or accessing variables` section, using the escaped format is recommended.
|
|
1577
1614
|
|
|
1578
|
-
The default error message can be overridden with the ``
|
|
1615
|
+
The default error message can be overridden with the ``message`` argument.
|
|
1616
|
+
Notice that it must be given positionally like ``A message`` and not
|
|
1617
|
+
using the named-argument syntax like ``message=A message``. We hope to
|
|
1618
|
+
be able to remove this limitation in the future.
|
|
1579
1619
|
|
|
1580
1620
|
See also `Variable Should Not Exist` and `Keyword Should Exist`.
|
|
1581
1621
|
"""
|
|
@@ -1583,11 +1623,11 @@ class _Variables(_BuiltInBase):
|
|
|
1583
1623
|
try:
|
|
1584
1624
|
self._variables.replace_scalar(name)
|
|
1585
1625
|
except VariableError:
|
|
1586
|
-
raise AssertionError(self._variables.replace_string(
|
|
1587
|
-
if
|
|
1626
|
+
raise AssertionError(self._variables.replace_string(message)
|
|
1627
|
+
if message else f"Variable '{name}' does not exist.")
|
|
1588
1628
|
|
|
1589
1629
|
@run_keyword_variant(resolve=0)
|
|
1590
|
-
def variable_should_not_exist(self, name,
|
|
1630
|
+
def variable_should_not_exist(self, name, message=None):
|
|
1591
1631
|
r"""Fails if the given variable exists within the current scope.
|
|
1592
1632
|
|
|
1593
1633
|
The name of the variable can be given either as a normal variable name
|
|
@@ -1595,7 +1635,10 @@ class _Variables(_BuiltInBase):
|
|
|
1595
1635
|
For the reasons explained in the `Using variables with keywords creating
|
|
1596
1636
|
or accessing variables` section, using the escaped format is recommended.
|
|
1597
1637
|
|
|
1598
|
-
The default error message can be overridden with the ``
|
|
1638
|
+
The default error message can be overridden with the ``message`` argument.
|
|
1639
|
+
Notice that it must be given positionally like ``A message`` and not
|
|
1640
|
+
using the named-argument syntax like ``message=A message``. We hope to
|
|
1641
|
+
be able to remove this limitation in the future.
|
|
1599
1642
|
|
|
1600
1643
|
See also `Variable Should Exist` and `Keyword Should Exist`.
|
|
1601
1644
|
"""
|
|
@@ -1605,8 +1648,8 @@ class _Variables(_BuiltInBase):
|
|
|
1605
1648
|
except VariableError:
|
|
1606
1649
|
pass
|
|
1607
1650
|
else:
|
|
1608
|
-
raise AssertionError(self._variables.replace_string(
|
|
1609
|
-
if
|
|
1651
|
+
raise AssertionError(self._variables.replace_string(message)
|
|
1652
|
+
if message else f"Variable '{name}' exists.")
|
|
1610
1653
|
|
|
1611
1654
|
def replace_variables(self, text):
|
|
1612
1655
|
"""Replaces variables in the given text with their current values.
|
|
@@ -1710,8 +1753,12 @@ class _Variables(_BuiltInBase):
|
|
|
1710
1753
|
variable in a user keyword, it is available both in the test case level
|
|
1711
1754
|
and also in all other user keywords used in the current test. Other
|
|
1712
1755
|
test cases will not see variables set with this keyword.
|
|
1713
|
-
|
|
1714
|
-
|
|
1756
|
+
|
|
1757
|
+
If `Set Test Variable` is used in suite setup, the variable is available
|
|
1758
|
+
everywhere within that suite setup as well as in the corresponding suite
|
|
1759
|
+
teardown, but it is not seen by tests or possible child suites. If the
|
|
1760
|
+
keyword is used in a suite teardown, the variable is available only in that
|
|
1761
|
+
teardown.
|
|
1715
1762
|
|
|
1716
1763
|
See `Set Suite Variable` for more information and usage examples. See
|
|
1717
1764
|
also the `Using variables with keywords creating or accessing variables`
|
|
@@ -1724,6 +1771,9 @@ class _Variables(_BuiltInBase):
|
|
|
1724
1771
|
|
|
1725
1772
|
*NOTE:* The ``VAR`` syntax introduced in Robot Framework 7.0 is recommended
|
|
1726
1773
|
over this keyword.
|
|
1774
|
+
|
|
1775
|
+
*NOTE:* Prior to Robot Framework 7.2, using `Set Test Variable` in a suite
|
|
1776
|
+
setup or teardown was an error.
|
|
1727
1777
|
"""
|
|
1728
1778
|
name = self._get_var_name(name)
|
|
1729
1779
|
value = self._get_var_value(name, values)
|
|
@@ -1914,7 +1964,7 @@ class _RunKeyword(_BuiltInBase):
|
|
|
1914
1964
|
if not (ctx.dry_run or self._accepts_embedded_arguments(name, ctx)):
|
|
1915
1965
|
name, args = self._replace_variables_in_name([name] + list(args))
|
|
1916
1966
|
if ctx.steps:
|
|
1917
|
-
data, result = ctx.steps[-1]
|
|
1967
|
+
data, result, _ = ctx.steps[-1]
|
|
1918
1968
|
lineno = data.lineno
|
|
1919
1969
|
else: # Called, typically by a listener, when no keyword started.
|
|
1920
1970
|
data = lineno = None
|
|
@@ -2415,6 +2465,7 @@ class _RunKeyword(_BuiltInBase):
|
|
|
2415
2465
|
try:
|
|
2416
2466
|
return self.run_keyword(name, *args)
|
|
2417
2467
|
except ExecutionFailed as err:
|
|
2468
|
+
self._reset_keyword_timeout_in_teardown(err, self._context)
|
|
2418
2469
|
if err.dont_continue or err.skip:
|
|
2419
2470
|
raise
|
|
2420
2471
|
count -= 1
|
|
@@ -2434,6 +2485,17 @@ class _RunKeyword(_BuiltInBase):
|
|
|
2434
2485
|
)
|
|
2435
2486
|
self._sleep_in_parts(sleep_time)
|
|
2436
2487
|
|
|
2488
|
+
def _reset_keyword_timeout_in_teardown(self, err, context):
|
|
2489
|
+
# Keyword timeouts in teardowns have been converted to normal failures
|
|
2490
|
+
# to allow execution to continue on higher level:
|
|
2491
|
+
# https://github.com/robotframework/robotframework/issues/3398
|
|
2492
|
+
# We need to reset it here to not continue unnecessarily:
|
|
2493
|
+
# https://github.com/robotframework/robotframework/issues/5237
|
|
2494
|
+
if context.in_teardown:
|
|
2495
|
+
timeouts = [t for t in context.timeouts if t.type == 'Keyword']
|
|
2496
|
+
if timeouts and min(timeouts).timed_out():
|
|
2497
|
+
err.keyword_timeout = True
|
|
2498
|
+
|
|
2437
2499
|
@run_keyword_variant(resolve=1)
|
|
2438
2500
|
def set_variable_if(self, condition, *values):
|
|
2439
2501
|
"""Sets variable based on the given condition.
|
|
@@ -3550,12 +3612,16 @@ class _Misc(_BuiltInBase):
|
|
|
3550
3612
|
return re.escape(patterns[0])
|
|
3551
3613
|
return [re.escape(p) for p in patterns]
|
|
3552
3614
|
|
|
3553
|
-
def set_test_message(self, message, append=False):
|
|
3615
|
+
def set_test_message(self, message, append=False, separator=' '):
|
|
3554
3616
|
"""Sets message for the current test case.
|
|
3555
3617
|
|
|
3556
3618
|
If the optional ``append`` argument is given a true value (see `Boolean
|
|
3557
3619
|
arguments`), the given ``message`` is added after the possible earlier
|
|
3558
|
-
message
|
|
3620
|
+
message.
|
|
3621
|
+
|
|
3622
|
+
An optional ``separator`` argument can be used to provide custom separator
|
|
3623
|
+
string when appending to the old text. A single space is used as separator
|
|
3624
|
+
by default.
|
|
3559
3625
|
|
|
3560
3626
|
In test teardown this keyword can alter the possible failure message,
|
|
3561
3627
|
but otherwise failures override messages set by this keyword. Notice
|
|
@@ -3572,19 +3638,21 @@ class _Misc(_BuiltInBase):
|
|
|
3572
3638
|
| Set Test Message | `*`HTML`*` <b>Hello!</b> | |
|
|
3573
3639
|
|
|
3574
3640
|
This keyword can not be used in suite setup or suite teardown.
|
|
3641
|
+
|
|
3642
|
+
The ``separator`` argument is new in Robot Framework 7.2.
|
|
3575
3643
|
"""
|
|
3576
3644
|
test = self._context.test
|
|
3577
3645
|
if not test:
|
|
3578
3646
|
raise RuntimeError("'Set Test Message' keyword cannot be used in "
|
|
3579
3647
|
"suite setup or teardown.")
|
|
3580
|
-
test.message = self._get_new_text(
|
|
3581
|
-
|
|
3648
|
+
test.message = self._get_new_text(
|
|
3649
|
+
test.message, message, append, handle_html=True, separator=separator)
|
|
3582
3650
|
if self._context.in_test_teardown:
|
|
3583
3651
|
self._variables.set_test("${TEST_MESSAGE}", test.message)
|
|
3584
3652
|
message, level = self._get_logged_test_message_and_level(test.message)
|
|
3585
3653
|
self.log(f'Set test message to:\n{message}', level)
|
|
3586
3654
|
|
|
3587
|
-
def _get_new_text(self, old, new, append, handle_html=False):
|
|
3655
|
+
def _get_new_text(self, old, new, append, handle_html=False, separator=' '):
|
|
3588
3656
|
if not is_string(new):
|
|
3589
3657
|
new = str(new)
|
|
3590
3658
|
if not (is_truthy(append) and old):
|
|
@@ -3594,35 +3662,43 @@ class _Misc(_BuiltInBase):
|
|
|
3594
3662
|
new = new[6:].lstrip()
|
|
3595
3663
|
if not old.startswith('*HTML*'):
|
|
3596
3664
|
old = f'*HTML* {html_escape(old)}'
|
|
3665
|
+
separator = html_escape(separator)
|
|
3597
3666
|
elif old.startswith('*HTML*'):
|
|
3598
3667
|
new = html_escape(new)
|
|
3599
|
-
|
|
3668
|
+
separator = html_escape(separator)
|
|
3669
|
+
return f'{old}{separator}{new}'
|
|
3600
3670
|
|
|
3601
3671
|
def _get_logged_test_message_and_level(self, message):
|
|
3602
3672
|
if message.startswith('*HTML*'):
|
|
3603
3673
|
return message[6:].lstrip(), 'HTML'
|
|
3604
3674
|
return message, 'INFO'
|
|
3605
3675
|
|
|
3606
|
-
def set_test_documentation(self, doc, append=False):
|
|
3676
|
+
def set_test_documentation(self, doc, append=False, separator=' '):
|
|
3607
3677
|
"""Sets documentation for the current test case.
|
|
3608
3678
|
|
|
3609
|
-
|
|
3679
|
+
The possible existing documentation is overwritten by default, but
|
|
3610
3680
|
this can be changed using the optional ``append`` argument similarly
|
|
3611
3681
|
as with `Set Test Message` keyword.
|
|
3612
3682
|
|
|
3683
|
+
An optional ``separator`` argument can be used to provide custom separator
|
|
3684
|
+
string when appending to the old text. A single space is used as separator
|
|
3685
|
+
by default.
|
|
3686
|
+
|
|
3613
3687
|
The current test documentation is available as a built-in variable
|
|
3614
3688
|
``${TEST DOCUMENTATION}``. This keyword can not be used in suite
|
|
3615
3689
|
setup or suite teardown.
|
|
3690
|
+
|
|
3691
|
+
The ``separator`` argument is new in Robot Framework 7.2.
|
|
3616
3692
|
"""
|
|
3617
3693
|
test = self._context.test
|
|
3618
3694
|
if not test:
|
|
3619
3695
|
raise RuntimeError("'Set Test Documentation' keyword cannot be "
|
|
3620
3696
|
"used in suite setup or teardown.")
|
|
3621
|
-
test.doc = self._get_new_text(test.doc, doc, append)
|
|
3697
|
+
test.doc = self._get_new_text(test.doc, doc, append, separator=separator)
|
|
3622
3698
|
self._variables.set_test('${TEST_DOCUMENTATION}', test.doc)
|
|
3623
3699
|
self.log(f'Set test documentation to:\n{test.doc}')
|
|
3624
3700
|
|
|
3625
|
-
def set_suite_documentation(self, doc, append=False, top=False):
|
|
3701
|
+
def set_suite_documentation(self, doc, append=False, top=False, separator=' '):
|
|
3626
3702
|
"""Sets documentation for the current test suite.
|
|
3627
3703
|
|
|
3628
3704
|
By default, the possible existing documentation is overwritten, but
|
|
@@ -3634,15 +3710,21 @@ class _Misc(_BuiltInBase):
|
|
|
3634
3710
|
arguments`), the documentation of the top level suite is altered
|
|
3635
3711
|
instead.
|
|
3636
3712
|
|
|
3713
|
+
An optional ``separator`` argument can be used to provide custom separator
|
|
3714
|
+
string when appending to the old text. A single space is used as separator
|
|
3715
|
+
by default.
|
|
3716
|
+
|
|
3637
3717
|
The documentation of the current suite is available as a built-in
|
|
3638
3718
|
variable ``${SUITE DOCUMENTATION}``.
|
|
3719
|
+
|
|
3720
|
+
The ``separator`` argument is new in Robot Framework 7.2.
|
|
3639
3721
|
"""
|
|
3640
3722
|
suite = self._get_context(top).suite
|
|
3641
|
-
suite.doc = self._get_new_text(suite.doc, doc, append)
|
|
3723
|
+
suite.doc = self._get_new_text(suite.doc, doc, append, separator=separator)
|
|
3642
3724
|
self._variables.set_suite('${SUITE_DOCUMENTATION}', suite.doc, top)
|
|
3643
3725
|
self.log(f'Set suite documentation to:\n{suite.doc}')
|
|
3644
3726
|
|
|
3645
|
-
def set_suite_metadata(self, name, value, append=False, top=False):
|
|
3727
|
+
def set_suite_metadata(self, name, value, append=False, top=False, separator=' '):
|
|
3646
3728
|
"""Sets metadata for the current test suite.
|
|
3647
3729
|
|
|
3648
3730
|
By default, possible existing metadata values are overwritten, but
|
|
@@ -3653,15 +3735,22 @@ class _Misc(_BuiltInBase):
|
|
|
3653
3735
|
If the optional ``top`` argument is given a true value (see `Boolean
|
|
3654
3736
|
arguments`), the metadata of the top level suite is altered instead.
|
|
3655
3737
|
|
|
3738
|
+
An optional ``separator`` argument can be used to provide custom separator
|
|
3739
|
+
string when appending to the old text. A single space is used as separator
|
|
3740
|
+
by default.
|
|
3741
|
+
|
|
3656
3742
|
The metadata of the current suite is available as a built-in variable
|
|
3657
3743
|
``${SUITE METADATA}`` in a Python dictionary. Notice that modifying this
|
|
3658
3744
|
variable directly has no effect on the actual metadata the suite has.
|
|
3745
|
+
|
|
3746
|
+
The ``separator`` argument is new in Robot Framework 7.2.
|
|
3659
3747
|
"""
|
|
3660
3748
|
if not is_string(name):
|
|
3661
3749
|
name = str(name)
|
|
3662
3750
|
metadata = self._get_context(top).suite.metadata
|
|
3663
3751
|
original = metadata.get(name, '')
|
|
3664
|
-
metadata[name] = self._get_new_text(original, value, append
|
|
3752
|
+
metadata[name] = self._get_new_text(original, value, append,
|
|
3753
|
+
separator=separator)
|
|
3665
3754
|
self._variables.set_suite('${SUITE_METADATA}', metadata.copy(), top)
|
|
3666
3755
|
self.log(f"Set suite metadata '{name}' to value '{metadata[name]}'.")
|
|
3667
3756
|
|
|
@@ -455,9 +455,8 @@ class _List:
|
|
|
455
455
|
normalize = Normalizer(ignore_case).normalize
|
|
456
456
|
list1 = normalize(list1)
|
|
457
457
|
list2 = normalize(list2)
|
|
458
|
-
diffs =
|
|
459
|
-
_verify_condition(not diffs,
|
|
460
|
-
f'Following values were not found from first list: {diffs}',
|
|
458
|
+
diffs = [item for item in list2 if item not in list1]
|
|
459
|
+
_verify_condition(not diffs, f'Following values are missing: {seq2str(diffs)}',
|
|
461
460
|
msg, values)
|
|
462
461
|
|
|
463
462
|
def log_list(self, list_, level='INFO'):
|
|
@@ -784,7 +783,8 @@ class _Dictionary:
|
|
|
784
783
|
)
|
|
785
784
|
|
|
786
785
|
def dictionaries_should_be_equal(self, dict1, dict2, msg=None, values=True,
|
|
787
|
-
ignore_keys=None, ignore_case=False
|
|
786
|
+
ignore_keys=None, ignore_case=False,
|
|
787
|
+
ignore_value_order=False):
|
|
788
788
|
"""Fails if the given dictionaries are not equal.
|
|
789
789
|
|
|
790
790
|
First the equality of dictionaries' keys is checked and after that all
|
|
@@ -808,9 +808,15 @@ class _Dictionary:
|
|
|
808
808
|
The ``ignore_case`` argument can be used to make comparison case-insensitive.
|
|
809
809
|
See the `Ignore case` section for more details. This option is new in
|
|
810
810
|
Robot Framework 7.0.
|
|
811
|
+
|
|
812
|
+
The ``ignore_value_order`` argument can be used to make comparison in case of
|
|
813
|
+
list-like values to ignore the order of the elements in the lists.
|
|
814
|
+
Using it requires items to be sortable.
|
|
815
|
+
This option is new in Robot Framework 7.2.
|
|
811
816
|
"""
|
|
812
817
|
self._validate_dictionary(dict1, dict2)
|
|
813
|
-
normalizer = Normalizer(ignore_case, ignore_keys=ignore_keys
|
|
818
|
+
normalizer = Normalizer(ignore_case=ignore_case, ignore_keys=ignore_keys,
|
|
819
|
+
ignore_order=ignore_value_order)
|
|
814
820
|
dict1 = normalizer.normalize(dict1)
|
|
815
821
|
dict2 = normalizer.normalize(dict2)
|
|
816
822
|
self._should_have_same_keys(dict1, dict2, msg, values)
|
|
@@ -840,7 +846,8 @@ class _Dictionary:
|
|
|
840
846
|
_report_error(error, message, values)
|
|
841
847
|
|
|
842
848
|
def dictionary_should_contain_sub_dictionary(self, dict1, dict2, msg=None,
|
|
843
|
-
values=True, ignore_case=False
|
|
849
|
+
values=True, ignore_case=False,
|
|
850
|
+
ignore_value_order=False):
|
|
844
851
|
"""Fails unless all items in ``dict2`` are found from ``dict1``.
|
|
845
852
|
|
|
846
853
|
See `Lists Should Be Equal` for more information about configuring
|
|
@@ -849,9 +856,15 @@ class _Dictionary:
|
|
|
849
856
|
The ``ignore_case`` argument can be used to make comparison case-insensitive.
|
|
850
857
|
See the `Ignore case` section for more details. This option is new in
|
|
851
858
|
Robot Framework 7.0.
|
|
859
|
+
|
|
860
|
+
The ``ignore_value_order`` argument can be used to make comparison in case of
|
|
861
|
+
list-like values to ignore the order of the elements in the lists.
|
|
862
|
+
Using it requires items to be sortable.
|
|
863
|
+
This option is new in Robot Framework 7.2.
|
|
852
864
|
"""
|
|
853
865
|
self._validate_dictionary(dict1, dict2)
|
|
854
|
-
normalizer = Normalizer(ignore_case
|
|
866
|
+
normalizer = Normalizer(ignore_case=ignore_case,
|
|
867
|
+
ignore_order=ignore_value_order)
|
|
855
868
|
dict1 = normalizer.normalize(dict1)
|
|
856
869
|
dict2 = normalizer.normalize(dict2)
|
|
857
870
|
self._should_have_same_keys(dict1, dict2, msg, values, validate_both=False)
|
|
@@ -27,12 +27,12 @@ This package is considered stable.
|
|
|
27
27
|
|
|
28
28
|
from .body import BaseBody, Body, BodyItem, BaseBranches, BaseIterations
|
|
29
29
|
from .configurer import SuiteConfigurer
|
|
30
|
-
from .control import (Break, Continue, Error, For, ForIteration,
|
|
31
|
-
Return, Try, TryBranch, Var, While, WhileIteration)
|
|
30
|
+
from .control import (Break, Continue, Error, For, ForIteration, Group, If,
|
|
31
|
+
IfBranch, Return, Try, TryBranch, Var, While, WhileIteration)
|
|
32
32
|
from .fixture import create_fixture
|
|
33
33
|
from .itemlist import ItemList
|
|
34
34
|
from .keyword import Keyword
|
|
35
|
-
from .message import Message, MessageLevel
|
|
35
|
+
from .message import Message, MessageLevel
|
|
36
36
|
from .modelobject import DataDict, ModelObject
|
|
37
37
|
from .modifier import ModelModifier
|
|
38
38
|
from .statistics import Statistics
|