robotframework 7.0.1rc2__zip → 7.1rc1__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.
Files changed (280) hide show
  1. {robotframework-7.0.1rc2/src/robotframework.egg-info → robotframework-7.1rc1}/PKG-INFO +3 -2
  2. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/setup.py +2 -1
  3. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/interfaces.py +32 -0
  4. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/languages.py +73 -18
  5. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/settings.py +1 -1
  6. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/model.js +22 -33
  7. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/jsonbuilder.py +1 -1
  8. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/BuiltIn.py +16 -3
  9. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/DateTime.py +3 -2
  10. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Dialogs.py +12 -4
  11. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/OperatingSystem.py +4 -4
  12. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Process.py +7 -3
  13. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/String.py +4 -1
  14. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/dialogs_py.py +17 -1
  15. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/modelobject.py +1 -6
  16. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/dotted.py +1 -1
  17. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/highlighting.py +69 -56
  18. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/verbose.py +3 -3
  19. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/listeners.py +61 -217
  20. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/logger.py +30 -14
  21. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/loggerapi.py +11 -0
  22. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/loggerhelper.py +6 -1
  23. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/output.py +2 -1
  24. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/statements.py +1 -1
  25. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/executionresult.py +1 -0
  26. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/model.py +1 -1
  27. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/resultbuilder.py +12 -11
  28. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/xmlelementhandlers.py +12 -0
  29. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/__init__.py +1 -1
  30. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentresolver.py +15 -11
  31. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentspec.py +2 -2
  32. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentvalidator.py +0 -8
  33. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/embedded.py +2 -2
  34. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/invalidkeyword.py +4 -1
  35. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/keywordimplementation.py +9 -5
  36. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/librarykeyword.py +19 -9
  37. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/librarykeywordrunner.py +25 -19
  38. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/model.py +45 -26
  39. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/namespace.py +20 -26
  40. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/resourcemodel.py +9 -1
  41. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/statusreporter.py +9 -4
  42. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/testlibraries.py +2 -2
  43. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/userkeywordrunner.py +10 -7
  44. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/encodingsniffer.py +3 -1
  45. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robottime.py +5 -3
  46. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/evaluation.py +1 -4
  47. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/tablesetter.py +17 -20
  48. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/version.py +1 -1
  49. {robotframework-7.0.1rc2 → robotframework-7.1rc1/src/robotframework.egg-info}/PKG-INFO +3 -2
  50. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/AUTHORS.rst +0 -0
  51. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/BUILD.rst +0 -0
  52. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/CONTRIBUTING.rst +0 -0
  53. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/COPYRIGHT.txt +0 -0
  54. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/INSTALL.rst +0 -0
  55. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/LICENSE.txt +0 -0
  56. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/MANIFEST.in +0 -0
  57. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/README.rst +0 -0
  58. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/setup.cfg +0 -0
  59. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/__init__.py +0 -0
  60. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/__main__.py +0 -0
  61. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/__init__.py +0 -0
  62. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/deco.py +0 -0
  63. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/exceptions.py +0 -0
  64. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/logger.py +0 -0
  65. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/parsing.py +0 -0
  66. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/py.typed +0 -0
  67. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/__init__.py +0 -0
  68. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/gatherfailed.py +0 -0
  69. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/errors.py +0 -0
  70. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/__init__.py +0 -0
  71. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/__init__.py +0 -0
  72. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/js_disabled.css +0 -0
  73. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/storage.js +0 -0
  74. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  75. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/jsonwriter.py +0 -0
  76. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/__init__.py +0 -0
  77. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  78. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  79. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  80. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  81. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  82. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  83. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  84. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  85. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  86. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/print.css +0 -0
  87. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  88. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/__init__.py +0 -0
  89. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/common.css +0 -0
  90. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  91. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  92. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.css +0 -0
  93. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.html +0 -0
  94. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.js +0 -0
  95. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/print.css +0 -0
  96. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/report.css +0 -0
  97. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/report.html +0 -0
  98. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/testdata.js +0 -0
  99. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/util.js +0 -0
  100. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/view.js +0 -0
  101. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/template.py +0 -0
  102. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  103. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  104. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  105. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdoc.py +0 -0
  106. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/__init__.py +0 -0
  107. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/builder.py +0 -0
  108. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  109. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/datatypes.py +0 -0
  110. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/htmlutils.py +0 -0
  111. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  112. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  113. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/model.py +0 -0
  114. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/output.py +0 -0
  115. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/robotbuilder.py +0 -0
  116. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/standardtypes.py +0 -0
  117. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/writer.py +0 -0
  118. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  119. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/xmlwriter.py +0 -0
  120. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Collections.py +0 -0
  121. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Easter.py +0 -0
  122. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Remote.py +0 -0
  123. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Screenshot.py +0 -0
  124. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Telnet.py +0 -0
  125. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/XML.py +0 -0
  126. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/__init__.py +0 -0
  127. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/__init__.py +0 -0
  128. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/body.py +0 -0
  129. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/configurer.py +0 -0
  130. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/control.py +0 -0
  131. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/filter.py +0 -0
  132. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/fixture.py +0 -0
  133. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/itemlist.py +0 -0
  134. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/keyword.py +0 -0
  135. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/message.py +0 -0
  136. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/metadata.py +0 -0
  137. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/modifier.py +0 -0
  138. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/namepatterns.py +0 -0
  139. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/statistics.py +0 -0
  140. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/stats.py +0 -0
  141. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/suitestatistics.py +0 -0
  142. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tags.py +0 -0
  143. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tagsetter.py +0 -0
  144. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tagstatistics.py +0 -0
  145. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/testcase.py +0 -0
  146. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/testsuite.py +0 -0
  147. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/totalstatistics.py +0 -0
  148. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/visitor.py +0 -0
  149. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/__init__.py +0 -0
  150. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/__init__.py +0 -0
  151. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/quiet.py +0 -0
  152. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/debugfile.py +0 -0
  153. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/filelogger.py +0 -0
  154. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/librarylogger.py +0 -0
  155. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/pyloggingconf.py +0 -0
  156. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/stdoutlogsplitter.py +0 -0
  157. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/xmllogger.py +0 -0
  158. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/__init__.py +0 -0
  159. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/__init__.py +0 -0
  160. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/blocklexers.py +0 -0
  161. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/context.py +0 -0
  162. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/lexer.py +0 -0
  163. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/settings.py +0 -0
  164. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/statementlexers.py +0 -0
  165. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  166. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/tokens.py +0 -0
  167. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/__init__.py +0 -0
  168. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/blocks.py +0 -0
  169. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/visitor.py +0 -0
  170. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/__init__.py +0 -0
  171. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/blockparsers.py +0 -0
  172. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/fileparser.py +0 -0
  173. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/parser.py +0 -0
  174. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/suitestructure.py +0 -0
  175. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/pythonpathsetter.py +0 -0
  176. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/rebot.py +0 -0
  177. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/__init__.py +0 -0
  178. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  179. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsbuildingcontext.py +0 -0
  180. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsexecutionresult.py +0 -0
  181. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsmodelbuilders.py +0 -0
  182. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jswriter.py +0 -0
  183. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/logreportwriters.py +0 -0
  184. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/outputwriter.py +0 -0
  185. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/resultwriter.py +0 -0
  186. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/stringcache.py +0 -0
  187. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/xunitwriter.py +0 -0
  188. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/__init__.py +0 -0
  189. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/configurer.py +0 -0
  190. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/executionerrors.py +0 -0
  191. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/flattenkeywordmatcher.py +0 -0
  192. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/keywordremover.py +0 -0
  193. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/merger.py +0 -0
  194. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/messagefilter.py +0 -0
  195. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/modeldeprecation.py +0 -0
  196. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/suiteteardownfailed.py +0 -0
  197. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/visitor.py +0 -0
  198. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/run.py +0 -0
  199. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/__init__.py +0 -0
  200. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentconverter.py +0 -0
  201. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentmapper.py +0 -0
  202. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentparser.py +0 -0
  203. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/customconverters.py +0 -0
  204. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeconverters.py +0 -0
  205. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeinfo.py +0 -0
  206. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeinfoparser.py +0 -0
  207. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typevalidator.py +0 -0
  208. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/bodyrunner.py +0 -0
  209. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/__init__.py +0 -0
  210. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/builders.py +0 -0
  211. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/parsers.py +0 -0
  212. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/settings.py +0 -0
  213. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/transformers.py +0 -0
  214. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/context.py +0 -0
  215. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/dynamicmethods.py +0 -0
  216. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/importer.py +0 -0
  217. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/keywordfinder.py +0 -0
  218. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/libraryscopes.py +0 -0
  219. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/outputcapture.py +0 -0
  220. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/randomizer.py +0 -0
  221. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/runkwregister.py +0 -0
  222. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/signalhandler.py +0 -0
  223. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/status.py +0 -0
  224. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/suiterunner.py +0 -0
  225. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/__init__.py +0 -0
  226. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/nosupport.py +0 -0
  227. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/posix.py +0 -0
  228. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/windows.py +0 -0
  229. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/testdoc.py +0 -0
  230. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/__init__.py +0 -0
  231. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/application.py +0 -0
  232. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/argumentparser.py +0 -0
  233. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/asserts.py +0 -0
  234. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/charwidth.py +0 -0
  235. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/compress.py +0 -0
  236. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/connectioncache.py +0 -0
  237. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/dotdict.py +0 -0
  238. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/encoding.py +0 -0
  239. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/error.py +0 -0
  240. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/escaping.py +0 -0
  241. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/etreewrapper.py +0 -0
  242. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/filereader.py +0 -0
  243. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/frange.py +0 -0
  244. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/htmlformatters.py +0 -0
  245. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/importer.py +0 -0
  246. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/markuputils.py +0 -0
  247. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/markupwriters.py +0 -0
  248. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/match.py +0 -0
  249. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/misc.py +0 -0
  250. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/normalizing.py +0 -0
  251. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/notset.py +0 -0
  252. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/platform.py +0 -0
  253. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/recommendations.py +0 -0
  254. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/restreader.py +0 -0
  255. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotenv.py +0 -0
  256. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotinspect.py +0 -0
  257. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotio.py +0 -0
  258. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotpath.py +0 -0
  259. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robottypes.py +0 -0
  260. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/setter.py +0 -0
  261. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/sortable.py +0 -0
  262. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/text.py +0 -0
  263. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/typehints.py +0 -0
  264. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/unic.py +0 -0
  265. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/__init__.py +0 -0
  266. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/assigner.py +0 -0
  267. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/filesetter.py +0 -0
  268. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/finders.py +0 -0
  269. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/notfound.py +0 -0
  270. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/replacer.py +0 -0
  271. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/resolvable.py +0 -0
  272. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/scopes.py +0 -0
  273. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/search.py +0 -0
  274. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/store.py +0 -0
  275. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/variables.py +0 -0
  276. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/SOURCES.txt +0 -0
  277. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  278. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/entry_points.txt +0 -0
  279. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/top_level.txt +0 -0
  280. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/tasks.py +0 -0
