robotframework 7.0.1rc1__zip → 7.1__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.1rc1 → robotframework-7.1}/PKG-INFO +3 -2
  2. {robotframework-7.0.1rc1 → robotframework-7.1}/setup.py +2 -1
  3. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/interfaces.py +32 -0
  4. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/conf/languages.py +73 -18
  5. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/conf/settings.py +8 -1
  6. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/model.js +22 -33
  7. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/template.py +0 -2
  8. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/jsonbuilder.py +1 -1
  9. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/BuiltIn.py +16 -3
  10. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Collections.py +2 -3
  11. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/DateTime.py +3 -2
  12. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Dialogs.py +12 -4
  13. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/OperatingSystem.py +4 -4
  14. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Process.py +7 -3
  15. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/String.py +4 -1
  16. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/dialogs_py.py +17 -1
  17. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/modelobject.py +1 -6
  18. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/console/__init__.py +3 -3
  19. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/console/dotted.py +4 -4
  20. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/console/highlighting.py +90 -65
  21. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/console/verbose.py +10 -10
  22. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/listeners.py +61 -217
  23. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/logger.py +32 -16
  24. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/loggerapi.py +11 -0
  25. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/loggerhelper.py +6 -1
  26. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/output.py +2 -1
  27. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/model/statements.py +1 -1
  28. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/rebot.py +3 -0
  29. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/executionresult.py +1 -0
  30. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/model.py +1 -1
  31. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/resultbuilder.py +12 -11
  32. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/xmlelementhandlers.py +12 -0
  33. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/run.py +3 -0
  34. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/__init__.py +1 -1
  35. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/argumentresolver.py +18 -11
  36. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/argumentspec.py +2 -2
  37. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/argumentvalidator.py +0 -8
  38. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/embedded.py +2 -2
  39. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/bodyrunner.py +34 -19
  40. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/invalidkeyword.py +4 -1
  41. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/keywordimplementation.py +9 -5
  42. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/librarykeyword.py +19 -9
  43. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/librarykeywordrunner.py +25 -19
  44. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/model.py +69 -27
  45. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/namespace.py +20 -26
  46. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/resourcemodel.py +9 -1
  47. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/statusreporter.py +9 -4
  48. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/testlibraries.py +2 -2
  49. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/userkeywordrunner.py +10 -7
  50. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/encodingsniffer.py +3 -1
  51. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/robottime.py +5 -3
  52. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/evaluation.py +1 -4
  53. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/scopes.py +2 -1
  54. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/tablesetter.py +17 -20
  55. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/version.py +1 -1
  56. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robotframework.egg-info/PKG-INFO +3 -2
  57. {robotframework-7.0.1rc1 → robotframework-7.1}/AUTHORS.rst +0 -0
  58. {robotframework-7.0.1rc1 → robotframework-7.1}/BUILD.rst +0 -0
  59. {robotframework-7.0.1rc1 → robotframework-7.1}/CONTRIBUTING.rst +0 -0
  60. {robotframework-7.0.1rc1 → robotframework-7.1}/COPYRIGHT.txt +0 -0
  61. {robotframework-7.0.1rc1 → robotframework-7.1}/INSTALL.rst +0 -0
  62. {robotframework-7.0.1rc1 → robotframework-7.1}/LICENSE.txt +0 -0
  63. {robotframework-7.0.1rc1 → robotframework-7.1}/MANIFEST.in +0 -0
  64. {robotframework-7.0.1rc1 → robotframework-7.1}/README.rst +0 -0
  65. {robotframework-7.0.1rc1 → robotframework-7.1}/setup.cfg +0 -0
  66. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/__init__.py +0 -0
  67. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/__main__.py +0 -0
  68. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/__init__.py +0 -0
  69. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/deco.py +0 -0
  70. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/exceptions.py +0 -0
  71. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/logger.py +0 -0
  72. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/parsing.py +0 -0
  73. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/api/py.typed +0 -0
  74. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/conf/__init__.py +0 -0
  75. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/conf/gatherfailed.py +0 -0
  76. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/errors.py +0 -0
  77. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/__init__.py +0 -0
  78. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/common/__init__.py +0 -0
  79. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/common/js_disabled.css +0 -0
  80. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/common/storage.js +0 -0
  81. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  82. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/jsonwriter.py +0 -0
  83. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/lib/__init__.py +0 -0
  84. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  85. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  86. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  87. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  88. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  89. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  90. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  91. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  92. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  93. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/libdoc/print.css +0 -0
  94. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  95. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/__init__.py +0 -0
  96. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/common.css +0 -0
  97. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  98. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  99. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/log.css +0 -0
  100. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/log.html +0 -0
  101. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/log.js +0 -0
  102. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/print.css +0 -0
  103. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/report.css +0 -0
  104. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/report.html +0 -0
  105. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/testdata.js +0 -0
  106. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/util.js +0 -0
  107. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/rebot/view.js +0 -0
  108. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  109. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  110. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  111. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdoc.py +0 -0
  112. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/__init__.py +0 -0
  113. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/builder.py +0 -0
  114. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  115. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/datatypes.py +0 -0
  116. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/htmlutils.py +0 -0
  117. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  118. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  119. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/model.py +0 -0
  120. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/output.py +0 -0
  121. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/robotbuilder.py +0 -0
  122. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/standardtypes.py +0 -0
  123. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/writer.py +0 -0
  124. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  125. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libdocpkg/xmlwriter.py +0 -0
  126. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Easter.py +0 -0
  127. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Remote.py +0 -0
  128. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Screenshot.py +0 -0
  129. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/Telnet.py +0 -0
  130. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/XML.py +0 -0
  131. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/libraries/__init__.py +0 -0
  132. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/__init__.py +0 -0
  133. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/body.py +0 -0
  134. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/configurer.py +0 -0
  135. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/control.py +0 -0
  136. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/filter.py +0 -0
  137. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/fixture.py +0 -0
  138. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/itemlist.py +0 -0
  139. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/keyword.py +0 -0
  140. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/message.py +0 -0
  141. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/metadata.py +0 -0
  142. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/modifier.py +0 -0
  143. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/namepatterns.py +0 -0
  144. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/statistics.py +0 -0
  145. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/stats.py +0 -0
  146. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/suitestatistics.py +0 -0
  147. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/tags.py +0 -0
  148. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/tagsetter.py +0 -0
  149. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/tagstatistics.py +0 -0
  150. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/testcase.py +0 -0
  151. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/testsuite.py +0 -0
  152. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/totalstatistics.py +0 -0
  153. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/model/visitor.py +0 -0
  154. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/__init__.py +0 -0
  155. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/console/quiet.py +0 -0
  156. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/debugfile.py +0 -0
  157. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/filelogger.py +0 -0
  158. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/librarylogger.py +0 -0
  159. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/pyloggingconf.py +0 -0
  160. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/stdoutlogsplitter.py +0 -0
  161. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/output/xmllogger.py +0 -0
  162. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/__init__.py +0 -0
  163. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/__init__.py +0 -0
  164. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/blocklexers.py +0 -0
  165. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/context.py +0 -0
  166. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/lexer.py +0 -0
  167. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/settings.py +0 -0
  168. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/statementlexers.py +0 -0
  169. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  170. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/lexer/tokens.py +0 -0
  171. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/model/__init__.py +0 -0
  172. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/model/blocks.py +0 -0
  173. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/model/visitor.py +0 -0
  174. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/parser/__init__.py +0 -0
  175. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/parser/blockparsers.py +0 -0
  176. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/parser/fileparser.py +0 -0
  177. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/parser/parser.py +0 -0
  178. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/parsing/suitestructure.py +0 -0
  179. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/pythonpathsetter.py +0 -0
  180. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/__init__.py +0 -0
  181. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  182. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/jsbuildingcontext.py +0 -0
  183. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/jsexecutionresult.py +0 -0
  184. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/jsmodelbuilders.py +0 -0
  185. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/jswriter.py +0 -0
  186. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/logreportwriters.py +0 -0
  187. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/outputwriter.py +0 -0
  188. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/resultwriter.py +0 -0
  189. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/stringcache.py +0 -0
  190. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/reporting/xunitwriter.py +0 -0
  191. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/__init__.py +0 -0
  192. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/configurer.py +0 -0
  193. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/executionerrors.py +0 -0
  194. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/flattenkeywordmatcher.py +0 -0
  195. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/keywordremover.py +0 -0
  196. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/merger.py +0 -0
  197. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/messagefilter.py +0 -0
  198. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/modeldeprecation.py +0 -0
  199. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/suiteteardownfailed.py +0 -0
  200. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/result/visitor.py +0 -0
  201. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/__init__.py +0 -0
  202. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/argumentconverter.py +0 -0
  203. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/argumentmapper.py +0 -0
  204. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/argumentparser.py +0 -0
  205. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/customconverters.py +0 -0
  206. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/typeconverters.py +0 -0
  207. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/typeinfo.py +0 -0
  208. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/typeinfoparser.py +0 -0
  209. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/arguments/typevalidator.py +0 -0
  210. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/builder/__init__.py +0 -0
  211. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/builder/builders.py +0 -0
  212. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/builder/parsers.py +0 -0
  213. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/builder/settings.py +0 -0
  214. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/builder/transformers.py +0 -0
  215. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/context.py +0 -0
  216. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/dynamicmethods.py +0 -0
  217. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/importer.py +0 -0
  218. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/keywordfinder.py +0 -0
  219. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/libraryscopes.py +0 -0
  220. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/outputcapture.py +0 -0
  221. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/randomizer.py +0 -0
  222. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/runkwregister.py +0 -0
  223. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/signalhandler.py +0 -0
  224. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/status.py +0 -0
  225. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/suiterunner.py +0 -0
  226. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/timeouts/__init__.py +0 -0
  227. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/timeouts/nosupport.py +0 -0
  228. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/timeouts/posix.py +0 -0
  229. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/running/timeouts/windows.py +0 -0
  230. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/testdoc.py +0 -0
  231. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/__init__.py +0 -0
  232. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/application.py +0 -0
  233. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/argumentparser.py +0 -0
  234. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/asserts.py +0 -0
  235. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/charwidth.py +0 -0
  236. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/compress.py +0 -0
  237. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/connectioncache.py +0 -0
  238. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/dotdict.py +0 -0
  239. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/encoding.py +0 -0
  240. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/error.py +0 -0
  241. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/escaping.py +0 -0
  242. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/etreewrapper.py +0 -0
  243. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/filereader.py +0 -0
  244. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/frange.py +0 -0
  245. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/htmlformatters.py +0 -0
  246. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/importer.py +0 -0
  247. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/markuputils.py +0 -0
  248. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/markupwriters.py +0 -0
  249. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/match.py +0 -0
  250. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/misc.py +0 -0
  251. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/normalizing.py +0 -0
  252. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/notset.py +0 -0
  253. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/platform.py +0 -0
  254. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/recommendations.py +0 -0
  255. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/restreader.py +0 -0
  256. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/robotenv.py +0 -0
  257. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/robotinspect.py +0 -0
  258. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/robotio.py +0 -0
  259. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/robotpath.py +0 -0
  260. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/robottypes.py +0 -0
  261. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/setter.py +0 -0
  262. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/sortable.py +0 -0
  263. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/text.py +0 -0
  264. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/typehints.py +0 -0
  265. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/utils/unic.py +0 -0
  266. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/__init__.py +0 -0
  267. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/assigner.py +0 -0
  268. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/filesetter.py +0 -0
  269. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/finders.py +0 -0
  270. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/notfound.py +0 -0
  271. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/replacer.py +0 -0
  272. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/resolvable.py +0 -0
  273. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/search.py +0 -0
  274. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/store.py +0 -0
  275. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robot/variables/variables.py +0 -0
  276. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robotframework.egg-info/SOURCES.txt +0 -0
  277. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  278. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robotframework.egg-info/entry_points.txt +0 -0
  279. {robotframework-7.0.1rc1 → robotframework-7.1}/src/robotframework.egg-info/top_level.txt +0 -0
  280. {robotframework-7.0.1rc1 → robotframework-7.1}/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
