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
|
@@ -18,10 +18,11 @@ from ast import NodeVisitor
|
|
|
18
18
|
from robot.errors import DataError
|
|
19
19
|
from robot.output import LOGGER
|
|
20
20
|
from robot.parsing import File, Token
|
|
21
|
-
from robot.variables import
|
|
21
|
+
from robot.variables import VariableMatches
|
|
22
22
|
|
|
23
23
|
from .settings import FileSettings
|
|
24
|
-
from ..model import ResourceFile, TestSuite
|
|
24
|
+
from ..model import (For, If, IfBranch, ResourceFile, TestSuite, TestCase, Try,
|
|
25
|
+
TryBranch, UserKeyword, While)
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
class SettingsBuilder(NodeVisitor):
|
|
@@ -61,7 +62,7 @@ class SettingsBuilder(NodeVisitor):
|
|
|
61
62
|
def visit_DefaultTags(self, node):
|
|
62
63
|
self.settings.default_tags = node.values
|
|
63
64
|
|
|
64
|
-
def
|
|
65
|
+
def visit_TestTags(self, node):
|
|
65
66
|
self.settings.test_tags = node.values
|
|
66
67
|
|
|
67
68
|
def visit_KeywordTags(self, node):
|
|
@@ -109,6 +110,7 @@ class SuiteBuilder(NodeVisitor):
|
|
|
109
110
|
def visit_Variable(self, node):
|
|
110
111
|
self.suite.resource.variables.create(name=node.name,
|
|
111
112
|
value=node.value,
|
|
113
|
+
separator=node.separator,
|
|
112
114
|
lineno=node.lineno,
|
|
113
115
|
error=format_error(node.errors))
|
|
114
116
|
|
|
@@ -120,10 +122,10 @@ class SuiteBuilder(NodeVisitor):
|
|
|
120
122
|
self.generic_visit(node)
|
|
121
123
|
|
|
122
124
|
def visit_TestCase(self, node):
|
|
123
|
-
TestCaseBuilder(self.suite, self.settings).
|
|
125
|
+
TestCaseBuilder(self.suite, self.settings).build(node)
|
|
124
126
|
|
|
125
127
|
def visit_Keyword(self, node):
|
|
126
|
-
KeywordBuilder(self.suite.resource, self.settings).
|
|
128
|
+
KeywordBuilder(self.suite.resource, self.settings).build(node)
|
|
127
129
|
|
|
128
130
|
|
|
129
131
|
class ResourceBuilder(NodeVisitor):
|
|
@@ -154,40 +156,86 @@ class ResourceBuilder(NodeVisitor):
|
|
|
154
156
|
def visit_Variable(self, node):
|
|
155
157
|
self.resource.variables.create(name=node.name,
|
|
156
158
|
value=node.value,
|
|
159
|
+
separator=node.separator,
|
|
157
160
|
lineno=node.lineno,
|
|
158
161
|
error=format_error(node.errors))
|
|
159
162
|
|
|
160
163
|
def visit_Keyword(self, node):
|
|
161
|
-
KeywordBuilder(self.resource, self.settings).
|
|
164
|
+
KeywordBuilder(self.resource, self.settings).build(node)
|
|
162
165
|
|
|
163
166
|
|
|
164
|
-
class
|
|
167
|
+
class BodyBuilder(NodeVisitor):
|
|
168
|
+
|
|
169
|
+
def __init__(self, model: 'TestCase|UserKeyword|For|If|Try|While|None' = None):
|
|
170
|
+
self.model = model
|
|
171
|
+
|
|
172
|
+
def visit_For(self, node):
|
|
173
|
+
ForBuilder(self.model).build(node)
|
|
174
|
+
|
|
175
|
+
def visit_While(self, node):
|
|
176
|
+
WhileBuilder(self.model).build(node)
|
|
177
|
+
|
|
178
|
+
def visit_If(self, node):
|
|
179
|
+
IfBuilder(self.model).build(node)
|
|
180
|
+
|
|
181
|
+
def visit_Try(self, node):
|
|
182
|
+
TryBuilder(self.model).build(node)
|
|
183
|
+
|
|
184
|
+
def visit_KeywordCall(self, node):
|
|
185
|
+
self.model.body.create_keyword(name=node.keyword, args=node.args,
|
|
186
|
+
assign=node.assign, lineno=node.lineno)
|
|
187
|
+
|
|
188
|
+
def visit_TemplateArguments(self, node):
|
|
189
|
+
self.model.body.create_keyword(args=node.args, lineno=node.lineno)
|
|
190
|
+
|
|
191
|
+
def visit_Var(self, node):
|
|
192
|
+
self.model.body.create_var(node.name, node.value, node.scope, node.separator,
|
|
193
|
+
lineno=node.lineno, error=format_error(node.errors))
|
|
194
|
+
|
|
195
|
+
def visit_ReturnStatement(self, node):
|
|
196
|
+
self.model.body.create_return(node.values, lineno=node.lineno,
|
|
197
|
+
error=format_error(node.errors))
|
|
198
|
+
|
|
199
|
+
def visit_Continue(self, node):
|
|
200
|
+
self.model.body.create_continue(lineno=node.lineno,
|
|
201
|
+
error=format_error(node.errors))
|
|
202
|
+
|
|
203
|
+
def visit_Break(self, node):
|
|
204
|
+
self.model.body.create_break(lineno=node.lineno,
|
|
205
|
+
error=format_error(node.errors))
|
|
206
|
+
|
|
207
|
+
def visit_Error(self, node):
|
|
208
|
+
self.model.body.create_error(lineno=node.lineno,
|
|
209
|
+
values=node.values, error=format_error(node.errors))
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class TestCaseBuilder(BodyBuilder):
|
|
213
|
+
model: TestCase
|
|
165
214
|
|
|
166
215
|
def __init__(self, suite: TestSuite, settings: FileSettings):
|
|
167
|
-
|
|
216
|
+
super().__init__(suite.tests.create())
|
|
168
217
|
self.settings = settings
|
|
169
|
-
self.
|
|
170
|
-
self.tags = None
|
|
218
|
+
self._test_has_tags = False
|
|
171
219
|
|
|
172
|
-
def
|
|
173
|
-
error = format_error(node.errors + node.header.errors)
|
|
220
|
+
def build(self, node):
|
|
174
221
|
settings = self.settings
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
222
|
+
# Possible parsing errors aren't reported further with tests because:
|
|
223
|
+
# - We only validate that test body or name isn't empty.
|
|
224
|
+
# - That is validated again during execution.
|
|
225
|
+
# - This way e.g. model modifiers can add content to body.
|
|
226
|
+
self.model.config(name=node.name, tags=settings.test_tags,
|
|
227
|
+
timeout=settings.test_timeout,
|
|
228
|
+
template=settings.test_template,
|
|
229
|
+
lineno=node.lineno)
|
|
181
230
|
if settings.test_setup:
|
|
182
|
-
self.
|
|
231
|
+
self.model.setup.config(**settings.test_setup)
|
|
183
232
|
if settings.test_teardown:
|
|
184
|
-
self.
|
|
233
|
+
self.model.teardown.config(**settings.test_teardown)
|
|
185
234
|
self.generic_visit(node)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
self._set_template(self.test, self.test.template)
|
|
235
|
+
if not self._test_has_tags:
|
|
236
|
+
self.model.tags.add(settings.default_tags)
|
|
237
|
+
if self.model.template:
|
|
238
|
+
self._set_template(self.model, self.model.template)
|
|
191
239
|
|
|
192
240
|
def _set_template(self, parent, template):
|
|
193
241
|
for item in parent.body:
|
|
@@ -202,154 +250,98 @@ class TestCaseBuilder(NodeVisitor):
|
|
|
202
250
|
item.args = args
|
|
203
251
|
|
|
204
252
|
def _format_template(self, template, arguments):
|
|
205
|
-
|
|
206
|
-
count = len(
|
|
253
|
+
matches = VariableMatches(template, identifiers='$')
|
|
254
|
+
count = len(matches)
|
|
207
255
|
if count == 0 or count != len(arguments):
|
|
208
256
|
return template, arguments
|
|
209
257
|
temp = []
|
|
210
|
-
for
|
|
211
|
-
temp.
|
|
212
|
-
temp.append(after)
|
|
258
|
+
for match, arg in zip(matches, arguments):
|
|
259
|
+
temp[-1:] = [match.before, arg, match.after]
|
|
213
260
|
return ''.join(temp), ()
|
|
214
261
|
|
|
215
|
-
def visit_For(self, node):
|
|
216
|
-
ForBuilder(self.test).build(node)
|
|
217
|
-
|
|
218
|
-
def visit_While(self, node):
|
|
219
|
-
WhileBuilder(self.test).build(node)
|
|
220
|
-
|
|
221
|
-
def visit_If(self, node):
|
|
222
|
-
IfBuilder(self.test).build(node)
|
|
223
|
-
|
|
224
|
-
def visit_Try(self, node):
|
|
225
|
-
TryBuilder(self.test).build(node)
|
|
226
|
-
|
|
227
|
-
def visit_TemplateArguments(self, node):
|
|
228
|
-
self.test.body.create_keyword(args=node.args, lineno=node.lineno)
|
|
229
|
-
|
|
230
262
|
def visit_Documentation(self, node):
|
|
231
|
-
self.
|
|
263
|
+
self.model.doc = node.value
|
|
232
264
|
|
|
233
265
|
def visit_Setup(self, node):
|
|
234
|
-
self.
|
|
266
|
+
self.model.setup.config(name=node.name, args=node.args, lineno=node.lineno)
|
|
235
267
|
|
|
236
268
|
def visit_Teardown(self, node):
|
|
237
|
-
self.
|
|
269
|
+
self.model.teardown.config(name=node.name, args=node.args, lineno=node.lineno)
|
|
238
270
|
|
|
239
271
|
def visit_Timeout(self, node):
|
|
240
|
-
self.
|
|
272
|
+
self.model.timeout = node.value
|
|
241
273
|
|
|
242
274
|
def visit_Tags(self, node):
|
|
243
|
-
|
|
244
|
-
|
|
275
|
+
for tag in node.values:
|
|
276
|
+
if tag.startswith('-'):
|
|
277
|
+
self.model.tags.remove(tag[1:])
|
|
278
|
+
else:
|
|
279
|
+
self.model.tags.add(tag)
|
|
280
|
+
self._test_has_tags = True
|
|
245
281
|
|
|
246
282
|
def visit_Template(self, node):
|
|
247
|
-
self.
|
|
283
|
+
self.model.template = node.value
|
|
248
284
|
|
|
249
|
-
def visit_KeywordCall(self, node):
|
|
250
|
-
self.test.body.create_keyword(name=node.keyword, args=node.args,
|
|
251
|
-
assign=node.assign, lineno=node.lineno)
|
|
252
285
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
error=format_error(node.errors))
|
|
256
|
-
|
|
257
|
-
def visit_Continue(self, node):
|
|
258
|
-
self.test.body.create_continue(lineno=node.lineno,
|
|
259
|
-
error=format_error(node.errors))
|
|
260
|
-
|
|
261
|
-
def visit_Break(self, node):
|
|
262
|
-
self.test.body.create_break(lineno=node.lineno,
|
|
263
|
-
error=format_error(node.errors))
|
|
264
|
-
|
|
265
|
-
def visit_Error(self, node):
|
|
266
|
-
self.test.body.create_error(lineno=node.lineno,
|
|
267
|
-
values=node.values, error=format_error(node.errors))
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
class KeywordBuilder(NodeVisitor):
|
|
286
|
+
class KeywordBuilder(BodyBuilder):
|
|
287
|
+
model: UserKeyword
|
|
271
288
|
|
|
272
289
|
def __init__(self, resource: ResourceFile, settings: FileSettings):
|
|
273
|
-
|
|
274
|
-
self.settings = settings
|
|
275
|
-
self.kw = None
|
|
290
|
+
super().__init__(resource.keywords.create(tags=settings.keyword_tags))
|
|
276
291
|
|
|
277
|
-
def
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
292
|
+
def build(self, node):
|
|
293
|
+
# Possible parsing errors aren't reported further because:
|
|
294
|
+
# - We only validate that keyword body or name isn't empty.
|
|
295
|
+
# - That is validated again during execution.
|
|
296
|
+
# - This way e.g. model modifiers can add content to body.
|
|
297
|
+
self.model.config(name=node.name, lineno=node.lineno)
|
|
283
298
|
self.generic_visit(node)
|
|
284
299
|
|
|
285
300
|
def visit_Documentation(self, node):
|
|
286
|
-
self.
|
|
301
|
+
self.model.doc = node.value
|
|
287
302
|
|
|
288
303
|
def visit_Arguments(self, node):
|
|
289
|
-
self.
|
|
304
|
+
self.model.args = node.values
|
|
290
305
|
if node.errors:
|
|
291
306
|
error = format_error(node.errors)
|
|
292
|
-
self.
|
|
307
|
+
self.model.error = f'Invalid argument specification: {error}'
|
|
293
308
|
|
|
294
309
|
def visit_Tags(self, node):
|
|
295
|
-
|
|
296
|
-
|
|
310
|
+
for tag in node.values:
|
|
311
|
+
if tag.startswith('-'):
|
|
312
|
+
self.model.tags.remove(tag[1:])
|
|
313
|
+
else:
|
|
314
|
+
self.model.tags.add(tag)
|
|
297
315
|
|
|
298
316
|
def visit_Return(self, node):
|
|
299
|
-
self.
|
|
317
|
+
ErrorReporter(self.model.source).visit(node)
|
|
318
|
+
self.model.return_ = node.values
|
|
300
319
|
|
|
301
320
|
def visit_Timeout(self, node):
|
|
302
|
-
self.
|
|
321
|
+
self.model.timeout = node.value
|
|
322
|
+
|
|
323
|
+
def visit_Setup(self, node):
|
|
324
|
+
self.model.setup.config(name=node.name, args=node.args, lineno=node.lineno)
|
|
303
325
|
|
|
304
326
|
def visit_Teardown(self, node):
|
|
305
|
-
self.
|
|
306
|
-
lineno=node.lineno)
|
|
327
|
+
self.model.teardown.config(name=node.name, args=node.args, lineno=node.lineno)
|
|
307
328
|
|
|
308
329
|
def visit_KeywordCall(self, node):
|
|
309
|
-
self.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
def visit_ReturnStatement(self, node):
|
|
313
|
-
self.kw.body.create_return(node.values, lineno=node.lineno,
|
|
314
|
-
error=format_error(node.errors))
|
|
315
|
-
|
|
316
|
-
def visit_Continue(self, node):
|
|
317
|
-
self.kw.body.create_continue(lineno=node.lineno,
|
|
318
|
-
error=format_error(node.errors))
|
|
319
|
-
|
|
320
|
-
def visit_Break(self, node):
|
|
321
|
-
self.kw.body.create_break(lineno=node.lineno,
|
|
322
|
-
error=format_error(node.errors))
|
|
323
|
-
|
|
324
|
-
def visit_For(self, node):
|
|
325
|
-
ForBuilder(self.kw).build(node)
|
|
326
|
-
|
|
327
|
-
def visit_While(self, node):
|
|
328
|
-
WhileBuilder(self.kw).build(node)
|
|
329
|
-
|
|
330
|
-
def visit_If(self, node):
|
|
331
|
-
IfBuilder(self.kw).build(node)
|
|
332
|
-
|
|
333
|
-
def visit_Try(self, node):
|
|
334
|
-
TryBuilder(self.kw).build(node)
|
|
335
|
-
|
|
336
|
-
def visit_Error(self, node):
|
|
337
|
-
self.kw.body.create_error(lineno=node.lineno,
|
|
338
|
-
values=node.values, error=format_error(node.errors))
|
|
330
|
+
self.model.body.create_keyword(name=node.keyword, args=node.args,
|
|
331
|
+
assign=node.assign, lineno=node.lineno)
|
|
339
332
|
|
|
340
333
|
|
|
341
|
-
class ForBuilder(
|
|
334
|
+
class ForBuilder(BodyBuilder):
|
|
335
|
+
model: For
|
|
342
336
|
|
|
343
|
-
def __init__(self, parent):
|
|
344
|
-
|
|
345
|
-
self.model = None
|
|
337
|
+
def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
|
|
338
|
+
super().__init__(parent.body.create_for())
|
|
346
339
|
|
|
347
340
|
def build(self, node):
|
|
348
341
|
error = format_error(self._get_errors(node))
|
|
349
|
-
self.model =
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
)
|
|
342
|
+
self.model.config(assign=node.assign, flavor=node.flavor, values=node.values,
|
|
343
|
+
start=node.start, mode=node.mode, fill=node.fill,
|
|
344
|
+
lineno=node.lineno, error=error)
|
|
353
345
|
for step in node.body:
|
|
354
346
|
self.visit(step)
|
|
355
347
|
return self.model
|
|
@@ -360,57 +352,22 @@ class ForBuilder(NodeVisitor):
|
|
|
360
352
|
errors += node.end.errors
|
|
361
353
|
return errors
|
|
362
354
|
|
|
363
|
-
def visit_KeywordCall(self, node):
|
|
364
|
-
self.model.body.create_keyword(name=node.keyword, args=node.args,
|
|
365
|
-
assign=node.assign, lineno=node.lineno)
|
|
366
|
-
|
|
367
|
-
def visit_TemplateArguments(self, node):
|
|
368
|
-
self.model.body.create_keyword(args=node.args, lineno=node.lineno)
|
|
369
|
-
|
|
370
|
-
def visit_For(self, node):
|
|
371
|
-
ForBuilder(self.model).build(node)
|
|
372
|
-
|
|
373
|
-
def visit_While(self, node):
|
|
374
|
-
WhileBuilder(self.model).build(node)
|
|
375
355
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
def visit_Try(self, node):
|
|
380
|
-
TryBuilder(self.model).build(node)
|
|
356
|
+
class IfBuilder(BodyBuilder):
|
|
357
|
+
model: 'IfBranch|None'
|
|
381
358
|
|
|
382
|
-
def
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
def visit_Continue(self, node):
|
|
387
|
-
self.model.body.create_continue(lineno=node.lineno,
|
|
388
|
-
error=format_error(node.errors))
|
|
389
|
-
|
|
390
|
-
def visit_Break(self, node):
|
|
391
|
-
self.model.body.create_break(lineno=node.lineno,
|
|
392
|
-
error=format_error(node.errors))
|
|
393
|
-
|
|
394
|
-
def visit_Error(self, node):
|
|
395
|
-
self.model.body.create_error(lineno=node.lineno,
|
|
396
|
-
values=node.values, error=format_error(node.errors))
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
class IfBuilder(NodeVisitor):
|
|
400
|
-
|
|
401
|
-
def __init__(self, parent):
|
|
402
|
-
self.parent = parent
|
|
403
|
-
self.model = None
|
|
359
|
+
def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
|
|
360
|
+
super().__init__()
|
|
361
|
+
self.root = parent.body.create_if()
|
|
404
362
|
|
|
405
363
|
def build(self, node):
|
|
406
|
-
|
|
407
|
-
error=format_error(self._get_errors(node)))
|
|
364
|
+
self.root.config(lineno=node.lineno, error=format_error(self._get_errors(node)))
|
|
408
365
|
assign = node.assign
|
|
409
366
|
node_type = None
|
|
410
367
|
while node:
|
|
411
368
|
node_type = node.type if node.type != 'INLINE IF' else 'IF'
|
|
412
|
-
self.model = root.body.create_branch(node_type, node.condition,
|
|
413
|
-
|
|
369
|
+
self.model = self.root.body.create_branch(node_type, node.condition,
|
|
370
|
+
lineno=node.lineno)
|
|
414
371
|
for step in node.body:
|
|
415
372
|
self.visit(step)
|
|
416
373
|
if assign:
|
|
@@ -422,10 +379,10 @@ class IfBuilder(NodeVisitor):
|
|
|
422
379
|
node = node.orelse
|
|
423
380
|
# Smallish hack to make sure assignment is always run.
|
|
424
381
|
if assign and node_type != 'ELSE':
|
|
425
|
-
root.body.create_branch('ELSE').body.create_keyword(
|
|
382
|
+
self.root.body.create_branch('ELSE').body.create_keyword(
|
|
426
383
|
assign=assign, name='BuiltIn.Set Variable', args=['${NONE}']
|
|
427
384
|
)
|
|
428
|
-
return root
|
|
385
|
+
return self.root
|
|
429
386
|
|
|
430
387
|
def _get_errors(self, node):
|
|
431
388
|
errors = node.header.errors + node.errors
|
|
@@ -435,64 +392,30 @@ class IfBuilder(NodeVisitor):
|
|
|
435
392
|
errors += node.end.errors
|
|
436
393
|
return errors
|
|
437
394
|
|
|
438
|
-
def visit_KeywordCall(self, node):
|
|
439
|
-
self.model.body.create_keyword(name=node.keyword, args=node.args,
|
|
440
|
-
assign=node.assign, lineno=node.lineno)
|
|
441
395
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
def visit_For(self, node):
|
|
446
|
-
ForBuilder(self.model).build(node)
|
|
447
|
-
|
|
448
|
-
def visit_While(self, node):
|
|
449
|
-
WhileBuilder(self.model).build(node)
|
|
396
|
+
class TryBuilder(BodyBuilder):
|
|
397
|
+
model: 'TryBranch|None'
|
|
450
398
|
|
|
451
|
-
def
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
def visit_Try(self, node):
|
|
455
|
-
TryBuilder(self.model).build(node)
|
|
456
|
-
|
|
457
|
-
def visit_ReturnStatement(self, node):
|
|
458
|
-
self.model.body.create_return(node.values, lineno=node.lineno,
|
|
459
|
-
error=format_error(node.errors))
|
|
460
|
-
|
|
461
|
-
def visit_Continue(self, node):
|
|
462
|
-
self.model.body.create_continue(lineno=node.lineno,
|
|
463
|
-
error=format_error(node.errors))
|
|
464
|
-
|
|
465
|
-
def visit_Break(self, node):
|
|
466
|
-
self.model.body.create_break(lineno=node.lineno,
|
|
467
|
-
error=format_error(node.errors))
|
|
468
|
-
|
|
469
|
-
def visit_Error(self, node):
|
|
470
|
-
self.model.body.create_error(lineno=node.lineno,
|
|
471
|
-
values=node.values, error=format_error(node.errors))
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
class TryBuilder(NodeVisitor):
|
|
475
|
-
|
|
476
|
-
def __init__(self, parent):
|
|
477
|
-
self.parent = parent
|
|
478
|
-
self.model = None
|
|
399
|
+
def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
|
|
400
|
+
super().__init__()
|
|
401
|
+
self.root = parent.body.create_try()
|
|
479
402
|
self.template_error = None
|
|
480
403
|
|
|
481
404
|
def build(self, node):
|
|
482
|
-
|
|
405
|
+
self.root.config(lineno=node.lineno)
|
|
483
406
|
errors = self._get_errors(node)
|
|
484
407
|
while node:
|
|
485
|
-
self.model = root.body.create_branch(node.type, node.patterns,
|
|
486
|
-
|
|
487
|
-
|
|
408
|
+
self.model = self.root.body.create_branch(node.type, node.patterns,
|
|
409
|
+
node.pattern_type, node.assign,
|
|
410
|
+
lineno=node.lineno)
|
|
488
411
|
for step in node.body:
|
|
489
412
|
self.visit(step)
|
|
490
413
|
node = node.next
|
|
491
414
|
if self.template_error:
|
|
492
415
|
errors += (self.template_error,)
|
|
493
416
|
if errors:
|
|
494
|
-
root.error = format_error(errors)
|
|
495
|
-
return root
|
|
417
|
+
self.root.error = format_error(errors)
|
|
418
|
+
return self.root
|
|
496
419
|
|
|
497
420
|
def _get_errors(self, node):
|
|
498
421
|
errors = node.header.errors + node.errors
|
|
@@ -502,54 +425,21 @@ class TryBuilder(NodeVisitor):
|
|
|
502
425
|
errors += node.end.errors
|
|
503
426
|
return errors
|
|
504
427
|
|
|
505
|
-
def visit_For(self, node):
|
|
506
|
-
ForBuilder(self.model).build(node)
|
|
507
|
-
|
|
508
|
-
def visit_While(self, node):
|
|
509
|
-
WhileBuilder(self.model).build(node)
|
|
510
|
-
|
|
511
|
-
def visit_If(self, node):
|
|
512
|
-
IfBuilder(self.model).build(node)
|
|
513
|
-
|
|
514
|
-
def visit_Try(self, node):
|
|
515
|
-
TryBuilder(self.model).build(node)
|
|
516
|
-
|
|
517
|
-
def visit_ReturnStatement(self, node):
|
|
518
|
-
self.model.body.create_return(node.values, lineno=node.lineno,
|
|
519
|
-
error=format_error(node.errors))
|
|
520
|
-
|
|
521
|
-
def visit_Continue(self, node):
|
|
522
|
-
self.model.body.create_continue(lineno=node.lineno,
|
|
523
|
-
error=format_error(node.errors))
|
|
524
|
-
|
|
525
|
-
def visit_Break(self, node):
|
|
526
|
-
self.model.body.create_break(lineno=node.lineno,
|
|
527
|
-
error=format_error(node.errors))
|
|
528
|
-
|
|
529
|
-
def visit_KeywordCall(self, node):
|
|
530
|
-
self.model.body.create_keyword(name=node.keyword, args=node.args,
|
|
531
|
-
assign=node.assign, lineno=node.lineno)
|
|
532
|
-
|
|
533
428
|
def visit_TemplateArguments(self, node):
|
|
534
429
|
self.template_error = 'Templates cannot be used with TRY.'
|
|
535
430
|
|
|
536
|
-
def visit_Error(self, node):
|
|
537
|
-
self.model.body.create_error(lineno=node.lineno,
|
|
538
|
-
values=node.values, error=format_error(node.errors))
|
|
539
|
-
|
|
540
431
|
|
|
541
|
-
class WhileBuilder(
|
|
432
|
+
class WhileBuilder(BodyBuilder):
|
|
433
|
+
model: While
|
|
542
434
|
|
|
543
|
-
def __init__(self, parent):
|
|
544
|
-
|
|
545
|
-
self.model = None
|
|
435
|
+
def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
|
|
436
|
+
super().__init__(parent.body.create_while())
|
|
546
437
|
|
|
547
438
|
def build(self, node):
|
|
548
439
|
error = format_error(self._get_errors(node))
|
|
549
|
-
self.model =
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
)
|
|
440
|
+
self.model.config(condition=node.condition, limit=node.limit,
|
|
441
|
+
on_limit=node.on_limit, on_limit_message=node.on_limit_message,
|
|
442
|
+
lineno=node.lineno, error=error)
|
|
553
443
|
for step in node.body:
|
|
554
444
|
self.visit(step)
|
|
555
445
|
return self.model
|
|
@@ -560,39 +450,6 @@ class WhileBuilder(NodeVisitor):
|
|
|
560
450
|
errors += node.end.errors
|
|
561
451
|
return errors
|
|
562
452
|
|
|
563
|
-
def visit_KeywordCall(self, node):
|
|
564
|
-
self.model.body.create_keyword(name=node.keyword, args=node.args,
|
|
565
|
-
assign=node.assign, lineno=node.lineno)
|
|
566
|
-
|
|
567
|
-
def visit_TemplateArguments(self, node):
|
|
568
|
-
self.model.body.create_keyword(args=node.args, lineno=node.lineno)
|
|
569
|
-
|
|
570
|
-
def visit_For(self, node):
|
|
571
|
-
ForBuilder(self.model).build(node)
|
|
572
|
-
|
|
573
|
-
def visit_While(self, node):
|
|
574
|
-
WhileBuilder(self.model).build(node)
|
|
575
|
-
|
|
576
|
-
def visit_If(self, node):
|
|
577
|
-
IfBuilder(self.model).build(node)
|
|
578
|
-
|
|
579
|
-
def visit_Try(self, node):
|
|
580
|
-
TryBuilder(self.model).build(node)
|
|
581
|
-
|
|
582
|
-
def visit_ReturnStatement(self, node):
|
|
583
|
-
self.model.body.create_return(node.values, lineno=node.lineno,
|
|
584
|
-
error=format_error(node.errors))
|
|
585
|
-
|
|
586
|
-
def visit_Break(self, node):
|
|
587
|
-
self.model.body.create_break(error=format_error(node.errors))
|
|
588
|
-
|
|
589
|
-
def visit_Continue(self, node):
|
|
590
|
-
self.model.body.create_continue(error=format_error(node.errors))
|
|
591
|
-
|
|
592
|
-
def visit_Error(self, node):
|
|
593
|
-
self.model.body.create_error(lineno=node.lineno,
|
|
594
|
-
values=node.values, error=format_error(node.errors))
|
|
595
|
-
|
|
596
453
|
|
|
597
454
|
def format_error(errors):
|
|
598
455
|
if not errors:
|
|
@@ -602,18 +459,6 @@ def format_error(errors):
|
|
|
602
459
|
return '\n- '.join(('Multiple errors:',) + errors)
|
|
603
460
|
|
|
604
461
|
|
|
605
|
-
def deprecate_tags_starting_with_hyphen(node, source):
|
|
606
|
-
for tag in node.values:
|
|
607
|
-
if tag.startswith('-'):
|
|
608
|
-
LOGGER.warn(
|
|
609
|
-
f"Error in file '{source}' on line {node.lineno}: "
|
|
610
|
-
f"Settings tags starting with a hyphen using the '[Tags]' setting "
|
|
611
|
-
f"is deprecated. In Robot Framework 7.0 this syntax will be used "
|
|
612
|
-
f"for removing tags. Escape '{tag}' like '\\{tag}' to use the "
|
|
613
|
-
f"literal value and to avoid this warning."
|
|
614
|
-
)
|
|
615
|
-
|
|
616
|
-
|
|
617
462
|
class ErrorReporter(NodeVisitor):
|
|
618
463
|
|
|
619
464
|
def __init__(self, source, raise_on_invalid_header=False):
|
|
@@ -626,13 +471,26 @@ class ErrorReporter(NodeVisitor):
|
|
|
626
471
|
def visit_Keyword(self, node):
|
|
627
472
|
pass
|
|
628
473
|
|
|
474
|
+
def visit_Return(self, node):
|
|
475
|
+
# Empty 'visit_Keyword' above prevents calling this when visiting the whole
|
|
476
|
+
# model, but 'KeywordBuilder.visit_Return' visits the node it gets.
|
|
477
|
+
LOGGER.warn(self._format_message(node.get_token(Token.RETURN_SETTING)))
|
|
478
|
+
|
|
629
479
|
def visit_SectionHeader(self, node):
|
|
630
|
-
token = node.get_token(Token.
|
|
631
|
-
if token:
|
|
480
|
+
token = node.get_token(*Token.HEADER_TOKENS)
|
|
481
|
+
if not token.error:
|
|
482
|
+
return
|
|
483
|
+
message = self._format_message(token)
|
|
484
|
+
if token.type == Token.INVALID_HEADER:
|
|
632
485
|
if self.raise_on_invalid_header:
|
|
633
|
-
raise DataError(
|
|
486
|
+
raise DataError(message)
|
|
634
487
|
else:
|
|
635
|
-
LOGGER.error(
|
|
488
|
+
LOGGER.error(message)
|
|
489
|
+
else:
|
|
490
|
+
# Errors, other than totally invalid headers, can occur only with
|
|
491
|
+
# deprecated singular headers, and we want to report them as warnings.
|
|
492
|
+
# A more generic solution for separating errors and warnings would be good.
|
|
493
|
+
LOGGER.warn(self._format_message(token))
|
|
636
494
|
|
|
637
495
|
def visit_Error(self, node):
|
|
638
496
|
for error in node.get_tokens(Token.ERROR):
|