robotframework 7.3rc1__tar.gz → 7.3rc3__tar.gz
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.3rc3/PKG-INFO +190 -0
- robotframework-7.3rc3/pyproject.toml +33 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/setup.py +4 -3
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/standardtypes.py +11 -5
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/BuiltIn.py +4 -1
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Process.py +5 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/itemlist.py +13 -9
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/modelobject.py +1 -1
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/listeners.py +27 -44
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/outputfile.py +1 -1
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/statements.py +31 -17
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/embedded.py +18 -4
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typeconverters.py +10 -7
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typeinfo.py +15 -6
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/bodyrunner.py +41 -21
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/model.py +2 -1
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/signalhandler.py +1 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/runner.py +9 -5
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/timeout.py +20 -6
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/windows.py +26 -16
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/importer.py +41 -23
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robottypes.py +6 -7
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/assigner.py +30 -27
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/scopes.py +21 -2
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/search.py +0 -2
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/version.py +1 -1
- robotframework-7.3rc3/src/robotframework.egg-info/PKG-INFO +190 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robotframework.egg-info/SOURCES.txt +1 -0
- robotframework-7.3rc3/src/robotframework.egg-info/entry_points.txt +4 -0
- robotframework-7.3rc1/PKG-INFO +0 -187
- robotframework-7.3rc1/src/robotframework.egg-info/PKG-INFO +0 -187
- robotframework-7.3rc1/src/robotframework.egg-info/entry_points.txt +0 -5
- {robotframework-7.3rc1 → robotframework-7.3rc3}/AUTHORS.rst +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/BUILD.rst +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/CONTRIBUTING.rst +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/COPYRIGHT.txt +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/INSTALL.rst +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/LICENSE.txt +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/MANIFEST.in +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/README.rst +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/setup.cfg +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/__main__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/deco.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/exceptions.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/interfaces.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/logger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/parsing.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/py.typed +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/gatherfailed.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/languages.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/settings.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/errors.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/htmlfilewriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/libdoc/libdoc.html +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/log.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/log.html +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/model.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/report.html +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/testdata.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/template.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdoc.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/builder.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/datatypes.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/htmlutils.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/jsonbuilder.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/languages.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/model.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/robotbuilder.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/xmlbuilder.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/xmlwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Collections.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/DateTime.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Easter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/OperatingSystem.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Remote.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/String.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/XML.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/dialogs_py.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/logo.png +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/body.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/configurer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/control.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/filter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/fixture.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/keyword.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/message.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/metadata.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/modifier.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/namepatterns.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/statistics.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/stats.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/tags.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/tagsetter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/testcase.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/testsuite.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/visitor.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/dotted.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/quiet.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/verbose.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/debugfile.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/filelogger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/jsonlogger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/librarylogger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/logger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/loggerapi.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/loggerhelper.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/loglevel.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/output.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/stdoutlogsplitter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/xmllogger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/blocklexers.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/context.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/lexer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/settings.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/statementlexers.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/tokens.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/blocks.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/visitor.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/rebot.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/expandkeywordmatcher.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jsbuildingcontext.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jsmodelbuilders.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/outputwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/stringcache.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/xunitwriter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/configurer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/executionerrors.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/executionresult.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/flattenkeywordmatcher.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/keywordremover.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/merger.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/messagefilter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/model.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/modeldeprecation.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/resultbuilder.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/visitor.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/xmlelementhandlers.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/run.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentconverter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentmapper.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentparser.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentresolver.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentspec.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentvalidator.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/customconverters.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typeinfoparser.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typevalidator.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/builders.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/parsers.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/settings.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/transformers.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/context.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/importer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/invalidkeyword.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/keywordfinder.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/keywordimplementation.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/librarykeyword.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/librarykeywordrunner.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/namespace.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/outputcapture.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/randomizer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/resourcemodel.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/runkwregister.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/status.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/statusreporter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/suiterunner.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/testlibraries.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/nosupport.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/userkeywordrunner.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/testdoc.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/application.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/asserts.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/charwidth.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/compress.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/connectioncache.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/dotdict.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/encoding.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/encodingsniffer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/error.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/escaping.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/filereader.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/frange.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/json.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/markuputils.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/markupwriters.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/match.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/misc.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/normalizing.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/notset.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/platform.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/recommendations.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/restreader.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotenv.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotio.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotpath.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robottime.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/setter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/sortable.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/text.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/typehints.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/unic.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/__init__.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/evaluation.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/filesetter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/finders.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/notfound.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/replacer.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/resolvable.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/store.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/tablesetter.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/variables.py +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robotframework.egg-info/top_level.txt +0 -0
- {robotframework-7.3rc1 → robotframework-7.3rc3}/tasks.py +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: robotframework
|
|
3
|
+
Version: 7.3rc3
|
|
4
|
+
Summary: Generic automation framework for acceptance testing and robotic process automation (RPA)
|
|
5
|
+
Home-page: https://robotframework.org
|
|
6
|
+
Download-URL: https://pypi.org/project/robotframework
|
|
7
|
+
Author: Pekka Klärck
|
|
8
|
+
Author-email: peke@eliga.fi
|
|
9
|
+
License: Apache License 2.0
|
|
10
|
+
Project-URL: Source, https://github.com/robotframework/robotframework
|
|
11
|
+
Project-URL: Issue Tracker, https://github.com/robotframework/robotframework/issues
|
|
12
|
+
Project-URL: Documentation, https://robotframework.org/robotframework
|
|
13
|
+
Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.3rc3.rst
|
|
14
|
+
Project-URL: Slack, http://slack.robotframework.org
|
|
15
|
+
Keywords: robotframework automation testautomation rpa testing acceptancetesting atdd bdd
|
|
16
|
+
Platform: any
|
|
17
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
18
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
29
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
30
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
31
|
+
Classifier: Topic :: Software Development :: Testing
|
|
32
|
+
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
|
33
|
+
Classifier: Topic :: Software Development :: Testing :: BDD
|
|
34
|
+
Classifier: Framework :: Robot Framework
|
|
35
|
+
Requires-Python: >=3.8
|
|
36
|
+
Description-Content-Type: text/x-rst
|
|
37
|
+
License-File: LICENSE.txt
|
|
38
|
+
License-File: AUTHORS.rst
|
|
39
|
+
|
|
40
|
+
Robot Framework
|
|
41
|
+
===============
|
|
42
|
+
|
|
43
|
+
.. contents::
|
|
44
|
+
:local:
|
|
45
|
+
|
|
46
|
+
Introduction
|
|
47
|
+
------------
|
|
48
|
+
|
|
49
|
+
`Robot Framework <http://robotframework.org>`_ |r| is a generic open source
|
|
50
|
+
automation framework for acceptance testing, acceptance test driven
|
|
51
|
+
development (ATDD), and robotic process automation (RPA). It has simple plain
|
|
52
|
+
text syntax and it can be extended easily with generic and custom libraries.
|
|
53
|
+
|
|
54
|
+
Robot Framework is operating system and application independent. It is
|
|
55
|
+
implemented using `Python <http://python.org>`_ which is also the primary
|
|
56
|
+
language to extend it. The framework has a rich ecosystem around it consisting
|
|
57
|
+
of various generic libraries and tools that are developed as separate projects.
|
|
58
|
+
For more information about Robot Framework and the ecosystem, see
|
|
59
|
+
http://robotframework.org.
|
|
60
|
+
|
|
61
|
+
Robot Framework project is hosted on GitHub_ where you can find source code,
|
|
62
|
+
an issue tracker, and some further documentation. Downloads are hosted on PyPI_.
|
|
63
|
+
|
|
64
|
+
Robot Framework development is sponsored by non-profit `Robot Framework Foundation
|
|
65
|
+
<http://robotframework.org/foundation>`_. If you are using the framework
|
|
66
|
+
and benefiting from it, consider joining the foundation to help maintaining
|
|
67
|
+
the framework and developing it further.
|
|
68
|
+
|
|
69
|
+
.. _GitHub: https://github.com/robotframework/robotframework
|
|
70
|
+
.. _PyPI: https://pypi.python.org/pypi/robotframework
|
|
71
|
+
|
|
72
|
+
.. image:: https://img.shields.io/pypi/v/robotframework.svg?label=version
|
|
73
|
+
:target: https://pypi.python.org/pypi/robotframework
|
|
74
|
+
:alt: Latest version
|
|
75
|
+
|
|
76
|
+
.. image:: https://img.shields.io/pypi/l/robotframework.svg
|
|
77
|
+
:target: http://www.apache.org/licenses/LICENSE-2.0.html
|
|
78
|
+
:alt: License
|
|
79
|
+
|
|
80
|
+
Installation
|
|
81
|
+
------------
|
|
82
|
+
|
|
83
|
+
If you already have Python_ with `pip <https://pip.pypa.io>`_ installed,
|
|
84
|
+
you can simply run::
|
|
85
|
+
|
|
86
|
+
pip install robotframework
|
|
87
|
+
|
|
88
|
+
For more detailed installation instructions, including installing Python, see
|
|
89
|
+
`INSTALL.rst <https://github.com/robotframework/robotframework/blob/master/INSTALL.rst>`__.
|
|
90
|
+
|
|
91
|
+
Robot Framework requires Python 3.8 or newer and runs also on `PyPy <http://pypy.org>`_.
|
|
92
|
+
The latest version that supports Python 3.6 and 3.7 is `Robot Framework 6.1.1`__.
|
|
93
|
+
If you need to use Python 2, `Jython <http://jython.org>`_ or
|
|
94
|
+
`IronPython <http://ironpython.net>`_, you can use `Robot Framework 4.1.3`__.
|
|
95
|
+
|
|
96
|
+
__ https://github.com/robotframework/robotframework/tree/v6.1.1#readme
|
|
97
|
+
__ https://github.com/robotframework/robotframework/tree/v4.1.3#readme
|
|
98
|
+
|
|
99
|
+
Example
|
|
100
|
+
-------
|
|
101
|
+
|
|
102
|
+
Below is a simple example test case for testing login to some system.
|
|
103
|
+
You can find more examples with links to related demo projects from
|
|
104
|
+
http://robotframework.org.
|
|
105
|
+
|
|
106
|
+
.. code:: robotframework
|
|
107
|
+
|
|
108
|
+
*** Settings ***
|
|
109
|
+
Documentation A test suite with a single test for valid login.
|
|
110
|
+
...
|
|
111
|
+
... This test has a workflow that is created using keywords in
|
|
112
|
+
... the imported resource file.
|
|
113
|
+
Resource login.resource
|
|
114
|
+
|
|
115
|
+
*** Test Cases ***
|
|
116
|
+
Valid Login
|
|
117
|
+
Open Browser To Login Page
|
|
118
|
+
Input Username demo
|
|
119
|
+
Input Password mode
|
|
120
|
+
Submit Credentials
|
|
121
|
+
Welcome Page Should Be Open
|
|
122
|
+
[Teardown] Close Browser
|
|
123
|
+
|
|
124
|
+
Usage
|
|
125
|
+
-----
|
|
126
|
+
|
|
127
|
+
Tests (or tasks) are executed from the command line using the ``robot``
|
|
128
|
+
command or by executing the ``robot`` module directly like ``python -m robot`` .
|
|
129
|
+
|
|
130
|
+
The basic usage is giving a path to a test (or task) file or directory as an
|
|
131
|
+
argument with possible command line options before the path::
|
|
132
|
+
|
|
133
|
+
robot tests.robot
|
|
134
|
+
robot --variable BROWSER:Firefox --outputdir results path/to/tests/
|
|
135
|
+
|
|
136
|
+
Additionally, there is the ``rebot`` tool for combining results and otherwise
|
|
137
|
+
post-processing outputs::
|
|
138
|
+
|
|
139
|
+
rebot --name Example output1.xml output2.xml
|
|
140
|
+
|
|
141
|
+
Run ``robot --help`` and ``rebot --help`` for more information about the command
|
|
142
|
+
line usage. For a complete reference manual see `Robot Framework User Guide`_.
|
|
143
|
+
|
|
144
|
+
Documentation
|
|
145
|
+
-------------
|
|
146
|
+
|
|
147
|
+
- `Robot Framework User Guide
|
|
148
|
+
<http://robotframework.org/robotframework/#user-guide>`_
|
|
149
|
+
- `Standard libraries
|
|
150
|
+
<http://robotframework.org/robotframework/#standard-libraries>`_
|
|
151
|
+
- `API documentation <http://robot-framework.readthedocs.org>`_
|
|
152
|
+
- `General documentation <http://robotframework.org/>`_
|
|
153
|
+
|
|
154
|
+
Support and Contact
|
|
155
|
+
-------------------
|
|
156
|
+
|
|
157
|
+
- `Slack <http://slack.robotframework.org/>`_
|
|
158
|
+
- `Forum <https://forum.robotframework.org/>`_
|
|
159
|
+
- `robotframework-users
|
|
160
|
+
<https://groups.google.com/group/robotframework-users/>`_ mailing list
|
|
161
|
+
|
|
162
|
+
Contributing
|
|
163
|
+
------------
|
|
164
|
+
|
|
165
|
+
Interested to contribute to Robot Framework? Great! In that case it is a good
|
|
166
|
+
start by looking at the `CONTRIBUTING.rst <https://github.com/robotframework/robotframework/blob/master/CONTRIBUTING.rst>`__. If you
|
|
167
|
+
do not already have an issue you would like to work on, you can check
|
|
168
|
+
issues with `good new issue`__ and `help wanted`__ labels.
|
|
169
|
+
|
|
170
|
+
Remember also that there are many other tools and libraries in the wider
|
|
171
|
+
`Robot Framework ecosystem <http://robotframework.org>`_ that you can
|
|
172
|
+
contribute to!
|
|
173
|
+
|
|
174
|
+
__ https://github.com/robotframework/robotframework/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22
|
|
175
|
+
__ https://github.com/robotframework/robotframework/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22
|
|
176
|
+
|
|
177
|
+
License and Trademark
|
|
178
|
+
---------------------
|
|
179
|
+
|
|
180
|
+
Robot Framework is open source software provided under the `Apache License 2.0`__.
|
|
181
|
+
Robot Framework documentation and other similar content use the
|
|
182
|
+
`Creative Commons Attribution 3.0 Unported`__ license. Most libraries and tools
|
|
183
|
+
in the ecosystem are also open source, but they may use different licenses.
|
|
184
|
+
|
|
185
|
+
Robot Framework trademark is owned by `Robot Framework Foundation`_.
|
|
186
|
+
|
|
187
|
+
__ http://apache.org/licenses/LICENSE-2.0
|
|
188
|
+
__ http://creativecommons.org/licenses/by/3.0
|
|
189
|
+
|
|
190
|
+
.. |r| unicode:: U+00AE
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
[tool.black]
|
|
2
|
+
line_length = 88
|
|
3
|
+
# When we add [project] with requires-python, remove this and Ruff's target-version
|
|
4
|
+
target-version = ["py38", "py39", "py310", "py311", "py312", "py313"]
|
|
5
|
+
|
|
6
|
+
[tool.ruff]
|
|
7
|
+
target-version = "py38"
|
|
8
|
+
|
|
9
|
+
[tool.ruff.lint]
|
|
10
|
+
extend-select = ["I"] # imports
|
|
11
|
+
ignore = ["E731"] # lambda assignment
|
|
12
|
+
|
|
13
|
+
[tool.ruff.lint.pyflakes]
|
|
14
|
+
# Needed due to https://github.com/astral-sh/ruff/issues/9298
|
|
15
|
+
extend-generics = ["robot.model.body.BaseBranches"]
|
|
16
|
+
|
|
17
|
+
[tool.ruff.lint.isort]
|
|
18
|
+
# Ruff is used to sort and fix imports first. Multiline imports are organized so
|
|
19
|
+
# that each item is on its own line. This is same as the Vertical Hanging Indent
|
|
20
|
+
# mode with isort.
|
|
21
|
+
combine-as-imports = true
|
|
22
|
+
order-by-type = false
|
|
23
|
+
|
|
24
|
+
[tool.isort]
|
|
25
|
+
# isort is used after Ruff to sort "normal" imports so that multiline imports use
|
|
26
|
+
# the Hanging Grid Grouped mode. Files contained redundant import aliases denoting
|
|
27
|
+
# module/package API are excluded. For details about multiline modes see:
|
|
28
|
+
# https://pycqa.github.io/isort/docs/configuration/multi_line_output_modes.html
|
|
29
|
+
multi_line_output = 5
|
|
30
|
+
extend_skip = ["__init__.py", "src/robot/api/parsing.py"]
|
|
31
|
+
combine_as_imports = true
|
|
32
|
+
order_by_type = false
|
|
33
|
+
line_length = 88
|
|
@@ -6,7 +6,7 @@ from setuptools import find_packages, setup
|
|
|
6
6
|
|
|
7
7
|
# Version number typically updated by running `invoke set-version <version>`.
|
|
8
8
|
# Run `invoke --help set-version` or see tasks.py for details.
|
|
9
|
-
VERSION = "7.
|
|
9
|
+
VERSION = "7.3rc3"
|
|
10
10
|
with open(join(dirname(abspath(__file__)), "README.rst")) as f:
|
|
11
11
|
LONG_DESCRIPTION = f.read()
|
|
12
12
|
base_url = "https://github.com/robotframework/robotframework/blob/master"
|
|
@@ -28,6 +28,7 @@ Programming Language :: Python :: 3.10
|
|
|
28
28
|
Programming Language :: Python :: 3.11
|
|
29
29
|
Programming Language :: Python :: 3.12
|
|
30
30
|
Programming Language :: Python :: 3.13
|
|
31
|
+
Programming Language :: Python :: 3.14
|
|
31
32
|
Programming Language :: Python :: Implementation :: CPython
|
|
32
33
|
Programming Language :: Python :: Implementation :: PyPy
|
|
33
34
|
Topic :: Software Development :: Testing
|
|
@@ -76,8 +77,8 @@ setup(
|
|
|
76
77
|
packages=find_packages("src"),
|
|
77
78
|
entry_points={
|
|
78
79
|
"console_scripts": [
|
|
79
|
-
"robot = robot
|
|
80
|
-
"rebot = robot
|
|
80
|
+
"robot = robot:run_cli",
|
|
81
|
+
"rebot = robot:rebot_cli",
|
|
81
82
|
"libdoc = robot.libdoc:libdoc_cli",
|
|
82
83
|
]
|
|
83
84
|
},
|
|
@@ -81,7 +81,7 @@ Examples: ``good``, ``hyvä`` (same as ``hyv\\xE4``), ``\\x00`` (the null byte)
|
|
|
81
81
|
""",
|
|
82
82
|
bytearray: "Set below to same value as `bytes`.",
|
|
83
83
|
datetime: """\
|
|
84
|
-
|
|
84
|
+
String timestamps are expected to be in
|
|
85
85
|
[https://en.wikipedia.org/wiki/ISO_8601|ISO 8601] like
|
|
86
86
|
format ``YYYY-MM-DD hh:mm:ss.mmmmmm``, where any non-digit
|
|
87
87
|
character can be used as a separator or separators can be
|
|
@@ -89,20 +89,26 @@ omitted altogether. Additionally, only the date part is
|
|
|
89
89
|
mandatory, all possibly missing time components are considered
|
|
90
90
|
to be zeros.
|
|
91
91
|
|
|
92
|
+
A special value ``NOW`` (case-insensitive) can be used to get the
|
|
93
|
+
current local date and time. This is new in Robot Framework 7.3.
|
|
94
|
+
|
|
92
95
|
Integers and floats are considered to represent seconds since
|
|
93
96
|
the [https://en.wikipedia.org/wiki/Unix_time|Unix epoch].
|
|
94
97
|
|
|
95
|
-
Examples: ``2022-02-09T16:39:43.632269``, ``
|
|
96
|
-
``${1644417583.632269}`` (Epoch time)
|
|
98
|
+
Examples: ``2022-02-09T16:39:43.632269``, ``20220209 16:39``,
|
|
99
|
+
``now``, ``${1644417583.632269}`` (Epoch time)
|
|
97
100
|
""",
|
|
98
101
|
date: """\
|
|
99
|
-
|
|
102
|
+
String timestamps are expected to be in
|
|
100
103
|
[https://en.wikipedia.org/wiki/ISO_8601|ISO 8601] like date format
|
|
101
104
|
``YYYY-MM-DD``, where any non-digit character can be used as a separator
|
|
102
105
|
or separators can be omitted altogether. Possible time components are
|
|
103
106
|
only allowed if they are zeros.
|
|
104
107
|
|
|
105
|
-
|
|
108
|
+
A special value ``TODAY`` (case-insensitive) can be used to get
|
|
109
|
+
the current local date. This is new in Robot Framework 7.3.
|
|
110
|
+
|
|
111
|
+
Examples: ``2022-02-09``, ``2022-02-09 00:00``, ``today``
|
|
106
112
|
""",
|
|
107
113
|
timedelta: """\
|
|
108
114
|
Strings are expected to represent a time interval in one of
|
|
@@ -4382,7 +4382,10 @@ def register_run_keyword(library, keyword, args_to_process=0, deprecation_warnin
|
|
|
4382
4382
|
- Their arguments are not resolved normally (use ``args_to_process``
|
|
4383
4383
|
to control that). This basically means not replacing variables or
|
|
4384
4384
|
handling escapes.
|
|
4385
|
-
- They are not stopped by timeouts.
|
|
4385
|
+
- They are not stopped by timeouts. Prior to Robot Framework 7.3, timeouts
|
|
4386
|
+
occurring when these keywords were executing other keywords could corrupt
|
|
4387
|
+
output files. That bug has been fixed, so this use case why to register
|
|
4388
|
+
keywords as run keyword variants is not relevant anymore.
|
|
4386
4389
|
- If there are conflicts with keyword names, these keywords have
|
|
4387
4390
|
*lower* precedence than other keywords.
|
|
4388
4391
|
|
|
@@ -279,6 +279,11 @@ class Process:
|
|
|
279
279
|
| `Should Be Equal` | ${stdout} | ${result.stdout} |
|
|
280
280
|
| `File Should Be Empty` | ${result.stderr_path} | |
|
|
281
281
|
|
|
282
|
+
Notice that in ``stdout`` and ``stderr`` content possible trailing newline
|
|
283
|
+
is removed and ``\\r\\n`` converted to ``\\n`` automatically. If you
|
|
284
|
+
need to see the original process output, redirect it to a file using
|
|
285
|
+
`process configuration` and read it from there.
|
|
286
|
+
|
|
282
287
|
= Boolean arguments =
|
|
283
288
|
|
|
284
289
|
Some keywords accept arguments that are handled as Boolean values true or
|
|
@@ -18,9 +18,9 @@ from typing import (
|
|
|
18
18
|
Any, Iterable, Iterator, MutableSequence, overload, Type, TYPE_CHECKING, TypeVar
|
|
19
19
|
)
|
|
20
20
|
|
|
21
|
-
from robot.utils import copy_signature, KnownAtRuntime
|
|
21
|
+
from robot.utils import copy_signature, KnownAtRuntime
|
|
22
22
|
|
|
23
|
-
from .modelobject import DataDict
|
|
23
|
+
from .modelobject import DataDict, full_name, ModelObject
|
|
24
24
|
|
|
25
25
|
if TYPE_CHECKING:
|
|
26
26
|
from .visitor import SuiteVisitor
|
|
@@ -77,14 +77,18 @@ class ItemList(MutableSequence[T]):
|
|
|
77
77
|
item = self._item_from_dict(item)
|
|
78
78
|
else:
|
|
79
79
|
raise TypeError(
|
|
80
|
-
f"Only {
|
|
81
|
-
f"
|
|
80
|
+
f"Only '{self._type_name(self._item_class)}' objects accepted, "
|
|
81
|
+
f"got '{self._type_name(item)}'."
|
|
82
82
|
)
|
|
83
83
|
if self._common_attrs:
|
|
84
84
|
for attr, value in self._common_attrs.items():
|
|
85
85
|
setattr(item, attr, value)
|
|
86
86
|
return item
|
|
87
87
|
|
|
88
|
+
def _type_name(self, item: "type|object") -> str:
|
|
89
|
+
typ = item if isinstance(item, type) else type(item)
|
|
90
|
+
return full_name(typ) if issubclass(typ, ModelObject) else typ.__name__
|
|
91
|
+
|
|
88
92
|
def _item_from_dict(self, data: DataDict) -> T:
|
|
89
93
|
if hasattr(self._item_class, "from_dict"):
|
|
90
94
|
return self._item_class.from_dict(data) # type: ignore
|
|
@@ -193,21 +197,21 @@ class ItemList(MutableSequence[T]):
|
|
|
193
197
|
|
|
194
198
|
def __lt__(self, other: "ItemList[T]") -> bool:
|
|
195
199
|
if not isinstance(other, ItemList):
|
|
196
|
-
raise TypeError(f"Cannot order ItemList and {
|
|
200
|
+
raise TypeError(f"Cannot order 'ItemList' and '{self._type_name(other)}'.")
|
|
197
201
|
if not self._is_compatible(other):
|
|
198
|
-
raise TypeError("Cannot order incompatible
|
|
202
|
+
raise TypeError("Cannot order incompatible 'ItemList' objects.")
|
|
199
203
|
return self._items < other._items
|
|
200
204
|
|
|
201
205
|
def __add__(self: Self, other: "ItemList[T]") -> Self:
|
|
202
206
|
if not isinstance(other, ItemList):
|
|
203
|
-
raise TypeError(f"Cannot add ItemList and {
|
|
207
|
+
raise TypeError(f"Cannot add 'ItemList' and '{self._type_name(other)}'.")
|
|
204
208
|
if not self._is_compatible(other):
|
|
205
|
-
raise TypeError("Cannot add incompatible
|
|
209
|
+
raise TypeError("Cannot add incompatible 'ItemList' objects.")
|
|
206
210
|
return self._create_new_from(self._items + other._items)
|
|
207
211
|
|
|
208
212
|
def __iadd__(self: Self, other: Iterable[T]) -> Self:
|
|
209
213
|
if isinstance(other, ItemList) and not self._is_compatible(other):
|
|
210
|
-
raise TypeError("Cannot add incompatible
|
|
214
|
+
raise TypeError("Cannot add incompatible 'ItemList' objects.")
|
|
211
215
|
self.extend(other)
|
|
212
216
|
return self
|
|
213
217
|
|
|
@@ -241,7 +241,7 @@ class ModelObject(metaclass=SetterAwareType):
|
|
|
241
241
|
|
|
242
242
|
|
|
243
243
|
def full_name(obj_or_cls):
|
|
244
|
-
cls =
|
|
244
|
+
cls = obj_or_cls if isinstance(obj_or_cls, type) else type(obj_or_cls)
|
|
245
245
|
parts = [*cls.__module__.split("."), cls.__name__]
|
|
246
246
|
if len(parts) > 1 and parts[0] == "robot":
|
|
247
247
|
parts[2:-1] = []
|
|
@@ -174,15 +174,34 @@ class ListenerV3Facade(ListenerFacade):
|
|
|
174
174
|
# Fallbacks for body items
|
|
175
175
|
start_body_item = get("start_body_item")
|
|
176
176
|
end_body_item = get("end_body_item")
|
|
177
|
+
# Fallbacks for keywords
|
|
178
|
+
start_keyword = get("start_keyword", start_body_item)
|
|
179
|
+
end_keyword = get("end_keyword", end_body_item)
|
|
177
180
|
# Keywords
|
|
178
|
-
self.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
self.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
181
|
+
self.start_user_keyword = get(
|
|
182
|
+
"start_user_keyword",
|
|
183
|
+
lambda data, implementation, result: start_keyword(data, result),
|
|
184
|
+
)
|
|
185
|
+
self.end_user_keyword = get(
|
|
186
|
+
"end_user_keyword",
|
|
187
|
+
lambda data, implementation, result: end_keyword(data, result),
|
|
188
|
+
)
|
|
189
|
+
self.start_library_keyword = get(
|
|
190
|
+
"start_library_keyword",
|
|
191
|
+
lambda data, implementation, result: start_keyword(data, result),
|
|
192
|
+
)
|
|
193
|
+
self.end_library_keyword = get(
|
|
194
|
+
"end_library_keyword",
|
|
195
|
+
lambda data, implementation, result: end_keyword(data, result),
|
|
196
|
+
)
|
|
197
|
+
self.start_invalid_keyword = get(
|
|
198
|
+
"start_invalid_keyword",
|
|
199
|
+
lambda data, implementation, result: start_keyword(data, result),
|
|
200
|
+
)
|
|
201
|
+
self.end_invalid_keyword = get(
|
|
202
|
+
"end_invalid_keyword",
|
|
203
|
+
lambda data, implementation, result: end_keyword(data, result),
|
|
204
|
+
)
|
|
186
205
|
# IF
|
|
187
206
|
self.start_if = get("start_if", start_body_item)
|
|
188
207
|
self.end_if = get("end_if", end_body_item)
|
|
@@ -237,42 +256,6 @@ class ListenerV3Facade(ListenerFacade):
|
|
|
237
256
|
# Close
|
|
238
257
|
self.close = get("close")
|
|
239
258
|
|
|
240
|
-
def start_user_keyword(self, data, implementation, result):
|
|
241
|
-
if self._start_user_keyword:
|
|
242
|
-
self._start_user_keyword(data, implementation, result)
|
|
243
|
-
else:
|
|
244
|
-
self.start_keyword(data, result)
|
|
245
|
-
|
|
246
|
-
def end_user_keyword(self, data, implementation, result):
|
|
247
|
-
if self._end_user_keyword:
|
|
248
|
-
self._end_user_keyword(data, implementation, result)
|
|
249
|
-
else:
|
|
250
|
-
self.end_keyword(data, result)
|
|
251
|
-
|
|
252
|
-
def start_library_keyword(self, data, implementation, result):
|
|
253
|
-
if self._start_library_keyword:
|
|
254
|
-
self._start_library_keyword(data, implementation, result)
|
|
255
|
-
else:
|
|
256
|
-
self.start_keyword(data, result)
|
|
257
|
-
|
|
258
|
-
def end_library_keyword(self, data, implementation, result):
|
|
259
|
-
if self._end_library_keyword:
|
|
260
|
-
self._end_library_keyword(data, implementation, result)
|
|
261
|
-
else:
|
|
262
|
-
self.end_keyword(data, result)
|
|
263
|
-
|
|
264
|
-
def start_invalid_keyword(self, data, implementation, result):
|
|
265
|
-
if self._start_invalid_keyword:
|
|
266
|
-
self._start_invalid_keyword(data, implementation, result)
|
|
267
|
-
else:
|
|
268
|
-
self.start_keyword(data, result)
|
|
269
|
-
|
|
270
|
-
def end_invalid_keyword(self, data, implementation, result):
|
|
271
|
-
if self._end_invalid_keyword:
|
|
272
|
-
self._end_invalid_keyword(data, implementation, result)
|
|
273
|
-
else:
|
|
274
|
-
self.end_keyword(data, result)
|
|
275
|
-
|
|
276
259
|
def log_message(self, message):
|
|
277
260
|
if self._is_logged(message):
|
|
278
261
|
self._log_message(message)
|
|
@@ -77,7 +77,7 @@ class OutputFile(LoggerApi):
|
|
|
77
77
|
self._delayed_messages = []
|
|
78
78
|
|
|
79
79
|
def _release_delayed_messages(self):
|
|
80
|
-
for msg in self._delayed_messages:
|
|
80
|
+
for msg in self._delayed_messages or ():
|
|
81
81
|
self.log_message(msg, no_delay=True)
|
|
82
82
|
|
|
83
83
|
def start_suite(self, data, result):
|
|
@@ -1077,14 +1077,7 @@ class KeywordCall(Statement):
|
|
|
1077
1077
|
return self.get_values(Token.ASSIGN)
|
|
1078
1078
|
|
|
1079
1079
|
def validate(self, ctx: "ValidationContext"):
|
|
1080
|
-
|
|
1081
|
-
if assignment.error:
|
|
1082
|
-
self.errors += (assignment.error.message,)
|
|
1083
|
-
for variable in assignment:
|
|
1084
|
-
try:
|
|
1085
|
-
TypeInfo.from_variable(variable)
|
|
1086
|
-
except DataError as err:
|
|
1087
|
-
self.errors += (str(err),)
|
|
1080
|
+
AssignmentValidator().validate(self)
|
|
1088
1081
|
|
|
1089
1082
|
|
|
1090
1083
|
@Statement.register
|
|
@@ -1182,20 +1175,23 @@ class ForHeader(Statement):
|
|
|
1182
1175
|
|
|
1183
1176
|
def validate(self, ctx: "ValidationContext"):
|
|
1184
1177
|
if not self.assign:
|
|
1185
|
-
self.
|
|
1178
|
+
self.errors += ("FOR loop has no variables.",)
|
|
1186
1179
|
if not self.flavor:
|
|
1187
|
-
self.
|
|
1180
|
+
self.errors += ("FOR loop has no 'IN' or other valid separator.",)
|
|
1188
1181
|
else:
|
|
1189
1182
|
for var in self.assign:
|
|
1190
|
-
|
|
1191
|
-
|
|
1183
|
+
match = search_variable(var, ignore_errors=True, parse_type=True)
|
|
1184
|
+
if not match.is_scalar_assign():
|
|
1185
|
+
self.errors += (f"Invalid FOR loop variable '{var}'.",)
|
|
1186
|
+
elif match.type:
|
|
1187
|
+
try:
|
|
1188
|
+
TypeInfo.from_variable(match)
|
|
1189
|
+
except DataError as err:
|
|
1190
|
+
self.errors += (f"Invalid FOR loop variable '{var}': {err}",)
|
|
1192
1191
|
if not self.values:
|
|
1193
|
-
self.
|
|
1192
|
+
self.errors += ("FOR loop has no values.",)
|
|
1194
1193
|
self._validate_options()
|
|
1195
1194
|
|
|
1196
|
-
def _add_error(self, error: str):
|
|
1197
|
-
self.errors += (f"FOR loop has {error}.",)
|
|
1198
|
-
|
|
1199
1195
|
|
|
1200
1196
|
class IfElseHeader(Statement, ABC):
|
|
1201
1197
|
|
|
@@ -1266,6 +1262,10 @@ class InlineIfHeader(IfElseHeader):
|
|
|
1266
1262
|
]
|
|
1267
1263
|
return cls(tokens)
|
|
1268
1264
|
|
|
1265
|
+
def validate(self, ctx: "ValidationContext"):
|
|
1266
|
+
super().validate(ctx)
|
|
1267
|
+
AssignmentValidator().validate(self)
|
|
1268
|
+
|
|
1269
1269
|
|
|
1270
1270
|
@Statement.register
|
|
1271
1271
|
class ElseIfHeader(IfElseHeader):
|
|
@@ -1754,7 +1754,7 @@ class VariableValidator:
|
|
|
1754
1754
|
try:
|
|
1755
1755
|
TypeInfo.from_variable(match)
|
|
1756
1756
|
except DataError as err:
|
|
1757
|
-
statement.errors += (
|
|
1757
|
+
statement.errors += (f"Invalid variable '{name}': {err}",)
|
|
1758
1758
|
|
|
1759
1759
|
def _validate_dict_items(self, statement: Statement):
|
|
1760
1760
|
for item in statement.get_values(Token.ARGUMENT):
|
|
@@ -1767,3 +1767,17 @@ class VariableValidator:
|
|
|
1767
1767
|
def _is_valid_dict_item(self, item: str) -> bool:
|
|
1768
1768
|
name, value = split_from_equals(item)
|
|
1769
1769
|
return value is not None or is_dict_variable(item)
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
class AssignmentValidator:
|
|
1773
|
+
|
|
1774
|
+
def validate(self, statement: Statement):
|
|
1775
|
+
assignment = statement.get_values(Token.ASSIGN)
|
|
1776
|
+
if assignment:
|
|
1777
|
+
assignment = VariableAssignment(assignment)
|
|
1778
|
+
statement.errors += assignment.errors
|
|
1779
|
+
for variable in assignment:
|
|
1780
|
+
try:
|
|
1781
|
+
TypeInfo.from_variable(variable)
|
|
1782
|
+
except DataError as err:
|
|
1783
|
+
statement.errors += (f"Invalid variable '{variable}': {err}",)
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
|
-
|
|
17
|
+
import warnings
|
|
18
|
+
from typing import Mapping, Sequence
|
|
18
19
|
|
|
19
20
|
from robot.errors import DataError
|
|
20
21
|
from robot.utils import get_error_message
|
|
@@ -44,11 +45,24 @@ class EmbeddedArguments:
|
|
|
44
45
|
def from_name(cls, name: str) -> "EmbeddedArguments|None":
|
|
45
46
|
return EmbeddedArgumentParser().parse(name) if "${" in name else None
|
|
46
47
|
|
|
48
|
+
def match(self, name: str) -> 're.Match|None':
|
|
49
|
+
"""Deprecated since Robot Framework 7.3."""
|
|
50
|
+
warnings.warn(
|
|
51
|
+
"'EmbeddedArguments.match()' is deprecated since Robot Framework 7.3. Use "
|
|
52
|
+
"new 'EmbeddedArguments.matches()' or 'EmbeddedArguments.parse_args()' "
|
|
53
|
+
"instead. Alternatively, use 'EmbeddedArguments.name.fullmatch()' to "
|
|
54
|
+
"preserve the old behavior and to be compatible with earlier Robot "
|
|
55
|
+
"Framework versions."
|
|
56
|
+
)
|
|
57
|
+
return self.name.fullmatch(name)
|
|
58
|
+
|
|
47
59
|
def matches(self, name: str) -> bool:
|
|
60
|
+
"""Return ``True`` if ``name`` matches these embedded arguments."""
|
|
48
61
|
args, _ = self._parse_args(name)
|
|
49
62
|
return bool(args)
|
|
50
63
|
|
|
51
64
|
def parse_args(self, name: str) -> "tuple[str, ...]":
|
|
65
|
+
"""Parse arguments matching these embedded arguments from ``name``."""
|
|
52
66
|
args, placeholders = self._parse_args(name)
|
|
53
67
|
if not placeholders:
|
|
54
68
|
return args
|
|
@@ -72,12 +86,12 @@ class EmbeddedArguments:
|
|
|
72
86
|
arg = arg.replace(ph, placeholders[ph])
|
|
73
87
|
return arg
|
|
74
88
|
|
|
75
|
-
def map(self, args: Sequence[
|
|
76
|
-
args = [
|
|
89
|
+
def map(self, args: Sequence[object]) -> "list[tuple[str, object]]":
|
|
90
|
+
args = [t.convert(a) if t else a for a, t in zip(args, self.types)]
|
|
77
91
|
self.validate(args)
|
|
78
92
|
return list(zip(self.args, args))
|
|
79
93
|
|
|
80
|
-
def validate(self, args: Sequence[
|
|
94
|
+
def validate(self, args: Sequence[object]):
|
|
81
95
|
"""Validate that embedded args match custom regexps.
|
|
82
96
|
|
|
83
97
|
Initial validation is done already when matching keywords, but this
|