@@ -17,14 +17,24 @@
17
17
  # Andre Burgaud, licensed under the MIT License, and available here:
18
18
  # http://www.burgaud.com/bring-colors-to-the-windows-console-with-python/
19
19
 
20
- from contextlib import contextmanager
21
20
  import errno
22
21
  import os
23
22
  import sys
23
+ from contextlib import contextmanager
24
24
  try:
25
- from ctypes import windll, Structure, c_short, c_ushort, byref
25
+ from ctypes import windll
26
26
  except ImportError: # Not on Windows
27
27
  windll = None
28
+ else:
29
+ from ctypes import byref, c_ushort, Structure
30
+ from ctypes.wintypes import _COORD, DWORD, SMALL_RECT
31
+
32
+ class ConsoleScreenBufferInfo(Structure):
33
+ _fields_ = [('dwSize', _COORD),
34
+ ('dwCursorPosition', _COORD),
35
+ ('wAttributes', c_ushort),
36
+ ('srWindow', SMALL_RECT),
37
+ ('dwMaximumWindowSize', _COORD)]
28
38
 
29
39
  from robot.errors import DataError
30
40
  from robot.utils import console_encode, isatty, WINDOWS
@@ -78,18 +88,14 @@ class HighlightingStream:
78
88
  self.stream.flush()
