robotframework 6.1.1__zip → 7.0__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. {robotframework-6.1.1 → robotframework-7.0}/INSTALL.rst +25 -25
  2. {robotframework-6.1.1 → robotframework-7.0}/PKG-INFO +6 -8
  3. {robotframework-6.1.1 → robotframework-7.0}/README.rst +3 -2
  4. {robotframework-6.1.1 → robotframework-7.0}/setup.py +3 -6
  5. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/__init__.py +4 -1
  6. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/deco.py +60 -14
  7. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/exceptions.py +6 -6
  8. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/interfaces.py +402 -67
  9. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/logger.py +27 -20
  10. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/parsing.py +4 -2
  11. robotframework-7.0/src/robot/api/py.typed +0 -0
  12. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/gatherfailed.py +2 -2
  13. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/languages.py +0 -9
  14. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/settings.py +21 -14
  15. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/storage.js +11 -6
  16. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/htmlfilewriter.py +1 -1
  17. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.css +10 -2
  18. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.html +10 -0
  19. robotframework-7.0/src/robot/htmldata/rebot/common.css +362 -0
  20. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/doc_formatting.css +13 -7
  21. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.css +51 -10
  22. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.html +14 -23
  23. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/model.js +2 -4
  24. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.css +83 -19
  25. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.html +22 -7
  26. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/testdata.js +10 -3
  27. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/view.js +84 -0
  28. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/template.py +3 -3
  29. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/builder.py +0 -8
  30. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/datatypes.py +9 -10
  31. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlutils.py +4 -7
  32. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonbuilder.py +38 -20
  33. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/model.py +21 -28
  34. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/robotbuilder.py +50 -31
  35. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/standardtypes.py +9 -1
  36. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlbuilder.py +35 -20
  37. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlwriter.py +18 -38
  38. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/BuiltIn.py +255 -205
  39. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Collections.py +384 -240
  40. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/DateTime.py +73 -60
  41. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/OperatingSystem.py +6 -5
  42. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Process.py +26 -27
  43. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Remote.py +40 -36
  44. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/String.py +66 -76
  45. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/XML.py +66 -59
  46. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/__init__.py +2 -2
  47. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/__init__.py +5 -5
  48. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/body.py +44 -13
  49. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/configurer.py +15 -11
  50. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/control.py +226 -84
  51. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/filter.py +31 -25
  52. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/itemlist.py +9 -8
  53. robotframework-7.0/src/robot/model/keyword.py +77 -0
  54. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/message.py +19 -10
  55. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modelobject.py +25 -7
  56. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/namepatterns.py +3 -25
  57. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/stats.py +9 -15
  58. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tags.py +1 -1
  59. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testcase.py +15 -27
  60. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testsuite.py +17 -26
  61. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/visitor.py +35 -8
  62. robotframework-7.0/src/robot/output/console/dotted.py +90 -0
  63. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/quiet.py +3 -2
  64. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/verbose.py +61 -61
  65. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/debugfile.py +39 -24
  66. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/filelogger.py +18 -15
  67. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/librarylogger.py +3 -2
  68. robotframework-7.0/src/robot/output/listeners.py +753 -0
  69. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/logger.py +216 -80
  70. robotframework-7.0/src/robot/output/loggerapi.py +215 -0
  71. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/loggerhelper.py +23 -56
  72. robotframework-7.0/src/robot/output/output.py +185 -0
  73. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/stdoutlogsplitter.py +8 -5
  74. robotframework-7.0/src/robot/output/xmllogger.py +459 -0
  75. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/blocklexers.py +17 -13
  76. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/context.py +12 -2
  77. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/lexer.py +1 -1
  78. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/settings.py +6 -3
  79. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/statementlexers.py +39 -10
  80. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokens.py +27 -29
  81. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/blocks.py +19 -6
  82. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/statements.py +193 -94
  83. robotframework-7.0/src/robot/parsing/model/visitor.py +100 -0
  84. {robotframework-6.1.1 → robotframework-7.0}/src/robot/rebot.py +2 -0
  85. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  86. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsbuildingcontext.py +8 -6
  87. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsmodelbuilders.py +88 -61
  88. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/logreportwriters.py +16 -10
  89. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/outputwriter.py +18 -2
  90. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/resultwriter.py +4 -4
  91. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/stringcache.py +3 -3
  92. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/xunitwriter.py +15 -21
  93. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/__init__.py +3 -2
  94. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/configurer.py +12 -9
  95. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionresult.py +56 -8
  96. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/flattenkeywordmatcher.py +48 -9
  97. robotframework-7.0/src/robot/result/keywordremover.py +207 -0
  98. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/merger.py +1 -1
  99. robotframework-7.0/src/robot/result/model.py +1185 -0
  100. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/modeldeprecation.py +9 -3
  101. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/resultbuilder.py +46 -36
  102. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/xmlelementhandlers.py +83 -43
  103. {robotframework-6.1.1 → robotframework-7.0}/src/robot/run.py +2 -0
  104. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/__init__.py +14 -4
  105. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/__init__.py +2 -1
  106. robotframework-7.0/src/robot/running/arguments/argumentconverter.py +100 -0
  107. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentmapper.py +26 -24
  108. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentparser.py +82 -60
  109. robotframework-7.0/src/robot/running/arguments/argumentresolver.py +158 -0
  110. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentspec.py +83 -116
  111. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentvalidator.py +33 -27
  112. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/customconverters.py +15 -12
  113. robotframework-7.0/src/robot/running/arguments/embedded.py +145 -0
  114. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/typeconverters.py +233 -213
  115. robotframework-7.0/src/robot/running/arguments/typeinfo.py +317 -0
  116. robotframework-7.0/src/robot/running/arguments/typeinfoparser.py +219 -0
  117. robotframework-7.0/src/robot/running/arguments/typevalidator.py +60 -0
  118. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/bodyrunner.py +147 -129
  119. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/builders.py +2 -1
  120. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/parsers.py +10 -11
  121. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/settings.py +9 -17
  122. robotframework-7.0/src/robot/running/builder/transformers.py +535 -0
  123. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/context.py +113 -31
  124. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/dynamicmethods.py +62 -34
  125. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/importer.py +27 -49
  126. robotframework-7.0/src/robot/running/invalidkeyword.py +67 -0
  127. robotframework-7.0/src/robot/running/keywordfinder.py +91 -0
  128. robotframework-7.0/src/robot/running/keywordimplementation.py +164 -0
  129. robotframework-7.0/src/robot/running/librarykeyword.py +392 -0
  130. robotframework-7.0/src/robot/running/librarykeywordrunner.py +250 -0
  131. robotframework-7.0/src/robot/running/libraryscopes.py +115 -0
  132. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/model.py +195 -377
  133. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/namespace.py +124 -137
  134. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/outputcapture.py +20 -12
  135. robotframework-7.0/src/robot/running/resourcemodel.py +448 -0
  136. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/statusreporter.py +16 -13
  137. robotframework-7.0/src/robot/running/suiterunner.py +265 -0
  138. robotframework-7.0/src/robot/running/testlibraries.py +500 -0
  139. robotframework-7.0/src/robot/running/userkeywordrunner.py +260 -0
  140. {robotframework-6.1.1 → robotframework-7.0}/src/robot/testdoc.py +18 -13
  141. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/__init__.py +53 -35
  142. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/connectioncache.py +64 -59
  143. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/dotdict.py +3 -0
  144. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encodingsniffer.py +1 -1
  145. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/escaping.py +19 -19
  146. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/importer.py +2 -2
  147. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markupwriters.py +23 -15
  148. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/misc.py +1 -2
  149. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/normalizing.py +9 -24
  150. robotframework-7.0/src/robot/utils/notset.py +33 -0
  151. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/platform.py +15 -5
  152. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotio.py +9 -9
  153. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotpath.py +1 -0
  154. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottime.py +122 -90
  155. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottypes.py +21 -31
  156. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/setter.py +0 -5
  157. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/text.py +7 -4
  158. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/unic.py +2 -2
  159. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/__init__.py +2 -2
  160. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/assigner.py +17 -19
  161. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/evaluation.py +20 -17
  162. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/filesetter.py +80 -80
  163. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/replacer.py +33 -36
  164. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/scopes.py +17 -12
  165. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/search.py +66 -41
  166. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/store.py +14 -16
  167. robotframework-7.0/src/robot/variables/tablesetter.py +164 -0
  168. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/variables.py +1 -1
  169. {robotframework-6.1.1 → robotframework-7.0}/src/robot/version.py +1 -1
  170. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/PKG-INFO +6 -8
  171. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/SOURCES.txt +10 -8
  172. {robotframework-6.1.1 → robotframework-7.0}/tasks.py +6 -6
  173. robotframework-6.1.1/src/robot/htmldata/rebot/common.css +0 -239
  174. robotframework-6.1.1/src/robot/libraries/Reserved.py +0 -48
  175. robotframework-6.1.1/src/robot/model/keyword.py +0 -173
  176. robotframework-6.1.1/src/robot/output/console/dotted.py +0 -90
  177. robotframework-6.1.1/src/robot/output/listenerarguments.py +0 -165
  178. robotframework-6.1.1/src/robot/output/listenermethods.py +0 -113
  179. robotframework-6.1.1/src/robot/output/listeners.py +0 -174
  180. robotframework-6.1.1/src/robot/output/output.py +0 -95
  181. robotframework-6.1.1/src/robot/output/xmllogger.py +0 -354
  182. robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
  183. robotframework-6.1.1/src/robot/result/keywordremover.py +0 -183
  184. robotframework-6.1.1/src/robot/result/model.py +0 -957
  185. robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
  186. robotframework-6.1.1/src/robot/running/arguments/argumentresolver.py +0 -131
  187. robotframework-6.1.1/src/robot/running/arguments/embedded.py +0 -146
  188. robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
  189. robotframework-6.1.1/src/robot/running/builder/transformers.py +0 -642
  190. robotframework-6.1.1/src/robot/running/handlers.py +0 -321
  191. robotframework-6.1.1/src/robot/running/handlerstore.py +0 -66
  192. robotframework-6.1.1/src/robot/running/librarykeywordrunner.py +0 -238
  193. robotframework-6.1.1/src/robot/running/libraryscopes.py +0 -97
  194. robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
  195. robotframework-6.1.1/src/robot/running/suiterunner.py +0 -248
  196. robotframework-6.1.1/src/robot/running/testlibraries.py +0 -423
  197. robotframework-6.1.1/src/robot/running/usererrorhandler.py +0 -75
  198. robotframework-6.1.1/src/robot/running/userkeyword.py +0 -111
  199. robotframework-6.1.1/src/robot/running/userkeywordrunner.py +0 -274
  200. robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
  201. {robotframework-6.1.1 → robotframework-7.0}/AUTHORS.rst +0 -0
  202. {robotframework-6.1.1 → robotframework-7.0}/BUILD.rst +0 -0
  203. {robotframework-6.1.1 → robotframework-7.0}/CONTRIBUTING.rst +0 -0
  204. {robotframework-6.1.1 → robotframework-7.0}/COPYRIGHT.txt +0 -0
  205. {robotframework-6.1.1 → robotframework-7.0}/LICENSE.txt +0 -0
  206. {robotframework-6.1.1 → robotframework-7.0}/MANIFEST.in +0 -0
  207. {robotframework-6.1.1 → robotframework-7.0}/setup.cfg +0 -0
  208. {robotframework-6.1.1 → robotframework-7.0}/src/robot/__init__.py +0 -0
  209. {robotframework-6.1.1 → robotframework-7.0}/src/robot/__main__.py +0 -0
  210. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/__init__.py +0 -0
  211. {robotframework-6.1.1 → robotframework-7.0}/src/robot/errors.py +0 -0
  212. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/__init__.py +0 -0
  213. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/__init__.py +0 -0
  214. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/js_disabled.css +0 -0
  215. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/jsonwriter.py +0 -0
  216. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/__init__.py +0 -0
  217. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  218. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.min.js +0 -0
  219. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  220. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  221. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  222. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/__init__.py +0 -0
  223. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  224. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/print.css +0 -0
  225. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/pygments.css +0 -0
  226. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/__init__.py +0 -0
  227. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/fileloading.js +0 -0
  228. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.js +0 -0
  229. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/print.css +0 -0
  230. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/util.js +0 -0
  231. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/__init__.py +0 -0
  232. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  233. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  234. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdoc.py +0 -0
  235. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/__init__.py +0 -0
  236. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/consoleviewer.py +0 -0
  237. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlwriter.py +0 -0
  238. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonwriter.py +0 -0
  239. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/output.py +0 -0
  240. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/writer.py +0 -0
  241. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Dialogs.py +0 -0
  242. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Easter.py +0 -0
  243. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Screenshot.py +0 -0
  244. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Telnet.py +0 -0
  245. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/dialogs_py.py +0 -0
  246. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/fixture.py +0 -0
  247. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/metadata.py +0 -0
  248. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modifier.py +0 -0
  249. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/statistics.py +0 -0
  250. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/suitestatistics.py +0 -0
  251. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagsetter.py +0 -0
  252. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagstatistics.py +0 -0
  253. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/totalstatistics.py +0 -0
  254. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/__init__.py +0 -0
  255. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/__init__.py +0 -0
  256. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/highlighting.py +0 -0
  257. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/pyloggingconf.py +0 -0
  258. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/__init__.py +0 -0
  259. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/__init__.py +0 -0
  260. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokenizer.py +0 -0
  261. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/__init__.py +0 -0
  262. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/__init__.py +0 -0
  263. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/blockparsers.py +0 -0
  264. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/fileparser.py +0 -0
  265. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/parser.py +0 -0
  266. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/suitestructure.py +0 -0
  267. {robotframework-6.1.1 → robotframework-7.0}/src/robot/pythonpathsetter.py +0 -0
  268. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/__init__.py +0 -0
  269. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsexecutionresult.py +0 -0
  270. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jswriter.py +0 -0
  271. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionerrors.py +0 -0
  272. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/messagefilter.py +0 -0
  273. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/suiteteardownfailed.py +0 -0
  274. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/visitor.py +0 -0
  275. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/__init__.py +0 -0
  276. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/randomizer.py +0 -0
  277. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/runkwregister.py +0 -0
  278. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/signalhandler.py +0 -0
  279. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/status.py +0 -0
  280. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/__init__.py +0 -0
  281. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/posix.py +0 -0
  282. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/windows.py +0 -0
  283. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/application.py +0 -0
  284. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/argumentparser.py +0 -0
  285. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/asserts.py +0 -0
  286. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/charwidth.py +0 -0
  287. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/compress.py +0 -0
  288. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encoding.py +0 -0
  289. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/error.py +0 -0
  290. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/etreewrapper.py +0 -0
  291. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/filereader.py +0 -0
  292. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/frange.py +0 -0
  293. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/htmlformatters.py +0 -0
  294. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markuputils.py +0 -0
  295. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/match.py +0 -0
  296. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/recommendations.py +0 -0
  297. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/restreader.py +0 -0
  298. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotenv.py +0 -0
  299. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotinspect.py +0 -0
  300. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/sortable.py +0 -0
  301. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/typehints.py +0 -0
  302. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/finders.py +0 -0
  303. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/notfound.py +0 -0
  304. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/resolvable.py +0 -0
  305. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/dependency_links.txt +0 -0
  306. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/entry_points.txt +0 -0
  307. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -20,10 +20,28 @@ from robot.errors import DataError