@@ -32,11 +42,11 @@ from robot.utils import console_encode, isatty, WINDOWS
32
42
 
33
43
  class HighlightingStream:
34
44
 
35
- def __init__(self, stream, colors='AUTO'):
45
+ def __init__(self, stream, colors='AUTO', links='AUTO'):
36
46
  self.stream = stream
37
- self._highlighter = self._get_highlighter(stream, colors)
47
+ self._highlighter = self._get_highlighter(stream, colors, links)
38
48
 
39
- def _get_highlighter(self, stream, colors):
49
+ def _get_highlighter(self, stream, colors, links):
40
50
  options = {'AUTO': Highlighter if isatty(stream) else NoHighlighting,
41
51
  'ON': Highlighter,
42
52
  'OFF': NoHighlighting,
@@ -44,9 +54,12 @@ class HighlightingStream:
44
54
  try:
45
55
  highlighter = options[colors.upper()]
46
56
  except KeyError:
47
- raise DataError("Invalid console color value '%s'. Available "
48
- "'AUTO', 'ON', 'OFF' and 'ANSI'." % colors)
49
- return highlighter(stream)
57
+ raise DataError(f"Invalid console color value '{colors}'. "
58
+ f"Available 'AUTO', 'ON', 'OFF' and 'ANSI'.")
59
+ if links.upper() not in ('AUTO', 'OFF'):
60
+ raise DataError(f"Invalid console link value '{links}. "
61
+ f"Available 'AUTO' and 'OFF'.")
62
+ return highlighter(stream, links.upper() == 'AUTO')
50
63
 
51
64
  def write(self, text, flush=True):
52
65
  self._write(console_encode(text, stream=self.stream))
@@ -78,18 +91,14 @@ class HighlightingStream:
78
91
  self.stream.flush()
79
92
 
80
93
  def highlight(self, text, status=None, flush=True):
81
- if self._must_flush_before_and_after_highlighting():
94
+ # Must flush before and after highlighting when using Windows APIs to make
95
+ # sure colors only affects the actual highlighted text.
96
+ if isinstance(self._highlighter, DosHighlighter):
82
97
  self.flush()
83
98
  flush = True
84
99
  with self._highlighting(status or text):
85
100
  self.write(text, flush)
86
101
 
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
102
  def error(self, message, level):
94
103
  self.write('[ ', flush=False)
95
104
  self.highlight(level, flush=False)
@@ -109,33 +118,53 @@ class HighlightingStream:
109
118
  finally:
110
119
  highlighter.reset()
111
120
 
121
+ def result_file(self, kind, path):
122
+ path = self._highlighter.link(path)
123
+ self.write(f"{kind + ':':8} {path}\n")
124
+
112
125
 
113
- def Highlighter(stream):
126
+ def Highlighter(stream, links=True):
114
127
  if os.sep == '/':
115
- return AnsiHighlighter(stream)
116
- return DosHighlighter(stream) if windll else NoHighlighting(stream)
128
+ return AnsiHighlighter(stream, links)
129
+ if not windll:
130
+ return NoHighlighting(stream)
131
+ if virtual_terminal_enabled(stream):
132
+ return AnsiHighlighter(stream, links)
133
+ return DosHighlighter(stream)
117
134
 
118
135
 
119
136
  class AnsiHighlighter:
120
- _ANSI_GREEN = '\033[32m'
121
- _ANSI_RED = '\033[31m'
122
- _ANSI_YELLOW = '\033[33m'
123
- _ANSI_RESET = '\033[0m'
137
+ GREEN = '\033[32m'
138
+ RED = '\033[31m'
139
+ YELLOW = '\033[33m'
140
+ RESET = '\033[0m'
124
141
 
125
- def __init__(self, stream):
142
+ def __init__(self, stream, links=True):
126
143
  self._stream = stream
144
+ self._links = links
127
145
 
128
146
  def green(self):
129
- self._set_color(self._ANSI_GREEN)
147
+ self._set_color(self.GREEN)
130
148
 
131
149
  def red(self):
132
- self._set_color(self._ANSI_RED)
150
+ self._set_color(self.RED)
133
151
 
134
152
  def yellow(self):
135
- self._set_color(self._ANSI_YELLOW)
153
+ self._set_color(self.YELLOW)
136
154
 
137
155
  def reset(self):
138
- self._set_color(self._ANSI_RESET)
156
+ self._set_color(self.RESET)
157
+
158
+ def link(self, path):
159
+ if not self._links:
160
+ return path
161
+ try:
162
+ uri = path.as_uri()
163
+ except ValueError:
164
+ return path
165
+ # Terminal hyperlink syntax is documented here:
166
+ # https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
167
+ return f'\033]8;;{uri}\033\\{path}\033]8;;\033\\'
139
168
 
140
169
  def _set_color(self, color):
141
170
  self._stream.write(color)
@@ -143,71 +172,67 @@ class AnsiHighlighter:
143
172
 
144
173
  class NoHighlighting(AnsiHighlighter):
145
174
 
175
+ def link(self, path):
176
+ return path
177
+
146
178
  def _set_color(self, color):
147
179
  pass
148
180
 
149
181
 
150
182
  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
183
+ FOREGROUND_GREEN = 0x2
184
+ FOREGROUND_RED = 0x4
185
+ FOREGROUND_YELLOW = 0x6
186
+ FOREGROUND_GREY = 0x7
187
+ FOREGROUND_INTENSITY = 0x8
188
+ BACKGROUND_MASK = 0xF0
159
189
 
160
190
  def __init__(self, stream):
161
- self._handle = self._get_std_handle(stream)
191
+ self._handle = get_std_handle(stream)
162
192
  self._orig_colors = self._get_colors()
163
- self._background = self._orig_colors & self._BACKGROUND_MASK
193
+ self._background = self._orig_colors & self.BACKGROUND_MASK
164
194
 
165
195
  def green(self):
166
- self._set_foreground_colors(self._FOREGROUND_GREEN)
196
+ self._set_foreground_colors(self.FOREGROUND_GREEN)
167
197
 
168
198
  def red(self):
169
- self._set_foreground_colors(self._FOREGROUND_RED)
199
+ self._set_foreground_colors(self.FOREGROUND_RED)
170
200
 
171
201
  def yellow(self):
172
- self._set_foreground_colors(self._FOREGROUND_YELLOW)
202
+ self._set_foreground_colors(self.FOREGROUND_YELLOW)
173
203
 
174
204
  def reset(self):
175
205
  self._set_colors(self._orig_colors)
176
206
 
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)
207
+ def link(self, path):
208
+ return path
181
209
 