79
89
 
80
90
  def highlight(self, text, status=None, flush=True):
81
- if self._must_flush_before_and_after_highlighting():
91
+ # Must flush before and after highlighting when using Windows APIs to make
92
+ # sure colors only affects the actual highlighted text.
93
+ if isinstance(self._highlighter, DosHighlighter):
82
94
  self.flush()
83
95
  flush = True
84
96
  with self._highlighting(status or text):
85
97
  self.write(text, flush)
86
98
 
87
- def _must_flush_before_and_after_highlighting(self):
88
- # Must flush on Windows before and after highlighting to make sure set
89
- # console colors only affect the actual highlighted text. Problems
90
- # only encountered with Python 3, but better to be safe than sorry.
91
- return WINDOWS and not isinstance(self._highlighter, NoHighlighting)
92
-
93
99
  def error(self, message, level):
94
100
  self.write('[ ', flush=False)
95
101
  self.highlight(level, flush=False)
@@ -109,33 +115,44 @@ class HighlightingStream:
109
115
  finally:
110
116
  highlighter.reset()
111
117
 
118
+ def result_file(self, kind, path):
119
+ path = self._highlighter.link(path)
120
+ self.write(f"{kind + ':':8} {path}\n")
121
+
112
122
 
113
123
  def Highlighter(stream):
114
124
  if os.sep == '/':
115
125
  return AnsiHighlighter(stream)
116
- return DosHighlighter(stream) if windll else NoHighlighting(stream)
126
+ if not windll:
127
+ return NoHighlighting(stream)
128
+ if virtual_terminal_enabled(stream):
129
+ return AnsiHighlighter(stream)
130
+ return DosHighlighter(stream)
117
131
 
118
132
 
119
133
  class AnsiHighlighter:
