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,158 @@
|
|
|
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 . import pyloggingconf
|
|
17
|
+
from .debugfile import DebugFile
|
|
18
|
+
from .listeners import Listeners, LibraryListeners
|
|
19
|
+
from .logger import LOGGER
|
|
20
|
+
from .loggerapi import LoggerApi
|
|
21
|
+
from .loggerhelper import AbstractLogger
|
|
22
|
+
from .xmllogger import XmlLoggerAdapter
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Output(AbstractLogger, LoggerApi):
|
|
26
|
+
|
|
27
|
+
def __init__(self, settings):
|
|
28
|
+
AbstractLogger.__init__(self)
|
|
29
|
+
self._xml_logger = XmlLoggerAdapter(settings.output, settings.log_level,
|
|
30
|
+
settings.rpa)
|
|
31
|
+
self.listeners = Listeners(settings.listeners, settings.log_level)
|
|
32
|
+
self.library_listeners = LibraryListeners(settings.log_level)
|
|
33
|
+
self._register_loggers(DebugFile(settings.debug_file))
|
|
34
|
+
self._settings = settings
|
|
35
|
+
|
|
36
|
+
def _register_loggers(self, debug_file):
|
|
37
|
+
LOGGER.register_xml_logger(self._xml_logger)
|
|
38
|
+
LOGGER.register_listeners(self.listeners or None, self.library_listeners)
|
|
39
|
+
if debug_file:
|
|
40
|
+
LOGGER.register_logger(debug_file)
|
|
41
|
+
|
|
42
|
+
def register_error_listener(self, listener):
|
|
43
|
+
LOGGER.register_error_listener(listener)
|
|
44
|
+
|
|
45
|
+
def close(self, result):
|
|
46
|
+
self._xml_logger.logger.visit_statistics(result.statistics)
|
|
47
|
+
self._xml_logger.close()
|
|
48
|
+
LOGGER.unregister_xml_logger()
|
|
49
|
+
LOGGER.output_file('Output', self._settings['Output'])
|
|
50
|
+
|
|
51
|
+
def start_suite(self, data, result):
|
|
52
|
+
LOGGER.start_suite(data, result)
|
|
53
|
+
|
|
54
|
+
def end_suite(self, data, result):
|
|
55
|
+
LOGGER.end_suite(data, result)
|
|
56
|
+
|
|
57
|
+
def start_test(self, data, result):
|
|
58
|
+
LOGGER.start_test(data, result)
|
|
59
|
+
|
|
60
|
+
def end_test(self, data, result):
|
|
61
|
+
LOGGER.end_test(data, result)
|
|
62
|
+
|
|
63
|
+
def start_keyword(self, data, result):
|
|
64
|
+
LOGGER.start_keyword(data, result)
|
|
65
|
+
|
|
66
|
+
def end_keyword(self, data, result):
|
|
67
|
+
LOGGER.end_keyword(data, result)
|
|
68
|
+
|
|
69
|
+
def start_for(self, data, result):
|
|
70
|
+
LOGGER.start_for(data, result)
|
|
71
|
+
|
|
72
|
+
def end_for(self, data, result):
|
|
73
|
+
LOGGER.end_for(data, result)
|
|
74
|
+
|
|
75
|
+
def start_for_iteration(self, data, result):
|
|
76
|
+
LOGGER.start_for_iteration(data, result)
|
|
77
|
+
|
|
78
|
+
def end_for_iteration(self, data, result):
|
|
79
|
+
LOGGER.end_for_iteration(data, result)
|
|
80
|
+
|
|
81
|
+
def start_while(self, data, result):
|
|
82
|
+
LOGGER.start_while(data, result)
|
|
83
|
+
|
|
84
|
+
def end_while(self, data, result):
|
|
85
|
+
LOGGER.end_while(data, result)
|
|
86
|
+
|
|
87
|
+
def start_while_iteration(self, data, result):
|
|
88
|
+
LOGGER.start_while_iteration(data, result)
|
|
89
|
+
|
|
90
|
+
def end_while_iteration(self, data, result):
|
|
91
|
+
LOGGER.end_while_iteration(data, result)
|
|
92
|
+
|
|
93
|
+
def start_if(self, data, result):
|
|
94
|
+
LOGGER.start_if(data, result)
|
|
95
|
+
|
|
96
|
+
def end_if(self, data, result):
|
|
97
|
+
LOGGER.end_if(data, result)
|
|
98
|
+
|
|
99
|
+
def start_if_branch(self, data, result):
|
|
100
|
+
LOGGER.start_if_branch(data, result)
|
|
101
|
+
|
|
102
|
+
def end_if_branch(self, data, result):
|
|
103
|
+
LOGGER.end_if_branch(data, result)
|
|
104
|
+
|
|
105
|
+
def start_try(self, data, result):
|
|
106
|
+
LOGGER.start_try(data, result)
|
|
107
|
+
|
|
108
|
+
def end_try(self, data, result):
|
|
109
|
+
LOGGER.end_try(data, result)
|
|
110
|
+
|
|
111
|
+
def start_try_branch(self, data, result):
|
|
112
|
+
LOGGER.start_try_branch(data, result)
|
|
113
|
+
|
|
114
|
+
def end_try_branch(self, data, result):
|
|
115
|
+
LOGGER.end_try_branch(data, result)
|
|
116
|
+
|
|
117
|
+
def start_var(self, data, result):
|
|
118
|
+
LOGGER.start_var(data, result)
|
|
119
|
+
|
|
120
|
+
def end_var(self, data, result):
|
|
121
|
+
LOGGER.end_var(data, result)
|
|
122
|
+
|
|
123
|
+
def start_break(self, data, result):
|
|
124
|
+
LOGGER.start_break(data, result)
|
|
125
|
+
|
|
126
|
+
def end_break(self, data, result):
|
|
127
|
+
LOGGER.end_break(data, result)
|
|
128
|
+
|
|
129
|
+
def start_continue(self, data, result):
|
|
130
|
+
LOGGER.start_continue(data, result)
|
|
131
|
+
|
|
132
|
+
def end_continue(self, data, result):
|
|
133
|
+
LOGGER.end_continue(data, result)
|
|
134
|
+
|
|
135
|
+
def start_return(self, data, result):
|
|
136
|
+
LOGGER.start_return(data, result)
|
|
137
|
+
|
|
138
|
+
def end_return(self, data, result):
|
|
139
|
+
LOGGER.end_return(data, result)
|
|
140
|
+
|
|
141
|
+
def start_error(self, data, result):
|
|
142
|
+
LOGGER.start_error(data, result)
|
|
143
|
+
|
|
144
|
+
def end_error(self, data, result):
|
|
145
|
+
LOGGER.end_error(data, result)
|
|
146
|
+
|
|
147
|
+
def message(self, msg):
|
|
148
|
+
LOGGER.log_message(msg)
|
|
149
|
+
|
|
150
|
+
def trace(self, msg, write_if_flat=True):
|
|
151
|
+
if write_if_flat or not self._xml_logger.flatten_level:
|
|
152
|
+
self.write(msg, 'TRACE')
|
|
153
|
+
|
|
154
|
+
def set_log_level(self, level):
|
|
155
|
+
pyloggingconf.set_level(level)
|
|
156
|
+
self.listeners.set_log_level(level)
|
|
157
|
+
self.library_listeners.set_log_level(level)
|
|
158
|
+
return self._xml_logger.set_log_level(level)
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
import re
|
|
17
|
+
from datetime import datetime
|
|
17
18
|
|
|
18
|
-
from robot.utils import format_time
|
|
19
19
|
from .loggerhelper import Message, write_to_console
|
|
20
20
|
|
|
21
21
|
|
|
@@ -36,7 +36,7 @@ class StdoutLogSplitter:
|
|
|
36
36
|
write_to_console(msg.lstrip())
|
|
37
37
|
level = 'INFO'
|
|
38
38
|
if timestamp:
|
|
39
|
-
timestamp =
|
|
39
|
+
timestamp = datetime.fromtimestamp(float(timestamp[1:]) / 1000)
|
|
40
40
|
yield Message(msg.strip(), level, timestamp=timestamp)
|
|
41
41
|
|
|
42
42
|
def _split_output(self, output):
|
|
@@ -53,8 +53,11 @@ class StdoutLogSplitter:
|
|
|
53
53
|
def _output_started_with_level(self, tokens):
|
|
54
54
|
return tokens[0] == ''
|
|
55
55
|
|
|
56
|
-
def _format_timestamp(self, millis):
|
|
57
|
-
return format_time(float(millis)/1000, millissep='.')
|
|
58
|
-
|
|
59
56
|
def __iter__(self):
|
|
60
57
|
return iter(self._messages)
|
|
58
|
+
|
|
59
|
+
def __len__(self):
|
|
60
|
+
return len(self._messages)
|
|
61
|
+
|
|
62
|
+
def __getitem__(self, item):
|
|
63
|
+
return self._messages[item]
|
|
@@ -13,19 +13,142 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
from
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
|
|
18
|
+
from robot.utils import NullMarkupWriter, safe_str, XmlWriter
|
|
17
19
|
from robot.version import get_full_version
|
|
18
20
|
from robot.result.visitor import ResultVisitor
|
|
19
21
|
|
|
22
|
+
from .loggerapi import LoggerApi
|
|
20
23
|
from .loggerhelper import IsLogged
|
|
21
24
|
|
|
22
25
|
|
|
26
|
+
class XmlLoggerAdapter(LoggerApi):
|
|
27
|
+
|
|
28
|
+
def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot'):
|
|
29
|
+
self.logger = XmlLogger(path, log_level, rpa, generator)
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def flatten_level(self):
|
|
33
|
+
return self.logger.flatten_level
|
|
34
|
+
|
|
35
|
+
def close(self):
|
|
36
|
+
self.logger.close()
|
|
37
|
+
|
|
38
|
+
def set_log_level(self, level):
|
|
39
|
+
return self.logger.set_log_level(level)
|
|
40
|
+
|
|
41
|
+
def start_suite(self, data, result):
|
|
42
|
+
self.logger.start_suite(result)
|
|
43
|
+
|
|
44
|
+
def end_suite(self, data, result):
|
|
45
|
+
self.logger.end_suite(result)
|
|
46
|
+
|
|
47
|
+
def start_test(self, data, result):
|
|
48
|
+
self.logger.start_test(result)
|
|
49
|
+
|
|
50
|
+
def end_test(self, data, result):
|
|
51
|
+
self.logger.end_test(result)
|
|
52
|
+
|
|
53
|
+
def start_keyword(self, data, result):
|
|
54
|
+
self.logger.start_keyword(result)
|
|
55
|
+
|
|
56
|
+
def end_keyword(self, data, result):
|
|
57
|
+
self.logger.end_keyword(result)
|
|
58
|
+
|
|
59
|
+
def start_for(self, data, result):
|
|
60
|
+
self.logger.start_for(result)
|
|
61
|
+
|
|
62
|
+
def end_for(self, data, result):
|
|
63
|
+
self.logger.end_for(result)
|
|
64
|
+
|
|
65
|
+
def start_for_iteration(self, data, result):
|
|
66
|
+
self.logger.start_for_iteration(result)
|
|
67
|
+
|
|
68
|
+
def end_for_iteration(self, data, result):
|
|
69
|
+
self.logger.end_for_iteration(result)
|
|
70
|
+
|
|
71
|
+
def start_while(self, data, result):
|
|
72
|
+
self.logger.start_while(result)
|
|
73
|
+
|
|
74
|
+
def end_while(self, data, result):
|
|
75
|
+
self.logger.end_while(result)
|
|
76
|
+
|
|
77
|
+
def start_while_iteration(self, data, result):
|
|
78
|
+
self.logger.start_while_iteration(result)
|
|
79
|
+
|
|
80
|
+
def end_while_iteration(self, data, result):
|
|
81
|
+
self.logger.end_while_iteration(result)
|
|
82
|
+
|
|
83
|
+
def start_if(self, data, result):
|
|
84
|
+
self.logger.start_if(result)
|
|
85
|
+
|
|
86
|
+
def end_if(self, data, result):
|
|
87
|
+
self.logger.end_if(result)
|
|
88
|
+
|
|
89
|
+
def start_if_branch(self, data, result):
|
|
90
|
+
self.logger.start_if_branch(result)
|
|
91
|
+
|
|
92
|
+
def end_if_branch(self, data, result):
|
|
93
|
+
self.logger.end_if_branch(result)
|
|
94
|
+
|
|
95
|
+
def start_try(self, data, result):
|
|
96
|
+
self.logger.start_try(result)
|
|
97
|
+
|
|
98
|
+
def end_try(self, data, result):
|
|
99
|
+
self.logger.end_try(result)
|
|
100
|
+
|
|
101
|
+
def start_try_branch(self, data, result):
|
|
102
|
+
self.logger.start_try_branch(result)
|
|
103
|
+
|
|
104
|
+
def end_try_branch(self, data, result):
|
|
105
|
+
self.logger.end_try_branch(result)
|
|
106
|
+
|
|
107
|
+
def start_var(self, data, result):
|
|
108
|
+
self.logger.start_var(result)
|
|
109
|
+
|
|
110
|
+
def end_var(self, data, result):
|
|
111
|
+
self.logger.end_var(result)
|
|
112
|
+
|
|
113
|
+
def start_break(self, data, result):
|
|
114
|
+
self.logger.start_break(result)
|
|
115
|
+
|
|
116
|
+
def end_break(self, data, result):
|
|
117
|
+
self.logger.end_break(result)
|
|
118
|
+
|
|
119
|
+
def start_continue(self, data, result):
|
|
120
|
+
self.logger.start_continue(result)
|
|
121
|
+
|
|
122
|
+
def end_continue(self, data, result):
|
|
123
|
+
self.logger.end_continue(result)
|
|
124
|
+
|
|
125
|
+
def start_return(self, data, result):
|
|
126
|
+
self.logger.start_return(result)
|
|
127
|
+
|
|
128
|
+
def end_return(self, data, result):
|
|
129
|
+
self.logger.end_return(result)
|
|
130
|
+
|
|
131
|
+
def start_error(self, data, result):
|
|
132
|
+
self.logger.start_error(result)
|
|
133
|
+
|
|
134
|
+
def end_error(self, data, result):
|
|
135
|
+
self.logger.end_error(result)
|
|
136
|
+
|
|
137
|
+
def log_message(self, message):
|
|
138
|
+
self.logger.log_message(message)
|
|
139
|
+
|
|
140
|
+
def message(self, message):
|
|
141
|
+
self.logger.message(message)
|
|
142
|
+
|
|
143
|
+
|
|
23
144
|
class XmlLogger(ResultVisitor):
|
|
24
145
|
|
|
25
146
|
def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot'):
|
|
26
147
|
self._log_message_is_logged = IsLogged(log_level)
|
|
27
148
|
self._error_message_is_logged = IsLogged('WARN')
|
|
28
|
-
|
|
149
|
+
# `_writer` is set to NullMarkupWriter when flattening, `_xml_writer` is not.
|
|
150
|
+
self._writer = self._xml_writer = self._get_writer(path, rpa, generator)
|
|
151
|
+
self.flatten_level = 0
|
|
29
152
|
self._errors = []
|
|
30
153
|
|
|
31
154
|
def _get_writer(self, path, rpa, generator):
|
|
@@ -33,9 +156,9 @@ class XmlLogger(ResultVisitor):
|
|
|
33
156
|
return NullMarkupWriter()
|
|
34
157
|
writer = XmlWriter(path, write_empty=False, usage='output')
|
|
35
158
|
writer.start('robot', {'generator': get_full_version(generator),
|
|
36
|
-
'generated':
|
|
159
|
+
'generated': datetime.now().isoformat(),
|
|
37
160
|
'rpa': 'true' if rpa else 'false',
|
|
38
|
-
'schemaversion': '
|
|
161
|
+
'schemaversion': '5'})
|
|
39
162
|
return writer
|
|
40
163
|
|
|
41
164
|
def close(self):
|
|
@@ -58,25 +181,33 @@ class XmlLogger(ResultVisitor):
|
|
|
58
181
|
self._write_message(msg)
|
|
59
182
|
|
|
60
183
|
def _write_message(self, msg):
|
|
61
|
-
attrs = {'
|
|
184
|
+
attrs = {'time': msg.timestamp.isoformat() if msg.timestamp else None,
|
|
185
|
+
'level': msg.level}
|
|
62
186
|
if msg.html:
|
|
63
187
|
attrs['html'] = 'true'
|
|
64
|
-
|
|
188
|
+
# Use `_xml_writer`, not `_writer` to write messages also when flattening.
|
|
189
|
+
self._xml_writer.element('msg', msg.message, attrs)
|
|
65
190
|
|
|
66
191
|
def start_keyword(self, kw):
|
|
67
|
-
attrs = {'name': kw.
|
|
192
|
+
attrs = {'name': kw.name, 'owner': kw.owner}
|
|
68
193
|
if kw.type != 'KEYWORD':
|
|
69
194
|
attrs['type'] = kw.type
|
|
70
|
-
if kw.
|
|
71
|
-
attrs['
|
|
195
|
+
if kw.source_name:
|
|
196
|
+
attrs['source_name'] = kw.source_name
|
|
72
197
|
self._writer.start('kw', attrs)
|
|
73
198
|
self._write_list('var', kw.assign)
|
|
74
199
|
self._write_list('arg', [safe_str(a) for a in kw.args])
|
|
75
200
|
self._write_list('tag', kw.tags)
|
|
76
|
-
# Must be after tags to allow adding message when using --flattenkeywords.
|
|
77
201
|
self._writer.element('doc', kw.doc)
|
|
202
|
+
if kw.tags.robot('flatten'):
|
|
203
|
+
self.flatten_level += 1
|
|
204
|
+
self._writer = NullMarkupWriter()
|
|
78
205
|
|
|
79
206
|
def end_keyword(self, kw):
|
|
207
|
+
if kw.tags.robot('flatten'):
|
|
208
|
+
self.flatten_level -= 1
|
|
209
|
+
if self.flatten_level == 0:
|
|
210
|
+
self._writer = self._xml_writer
|
|
80
211
|
if kw.timeout:
|
|
81
212
|
self._writer.element('timeout', attrs={'value': str(kw.timeout)})
|
|
82
213
|
self._write_status(kw)
|
|
@@ -84,7 +215,6 @@ class XmlLogger(ResultVisitor):
|
|
|
84
215
|
|
|
85
216
|
def start_if(self, if_):
|
|
86
217
|
self._writer.start('if')
|
|
87
|
-
self._writer.element('doc', if_.doc)
|
|
88
218
|
|
|
89
219
|
def end_if(self, if_):
|
|
90
220
|
self._write_status(if_)
|
|
@@ -93,7 +223,6 @@ class XmlLogger(ResultVisitor):
|
|
|
93
223
|
def start_if_branch(self, branch):
|
|
94
224
|
self._writer.start('branch', {'type': branch.type,
|
|
95
225
|
'condition': branch.condition})
|
|
96
|
-
self._writer.element('doc', branch.doc)
|
|
97
226
|
|
|
98
227
|
def end_if_branch(self, branch):
|
|
99
228
|
self._write_status(branch)
|
|
@@ -104,11 +233,10 @@ class XmlLogger(ResultVisitor):
|
|
|
104
233
|
'start': for_.start,
|
|
105
234
|
'mode': for_.mode,
|
|
106
235
|
'fill': for_.fill})
|
|
107
|
-
for name in for_.
|
|
236
|
+
for name in for_.assign:
|
|
108
237
|
self._writer.element('var', name)
|
|
109
238
|
for value in for_.values:
|
|
110
239
|
self._writer.element('value', value)
|
|
111
|
-
self._writer.element('doc', for_.doc)
|
|
112
240
|
|
|
113
241
|
def end_for(self, for_):
|
|
114
242
|
self._write_status(for_)
|
|
@@ -116,9 +244,8 @@ class XmlLogger(ResultVisitor):
|
|
|
116
244
|
|
|
117
245
|
def start_for_iteration(self, iteration):
|
|
118
246
|
self._writer.start('iter')
|
|
119
|
-
for name, value in iteration.
|
|
247
|
+
for name, value in iteration.assign.items():
|
|
120
248
|
self._writer.element('var', value, {'name': name})
|
|
121
|
-
self._writer.element('doc', iteration.doc)
|
|
122
249
|
|
|
123
250
|
def end_for_iteration(self, iteration):
|
|
124
251
|
self._write_status(iteration)
|
|
@@ -134,8 +261,9 @@ class XmlLogger(ResultVisitor):
|
|
|
134
261
|
def start_try_branch(self, branch):
|
|
135
262
|
if branch.type == branch.EXCEPT:
|
|
136
263
|
self._writer.start('branch', attrs={
|
|
137
|
-
'type': 'EXCEPT',
|
|
138
|
-
'pattern_type': branch.pattern_type
|
|
264
|
+
'type': 'EXCEPT',
|
|
265
|
+
'pattern_type': branch.pattern_type,
|
|
266
|
+
'assign': branch.assign
|
|
139
267
|
})
|
|
140
268
|
self._write_list('pattern', branch.patterns)
|
|
141
269
|
else:
|
|
@@ -152,7 +280,6 @@ class XmlLogger(ResultVisitor):
|
|
|
152
280
|
'on_limit': while_.on_limit,
|
|
153
281
|
'on_limit_message': while_.on_limit_message
|
|
154
282
|
})
|
|
155
|
-
self._writer.element('doc', while_.doc)
|
|
156
283
|
|
|
157
284
|
def end_while(self, while_):
|
|
158
285
|
self._write_status(while_)
|
|
@@ -160,12 +287,25 @@ class XmlLogger(ResultVisitor):
|
|
|
160
287
|
|
|
161
288
|
def start_while_iteration(self, iteration):
|
|
162
289
|
self._writer.start('iter')
|
|
163
|
-
self._writer.element('doc', iteration.doc)
|
|
164
290
|
|
|
165
291
|
def end_while_iteration(self, iteration):
|
|
166
292
|
self._write_status(iteration)
|
|
167
293
|
self._writer.end('iter')
|
|
168
294
|
|
|
295
|
+
def start_var(self, var):
|
|
296
|
+
attr = {'name': var.name}
|
|
297
|
+
if var.scope is not None:
|
|
298
|
+
attr['scope'] = var.scope
|
|
299
|
+
if var.separator is not None:
|
|
300
|
+
attr['separator'] = var.separator
|
|
301
|
+
self._writer.start('variable', attr, write_empty=True)
|
|
302
|
+
for val in var.value:
|
|
303
|
+
self._writer.element('var', val)
|
|
304
|
+
|
|
305
|
+
def end_var(self, var):
|
|
306
|
+
self._write_status(var)
|
|
307
|
+
self._writer.end('variable')
|
|
308
|
+
|
|
169
309
|
def start_return(self, return_):
|
|
170
310
|
self._writer.start('return')
|
|
171
311
|
for value in return_.values:
|
|
@@ -262,93 +402,7 @@ class XmlLogger(ResultVisitor):
|
|
|
262
402
|
self._writer.element(tag, item)
|
|
263
403
|
|
|
264
404
|
def _write_status(self, item):
|
|
265
|
-
attrs = {'status': item.status,
|
|
266
|
-
'
|
|
267
|
-
|
|
268
|
-
attrs['elapsedtime'] = str(item.elapsedtime)
|
|
405
|
+
attrs = {'status': item.status,
|
|
406
|
+
'start': item.start_time.isoformat() if item.start_time else None,
|
|
407
|
+
'elapsed': format(item.elapsed_time.total_seconds(), 'f')}
|
|
269
408
|
self._writer.element('status', item.message, attrs)
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
class FlatXmlLogger(XmlLogger):
|
|
273
|
-
|
|
274
|
-
def __init__(self, real_xml_logger):
|
|
275
|
-
super().__init__(None)
|
|
276
|
-
self._writer = real_xml_logger._writer
|
|
277
|
-
|
|
278
|
-
def start_keyword(self, kw):
|
|
279
|
-
pass
|
|
280
|
-
|
|
281
|
-
def end_keyword(self, kw):
|
|
282
|
-
pass
|
|
283
|
-
|
|
284
|
-
def start_for(self, for_):
|
|
285
|
-
pass
|
|
286
|
-
|
|
287
|
-
def end_for(self, for_):
|
|
288
|
-
pass
|
|
289
|
-
|
|
290
|
-
def start_for_iteration(self, iteration):
|
|
291
|
-
pass
|
|
292
|
-
|
|
293
|
-
def end_for_iteration(self, iteration):
|
|
294
|
-
pass
|
|
295
|
-
|
|
296
|
-
def start_if(self, if_):
|
|
297
|
-
pass
|
|
298
|
-
|
|
299
|
-
def end_if(self, if_):
|
|
300
|
-
pass
|
|
301
|
-
|
|
302
|
-
def start_if_branch(self, branch):
|
|
303
|
-
pass
|
|
304
|
-
|
|
305
|
-
def end_if_branch(self, branch):
|
|
306
|
-
pass
|
|
307
|
-
|
|
308
|
-
def start_try(self, root):
|
|
309
|
-
pass
|
|
310
|
-
|
|
311
|
-
def end_try(self, root):
|
|
312
|
-
pass
|
|
313
|
-
|
|
314
|
-
def start_try_branch(self, branch):
|
|
315
|
-
pass
|
|
316
|
-
|
|
317
|
-
def end_try_branch(self, branch):
|
|
318
|
-
pass
|
|
319
|
-
|
|
320
|
-
def start_while(self, while_):
|
|
321
|
-
pass
|
|
322
|
-
|
|
323
|
-
def end_while(self, while_):
|
|
324
|
-
pass
|
|
325
|
-
|
|
326
|
-
def start_while_iteration(self, iteration):
|
|
327
|
-
pass
|
|
328
|
-
|
|
329
|
-
def end_while_iteration(self, iteration):
|
|
330
|
-
pass
|
|
331
|
-
|
|
332
|
-
def start_break(self, break_):
|
|
333
|
-
pass
|
|
334
|
-
|
|
335
|
-
def end_break(self, break_):
|
|
336
|
-
pass
|
|
337
|
-
|
|
338
|
-
def start_continue(self, continue_):
|
|
339
|
-
pass
|
|
340
|
-
|
|
341
|
-
def end_continue(self, continue_):
|
|
342
|
-
pass
|
|
343
|
-
|
|
344
|
-
def start_return(self, return_):
|
|
345
|
-
pass
|
|
346
|
-
|
|
347
|
-
def end_return(self, return_):
|
|
348
|
-
pass
|
|
349
|
-
|
|
350
|
-
def start_error(self, error):
|
|
351
|
-
pass
|
|
352
|
-
|
|
353
|
-
def end_error(self, error):
|
|
354
|
-
pass
|
|
@@ -29,8 +29,9 @@ from .statementlexers import (BreakLexer, CommentLexer, CommentSectionHeaderLexe
|
|
|
29
29
|
KeywordSettingLexer, Lexer, ReturnLexer, SettingLexer,
|
|
30
30
|
SettingSectionHeaderLexer, SyntaxErrorLexer,
|
|
31
31
|
TaskSectionHeaderLexer, TestCaseSectionHeaderLexer,
|
|
32
|
-
TestCaseSettingLexer, TryHeaderLexer,
|
|
33
|
-
VariableSectionHeaderLexer,
|
|
32
|
+
TestCaseSettingLexer, TryHeaderLexer, VarLexer,
|
|
33
|
+
VariableLexer, VariableSectionHeaderLexer,
|
|
34
|
+
WhileHeaderLexer)
|
|
34
35
|
from .tokens import StatementTokens, Token
|
|
35
36
|
|
|
36
37
|
|
|
@@ -200,8 +201,8 @@ class TestCaseLexer(TestOrKeywordLexer):
|
|
|
200
201
|
self._lex_with_priority(priority=TestCaseSettingLexer)
|
|
201
202
|
|
|
202
203
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
203
|
-
return (TestCaseSettingLexer, ForLexer, InlineIfLexer, IfLexer,
|
|
204
|
-
|
|
204
|
+
return (TestCaseSettingLexer, ForLexer, InlineIfLexer, IfLexer, TryLexer,
|
|
205
|
+
WhileLexer, VarLexer, SyntaxErrorLexer, KeywordCallLexer)
|
|
205
206
|
|
|
206
207
|
|
|
207
208
|
class KeywordLexer(TestOrKeywordLexer):
|
|
@@ -211,8 +212,8 @@ class KeywordLexer(TestOrKeywordLexer):
|
|
|
211
212
|
super().__init__(ctx.keyword_context())
|
|
212
213
|
|
|
213
214
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
214
|
-
return (KeywordSettingLexer, ForLexer, InlineIfLexer, IfLexer,
|
|
215
|
-
|
|
215
|
+
return (KeywordSettingLexer, ForLexer, InlineIfLexer, IfLexer, TryLexer,
|
|
216
|
+
WhileLexer, VarLexer, ReturnLexer, SyntaxErrorLexer, KeywordCallLexer)
|
|
216
217
|
|
|
217
218
|
|
|
218
219
|
class NestedBlockLexer(BlockLexer, ABC):
|
|
@@ -242,7 +243,8 @@ class ForLexer(NestedBlockLexer):
|
|
|
242
243
|
|
|
243
244
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
244
245
|
return (ForHeaderLexer, InlineIfLexer, IfLexer, TryLexer, WhileLexer, EndLexer,
|
|
245
|
-
ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer,
|
|
246
|
+
VarLexer, ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer,
|
|
247
|
+
KeywordCallLexer)
|
|
246
248
|
|
|
247
249
|
|
|
248
250
|
class WhileLexer(NestedBlockLexer):
|
|
@@ -252,7 +254,8 @@ class WhileLexer(NestedBlockLexer):
|
|
|
252
254
|
|
|
253
255
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
254
256
|
return (WhileHeaderLexer, ForLexer, InlineIfLexer, IfLexer, TryLexer, EndLexer,
|
|
255
|
-
ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer,
|
|
257
|
+
VarLexer, ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer,
|
|
258
|
+
KeywordCallLexer)
|
|
256
259
|
|
|
257
260
|
|
|
258
261
|
class TryLexer(NestedBlockLexer):
|
|
@@ -262,8 +265,9 @@ class TryLexer(NestedBlockLexer):
|
|
|
262
265
|
|
|
263
266
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
264
267
|
return (TryHeaderLexer, ExceptHeaderLexer, ElseHeaderLexer, FinallyHeaderLexer,
|
|
265
|
-
ForLexer, InlineIfLexer, IfLexer, WhileLexer, EndLexer,
|
|
266
|
-
BreakLexer, ContinueLexer, SyntaxErrorLexer,
|
|
268
|
+
ForLexer, InlineIfLexer, IfLexer, WhileLexer, EndLexer, VarLexer,
|
|
269
|
+
ReturnLexer, BreakLexer, ContinueLexer, SyntaxErrorLexer,
|
|
270
|
+
KeywordCallLexer)
|
|
267
271
|
|
|
268
272
|
|
|
269
273
|
class IfLexer(NestedBlockLexer):
|
|
@@ -273,8 +277,8 @@ class IfLexer(NestedBlockLexer):
|
|
|
273
277
|
|
|
274
278
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
275
279
|
return (InlineIfLexer, IfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer,
|
|
276
|
-
ForLexer, TryLexer, WhileLexer, EndLexer,
|
|
277
|
-
BreakLexer, SyntaxErrorLexer, KeywordCallLexer)
|
|
280
|
+
ForLexer, TryLexer, WhileLexer, EndLexer, VarLexer, ReturnLexer,
|
|
281
|
+
ContinueLexer, BreakLexer, SyntaxErrorLexer, KeywordCallLexer)
|
|
278
282
|
|
|
279
283
|
|
|
280
284
|
class InlineIfLexer(NestedBlockLexer):
|
|
@@ -288,7 +292,7 @@ class InlineIfLexer(NestedBlockLexer):
|
|
|
288
292
|
return False
|
|
289
293
|
|
|
290
294
|
def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
|
|
291
|
-
return (InlineIfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer,
|
|
295
|
+
return (InlineIfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer, VarLexer,
|
|
292
296
|
ReturnLexer, ContinueLexer, BreakLexer, KeywordCallLexer)
|
|
293
297
|
|
|
294
298
|
def input(self, statement: StatementTokens):
|
|
@@ -76,8 +76,18 @@ class FileContext(LexingContext):
|
|
|
76
76
|
|
|
77
77
|
def _handles_section(self, statement: StatementTokens, header: str) -> bool:
|
|
78
78
|
marker = statement[0].value
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
if not marker or marker[0] != '*':
|
|
80
|
+
return False
|
|
81
|
+
normalized = self._normalize(marker)
|
|
82
|
+
if self.languages.headers.get(normalized) == header:
|
|
83
|
+
return True
|
|
84
|
+
if normalized == header[:-1]:
|
|
85
|
+
statement[0].error = (
|
|
86
|
+
f"Singular section headers like '{marker}' are deprecated. "
|
|
87
|
+
f"Use plural format like '*** {header} ***' instead."
|
|
88
|
+
)
|
|
89
|
+
return True
|
|
90
|
+
return False
|
|
81
91
|
|
|
82
92
|
def _normalize(self, marker: str) -> str:
|
|
83
93
|
return normalize_whitespace(marker).strip('* ').title()
|
|
@@ -128,7 +128,7 @@ class Lexer:
|
|
|
128
128
|
|
|
129
129
|
def _get_tokens(self, statements: 'Iterable[list[Token]]') -> 'Iterator[Token]':
|
|
130
130
|
if self.data_only:
|
|
131
|
-
ignored_types = {None, Token.
|
|
131
|
+
ignored_types = {None, Token.COMMENT}
|
|
132
132
|
else:
|
|
133
133
|
ignored_types = {None}
|
|
134
134
|
inline_if_type = Token.INLINE_IF
|