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
|
@@ -14,14 +14,12 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
from robot.errors import DataError, VariableError
|
|
17
|
-
from robot.utils import DotDict, is_dict_like, is_list_like, NormalizedDict,
|
|
17
|
+
from robot.utils import (DotDict, is_dict_like, is_list_like, NormalizedDict, NOT_SET,
|
|
18
|
+
type_name)
|
|
18
19
|
|
|
19
20
|
from .notfound import variable_not_found
|
|
20
21
|
from .resolvable import GlobalVariableValue, Resolvable
|
|
21
|
-
from .search import is_assign
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
NOT_SET = object()
|
|
22
|
+
from .search import is_assign, unescape_variable_syntax
|
|
25
23
|
|
|
26
24
|
|
|
27
25
|
class VariableStore:
|
|
@@ -48,7 +46,7 @@ class VariableStore:
|
|
|
48
46
|
# Recursive resolving may have already removed variable.
|
|
49
47
|
if name in self.data:
|
|
50
48
|
self.data.pop(name)
|
|
51
|
-
value.report_error(err)
|
|
49
|
+
value.report_error(str(err))
|
|
52
50
|
variable_not_found('${%s}' % name, self.data)
|
|
53
51
|
return self.data[name]
|
|
54
52
|
|
|
@@ -68,7 +66,7 @@ class VariableStore:
|
|
|
68
66
|
if decorated:
|
|
69
67
|
name = self._undecorate(name)
|
|
70
68
|
return self[name]
|
|
71
|
-
except
|
|
69
|
+
except DataError:
|
|
72
70
|
if default is NOT_SET:
|
|
73
71
|
raise
|
|
74
72
|
return default
|
|
@@ -88,26 +86,26 @@ class VariableStore:
|
|
|
88
86
|
self.data[name] = value
|
|
89
87
|
|
|
90
88
|
def _undecorate(self, name):
|
|
91
|
-
if not is_assign(name):
|
|
92
|
-
raise
|
|
93
|
-
return
|
|
89
|
+
if not is_assign(name, allow_nested=True):
|
|
90
|
+
raise DataError(f"Invalid variable name '{name}'.")
|
|
91
|
+
return self._variables.replace_string(
|
|
92
|
+
name[2:-1], custom_unescaper=unescape_variable_syntax
|
|
93
|
+
)
|
|
94
94
|
|
|
95
95
|
def _undecorate_and_validate(self, name, value):
|
|
96
96
|
undecorated = self._undecorate(name)
|
|
97
|
+
if isinstance(value, Resolvable):
|
|
98
|
+
return undecorated, value
|
|
97
99
|
if name[0] == '@':
|
|
98
100
|
if not is_list_like(value):
|
|
99
|
-
|
|
101
|
+
raise DataError(f'Expected list-like value, got {type_name(value)}.')
|
|
100
102
|
value = list(value)
|
|
101
103
|
if name[0] == '&':
|
|
102
104
|
if not is_dict_like(value):
|
|
103
|
-
|
|
105
|
+
raise DataError(f'Expected dictionary-like value, got {type_name(value)}.')
|
|
104
106
|
value = DotDict(value)
|
|
105
107
|
return undecorated, value
|
|
106
108
|
|
|
107
|
-
def _raise_cannot_set_type(self, name, value, expected):
|
|
108
|
-
raise VariableError("Cannot set variable '%s': Expected %s-like value, got %s."
|
|
109
|
-
% (name, expected, type_name(value)))
|
|
110
|
-
|
|
111
109
|
def __len__(self):
|
|
112
110
|
return len(self.data)
|
|
113
111
|
|
|
@@ -0,0 +1,164 @@
|
|
|
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 contextlib import contextmanager
|
|
17
|
+
from typing import Sequence, TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
from robot.errors import DataError
|
|
20
|
+
from robot.utils import DotDict, split_from_equals
|
|
21
|
+
|
|
22
|
+
from .resolvable import Resolvable
|
|
23
|
+
from .search import is_assign, is_list_variable, is_dict_variable
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from robot.running.model import Var, Variable
|
|
27
|
+
from .store import VariableStore
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class VariableTableSetter:
|
|
31
|
+
|
|
32
|
+
def __init__(self, store: 'VariableStore'):
|
|
33
|
+
self.store = store
|
|
34
|
+
|
|
35
|
+
def set(self, variables: 'Sequence[Variable]', overwrite: bool = False):
|
|
36
|
+
for var in variables:
|
|
37
|
+
try:
|
|
38
|
+
value = VariableResolver.from_variable(var)
|
|
39
|
+
self.store.add(var.name, value, overwrite)
|
|
40
|
+
except DataError as err:
|
|
41
|
+
var.report_error(str(err))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class VariableResolver(Resolvable):
|
|
45
|
+
|
|
46
|
+
def __init__(self, value: Sequence[str], error_reporter=None):
|
|
47
|
+
self.value = tuple(value)
|
|
48
|
+
self.error_reporter = error_reporter
|
|
49
|
+
self._resolving = False
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
def from_name_and_value(cls, name: str, value: 'str|Sequence[str]',
|
|
53
|
+
separator: 'str|None' = None,
|
|
54
|
+
error_reporter=None) -> 'VariableResolver':
|
|
55
|
+
if not is_assign(name, allow_nested=True):
|
|
56
|
+
raise DataError(f"Invalid variable name '{name}'.")
|
|
57
|
+
if name[0] == '$':
|
|
58
|
+
return ScalarVariableResolver(value, separator, error_reporter)
|
|
59
|
+
if separator is not None:
|
|
60
|
+
raise DataError('Only scalar variables support separators.')
|
|
61
|
+
klass = {'@': ListVariableResolver,
|
|
62
|
+
'&': DictVariableResolver}[name[0]]
|
|
63
|
+
return klass(value, error_reporter)
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def from_variable(cls, var: 'Var|Variable') -> 'VariableResolver':
|
|
67
|
+
if var.error:
|
|
68
|
+
raise DataError(var.error)
|
|
69
|
+
return cls.from_name_and_value(var.name, var.value, var.separator,
|
|
70
|
+
getattr(var, 'report_error', None))
|
|
71
|
+
|
|
72
|
+
def resolve(self, variables):
|
|
73
|
+
with self._avoid_recursion:
|
|
74
|
+
return self._replace_variables(variables)
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
@contextmanager
|
|
78
|
+
def _avoid_recursion(self):
|
|
79
|
+
if self._resolving:
|
|
80
|
+
raise DataError('Recursive variable definition.')
|
|
81
|
+
self._resolving = True
|
|
82
|
+
try:
|
|
83
|
+
yield
|
|
84
|
+
finally:
|
|
85
|
+
self._resolving = False
|
|
86
|
+
|
|
87
|
+
def _replace_variables(self, variables):
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
|
|
90
|
+
def report_error(self, error):
|
|
91
|
+
if self.error_reporter:
|
|
92
|
+
self.error_reporter(error)
|
|
93
|
+
else:
|
|
94
|
+
raise DataError(f'Error reporter not set. Reported error was: {error}')
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class ScalarVariableResolver(VariableResolver):
|
|
98
|
+
|
|
99
|
+
def __init__(self, value: 'str|Sequence[str]', separator: 'str|None' = None,
|
|
100
|
+
error_reporter=None):
|
|
101
|
+
value, separator = self._get_value_and_separator(value, separator)
|
|
102
|
+
super().__init__(value, error_reporter)
|
|
103
|
+
self.separator = separator
|
|
104
|
+
|
|
105
|
+
def _get_value_and_separator(self, value, separator):
|
|
106
|
+
if isinstance(value, str):
|
|
107
|
+
value = [value]
|
|
108
|
+
elif separator is None and value and value[0].startswith('SEPARATOR='):
|
|
109
|
+
separator = value[0][10:]
|
|
110
|
+
value = value[1:]
|
|
111
|
+
return value, separator
|
|
112
|
+
|
|
113
|
+
def _replace_variables(self, variables):
|
|
114
|
+
value, separator = self.value, self.separator
|
|
115
|
+
if self._is_single_value(value, separator):
|
|
116
|
+
return variables.replace_scalar(value[0])
|
|
117
|
+
if separator is None:
|
|
118
|
+
separator = ' '
|
|
119
|
+
else:
|
|
120
|
+
separator = variables.replace_string(separator)
|
|
121
|
+
value = variables.replace_list(value)
|
|
122
|
+
return separator.join(str(item) for item in value)
|
|
123
|
+
|
|
124
|
+
def _is_single_value(self, value, separator):
|
|
125
|
+
return separator is None and len(value) == 1 and not is_list_variable(value[0])
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class ListVariableResolver(VariableResolver):
|
|
129
|
+
|
|
130
|
+
def _replace_variables(self, variables):
|
|
131
|
+
return variables.replace_list(self.value)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class DictVariableResolver(VariableResolver):
|
|
135
|
+
|
|
136
|
+
def __init__(self, value: Sequence[str], error_reporter=None):
|
|
137
|
+
super().__init__(tuple(self._yield_formatted(value)), error_reporter)
|
|
138
|
+
|
|
139
|
+
def _yield_formatted(self, values):
|
|
140
|
+
for item in values:
|
|
141
|
+
if is_dict_variable(item):
|
|
142
|
+
yield item
|
|
143
|
+
else:
|
|
144
|
+
name, value = split_from_equals(item)
|
|
145
|
+
if value is None:
|
|
146
|
+
raise DataError(
|
|
147
|
+
f"Invalid dictionary variable item '{item}'. Items must use "
|
|
148
|
+
f"'name=value' syntax or be dictionary variables themselves."
|
|
149
|
+
)
|
|
150
|
+
yield name, value
|
|
151
|
+
|
|
152
|
+
def _replace_variables(self, variables):
|
|
153
|
+
try:
|
|
154
|
+
return DotDict(self._yield_replaced(self.value, variables.replace_scalar))
|
|
155
|
+
except TypeError as err:
|
|
156
|
+
raise DataError(f'Creating dictionary variable failed: {err}')
|
|
157
|
+
|
|
158
|
+
def _yield_replaced(self, values, replace_scalar):
|
|
159
|
+
for item in values:
|
|
160
|
+
if isinstance(item, tuple):
|
|
161
|
+
key, values = item
|
|
162
|
+
yield replace_scalar(key), replace_scalar(values)
|
|
163
|
+
else:
|
|
164
|
+
yield from replace_scalar(item).items()
|
|
@@ -61,7 +61,7 @@ class Variables:
|
|
|
61
61
|
setter = VariableFileSetter(self.store)
|
|
62
62
|
return setter.set(path_or_variables, args, overwrite)
|
|
63
63
|
|
|
64
|
-
def
|
|
64
|
+
def set_from_variable_section(self, variables, overwrite=False):
|
|
65
65
|
setter = VariableTableSetter(self.store)
|
|
66
66
|
setter.set(variables, overwrite)
|
|
67
67
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: robotframework
|
|
3
|
-
Version:
|
|
3
|
+
Version: 7.0a1
|
|
4
4
|
Summary: Generic automation framework for acceptance testing and robotic process automation (RPA)
|
|
5
5
|
Home-page: https://robotframework.org
|
|
6
6
|
Author: Pekka Klärck
|
|
@@ -10,9 +10,8 @@ Download-URL: https://pypi.org/project/robotframework
|
|
|
10
10
|
Project-URL: Source, https://github.com/robotframework/robotframework
|
|
11
11
|
Project-URL: Issue Tracker, https://github.com/robotframework/robotframework/issues
|
|
12
12
|
Project-URL: Documentation, https://robotframework.org/robotframework
|
|
13
|
-
Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-
|
|
13
|
+
Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.0a1.rst
|
|
14
14
|
Project-URL: Slack, http://slack.robotframework.org
|
|
15
|
-
Project-URL: Twitter, https://twitter.com/robotframework
|
|
16
15
|
Description: Robot Framework
|
|
17
16
|
===============
|
|
18
17
|
|
|
@@ -171,8 +170,6 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
171
170
|
Classifier: Operating System :: OS Independent
|
|
172
171
|
Classifier: Programming Language :: Python :: 3
|
|
173
172
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
174
|
-
Classifier: Programming Language :: Python :: 3.6
|
|
175
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
176
173
|
Classifier: Programming Language :: Python :: 3.8
|
|
177
174
|
Classifier: Programming Language :: Python :: 3.9
|
|
178
175
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -184,5 +181,5 @@ Classifier: Topic :: Software Development :: Testing
|
|
|
184
181
|
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
|
185
182
|
Classifier: Topic :: Software Development :: Testing :: BDD
|
|
186
183
|
Classifier: Framework :: Robot Framework
|
|
187
|
-
Requires-Python: >=3.
|
|
184
|
+
Requires-Python: >=3.8
|
|
188
185
|
Description-Content-Type: text/x-rst
|
|
@@ -86,7 +86,6 @@ src/robot/libraries/Easter.py
|
|
|
86
86
|
src/robot/libraries/OperatingSystem.py
|
|
87
87
|
src/robot/libraries/Process.py
|
|
88
88
|
src/robot/libraries/Remote.py
|
|
89
|
-
src/robot/libraries/Reserved.py
|
|
90
89
|
src/robot/libraries/Screenshot.py
|
|
91
90
|
src/robot/libraries/String.py
|
|
92
91
|
src/robot/libraries/Telnet.py
|
|
@@ -120,10 +119,9 @@ src/robot/output/__init__.py
|
|
|
120
119
|
src/robot/output/debugfile.py
|
|
121
120
|
src/robot/output/filelogger.py
|
|
122
121
|
src/robot/output/librarylogger.py
|
|
123
|
-
src/robot/output/listenerarguments.py
|
|
124
|
-
src/robot/output/listenermethods.py
|
|
125
122
|
src/robot/output/listeners.py
|
|
126
123
|
src/robot/output/logger.py
|
|
124
|
+
src/robot/output/loggerapi.py
|
|
127
125
|
src/robot/output/loggerhelper.py
|
|
128
126
|
src/robot/output/output.py
|
|
129
127
|
src/robot/output/pyloggingconf.py
|
|
@@ -187,7 +185,6 @@ src/robot/running/importer.py
|
|
|
187
185
|
src/robot/running/librarykeywordrunner.py
|
|
188
186
|
src/robot/running/libraryscopes.py
|
|
189
187
|
src/robot/running/model.py
|
|
190
|
-
src/robot/running/modelcombiner.py
|
|
191
188
|
src/robot/running/namespace.py
|
|
192
189
|
src/robot/running/outputcapture.py
|
|
193
190
|
src/robot/running/randomizer.py
|
|
@@ -210,6 +207,7 @@ src/robot/running/arguments/argumentvalidator.py
|
|
|
210
207
|
src/robot/running/arguments/customconverters.py
|
|
211
208
|
src/robot/running/arguments/embedded.py
|
|
212
209
|
src/robot/running/arguments/typeconverters.py
|
|
210
|
+
src/robot/running/arguments/typeinfo.py
|
|
213
211
|
src/robot/running/arguments/typevalidator.py
|
|
214
212
|
src/robot/running/builder/__init__.py
|
|
215
213
|
src/robot/running/builder/builders.py
|
|
@@ -241,6 +239,7 @@ src/robot/utils/markupwriters.py
|
|
|
241
239
|
src/robot/utils/match.py
|
|
242
240
|
src/robot/utils/misc.py
|
|
243
241
|
src/robot/utils/normalizing.py
|
|
242
|
+
src/robot/utils/notset.py
|
|
244
243
|
src/robot/utils/platform.py
|
|
245
244
|
src/robot/utils/recommendations.py
|
|
246
245
|
src/robot/utils/restreader.py
|
|
@@ -33,9 +33,9 @@ and bug fixes. **MORE intro stuff...**
|
|
|
33
33
|
All issues targeted for Robot Framework {version.milestone} can be found
|
|
34
34
|
from the `issue tracker milestone`_.
|
|
35
35
|
|
|
36
|
-
Questions and comments related to the release can be sent to the
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
Questions and comments related to the release can be sent to the `#devel`
|
|
37
|
+
channel on `Robot Framework Slack`_ and possible bugs submitted to
|
|
38
|
+
the `issue tracker`_.
|
|
39
39
|
|
|
40
40
|
**REMOVE ``--pre`` from the next command with final releases.**
|
|
41
41
|
If you have pip_ installed, just run
|
|
@@ -50,9 +50,9 @@ to install the latest available release or use
|
|
|
50
50
|
|
|
51
51
|
pip install robotframework=={version}
|
|
52
52
|
|
|
53
|
-
to install exactly this version. Alternatively you can download the
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
to install exactly this version. Alternatively you can download the package
|
|
54
|
+
from PyPI_ and install it manually. For more details and other installation
|
|
55
|
+
approaches, see the `installation instructions`_.
|
|
56
56
|
|
|
57
57
|
Robot Framework {version} was released on {date}.
|
|
58
58
|
|
|
@@ -1,48 +0,0 @@
|
|
|
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 robot.running import RUN_KW_REGISTER
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
RESERVED_KEYWORDS = ['for', 'while', 'break', 'continue', 'end',
|
|
20
|
-
'if', 'else', 'elif', 'else if', 'return']
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class Reserved:
|
|
24
|
-
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
|
|
25
|
-
|
|
26
|
-
def __init__(self):
|
|
27
|
-
for kw in RESERVED_KEYWORDS:
|
|
28
|
-
self._add_reserved(kw)
|
|
29
|
-
|
|
30
|
-
def _add_reserved(self, kw):
|
|
31
|
-
RUN_KW_REGISTER.register_run_keyword('Reserved', kw,
|
|
32
|
-
args_to_process=0,
|
|
33
|
-
deprecation_warning=False)
|
|
34
|
-
self.__dict__[kw] = lambda *args, **kwargs: self._run_reserved(kw)
|
|
35
|
-
|
|
36
|
-
def _run_reserved(self, kw):
|
|
37
|
-
error = "'%s' is a reserved keyword." % kw.title()
|
|
38
|
-
if kw in ('for', 'end', 'if', 'else', 'else if'):
|
|
39
|
-
error += " It must be an upper case '%s'" % kw.upper()
|
|
40
|
-
if kw in ('else', 'else if'):
|
|
41
|
-
error += " and follow an opening 'IF'"
|
|
42
|
-
if kw == 'end':
|
|
43
|
-
error += " when used as a marker to close a block."
|
|
44
|
-
else:
|
|
45
|
-
error += " when used as a marker."
|
|
46
|
-
if kw == 'elif':
|
|
47
|
-
error += " The marker to use with 'IF' is 'ELSE IF'."
|
|
48
|
-
raise Exception(error)
|
|
@@ -1,173 +0,0 @@
|
|
|
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 cast, Sequence, Type, TYPE_CHECKING
|
|
17
|
-
import warnings
|
|
18
|
-
|
|
19
|
-
from .body import Body, BodyItem, BodyItemParent
|
|
20
|
-
from .itemlist import ItemList
|
|
21
|
-
from .modelobject import DataDict
|
|
22
|
-
|
|
23
|
-
if TYPE_CHECKING:
|
|
24
|
-
from .visitor import SuiteVisitor
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@Body.register
|
|
28
|
-
class Keyword(BodyItem):
|
|
29
|
-
"""Base model for a single keyword.
|
|
30
|
-
|
|
31
|
-
Extended by :class:`robot.running.model.Keyword` and
|
|
32
|
-
:class:`robot.result.model.Keyword`.
|
|
33
|
-
"""
|
|
34
|
-
repr_args = ('name', 'args', 'assign')
|
|
35
|
-
__slots__ = ['_name', 'args', 'assign', 'type']
|
|
36
|
-
|
|
37
|
-
def __init__(self, name: 'str|None' = '',
|
|
38
|
-
args: Sequence[str] = (),
|
|
39
|
-
assign: Sequence[str] = (),
|
|
40
|
-
type: str = BodyItem.KEYWORD,
|
|
41
|
-
parent: BodyItemParent = None):
|
|
42
|
-
self.name = name
|
|
43
|
-
self.args = tuple(args)
|
|
44
|
-
self.assign = tuple(assign)
|
|
45
|
-
self.type = type
|
|
46
|
-
self.parent = parent
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def name(self) -> 'str|None':
|
|
50
|
-
return self._name
|
|
51
|
-
|
|
52
|
-
@name.setter
|
|
53
|
-
def name(self, name: 'str|None'):
|
|
54
|
-
self._name = name
|
|
55
|
-
|
|
56
|
-
@property
|
|
57
|
-
def id(self) -> 'str|None':
|
|
58
|
-
if not self:
|
|
59
|
-
return None
|
|
60
|
-
return super().id
|
|
61
|
-
|
|
62
|
-
def visit(self, visitor: 'SuiteVisitor'):
|
|
63
|
-
""":mod:`Visitor interface <robot.model.visitor>` entry-point."""
|
|
64
|
-
if self:
|
|
65
|
-
visitor.visit_keyword(self)
|
|
66
|
-
|
|
67
|
-
def __bool__(self) -> bool:
|
|
68
|
-
return self.name is not None
|
|
69
|
-
|
|
70
|
-
def __str__(self) -> str:
|
|
71
|
-
parts = list(self.assign) + [self.name] + list(self.args)
|
|
72
|
-
return ' '.join(str(p) for p in parts)
|
|
73
|
-
|
|
74
|
-
def to_dict(self) -> DataDict:
|
|
75
|
-
data: DataDict = {'name': self.name}
|
|
76
|
-
if self.args:
|
|
77
|
-
data['args'] = self.args
|
|
78
|
-
if self.assign:
|
|
79
|
-
data['assign'] = self.assign
|
|
80
|
-
return data
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
# FIXME: Remote in RF 7.
|
|
84
|
-
class Keywords(ItemList[BodyItem]):
|
|
85
|
-
"""A list-like object representing keywords in a suite, a test or a keyword.
|
|
86
|
-
|
|
87
|
-
Read-only and deprecated since Robot Framework 4.0.
|
|
88
|
-
"""
|
|
89
|
-
__slots__ = []
|
|
90
|
-
deprecation_message = (
|
|
91
|
-
"'keywords' attribute is read-only and deprecated since Robot Framework 4.0. "
|
|
92
|
-
"Use 'body', 'setup' or 'teardown' instead."
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
def __init__(self, parent: BodyItemParent = None,
|
|
96
|
-
keywords: Sequence[BodyItem] = ()):
|
|
97
|
-
warnings.warn(self.deprecation_message, UserWarning)
|
|
98
|
-
ItemList.__init__(self, object, {'parent': parent})
|
|
99
|
-
if keywords:
|
|
100
|
-
ItemList.extend(self, keywords)
|
|
101
|
-
|
|
102
|
-
@property
|
|
103
|
-
def setup(self) -> 'Keyword|None':
|
|
104
|
-
if self and self[0].type == 'SETUP':
|
|
105
|
-
return cast(Keyword, self[0])
|
|
106
|
-
return None
|
|
107
|
-
|
|
108
|
-
@setup.setter
|
|
109
|
-
def setup(self, kw):
|
|
110
|
-
self.raise_deprecation_error()
|
|
111
|
-
|
|
112
|
-
def create_setup(self, *args, **kwargs):
|
|
113
|
-
self.raise_deprecation_error()
|
|
114
|
-
|
|
115
|
-
@property
|
|
116
|
-
def teardown(self) -> 'Keyword|None':
|
|
117
|
-
if self and self[-1].type == 'TEARDOWN':
|
|
118
|
-
return cast(Keyword, self[-1])
|
|
119
|
-
return None
|
|
120
|
-
|
|
121
|
-
@teardown.setter
|
|
122
|
-
def teardown(self, kw: Keyword):
|
|
123
|
-
self.raise_deprecation_error()
|
|
124
|
-
|
|
125
|
-
def create_teardown(self, *args, **kwargs):
|
|
126
|
-
self.raise_deprecation_error()
|
|
127
|
-
|
|
128
|
-
@property
|
|
129
|
-
def all(self) -> 'Keywords':
|
|
130
|
-
"""Iterates over all keywords, including setup and teardown."""
|
|
131
|
-
return self
|
|
132
|
-
|
|
133
|
-
@property
|
|
134
|
-
def normal(self) -> 'list[BodyItem]':
|
|
135
|
-
"""Iterates over normal keywords, omitting setup and teardown."""
|
|
136
|
-
return [kw for kw in self if kw.type not in ('SETUP', 'TEARDOWN')]
|
|
137
|
-
|
|
138
|
-
def __setitem__(self, index: int, item: Keyword):
|
|
139
|
-
self.raise_deprecation_error()
|
|
140
|
-
|
|
141
|
-
def create(self, *args, **kwargs):
|
|
142
|
-
self.raise_deprecation_error()
|
|
143
|
-
|
|
144
|
-
def append(self, item: Keyword):
|
|
145
|
-
self.raise_deprecation_error()
|
|
146
|
-
|
|
147
|
-
def extend(self, items: Sequence[Keyword]):
|
|
148
|
-
self.raise_deprecation_error()
|
|
149
|
-
|
|
150
|
-
def insert(self, index: int, item: Keyword):
|
|
151
|
-
self.raise_deprecation_error()
|
|
152
|
-
|
|
153
|
-
def pop(self, *index: int):
|
|
154
|
-
self.raise_deprecation_error()
|
|
155
|
-
|
|
156
|
-
def remove(self, item: Keyword):
|
|
157
|
-
self.raise_deprecation_error()
|
|
158
|
-
|
|
159
|
-
def clear(self):
|
|
160
|
-
self.raise_deprecation_error()
|
|
161
|
-
|
|
162
|
-
def __delitem__(self, index: int):
|
|
163
|
-
self.raise_deprecation_error()
|
|
164
|
-
|
|
165
|
-
def sort(self):
|
|
166
|
-
self.raise_deprecation_error()
|
|
167
|
-
|
|
168
|
-
def reverse(self):
|
|
169
|
-
self.raise_deprecation_error()
|
|
170
|
-
|
|
171
|
-
@classmethod
|
|
172
|
-
def raise_deprecation_error(cls: 'Type[Keywords]'):
|
|
173
|
-
raise AttributeError(cls.deprecation_message)
|
|
@@ -1,90 +0,0 @@
|
|
|
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
|
-
import sys
|
|
17
|
-
|
|
18
|
-
from robot.model import SuiteVisitor
|
|
19
|
-
from robot.utils import plural_or_not, secs_to_timestr
|
|
20
|
-
|
|
21
|
-
from .highlighting import HighlightingStream
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class DottedOutput:
|
|
25
|
-
|
|
26
|
-
def __init__(self, width=78, colors='AUTO', stdout=None, stderr=None):
|
|
27
|
-
self._width = width
|
|
28
|
-
self._stdout = HighlightingStream(stdout or sys.__stdout__, colors)
|
|
29
|
-
self._stderr = HighlightingStream(stderr or sys.__stderr__, colors)
|
|
30
|
-
self._markers_on_row = 0
|
|
31
|
-
|
|
32
|
-
def start_suite(self, suite):
|
|
33
|
-
if not suite.parent:
|
|
34
|
-
self._stdout.write("Running suite '%s' with %d %s%s.\n"
|
|
35
|
-
% (suite.name, suite.test_count,
|
|
36
|
-
'test' if not suite.rpa else 'task',
|
|
37
|
-
plural_or_not(suite.test_count)))
|
|
38
|
-
self._stdout.write('=' * self._width + '\n')
|
|
39
|
-
|
|
40
|
-
def end_test(self, test):
|
|
41
|
-
if self._markers_on_row == self._width:
|
|
42
|
-
self._stdout.write('\n')
|
|
43
|
-
self._markers_on_row = 0
|
|
44
|
-
self._markers_on_row += 1
|
|
45
|
-
if test.passed:
|
|
46
|
-
self._stdout.write('.')
|
|
47
|
-
elif test.skipped:
|
|
48
|
-
self._stdout.highlight('s', 'SKIP')
|
|
49
|
-
elif test.tags.robot('exit'):
|
|
50
|
-
self._stdout.write('x')
|
|
51
|
-
else:
|
|
52
|
-
self._stdout.highlight('F', 'FAIL')
|
|
53
|
-
|
|
54
|
-
def end_suite(self, suite):
|
|
55
|
-
if not suite.parent:
|
|
56
|
-
self._stdout.write('\n')
|
|
57
|
-
StatusReporter(self._stdout, self._width).report(suite)
|
|
58
|
-
self._stdout.write('\n')
|
|
59
|
-
|
|
60
|
-
def message(self, msg):
|
|
61
|
-
if msg.level in ('WARN', 'ERROR'):
|
|
62
|
-
self._stderr.error(msg.message, msg.level)
|
|
63
|
-
|
|
64
|
-
def output_file(self, name, path):
|
|
65
|
-
self._stdout.write('%-8s %s\n' % (name+':', path))
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
class StatusReporter(SuiteVisitor):
|
|
69
|
-
|
|
70
|
-
def __init__(self, stream, width):
|
|
71
|
-
self._stream = stream
|
|
72
|
-
self._width = width
|
|
73
|
-
|
|
74
|
-
def report(self, suite):
|
|
75
|
-
suite.visit(self)
|
|
76
|
-
stats = suite.statistics
|
|
77
|
-
self._stream.write("%s\nRun suite '%s' with %d %s%s in %s.\n\n"
|
|
78
|
-
% ('=' * self._width, suite.name, stats.total,
|
|
79
|
-
'test' if not suite.rpa else 'task',
|
|
80
|
-
plural_or_not(stats.total),
|
|
81
|
-
secs_to_timestr(suite.elapsedtime/1000.0)))
|
|
82
|
-
self._stream.highlight(suite.status + ('PED' if suite.status == 'SKIP' else 'ED'), suite.status)
|
|
83
|
-
self._stream.write('\n%s\n' % stats.message)
|
|
84
|
-
|
|
85
|
-
def visit_test(self, test):
|
|
86
|
-
if test.failed and not test.tags.robot('exit'):
|
|
87
|
-
self._stream.write('-' * self._width + '\n')
|
|
88
|
-
self._stream.highlight('FAIL')
|
|
89
|
-
self._stream.write(': %s\n%s\n' % (test.longname,
|
|
90
|
-
test.message.strip()))
|