120
- _ANSI_GREEN = '\033[32m'
121
- _ANSI_RED = '\033[31m'
122
- _ANSI_YELLOW = '\033[33m'
123
- _ANSI_RESET = '\033[0m'
134
+ GREEN = '\033[32m'
135
+ RED = '\033[31m'
136
+ YELLOW = '\033[33m'
137
+ RESET = '\033[0m'
124
138
 
125
139
  def __init__(self, stream):
126
140
  self._stream = stream
127
141
 
128
142
  def green(self):
129
- self._set_color(self._ANSI_GREEN)
143
+ self._set_color(self.GREEN)
130
144
 
131
145
  def red(self):
132
- self._set_color(self._ANSI_RED)
146
+ self._set_color(self.RED)
133
147
 
134
148
  def yellow(self):
135
- self._set_color(self._ANSI_YELLOW)
149
+ self._set_color(self.YELLOW)
136
150
 
137
151
  def reset(self):
138
- self._set_color(self._ANSI_RESET)
152
+ self._set_color(self.RESET)
153
+
154
+ def link(self, path):
155
+ return f'\033]8;;file:///{path}\033\\{path}\033]8;;\033\\'
139
156
 
140
157
  def _set_color(self, color):
141
158
  self._stream.write(color)
@@ -143,71 +160,67 @@ class AnsiHighlighter:
143
160
 
144
161
  class NoHighlighting(AnsiHighlighter):
145
162
 
163
+ def link(self, path):
164
+ return path
165
+
146
166
  def _set_color(self, color):
147
167
  pass
148
168
 
149
169
 
150
170
  class DosHighlighter:
151
- _FOREGROUND_GREEN = 0x2
152
- _FOREGROUND_RED = 0x4
153
- _FOREGROUND_YELLOW = 0x6
154
- _FOREGROUND_GREY = 0x7
155
- _FOREGROUND_INTENSITY = 0x8
156
- _BACKGROUND_MASK = 0xF0
157
- _STDOUT_HANDLE = -11
158
- _STDERR_HANDLE = -12
171
+ FOREGROUND_GREEN = 0x2
172
+ FOREGROUND_RED = 0x4
173
+ FOREGROUND_YELLOW = 0x6
174
+ FOREGROUND_GREY = 0x7
175
+ FOREGROUND_INTENSITY = 0x8
176
+ BACKGROUND_MASK = 0xF0
159
177
 
160
178
  def __init__(self, stream):
161
- self._handle = self._get_std_handle(stream)
179
+ self._handle = get_std_handle(stream)
162
180
  self._orig_colors = self._get_colors()
163
- self._background = self._orig_colors & self._BACKGROUND_MASK
181
+ self._background = self._orig_colors & self.BACKGROUND_MASK
164
182
 
165
183
  def green(self):
166
- self._set_foreground_colors(self._FOREGROUND_GREEN)
184
+ self._set_foreground_colors(self.FOREGROUND_GREEN)
167
185
 
168
186
  def red(self):
169
- self._set_foreground_colors(self._FOREGROUND_RED)
187
+ self._set_foreground_colors(self.FOREGROUND_RED)
170
188
 
171
189
  def yellow(self):
172
- self._set_foreground_colors(self._FOREGROUND_YELLOW)
190
+ self._set_foreground_colors(self.FOREGROUND_YELLOW)
173
191
 
174
192
  def reset(self):
175
193
  self._set_colors(self._orig_colors)
176
194
 
177
- def _get_std_handle(self, stream):
178
- handle = self._STDOUT_HANDLE \
179
- if stream is sys.__stdout__ else self._STDERR_HANDLE
180
- return windll.kernel32.GetStdHandle(handle)
195
+ def link(self, path):
196
+ return path
181
197
 
182
198
  def _get_colors(self):
183
- csbi = _CONSOLE_SCREEN_BUFFER_INFO()
184
- ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(csbi))
199
+ info = ConsoleScreenBufferInfo()
200
+ ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(info))
185
201
  if not ok: # Call failed, return default console colors (gray on black)
186
- return self._FOREGROUND_GREY
187
- return csbi.wAttributes
202
+ return self.FOREGROUND_GREY
203
+ return info.wAttributes
188
204
 
189
205
  def _set_foreground_colors(self, colors):
190
- self._set_colors(colors | self._FOREGROUND_INTENSITY | self._background)
206
+ self._set_colors(colors | self.FOREGROUND_INTENSITY | self._background)
191
207
 
192
208
  def _set_colors(self, colors):
193
209
  windll.kernel32.SetConsoleTextAttribute(self._handle, colors)
194
210
 
195
211
 
196
- if windll:
197
-
198
- class _COORD(Structure):
199
- _fields_ = [("X", c_short),
200
- ("Y", c_short)]
212
+ def get_std_handle(stream):
213
+ handle = -11 if stream is sys.__stdout__ else -12
214
+ return windll.kernel32.GetStdHandle(handle)
201
215
 
