robotframework 6.1rc1__zip → 7.0a1__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {robotframework-6.1rc1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/setup.py +2 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/interfaces.py +36 -49
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/languages.py +61 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +14 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +14 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/configurer.py +19 -15
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/control.py +155 -85
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
- robotframework-7.0a1/src/robot/model/keyword.py +70 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modelobject.py +2 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modifier.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testsuite.py +43 -24
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
- robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
- robotframework-7.0a1/src/robot/output/listeners.py +586 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
- robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
- robotframework-7.0a1/src/robot/output/output.py +158 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
- robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/run.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
- robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +3 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +210 -220
- robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
- robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +15 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +15 -10
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/model.py +156 -36
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +18 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +35 -39
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +9 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
- robotframework-7.0a1/src/robot/utils/notset.py +33 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
- robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/version.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
- {robotframework-6.1rc1 → robotframework-7.0a1}/tasks.py +6 -6
- robotframework-6.1rc1/src/robot/libraries/Reserved.py +0 -48
- robotframework-6.1rc1/src/robot/model/keyword.py +0 -173
- robotframework-6.1rc1/src/robot/output/console/dotted.py +0 -90
- robotframework-6.1rc1/src/robot/output/listenerarguments.py +0 -165
- robotframework-6.1rc1/src/robot/output/listenermethods.py +0 -113
- robotframework-6.1rc1/src/robot/output/listeners.py +0 -174
- robotframework-6.1rc1/src/robot/output/output.py +0 -95
- robotframework-6.1rc1/src/robot/parsing/model/visitor.py +0 -67
- robotframework-6.1rc1/src/robot/running/arguments/argumentconverter.py +0 -79
- robotframework-6.1rc1/src/robot/running/arguments/typevalidator.py +0 -56
- robotframework-6.1rc1/src/robot/running/modelcombiner.py +0 -32
- robotframework-6.1rc1/src/robot/variables/tablesetter.py +0 -156
- {robotframework-6.1rc1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/BUILD.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/INSTALL.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/LICENSE.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/MANIFEST.in +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/README.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/setup.cfg +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,367 @@
|
|
|
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 enum import auto, Enum
|
|
17
|
+
from collections.abc import Mapping, Sequence, Set
|
|
18
|
+
from datetime import date, datetime, timedelta
|
|
19
|
+
from decimal import Decimal
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Union
|
|
23
|
+
|
|
24
|
+
from robot.conf import LanguagesLike
|
|
25
|
+
from robot.errors import DataError
|
|
26
|
+
from robot.utils import (has_args, is_union, NOT_SET, plural_or_not as s, setter,
|
|
27
|
+
SetterAwareType, type_repr, typeddict_types)
|
|
28
|
+
|
|
29
|
+
from .customconverters import CustomArgumentConverters
|
|
30
|
+
from .typeconverters import TypeConverter
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
TYPE_NAMES = {
|
|
34
|
+
'...': Ellipsis,
|
|
35
|
+
'ellipsis': Ellipsis,
|
|
36
|
+
'any': Any,
|
|
37
|
+
'str': str,
|
|
38
|
+
'string': str,
|
|
39
|
+
'unicode': str,
|
|
40
|
+
'bool': bool,
|
|
41
|
+
'boolean': bool,
|
|
42
|
+
'int': int,
|
|
43
|
+
'integer': int,
|
|
44
|
+
'long': int,
|
|
45
|
+
'float': float,
|
|
46
|
+
'double': float,
|
|
47
|
+
'decimal': Decimal,
|
|
48
|
+
'bytes': bytes,
|
|
49
|
+
'bytearray': bytearray,
|
|
50
|
+
'datetime': datetime,
|
|
51
|
+
'date': date,
|
|
52
|
+
'timedelta': timedelta,
|
|
53
|
+
'path': Path,
|
|
54
|
+
'none': type(None),
|
|
55
|
+
'list': list,
|
|
56
|
+
'sequence': list,
|
|
57
|
+
'tuple': tuple,
|
|
58
|
+
'dictionary': dict,
|
|
59
|
+
'dict': dict,
|
|
60
|
+
'mapping': dict,
|
|
61
|
+
'map': dict,
|
|
62
|
+
'set': set,
|
|
63
|
+
'frozenset': frozenset,
|
|
64
|
+
'union': Union
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class TypeInfo(metaclass=SetterAwareType):
|
|
69
|
+
"""Represents argument type.
|
|
70
|
+
|
|
71
|
+
With unions and parametrized types, :attr:`nested` contains nested types.
|
|
72
|
+
"""
|
|
73
|
+
is_typed_dict = False
|
|
74
|
+
__slots__ = ('name', 'type')
|
|
75
|
+
|
|
76
|
+
def __init__(self, name: 'str|None' = None,
|
|
77
|
+
type: 'type|None' = None,
|
|
78
|
+
nested: 'Sequence[TypeInfo]' = ()):
|
|
79
|
+
if name and not type:
|
|
80
|
+
type = TYPE_NAMES.get(name.lower())
|
|
81
|
+
self.name = name
|
|
82
|
+
self.type = type
|
|
83
|
+
self.nested = nested
|
|
84
|
+
|
|
85
|
+
@setter
|
|
86
|
+
def nested(self, nested: 'Sequence[TypeInfo]') -> 'tuple[TypeInfo, ...]':
|
|
87
|
+
if self.is_union:
|
|
88
|
+
if not nested:
|
|
89
|
+
raise DataError('Union used as a type hint cannot be empty.')
|
|
90
|
+
return tuple(nested)
|
|
91
|
+
typ = self.type
|
|
92
|
+
if typ is None or not nested:
|
|
93
|
+
return tuple(nested)
|
|
94
|
+
if not isinstance(typ, type):
|
|
95
|
+
self._report_nested_error(nested, 0)
|
|
96
|
+
elif issubclass(typ, tuple):
|
|
97
|
+
if nested[-1].type is Ellipsis and len(nested) != 2:
|
|
98
|
+
self._report_nested_error(nested, 1, 'Homogenous tuple', -1)
|
|
99
|
+
elif issubclass(typ, Sequence) and not issubclass(typ, (str, bytes, bytearray)):
|
|
100
|
+
if len(nested) != 1:
|
|
101
|
+
self._report_nested_error(nested, 1)
|
|
102
|
+
elif issubclass(typ, Set):
|
|
103
|
+
if len(nested) != 1:
|
|
104
|
+
self._report_nested_error(nested, 1)
|
|
105
|
+
elif issubclass(typ, Mapping):
|
|
106
|
+
if len(nested) != 2:
|
|
107
|
+
self._report_nested_error(nested, 2)
|
|
108
|
+
elif typ in TYPE_NAMES.values():
|
|
109
|
+
self._report_nested_error(nested, 0)
|
|
110
|
+
return tuple(nested)
|
|
111
|
+
|
|
112
|
+
def _report_nested_error(self, nested, expected, kind=None, offset=0):
|
|
113
|
+
args = ', '.join(str(n) for n in nested)
|
|
114
|
+
kind = kind or f"'{self.name}{'[]' if expected > 0 else ''}'"
|
|
115
|
+
if expected == 0:
|
|
116
|
+
raise DataError(f"{kind} does not accept arguments, "
|
|
117
|
+
f"'{self.name}[{args}]' has {len(nested) + offset}.")
|
|
118
|
+
raise DataError(f"{kind} requires exactly {expected} argument{s(expected)}, "
|
|
119
|
+
f"'{self.name}[{args}]' has {len(nested) + offset}.")
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def is_union(self):
|
|
123
|
+
return self.name == 'Union'
|
|
124
|
+
|
|
125
|
+
@classmethod
|
|
126
|
+
def from_type_hint(cls, hint: Any) -> 'TypeInfo':
|
|
127
|
+
if hint is NOT_SET:
|
|
128
|
+
return cls()
|
|
129
|
+
if isinstance(hint, typeddict_types):
|
|
130
|
+
return TypedDictInfo(hint.__name__, hint)
|
|
131
|
+
if is_union(hint):
|
|
132
|
+
nested = [cls.from_type_hint(typ) for typ in hint.__args__]
|
|
133
|
+
return cls('Union', nested=nested)
|
|
134
|
+
if hasattr(hint, '__origin__'):
|
|
135
|
+
if has_args(hint):
|
|
136
|
+
nested = [cls.from_type_hint(t) for t in hint.__args__]
|
|
137
|
+
else:
|
|
138
|
+
nested = []
|
|
139
|
+
return cls(type_repr(hint, nested=False), hint.__origin__, nested)
|
|
140
|
+
if isinstance(hint, type):
|
|
141
|
+
return cls(type_repr(hint), hint)
|
|
142
|
+
if hint is None:
|
|
143
|
+
return cls('None', type(None))
|
|
144
|
+
if isinstance(hint, str):
|
|
145
|
+
return cls.from_string(hint)
|
|
146
|
+
if isinstance(hint, dict):
|
|
147
|
+
return cls.from_dict(hint)
|
|
148
|
+
if isinstance(hint, (tuple, list)):
|
|
149
|
+
return cls.from_sequence(hint)
|
|
150
|
+
if hint is Union:
|
|
151
|
+
return cls('Union')
|
|
152
|
+
if hint is Any:
|
|
153
|
+
return cls('Any', hint)
|
|
154
|
+
if hint is Ellipsis:
|
|
155
|
+
return cls('...', hint)
|
|
156
|
+
return cls(str(hint))
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
def from_type(cls, hint: type) -> 'TypeInfo':
|
|
160
|
+
return cls(type_repr(hint), hint)
|
|
161
|
+
|
|
162
|
+
@classmethod
|
|
163
|
+
def from_string(cls, hint: str) -> 'TypeInfo':
|
|
164
|
+
try:
|
|
165
|
+
return TypeInfoParser(hint).parse()
|
|
166
|
+
except ValueError as err:
|
|
167
|
+
raise DataError(str(err))
|
|
168
|
+
|
|
169
|
+
@classmethod
|
|
170
|
+
def from_dict(cls, data: dict) -> 'TypeInfo':
|
|
171
|
+
if not data:
|
|
172
|
+
return cls()
|
|
173
|
+
nested = [cls.from_type_hint(n) for n in data['nested']]
|
|
174
|
+
return cls(data['name'], nested=nested)
|
|
175
|
+
|
|
176
|
+
@classmethod
|
|
177
|
+
def from_sequence(cls, sequence: 'tuple|list') -> 'TypeInfo':
|
|
178
|
+
infos = []
|
|
179
|
+
for typ in sequence:
|
|
180
|
+
info = cls.from_type_hint(typ)
|
|
181
|
+
if info.is_union:
|
|
182
|
+
infos.extend(info.nested)
|
|
183
|
+
else:
|
|
184
|
+
infos.append(info)
|
|
185
|
+
if len(infos) == 1:
|
|
186
|
+
return infos[0]
|
|
187
|
+
return cls('Union', nested=infos)
|
|
188
|
+
|
|
189
|
+
def convert(self, value: Any,
|
|
190
|
+
name: 'str|None' = None,
|
|
191
|
+
custom_converters: 'CustomArgumentConverters|dict|None' = None,
|
|
192
|
+
languages: 'LanguagesLike' = None,
|
|
193
|
+
kind: str = 'Argument'):
|
|
194
|
+
if isinstance(custom_converters, dict):
|
|
195
|
+
custom_converters = CustomArgumentConverters.from_dict(custom_converters)
|
|
196
|
+
converter = TypeConverter.converter_for(self, custom_converters, languages)
|
|
197
|
+
if not converter:
|
|
198
|
+
raise TypeError(f"No converter found for '{self}'.")
|
|
199
|
+
return converter.convert(value, name, kind)
|
|
200
|
+
|
|
201
|
+
def __str__(self):
|
|
202
|
+
if self.is_union:
|
|
203
|
+
return ' | '.join(str(n) for n in self.nested)
|
|
204
|
+
if self.nested:
|
|
205
|
+
nested = ', '.join(str(n) for n in self.nested)
|
|
206
|
+
return f'{self.name}[{nested}]'
|
|
207
|
+
return self.name or ''
|
|
208
|
+
|
|
209
|
+
def __bool__(self):
|
|
210
|
+
return self.name is not None
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class TypedDictInfo(TypeInfo):
|
|
214
|
+
is_typed_dict = True
|
|
215
|
+
__slots__ = ('annotations', 'required')
|
|
216
|
+
|
|
217
|
+
def __init__(self, name: str, type: type):
|
|
218
|
+
super().__init__(name, type)
|
|
219
|
+
self.annotations = {n: TypeInfo.from_type_hint(t)
|
|
220
|
+
for n, t in type.__annotations__.items()}
|
|
221
|
+
# __required_keys__ is new in Python 3.9.
|
|
222
|
+
self.required = getattr(type, '__required_keys__', frozenset())
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
class TypeInfoTokenType(Enum):
|
|
226
|
+
NAME = auto()
|
|
227
|
+
LEFT_SQUARE = auto()
|
|
228
|
+
RIGHT_SQUARE = auto()
|
|
229
|
+
PIPE = auto()
|
|
230
|
+
COMMA = auto()
|
|
231
|
+
|
|
232
|
+
def __repr__(self):
|
|
233
|
+
return str(self)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
@dataclass
|
|
237
|
+
class TypeInfoToken:
|
|
238
|
+
type: TypeInfoTokenType
|
|
239
|
+
value: str
|
|
240
|
+
position: int = -1
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class TypeInfoTokenizer:
|
|
244
|
+
markers = {
|
|
245
|
+
'[': TypeInfoTokenType.LEFT_SQUARE,
|
|
246
|
+
']': TypeInfoTokenType.RIGHT_SQUARE,
|
|
247
|
+
'|': TypeInfoTokenType.PIPE,
|
|
248
|
+
',': TypeInfoTokenType.COMMA,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
def __init__(self, source: str):
|
|
252
|
+
self.source = source
|
|
253
|
+
self.tokens: 'list[TypeInfoToken]' = []
|
|
254
|
+
self.start = 0
|
|
255
|
+
self.current = 0
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def at_end(self) -> bool:
|
|
259
|
+
return self.current >= len(self.source)
|
|
260
|
+
|
|
261
|
+
def tokenize(self) -> 'list[TypeInfoToken]':
|
|
262
|
+
while not self.at_end:
|
|
263
|
+
self.start = self.current
|
|
264
|
+
char = self.advance()
|
|
265
|
+
if char in self.markers:
|
|
266
|
+
self.add_token(self.markers[char])
|
|
267
|
+
elif char.strip():
|
|
268
|
+
self.name()
|
|
269
|
+
return self.tokens
|
|
270
|
+
|
|
271
|
+
def advance(self) -> str:
|
|
272
|
+
char = self.source[self.current]
|
|
273
|
+
self.current += 1
|
|
274
|
+
return char
|
|
275
|
+
|
|
276
|
+
def peek(self) -> 'str|None':
|
|
277
|
+
try:
|
|
278
|
+
return self.source[self.current]
|
|
279
|
+
except IndexError:
|
|
280
|
+
return None
|
|
281
|
+
|
|
282
|
+
def name(self):
|
|
283
|
+
end_at = set(self.markers) | {None}
|
|
284
|
+
while self.peek() not in end_at:
|
|
285
|
+
self.current += 1
|
|
286
|
+
self.add_token(TypeInfoTokenType.NAME)
|
|
287
|
+
|
|
288
|
+
def add_token(self, type: TypeInfoTokenType):
|
|
289
|
+
value = self.source[self.start:self.current].strip()
|
|
290
|
+
self.tokens.append(TypeInfoToken(type, value, self.start))
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class TypeInfoParser:
|
|
294
|
+
|
|
295
|
+
def __init__(self, source: str):
|
|
296
|
+
self.source = source
|
|
297
|
+
self.tokens: 'list[TypeInfoToken]' = []
|
|
298
|
+
self.current = 0
|
|
299
|
+
|
|
300
|
+
@property
|
|
301
|
+
def at_end(self) -> bool:
|
|
302
|
+
return self.peek() is None
|
|
303
|
+
|
|
304
|
+
def parse(self) -> 'TypeInfo':
|
|
305
|
+
self.tokens = TypeInfoTokenizer(self.source).tokenize()
|
|
306
|
+
info = self.type()
|
|
307
|
+
if not self.at_end:
|
|
308
|
+
self.error(f"Extra content after '{info}'.")
|
|
309
|
+
return info
|
|
310
|
+
|
|
311
|
+
def type(self) -> 'TypeInfo':
|
|
312
|
+
if not self.check(TypeInfoTokenType.NAME):
|
|
313
|
+
self.error('Type name missing.')
|
|
314
|
+
info = TypeInfo(self.advance().value)
|
|
315
|
+
if self.match(TypeInfoTokenType.LEFT_SQUARE):
|
|
316
|
+
info.nested = self.params()
|
|
317
|
+
if self.match(TypeInfoTokenType.PIPE):
|
|
318
|
+
nested = [info] + self.union()
|
|
319
|
+
info = TypeInfo('Union', nested=nested)
|
|
320
|
+
return info
|
|
321
|
+
|
|
322
|
+
def params(self) -> 'list[TypeInfo]':
|
|
323
|
+
params = []
|
|
324
|
+
while not params or self.match(TypeInfoTokenType.COMMA):
|
|
325
|
+
params.append(self.type())
|
|
326
|
+
if not self.match(TypeInfoTokenType.RIGHT_SQUARE):
|
|
327
|
+
self.error("Closing ']' missing.")
|
|
328
|
+
return params
|
|
329
|
+
|
|
330
|
+
def union(self) -> 'list[TypeInfo]':
|
|
331
|
+
types = []
|
|
332
|
+
while not types or self.match(TypeInfoTokenType.PIPE):
|
|
333
|
+
info = self.type()
|
|
334
|
+
if info.is_union:
|
|
335
|
+
types.extend(info.nested)
|
|
336
|
+
else:
|
|
337
|
+
types.append(info)
|
|
338
|
+
return types
|
|
339
|
+
|
|
340
|
+
def match(self, *types: TypeInfoTokenType) -> bool:
|
|
341
|
+
for typ in types:
|
|
342
|
+
if self.check(typ):
|
|
343
|
+
self.advance()
|
|
344
|
+
return True
|
|
345
|
+
return False
|
|
346
|
+
|
|
347
|
+
def check(self, expected: TypeInfoTokenType) -> bool:
|
|
348
|
+
peeked = self.peek()
|
|
349
|
+
return peeked and peeked.type == expected
|
|
350
|
+
|
|
351
|
+
def advance(self) -> 'TypeInfoToken|None':
|
|
352
|
+
token = self.peek()
|
|
353
|
+
if token:
|
|
354
|
+
self.current += 1
|
|
355
|
+
return token
|
|
356
|
+
|
|
357
|
+
def peek(self) -> 'TypeInfoToken|None':
|
|
358
|
+
try:
|
|
359
|
+
return self.tokens[self.current]
|
|
360
|
+
except IndexError:
|
|
361
|
+
return None
|
|
362
|
+
|
|
363
|
+
def error(self, message: str):
|
|
364
|
+
token = self.peek()
|
|
365
|
+
position = f'index {token.position}' if token else 'end'
|
|
366
|
+
raise ValueError(f"Parsing type {self.source!r} failed: "
|
|
367
|
+
f"Error at {position}: {message}")
|
|
@@ -0,0 +1,62 @@
|
|
|
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 collections.abc import Mapping, Sequence
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
from robot.errors import DataError
|
|
20
|
+
from robot.utils import (is_dict_like, is_list_like, plural_or_not as s,
|
|
21
|
+
seq2str, type_name)
|
|
22
|
+
|
|
23
|
+
from .typeinfo import TypeInfo
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from .argumentspec import ArgumentSpec
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TypeValidator:
|
|
30
|
+
|
|
31
|
+
def __init__(self, arg_spec: 'ArgumentSpec'):
|
|
32
|
+
self.arg_spec = arg_spec
|
|
33
|
+
|
|
34
|
+
def validate(self, types: 'Mapping|Sequence|None') -> 'dict[str, TypeInfo]|None':
|
|
35
|
+
if types is None:
|
|
36
|
+
return None
|
|
37
|
+
if not types:
|
|
38
|
+
return {}
|
|
39
|
+
if is_dict_like(types):
|
|
40
|
+
self._validate_type_dict(types)
|
|
41
|
+
elif is_list_like(types):
|
|
42
|
+
types = self._type_list_to_dict(types)
|
|
43
|
+
else:
|
|
44
|
+
raise DataError(f'Type information must be given as a dictionary or '
|
|
45
|
+
f'a list, got {type_name(types)}.')
|
|
46
|
+
return {k: TypeInfo.from_type_hint(types[k]) for k in types}
|
|
47
|
+
|
|
48
|
+
def _validate_type_dict(self, types: Mapping):
|
|
49
|
+
# 'return' isn't used for anything yet, but it may be shown by Libdoc
|
|
50
|
+
# in the future. Trying to be forward compatible.
|
|
51
|
+
names = set(self.arg_spec.argument_names + ['return'])
|
|
52
|
+
extra = [t for t in types if t not in names]
|
|
53
|
+
if extra:
|
|
54
|
+
raise DataError(f'Type information given to non-existing '
|
|
55
|
+
f'argument{s(extra)} {seq2str(sorted(extra))}.')
|
|
56
|
+
|
|
57
|
+
def _type_list_to_dict(self, types: Sequence) -> dict:
|
|
58
|
+
names = self.arg_spec.argument_names
|
|
59
|
+
if len(types) > len(names):
|
|
60
|
+
raise DataError(f'Type information given to {len(types)} argument{s(types)} '
|
|
61
|
+
f'but keyword has only {len(names)} argument{s(names)}.')
|
|
62
|
+
return {name: value for name, value in zip(names, types) if value}
|