182
210
  def _get_colors(self):
183
- csbi = _CONSOLE_SCREEN_BUFFER_INFO()
184
- ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(csbi))
211
+ info = ConsoleScreenBufferInfo()
212
+ ok = windll.kernel32.GetConsoleScreenBufferInfo(self._handle, byref(info))
185
213
  if not ok: # Call failed, return default console colors (gray on black)
186
- return self._FOREGROUND_GREY
187
- return csbi.wAttributes
214
+ return self.FOREGROUND_GREY
215
+ return info.wAttributes
188
216
 
189
217
  def _set_foreground_colors(self, colors):
190
- self._set_colors(colors | self._FOREGROUND_INTENSITY | self._background)
218
+ self._set_colors(colors | self.FOREGROUND_INTENSITY | self._background)
191
219
 
192
220
  def _set_colors(self, colors):
193
221
  windll.kernel32.SetConsoleTextAttribute(self._handle, colors)
194
222
 
195
223
 
196
- if windll:
197
-
198
- class _COORD(Structure):
199
- _fields_ = [("X", c_short),
200
- ("Y", c_short)]
224
+ def get_std_handle(stream):
225
+ handle = -11 if stream is sys.__stdout__ else -12
226
+ return windll.kernel32.GetStdHandle(handle)
201
227
 