202
- class _SMALL_RECT(Structure):
203
- _fields_ = [("Left", c_short),
204
- ("Top", c_short),
205
- ("Right", c_short),
206
- ("Bottom", c_short)]
207
216
 
208
- class _CONSOLE_SCREEN_BUFFER_INFO(Structure):
209
- _fields_ = [("dwSize", _COORD),
210
- ("dwCursorPosition", _COORD),
211
- ("wAttributes", c_ushort),
212
- ("srWindow", _SMALL_RECT),
213
- ("dwMaximumWindowSize", _COORD)]
217
+ def virtual_terminal_enabled(stream):
218
+ handle = get_std_handle(stream)
219
+ enable_vt = 0x0004
220
+ mode = DWORD()
221
+ if not windll.kernel32.GetConsoleMode(handle, byref(mode)):
222
+ return False # Calling GetConsoleMode failed.
223
+ if mode.value & enable_vt:
224
+ return True # VT already enabled.
225
+ # Try to enable VT.
226
+ return windll.kernel32.SetConsoleMode(handle, mode.value | enable_vt) != 0
@@ -67,7 +67,7 @@ class VerboseOutput(LoggerApi):
67
67
  self.writer.error(msg.message, msg.level, clear=self.running_test)
68
68
 
69
69
  def result_file(self, kind, path):
70
- self.writer.output(kind, path)
70
+ self.writer.result_file(kind, path)
71
71
 
72
72
 
73
73
  class VerboseWriter:
@@ -146,8 +146,8 @@ class VerboseWriter:
146
146
  if self._should_clear_markers(clear):
147
147
  self._write_info()
148
148
 
149
- def output(self, name, path):
150
- self.stdout.write(f"{name+':':8} {path}\n")
149
+ def result_file(self, kind, path):
150
+ self.stdout.result_file(kind, path)
151
151
 
152
152
 
153
153
  class KeywordMarker:
@@ -27,13 +27,18 @@ from .loggerhelper import IsLogged
27
27
  from .logger import LOGGER
28
28
 
29
29
 
30
- class Listeners(LoggerApi):
30
+ class Listeners:
31
31
  _listeners: 'list[ListenerFacade]'
32
32
 
33
33
  def __init__(self, listeners=(), log_level='INFO'):
34
34
  self._is_logged = IsLogged(log_level)
35
35
  self._listeners = self._import_listeners(listeners)
36
36
 
37
+ # Must be property to allow LibraryListeners to override it.
38
+ @property
39
+ def listeners(self):
40
+ return self._listeners
41
+
37
42
  def _import_listeners(self, listeners, library=None) -> 'list[ListenerFacade]':
38
43
  imported = []
39
44
  for listener_source in listeners:
@@ -62,8 +67,8 @@ class Listeners(LoggerApi):
62
67
  # Modules have `__name__`, with others better to use `type_name`.
63
68
  name = getattr(listener, '__name__', None) or type_name(listener)
64
69
  if self._get_version(listener) == 2:
65
- return ListenerV2Facade(listener, name, library)
66
- return ListenerV3Facade(listener, name, library)
70
+ return ListenerV2Facade(listener, name, self._is_logged, library)
71
+ return ListenerV3Facade(listener, name, self._is_logged, library)
67
72
 
68
73
  def _get_version(self, listener):
69
74
  version = getattr(listener, 'ROBOT_LISTENER_API_VERSION', 3)
@@ -75,205 +80,14 @@ class Listeners(LoggerApi):
75
80
  raise DataError(f"Unsupported API version '{version}'.")
76
81
  return version
77
82
 
