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,90 @@
|
|
|
1
|
+
# Copyright 2008-2015 Nokia Networks
|
|
2
|
+
# Copyright 2016- Robot Framework Foundation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import sys
|
|
17
|
+
|
|
18
|
+
from robot.model import SuiteVisitor
|
|
19
|
+
from robot.result import TestCase, TestSuite
|
|
20
|
+
from robot.utils import plural_or_not as s, secs_to_timestr
|
|
21
|
+
|
|
22
|
+
from .highlighting import HighlightingStream
|
|
23
|
+
from ..loggerapi import LoggerApi
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DottedOutput(LoggerApi):
|
|
27
|
+
|
|
28
|
+
def __init__(self, width=78, colors='AUTO', stdout=None, stderr=None):
|
|
29
|
+
self.width = width
|
|
30
|
+
self.stdout = HighlightingStream(stdout or sys.__stdout__, colors)
|
|
31
|
+
self.stderr = HighlightingStream(stderr or sys.__stderr__, colors)
|
|
32
|
+
self.markers_on_row = 0
|
|
33
|
+
|
|
34
|
+
def start_suite(self, data, result):
|
|
35
|
+
if not data.parent:
|
|
36
|
+
count = data.test_count
|
|
37
|
+
ts = ('test' if not data.rpa else 'task') + s(count)
|
|
38
|
+
self.stdout.write(f"Running suite '{result.name}' with {count} {ts}.\n")
|
|
39
|
+
self.stdout.write('=' * self.width + '\n')
|
|
40
|
+
|
|
41
|
+
def end_test(self, data, result):
|
|
42
|
+
if self.markers_on_row == self.width:
|
|
43
|
+
self.stdout.write('\n')
|
|
44
|
+
self.markers_on_row = 0
|
|
45
|
+
self.markers_on_row += 1
|
|
46
|
+
if result.passed:
|
|
47
|
+
self.stdout.write('.')
|
|
48
|
+
elif result.skipped:
|
|
49
|
+
self.stdout.highlight('s', 'SKIP')
|
|
50
|
+
elif result.tags.robot('exit'):
|
|
51
|
+
self.stdout.write('x')
|
|
52
|
+
else:
|
|
53
|
+
self.stdout.highlight('F', 'FAIL')
|
|
54
|
+
|
|
55
|
+
def end_suite(self, data, result):
|
|
56
|
+
if not data.parent:
|
|
57
|
+
self.stdout.write('\n')
|
|
58
|
+
StatusReporter(self.stdout, self.width).report(result)
|
|
59
|
+
self.stdout.write('\n')
|
|
60
|
+
|
|
61
|
+
def message(self, msg):
|
|
62
|
+
if msg.level in ('WARN', 'ERROR'):
|
|
63
|
+
self.stderr.error(msg.message, msg.level)
|
|
64
|
+
|
|
65
|
+
def result_file(self, kind, path):
|
|
66
|
+
self.stdout.write(f"{kind+':':8} {path}\n")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class StatusReporter(SuiteVisitor):
|
|
70
|
+
|
|
71
|
+
def __init__(self, stream, width):
|
|
72
|
+
self.stream = stream
|
|
73
|
+
self.width = width
|
|
74
|
+
|
|
75
|
+
def report(self, suite: TestSuite):
|
|
76
|
+
suite.visit(self)
|
|
77
|
+
stats = suite.statistics
|
|
78
|
+
ts = ('test' if not suite.rpa else 'task') + s(stats.total)
|
|
79
|
+
elapsed = secs_to_timestr(suite.elapsed_time)
|
|
80
|
+
self.stream.write(f"{'=' * self.width}\nRun suite '{suite.name}' with "
|
|
81
|
+
f"{stats.total} {ts} in {elapsed}.\n\n")
|
|
82
|
+
ed = 'ED' if suite.status != 'SKIP' else 'PED'
|
|
83
|
+
self.stream.highlight(suite.status + ed, suite.status)
|
|
84
|
+
self.stream.write(f'\n{stats.message}\n')
|
|
85
|
+
|
|
86
|
+
def visit_test(self, test: TestCase):
|
|
87
|
+
if test.failed and not test.tags.robot('exit'):
|
|
88
|
+
self.stream.write('-' * self.width + '\n')
|
|
89
|
+
self.stream.highlight('FAIL')
|
|
90
|
+
self.stream.write(f': {test.full_name}\n{test.message.strip()}\n')
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
import sys
|
|
17
17
|
|
|
18
18
|
from .highlighting import HighlightingStream
|
|
19
|
+
from ..loggerapi import LoggerApi
|
|
19
20
|
|
|
20
21
|
|
|
21
|
-
class QuietOutput:
|
|
22
|
+
class QuietOutput(LoggerApi):
|
|
22
23
|
|
|
23
24
|
def __init__(self, colors='AUTO', stderr=None):
|
|
24
25
|
self._stderr = HighlightingStream(stderr or sys.__stderr__, colors)
|
|
@@ -28,5 +29,5 @@ class QuietOutput:
|
|
|
28
29
|
self._stderr.error(msg.message, msg.level)
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
class NoOutput:
|
|
32
|
+
class NoOutput(LoggerApi):
|
|
32
33
|
pass
|
|
@@ -16,58 +16,58 @@
|
|
|
16
16
|
import sys
|
|
17
17
|
|
|
18
18
|
from robot.errors import DataError
|
|
19
|
-
from robot.utils import
|
|
20
|
-
pad_console_length)
|
|
19
|
+
from robot.utils import get_console_length, getshortdoc, isatty, pad_console_length
|
|
21
20
|
|
|
22
21
|
from .highlighting import HighlightingStream
|
|
22
|
+
from ..loggerapi import LoggerApi
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class VerboseOutput:
|
|
25
|
+
class VerboseOutput(LoggerApi):
|
|
26
26
|
|
|
27
27
|
def __init__(self, width=78, colors='AUTO', markers='AUTO', stdout=None,
|
|
28
28
|
stderr=None):
|
|
29
|
-
self.
|
|
30
|
-
self.
|
|
31
|
-
self.
|
|
32
|
-
self.
|
|
33
|
-
|
|
34
|
-
def start_suite(self,
|
|
35
|
-
if not self.
|
|
36
|
-
self.
|
|
37
|
-
self.
|
|
38
|
-
self.
|
|
39
|
-
self.
|
|
40
|
-
|
|
41
|
-
def end_suite(self,
|
|
42
|
-
self.
|
|
43
|
-
self.
|
|
44
|
-
self.
|
|
45
|
-
self.
|
|
46
|
-
|
|
47
|
-
def start_test(self,
|
|
48
|
-
self.
|
|
49
|
-
self.
|
|
50
|
-
|
|
51
|
-
def end_test(self,
|
|
52
|
-
self.
|
|
53
|
-
self.
|
|
54
|
-
self.
|
|
55
|
-
self.
|
|
56
|
-
|
|
57
|
-
def
|
|
58
|
-
self.
|
|
59
|
-
|
|
60
|
-
def
|
|
61
|
-
self.
|
|
62
|
-
if self.
|
|
63
|
-
self.
|
|
29
|
+
self.writer = VerboseWriter(width, colors, markers, stdout, stderr)
|
|
30
|
+
self.started = False
|
|
31
|
+
self.started_keywords = 0
|
|
32
|
+
self.running_test = False
|
|
33
|
+
|
|
34
|
+
def start_suite(self, data, result):
|
|
35
|
+
if not self.started:
|
|
36
|
+
self.writer.suite_separator()
|
|
37
|
+
self.started = True
|
|
38
|
+
self.writer.info(data.full_name, result.doc, start_suite=True)
|
|
39
|
+
self.writer.suite_separator()
|
|
40
|
+
|
|
41
|
+
def end_suite(self, data, result):
|
|
42
|
+
self.writer.info(data.full_name, result.doc)
|
|
43
|
+
self.writer.status(result.status)
|
|
44
|
+
self.writer.message(result.full_message)
|
|
45
|
+
self.writer.suite_separator()
|
|
46
|
+
|
|
47
|
+
def start_test(self, data, result):
|
|
48
|
+
self.writer.info(result.name, result.doc)
|
|
49
|
+
self.running_test = True
|
|
50
|
+
|
|
51
|
+
def end_test(self, data, result):
|
|
52
|
+
self.writer.status(result.status, clear=True)
|
|
53
|
+
self.writer.message(result.message)
|
|
54
|
+
self.writer.test_separator()
|
|
55
|
+
self.running_test = False
|
|
56
|
+
|
|
57
|
+
def start_body_item(self, data, result):
|
|
58
|
+
self.started_keywords += 1
|
|
59
|
+
|
|
60
|
+
def end_body_item(self, data, result):
|
|
61
|
+
self.started_keywords -= 1
|
|
62
|
+
if self.running_test and not self.started_keywords:
|
|
63
|
+
self.writer.keyword_marker(result.status)
|
|
64
64
|
|
|
65
65
|
def message(self, msg):
|
|
66
66
|
if msg.level in ('WARN', 'ERROR'):
|
|
67
|
-
self.
|
|
67
|
+
self.writer.error(msg.message, msg.level, clear=self.running_test)
|
|
68
68
|
|
|
69
|
-
def
|
|
70
|
-
self.
|
|
69
|
+
def result_file(self, kind, path):
|
|
70
|
+
self.writer.output(kind, path)
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
class VerboseWriter:
|
|
@@ -75,10 +75,10 @@ class VerboseWriter:
|
|
|
75
75
|
|
|
76
76
|
def __init__(self, width=78, colors='AUTO', markers='AUTO', stdout=None,
|
|
77
77
|
stderr=None):
|
|
78
|
-
self.
|
|
79
|
-
self.
|
|
80
|
-
self.
|
|
81
|
-
self._keyword_marker = KeywordMarker(self.
|
|
78
|
+
self.width = width
|
|
79
|
+
self.stdout = HighlightingStream(stdout or sys.__stdout__, colors)
|
|
80
|
+
self.stderr = HighlightingStream(stderr or sys.__stderr__, colors)
|
|
81
|
+
self._keyword_marker = KeywordMarker(self.stdout, markers)
|
|
82
82
|
self._last_info = None
|
|
83
83
|
|
|
84
84
|
def info(self, name, doc, start_suite=False):
|
|
@@ -88,18 +88,18 @@ class VerboseWriter:
|
|
|
88
88
|
self._keyword_marker.reset_count()
|
|
89
89
|
|
|
90
90
|
def _write_info(self):
|
|
91
|
-
self.
|
|
91
|
+
self.stdout.write(self._last_info)
|
|
92
92
|
|
|
93
93
|
def _get_info_width_and_separator(self, start_suite):
|
|
94
94
|
if start_suite:
|
|
95
|
-
return self.
|
|
96
|
-
return self.
|
|
95
|
+
return self.width, '\n'
|
|
96
|
+
return self.width - self._status_length - 1, ' '
|
|
97
97
|
|
|
98
98
|
def _get_info(self, name, doc, width):
|
|
99
99
|
if get_console_length(name) > width:
|
|
100
100
|
return pad_console_length(name, width)
|
|
101
101
|
doc = getshortdoc(doc, linesep=' ')
|
|
102
|
-
info = '
|
|
102
|
+
info = f'{name} :: {doc}' if doc else name
|
|
103
103
|
return pad_console_length(info, width)
|
|
104
104
|
|
|
105
105
|
def suite_separator(self):
|
|
@@ -109,14 +109,14 @@ class VerboseWriter:
|
|
|
109
109
|
self._fill('-')
|
|
110
110
|
|
|
111
111
|
def _fill(self, char):
|
|
112
|
-
self.
|
|
112
|
+
self.stdout.write(f'{char * self.width}\n')
|
|
113
113
|
|
|
114
114
|
def status(self, status, clear=False):
|
|
115
115
|
if self._should_clear_markers(clear):
|
|
116
116
|
self._clear_status()
|
|
117
|
-
self.
|
|
118
|
-
self.
|
|
119
|
-
self.
|
|
117
|
+
self.stdout.write('| ', flush=False)
|
|
118
|
+
self.stdout.highlight(status, flush=False)
|
|
119
|
+
self.stdout.write(' |\n')
|
|
120
120
|
|
|
121
121
|
def _should_clear_markers(self, clear):
|
|
122
122
|
return clear and self._keyword_marker.marking_enabled
|
|
@@ -126,12 +126,12 @@ class VerboseWriter:
|
|
|
126
126
|
self._write_info()
|
|
127
127
|
|
|
128
128
|
def _clear_info(self):
|
|
129
|
-
self.
|
|
129
|
+
self.stdout.write(f"\r{' ' * self.width}\r")
|
|
130
130
|
self._keyword_marker.reset_count()
|
|
131
131
|
|
|
132
132
|
def message(self, message):
|
|
133
133
|
if message:
|
|
134
|
-
self.
|
|
134
|
+
self.stdout.write(message.strip() + '\n')
|
|
135
135
|
|
|
136
136
|
def keyword_marker(self, status):
|
|
137
137
|
if self._keyword_marker.marker_count == self._status_length:
|
|
@@ -142,18 +142,18 @@ class VerboseWriter:
|
|
|
142
142
|
def error(self, message, level, clear=False):
|
|
143
143
|
if self._should_clear_markers(clear):
|
|
144
144
|
self._clear_info()
|
|
145
|
-
self.
|
|
145
|
+
self.stderr.error(message, level)
|
|
146
146
|
if self._should_clear_markers(clear):
|
|
147
147
|
self._write_info()
|
|
148
148
|
|
|
149
149
|
def output(self, name, path):
|
|
150
|
-
self.
|
|
150
|
+
self.stdout.write(f"{name+':':8} {path}\n")
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
class KeywordMarker:
|
|
154
154
|
|
|
155
155
|
def __init__(self, highlighter, markers):
|
|
156
|
-
self.
|
|
156
|
+
self.highlighter = highlighter
|
|
157
157
|
self.marking_enabled = self._marking_enabled(markers, highlighter)
|
|
158
158
|
self.marker_count = 0
|
|
159
159
|
|
|
@@ -164,13 +164,13 @@ class KeywordMarker:
|
|
|
164
164
|
try:
|
|
165
165
|
return options[markers.upper()]
|
|
166
166
|
except KeyError:
|
|
167
|
-
raise DataError("Invalid console marker value '
|
|
168
|
-
"'AUTO', 'ON' and 'OFF'."
|
|
167
|
+
raise DataError(f"Invalid console marker value '{markers}'. "
|
|
168
|
+
f"Available 'AUTO', 'ON' and 'OFF'.")
|
|
169
169
|
|
|
170
170
|
def mark(self, status):
|
|
171
171
|
if self.marking_enabled:
|
|
172
172
|
marker, status = ('.', 'PASS') if status != 'FAIL' else ('F', 'FAIL')
|
|
173
|
-
self.
|
|
173
|
+
self.highlighter.highlight(marker, status)
|
|
174
174
|
self.marker_count += 1
|
|
175
175
|
|
|
176
176
|
def reset_count(self):
|
|
@@ -13,10 +13,13 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
16
18
|
from robot.errors import DataError
|
|
17
|
-
from robot.utils import
|
|
19
|
+
from robot.utils import file_writer, seq2str2
|
|
18
20
|
|
|
19
21
|
from .logger import LOGGER
|
|
22
|
+
from .loggerapi import LoggerApi
|
|
20
23
|
from .loggerhelper import IsLogged
|
|
21
24
|
|
|
22
25
|
|
|
@@ -34,7 +37,7 @@ def DebugFile(path):
|
|
|
34
37
|
return _DebugFileWriter(outfile)
|
|
35
38
|
|
|
36
39
|
|
|
37
|
-
class _DebugFileWriter:
|
|
40
|
+
class _DebugFileWriter(LoggerApi):
|
|
38
41
|
_separators = {'SUITE': '=', 'TEST': '-', 'KEYWORD': '~'}
|
|
39
42
|
|
|
40
43
|
def __init__(self, outfile):
|
|
@@ -44,64 +47,76 @@ class _DebugFileWriter:
|
|
|
44
47
|
self._outfile = outfile
|
|
45
48
|
self._is_logged = IsLogged('DEBUG')
|
|
46
49
|
|
|
47
|
-
def start_suite(self,
|
|
50
|
+
def start_suite(self, data, result):
|
|
48
51
|
self._separator('SUITE')
|
|
49
|
-
self._start('SUITE',
|
|
52
|
+
self._start('SUITE', data.full_name, result.start_time)
|
|
50
53
|
self._separator('SUITE')
|
|
51
54
|
|
|
52
|
-
def end_suite(self,
|
|
55
|
+
def end_suite(self, data, result):
|
|
53
56
|
self._separator('SUITE')
|
|
54
|
-
self._end('SUITE',
|
|
57
|
+
self._end('SUITE', data.full_name, result.end_time, result.elapsed_time)
|
|
55
58
|
self._separator('SUITE')
|
|
56
59
|
if self._indent == 0:
|
|
57
|
-
LOGGER.
|
|
60
|
+
LOGGER.debug_file(Path(self._outfile.name))
|
|
58
61
|
self.close()
|
|
59
62
|
|
|
60
|
-
def start_test(self,
|
|
63
|
+
def start_test(self, data, result):
|
|
61
64
|
self._separator('TEST')
|
|
62
|
-
self._start('TEST',
|
|
65
|
+
self._start('TEST', result.name, result.start_time)
|
|
63
66
|
self._separator('TEST')
|
|
64
67
|
|
|
65
|
-
def end_test(self,
|
|
68
|
+
def end_test(self, data, result):
|
|
66
69
|
self._separator('TEST')
|
|
67
|
-
self._end('TEST',
|
|
70
|
+
self._end('TEST', result.name, result.end_time, result.elapsed_time)
|
|
68
71
|
self._separator('TEST')
|
|
69
72
|
|
|
70
|
-
def start_keyword(self,
|
|
73
|
+
def start_keyword(self, data, result):
|
|
74
|
+
if self._kw_level == 0:
|
|
75
|
+
self._separator('KEYWORD')
|
|
76
|
+
self._start(result.type, result.full_name, result.start_time, seq2str2(result.args))
|
|
77
|
+
self._kw_level += 1
|
|
78
|
+
|
|
79
|
+
def end_keyword(self, data, result):
|
|
80
|
+
self._end(result.type, result.full_name, result.end_time, result.elapsed_time)
|
|
81
|
+
self._kw_level -= 1
|
|
82
|
+
|
|
83
|
+
def start_body_item(self, data, result):
|
|
71
84
|
if self._kw_level == 0:
|
|
72
85
|
self._separator('KEYWORD')
|
|
73
|
-
self._start(
|
|
86
|
+
self._start(result.type, result._log_name, result.start_time)
|
|
74
87
|
self._kw_level += 1
|
|
75
88
|
|
|
76
|
-
def
|
|
77
|
-
self._end(
|
|
89
|
+
def end_body_item(self, data, result):
|
|
90
|
+
self._end(result.type, result._log_name, result.end_time, result.elapsed_time)
|
|
78
91
|
self._kw_level -= 1
|
|
79
92
|
|
|
80
93
|
def log_message(self, msg):
|
|
81
94
|
if self._is_logged(msg.level):
|
|
82
|
-
self._write(msg.
|
|
95
|
+
self._write(f'{msg.timestamp} - {msg.level} - {msg.message}')
|
|
83
96
|
|
|
84
97
|
def close(self):
|
|
85
98
|
if not self._outfile.closed:
|
|
86
99
|
self._outfile.close()
|
|
87
100
|
|
|
88
|
-
def _start(self,
|
|
89
|
-
|
|
90
|
-
|
|
101
|
+
def _start(self, type, name, timestamp, extra=''):
|
|
102
|
+
if extra:
|
|
103
|
+
extra = f' {extra}'
|
|
104
|
+
indent = '-' * self._indent
|
|
105
|
+
self._write(f'{timestamp} - INFO - +{indent} START {type}: {name}{extra}')
|
|
91
106
|
self._indent += 1
|
|
92
107
|
|
|
93
|
-
def _end(self,
|
|
108
|
+
def _end(self, type, name, timestamp, elapsed):
|
|
94
109
|
self._indent -= 1
|
|
95
|
-
|
|
110
|
+
indent = '-' * self._indent
|
|
111
|
+
elapsed = elapsed.total_seconds()
|
|
112
|
+
self._write(f'{timestamp} - INFO - +{indent} END {type}: {name} ({elapsed} s)')
|
|
96
113
|
|
|
97
114
|
def _separator(self, type_):
|
|
98
115
|
self._write(self._separators[type_] * 78, separator=True)
|
|
99
116
|
|
|
100
|
-
def _write(self, text, separator=False
|
|
117
|
+
def _write(self, text, separator=False):
|
|
101
118
|
if separator and self._separator_written_last:
|
|
102
119
|
return
|
|
103
|
-
if not separator:
|
|
104
|
-
text = '%s - %s - %s' % (timestamp or get_timestamp(), level, text)
|
|
105
120
|
self._outfile.write(text.rstrip() + '\n')
|
|
106
121
|
self._outfile.flush()
|
|
107
122
|
self._separator_written_last = separator
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
from robot.utils import file_writer
|
|
17
17
|
|
|
18
18
|
from .loggerhelper import AbstractLogger
|
|
19
|
+
from .loggerapi import LoggerApi
|
|
19
20
|
|
|
20
21
|
|
|
21
|
-
class FileLogger(AbstractLogger):
|
|
22
|
+
class FileLogger(AbstractLogger, LoggerApi):
|
|
22
23
|
|
|
23
24
|
def __init__(self, path, level):
|
|
24
25
|
super().__init__(level)
|
|
@@ -33,26 +34,28 @@ class FileLogger(AbstractLogger):
|
|
|
33
34
|
msg.message)
|
|
34
35
|
self._writer.write(entry)
|
|
35
36
|
|
|
36
|
-
def start_suite(self,
|
|
37
|
-
self.info("Started suite '%s'." %
|
|
37
|
+
def start_suite(self, data, result):
|
|
38
|
+
self.info("Started suite '%s'." % result.name)
|
|
38
39
|
|
|
39
|
-
def end_suite(self,
|
|
40
|
-
self.info("Ended suite '%s'." %
|
|
40
|
+
def end_suite(self, data, result):
|
|
41
|
+
self.info("Ended suite '%s'." % result.name)
|
|
41
42
|
|
|
42
|
-
def start_test(self,
|
|
43
|
-
self.info("Started test '%s'." %
|
|
43
|
+
def start_test(self, data, result):
|
|
44
|
+
self.info("Started test '%s'." % result.name)
|
|
44
45
|
|
|
45
|
-
def end_test(self,
|
|
46
|
-
self.info("Ended test '%s'." %
|
|
46
|
+
def end_test(self, data, result):
|
|
47
|
+
self.info("Ended test '%s'." % result.name)
|
|
47
48
|
|
|
48
|
-
def
|
|
49
|
-
self.debug(lambda: "Started keyword '%s'." %
|
|
49
|
+
def start_body_item(self, data, result):
|
|
50
|
+
self.debug(lambda: "Started keyword '%s'." % result.name
|
|
51
|
+
if result.type in result.KEYWORD_TYPES else result._log_name)
|
|
50
52
|
|
|
51
|
-
def
|
|
52
|
-
self.debug(lambda: "Ended keyword '%s'." %
|
|
53
|
+
def end_body_item(self, data, result):
|
|
54
|
+
self.debug(lambda: "Ended keyword '%s'." % result.name
|
|
55
|
+
if result.type in result.KEYWORD_TYPES else result._log_name)
|
|
53
56
|
|
|
54
|
-
def
|
|
55
|
-
self.info('%s: %s' % (
|
|
57
|
+
def result_file(self, kind, path):
|
|
58
|
+
self.info('%s: %s' % (kind, path))
|
|
56
59
|
|
|
57
60
|
def close(self):
|
|
58
61
|
self._writer.close()
|
|
@@ -20,6 +20,7 @@ here to avoid cyclic imports.
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
import threading
|
|
23
|
+
from typing import Callable
|
|
23
24
|
|
|
24
25
|
from .logger import LOGGER
|
|
25
26
|
from .loggerhelper import Message, write_to_console
|
|
@@ -28,7 +29,7 @@ from .loggerhelper import Message, write_to_console
|
|
|
28
29
|
LOGGING_THREADS = ('MainThread', 'RobotFrameworkTimeoutThread')
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
def write(msg, level, html=False):
|
|
32
|
+
def write(msg: 'str | Callable[[], str]', level: str, html: bool = False):
|
|
32
33
|
# Callable messages allow lazy logging internally, but we don't want to
|
|
33
34
|
# expose this functionality publicly. See the following issue for details:
|
|
34
35
|
# https://github.com/robotframework/robotframework/issues/1505
|
|
@@ -66,5 +67,5 @@ def error(msg, html=False):
|
|
|
66
67
|
write(msg, 'ERROR', html)
|
|
67
68
|
|
|
68
69
|
|
|
69
|
-
def console(msg, newline=True, stream='stdout'):
|
|
70
|
+
def console(msg: str, newline: bool = True, stream: str = 'stdout'):
|
|
70
71
|
write_to_console(msg, newline, stream)
|