robotframework 6.1rc1__zip → 7.0__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {robotframework-6.1rc1 → robotframework-7.0}/INSTALL.rst +25 -25
- {robotframework-6.1rc1 → robotframework-7.0}/PKG-INFO +6 -8
- {robotframework-6.1rc1 → robotframework-7.0}/README.rst +3 -2
- {robotframework-6.1rc1 → robotframework-7.0}/setup.py +3 -6
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/__init__.py +4 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/deco.py +60 -14
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/exceptions.py +6 -6
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/interfaces.py +403 -68
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/logger.py +27 -20
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/parsing.py +4 -2
- robotframework-7.0/src/robot/api/py.typed +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/gatherfailed.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/languages.py +61 -25
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/settings.py +21 -14
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/common/storage.js +11 -6
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/htmlfilewriter.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.css +10 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.html +10 -0
- robotframework-7.0/src/robot/htmldata/rebot/common.css +362 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/doc_formatting.css +13 -7
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/log.css +51 -10
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/log.html +14 -23
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/model.js +2 -4
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/report.css +83 -19
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/report.html +22 -7
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/testdata.js +10 -3
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/view.js +84 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/template.py +3 -3
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/builder.py +0 -8
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/datatypes.py +9 -10
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/htmlutils.py +4 -7
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/jsonbuilder.py +38 -20
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/model.py +21 -28
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/robotbuilder.py +50 -31
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/standardtypes.py +9 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/xmlbuilder.py +35 -20
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/xmlwriter.py +18 -38
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/BuiltIn.py +255 -205
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Collections.py +384 -240
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/DateTime.py +73 -60
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/OperatingSystem.py +6 -5
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Process.py +26 -27
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Remote.py +40 -36
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/String.py +66 -76
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/XML.py +66 -59
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/__init__.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/dialogs_py.py +14 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/__init__.py +5 -5
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/body.py +44 -13
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/configurer.py +19 -15
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/control.py +230 -88
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/filter.py +31 -25
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/itemlist.py +9 -8
- robotframework-7.0/src/robot/model/keyword.py +77 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/message.py +19 -10
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/modelobject.py +27 -15
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/modifier.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/namepatterns.py +3 -25
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/stats.py +9 -15
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/tags.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/testcase.py +15 -27
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/testsuite.py +44 -28
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/visitor.py +35 -8
- robotframework-7.0/src/robot/output/console/dotted.py +90 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/quiet.py +3 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/verbose.py +61 -61
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/debugfile.py +39 -24
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/filelogger.py +18 -15
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/librarylogger.py +3 -2
- robotframework-7.0/src/robot/output/listeners.py +753 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/logger.py +216 -80
- robotframework-7.0/src/robot/output/loggerapi.py +215 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/loggerhelper.py +23 -56
- robotframework-7.0/src/robot/output/output.py +185 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/stdoutlogsplitter.py +8 -5
- robotframework-7.0/src/robot/output/xmllogger.py +459 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/blocklexers.py +17 -13
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/context.py +12 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/lexer.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/settings.py +6 -3
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/statementlexers.py +39 -10
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/tokens.py +27 -29
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/model/blocks.py +19 -6
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/model/statements.py +193 -94
- robotframework-7.0/src/robot/parsing/model/visitor.py +100 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/rebot.py +2 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/expandkeywordmatcher.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jsbuildingcontext.py +8 -6
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jsmodelbuilders.py +88 -61
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/logreportwriters.py +16 -10
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/outputwriter.py +18 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/resultwriter.py +4 -4
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/stringcache.py +3 -3
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/xunitwriter.py +15 -21
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/__init__.py +3 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/configurer.py +12 -9
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/executionresult.py +56 -8
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/flattenkeywordmatcher.py +48 -9
- robotframework-7.0/src/robot/result/keywordremover.py +207 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/merger.py +1 -1
- robotframework-7.0/src/robot/result/model.py +1185 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/modeldeprecation.py +9 -3
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/resultbuilder.py +46 -36
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/xmlelementhandlers.py +83 -43
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/run.py +3 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/__init__.py +14 -4
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/__init__.py +2 -1
- robotframework-7.0/src/robot/running/arguments/argumentconverter.py +100 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentmapper.py +26 -24
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentparser.py +85 -61
- robotframework-7.0/src/robot/running/arguments/argumentresolver.py +158 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentspec.py +83 -116
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentvalidator.py +33 -27
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/customconverters.py +15 -12
- robotframework-7.0/src/robot/running/arguments/embedded.py +145 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/typeconverters.py +268 -220
- robotframework-7.0/src/robot/running/arguments/typeinfo.py +317 -0
- robotframework-7.0/src/robot/running/arguments/typeinfoparser.py +219 -0
- robotframework-7.0/src/robot/running/arguments/typevalidator.py +60 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/bodyrunner.py +147 -129
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/builders.py +17 -26
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/parsers.py +17 -11
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/settings.py +9 -17
- robotframework-7.0/src/robot/running/builder/transformers.py +535 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/context.py +113 -31
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/dynamicmethods.py +62 -34
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/importer.py +27 -49
- robotframework-7.0/src/robot/running/invalidkeyword.py +67 -0
- robotframework-7.0/src/robot/running/keywordfinder.py +91 -0
- robotframework-7.0/src/robot/running/keywordimplementation.py +164 -0
- robotframework-7.0/src/robot/running/librarykeyword.py +392 -0
- robotframework-7.0/src/robot/running/librarykeywordrunner.py +250 -0
- robotframework-7.0/src/robot/running/libraryscopes.py +115 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/model.py +198 -337
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/namespace.py +124 -137
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/outputcapture.py +20 -12
- robotframework-7.0/src/robot/running/resourcemodel.py +448 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/statusreporter.py +16 -13
- robotframework-7.0/src/robot/running/suiterunner.py +265 -0
- robotframework-7.0/src/robot/running/testlibraries.py +500 -0
- robotframework-7.0/src/robot/running/userkeywordrunner.py +260 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/testdoc.py +18 -13
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/__init__.py +53 -35
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/connectioncache.py +64 -59
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/dotdict.py +3 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/encodingsniffer.py +9 -4
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/escaping.py +19 -19
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/importer.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/markupwriters.py +23 -15
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/misc.py +1 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/normalizing.py +9 -24
- robotframework-7.0/src/robot/utils/notset.py +33 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/platform.py +15 -5
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotio.py +9 -9
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotpath.py +1 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robottime.py +122 -90
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robottypes.py +21 -31
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/setter.py +0 -5
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/text.py +7 -4
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/unic.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/__init__.py +2 -2
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/assigner.py +17 -19
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/evaluation.py +20 -17
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/filesetter.py +80 -80
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/replacer.py +33 -36
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/scopes.py +17 -12
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/search.py +66 -41
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/store.py +14 -16
- robotframework-7.0/src/robot/variables/tablesetter.py +164 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/variables.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/version.py +1 -1
- {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/PKG-INFO +6 -8
- {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/SOURCES.txt +10 -8
- {robotframework-6.1rc1 → robotframework-7.0}/tasks.py +6 -6
- robotframework-6.1rc1/src/robot/htmldata/rebot/common.css +0 -239
- 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/output/xmllogger.py +0 -354
- robotframework-6.1rc1/src/robot/parsing/model/visitor.py +0 -67
- robotframework-6.1rc1/src/robot/result/keywordremover.py +0 -183
- robotframework-6.1rc1/src/robot/result/model.py +0 -957
- robotframework-6.1rc1/src/robot/running/arguments/argumentconverter.py +0 -79
- robotframework-6.1rc1/src/robot/running/arguments/argumentresolver.py +0 -131
- robotframework-6.1rc1/src/robot/running/arguments/embedded.py +0 -146
- robotframework-6.1rc1/src/robot/running/arguments/typevalidator.py +0 -56
- robotframework-6.1rc1/src/robot/running/builder/transformers.py +0 -642
- robotframework-6.1rc1/src/robot/running/handlers.py +0 -321
- robotframework-6.1rc1/src/robot/running/handlerstore.py +0 -66
- robotframework-6.1rc1/src/robot/running/librarykeywordrunner.py +0 -238
- robotframework-6.1rc1/src/robot/running/libraryscopes.py +0 -97
- robotframework-6.1rc1/src/robot/running/modelcombiner.py +0 -32
- robotframework-6.1rc1/src/robot/running/suiterunner.py +0 -249
- robotframework-6.1rc1/src/robot/running/testlibraries.py +0 -420
- robotframework-6.1rc1/src/robot/running/usererrorhandler.py +0 -75
- robotframework-6.1rc1/src/robot/running/userkeyword.py +0 -111
- robotframework-6.1rc1/src/robot/running/userkeywordrunner.py +0 -274
- robotframework-6.1rc1/src/robot/variables/tablesetter.py +0 -156
- {robotframework-6.1rc1 → robotframework-7.0}/AUTHORS.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/BUILD.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/CONTRIBUTING.rst +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/COPYRIGHT.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/LICENSE.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/MANIFEST.in +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/setup.cfg +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/__main__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/errors.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/common/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/common/js_disabled.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/jsonwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/print.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/pygments.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/fileloading.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/log.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/print.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/util.js +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/testdoc/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.css +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.html +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdoc.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/consoleviewer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/htmlwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/jsonwriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/output.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/writer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Dialogs.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Easter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Screenshot.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Telnet.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/fixture.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/metadata.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/statistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/suitestatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/tagsetter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/tagstatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/totalstatistics.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/highlighting.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/pyloggingconf.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/tokenizer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/model/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/blockparsers.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/fileparser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/parser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/suitestructure.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/pythonpathsetter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jsexecutionresult.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jswriter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/executionerrors.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/messagefilter.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/suiteteardownfailed.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/visitor.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/randomizer.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/runkwregister.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/signalhandler.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/status.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/timeouts/__init__.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/timeouts/posix.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/timeouts/windows.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/application.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/argumentparser.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/asserts.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/charwidth.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/compress.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/encoding.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/error.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/etreewrapper.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/filereader.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/frange.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/htmlformatters.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/markuputils.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/match.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/recommendations.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/restreader.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotenv.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotinspect.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/sortable.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/typehints.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/finders.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/notfound.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/resolvable.py +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/dependency_links.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/entry_points.txt +0 -0
- {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,185 @@
|
|
|
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
|
+
legacy_output=settings.legacy_output)
|
|
32
|
+
self.listeners = Listeners(settings.listeners, settings.log_level)
|
|
33
|
+
self.library_listeners = LibraryListeners(settings.log_level)
|
|
34
|
+
self._register_loggers(DebugFile(settings.debug_file))
|
|
35
|
+
self._settings = settings
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def initial_log_level(self):
|
|
39
|
+
return self._settings.log_level
|
|
40
|
+
|
|
41
|
+
def _register_loggers(self, debug_file):
|
|
42
|
+
LOGGER.register_xml_logger(self._xml_logger)
|
|
43
|
+
LOGGER.register_listeners(self.listeners or None, self.library_listeners)
|
|
44
|
+
if debug_file:
|
|
45
|
+
LOGGER.register_logger(debug_file)
|
|
46
|
+
|
|
47
|
+
def register_error_listener(self, listener):
|
|
48
|
+
LOGGER.register_error_listener(listener)
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def delayed_logging(self):
|
|
52
|
+
return LOGGER.delayed_logging
|
|
53
|
+
|
|
54
|
+
def close(self, result):
|
|
55
|
+
self._xml_logger.logger.visit_statistics(result.statistics)
|
|
56
|
+
self._xml_logger.close()
|
|
57
|
+
LOGGER.unregister_xml_logger()
|
|
58
|
+
LOGGER.output_file(self._settings['Output'])
|
|
59
|
+
|
|
60
|
+
def start_suite(self, data, result):
|
|
61
|
+
LOGGER.start_suite(data, result)
|
|
62
|
+
|
|
63
|
+
def end_suite(self, data, result):
|
|
64
|
+
LOGGER.end_suite(data, result)
|
|
65
|
+
|
|
66
|
+
def start_test(self, data, result):
|
|
67
|
+
LOGGER.start_test(data, result)
|
|
68
|
+
|
|
69
|
+
def end_test(self, data, result):
|
|
70
|
+
LOGGER.end_test(data, result)
|
|
71
|
+
|
|
72
|
+
def start_keyword(self, data, result):
|
|
73
|
+
LOGGER.start_keyword(data, result)
|
|
74
|
+
|
|
75
|
+
def end_keyword(self, data, result):
|
|
76
|
+
LOGGER.end_keyword(data, result)
|
|
77
|
+
|
|
78
|
+
def start_user_keyword(self, data, implementation, result):
|
|
79
|
+
LOGGER.start_user_keyword(data, implementation, result)
|
|
80
|
+
|
|
81
|
+
def end_user_keyword(self, data, implementation, result):
|
|
82
|
+
LOGGER.end_user_keyword(data, implementation, result)
|
|
83
|
+
|
|
84
|
+
def start_library_keyword(self, data, implementation, result):
|
|
85
|
+
LOGGER.start_library_keyword(data, implementation, result)
|
|
86
|
+
|
|
87
|
+
def end_library_keyword(self, data, implementation, result):
|
|
88
|
+
LOGGER.end_library_keyword(data, implementation, result)
|
|
89
|
+
|
|
90
|
+
def start_invalid_keyword(self, data, implementation, result):
|
|
91
|
+
LOGGER.start_invalid_keyword(data, implementation, result)
|
|
92
|
+
|
|
93
|
+
def end_invalid_keyword(self, data, implementation, result):
|
|
94
|
+
LOGGER.end_invalid_keyword(data, implementation, result)
|
|
95
|
+
|
|
96
|
+
def start_for(self, data, result):
|
|
97
|
+
LOGGER.start_for(data, result)
|
|
98
|
+
|
|
99
|
+
def end_for(self, data, result):
|
|
100
|
+
LOGGER.end_for(data, result)
|
|
101
|
+
|
|
102
|
+
def start_for_iteration(self, data, result):
|
|
103
|
+
LOGGER.start_for_iteration(data, result)
|
|
104
|
+
|
|
105
|
+
def end_for_iteration(self, data, result):
|
|
106
|
+
LOGGER.end_for_iteration(data, result)
|
|
107
|
+
|
|
108
|
+
def start_while(self, data, result):
|
|
109
|
+
LOGGER.start_while(data, result)
|
|
110
|
+
|
|
111
|
+
def end_while(self, data, result):
|
|
112
|
+
LOGGER.end_while(data, result)
|
|
113
|
+
|
|
114
|
+
def start_while_iteration(self, data, result):
|
|
115
|
+
LOGGER.start_while_iteration(data, result)
|
|
116
|
+
|
|
117
|
+
def end_while_iteration(self, data, result):
|
|
118
|
+
LOGGER.end_while_iteration(data, result)
|
|
119
|
+
|
|
120
|
+
def start_if(self, data, result):
|
|
121
|
+
LOGGER.start_if(data, result)
|
|
122
|
+
|
|
123
|
+
def end_if(self, data, result):
|
|
124
|
+
LOGGER.end_if(data, result)
|
|
125
|
+
|
|
126
|
+
def start_if_branch(self, data, result):
|
|
127
|
+
LOGGER.start_if_branch(data, result)
|
|
128
|
+
|
|
129
|
+
def end_if_branch(self, data, result):
|
|
130
|
+
LOGGER.end_if_branch(data, result)
|
|
131
|
+
|
|
132
|
+
def start_try(self, data, result):
|
|
133
|
+
LOGGER.start_try(data, result)
|
|
134
|
+
|
|
135
|
+
def end_try(self, data, result):
|
|
136
|
+
LOGGER.end_try(data, result)
|
|
137
|
+
|
|
138
|
+
def start_try_branch(self, data, result):
|
|
139
|
+
LOGGER.start_try_branch(data, result)
|
|
140
|
+
|
|
141
|
+
def end_try_branch(self, data, result):
|
|
142
|
+
LOGGER.end_try_branch(data, result)
|
|
143
|
+
|
|
144
|
+
def start_var(self, data, result):
|
|
145
|
+
LOGGER.start_var(data, result)
|
|
146
|
+
|
|
147
|
+
def end_var(self, data, result):
|
|
148
|
+
LOGGER.end_var(data, result)
|
|
149
|
+
|
|
150
|
+
def start_break(self, data, result):
|
|
151
|
+
LOGGER.start_break(data, result)
|
|
152
|
+
|
|
153
|
+
def end_break(self, data, result):
|
|
154
|
+
LOGGER.end_break(data, result)
|
|
155
|
+
|
|
156
|
+
def start_continue(self, data, result):
|
|
157
|
+
LOGGER.start_continue(data, result)
|
|
158
|
+
|
|
159
|
+
def end_continue(self, data, result):
|
|
160
|
+
LOGGER.end_continue(data, result)
|
|
161
|
+
|
|
162
|
+
def start_return(self, data, result):
|
|
163
|
+
LOGGER.start_return(data, result)
|
|
164
|
+
|
|
165
|
+
def end_return(self, data, result):
|
|
166
|
+
LOGGER.end_return(data, result)
|
|
167
|
+
|
|
168
|
+
def start_error(self, data, result):
|
|
169
|
+
LOGGER.start_error(data, result)
|
|
170
|
+
|
|
171
|
+
def end_error(self, data, result):
|
|
172
|
+
LOGGER.end_error(data, result)
|
|
173
|
+
|
|
174
|
+
def message(self, msg):
|
|
175
|
+
LOGGER.log_message(msg)
|
|
176
|
+
|
|
177
|
+
def trace(self, msg, write_if_flat=True):
|
|
178
|
+
if write_if_flat or not self._xml_logger.flatten_level:
|
|
179
|
+
self.write(msg, 'TRACE')
|
|
180
|
+
|
|
181
|
+
def set_log_level(self, level):
|
|
182
|
+
pyloggingconf.set_level(level)
|
|
183
|
+
self.listeners.set_log_level(level)
|
|
184
|
+
self.library_listeners.set_log_level(level)
|
|
185
|
+
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]
|
|
@@ -0,0 +1,459 @@
|
|
|
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 datetime import datetime
|
|
17
|
+
|
|
18
|
+
from robot.utils import NullMarkupWriter, XmlWriter
|
|
19
|
+
from robot.version import get_full_version
|
|
20
|
+
from robot.result import Keyword, TestCase, TestSuite, ResultVisitor
|
|
21
|
+
|
|
22
|
+
from .loggerapi import LoggerApi
|
|
23
|
+
from .loggerhelper import IsLogged
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class XmlLoggerAdapter(LoggerApi):
|
|
27
|
+
|
|
28
|
+
def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot',
|
|
29
|
+
legacy_output=False):
|
|
30
|
+
logger = XmlLogger if not legacy_output else LegacyXmlLogger
|
|
31
|
+
self.logger = logger(path, log_level, rpa, generator)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def flatten_level(self):
|
|
35
|
+
return self.logger.flatten_level
|
|
36
|
+
|
|
37
|
+
def close(self):
|
|
38
|
+
self.logger.close()
|
|
39
|
+
|
|
40
|
+
def set_log_level(self, level):
|
|
41
|
+
return self.logger.set_log_level(level)
|
|
42
|
+
|
|
43
|
+
def start_suite(self, data, result):
|
|
44
|
+
self.logger.start_suite(result)
|
|
45
|
+
|
|
46
|
+
def end_suite(self, data, result):
|
|
47
|
+
self.logger.end_suite(result)
|
|
48
|
+
|
|
49
|
+
def start_test(self, data, result):
|
|
50
|
+
self.logger.start_test(result)
|
|
51
|
+
|
|
52
|
+
def end_test(self, data, result):
|
|
53
|
+
self.logger.end_test(result)
|
|
54
|
+
|
|
55
|
+
def start_keyword(self, data, result):
|
|
56
|
+
self.logger.start_keyword(result)
|
|
57
|
+
|
|
58
|
+
def end_keyword(self, data, result):
|
|
59
|
+
self.logger.end_keyword(result)
|
|
60
|
+
|
|
61
|
+
def start_for(self, data, result):
|
|
62
|
+
self.logger.start_for(result)
|
|
63
|
+
|
|
64
|
+
def end_for(self, data, result):
|
|
65
|
+
self.logger.end_for(result)
|
|
66
|
+
|
|
67
|
+
def start_for_iteration(self, data, result):
|
|
68
|
+
self.logger.start_for_iteration(result)
|
|
69
|
+
|
|
70
|
+
def end_for_iteration(self, data, result):
|
|
71
|
+
self.logger.end_for_iteration(result)
|
|
72
|
+
|
|
73
|
+
def start_while(self, data, result):
|
|
74
|
+
self.logger.start_while(result)
|
|
75
|
+
|
|
76
|
+
def end_while(self, data, result):
|
|
77
|
+
self.logger.end_while(result)
|
|
78
|
+
|
|
79
|
+
def start_while_iteration(self, data, result):
|
|
80
|
+
self.logger.start_while_iteration(result)
|
|
81
|
+
|
|
82
|
+
def end_while_iteration(self, data, result):
|
|
83
|
+
self.logger.end_while_iteration(result)
|
|
84
|
+
|
|
85
|
+
def start_if(self, data, result):
|
|
86
|
+
self.logger.start_if(result)
|
|
87
|
+
|
|
88
|
+
def end_if(self, data, result):
|
|
89
|
+
self.logger.end_if(result)
|
|
90
|
+
|
|
91
|
+
def start_if_branch(self, data, result):
|
|
92
|
+
self.logger.start_if_branch(result)
|
|
93
|
+
|
|
94
|
+
def end_if_branch(self, data, result):
|
|
95
|
+
self.logger.end_if_branch(result)
|
|
96
|
+
|
|
97
|
+
def start_try(self, data, result):
|
|
98
|
+
self.logger.start_try(result)
|
|
99
|
+
|
|
100
|
+
def end_try(self, data, result):
|
|
101
|
+
self.logger.end_try(result)
|
|
102
|
+
|
|
103
|
+
def start_try_branch(self, data, result):
|
|
104
|
+
self.logger.start_try_branch(result)
|
|
105
|
+
|
|
106
|
+
def end_try_branch(self, data, result):
|
|
107
|
+
self.logger.end_try_branch(result)
|
|
108
|
+
|
|
109
|
+
def start_var(self, data, result):
|
|
110
|
+
self.logger.start_var(result)
|
|
111
|
+
|
|
112
|
+
def end_var(self, data, result):
|
|
113
|
+
self.logger.end_var(result)
|
|
114
|
+
|
|
115
|
+
def start_break(self, data, result):
|
|
116
|
+
self.logger.start_break(result)
|
|
117
|
+
|
|
118
|
+
def end_break(self, data, result):
|
|
119
|
+
self.logger.end_break(result)
|
|
120
|
+
|
|
121
|
+
def start_continue(self, data, result):
|
|
122
|
+
self.logger.start_continue(result)
|
|
123
|
+
|
|
124
|
+
def end_continue(self, data, result):
|
|
125
|
+
self.logger.end_continue(result)
|
|
126
|
+
|
|
127
|
+
def start_return(self, data, result):
|
|
128
|
+
self.logger.start_return(result)
|
|
129
|
+
|
|
130
|
+
def end_return(self, data, result):
|
|
131
|
+
self.logger.end_return(result)
|
|
132
|
+
|
|
133
|
+
def start_error(self, data, result):
|
|
134
|
+
self.logger.start_error(result)
|
|
135
|
+
|
|
136
|
+
def end_error(self, data, result):
|
|
137
|
+
self.logger.end_error(result)
|
|
138
|
+
|
|
139
|
+
def log_message(self, message):
|
|
140
|
+
self.logger.log_message(message)
|
|
141
|
+
|
|
142
|
+
def message(self, message):
|
|
143
|
+
self.logger.message(message)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class XmlLogger(ResultVisitor):
|
|
147
|
+
|
|
148
|
+
def __init__(self, output, log_level='TRACE', rpa=False, generator='Robot',
|
|
149
|
+
suite_only=False):
|
|
150
|
+
self._log_message_is_logged = IsLogged(log_level)
|
|
151
|
+
self._error_message_is_logged = IsLogged('WARN')
|
|
152
|
+
# `_writer` is set to NullMarkupWriter when flattening, `_xml_writer` is not.
|
|
153
|
+
self._writer = self._xml_writer = self._get_writer(output, rpa, generator,
|
|
154
|
+
suite_only)
|
|
155
|
+
self.flatten_level = 0
|
|
156
|
+
self._errors = []
|
|
157
|
+
|
|
158
|
+
def _get_writer(self, output, rpa, generator, suite_only):
|
|
159
|
+
if not output:
|
|
160
|
+
return NullMarkupWriter()
|
|
161
|
+
writer = XmlWriter(output, write_empty=False, usage='output',
|
|
162
|
+
preamble=not suite_only)
|
|
163
|
+
if not suite_only:
|
|
164
|
+
writer.start('robot', self._get_start_attrs(rpa, generator))
|
|
165
|
+
return writer
|
|
166
|
+
|
|
167
|
+
def _get_start_attrs(self, rpa, generator):
|
|
168
|
+
return {'generator': get_full_version(generator),
|
|
169
|
+
'generated': datetime.now().isoformat(),
|
|
170
|
+
'rpa': 'true' if rpa else 'false',
|
|
171
|
+
'schemaversion': '5'}
|
|
172
|
+
|
|
173
|
+
def close(self):
|
|
174
|
+
self.start_errors()
|
|
175
|
+
for msg in self._errors:
|
|
176
|
+
self._write_message(msg)
|
|
177
|
+
self.end_errors()
|
|
178
|
+
self._writer.end('robot')
|
|
179
|
+
self._writer.close()
|
|
180
|
+
|
|
181
|
+
def set_log_level(self, level):
|
|
182
|
+
return self._log_message_is_logged.set_level(level)
|
|
183
|
+
|
|
184
|
+
def message(self, msg):
|
|
185
|
+
if self._error_message_is_logged(msg.level):
|
|
186
|
+
self._errors.append(msg)
|
|
187
|
+
|
|
188
|
+
def log_message(self, msg):
|
|
189
|
+
if self._log_message_is_logged(msg.level):
|
|
190
|
+
self._write_message(msg)
|
|
191
|
+
|
|
192
|
+
def _write_message(self, msg):
|
|
193
|
+
attrs = {'time': msg.timestamp.isoformat() if msg.timestamp else None,
|
|
194
|
+
'level': msg.level}
|
|
195
|
+
if msg.html:
|
|
196
|
+
attrs['html'] = 'true'
|
|
197
|
+
# Use `_xml_writer`, not `_writer` to write messages also when flattening.
|
|
198
|
+
self._xml_writer.element('msg', msg.message, attrs)
|
|
199
|
+
|
|
200
|
+
def start_keyword(self, kw):
|
|
201
|
+
self._writer.start('kw', self._get_start_keyword_attrs(kw))
|
|
202
|
+
if kw.tags.robot('flatten'):
|
|
203
|
+
self.flatten_level += 1
|
|
204
|
+
self._writer = NullMarkupWriter()
|
|
205
|
+
|
|
206
|
+
def _get_start_keyword_attrs(self, kw):
|
|
207
|
+
attrs = {'name': kw.name, 'owner': kw.owner}
|
|
208
|
+
if kw.type != 'KEYWORD':
|
|
209
|
+
attrs['type'] = kw.type
|
|
210
|
+
if kw.source_name:
|
|
211
|
+
attrs['source_name'] = kw.source_name
|
|
212
|
+
return attrs
|
|
213
|
+
|
|
214
|
+
def end_keyword(self, kw):
|
|
215
|
+
if kw.tags.robot('flatten'):
|
|
216
|
+
self.flatten_level -= 1
|
|
217
|
+
if self.flatten_level == 0:
|
|
218
|
+
self._writer = self._xml_writer
|
|
219
|
+
self._write_list('var', kw.assign)
|
|
220
|
+
self._write_list('arg', kw.args)
|
|
221
|
+
self._write_list('tag', kw.tags)
|
|
222
|
+
self._writer.element('doc', kw.doc)
|
|
223
|
+
if kw.timeout:
|
|
224
|
+
self._writer.element('timeout', attrs={'value': str(kw.timeout)})
|
|
225
|
+
self._write_status(kw)
|
|
226
|
+
self._writer.end('kw')
|
|
227
|
+
|
|
228
|
+
def start_if(self, if_):
|
|
229
|
+
self._writer.start('if')
|
|
230
|
+
|
|
231
|
+
def end_if(self, if_):
|
|
232
|
+
self._write_status(if_)
|
|
233
|
+
self._writer.end('if')
|
|
234
|
+
|
|
235
|
+
def start_if_branch(self, branch):
|
|
236
|
+
self._writer.start('branch', {'type': branch.type,
|
|
237
|
+
'condition': branch.condition})
|
|
238
|
+
|
|
239
|
+
def end_if_branch(self, branch):
|
|
240
|
+
self._write_status(branch)
|
|
241
|
+
self._writer.end('branch')
|
|
242
|
+
|
|
243
|
+
def start_for(self, for_):
|
|
244
|
+
self._writer.start('for', {'flavor': for_.flavor,
|
|
245
|
+
'start': for_.start,
|
|
246
|
+
'mode': for_.mode,
|
|
247
|
+
'fill': for_.fill})
|
|
248
|
+
|
|
249
|
+
def end_for(self, for_):
|
|
250
|
+
for name in for_.assign:
|
|
251
|
+
self._writer.element('var', name)
|
|
252
|
+
for value in for_.values:
|
|
253
|
+
self._writer.element('value', value)
|
|
254
|
+
self._write_status(for_)
|
|
255
|
+
self._writer.end('for')
|
|
256
|
+
|
|
257
|
+
def start_for_iteration(self, iteration):
|
|
258
|
+
self._writer.start('iter')
|
|
259
|
+
|
|
260
|
+
def end_for_iteration(self, iteration):
|
|
261
|
+
for name, value in iteration.assign.items():
|
|
262
|
+
self._writer.element('var', value, {'name': name})
|
|
263
|
+
self._write_status(iteration)
|
|
264
|
+
self._writer.end('iter')
|
|
265
|
+
|
|
266
|
+
def start_try(self, root):
|
|
267
|
+
self._writer.start('try')
|
|
268
|
+
|
|
269
|
+
def end_try(self, root):
|
|
270
|
+
self._write_status(root)
|
|
271
|
+
self._writer.end('try')
|
|
272
|
+
|
|
273
|
+
def start_try_branch(self, branch):
|
|
274
|
+
if branch.type == branch.EXCEPT:
|
|
275
|
+
self._writer.start('branch', attrs={
|
|
276
|
+
'type': 'EXCEPT',
|
|
277
|
+
'pattern_type': branch.pattern_type,
|
|
278
|
+
'assign': branch.assign
|
|
279
|
+
})
|
|
280
|
+
self._write_list('pattern', branch.patterns)
|
|
281
|
+
else:
|
|
282
|
+
self._writer.start('branch', attrs={'type': branch.type})
|
|
283
|
+
|
|
284
|
+
def end_try_branch(self, branch):
|
|
285
|
+
self._write_status(branch)
|
|
286
|
+
self._writer.end('branch')
|
|
287
|
+
|
|
288
|
+
def start_while(self, while_):
|
|
289
|
+
self._writer.start('while', attrs={
|
|
290
|
+
'condition': while_.condition,
|
|
291
|
+
'limit': while_.limit,
|
|
292
|
+
'on_limit': while_.on_limit,
|
|
293
|
+
'on_limit_message': while_.on_limit_message
|
|
294
|
+
})
|
|
295
|
+
|
|
296
|
+
def end_while(self, while_):
|
|
297
|
+
self._write_status(while_)
|
|
298
|
+
self._writer.end('while')
|
|
299
|
+
|
|
300
|
+
def start_while_iteration(self, iteration):
|
|
301
|
+
self._writer.start('iter')
|
|
302
|
+
|
|
303
|
+
def end_while_iteration(self, iteration):
|
|
304
|
+
self._write_status(iteration)
|
|
305
|
+
self._writer.end('iter')
|
|
306
|
+
|
|
307
|
+
def start_var(self, var):
|
|
308
|
+
attr = {'name': var.name}
|
|
309
|
+
if var.scope is not None:
|
|
310
|
+
attr['scope'] = var.scope
|
|
311
|
+
if var.separator is not None:
|
|
312
|
+
attr['separator'] = var.separator
|
|
313
|
+
self._writer.start('variable', attr, write_empty=True)
|
|
314
|
+
|
|
315
|
+
def end_var(self, var):
|
|
316
|
+
for val in var.value:
|
|
317
|
+
self._writer.element('var', val)
|
|
318
|
+
self._write_status(var)
|
|
319
|
+
self._writer.end('variable')
|
|
320
|
+
|
|
321
|
+
def start_return(self, return_):
|
|
322
|
+
self._writer.start('return')
|
|
323
|
+
|
|
324
|
+
def end_return(self, return_):
|
|
325
|
+
for value in return_.values:
|
|
326
|
+
self._writer.element('value', value)
|
|
327
|
+
self._write_status(return_)
|
|
328
|
+
self._writer.end('return')
|
|
329
|
+
|
|
330
|
+
def start_continue(self, continue_):
|
|
331
|
+
self._writer.start('continue')
|
|
332
|
+
|
|
333
|
+
def end_continue(self, continue_):
|
|
334
|
+
self._write_status(continue_)
|
|
335
|
+
self._writer.end('continue')
|
|
336
|
+
|
|
337
|
+
def start_break(self, break_):
|
|
338
|
+
self._writer.start('break')
|
|
339
|
+
|
|
340
|
+
def end_break(self, break_):
|
|
341
|
+
self._write_status(break_)
|
|
342
|
+
self._writer.end('break')
|
|
343
|
+
|
|
344
|
+
def start_error(self, error):
|
|
345
|
+
self._writer.start('error')
|
|
346
|
+
|
|
347
|
+
def end_error(self, error):
|
|
348
|
+
for value in error.values:
|
|
349
|
+
self._writer.element('value', value)
|
|
350
|
+
self._write_status(error)
|
|
351
|
+
self._writer.end('error')
|
|
352
|
+
|
|
353
|
+
def start_test(self, test):
|
|
354
|
+
self._writer.start('test', {'id': test.id, 'name': test.name,
|
|
355
|
+
'line': str(test.lineno or '')})
|
|
356
|
+
|
|
357
|
+
def end_test(self, test):
|
|
358
|
+
self._writer.element('doc', test.doc)
|
|
359
|
+
self._write_list('tag', test.tags)
|
|
360
|
+
if test.timeout:
|
|
361
|
+
self._writer.element('timeout', attrs={'value': str(test.timeout)})
|
|
362
|
+
self._write_status(test)
|
|
363
|
+
self._writer.end('test')
|
|
364
|
+
|
|
365
|
+
def start_suite(self, suite):
|
|
366
|
+
attrs = {'id': suite.id, 'name': suite.name}
|
|
367
|
+
if suite.source:
|
|
368
|
+
attrs['source'] = str(suite.source)
|
|
369
|
+
self._writer.start('suite', attrs)
|
|
370
|
+
|
|
371
|
+
def end_suite(self, suite):
|
|
372
|
+
self._writer.element('doc', suite.doc)
|
|
373
|
+
for name, value in suite.metadata.items():
|
|
374
|
+
self._writer.element('meta', value, {'name': name})
|
|
375
|
+
self._write_status(suite)
|
|
376
|
+
self._writer.end('suite')
|
|
377
|
+
|
|
378
|
+
def start_statistics(self, stats):
|
|
379
|
+
self._writer.start('statistics')
|
|
380
|
+
|
|
381
|
+
def end_statistics(self, stats):
|
|
382
|
+
self._writer.end('statistics')
|
|
383
|
+
|
|
384
|
+
def start_total_statistics(self, total_stats):
|
|
385
|
+
self._writer.start('total')
|
|
386
|
+
|
|
387
|
+
def end_total_statistics(self, total_stats):
|
|
388
|
+
self._writer.end('total')
|
|
389
|
+
|
|
390
|
+
def start_tag_statistics(self, tag_stats):
|
|
391
|
+
self._writer.start('tag')
|
|
392
|
+
|
|
393
|
+
def end_tag_statistics(self, tag_stats):
|
|
394
|
+
self._writer.end('tag')
|
|
395
|
+
|
|
396
|
+
def start_suite_statistics(self, tag_stats):
|
|
397
|
+
self._writer.start('suite')
|
|
398
|
+
|
|
399
|
+
def end_suite_statistics(self, tag_stats):
|
|
400
|
+
self._writer.end('suite')
|
|
401
|
+
|
|
402
|
+
def visit_stat(self, stat):
|
|
403
|
+
self._writer.element('stat', stat.name,
|
|
404
|
+
stat.get_attributes(values_as_strings=True))
|
|
405
|
+
|
|
406
|
+
def start_errors(self, errors=None):
|
|
407
|
+
self._writer.start('errors')
|
|
408
|
+
|
|
409
|
+
def end_errors(self, errors=None):
|
|
410
|
+
self._writer.end('errors')
|
|
411
|
+
|
|
412
|
+
def _write_list(self, tag, items):
|
|
413
|
+
for item in items:
|
|
414
|
+
self._writer.element(tag, item)
|
|
415
|
+
|
|
416
|
+
def _write_status(self, item):
|
|
417
|
+
attrs = {'status': item.status,
|
|
418
|
+
'start': item.start_time.isoformat() if item.start_time else None,
|
|
419
|
+
'elapsed': format(item.elapsed_time.total_seconds(), 'f')}
|
|
420
|
+
self._writer.element('status', item.message, attrs)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
class LegacyXmlLogger(XmlLogger):
|
|
424
|
+
|
|
425
|
+
def _get_start_attrs(self, rpa, generator):
|
|
426
|
+
return {'generator': get_full_version(generator),
|
|
427
|
+
'generated': self._datetime_to_timestamp(datetime.now()),
|
|
428
|
+
'rpa': 'true' if rpa else 'false',
|
|
429
|
+
'schemaversion': '4'}
|
|
430
|
+
|
|
431
|
+
def _datetime_to_timestamp(self, dt):
|
|
432
|
+
return dt.isoformat(' ', timespec='milliseconds').replace('-', '')
|
|
433
|
+
|
|
434
|
+
def _get_start_keyword_attrs(self, kw):
|
|
435
|
+
attrs = {'name': kw.kwname, 'library': kw.libname}
|
|
436
|
+
if kw.type != 'KEYWORD':
|
|
437
|
+
attrs['type'] = kw.type
|
|
438
|
+
if kw.source_name:
|
|
439
|
+
attrs['sourcename'] = kw.source_name
|
|
440
|
+
return attrs
|
|
441
|
+
|
|
442
|
+
def _write_status(self, item):
|
|
443
|
+
attrs = {'status': item.status,
|
|
444
|
+
'starttime': self._datetime_to_timestamp(item.start_time),
|
|
445
|
+
'endtime': self._datetime_to_timestamp(item.end_time)}
|
|
446
|
+
if (isinstance(item, (TestSuite, TestCase))
|
|
447
|
+
or isinstance(item, Keyword) and item.type == 'TEARDOWN'):
|
|
448
|
+
message = item.message
|
|
449
|
+
else:
|
|
450
|
+
message = ''
|
|
451
|
+
self._writer.element('status', message, attrs)
|
|
452
|
+
|
|
453
|
+
def _write_message(self, msg):
|
|
454
|
+
ts = self._datetime_to_timestamp(msg.timestamp) if msg.timestamp else None
|
|
455
|
+
attrs = {'timestamp': ts, 'level': msg.level}
|
|
456
|
+
if msg.html:
|
|
457
|
+
attrs['html'] = 'true'
|
|
458
|
+
# Use `_xml_writer`, not `_writer` to write messages also when flattening.
|
|
459
|
+
self._xml_writer.element('msg', msg.message, attrs)
|