78
- # Must be property to allow LibraryListeners to override it.
79
- @property
80
- def listeners(self):
81
- return self._listeners
82
-
83
- def start_suite(self, data, result):
84
- for listener in self.listeners:
85
- listener.start_suite(data, result)
86
-
87
- def end_suite(self, data, result):
88
- for listener in self.listeners:
89
- listener.end_suite(data, result)
90
-
91
- def start_test(self, data, result):
92
- for listener in self.listeners:
93
- listener.start_test(data, result)
94
-
95
- def end_test(self, data, result):
96
- for listener in self.listeners:
97
- listener.end_test(data, result)
98
-
99
- def start_keyword(self, data, result):
100
- for listener in self.listeners:
101
- listener.start_keyword(data, result)
102
-
103
- def end_keyword(self, data, result):
104
- for listener in self.listeners:
105
- listener.end_keyword(data, result)
106
-
107
- def start_user_keyword(self, data, implementation, result):
108
- for listener in self.listeners:
109
- listener.start_user_keyword(data, implementation, result)
110
-
111
- def end_user_keyword(self, data, implementation, result):
112
- for listener in self.listeners:
113
- listener.end_user_keyword(data, implementation, result)
114
-
115
- def start_library_keyword(self, data, implementation, result):
116
- for listener in self.listeners:
117
- listener.start_library_keyword(data, implementation, result)
118
-
119
- def end_library_keyword(self, data, implementation, result):
120
- for listener in self.listeners:
121
- listener.end_library_keyword(data, implementation, result)
122
-
123
- def start_invalid_keyword(self, data, implementation, result):
124
- for listener in self.listeners:
125
- listener.start_invalid_keyword(data, implementation, result)
126
-
127
- def end_invalid_keyword(self, data, implementation, result):
128
- for listener in self.listeners:
129
- listener.end_invalid_keyword(data, implementation, result)
130
-
131
- def start_for(self, data, result):
132
- for listener in self.listeners:
133
- listener.start_for(data, result)
134
-
135
- def end_for(self, data, result):
136
- for listener in self.listeners:
137
- listener.end_for(data, result)
138
-
139
- def start_for_iteration(self, data, result):
140
- for listener in self.listeners:
141
- listener.start_for_iteration(data, result)
142
-
143
- def end_for_iteration(self, data, result):
144
- for listener in self.listeners:
145
- listener.end_for_iteration(data, result)
146
-
147
- def start_while(self, data, result):
148
- for listener in self.listeners:
149
- listener.start_while(data, result)
150
-
151
- def end_while(self, data, result):
152
- for listener in self.listeners:
153
- listener.end_while(data, result)
154
-
155
- def start_while_iteration(self, data, result):
156
- for listener in self.listeners:
157
- listener.start_while_iteration(data, result)
158
-
159
- def end_while_iteration(self, data, result):
160
- for listener in self.listeners:
161
- listener.end_while_iteration(data, result)
162
-
163
- def start_if(self, data, result):
164
- for listener in self.listeners:
165
- listener.start_if(data, result)
166
-
167
- def end_if(self, data, result):
168
- for listener in self.listeners:
169
- listener.end_if(data, result)
170
-
171
- def start_if_branch(self, data, result):
172
- for listener in self.listeners:
173
- listener.start_if_branch(data, result)
174
-
175
- def end_if_branch(self, data, result):
176
- for listener in self.listeners:
177
- listener.end_if_branch(data, result)
178
-
179
- def start_try(self, data, result):
180
- for listener in self.listeners:
181
- listener.start_try(data, result)
182
-
183
- def end_try(self, data, result):
184
- for listener in self.listeners:
185
- listener.end_try(data, result)
186
-
187
- def start_try_branch(self, data, result):
188
- for listener in self.listeners:
189
- listener.start_try_branch(data, result)
190
-
191
- def end_try_branch(self, data, result):
192
- for listener in self.listeners:
193
- listener.end_try_branch(data, result)
194
-
195
- def start_return(self, data, result):
196
- for listener in self.listeners:
197
- listener.start_return(data, result)
198
-
199
- def end_return(self, data, result):
200
- for listener in self.listeners:
201
- listener.end_return(data, result)
202
-
203
- def start_continue(self, data, result):
204
- for listener in self.listeners:
205
- listener.start_continue(data, result)
206
-
207
- def end_continue(self, data, result):
208
- for listener in self.listeners:
209
- listener.end_continue(data, result)
210
-
211
- def start_break(self, data, result):
212
- for listener in self.listeners:
213
- listener.start_break(data, result)
214
-
215
- def end_break(self, data, result):
216
- for listener in self.listeners:
217
- listener.end_break(data, result)
218
-
219
- def start_error(self, data, result):
220
- for listener in self.listeners:
221
- listener.start_error(data, result)
222
-
223
- def end_error(self, data, result):
224
- for listener in self.listeners:
225
- listener.end_error(data, result)
226
-
227
- def start_var(self, data, result):
228
- for listener in self.listeners:
229
- listener.start_var(data, result)
230
-
231
- def end_var(self, data, result):
232
- for listener in self.listeners:
233
- listener.end_var(data, result)
234
-
235
83
  def set_log_level(self, level):
236
84
  self._is_logged.set_level(level)
237
85
 
238
- def log_message(self, message):
239
- if self._is_logged(message.level):
240
- for listener in self.listeners:
241
- listener.log_message(message)
242
-
243
- def message(self, message):
244
- for listener in self.listeners:
245
- listener.message(message)
246
-
247
- def imported(self, import_type, name, attrs):
248
- for listener in self.listeners:
249
- listener.imported(import_type, name, attrs)
250
-
251
- def output_file(self, path):
252
- for listener in self.listeners:
253
- listener.output_file(path)
86
+ def __iter__(self):
87
+ return iter(self.listeners)
254
88
 
