robotframework 6.1rc1__zip → 7.0a1__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-6.1rc1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/setup.py +2 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/interfaces.py +36 -49
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/languages.py +61 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +14 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +14 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/configurer.py +19 -15
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/control.py +155 -85
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
- robotframework-7.0a1/src/robot/model/keyword.py +70 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modelobject.py +2 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modifier.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testsuite.py +43 -24
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
- robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
- robotframework-7.0a1/src/robot/output/listeners.py +586 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
- robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
- robotframework-7.0a1/src/robot/output/output.py +158 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
- robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/run.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
- robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +3 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +210 -220
- robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
- robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +15 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +15 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/model.py +156 -36
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +18 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +35 -39
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +9 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
- robotframework-7.0a1/src/robot/utils/notset.py +33 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
- robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/version.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/tasks.py +6 -6
- robotframework-6.1rc1/src/robot/libraries/Reserved.py +0 -48
- robotframework-6.1rc1/src/robot/model/keyword.py +0 -173
- robotframework-6.1rc1/src/robot/output/console/dotted.py +0 -90
- robotframework-6.1rc1/src/robot/output/listenerarguments.py +0 -165
- robotframework-6.1rc1/src/robot/output/listenermethods.py +0 -113
- robotframework-6.1rc1/src/robot/output/listeners.py +0 -174
- robotframework-6.1rc1/src/robot/output/output.py +0 -95
- robotframework-6.1rc1/src/robot/parsing/model/visitor.py +0 -67
- robotframework-6.1rc1/src/robot/running/arguments/argumentconverter.py +0 -79
- robotframework-6.1rc1/src/robot/running/arguments/typevalidator.py +0 -56
- robotframework-6.1rc1/src/robot/running/modelcombiner.py +0 -32
- robotframework-6.1rc1/src/robot/variables/tablesetter.py +0 -156
- {robotframework-6.1rc1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/BUILD.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/INSTALL.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/LICENSE.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/MANIFEST.in +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/README.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/setup.cfg +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
|
@@ -13,21 +13,21 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
import re
|
|
17
|
+
import time
|
|
16
18
|
from collections import OrderedDict
|
|
17
19
|
from contextlib import contextmanager
|
|
20
|
+
from datetime import datetime
|
|
18
21
|
from itertools import zip_longest
|
|
19
|
-
import re
|
|
20
|
-
import time
|
|
21
22
|
|
|
22
23
|
from robot.errors import (BreakLoop, ContinueLoop, DataError, ExecutionFailed,
|
|
23
24
|
ExecutionFailures, ExecutionPassed, ExecutionStatus)
|
|
24
25
|
from robot.result import (For as ForResult, While as WhileResult, If as IfResult,
|
|
25
|
-
|
|
26
|
-
TryBranch as TryBranchResult)
|
|
26
|
+
Try as TryResult)
|
|
27
27
|
from robot.output import librarylogger as logger
|
|
28
|
-
from robot.utils import (cut_assign_value, frange, get_error_message,
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
from robot.utils import (cut_assign_value, frange, get_error_message, is_list_like,
|
|
29
|
+
is_number, plural_or_not as s, secs_to_timestr, seq2str,
|
|
30
|
+
split_from_equals, type_name, Matcher, timestr_to_secs)
|
|
31
31
|
from robot.variables import is_dict_variable, evaluate_expression
|
|
32
32
|
|
|
33
33
|
from .statusreporter import StatusReporter
|
|
@@ -101,7 +101,7 @@ class ForInRunner:
|
|
|
101
101
|
error = DataError(data.error, syntax=True)
|
|
102
102
|
else:
|
|
103
103
|
run = True
|
|
104
|
-
result = ForResult(data.
|
|
104
|
+
result = ForResult(data.assign, data.flavor, data.values, data.start,
|
|
105
105
|
data.mode, data.fill)
|
|
106
106
|
with StatusReporter(data, result, self._context, run) as status:
|
|
107
107
|
if run:
|
|
@@ -143,7 +143,7 @@ class ForInRunner:
|
|
|
143
143
|
def _get_values_for_rounds(self, data):
|
|
144
144
|
if self._context.dry_run:
|
|
145
145
|
return [None]
|
|
146
|
-
values_per_round = len(data.
|
|
146
|
+
values_per_round = len(data.assign)
|
|
147
147
|
if self._is_dict_iteration(data.values):
|
|
148
148
|
values = self._resolve_dict_values(data.values)
|
|
149
149
|
values = self._map_dict_values_to_rounds(values, values_per_round)
|
|
@@ -218,10 +218,10 @@ class ForInRunner:
|
|
|
218
218
|
variables = self._context.variables
|
|
219
219
|
else: # Not really run (earlier failure, unexecuted IF branch, dry-run)
|
|
220
220
|
variables = {}
|
|
221
|
-
values = [''] * len(data.
|
|
222
|
-
for name, value in self._map_variables_and_values(data.
|
|
221
|
+
values = [''] * len(data.assign)
|
|
222
|
+
for name, value in self._map_variables_and_values(data.assign, values):
|
|
223
223
|
variables[name] = value
|
|
224
|
-
result.
|
|
224
|
+
result.assign[name] = cut_assign_value(value)
|
|
225
225
|
runner = BodyRunner(self._context, run, self._templated)
|
|
226
226
|
with StatusReporter(data, result, self._context, run):
|
|
227
227
|
runner.run(data.body)
|
|
@@ -274,13 +274,13 @@ class ForInZipRunner(ForInRunner):
|
|
|
274
274
|
if not mode or self._context.dry_run:
|
|
275
275
|
return None
|
|
276
276
|
try:
|
|
277
|
-
mode = self._context.variables.replace_string(mode)
|
|
278
|
-
if mode in ('STRICT', 'SHORTEST', 'LONGEST'):
|
|
279
|
-
return mode
|
|
280
|
-
raise DataError(f"
|
|
281
|
-
f"
|
|
277
|
+
mode = self._context.variables.replace_string(mode)
|
|
278
|
+
if mode.upper() in ('STRICT', 'SHORTEST', 'LONGEST'):
|
|
279
|
+
return mode.upper()
|
|
280
|
+
raise DataError(f"Value '{mode}' is not accepted. Valid values "
|
|
281
|
+
f"are 'STRICT', 'SHORTEST' and 'LONGEST'.")
|
|
282
282
|
except DataError as err:
|
|
283
|
-
raise DataError(f'Invalid mode: {err}')
|
|
283
|
+
raise DataError(f'Invalid FOR IN ZIP mode: {err}')
|
|
284
284
|
|
|
285
285
|
def _resolve_fill(self, fill):
|
|
286
286
|
if not fill or self._context.dry_run:
|
|
@@ -288,7 +288,7 @@ class ForInZipRunner(ForInRunner):
|
|
|
288
288
|
try:
|
|
289
289
|
return self._context.variables.replace_scalar(fill)
|
|
290
290
|
except DataError as err:
|
|
291
|
-
raise DataError(f'Invalid fill value: {err}')
|
|
291
|
+
raise DataError(f'Invalid FOR IN ZIP fill value: {err}')
|
|
292
292
|
|
|
293
293
|
def _resolve_dict_values(self, values):
|
|
294
294
|
raise DataError('FOR IN ZIP loops do not support iterating over dictionaries.',
|
|
@@ -302,6 +302,8 @@ class ForInZipRunner(ForInRunner):
|
|
|
302
302
|
return zip_longest(*values, fillvalue=self._fill)
|
|
303
303
|
if self._mode == 'STRICT':
|
|
304
304
|
self._validate_strict_lengths(values)
|
|
305
|
+
if self._mode is None:
|
|
306
|
+
self._deprecate_different_lengths(values)
|
|
305
307
|
return zip(*values)
|
|
306
308
|
|
|
307
309
|
def _validate_types(self, values):
|
|
@@ -316,12 +318,21 @@ class ForInZipRunner(ForInRunner):
|
|
|
316
318
|
try:
|
|
317
319
|
lengths.append(len(item))
|
|
318
320
|
except TypeError:
|
|
319
|
-
raise DataError(f"FOR IN ZIP items
|
|
320
|
-
f"but item {index} does not.")
|
|
321
|
+
raise DataError(f"FOR IN ZIP items must have length in the STRICT "
|
|
322
|
+
f"mode, but item {index} does not.")
|
|
321
323
|
if len(set(lengths)) > 1:
|
|
322
|
-
raise DataError(f"FOR IN ZIP items
|
|
324
|
+
raise DataError(f"FOR IN ZIP items must have equal lengths in the STRICT "
|
|
323
325
|
f"mode, but lengths are {seq2str(lengths, quote='')}.")
|
|
324
326
|
|
|
327
|
+
def _deprecate_different_lengths(self, values):
|
|
328
|
+
try:
|
|
329
|
+
self._validate_strict_lengths(values)
|
|
330
|
+
except DataError as err:
|
|
331
|
+
logger.warn(f"FOR IN ZIP default mode will be changed from SHORTEST to "
|
|
332
|
+
f"STRICT in Robot Framework 8.0. Use 'mode=SHORTEST' to keep "
|
|
333
|
+
f"using the SHORTEST mode. If the mode is not changed, "
|
|
334
|
+
f"execution will fail like this in the future: {err}")
|
|
335
|
+
|
|
325
336
|
|
|
326
337
|
class ForInEnumerateRunner(ForInRunner):
|
|
327
338
|
flavor = 'IN ENUMERATE'
|
|
@@ -339,9 +350,9 @@ class ForInEnumerateRunner(ForInRunner):
|
|
|
339
350
|
try:
|
|
340
351
|
return int(start)
|
|
341
352
|
except ValueError:
|
|
342
|
-
raise DataError(f"
|
|
353
|
+
raise DataError(f"Value must be an integer, got '{start}'.")
|
|
343
354
|
except DataError as err:
|
|
344
|
-
raise DataError(f'Invalid start value: {err}')
|
|
355
|
+
raise DataError(f'Invalid FOR IN ENUMERATE start value: {err}')
|
|
345
356
|
|
|
346
357
|
def _map_dict_values_to_rounds(self, values, per_round):
|
|
347
358
|
if per_round > 3:
|
|
@@ -375,10 +386,12 @@ class WhileRunner:
|
|
|
375
386
|
error = None
|
|
376
387
|
run = False
|
|
377
388
|
limit = None
|
|
378
|
-
loop_result = WhileResult(data.condition,
|
|
379
|
-
data.
|
|
380
|
-
|
|
381
|
-
|
|
389
|
+
loop_result = WhileResult(data.condition,
|
|
390
|
+
data.limit,
|
|
391
|
+
data.on_limit,
|
|
392
|
+
data.on_limit_message,
|
|
393
|
+
start_time=datetime.now())
|
|
394
|
+
iter_result = loop_result.body.create_iteration(start_time=datetime.now())
|
|
382
395
|
if self._run:
|
|
383
396
|
if data.error:
|
|
384
397
|
error = DataError(data.error, syntax=True)
|
|
@@ -420,7 +433,7 @@ class WhileRunner:
|
|
|
420
433
|
errors.extend(failed.get_errors())
|
|
421
434
|
if not failed.can_continue(ctx, self._templated):
|
|
422
435
|
break
|
|
423
|
-
iter_result = loop_result.body.create_iteration(
|
|
436
|
+
iter_result = loop_result.body.create_iteration(start_time=datetime.now())
|
|
424
437
|
if not self._should_run(data.condition, ctx.variables):
|
|
425
438
|
break
|
|
426
439
|
if errors:
|
|
@@ -453,10 +466,11 @@ class IfRunner:
|
|
|
453
466
|
def run(self, data):
|
|
454
467
|
with self._dry_run_recursion_detection(data) as recursive_dry_run:
|
|
455
468
|
error = None
|
|
456
|
-
|
|
469
|
+
result = IfResult()
|
|
470
|
+
with StatusReporter(data, result, self._context, self._run):
|
|
457
471
|
for branch in data.body:
|
|
458
472
|
try:
|
|
459
|
-
if self._run_if_branch(branch, recursive_dry_run, data.error):
|
|
473
|
+
if self._run_if_branch(branch, result, recursive_dry_run, data.error):
|
|
460
474
|
self._run = False
|
|
461
475
|
except ExecutionStatus as err:
|
|
462
476
|
error = err
|
|
@@ -478,9 +492,9 @@ class IfRunner:
|
|
|
478
492
|
if dry_run:
|
|
479
493
|
self._dry_run_stack.pop()
|
|
480
494
|
|
|
481
|
-
def _run_if_branch(self, branch, recursive_dry_run=False, syntax_error=None):
|
|
495
|
+
def _run_if_branch(self, branch, result, recursive_dry_run=False, syntax_error=None):
|
|
482
496
|
context = self._context
|
|
483
|
-
result =
|
|
497
|
+
result = result.body.create_branch(branch.type, branch.condition, start_time=datetime.now())
|
|
484
498
|
error = None
|
|
485
499
|
if syntax_error:
|
|
486
500
|
run_branch = False
|
|
@@ -525,28 +539,29 @@ class TryRunner:
|
|
|
525
539
|
|
|
526
540
|
def run(self, data):
|
|
527
541
|
run = self._run
|
|
528
|
-
|
|
542
|
+
result = TryResult()
|
|
543
|
+
with StatusReporter(data, result, self._context, run):
|
|
529
544
|
if data.error:
|
|
530
|
-
self._run_invalid(data)
|
|
545
|
+
self._run_invalid(data, result)
|
|
531
546
|
return
|
|
532
|
-
error = self._run_try(data, run)
|
|
547
|
+
error = self._run_try(data, result, run)
|
|
533
548
|
run_excepts_or_else = self._should_run_excepts_or_else(error, run)
|
|
534
549
|
if error:
|
|
535
|
-
error = self._run_excepts(data, error, run=run_excepts_or_else)
|
|
536
|
-
self._run_else(data, run=False)
|
|
550
|
+
error = self._run_excepts(data, result, error, run=run_excepts_or_else)
|
|
551
|
+
self._run_else(data, result, run=False)
|
|
537
552
|
else:
|
|
538
|
-
self._run_excepts(data, error, run=False)
|
|
539
|
-
error = self._run_else(data, run=run_excepts_or_else)
|
|
540
|
-
error = self._run_finally(data, run) or error
|
|
553
|
+
self._run_excepts(data, result, error, run=False)
|
|
554
|
+
error = self._run_else(data, result, run=run_excepts_or_else)
|
|
555
|
+
error = self._run_finally(data, result, run) or error
|
|
541
556
|
if error:
|
|
542
557
|
raise error
|
|
543
558
|
|
|
544
|
-
def _run_invalid(self, data):
|
|
559
|
+
def _run_invalid(self, data, result):
|
|
545
560
|
error_reported = False
|
|
546
561
|
for branch in data.body:
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
with StatusReporter(branch,
|
|
562
|
+
branch_result = result.body.create_branch(branch.type, branch.patterns,
|
|
563
|
+
branch.pattern_type, branch.assign)
|
|
564
|
+
with StatusReporter(branch, branch_result, self._context, run=False, suppress=True):
|
|
550
565
|
runner = BodyRunner(self._context, run=False, templated=self._templated)
|
|
551
566
|
runner.run(branch.body)
|
|
552
567
|
if not error_reported:
|
|
@@ -554,8 +569,8 @@ class TryRunner:
|
|
|
554
569
|
raise DataError(data.error, syntax=True)
|
|
555
570
|
raise ExecutionFailed(data.error, syntax=True)
|
|
556
571
|
|
|
557
|
-
def _run_try(self, data, run):
|
|
558
|
-
result =
|
|
572
|
+
def _run_try(self, data, result, run):
|
|
573
|
+
result = result.body.create_branch(data.TRY)
|
|
559
574
|
return self._run_branch(data.try_branch, result, run)
|
|
560
575
|
|
|
561
576
|
def _should_run_excepts_or_else(self, error, run):
|
|
@@ -577,7 +592,7 @@ class TryRunner:
|
|
|
577
592
|
else:
|
|
578
593
|
return None
|
|
579
594
|
|
|
580
|
-
def _run_excepts(self, data, error, run):
|
|
595
|
+
def _run_excepts(self, data, result, error, run):
|
|
581
596
|
for branch in data.except_branches:
|
|
582
597
|
try:
|
|
583
598
|
run_branch = run and self._should_run_except(branch, error)
|
|
@@ -586,15 +601,15 @@ class TryRunner:
|
|
|
586
601
|
pattern_error = err
|
|
587
602
|
else:
|
|
588
603
|
pattern_error = None
|
|
589
|
-
|
|
590
|
-
|
|
604
|
+
branch_result = result.body.create_branch(branch.type, branch.patterns,
|
|
605
|
+
branch.pattern_type, branch.assign)
|
|
591
606
|
if run_branch:
|
|
592
|
-
if branch.
|
|
593
|
-
self._context.variables[branch.
|
|
594
|
-
error = self._run_branch(branch,
|
|
607
|
+
if branch.assign:
|
|
608
|
+
self._context.variables[branch.assign] = str(error)
|
|
609
|
+
error = self._run_branch(branch, branch_result, error=pattern_error)
|
|
595
610
|
run = False
|
|
596
611
|
else:
|
|
597
|
-
self._run_branch(branch,
|
|
612
|
+
self._run_branch(branch, branch_result, run=False)
|
|
598
613
|
return error
|
|
599
614
|
|
|
600
615
|
def _should_run_except(self, branch, error):
|
|
@@ -602,9 +617,9 @@ class TryRunner:
|
|
|
602
617
|
return True
|
|
603
618
|
matchers = {
|
|
604
619
|
'GLOB': lambda m, p: Matcher(p, spaceless=False, caseless=False).match(m),
|
|
620
|
+
'REGEXP': lambda m, p: re.fullmatch(p, m) is not None,
|
|
621
|
+
'START': lambda m, p: m.startswith(p),
|
|
605
622
|
'LITERAL': lambda m, p: m == p,
|
|
606
|
-
'REGEXP': lambda m, p: re.match(rf'{p}\Z', m) is not None,
|
|
607
|
-
'START': lambda m, p: m.startswith(p)
|
|
608
623
|
}
|
|
609
624
|
if branch.pattern_type:
|
|
610
625
|
pattern_type = self._context.variables.replace_string(branch.pattern_type)
|
|
@@ -612,21 +627,21 @@ class TryRunner:
|
|
|
612
627
|
pattern_type = 'LITERAL'
|
|
613
628
|
matcher = matchers.get(pattern_type.upper())
|
|
614
629
|
if not matcher:
|
|
615
|
-
raise DataError(f"Invalid EXCEPT pattern type '{pattern_type}'
|
|
616
|
-
f"
|
|
630
|
+
raise DataError(f"Invalid EXCEPT pattern type '{pattern_type}'. "
|
|
631
|
+
f"Valid values are {seq2str(matchers)}.")
|
|
617
632
|
for pattern in branch.patterns:
|
|
618
633
|
if matcher(error.message, self._context.variables.replace_string(pattern)):
|
|
619
634
|
return True
|
|
620
635
|
return False
|
|
621
636
|
|
|
622
|
-
def _run_else(self, data, run):
|
|
637
|
+
def _run_else(self, data, result, run):
|
|
623
638
|
if data.else_branch:
|
|
624
|
-
result =
|
|
639
|
+
result = result.body.create_branch(data.ELSE)
|
|
625
640
|
return self._run_branch(data.else_branch, result, run)
|
|
626
641
|
|
|
627
|
-
def _run_finally(self, data, run):
|
|
642
|
+
def _run_finally(self, data, result, run):
|
|
628
643
|
if data.finally_branch:
|
|
629
|
-
result =
|
|
644
|
+
result = result.body.create_branch(data.FINALLY)
|
|
630
645
|
try:
|
|
631
646
|
with StatusReporter(data.finally_branch, result, self._context, run):
|
|
632
647
|
runner = BodyRunner(self._context, run, self._templated)
|
|
@@ -679,15 +694,15 @@ class WhileLimit:
|
|
|
679
694
|
return None
|
|
680
695
|
try:
|
|
681
696
|
on_limit = variables.replace_string(on_limit)
|
|
682
|
-
if on_limit.upper()
|
|
683
|
-
|
|
697
|
+
if on_limit.upper() in ('PASS', 'FAIL'):
|
|
698
|
+
return on_limit.upper()
|
|
699
|
+
raise DataError(f"Value '{on_limit}' is not accepted. Valid values "
|
|
700
|
+
f"are 'PASS' and 'FAIL'.")
|
|
684
701
|
except DataError as err:
|
|
685
|
-
raise DataError(f"Invalid WHILE loop 'on_limit' value
|
|
686
|
-
else:
|
|
687
|
-
return on_limit.lower()
|
|
702
|
+
raise DataError(f"Invalid WHILE loop 'on_limit' value: {err}")
|
|
688
703
|
|
|
689
704
|
def limit_exceeded(self):
|
|
690
|
-
on_limit_pass = self.on_limit == '
|
|
705
|
+
on_limit_pass = self.on_limit == 'PASS'
|
|
691
706
|
if self.on_limit_message:
|
|
692
707
|
raise LimitExceeded(on_limit_pass, self.on_limit_message)
|
|
693
708
|
else:
|
|
@@ -84,8 +84,8 @@ class TestSuiteBuilder:
|
|
|
84
84
|
New in RF 6.1.
|
|
85
85
|
:param rpa:
|
|
86
86
|
Explicit execution mode. ``True`` for RPA and ``False`` for test
|
|
87
|
-
automation. By default, mode is got from data file headers
|
|
88
|
-
|
|
87
|
+
automation. By default, mode is got from data file headers.
|
|
88
|
+
Same as ``--rpa`` or ``--norpa``.
|
|
89
89
|
:param lang:
|
|
90
90
|
Additional languages to be supported during parsing.
|
|
91
91
|
Can be a string matching any of the supported language codes or names,
|
|
@@ -111,7 +111,7 @@ class TestSuiteBuilder:
|
|
|
111
111
|
if included_suites != 'DEPRECATED':
|
|
112
112
|
warnings.warn("'TestSuiteBuilder' argument 'included_suites' is deprecated "
|
|
113
113
|
"and has no effect. Use the new 'included_files' argument "
|
|
114
|
-
"or filter the
|
|
114
|
+
"or filter the created suite instead.")
|
|
115
115
|
|
|
116
116
|
def _get_standard_parsers(self, lang: LanguagesLike,
|
|
117
117
|
process_curdir: bool) -> 'dict[str, Parser]':
|
|
@@ -201,11 +201,11 @@ class TestSuiteBuilder:
|
|
|
201
201
|
class SuiteStructureParser(SuiteStructureVisitor):
|
|
202
202
|
|
|
203
203
|
def __init__(self, parsers: 'dict[str|None, Parser]',
|
|
204
|
-
defaults: 'TestDefaults|None' = None,
|
|
204
|
+
defaults: 'TestDefaults|None' = None,
|
|
205
|
+
rpa: 'bool|None' = None):
|
|
205
206
|
self.parsers = parsers
|
|
206
207
|
self.rpa = rpa
|
|
207
208
|
self.defaults = defaults
|
|
208
|
-
self._rpa_given = rpa is not None
|
|
209
209
|
self.suite: 'TestSuite|None' = None
|
|
210
210
|
self._stack: 'list[tuple[TestSuite, TestDefaults]]' = []
|
|
211
211
|
|
|
@@ -215,13 +215,13 @@ class SuiteStructureParser(SuiteStructureVisitor):
|
|
|
215
215
|
|
|
216
216
|
def parse(self, structure: SuiteStructure) -> TestSuite:
|
|
217
217
|
structure.visit(self)
|
|
218
|
-
|
|
219
|
-
suite.rpa = self.rpa
|
|
220
|
-
return suite
|
|
218
|
+
return cast(TestSuite, self.suite)
|
|
221
219
|
|
|
222
220
|
def visit_file(self, structure: SuiteFile):
|
|
223
221
|
LOGGER.info(f"Parsing file '{structure.source}'.")
|
|
224
222
|
suite = self._build_suite_file(structure)
|
|
223
|
+
if self.rpa is not None:
|
|
224
|
+
suite.rpa = self.rpa
|
|
225
225
|
if self.suite is None:
|
|
226
226
|
self.suite = suite
|
|
227
227
|
else:
|
|
@@ -239,8 +239,13 @@ class SuiteStructureParser(SuiteStructureVisitor):
|
|
|
239
239
|
|
|
240
240
|
def end_directory(self, structure: SuiteDirectory):
|
|
241
241
|
suite, _ = self._stack.pop()
|
|
242
|
-
if
|
|
243
|
-
suite.rpa =
|
|
242
|
+
if self.rpa is not None:
|
|
243
|
+
suite.rpa = self.rpa
|
|
244
|
+
elif suite.rpa is None and suite.suites:
|
|
245
|
+
if all(s.rpa is False for s in suite.suites):
|
|
246
|
+
suite.rpa = False
|
|
247
|
+
elif all(s.rpa is True for s in suite.suites):
|
|
248
|
+
suite.rpa = True
|
|
244
249
|
|
|
245
250
|
def _build_suite_file(self, structure: SuiteFile):
|
|
246
251
|
source = cast(Path, structure.source)
|
|
@@ -250,7 +255,6 @@ class SuiteStructureParser(SuiteStructureVisitor):
|
|
|
250
255
|
suite = parser.parse_suite_file(source, defaults)
|
|
251
256
|
if not suite.tests:
|
|
252
257
|
LOGGER.info(f"Data source '{source}' has no tests or tasks.")
|
|
253
|
-
self._validate_execution_mode(suite)
|
|
254
258
|
except DataError as err:
|
|
255
259
|
raise DataError(f"Parsing '{source}' failed: {err.message}")
|
|
256
260
|
return suite
|
|
@@ -267,20 +271,6 @@ class SuiteStructureParser(SuiteStructureVisitor):
|
|
|
267
271
|
raise DataError(f"Parsing '{source}' failed: {err.message}")
|
|
268
272
|
return suite, defaults
|
|
269
273
|
|
|
270
|
-
def _validate_execution_mode(self, suite: TestSuite):
|
|
271
|
-
if self._rpa_given:
|
|
272
|
-
suite.rpa = self.rpa
|
|
273
|
-
elif suite.rpa is None:
|
|
274
|
-
pass
|
|
275
|
-
elif self.rpa is None:
|
|
276
|
-
self.rpa = suite.rpa
|
|
277
|
-
elif self.rpa is not suite.rpa:
|
|
278
|
-
this, that = ('tasks', 'tests') if suite.rpa else ('tests', 'tasks')
|
|
279
|
-
raise DataError(f"Conflicting execution modes. File has {this} "
|
|
280
|
-
f"but files parsed earlier have {that}. Fix headers "
|
|
281
|
-
f"or use '--rpa' or '--norpa' options to set the "
|
|
282
|
-
f"execution mode explicitly.")
|
|
283
|
-
|
|
284
274
|
|
|
285
275
|
class ResourceFileBuilder:
|
|
286
276
|
|
|
@@ -53,22 +53,21 @@ class RobotParser(Parser):
|
|
|
53
53
|
def parse_suite_file(self, source: Path, defaults: TestDefaults) -> TestSuite:
|
|
54
54
|
model = get_model(self._get_source(source), data_only=True,
|
|
55
55
|
curdir=self._get_curdir(source), lang=self.lang)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
SuiteBuilder(suite, FileSettings(defaults)).build(model)
|
|
59
|
-
return suite
|
|
56
|
+
model.source = source
|
|
57
|
+
return self.parse_model(model, defaults)
|
|
60
58
|
|
|
61
59
|
def parse_init_file(self, source: Path, defaults: TestDefaults) -> TestSuite:
|
|
62
60
|
model = get_init_model(self._get_source(source), data_only=True,
|
|
63
61
|
curdir=self._get_curdir(source), lang=self.lang)
|
|
64
|
-
|
|
65
|
-
suite = TestSuite(name=TestSuite.name_from_source(
|
|
62
|
+
model.source = source
|
|
63
|
+
suite = TestSuite(name=TestSuite.name_from_source(source.parent),
|
|
64
|
+
source=source.parent, rpa=None)
|
|
66
65
|
SuiteBuilder(suite, InitFileSettings(defaults)).build(model)
|
|
67
66
|
return suite
|
|
68
67
|
|
|
69
68
|
def parse_model(self, model: File, defaults: 'TestDefaults|None' = None) -> TestSuite:
|
|
70
|
-
|
|
71
|
-
suite = TestSuite(name=
|
|
69
|
+
name = TestSuite.name_from_source(model.source, self.extensions)
|
|
70
|
+
suite = TestSuite(name=name, source=model.source)
|
|
72
71
|
SuiteBuilder(suite, FileSettings(defaults)).build(model)
|
|
73
72
|
return suite
|
|
74
73
|
|
|
@@ -81,7 +80,12 @@ class RobotParser(Parser):
|
|
|
81
80
|
def parse_resource_file(self, source: Path) -> ResourceFile:
|
|
82
81
|
model = get_resource_model(self._get_source(source), data_only=True,
|
|
83
82
|
curdir=self._get_curdir(source), lang=self.lang)
|
|
84
|
-
|
|
83
|
+
model.source = source
|
|
84
|
+
resource = self.parse_resource_model(model)
|
|
85
|
+
return resource
|
|
86
|
+
|
|
87
|
+
def parse_resource_model(self, model: File) -> ResourceFile:
|
|
88
|
+
resource = ResourceFile(source=model.source)
|
|
85
89
|
ResourceBuilder(resource).build(model)
|
|
86
90
|
return resource
|
|
87
91
|
|
|
@@ -112,7 +116,8 @@ class JsonParser(Parser):
|
|
|
112
116
|
class NoInitFileDirectoryParser(Parser):
|
|
113
117
|
|
|
114
118
|
def parse_init_file(self, source: Path, defaults: TestDefaults) -> TestSuite:
|
|
115
|
-
return TestSuite(name=TestSuite.name_from_source(source),
|
|
119
|
+
return TestSuite(name=TestSuite.name_from_source(source),
|
|
120
|
+
source=source, rpa=None)
|
|
116
121
|
|
|
117
122
|
|
|
118
123
|
class CustomParser(Parser):
|
|
@@ -13,31 +13,23 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
import sys
|
|
17
16
|
from collections.abc import Sequence
|
|
17
|
+
from typing import TypedDict
|
|
18
18
|
|
|
19
19
|
from ..model import TestCase
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
class OptionalItems(TypedDict, total=False):
|
|
23
|
+
args: 'Sequence[str]'
|
|
24
|
+
lineno: int
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
lineno: int
|
|
27
|
+
class FixtureDict(OptionalItems):
|
|
28
|
+
"""Dictionary containing setup or teardown info.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
:attr:`args` and :attr:`lineno` are optional.
|
|
35
|
-
"""
|
|
36
|
-
name: str
|
|
37
|
-
|
|
38
|
-
else:
|
|
39
|
-
class FixtureDict(dict):
|
|
40
|
-
pass
|
|
30
|
+
:attr:`args` and :attr:`lineno` are optional.
|
|
31
|
+
"""
|
|
32
|
+
name: str
|
|
41
33
|
|
|
42
34
|
|
|
43
35
|
class TestDefaults:
|