robotframework 6.1.1__zip → 7.0__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 → robotframework-7.0}/INSTALL.rst +25 -25
- {robotframework-6.1.1 → robotframework-7.0}/PKG-INFO +6 -8
- {robotframework-6.1.1 → robotframework-7.0}/README.rst +3 -2
- {robotframework-6.1.1 → robotframework-7.0}/setup.py +3 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/__init__.py +4 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/deco.py +60 -14
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/exceptions.py +6 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/interfaces.py +402 -67
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/logger.py +27 -20
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/parsing.py +4 -2
- robotframework-7.0/src/robot/api/py.typed +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/gatherfailed.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/languages.py +0 -9
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/settings.py +21 -14
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/storage.js +11 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/htmlfilewriter.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.css +10 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.html +10 -0
- robotframework-7.0/src/robot/htmldata/rebot/common.css +362 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/doc_formatting.css +13 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.css +51 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.html +14 -23
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/model.js +2 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.css +83 -19
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.html +22 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/testdata.js +10 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/view.js +84 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/template.py +3 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/builder.py +0 -8
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/datatypes.py +9 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlutils.py +4 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonbuilder.py +38 -20
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/model.py +21 -28
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/robotbuilder.py +50 -31
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/standardtypes.py +9 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlbuilder.py +35 -20
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlwriter.py +18 -38
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/BuiltIn.py +255 -205
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Collections.py +384 -240
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/DateTime.py +73 -60
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/OperatingSystem.py +6 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Process.py +26 -27
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Remote.py +40 -36
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/String.py +66 -76
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/XML.py +66 -59
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/__init__.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/__init__.py +5 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/body.py +44 -13
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/configurer.py +15 -11
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/control.py +226 -84
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/filter.py +31 -25
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/itemlist.py +9 -8
- robotframework-7.0/src/robot/model/keyword.py +77 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/message.py +19 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modelobject.py +25 -7
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/namepatterns.py +3 -25
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/stats.py +9 -15
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tags.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testcase.py +15 -27
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testsuite.py +17 -26
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/visitor.py +35 -8
- robotframework-7.0/src/robot/output/console/dotted.py +90 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/quiet.py +3 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/verbose.py +61 -61
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/debugfile.py +39 -24
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/filelogger.py +18 -15
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/librarylogger.py +3 -2
- robotframework-7.0/src/robot/output/listeners.py +753 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/logger.py +216 -80
- robotframework-7.0/src/robot/output/loggerapi.py +215 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/loggerhelper.py +23 -56
- robotframework-7.0/src/robot/output/output.py +185 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/stdoutlogsplitter.py +8 -5
- robotframework-7.0/src/robot/output/xmllogger.py +459 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/blocklexers.py +17 -13
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/context.py +12 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/lexer.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/settings.py +6 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/statementlexers.py +39 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokens.py +27 -29
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/blocks.py +19 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/statements.py +193 -94
- robotframework-7.0/src/robot/parsing/model/visitor.py +100 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/rebot.py +2 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/expandkeywordmatcher.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsbuildingcontext.py +8 -6
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsmodelbuilders.py +88 -61
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/logreportwriters.py +16 -10
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/outputwriter.py +18 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/resultwriter.py +4 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/stringcache.py +3 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/xunitwriter.py +15 -21
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/__init__.py +3 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/configurer.py +12 -9
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionresult.py +56 -8
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/flattenkeywordmatcher.py +48 -9
- robotframework-7.0/src/robot/result/keywordremover.py +207 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/merger.py +1 -1
- robotframework-7.0/src/robot/result/model.py +1185 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/modeldeprecation.py +9 -3
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/resultbuilder.py +46 -36
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/xmlelementhandlers.py +83 -43
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/run.py +2 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/__init__.py +14 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/__init__.py +2 -1
- robotframework-7.0/src/robot/running/arguments/argumentconverter.py +100 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentmapper.py +26 -24
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentparser.py +82 -60
- robotframework-7.0/src/robot/running/arguments/argumentresolver.py +158 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentspec.py +83 -116
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentvalidator.py +33 -27
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/customconverters.py +15 -12
- robotframework-7.0/src/robot/running/arguments/embedded.py +145 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/typeconverters.py +233 -213
- robotframework-7.0/src/robot/running/arguments/typeinfo.py +317 -0
- robotframework-7.0/src/robot/running/arguments/typeinfoparser.py +219 -0
- robotframework-7.0/src/robot/running/arguments/typevalidator.py +60 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/bodyrunner.py +147 -129
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/builders.py +2 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/parsers.py +10 -11
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/settings.py +9 -17
- robotframework-7.0/src/robot/running/builder/transformers.py +535 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/context.py +113 -31
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/dynamicmethods.py +62 -34
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/importer.py +27 -49
- robotframework-7.0/src/robot/running/invalidkeyword.py +67 -0
- robotframework-7.0/src/robot/running/keywordfinder.py +91 -0
- robotframework-7.0/src/robot/running/keywordimplementation.py +164 -0
- robotframework-7.0/src/robot/running/librarykeyword.py +392 -0
- robotframework-7.0/src/robot/running/librarykeywordrunner.py +250 -0
- robotframework-7.0/src/robot/running/libraryscopes.py +115 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/model.py +195 -377
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/namespace.py +124 -137
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/outputcapture.py +20 -12
- robotframework-7.0/src/robot/running/resourcemodel.py +448 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/statusreporter.py +16 -13
- robotframework-7.0/src/robot/running/suiterunner.py +265 -0
- robotframework-7.0/src/robot/running/testlibraries.py +500 -0
- robotframework-7.0/src/robot/running/userkeywordrunner.py +260 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/testdoc.py +18 -13
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/__init__.py +53 -35
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/connectioncache.py +64 -59
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/dotdict.py +3 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encodingsniffer.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/escaping.py +19 -19
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/importer.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markupwriters.py +23 -15
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/misc.py +1 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/normalizing.py +9 -24
- robotframework-7.0/src/robot/utils/notset.py +33 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/platform.py +15 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotio.py +9 -9
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotpath.py +1 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottime.py +122 -90
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottypes.py +21 -31
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/setter.py +0 -5
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/text.py +7 -4
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/unic.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/__init__.py +2 -2
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/assigner.py +17 -19
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/evaluation.py +20 -17
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/filesetter.py +80 -80
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/replacer.py +33 -36
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/scopes.py +17 -12
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/search.py +66 -41
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/store.py +14 -16
- robotframework-7.0/src/robot/variables/tablesetter.py +164 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/variables.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/version.py +1 -1
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/PKG-INFO +6 -8
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/SOURCES.txt +10 -8
- {robotframework-6.1.1 → robotframework-7.0}/tasks.py +6 -6
- robotframework-6.1.1/src/robot/htmldata/rebot/common.css +0 -239
- 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/output/xmllogger.py +0 -354
- robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
- robotframework-6.1.1/src/robot/result/keywordremover.py +0 -183
- robotframework-6.1.1/src/robot/result/model.py +0 -957
- robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
- robotframework-6.1.1/src/robot/running/arguments/argumentresolver.py +0 -131
- robotframework-6.1.1/src/robot/running/arguments/embedded.py +0 -146
- robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
- robotframework-6.1.1/src/robot/running/builder/transformers.py +0 -642
- robotframework-6.1.1/src/robot/running/handlers.py +0 -321
- robotframework-6.1.1/src/robot/running/handlerstore.py +0 -66
- robotframework-6.1.1/src/robot/running/librarykeywordrunner.py +0 -238
- robotframework-6.1.1/src/robot/running/libraryscopes.py +0 -97
- robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
- robotframework-6.1.1/src/robot/running/suiterunner.py +0 -248
- robotframework-6.1.1/src/robot/running/testlibraries.py +0 -423
- robotframework-6.1.1/src/robot/running/usererrorhandler.py +0 -75
- robotframework-6.1.1/src/robot/running/userkeyword.py +0 -111
- robotframework-6.1.1/src/robot/running/userkeywordrunner.py +0 -274
- robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
- {robotframework-6.1.1 → robotframework-7.0}/AUTHORS.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/BUILD.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/CONTRIBUTING.rst +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/COPYRIGHT.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/LICENSE.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/MANIFEST.in +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/setup.cfg +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/__main__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/errors.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdoc.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Easter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/dialogs_py.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/fixture.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/metadata.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modifier.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/statistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagsetter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionerrors.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/messagefilter.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/visitor.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/randomizer.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/runkwregister.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/signalhandler.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/status.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/application.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/asserts.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/charwidth.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/compress.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encoding.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/error.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/filereader.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/frange.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markuputils.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/match.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/recommendations.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/restreader.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotenv.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/sortable.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/typehints.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/finders.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/notfound.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/resolvable.py +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/top_level.txt +0 -0
|
@@ -14,59 +14,79 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
|
+
from typing import Iterator, Sequence
|
|
17
18
|
|
|
18
19
|
from robot.errors import VariableError
|
|
19
20
|
from robot.utils import is_string
|
|
20
21
|
|
|
21
22
|
|
|
22
|
-
def search_variable(string, identifiers='$@&%*',
|
|
23
|
+
def search_variable(string: str, identifiers: Sequence[str] = '$@&%*',
|
|
24
|
+
ignore_errors: bool = False) -> 'VariableMatch':
|
|
23
25
|
if not (is_string(string) and '{' in string):
|
|
24
26
|
return VariableMatch(string)
|
|
25
27
|
return _search_variable(string, identifiers, ignore_errors)
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
def contains_variable(string, identifiers='$@&'):
|
|
30
|
+
def contains_variable(string: str, identifiers: Sequence[str] = '$@&') -> bool:
|
|
29
31
|
match = search_variable(string, identifiers, ignore_errors=True)
|
|
30
32
|
return bool(match)
|
|
31
33
|
|
|
32
34
|
|
|
33
|
-
def is_variable(string, identifiers='$@&'):
|
|
35
|
+
def is_variable(string: str, identifiers: Sequence[str] = '$@&') -> bool:
|
|
34
36
|
match = search_variable(string, identifiers, ignore_errors=True)
|
|
35
37
|
return match.is_variable()
|
|
36
38
|
|
|
37
39
|
|
|
38
|
-
def is_scalar_variable(string):
|
|
40
|
+
def is_scalar_variable(string: str) -> bool:
|
|
39
41
|
return is_variable(string, '$')
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def is_list_variable(string):
|
|
44
|
+
def is_list_variable(string: str) -> bool:
|
|
43
45
|
return is_variable(string, '@')
|
|
44
46
|
|
|
45
47
|
|
|
46
|
-
def is_dict_variable(string):
|
|
48
|
+
def is_dict_variable(string: str) -> bool:
|
|
47
49
|
return is_variable(string, '&')
|
|
48
50
|
|
|
49
51
|
|
|
50
|
-
def is_assign(string
|
|
52
|
+
def is_assign(string: str,
|
|
53
|
+
identifiers: Sequence[str] = '$@&',
|
|
54
|
+
allow_assign_mark: bool = False,
|
|
55
|
+
allow_nested: bool = False,
|
|
56
|
+
allow_items: bool = False) -> bool:
|
|
51
57
|
match = search_variable(string, identifiers, ignore_errors=True)
|
|
52
|
-
return match.is_assign(allow_assign_mark, allow_items
|
|
58
|
+
return match.is_assign(allow_assign_mark, allow_nested, allow_items)
|
|
53
59
|
|
|
54
60
|
|
|
55
|
-
def is_scalar_assign(string
|
|
56
|
-
|
|
61
|
+
def is_scalar_assign(string: str,
|
|
62
|
+
allow_assign_mark: bool = False,
|
|
63
|
+
allow_nested: bool = False,
|
|
64
|
+
allow_items: bool = False) -> bool:
|
|
65
|
+
return is_assign(string, '$', allow_assign_mark, allow_nested, allow_items)
|
|
57
66
|
|
|
58
67
|
|
|
59
|
-
def is_list_assign(string
|
|
60
|
-
|
|
68
|
+
def is_list_assign(string: str,
|
|
69
|
+
allow_assign_mark: bool = False,
|
|
70
|
+
allow_nested: bool = False,
|
|
71
|
+
allow_items: bool = False) -> bool:
|
|
72
|
+
return is_assign(string, '@', allow_assign_mark, allow_nested, allow_items)
|
|
61
73
|
|
|
62
74
|
|
|
63
|
-
def is_dict_assign(string
|
|
64
|
-
|
|
75
|
+
def is_dict_assign(string: str,
|
|
76
|
+
allow_assign_mark: bool = False,
|
|
77
|
+
allow_nested: bool = False,
|
|
78
|
+
allow_items: bool = False) -> bool:
|
|
79
|
+
return is_assign(string, '&', allow_assign_mark, allow_nested, allow_items)
|
|
65
80
|
|
|
66
81
|
|
|
67
82
|
class VariableMatch:
|
|
68
83
|
|
|
69
|
-
def __init__(self, string
|
|
84
|
+
def __init__(self, string: str,
|
|
85
|
+
identifier: 'str|None' = None,
|
|
86
|
+
base: 'str|None' = None,
|
|
87
|
+
items: 'tuple[str, ...]' = (),
|
|
88
|
+
start: int = -1,
|
|
89
|
+
end: int = -1):
|
|
70
90
|
self.string = string
|
|
71
91
|
self.identifier = identifier
|
|
72
92
|
self.base = base
|
|
@@ -84,66 +104,70 @@ class VariableMatch:
|
|
|
84
104
|
)
|
|
85
105
|
|
|
86
106
|
@property
|
|
87
|
-
def name(self):
|
|
88
|
-
return '
|
|
107
|
+
def name(self) -> 'str|None':
|
|
108
|
+
return f'{self.identifier}{{{self.base}}}' if self.identifier else None
|
|
89
109
|
|
|
90
110
|
@property
|
|
91
|
-
def before(self):
|
|
111
|
+
def before(self) -> str:
|
|
92
112
|
return self.string[:self.start] if self.identifier else self.string
|
|
93
113
|
|
|
94
114
|
@property
|
|
95
|
-
def match(self):
|
|
115
|
+
def match(self) -> 'str|None':
|
|
96
116
|
return self.string[self.start:self.end] if self.identifier else None
|
|
97
117
|
|
|
98
118
|
@property
|
|
99
|
-
def after(self):
|
|
100
|
-
return self.string[self.end:] if self.identifier else
|
|
119
|
+
def after(self) -> str:
|
|
120
|
+
return self.string[self.end:] if self.identifier else ''
|
|
101
121
|
|
|
102
|
-
def is_variable(self):
|
|
122
|
+
def is_variable(self) -> bool:
|
|
103
123
|
return bool(self.identifier
|
|
104
124
|
and self.base
|
|
105
125
|
and self.start == 0
|
|
106
126
|
and self.end == len(self.string))
|
|
107
127
|
|
|
108
|
-
def is_scalar_variable(self):
|
|
128
|
+
def is_scalar_variable(self) -> bool:
|
|
109
129
|
return self.identifier == '$' and self.is_variable()
|
|
110
130
|
|
|
111
|
-
def is_list_variable(self):
|
|
131
|
+
def is_list_variable(self) -> bool:
|
|
112
132
|
return self.identifier == '@' and self.is_variable()
|
|
113
133
|
|
|
114
|
-
def is_dict_variable(self):
|
|
134
|
+
def is_dict_variable(self) -> bool:
|
|
115
135
|
return self.identifier == '&' and self.is_variable()
|
|
116
136
|
|
|
117
|
-
def is_assign(self,
|
|
118
|
-
|
|
137
|
+
def is_assign(self, allow_assign_mark: bool = False, allow_nested: bool = False,
|
|
138
|
+
allow_items: bool = False) -> bool:
|
|
119
139
|
if allow_assign_mark and self.string.endswith('='):
|
|
120
140
|
match = search_variable(self.string[:-1].rstrip(), ignore_errors=True)
|
|
121
|
-
return match.is_assign(allow_items=allow_items)
|
|
141
|
+
return match.is_assign(allow_nested=allow_nested, allow_items=allow_items)
|
|
122
142
|
return (self.is_variable()
|
|
123
143
|
and self.identifier in '$@&'
|
|
124
144
|
and (allow_items or not self.items)
|
|
125
145
|
and (allow_nested or not search_variable(self.base)))
|
|
126
146
|
|
|
127
|
-
def is_scalar_assign(self, allow_assign_mark=False,
|
|
147
|
+
def is_scalar_assign(self, allow_assign_mark: bool = False,
|
|
148
|
+
allow_nested: bool = False) -> bool:
|
|
128
149
|
return self.identifier == '$' and self.is_assign(allow_assign_mark, allow_nested)
|
|
129
150
|
|
|
130
|
-
def is_list_assign(self, allow_assign_mark=False,
|
|
151
|
+
def is_list_assign(self, allow_assign_mark: bool = False,
|
|
152
|
+
allow_nested: bool = False) -> bool:
|
|
131
153
|
return self.identifier == '@' and self.is_assign(allow_assign_mark, allow_nested)
|
|
132
154
|
|
|
133
|
-
def is_dict_assign(self, allow_assign_mark=False,
|
|
155
|
+
def is_dict_assign(self, allow_assign_mark: bool = False,
|
|
156
|
+
allow_nested: bool = False) -> bool:
|
|
134
157
|
return self.identifier == '&' and self.is_assign(allow_assign_mark, allow_nested)
|
|
135
158
|
|
|
136
|
-
def __bool__(self):
|
|
159
|
+
def __bool__(self) -> bool:
|
|
137
160
|
return self.identifier is not None
|
|
138
161
|
|
|
139
|
-
def __str__(self):
|
|
162
|
+
def __str__(self) -> str:
|
|
140
163
|
if not self:
|
|
141
164
|
return '<no match>'
|
|
142
165
|
items = ''.join('[%s]' % i for i in self.items) if self.items else ''
|
|
143
166
|
return '%s{%s}%s' % (self.identifier, self.base, items)
|
|
144
167
|
|
|
145
168
|
|
|
146
|
-
def _search_variable(string, identifiers,
|
|
169
|
+
def _search_variable(string: str, identifiers: Sequence[str],
|
|
170
|
+
ignore_errors: bool = False) -> VariableMatch:
|
|
147
171
|
start = _find_variable_start(string, identifiers)
|
|
148
172
|
if start < 0:
|
|
149
173
|
return VariableMatch(string)
|
|
@@ -194,7 +218,7 @@ def _search_variable(string, identifiers, ignore_errors=False):
|
|
|
194
218
|
raise VariableError(f"Variable '{incomplete}' was not closed properly.")
|
|
195
219
|
raise VariableError(f"Variable item '{incomplete}' was not closed properly.")
|
|
196
220
|
|
|
197
|
-
return match
|
|
221
|
+
return match
|
|
198
222
|
|
|
199
223
|
|
|
200
224
|
def _find_variable_start(string, identifiers):
|
|
@@ -233,26 +257,27 @@ def unescape_variable_syntax(item):
|
|
|
233
257
|
return re.sub(r'(\\+)(?=(.+))', handle_escapes, item)
|
|
234
258
|
|
|
235
259
|
|
|
236
|
-
class
|
|
260
|
+
class VariableMatches:
|
|
237
261
|
|
|
238
|
-
def __init__(self, string, identifiers='$@&%',
|
|
262
|
+
def __init__(self, string: str, identifiers: Sequence[str] = '$@&%',
|
|
263
|
+
ignore_errors: bool = False):
|
|
239
264
|
self.string = string
|
|
240
265
|
self.identifiers = identifiers
|
|
241
266
|
self.ignore_errors = ignore_errors
|
|
242
267
|
|
|
243
|
-
def __iter__(self):
|
|
268
|
+
def __iter__(self) -> Iterator[VariableMatch]:
|
|
244
269
|
remaining = self.string
|
|
245
270
|
while True:
|
|
246
271
|
match = search_variable(remaining, self.identifiers, self.ignore_errors)
|
|
247
272
|
if not match:
|
|
248
273
|
break
|
|
249
274
|
remaining = match.after
|
|
250
|
-
yield match
|
|
275
|
+
yield match
|
|
251
276
|
|
|
252
|
-
def __len__(self):
|
|
277
|
+
def __len__(self) -> int:
|
|
253
278
|
return sum(1 for _ in self)
|
|
254
279
|
|
|
255
|
-
def __bool__(self):
|
|
280
|
+
def __bool__(self) -> bool:
|
|
256
281
|
try:
|
|
257
282
|
next(iter(self))
|
|
258
283
|
except StopIteration:
|
|
@@ -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.0
|
|
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.0.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
|
|
|
@@ -64,10 +63,12 @@ Description: Robot Framework
|
|
|
64
63
|
For more detailed installation instructions, including installing Python, see
|
|
65
64
|
`INSTALL.rst <https://github.com/robotframework/robotframework/blob/master/INSTALL.rst>`__.
|
|
66
65
|
|
|
67
|
-
Robot Framework requires Python 3.
|
|
66
|
+
Robot Framework requires Python 3.8 or newer and runs also on `PyPy <http://pypy.org>`_.
|
|
67
|
+
The latest version that supports Python 3.6 and 3.7 is `Robot Framework 6.1.1`__.
|
|
68
68
|
If you need to use Python 2, `Jython <http://jython.org>`_ or
|
|
69
69
|
`IronPython <http://ironpython.net>`_, you can use `Robot Framework 4.1.3`__.
|
|
70
70
|
|
|
71
|
+
__ https://github.com/robotframework/robotframework/tree/v6.1.1#readme
|
|
71
72
|
__ https://github.com/robotframework/robotframework/tree/v4.1.3#readme
|
|
72
73
|
|
|
73
74
|
Example
|
|
@@ -132,7 +133,6 @@ Description: Robot Framework
|
|
|
132
133
|
- `Forum <https://forum.robotframework.org/>`_
|
|
133
134
|
- `robotframework-users
|
|
134
135
|
<https://groups.google.com/group/robotframework-users/>`_ mailing list
|
|
135
|
-
- `@robotframework <https://twitter.com/robotframework>`_ on Twitter
|
|
136
136
|
|
|
137
137
|
Contributing
|
|
138
138
|
------------
|
|
@@ -171,8 +171,6 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
171
171
|
Classifier: Operating System :: OS Independent
|
|
172
172
|
Classifier: Programming Language :: Python :: 3
|
|
173
173
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
174
|
-
Classifier: Programming Language :: Python :: 3.6
|
|
175
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
176
174
|
Classifier: Programming Language :: Python :: 3.8
|
|
177
175
|
Classifier: Programming Language :: Python :: 3.9
|
|
178
176
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -184,5 +182,5 @@ Classifier: Topic :: Software Development :: Testing
|
|
|
184
182
|
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
|
185
183
|
Classifier: Topic :: Software Development :: Testing :: BDD
|
|
186
184
|
Classifier: Framework :: Robot Framework
|
|
187
|
-
Requires-Python: >=3.
|
|
185
|
+
Requires-Python: >=3.8
|
|
188
186
|
Description-Content-Type: text/x-rst
|
|
@@ -23,6 +23,7 @@ src/robot/api/exceptions.py
|
|
|
23
23
|
src/robot/api/interfaces.py
|
|
24
24
|
src/robot/api/logger.py
|
|
25
25
|
src/robot/api/parsing.py
|
|
26
|
+
src/robot/api/py.typed
|
|
26
27
|
src/robot/conf/__init__.py
|
|
27
28
|
src/robot/conf/gatherfailed.py
|
|
28
29
|
src/robot/conf/languages.py
|
|
@@ -86,7 +87,6 @@ src/robot/libraries/Easter.py
|
|
|
86
87
|
src/robot/libraries/OperatingSystem.py
|
|
87
88
|
src/robot/libraries/Process.py
|
|
88
89
|
src/robot/libraries/Remote.py
|
|
89
|
-
src/robot/libraries/Reserved.py
|
|
90
90
|
src/robot/libraries/Screenshot.py
|
|
91
91
|
src/robot/libraries/String.py
|
|
92
92
|
src/robot/libraries/Telnet.py
|
|
@@ -120,10 +120,9 @@ src/robot/output/__init__.py
|
|
|
120
120
|
src/robot/output/debugfile.py
|
|
121
121
|
src/robot/output/filelogger.py
|
|
122
122
|
src/robot/output/librarylogger.py
|
|
123
|
-
src/robot/output/listenerarguments.py
|
|
124
|
-
src/robot/output/listenermethods.py
|
|
125
123
|
src/robot/output/listeners.py
|
|
126
124
|
src/robot/output/logger.py
|
|
125
|
+
src/robot/output/loggerapi.py
|
|
127
126
|
src/robot/output/loggerhelper.py
|
|
128
127
|
src/robot/output/output.py
|
|
129
128
|
src/robot/output/pyloggingconf.py
|
|
@@ -181,24 +180,24 @@ src/robot/running/__init__.py
|
|
|
181
180
|
src/robot/running/bodyrunner.py
|
|
182
181
|
src/robot/running/context.py
|
|
183
182
|
src/robot/running/dynamicmethods.py
|
|
184
|
-
src/robot/running/handlers.py
|
|
185
|
-
src/robot/running/handlerstore.py
|
|
186
183
|
src/robot/running/importer.py
|
|
184
|
+
src/robot/running/invalidkeyword.py
|
|
185
|
+
src/robot/running/keywordfinder.py
|
|
186
|
+
src/robot/running/keywordimplementation.py
|
|
187
|
+
src/robot/running/librarykeyword.py
|
|
187
188
|
src/robot/running/librarykeywordrunner.py
|
|
188
189
|
src/robot/running/libraryscopes.py
|
|
189
190
|
src/robot/running/model.py
|
|
190
|
-
src/robot/running/modelcombiner.py
|
|
191
191
|
src/robot/running/namespace.py
|
|
192
192
|
src/robot/running/outputcapture.py
|
|
193
193
|
src/robot/running/randomizer.py
|
|
194
|
+
src/robot/running/resourcemodel.py
|
|
194
195
|
src/robot/running/runkwregister.py
|
|
195
196
|
src/robot/running/signalhandler.py
|
|
196
197
|
src/robot/running/status.py
|
|
197
198
|
src/robot/running/statusreporter.py
|
|
198
199
|
src/robot/running/suiterunner.py
|
|
199
200
|
src/robot/running/testlibraries.py
|
|
200
|
-
src/robot/running/usererrorhandler.py
|
|
201
|
-
src/robot/running/userkeyword.py
|
|
202
201
|
src/robot/running/userkeywordrunner.py
|
|
203
202
|
src/robot/running/arguments/__init__.py
|
|
204
203
|
src/robot/running/arguments/argumentconverter.py
|
|
@@ -210,6 +209,8 @@ src/robot/running/arguments/argumentvalidator.py
|
|
|
210
209
|
src/robot/running/arguments/customconverters.py
|
|
211
210
|
src/robot/running/arguments/embedded.py
|
|
212
211
|
src/robot/running/arguments/typeconverters.py
|
|
212
|
+
src/robot/running/arguments/typeinfo.py
|
|
213
|
+
src/robot/running/arguments/typeinfoparser.py
|
|
213
214
|
src/robot/running/arguments/typevalidator.py
|
|
214
215
|
src/robot/running/builder/__init__.py
|
|
215
216
|
src/robot/running/builder/builders.py
|
|
@@ -241,6 +242,7 @@ src/robot/utils/markupwriters.py
|
|
|
241
242
|
src/robot/utils/match.py
|
|
242
243
|
src/robot/utils/misc.py
|
|
243
244
|
src/robot/utils/normalizing.py
|
|
245
|
+
src/robot/utils/notset.py
|
|
244
246
|
src/robot/utils/platform.py
|
|
245
247
|
src/robot/utils/recommendations.py
|
|
246
248
|
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
|
|