255
- def report_file(self, path):
256
- for listener in self.listeners:
257
- listener.report_file(path)
258
-
259
- def log_file(self, path):
260
- for listener in self.listeners:
261
- listener.log_file(path)
262
-
263
- def xunit_file(self, path):
264
- for listener in self.listeners:
265
- listener.xunit_file(path)
266
-
267
- def debug_file(self, path):
268
- for listener in self.listeners:
269
- listener.debug_file(path)
270
-
271
- def close(self):
272
- for listener in self.listeners:
273
- listener.close()
274
-
275
- def __bool__(self):
276
- return bool(self.listeners)
89
+ def __len__(self):
90
+ return len(self.listeners)
277
91
 
278
92
 
279
93
  class LibraryListeners(Listeners):
@@ -296,9 +110,6 @@ class LibraryListeners(Listeners):
296
110
  listeners = self._import_listeners(library.listeners, library=library)
297
111
  self._listeners[-1].extend(listeners)
298
112
 
299
- def close(self):
300
- pass
301
-
302
113
  def unregister(self, library, close=False):
303
114
  remaining = []
304
115
  for listener in self._listeners[-1]:
@@ -311,10 +122,19 @@ class LibraryListeners(Listeners):
311
122
 
312
123
  class ListenerFacade(LoggerApi, ABC):
313
124
 
314
- def __init__(self, listener, name, library=None):
125
+ def __init__(self, listener, name, is_logged, library=None):
315
126
  self.listener = listener
316
127
  self.name = name
128
+ self._is_logged = is_logged
317
129
  self.library = library
130
+ self.priority = self._get_priority(listener)
131
+
132
+ def _get_priority(self, listener):
133
+ priority = getattr(listener, 'ROBOT_LISTENER_PRIORITY', 0)
134
+ try:
135
+ return float(priority)
136
+ except (ValueError, TypeError):
137
+ raise DataError(f"Invalid listener priority '{priority}'.")
318
138
 
319
139
  def _get_method(self, name, fallback=None):
320
140
  for method_name in self._get_method_names(name):
@@ -336,8 +156,8 @@ class ListenerFacade(LoggerApi, ABC):
336
156
 
337
157
  class ListenerV3Facade(ListenerFacade):
338
158
 
339
- def __init__(self, listener, name, library=None):
340
- super().__init__(listener, name, library)
159
+ def __init__(self, listener, name, is_logged, library=None):
160
+ super().__init__(listener, name, is_logged, library)
341
161
  get = self._get_method
342
162
  # Suite
343
163
  self.start_suite = get('start_suite')
@@ -393,14 +213,18 @@ class ListenerV3Facade(ListenerFacade):
393
213
  self.start_error = get('start_error', start_body_item)
394
214
  self.end_error = get('end_error', end_body_item)
395
215
  # Messages
396
- self.log_message = get('log_message')
216
+ self._log_message = get('log_message')
397
217
  self.message = get('message')
218
+ # Imports
219
+ self.library_import = get('library_import')
220
+ self.resource_import = get('resource_import')
221
+ self.variables_import = get('variables_import')
398
222
  # Result files
399
- self.output_file = self._get_method('output_file')
400
- self.report_file = self._get_method('report_file')
401
- self.log_file = self._get_method('log_file')
402
- self.xunit_file = self._get_method('xunit_file')
403
- self.debug_file = self._get_method('debug_file')
223
+ self.output_file = get('output_file')
224
+ self.report_file = get('report_file')
225
+ self.log_file = get('log_file')
226
+ self.xunit_file = get('xunit_file')
227
+ self.debug_file = get('debug_file')
404
228
  # Close
405
229
  self.close = get('close')
406
230
 
@@ -440,11 +264,15 @@ class ListenerV3Facade(ListenerFacade):
440
264
  else:
441
265
  self.end_keyword(data, result)
442
266
 
267
+ def log_message(self, message):
268
+ if self._is_logged(message.level):
269
+ self._log_message(message)
270
+
443
271
 
444
272
  class ListenerV2Facade(ListenerFacade):
445
273
 
446
- def __init__(self, listener, name, library=None):
447
- super().__init__(listener, name, library)
274
+ def __init__(self, listener, name, is_logged, library=None):
275
+ super().__init__(listener, name, is_logged, library)
448
276
  # Suite
449
277
  self._start_suite = self._get_method('start_suite')
450
278
  self._end_suite = self._get_method('end_suite')
@@ -457,6 +285,10 @@ class ListenerV2Facade(ListenerFacade):
457
285
  # Messages
458
286
  self._log_message = self._get_method('log_message')
459
287
  self._message = self._get_method('message')
288
+ # Imports
289
+ self._library_import = self._get_method('library_import')
290
+ self._resource_import = self._get_method('resource_import')
291
+ self._variables_import = self._get_method('variables_import')
460
292
  # Result files
461
293
  self._output_file = self._get_method('output_file')
462
294
  self._report_file = self._get_method('report_file')
@@ -466,10 +298,6 @@ class ListenerV2Facade(ListenerFacade):
466
298
  # Close
467
299
  self._close = self._get_method('close')
