robotframework 6.1.1__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.1.1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
- {robotframework-6.1.1 → robotframework-7.0a1}/setup.py +2 -5
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/interfaces.py +35 -48
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/languages.py +0 -9
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +13 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/configurer.py +15 -11
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/control.py +151 -81
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
- robotframework-7.0a1/src/robot/model/keyword.py +70 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/testsuite.py +16 -22
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
- robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
- robotframework-7.0a1/src/robot/output/listeners.py +586 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
- robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
- robotframework-7.0a1/src/robot/output/output.py +158 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
- robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
- robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +175 -213
- robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
- robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +8 -10
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/model.py +109 -32
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +15 -17
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +33 -40
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
- robotframework-7.0a1/src/robot/utils/notset.py +33 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
- robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/version.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
- {robotframework-6.1.1 → robotframework-7.0a1}/tasks.py +6 -6
- robotframework-6.1.1/src/robot/libraries/Reserved.py +0 -48
- robotframework-6.1.1/src/robot/model/keyword.py +0 -173
- robotframework-6.1.1/src/robot/output/console/dotted.py +0 -90
- robotframework-6.1.1/src/robot/output/listenerarguments.py +0 -165
- robotframework-6.1.1/src/robot/output/listenermethods.py +0 -113
- robotframework-6.1.1/src/robot/output/listeners.py +0 -174
- robotframework-6.1.1/src/robot/output/output.py +0 -95
- robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
- robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
- robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
- robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
- robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
- {robotframework-6.1.1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/BUILD.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/INSTALL.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/LICENSE.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/MANIFEST.in +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/README.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/setup.cfg +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/modelobject.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/modifier.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/run.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
|
@@ -13,28 +13,34 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
import warnings
|
|
17
|
+
|
|
16
18
|
from robot.model import Tags
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
def deprecated(method):
|
|
20
22
|
def wrapper(self, *args, **kws):
|
|
21
23
|
"""Deprecated."""
|
|
24
|
+
warnings.warn(f"'robot.result.{type(self).__name__}.{method.__name__}' is "
|
|
25
|
+
f"deprecated and will be removed in Robot Framework 8.0.",
|
|
26
|
+
stacklevel=1)
|
|
22
27
|
return method(self, *args, **kws)
|
|
23
28
|
return wrapper
|
|
24
29
|
|
|
25
30
|
|
|
26
31
|
class DeprecatedAttributesMixin:
|
|
27
32
|
__slots__ = []
|
|
33
|
+
_log_name = ''
|
|
28
34
|
|
|
29
35
|
@property
|
|
30
36
|
@deprecated
|
|
31
37
|
def name(self):
|
|
32
|
-
return
|
|
38
|
+
return self._log_name
|
|
33
39
|
|
|
34
40
|
@property
|
|
35
41
|
@deprecated
|
|
36
42
|
def kwname(self):
|
|
37
|
-
return self.
|
|
43
|
+
return self._log_name
|
|
38
44
|
|
|
39
45
|
@property
|
|
40
46
|
@deprecated
|
|
@@ -63,5 +69,5 @@ class DeprecatedAttributesMixin:
|
|
|
63
69
|
|
|
64
70
|
@property
|
|
65
71
|
@deprecated
|
|
66
|
-
def
|
|
72
|
+
def doc(self):
|
|
67
73
|
return ''
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
from robot.errors import DataError
|
|
17
17
|
from robot.model import SuiteVisitor
|
|
18
|
-
from robot.utils import ET, ETSource, get_error_message
|
|
18
|
+
from robot.utils import ET, ETSource, get_error_message, html_escape
|
|
19
19
|
|
|
20
20
|
from .executionresult import Result, CombinedResult
|
|
21
21
|
from .flattenkeywordmatcher import (FlattenByNameMatcher, FlattenByTypeMatcher,
|
|
@@ -144,50 +144,48 @@ class ExecutionResultBuilder:
|
|
|
144
144
|
name_match, by_name = self._get_matcher(FlattenByNameMatcher, flattened)
|
|
145
145
|
type_match, by_type = self._get_matcher(FlattenByTypeMatcher, flattened)
|
|
146
146
|
tags_match, by_tags = self._get_matcher(FlattenByTagMatcher, flattened)
|
|
147
|
-
started = -1
|
|
147
|
+
started = -1 # if 0 or more, we are flattening
|
|
148
148
|
tags = []
|
|
149
149
|
containers = {'kw', 'for', 'while', 'iter', 'if', 'try'}
|
|
150
|
-
|
|
151
|
-
seen_doc = False
|
|
150
|
+
inside = 0 # to make sure we don't read tags from a test
|
|
152
151
|
for event, elem in context:
|
|
153
152
|
tag = elem.tag
|
|
154
|
-
|
|
155
|
-
end = not start
|
|
156
|
-
if start:
|
|
153
|
+
if event == 'start':
|
|
157
154
|
if tag in containers:
|
|
158
|
-
|
|
155
|
+
inside += 1
|
|
159
156
|
if started >= 0:
|
|
160
157
|
started += 1
|
|
161
|
-
elif by_name and name_match(elem.get('name', ''), elem.get('
|
|
158
|
+
elif by_name and name_match(elem.get('name', ''), elem.get('owner')
|
|
159
|
+
or elem.get('library')):
|
|
162
160
|
started = 0
|
|
163
|
-
seen_doc = False
|
|
164
161
|
elif by_type and type_match(tag):
|
|
165
162
|
started = 0
|
|
166
|
-
seen_doc = False
|
|
167
163
|
tags = []
|
|
168
164
|
else:
|
|
169
165
|
if tag in containers:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
doc = ET.Element('doc')
|
|
173
|
-
doc.text = '_*Content flattened.*_'
|
|
174
|
-
yield 'start', doc
|
|
175
|
-
yield 'end', doc
|
|
176
|
-
elif by_tags and inside_kw and started < 0 and tag == 'tag':
|
|
166
|
+
inside -= 1
|
|
167
|
+
elif by_tags and inside and started < 0 and tag == 'tag':
|
|
177
168
|
tags.append(elem.text or '')
|
|
178
169
|
if tags_match(tags):
|
|
179
170
|
started = 0
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
seen_doc = True
|
|
183
|
-
elem.text = f"{elem.text or ''}\n\n_*Content flattened.*_".strip()
|
|
171
|
+
elif started == 0 and tag == 'status':
|
|
172
|
+
elem.text = self._create_flattened_message(elem.text)
|
|
184
173
|
if started <= 0 or tag == 'msg':
|
|
185
174
|
yield event, elem
|
|
186
175
|
else:
|
|
187
176
|
elem.clear()
|
|
188
|
-
if started >= 0 and end and tag in containers:
|
|
177
|
+
if started >= 0 and event == 'end' and tag in containers:
|
|
189
178
|
started -= 1
|
|
190
179
|
|
|
180
|
+
def _create_flattened_message(self, original):
|
|
181
|
+
if not original:
|
|
182
|
+
start = ''
|
|
183
|
+
elif original.startswith('*HTML*'):
|
|
184
|
+
start = original[6:].strip() + '<hr>'
|
|
185
|
+
else:
|
|
186
|
+
start = html_escape(original) + '<hr>'
|
|
187
|
+
return f'*HTML* {start}<span class="robot-note">Content flattened.</span>'
|
|
188
|
+
|
|
191
189
|
def _get_matcher(self, matcher_class, flattened):
|
|
192
190
|
matcher = matcher_class(flattened)
|
|
193
191
|
return matcher.match, bool(matcher)
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
|
|
16
18
|
from robot.errors import DataError
|
|
17
19
|
|
|
18
20
|
|
|
@@ -58,9 +60,13 @@ class ElementHandler:
|
|
|
58
60
|
def end(self, elem, result):
|
|
59
61
|
pass
|
|
60
62
|
|
|
61
|
-
def
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
def _legacy_timestamp(self, elem, attr_name):
|
|
64
|
+
ts = elem.get(attr_name)
|
|
65
|
+
if ts == 'N/A' or not ts:
|
|
66
|
+
return None
|
|
67
|
+
ts = ts.ljust(24, '0')
|
|
68
|
+
return datetime(int(ts[:4]), int(ts[4:6]), int(ts[6:8]),
|
|
69
|
+
int(ts[9:11]), int(ts[12:14]), int(ts[15:17]), int(ts[18:24]))
|
|
64
70
|
|
|
65
71
|
|
|
66
72
|
class RootHandler(ElementHandler):
|
|
@@ -106,7 +112,8 @@ class TestHandler(ElementHandler):
|
|
|
106
112
|
tag = 'test'
|
|
107
113
|
# 'tags' is for RF < 4 compatibility.
|
|
108
114
|
children = frozenset(('doc', 'tags', 'tag', 'timeout', 'status', 'kw', 'if', 'for',
|
|
109
|
-
'try', 'while', '
|
|
115
|
+
'try', 'while', 'variable', 'return', 'break', 'continue',
|
|
116
|
+
'error', 'msg'))
|
|
110
117
|
|
|
111
118
|
def start(self, elem, result):
|
|
112
119
|
lineno = elem.get('line')
|
|
@@ -121,7 +128,7 @@ class KeywordHandler(ElementHandler):
|
|
|
121
128
|
# 'arguments', 'assign' and 'tags' are for RF < 4 compatibility.
|
|
122
129
|
children = frozenset(('doc', 'arguments', 'arg', 'assign', 'var', 'tags', 'tag',
|
|
123
130
|
'timeout', 'status', 'msg', 'kw', 'if', 'for', 'try',
|
|
124
|
-
'while', 'return', 'break', 'continue', 'error'))
|
|
131
|
+
'while', 'variable', 'return', 'break', 'continue', 'error'))
|
|
125
132
|
|
|
126
133
|
def start(self, elem, result):
|
|
127
134
|
elem_type = elem.get('type')
|
|
@@ -136,9 +143,15 @@ class KeywordHandler(ElementHandler):
|
|
|
136
143
|
body = result.body
|
|
137
144
|
except AttributeError:
|
|
138
145
|
body = self._get_body_for_suite_level_keyword(result)
|
|
139
|
-
return body.create_keyword(
|
|
140
|
-
|
|
141
|
-
|
|
146
|
+
return body.create_keyword(**self._get_keyword_attrs(elem))
|
|
147
|
+
|
|
148
|
+
def _get_keyword_attrs(self, elem):
|
|
149
|
+
# 'library' and 'sourcename' are RF < 7 compatibility.
|
|
150
|
+
return {
|
|
151
|
+
'name': elem.get('name', ''),
|
|
152
|
+
'owner': elem.get('owner') or elem.get('library'),
|
|
153
|
+
'source_name': elem.get('source_name') or elem.get('sourcename')
|
|
154
|
+
}
|
|
142
155
|
|
|
143
156
|
def _get_body_for_suite_level_keyword(self, result):
|
|
144
157
|
# Someone, most likely a listener, has created a `<kw>` element on suite level.
|
|
@@ -149,24 +162,22 @@ class KeywordHandler(ElementHandler):
|
|
|
149
162
|
kw_type = 'teardown' if result.tests or result.suites else 'setup'
|
|
150
163
|
keyword = getattr(result, kw_type)
|
|
151
164
|
if not keyword:
|
|
152
|
-
keyword.config(
|
|
165
|
+
keyword.config(name=f'Implicit {kw_type}', status=keyword.PASS)
|
|
153
166
|
return keyword.body
|
|
154
167
|
|
|
155
168
|
def _create_setup(self, elem, result):
|
|
156
|
-
return result.setup.config(
|
|
157
|
-
libname=elem.get('library'))
|
|
169
|
+
return result.setup.config(**self._get_keyword_attrs(elem))
|
|
158
170
|
|
|
159
171
|
def _create_teardown(self, elem, result):
|
|
160
|
-
return result.teardown.config(
|
|
161
|
-
libname=elem.get('library'))
|
|
172
|
+
return result.teardown.config(**self._get_keyword_attrs(elem))
|
|
162
173
|
|
|
163
174
|
# RF < 4 compatibility.
|
|
164
175
|
|
|
165
176
|
def _create_for(self, elem, result):
|
|
166
|
-
return result.body.create_keyword(
|
|
177
|
+
return result.body.create_keyword(name=elem.get('name'), type='FOR')
|
|
167
178
|
|
|
168
179
|
def _create_foritem(self, elem, result):
|
|
169
|
-
return result.body.create_keyword(
|
|
180
|
+
return result.body.create_keyword(name=elem.get('name'), type='ITERATION')
|
|
170
181
|
|
|
171
182
|
_create_iteration = _create_foritem
|
|
172
183
|
|
|
@@ -201,7 +212,7 @@ class WhileHandler(ElementHandler):
|
|
|
201
212
|
class IterationHandler(ElementHandler):
|
|
202
213
|
tag = 'iter'
|
|
203
214
|
children = frozenset(('var', 'doc', 'status', 'kw', 'if', 'for', 'msg', 'try',
|
|
204
|
-
'while', 'return', 'break', 'continue', 'error'))
|
|
215
|
+
'while', 'variable', 'return', 'break', 'continue', 'error'))
|
|
205
216
|
|
|
206
217
|
def start(self, elem, result):
|
|
207
218
|
return result.body.create_iteration()
|
|
@@ -220,9 +231,11 @@ class IfHandler(ElementHandler):
|
|
|
220
231
|
class BranchHandler(ElementHandler):
|
|
221
232
|
tag = 'branch'
|
|
222
233
|
children = frozenset(('status', 'kw', 'if', 'for', 'try', 'while', 'msg', 'doc',
|
|
223
|
-
'return', 'pattern', 'break', 'continue', 'error'))
|
|
234
|
+
'variable', 'return', 'pattern', 'break', 'continue', 'error'))
|
|
224
235
|
|
|
225
236
|
def start(self, elem, result):
|
|
237
|
+
if 'variable' in elem.attrib: # RF < 7.0 compatibility.
|
|
238
|
+
elem.attrib['assign'] = elem.attrib.pop('variable')
|
|
226
239
|
return result.body.create_branch(**elem.attrib)
|
|
227
240
|
|
|
228
241
|
|
|
@@ -244,10 +257,21 @@ class PatternHandler(ElementHandler):
|
|
|
244
257
|
result.patterns += (elem.text or '',)
|
|
245
258
|
|
|
246
259
|
|
|
260
|
+
@ElementHandler.register
|
|
261
|
+
class VariableHandler(ElementHandler):
|
|
262
|
+
tag = 'variable'
|
|
263
|
+
children = frozenset(('var', 'status', 'msg', 'kw'))
|
|
264
|
+
|
|
265
|
+
def start(self, elem, result):
|
|
266
|
+
return result.body.create_var(name=elem.get('name', ''),
|
|
267
|
+
scope=elem.get('scope'),
|
|
268
|
+
separator=elem.get('separator'))
|
|
269
|
+
|
|
270
|
+
|
|
247
271
|
@ElementHandler.register
|
|
248
272
|
class ReturnHandler(ElementHandler):
|
|
249
273
|
tag = 'return'
|
|
250
|
-
children = frozenset(('
|
|
274
|
+
children = frozenset(('value', 'status', 'msg', 'kw'))
|
|
251
275
|
|
|
252
276
|
def start(self, elem, result):
|
|
253
277
|
return result.body.create_return()
|
|
@@ -285,11 +309,23 @@ class MessageHandler(ElementHandler):
|
|
|
285
309
|
tag = 'msg'
|
|
286
310
|
|
|
287
311
|
def end(self, elem, result):
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
312
|
+
self._create_message(elem, result.body.create_message)
|
|
313
|
+
|
|
314
|
+
def _create_message(self, elem, creator):
|
|
315
|
+
if 'time' in elem.attrib: # RF >= 7
|
|
316
|
+
timestamp = elem.attrib['time']
|
|
317
|
+
else: # RF < 7
|
|
318
|
+
timestamp = self._legacy_timestamp(elem, 'timestamp')
|
|
319
|
+
creator(elem.text or '',
|
|
320
|
+
elem.get('level', 'INFO'),
|
|
321
|
+
elem.get('html') in ('true', 'yes'), # 'yes' is RF < 4 compatibility
|
|
322
|
+
timestamp)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class ErrorMessageHandler(MessageHandler):
|
|
326
|
+
|
|
327
|
+
def end(self, elem, result):
|
|
328
|
+
self._create_message(elem, result.messages.create)
|
|
293
329
|
|
|
294
330
|
|
|
295
331
|
@ElementHandler.register
|
|
@@ -302,8 +338,12 @@ class StatusHandler(ElementHandler):
|
|
|
302
338
|
def end(self, elem, result):
|
|
303
339
|
if self.set_status:
|
|
304
340
|
result.status = elem.get('status', 'FAIL')
|
|
305
|
-
|
|
306
|
-
|
|
341
|
+
if 'start' in elem.attrib: # RF >= 7
|
|
342
|
+
result.start_time = elem.attrib['start']
|
|
343
|
+
result.elapsed_time = float(elem.attrib['elapsed'])
|
|
344
|
+
else: # RF < 7
|
|
345
|
+
result.start_time = self._legacy_timestamp(elem, 'starttime')
|
|
346
|
+
result.end_time = self._legacy_timestamp(elem, 'endtime')
|
|
307
347
|
if elem.text:
|
|
308
348
|
result.message = elem.text
|
|
309
349
|
|
|
@@ -313,7 +353,13 @@ class DocHandler(ElementHandler):
|
|
|
313
353
|
tag = 'doc'
|
|
314
354
|
|
|
315
355
|
def end(self, elem, result):
|
|
316
|
-
|
|
356
|
+
try:
|
|
357
|
+
result.doc = elem.text or ''
|
|
358
|
+
except AttributeError:
|
|
359
|
+
# With RF < 7 control structures can have `<doc>` containing information
|
|
360
|
+
# about flattening or removing date. Nowadays, they don't have `doc`
|
|
361
|
+
# attribute at all and `message` is used for this information.
|
|
362
|
+
result.message = elem.text or ''
|
|
317
363
|
|
|
318
364
|
|
|
319
365
|
@ElementHandler.register
|
|
@@ -372,12 +418,12 @@ class VarHandler(ElementHandler):
|
|
|
372
418
|
|
|
373
419
|
def end(self, elem, result):
|
|
374
420
|
value = elem.text or ''
|
|
375
|
-
if result.type
|
|
421
|
+
if result.type in (result.KEYWORD, result.FOR):
|
|
376
422
|
result.assign += (value,)
|
|
377
|
-
elif result.type == result.FOR:
|
|
378
|
-
result.variables += (value,)
|
|
379
423
|
elif result.type == result.ITERATION:
|
|
380
|
-
result.
|
|
424
|
+
result.assign[elem.get('name')] = value
|
|
425
|
+
elif result.type == result.VAR:
|
|
426
|
+
result.value += (value,)
|
|
381
427
|
else:
|
|
382
428
|
raise DataError(f"Invalid element '{elem}' for result '{result!r}'.")
|
|
383
429
|
|
|
@@ -415,16 +461,6 @@ class ErrorsHandler(ElementHandler):
|
|
|
415
461
|
return ErrorMessageHandler()
|
|
416
462
|
|
|
417
463
|
|
|
418
|
-
class ErrorMessageHandler(ElementHandler):
|
|
419
|
-
|
|
420
|
-
def end(self, elem, result):
|
|
421
|
-
html_true = ('true', 'yes') # 'yes' is compatibility for RF < 4.
|
|
422
|
-
result.messages.create(elem.text or '',
|
|
423
|
-
elem.get('level', 'INFO'),
|
|
424
|
-
elem.get('html') in html_true,
|
|
425
|
-
self._timestamp(elem, 'timestamp'))
|
|
426
|
-
|
|
427
|
-
|
|
428
464
|
@ElementHandler.register
|
|
429
465
|
class StatisticsHandler(ElementHandler):
|
|
430
466
|
tag = 'statistics'
|
|
@@ -111,7 +111,7 @@ from .arguments import ArgInfo, ArgumentSpec, TypeConverter, TypeInfo
|
|
|
111
111
|
from .builder import ResourceFileBuilder, TestDefaults, TestSuiteBuilder
|
|
112
112
|
from .context import EXECUTION_CONTEXTS
|
|
113
113
|
from .model import (Break, Continue, Error, For, If, IfBranch, Keyword, Return,
|
|
114
|
-
ResourceFile, TestCase, TestSuite, Try, TryBranch, While)
|
|
114
|
+
ResourceFile, TestCase, TestSuite, Try, TryBranch, Var, While)
|
|
115
115
|
from .runkwregister import RUN_KW_REGISTER
|
|
116
116
|
from .testlibraries import TestLibrary
|
|
117
117
|
from .usererrorhandler import UserErrorHandler
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Copyright 2008-2015 Nokia Networks
|
|
2
|
+
# Copyright 2016- Robot Framework Foundation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from typing import TYPE_CHECKING
|
|
17
|
+
|
|
18
|
+
from robot.variables import contains_variable
|
|
19
|
+
|
|
20
|
+
from .typeinfo import TypeInfo
|
|
21
|
+
from .typeconverters import TypeConverter
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from robot.conf import LanguagesLike
|
|
25
|
+
|
|
26
|
+
from .argumentspec import ArgumentSpec
|
|
27
|
+
from .customconverters import CustomArgumentConverters
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ArgumentConverter:
|
|
31
|
+
|
|
32
|
+
def __init__(self, arg_spec: 'ArgumentSpec',
|
|
33
|
+
custom_converters: 'CustomArgumentConverters',
|
|
34
|
+
dry_run: bool = False,
|
|
35
|
+
languages: 'LanguagesLike' = None):
|
|
36
|
+
self.spec = arg_spec
|
|
37
|
+
self.custom_converters = custom_converters
|
|
38
|
+
self.dry_run = dry_run
|
|
39
|
+
self.languages = languages
|
|
40
|
+
|
|
41
|
+
def convert(self, positional, named):
|
|
42
|
+
return self._convert_positional(positional), self._convert_named(named)
|
|
43
|
+
|
|
44
|
+
def _convert_positional(self, positional):
|
|
45
|
+
names = self.spec.positional
|
|
46
|
+
converted = [self._convert(name, value)
|
|
47
|
+
for name, value in zip(names, positional)]
|
|
48
|
+
if self.spec.var_positional:
|
|
49
|
+
converted.extend(self._convert(self.spec.var_positional, value)
|
|
50
|
+
for value in positional[len(names):])
|
|
51
|
+
return converted
|
|
52
|
+
|
|
53
|
+
def _convert_named(self, named):
|
|
54
|
+
names = set(self.spec.positional) | set(self.spec.named_only)
|
|
55
|
+
var_named = self.spec.var_named
|
|
56
|
+
return [(name, self._convert(name if name in names else var_named, value))
|
|
57
|
+
for name, value in named]
|
|
58
|
+
|
|
59
|
+
def _convert(self, name, value):
|
|
60
|
+
spec = self.spec
|
|
61
|
+
if (spec.types is None
|
|
62
|
+
or self.dry_run and contains_variable(value, identifiers='$@&%')):
|
|
63
|
+
return value
|
|
64
|
+
conversion_error = None
|
|
65
|
+
# Don't convert None if argument has None as a default value.
|
|
66
|
+
# Python < 3.11 adds None to type hints automatically when using None as
|
|
67
|
+
# a default value which preserves None automatically. This code keeps
|
|
68
|
+
# the same behavior also with newer Python versions. We can consider
|
|
69
|
+
# changing this once Python 3.11 is our minimum supported version.
|
|
70
|
+
if value is None and name in spec.defaults and spec.defaults[name] is None:
|
|
71
|
+
return value
|
|
72
|
+
# Primarily convert arguments based on type hints.
|
|
73
|
+
if name in spec.types:
|
|
74
|
+
info: TypeInfo = spec.types[name]
|
|
75
|
+
try:
|
|
76
|
+
return info.convert(value, name, self.custom_converters, self.languages)
|
|
77
|
+
except ValueError as err:
|
|
78
|
+
conversion_error = err
|
|
79
|
+
except TypeError:
|
|
80
|
+
pass
|
|
81
|
+
# Try conversion also based on the default value type. We probably should
|
|
82
|
+
# do this only if there is no explicit type hint, but Python < 3.11
|
|
83
|
+
# handling `arg: type = None` differently than newer versions would mean
|
|
84
|
+
# that conversion behavior depends on the Python version. Once Python 3.11
|
|
85
|
+
# is our minimum supported version, we can consider reopening
|
|
86
|
+
# https://github.com/robotframework/robotframework/issues/4881
|
|
87
|
+
if name in spec.defaults:
|
|
88
|
+
typ = type(spec.defaults[name])
|
|
89
|
+
if typ == str: # Don't convert arguments to strings.
|
|
90
|
+
info = TypeInfo()
|
|
91
|
+
elif typ == int: # Try also conversion to float.
|
|
92
|
+
info = TypeInfo.from_sequence([int, float])
|
|
93
|
+
else:
|
|
94
|
+
info = TypeInfo.from_type(typ)
|
|
95
|
+
try:
|
|
96
|
+
return info.convert(value, name, languages=self.languages)
|
|
97
|
+
except (ValueError, TypeError):
|
|
98
|
+
pass
|
|
99
|
+
if conversion_error:
|
|
100
|
+
raise conversion_error
|
|
101
|
+
return value
|
|
@@ -13,17 +13,21 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
from typing import TYPE_CHECKING
|
|
17
|
+
|
|
16
18
|
from robot.errors import DataError
|
|
17
19
|
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from .argumentspec import ArgumentSpec
|
|
22
|
+
|
|
18
23
|
|
|
19
24
|
class ArgumentMapper:
|
|
20
25
|
|
|
21
|
-
def __init__(self,
|
|
22
|
-
|
|
23
|
-
self._argspec = argspec
|
|
26
|
+
def __init__(self, arg_spec: 'ArgumentSpec'):
|
|
27
|
+
self.arg_spec = arg_spec
|
|
24
28
|
|
|
25
29
|
def map(self, positional, named, replace_defaults=True):
|
|
26
|
-
template = KeywordCallTemplate(self.
|
|
30
|
+
template = KeywordCallTemplate(self.arg_spec)
|
|
27
31
|
template.fill_positional(positional)
|
|
28
32
|
template.fill_named(named)
|
|
29
33
|
if replace_defaults:
|
|
@@ -33,19 +37,18 @@ class ArgumentMapper:
|
|
|
33
37
|
|
|
34
38
|
class KeywordCallTemplate:
|
|
35
39
|
|
|
36
|
-
def __init__(self,
|
|
37
|
-
|
|
38
|
-
self.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
for arg in argspec.positional]
|
|
40
|
+
def __init__(self, arg_spec: 'ArgumentSpec'):
|
|
41
|
+
self.arg_spec = arg_spec
|
|
42
|
+
self.args = [None if arg not in arg_spec.defaults
|
|
43
|
+
else DefaultValue(arg_spec.defaults[arg])
|
|
44
|
+
for arg in arg_spec.positional]
|
|
42
45
|
self.kwargs = []
|
|
43
46
|
|
|
44
47
|
def fill_positional(self, positional):
|
|
45
48
|
self.args[:len(positional)] = positional
|
|
46
49
|
|
|
47
50
|
def fill_named(self, named):
|
|
48
|
-
spec = self.
|
|
51
|
+
spec = self.arg_spec
|
|
49
52
|
for name, value in named:
|
|
50
53
|
if name in spec.positional_or_named:
|
|
51
54
|
index = spec.positional_or_named.index(name)
|
|
@@ -53,7 +56,7 @@ class KeywordCallTemplate:
|
|
|
53
56
|
elif spec.var_named or name in spec.named_only:
|
|
54
57
|
self.kwargs.append((name, value))
|
|
55
58
|
else:
|
|
56
|
-
raise DataError("Non-existing named argument '
|
|
59
|
+
raise DataError(f"Non-existing named argument '{name}'.")
|
|
57
60
|
named_names = {name for name, _ in named}
|
|
58
61
|
for name in spec.named_only:
|
|
59
62
|
if name not in named_names:
|
|
@@ -77,5 +80,4 @@ class DefaultValue:
|
|
|
77
80
|
try:
|
|
78
81
|
return variables.replace_scalar(self.value)
|
|
79
82
|
except DataError as err:
|
|
80
|
-
raise DataError('Resolving argument default values failed:
|
|
81
|
-
% err.message)
|
|
83
|
+
raise DataError(f'Resolving argument default values failed: {err}')
|