20
20
 
21
21
  from .console import ConsoleOutput
22
22
  from .filelogger import FileLogger
23
- from .loggerhelper import AbstractLogger, AbstractLoggerProxy
23
+ from .loggerhelper import AbstractLogger
24
24
  from .stdoutlogsplitter import StdoutLogSplitter
25
25
 
26
26
 
27
+ def start_body_item(method):
28
+ def wrapper(self, *args):
29
+ # TODO: Could _prev_log_message_handlers be used also here?
30
+ self._started_keywords += 1
31
+ self.log_message = self._log_message
32
+ method(self, *args)
33
+ return wrapper
34
+
35
+
36
+ def end_body_item(method):
37
+ def wrapper(self, *args):
38
+ self._started_keywords -= 1
39
+ method(self, *args)
40
+ if not self._started_keywords:
41
+ self.log_message = self.message
42
+ return wrapper
43
+
44
+
27
45
  class Logger(AbstractLogger):
28
46
  """A global logger proxy to delegating messages to registered loggers.
29
47
 
@@ -83,7 +101,6 @@ class Logger(AbstractLogger):
83
101
  self._console_logger = self._wrap_and_relay(logger)
84
102
 
85
103
  def _wrap_and_relay(self, logger):
86
- logger = LoggerProxy(logger)
87
104
  self._relay_cached_messages(logger)
88
105
  return logger
89
106
 
@@ -127,8 +144,7 @@ class Logger(AbstractLogger):
127
144
 
128
145
  def unregister_logger(self, *loggers):
129
146
  for logger in loggers:
130
- self._other_loggers = [proxy for proxy in self._other_loggers
131
- if proxy.logger is not logger]
147
+ self._other_loggers = [l for l in self._other_loggers if l is not logger]
132
148
 
133
149
  def disable_message_cache(self):
134
150
  self._message_cache = None
@@ -196,44 +212,219 @@ class Logger(AbstractLogger):
196
212
  def disable_library_import_logging(self):
197
213
  self.log_message = self._prev_log_message_handlers.pop()
198
214
 
199
- def start_suite(self, suite):
215
+ def start_suite(self, data, result):
200
216
  for logger in self.start_loggers:
201
- logger.start_suite(suite)
217
+ logger.start_suite(data, result)
202
218
 
203
- def end_suite(self, suite):
219
+ def end_suite(self, data, result):
204
220
  for logger in self.end_loggers:
205
- logger.end_suite(suite)
221
+ logger.end_suite(data, result)
206
222
 
207
- def start_test(self, test):
223
+ def start_test(self, data, result):
208
224
  for logger in self.start_loggers:
209
- logger.start_test(test)
225
+ logger.start_test(data, result)
210
226
 
211
- def end_test(self, test):
227
+ def end_test(self, data, result):
212
228
  for logger in self.end_loggers:
213
- logger.end_test(test)
229
+ logger.end_test(data, result)
214
230
 
215
- def start_keyword(self, keyword):
216
- # TODO: Could _prev_log_message_handlers be used also here?
217
- self._started_keywords += 1
218
- self.log_message = self._log_message
231
+ @start_body_item
232
+ def start_keyword(self, data, result):
219
233
  for logger in self.start_loggers:
220
- logger.start_keyword(keyword)
234
+ logger.start_keyword(data, result)
221
235
 
222
- def end_keyword(self, keyword):
223
- self._started_keywords -= 1
236
+ @end_body_item
237
+ def end_keyword(self, data, result):
224
238
  for logger in self.end_loggers:
225
- logger.end_keyword(keyword)
226
- if not self._started_keywords:
227
- self.log_message = self.message
239
+ logger.end_keyword(data, result)
240
+
241
+ @start_body_item
242
+ def start_user_keyword(self, data, implementation, result):
243
+ for logger in self.start_loggers:
244
+ logger.start_user_keyword(data, implementation, result)
245
+
246
+ @end_body_item
247
+ def end_user_keyword(self, data, implementation, result):
248
+ for logger in self.end_loggers:
249
+ logger.end_user_keyword(data, implementation, result)
250
+
251
+ @start_body_item
252
+ def start_library_keyword(self, data, implementation, result):
253
+ for logger in self.start_loggers:
254
+ logger.start_library_keyword(data, implementation, result)
255
+
256
+ @end_body_item
257
+ def end_library_keyword(self, data, implementation, result):
258
+ for logger in self.end_loggers:
259
+ logger.end_library_keyword(data, implementation, result)
260
+
261
+ @start_body_item
262
+ def start_invalid_keyword(self, data, implementation, result):
263
+ for logger in self.start_loggers:
264
+ logger.start_invalid_keyword(data, implementation, result)
265
+
266
+ @end_body_item
267
+ def end_invalid_keyword(self, data, implementation, result):
268
+ for logger in self.end_loggers:
269
+ logger.end_invalid_keyword(data, implementation, result)
270
+
271
+ @start_body_item
272
+ def start_for(self, data, result):
273
+ for logger in self.start_loggers:
274
+ logger.start_for(data, result)
275
+
276
+ @end_body_item
277
+ def end_for(self, data, result):
278
+ for logger in self.end_loggers:
279
+ logger.end_for(data, result)
280
+
281
+ @start_body_item
282
+ def start_for_iteration(self, data, result):
283
+ for logger in self.start_loggers:
284
+ logger.start_for_iteration(data, result)
285
+
286
+ @end_body_item
287
+ def end_for_iteration(self, data, result):
288
+ for logger in self.end_loggers:
289
+ logger.end_for_iteration(data, result)
290
+
291
+ @start_body_item
292
+ def start_while(self, data, result):
293
+ for logger in self.start_loggers:
294
+ logger.start_while(data, result)
295
+
296
+ @end_body_item
297
+ def end_while(self, data, result):
298
+ for logger in self.end_loggers:
299
+ logger.end_while(data, result)
300
+
301
+ @start_body_item
302
+ def start_while_iteration(self, data, result):
303
+ for logger in self.start_loggers:
304
+ logger.start_while_iteration(data, result)
305
+
306
+ @end_body_item
307
+ def end_while_iteration(self, data, result):
308
+ for logger in self.end_loggers:
309
+ logger.end_while_iteration(data, result)
310
+
311
+ @start_body_item
312
+ def start_if(self, data, result):
313
+ for logger in self.start_loggers:
314
+ logger.start_if(data, result)
315
+
316
+ @end_body_item
317
+ def end_if(self, data, result):
318
+ for logger in self.end_loggers:
319
+ logger.end_if(data, result)
320
+
321
+ @start_body_item
322
+ def start_if_branch(self, data, result):
323
+ for logger in self.start_loggers:
324
+ logger.start_if_branch(data, result)
325
+
326
+ @end_body_item
327
+ def end_if_branch(self, data, result):
328
+ for logger in self.end_loggers:
329
+ logger.end_if_branch(data, result)
330
+
331
+ @start_body_item
332
+ def start_try(self, data, result):
333
+ for logger in self.start_loggers:
334
+ logger.start_try(data, result)
335
+
336
+ @end_body_item
337
+ def end_try(self, data, result):
338
+ for logger in self.end_loggers:
339
+ logger.end_try(data, result)
340
+
341
+ @start_body_item
342
+ def start_try_branch(self, data, result):
343
+ for logger in self.start_loggers:
344
+ logger.start_try_branch(data, result)
345
+
346
+ @end_body_item
347
+ def end_try_branch(self, data, result):
348
+ for logger in self.end_loggers:
349
+ logger.end_try_branch(data, result)
350
+
351
+ @start_body_item
352
+ def start_var(self, data, result):
353
+ for logger in self.start_loggers:
354
+ logger.start_var(data, result)
355
+
356
+ @end_body_item
357
+ def end_var(self, data, result):
358
+ for logger in self.end_loggers:
359
+ logger.end_var(data, result)
360
+
361
+ @start_body_item
362
+ def start_break(self, data, result):
363
+ for logger in self.start_loggers:
364
+ logger.start_break(data, result)
365
+
366
+ @end_body_item
367
+ def end_break(self, data, result):
368
+ for logger in self.end_loggers:
369
+ logger.end_break(data, result)
370
+
371
+ @start_body_item
372
+ def start_continue(self, data, result):
373
+ for logger in self.start_loggers:
374
+ logger.start_continue(data, result)
375
+
376
+ @end_body_item
377
+ def end_continue(self, data, result):
378
+ for logger in self.end_loggers:
379
+ logger.end_continue(data, result)
380
+
381
+ @start_body_item
382
+ def start_return(self, data, result):
383
+ for logger in self.start_loggers:
384
+ logger.start_return(data, result)
385
+
386
+ @end_body_item
387
+ def end_return(self, data, result):
388
+ for logger in self.end_loggers:
389
+ logger.end_return(data, result)
390
+
391
+ @start_body_item
392
+ def start_error(self, data, result):
393
+ for logger in self.start_loggers:
394
+ logger.start_error(data, result)
395
+
396
+ @end_body_item
397
+ def end_error(self, data, result):
398
+ for logger in self.end_loggers:
399
+ logger.end_error(data, result)
228
400
 
229
401
  def imported(self, import_type, name, **attrs):
230
402
  for logger in self:
231
403
  logger.imported(import_type, name, attrs)
232
404
 
233
- def output_file(self, file_type, path):
234
- """Finished output, report, log, debug, or xunit file"""
405
+ def output_file(self, path):
406
+ for logger in self:
407
+ logger.output_file(path)
408
+
409
+ def report_file(self, path):
235
410
  for logger in self:
236
- logger.output_file(file_type, path)
411
+ logger.report_file(path)
412
+
413
+ def log_file(self, path):
414
+ for logger in self:
415
+ logger.log_file(path)
416
+
417
+ def xunit_file(self, path):
418
+ for logger in self:
419
+ logger.xunit_file(path)
420
+
421
+ def debug_file(self, path):
422
+ for logger in self:
423
+ logger.debug_file(path)
424
+
425
+ def result_file(self, kind, path):
426
+ kind_file = getattr(self, f'{kind.lower()}_file')
427
+ kind_file(path)
237
428
 
238
429
  def close(self):
239
430
  for logger in self:
@@ -241,59 +432,4 @@ class Logger(AbstractLogger):
241
432
  self.__init__(register_console_logger=False)
242
433
 
243
434
 
244
- class LoggerProxy(AbstractLoggerProxy):
245
- _methods = ('start_suite', 'end_suite', 'start_test', 'end_test',
246
- 'start_keyword', 'end_keyword', 'message', 'log_message',
247
- 'imported', 'output_file', 'close')
248
-
249
- _start_keyword_methods = {
250
- 'For': 'start_for',
251
- 'ForIteration': 'start_for_iteration',
252
- 'While': 'start_while',
253
- 'WhileIteration': 'start_while_iteration',
254
- 'If': 'start_if',
255
- 'IfBranch': 'start_if_branch',
256
- 'Try': 'start_try',
257
- 'TryBranch': 'start_try_branch',
258
- 'Return': 'start_return',
259
- 'Continue': 'start_continue',
260
- 'Break': 'start_break',
261
- 'Error': 'start_error'
262
- }
263
- _end_keyword_methods = {
264
- 'For': 'end_for',
265
- 'ForIteration': 'end_for_iteration',
266
- 'While': 'end_while',
267
- 'WhileIteration': 'end_while_iteration',
268
- 'If': 'end_if',
269
- 'IfBranch': 'end_if_branch',
270
- 'Try': 'end_try',
271
- 'TryBranch': 'end_try_branch',
272
- 'Return': 'end_return',
273
- 'Continue': 'end_continue',
274
- 'Break': 'end_break',
275
- 'Error': 'end_error'
276
- }
277
-
278
- def start_keyword(self, kw):
279
- # Dispatch start_keyword calls to more precise methods when logger
280
- # implements them. This horrible hack is needed because internal logger
281
- # knows only about keywords. It should be rewritten.
282
- name = self._start_keyword_methods.get(type(kw.result).__name__)
283
- if name and hasattr(self.logger, name):
284
- method = getattr(self.logger, name)
285
- else:
286
- method = self.logger.start_keyword
287
- method(kw)
288
-
289
- def end_keyword(self, kw):
290
- # See start_keyword comment for explanation of this horrible hack.
291
- name = self._end_keyword_methods.get(type(kw.result).__name__)
292
- if name and hasattr(self.logger, name):
293
- method = getattr(self.logger, name)
294
- else:
295
- method = self.logger.end_keyword
296
- method(kw)
297
-
298
-
299
435
  LOGGER = Logger()
@@ -0,0 +1,215 @@
1
+ # Copyright 2008-2015 Nokia Networks
2
+ # Copyright 2016- Robot Framework Foundation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from pathlib import Path
17
+ from typing import Literal, TYPE_CHECKING
18
+
19
+ if TYPE_CHECKING:
20
+ from robot import running, result, model
21
+
22
+
23
+ class LoggerApi:
24
+
25
+ def start_suite(self, data: 'running.TestSuite', result: 'result.TestSuite'):
26
+ pass
27
+
28
+ def end_suite(self, data: 'running.TestSuite', result: 'result.TestSuite'):
29
+ pass
30
+
31
+ def start_test(self, data: 'running.TestCase', result: 'result.TestCase'):
32
+ pass
33
+
34
+ def end_test(self, data: 'running.TestCase', result: 'result.TestCase'):
35
+ pass
36
+
37
+ def start_keyword(self, data: 'running.Keyword', result: 'result.Keyword'):
38
+ self.start_body_item(data, result)
39
+
40
+ def end_keyword(self, data: 'running.Keyword', result: 'result.Keyword'):
41
+ self.end_body_item(data, result)
42
+
43
+ def start_user_keyword(self, data: 'running.Keyword',
44
+ implementation: 'running.UserKeyword',
45
+ result: 'result.Keyword'):
46
+ self.start_keyword(data, result)
47
+
48
+ def end_user_keyword(self, data: 'running.Keyword',
49
+ implementation: 'running.UserKeyword',
50
+ result: 'result.Keyword'):
51
+ self.end_keyword(data, result)
52
+
53
+ def start_library_keyword(self, data: 'running.Keyword',
54
+ implementation: 'running.LibraryKeyword',
55
+ result: 'result.Keyword'):
56
+ self.start_keyword(data, result)
57
+
58
+ def end_library_keyword(self, data: 'running.Keyword',
59
+ implementation: 'running.LibraryKeyword',
60
+ result: 'result.Keyword'):
61
+ self.end_keyword(data, result)
62
+
63
+ def start_invalid_keyword(self, data: 'running.Keyword',
64
+ implementation: 'running.KeywordImplementation',
65
+ result: 'result.Keyword'):
66
+ self.start_keyword(data, result)
67
+
68
+ def end_invalid_keyword(self, data: 'running.Keyword',
69
+ implementation: 'running.KeywordImplementation',
70
+ result: 'result.Keyword'):
71
+ self.end_keyword(data, result)
72
+
73
+ def start_for(self, data: 'running.For', result: 'result.For'):
74
+ self.start_body_item(data, result)
75
+
76
+ def end_for(self, data: 'running.For', result: 'result.For'):
77
+ self.end_body_item(data, result)
78
+
79
+ def start_for_iteration(self, data: 'running.ForIteration',
80
+ result: 'result.ForIteration'):
81
+ self.start_body_item(data, result)
82
+
83
+ def end_for_iteration(self, data: 'running.ForIteration',
84
+ result: 'result.ForIteration'):
85
+ self.end_body_item(data, result)
86
+
87
+ def start_while(self, data: 'running.While', result: 'result.While'):
88
+ self.start_body_item(data, result)
89
+
90
+ def end_while(self, data: 'running.While', result: 'result.While'):
91
+ self.end_body_item(data, result)
92
+
93
+ def start_while_iteration(self, data: 'running.WhileIteration',
94
+ result: 'result.WhileIteration'):
95
+ self.start_body_item(data, result)
96
+
97
+ def end_while_iteration(self, data: 'running.WhileIteration',
98
+ result: 'result.WhileIteration'):
99
+ self.end_body_item(data, result)
100
+
101
+ def start_if(self, data: 'running.If', result: 'result.If'):
102
+ self.start_body_item(data, result)
103
+
104
+ def end_if(self, data: 'running.If', result: 'result.If'):
105
+ self.end_body_item(data, result)
106
+
107
+ def start_if_branch(self, data: 'running.IfBranch', result: 'result.IfBranch'):
108
+ self.start_body_item(data, result)
109
+
110
+ def end_if_branch(self, data: 'running.IfBranch', result: 'result.IfBranch'):
111
+ self.end_body_item(data, result)
112
+
113
+ def start_try(self, data: 'running.Try', result: 'result.Try'):
114
+ self.start_body_item(data, result)
115
+
116
+ def end_try(self, data: 'running.Try', result: 'result.Try'):
117
+ self.end_body_item(data, result)
118
+
119
+ def start_try_branch(self, data: 'running.TryBranch', result: 'result.TryBranch'):
120
+ self.start_body_item(data, result)
121
+
122
+ def end_try_branch(self, data: 'running.TryBranch', result: 'result.TryBranch'):
123
+ self.end_body_item(data, result)
124
+
125
+ def start_var(self, data: 'running.Var', result: 'result.Var'):
126
+ self.start_body_item(data, result)
127
+
128
+ def end_var(self, data: 'running.Var', result: 'result.Var'):
129
+ self.end_body_item(data, result)
130
+
131
+ def start_break(self, data: 'running.Break', result: 'result.Break'):
132
+ self.start_body_item(data, result)
133
+
134
+ def end_break(self, data: 'running.Break', result: 'result.Break'):
135
+ self.end_body_item(data, result)
136
+
137
+ def start_continue(self, data: 'running.Continue', result: 'result.Continue'):
138
+ self.start_body_item(data, result)
139
+
140
+ def end_continue(self, data: 'running.Continue', result: 'result.Continue'):
141
+ self.end_body_item(data, result)
142
+
143
+ def start_return(self, data: 'running.Return', result: 'result.Return'):
144
+ self.start_body_item(data, result)
145
+
146
+ def end_return(self, data: 'running.Return', result: 'result.Return'):
147
+ self.end_body_item(data, result)
148
+
149
+ def start_error(self, data: 'running.Error', result: 'result.Error'):
150
+ self.start_body_item(data, result)
151
+
152
+ def end_error(self, data: 'running.Error', result: 'result.Error'):
153
+ self.end_body_item(data, result)
154
+
155
+ def start_body_item(self, data, result):
156
+ pass
157
+
158
+ def end_body_item(self, data, result):
159
+ pass
160
+
161
+ def log_message(self, message: 'model.Message'):
162
+ pass
163
+
164
+ def message(self, message: 'model.Message'):
165
+ pass
166
+
167
+ def output_file(self, path: Path):
168
+ """Called when XML output file is closed.
169
+
170
+ Calls :meth:`result_file` by default.
171
+ """
172
+ self.result_file('Output', path)
173
+
174
+ def report_file(self, path: Path):
175
+ """Called when report file is closed.
176
+
177
+ Calls :meth:`result_file` by default.
178
+ """
179
+ self.result_file('Report', path)
180
+
181
+ def log_file(self, path: Path):
182
+ """Called when log file is closed.
183
+
184
+ Calls :meth:`result_file` by default.
185
+ """
186
+ self.result_file('Log', path)
187
+
188
+ def xunit_file(self, path: Path):
189
+ """Called when xunit file is closed.
190
+
191
+ Calls :meth:`result_file` by default.
192
+ """
193
+ self.result_file('XUnit', path)
194
+
195
+ def debug_file(self, path: Path):
196
+ """Called when debug file is closed.
197
+
198
+ Calls :meth:`result_file` by default.
199
+ """
200
+ self.result_file('Debug', path)
201
+
202
+ def result_file(self, kind: Literal['Output', 'Report', 'Log', 'XUnit', 'Debug'],
203
+ path: Path):
204
+ """Called when any result file is closed by default.
205
+
206
+ ``kind`` specifies the file type. This method is not called if a result
207
+ file specific method like :meth:`output_file` is implemented.
208
+ """
209
+ pass
210
+
211
+ def imported(self, import_type: str, name: str, attrs):
212
+ pass
213
+
214
+ def close(self):
215
+ pass
@@ -14,10 +14,12 @@
14
14
  # limitations under the License.
15
15
 
16
16
  import sys
17
+ from datetime import datetime
18
+ from typing import Callable, Literal
17
19
 
18
20
  from robot.errors import DataError
19
- from robot.model import Message as BaseMessage
20
- from robot.utils import get_timestamp, is_string, safe_str, console_encode
21
+ from robot.model import Message as BaseMessage, MessageLevel
22
+ from robot.utils import console_encode, safe_str
21
23
 
22
24
 
23
25
  LEVELS = {
@@ -30,6 +32,7 @@ LEVELS = {
30
32
  'DEBUG' : 1,
31
33
  'TRACE' : 0,
32
34
  }
35
+ PseudoLevel = Literal['HTML', 'CONSOLE']
33
36
 
34
37
 
35
38
  def write_to_console(msg, newline=True, stream='stdout'):
@@ -88,38 +91,35 @@ class AbstractLogger:
88
91
  class Message(BaseMessage):
89
92
  __slots__ = ['_message']
90
93
 
91
- def __init__(self, message, level='INFO', html=False, timestamp=None):
92
- message = self._normalize_message(message)
94
+ def __init__(self, message: 'str|Callable[[], str]',
95
+ level: 'MessageLevel|PseudoLevel' = 'INFO',
96
+ html: bool = False,
97
+ timestamp: 'datetime|str|None' = None):
93
98
  level, html = self._get_level_and_html(level, html)
94
- timestamp = timestamp or get_timestamp()
95
- super().__init__(message, level, html, timestamp)
96
-
97
- def _normalize_message(self, msg):
98
- if callable(msg):
99
- return msg
100
- if not is_string(msg):
101
- msg = safe_str(msg)
102
- if '\r\n' in msg:
103
- msg = msg.replace('\r\n', '\n')
104
- return msg
105
-
106
- def _get_level_and_html(self, level, html):
99
+ super().__init__(message, level, html, timestamp or datetime.now())
100
+
101
+ def _get_level_and_html(self, level, html) -> 'tuple[MessageLevel, bool]':
107
102
  level = level.upper()
108
103
  if level == 'HTML':
109
104
  return 'INFO', True
110
105
  if level == 'CONSOLE':
111
- level = 'INFO'
112
- if level not in LEVELS:
113
- raise DataError("Invalid log level '%s'." % level)
114
- return level, html
106
+ return 'INFO', html
107
+ if level in LEVELS:
108
+ return level, html
109
+ raise DataError(f"Invalid log level '{level}'.")
115
110
 
116
111
  @property
117
- def message(self):
112
+ def message(self) -> str:
118
113
  self.resolve_delayed_message()
119
114
  return self._message
120
115
 
121
116
  @message.setter
122
- def message(self, message):
117
+ def message(self, message: 'str|Callable[[], str]'):
118
+ if not callable(message):
119
+ if not isinstance(message, str):
120
+ message = safe_str(message)
121
+ if '\r\n' in message:
122
+ message = message.replace('\r\n', '\n')
123
123
  self._message = message
124
124
 
125
125
  def resolve_delayed_message(self):
@@ -146,36 +146,3 @@ class IsLogged:
146
146
  return LEVELS[level.upper()]
147
147
  except KeyError:
148
148
  raise DataError("Invalid log level '%s'." % level)
149
-
150
-
151
- class AbstractLoggerProxy:
152
- _methods = None
153
- _no_method = lambda *args: None
154
-
155
- def __init__(self, logger, method_names=None, prefix=None):
156
- self.logger = logger
157
- for name in method_names or self._methods:
158
- # Allow extending classes to implement some of the messages themselves.
159
- if hasattr(self, name):
160
- if hasattr(logger, name):
161
- continue
162
- target = logger
163
- else:
164
- target = self
165
- setattr(target, name, self._get_method(logger, name, prefix))
166
-
167
- def _get_method(self, logger, name, prefix):
168
- for method_name in self._get_method_names(name, prefix):
169
- if hasattr(logger, method_name):
170
- return getattr(logger, method_name)
171
- return self._no_method
172
-
173
- def _get_method_names(self, name, prefix):
174
- names = [name, self._toCamelCase(name)] if '_' in name else [name]
175
- if prefix:
176
- names += [prefix + name for name in names]
177
- return names
178
-
179
- def _toCamelCase(self, name):
180
- parts = name.split('_')
181
- return ''.join([parts[0]] + [part.capitalize() for part in parts[1:]])