202
- class _SMALL_RECT(Structure):
203
- _fields_ = [("Left", c_short),
204
- ("Top", c_short),
205
- ("Right", c_short),
206
- ("Bottom", c_short)]
207
228
 
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)]
229
+ def virtual_terminal_enabled(stream):
230
+ handle = get_std_handle(stream)
231
+ enable_vt = 0x0004
232
+ mode = DWORD()
233
+ if not windll.kernel32.GetConsoleMode(handle, byref(mode)):
234
+ return False # Calling GetConsoleMode failed.
235
+ if mode.value & enable_vt:
236
+ return True # VT already enabled.
237
+ # Try to enable VT.
238
+ return windll.kernel32.SetConsoleMode(handle, mode.value | enable_vt) != 0
@@ -24,9 +24,9 @@ from ..loggerapi import LoggerApi
24
24
 
25
25
  class VerboseOutput(LoggerApi):
26
26
 
27
- def __init__(self, width=78, colors='AUTO', markers='AUTO', stdout=None,
28
- stderr=None):
29
- self.writer = VerboseWriter(width, colors, markers, stdout, stderr)
27
+ def __init__(self, width=78, colors='AUTO', links='AUTO', markers='AUTO',
28
+ stdout=None, stderr=None):
29
+ self.writer = VerboseWriter(width, colors, links, markers, stdout, stderr)
30
30
  self.started = False
31
31
  self.started_keywords = 0
32
32
  self.running_test = False
@@ -67,17 +67,17 @@ 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:
74
74
  _status_length = len('| PASS |')
75
75
 
76
- def __init__(self, width=78, colors='AUTO', markers='AUTO', stdout=None,
77
- stderr=None):
76
+ def __init__(self, width=78, colors='AUTO', links='AUTO', markers='AUTO',
77
+ stdout=None, stderr=None):
78
78
  self.width = width
79
- self.stdout = HighlightingStream(stdout or sys.__stdout__, colors)
80
- self.stderr = HighlightingStream(stderr or sys.__stderr__, colors)
79
+ self.stdout = HighlightingStream(stdout or sys.__stdout__, colors, links)
80
+ self.stderr = HighlightingStream(stderr or sys.__stderr__, colors, links)
81
81
  self._keyword_marker = KeywordMarker(self.stdout, markers)
82
82
  self._last_info = None
83
83
 
@@ -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