468
300
 
469
- def imported(self, import_type: str, name: str, attrs):
470
- method = self._get_method(f'{import_type.lower()}_import')
471
- method(name, attrs)
472
-
473
301
  def start_suite(self, data, result):
474
302
  self._start_suite(result.name, self._suite_attrs(data, result))
475
303
 
@@ -602,11 +430,27 @@ class ListenerV2Facade(ListenerFacade):
602
430
  return {'name': result.name, 'value': value, 'scope': result.scope or 'LOCAL'}
603
431
 
604
432
  def log_message(self, message):
605
- self._log_message(self._message_attributes(message))
433
+ if self._is_logged(message.level):
434
+ self._log_message(self._message_attributes(message))
606
435
 
607
436
  def message(self, message):
608
437
  self._message(self._message_attributes(message))
609
438
 
439
+ def library_import(self, library, importer):
440
+ self._library_import(library.name, {'args': list(importer.args),
441
+ 'originalname': library.real_name,
442
+ 'source': str(library.source or ''),
443
+ 'importer': str(importer.source)})
444
+
445
+ def resource_import(self, resource, importer):
446
+ self._resource_import(resource.name, {'source': str(resource.source),
447
+ 'importer': str(importer.source)})
448
+
449
+ def variables_import(self, attrs: dict, importer):
450
+ self._variables_import(attrs['name'], {'args': list(attrs['args']),
451
+ 'source': str(attrs['source']),
452
+ 'importer': str(importer.source)})
453
+
610
454
  def output_file(self, path: Path):
611
455
  self._output_file(str(path))
612
456
 
@@ -56,8 +56,8 @@ class Logger(AbstractLogger):
56
56
  self._console_logger = None
57
57
  self._syslog = None
58
58
  self._xml_logger = None
59
- self._listeners = None
60
- self._library_listeners = None
59
+ self._cli_listeners = None
60
+ self._lib_listeners = None
61
61
  self._other_loggers = []
62
62
  self._message_cache = []
63
63
  self._log_message_cache = None
@@ -70,17 +70,25 @@ class Logger(AbstractLogger):
70
70
  if register_console_logger:
71
71
  self.register_console_logger()
72
72
 
73
+ @property
74
+ def _listeners(self):
75
+ cli_listeners = list(self._cli_listeners or [])
76
+ lib_listeners = list(self._lib_listeners or [])
77
+ return sorted(cli_listeners + lib_listeners, key=lambda li: -li.priority)
78
+
73
79
  @property
74
80
  def start_loggers(self):
75
- loggers = [self._console_logger, self._syslog, self._xml_logger,
76
- self._listeners, self._library_listeners]
77
- return [logger for logger in self._other_loggers + loggers if logger]
81
+ loggers = (self._other_loggers
82
+ + [self._console_logger, self._syslog, self._xml_logger]
83
+ + self._listeners)
84
+ return [logger for logger in loggers if logger]
78
85
 
79
86
  @property
80
87
  def end_loggers(self):
81
- loggers = [self._listeners, self._library_listeners,
82
- self._console_logger, self._syslog, self._xml_logger]
83
- return [logger for logger in loggers + self._other_loggers if logger]
88
+ loggers = (self._listeners
89
+ + [self._console_logger, self._syslog, self._xml_logger]
90
+ + self._other_loggers)
91
+ return [logger for logger in loggers if logger]
84
92
 
85
93
  def __iter__(self):
86
94
  return iter(self.end_loggers)
@@ -132,10 +140,10 @@ class Logger(AbstractLogger):
132
140
  self._xml_logger = None
133
141
 
134
142
  def register_listeners(self, listeners, library_listeners):
135
- self._listeners = listeners
136
- self._library_listeners = library_listeners
137
- if listeners:
138
- self._relay_cached_messages(listeners)
143
+ self._cli_listeners = listeners
144
+ self._lib_listeners = library_listeners
145
+ for listener in listeners or ():
146
+ self._relay_cached_messages(listener)
139
147
 
140
148
  def register_logger(self, *loggers):
141
149
  for logger in loggers:
@@ -398,9 +406,17 @@ class Logger(AbstractLogger):
398
406
  for logger in self.end_loggers:
399
407
  logger.end_error(data, result)
400
408
 
401
- def imported(self, import_type, name, **attrs):
409
+ def library_import(self, library, importer):
410
+ for logger in self:
411
+ logger.library_import(library, importer)
412
+
413
+ def resource_import(self, resource, importer):
414
+ for logger in self:
415
+ logger.resource_import(resource, importer)
416
+
417
+ def variables_import(self, variables, importer):
402
418
  for logger in self:
403
- logger.imported(import_type, name, attrs)
419
+ logger.variables_import(variables, importer)
404
420
 
405
421
  def output_file(self, path):
406
422
  for logger in self: