robotframework 6.1rc1__zip → 7.0__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. {robotframework-6.1rc1 → robotframework-7.0}/INSTALL.rst +25 -25
  2. {robotframework-6.1rc1 → robotframework-7.0}/PKG-INFO +6 -8
  3. {robotframework-6.1rc1 → robotframework-7.0}/README.rst +3 -2
  4. {robotframework-6.1rc1 → robotframework-7.0}/setup.py +3 -6
  5. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/__init__.py +4 -1
  6. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/deco.py +60 -14
  7. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/exceptions.py +6 -6
  8. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/interfaces.py +403 -68
  9. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/logger.py +27 -20
  10. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/api/parsing.py +4 -2
  11. robotframework-7.0/src/robot/api/py.typed +0 -0
  12. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/gatherfailed.py +2 -2
  13. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/languages.py +61 -25
  14. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/settings.py +21 -14
  15. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/common/storage.js +11 -6
  16. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/htmlfilewriter.py +1 -1
  17. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.css +10 -2
  18. {robotframework-6.1rc1 → 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.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/doc_formatting.css +13 -7
  21. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/log.css +51 -10
  22. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/log.html +14 -23
  23. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/model.js +2 -4
  24. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/report.css +83 -19
  25. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/report.html +22 -7
  26. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/testdata.js +10 -3
  27. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/view.js +84 -0
  28. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/template.py +3 -3
  29. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/builder.py +0 -8
  30. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/datatypes.py +9 -10
  31. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/htmlutils.py +4 -7
  32. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/jsonbuilder.py +38 -20
  33. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/model.py +21 -28
  34. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/robotbuilder.py +50 -31
  35. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/standardtypes.py +9 -1
  36. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/xmlbuilder.py +35 -20
  37. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/xmlwriter.py +18 -38
  38. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/BuiltIn.py +255 -205
  39. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Collections.py +384 -240
  40. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/DateTime.py +73 -60
  41. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/OperatingSystem.py +6 -5
  42. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Process.py +26 -27
  43. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Remote.py +40 -36
  44. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/String.py +66 -76
  45. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/XML.py +66 -59
  46. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/__init__.py +2 -2
  47. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/dialogs_py.py +14 -2
  48. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/__init__.py +5 -5
  49. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/body.py +44 -13
  50. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/configurer.py +19 -15
  51. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/control.py +230 -88
  52. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/filter.py +31 -25
  53. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/itemlist.py +9 -8
  54. robotframework-7.0/src/robot/model/keyword.py +77 -0
  55. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/message.py +19 -10
  56. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/modelobject.py +27 -15
  57. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/modifier.py +1 -1
  58. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/namepatterns.py +3 -25
  59. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/stats.py +9 -15
  60. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/tags.py +1 -1
  61. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/testcase.py +15 -27
  62. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/testsuite.py +44 -28
  63. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/visitor.py +35 -8
  64. robotframework-7.0/src/robot/output/console/dotted.py +90 -0
  65. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/quiet.py +3 -2
  66. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/verbose.py +61 -61
  67. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/debugfile.py +39 -24
  68. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/filelogger.py +18 -15
  69. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/librarylogger.py +3 -2
  70. robotframework-7.0/src/robot/output/listeners.py +753 -0
  71. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/logger.py +216 -80
  72. robotframework-7.0/src/robot/output/loggerapi.py +215 -0
  73. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/loggerhelper.py +23 -56
  74. robotframework-7.0/src/robot/output/output.py +185 -0
  75. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/stdoutlogsplitter.py +8 -5
  76. robotframework-7.0/src/robot/output/xmllogger.py +459 -0
  77. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/blocklexers.py +17 -13
  78. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/context.py +12 -2
  79. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/lexer.py +1 -1
  80. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/settings.py +6 -3
  81. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/statementlexers.py +39 -10
  82. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/tokens.py +27 -29
  83. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/model/blocks.py +19 -6
  84. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/model/statements.py +193 -94
  85. robotframework-7.0/src/robot/parsing/model/visitor.py +100 -0
  86. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/rebot.py +2 -0
  87. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  88. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jsbuildingcontext.py +8 -6
  89. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jsmodelbuilders.py +88 -61
  90. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/logreportwriters.py +16 -10
  91. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/outputwriter.py +18 -2
  92. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/resultwriter.py +4 -4
  93. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/stringcache.py +3 -3
  94. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/xunitwriter.py +15 -21
  95. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/__init__.py +3 -2
  96. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/configurer.py +12 -9
  97. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/executionresult.py +56 -8
  98. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/flattenkeywordmatcher.py +48 -9
  99. robotframework-7.0/src/robot/result/keywordremover.py +207 -0
  100. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/merger.py +1 -1
  101. robotframework-7.0/src/robot/result/model.py +1185 -0
  102. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/modeldeprecation.py +9 -3
  103. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/resultbuilder.py +46 -36
  104. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/xmlelementhandlers.py +83 -43
  105. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/run.py +3 -1
  106. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/__init__.py +14 -4
  107. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/__init__.py +2 -1
  108. robotframework-7.0/src/robot/running/arguments/argumentconverter.py +100 -0
  109. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentmapper.py +26 -24
  110. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentparser.py +85 -61
  111. robotframework-7.0/src/robot/running/arguments/argumentresolver.py +158 -0
  112. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentspec.py +83 -116
  113. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/argumentvalidator.py +33 -27
  114. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/customconverters.py +15 -12
  115. robotframework-7.0/src/robot/running/arguments/embedded.py +145 -0
  116. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/arguments/typeconverters.py +268 -220
  117. robotframework-7.0/src/robot/running/arguments/typeinfo.py +317 -0
  118. robotframework-7.0/src/robot/running/arguments/typeinfoparser.py +219 -0
  119. robotframework-7.0/src/robot/running/arguments/typevalidator.py +60 -0
  120. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/bodyrunner.py +147 -129
  121. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/builders.py +17 -26
  122. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/parsers.py +17 -11
  123. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/settings.py +9 -17
  124. robotframework-7.0/src/robot/running/builder/transformers.py +535 -0
  125. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/context.py +113 -31
  126. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/dynamicmethods.py +62 -34
  127. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/importer.py +27 -49
  128. robotframework-7.0/src/robot/running/invalidkeyword.py +67 -0
  129. robotframework-7.0/src/robot/running/keywordfinder.py +91 -0
  130. robotframework-7.0/src/robot/running/keywordimplementation.py +164 -0
  131. robotframework-7.0/src/robot/running/librarykeyword.py +392 -0
  132. robotframework-7.0/src/robot/running/librarykeywordrunner.py +250 -0
  133. robotframework-7.0/src/robot/running/libraryscopes.py +115 -0
  134. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/model.py +198 -337
  135. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/namespace.py +124 -137
  136. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/outputcapture.py +20 -12
  137. robotframework-7.0/src/robot/running/resourcemodel.py +448 -0
  138. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/statusreporter.py +16 -13
  139. robotframework-7.0/src/robot/running/suiterunner.py +265 -0
  140. robotframework-7.0/src/robot/running/testlibraries.py +500 -0
  141. robotframework-7.0/src/robot/running/userkeywordrunner.py +260 -0
  142. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/testdoc.py +18 -13
  143. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/__init__.py +53 -35
  144. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/connectioncache.py +64 -59
  145. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/dotdict.py +3 -0
  146. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/encodingsniffer.py +9 -4
  147. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/escaping.py +19 -19
  148. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/importer.py +2 -2
  149. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/markupwriters.py +23 -15
  150. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/misc.py +1 -2
  151. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/normalizing.py +9 -24
  152. robotframework-7.0/src/robot/utils/notset.py +33 -0
  153. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/platform.py +15 -5
  154. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotio.py +9 -9
  155. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotpath.py +1 -0
  156. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robottime.py +122 -90
  157. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robottypes.py +21 -31
  158. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/setter.py +0 -5
  159. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/text.py +7 -4
  160. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/unic.py +2 -2
  161. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/__init__.py +2 -2
  162. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/assigner.py +17 -19
  163. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/evaluation.py +20 -17
  164. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/filesetter.py +80 -80
  165. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/replacer.py +33 -36
  166. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/scopes.py +17 -12
  167. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/search.py +66 -41
  168. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/store.py +14 -16
  169. robotframework-7.0/src/robot/variables/tablesetter.py +164 -0
  170. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/variables.py +1 -1
  171. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/version.py +1 -1
  172. {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/PKG-INFO +6 -8
  173. {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/SOURCES.txt +10 -8
  174. {robotframework-6.1rc1 → robotframework-7.0}/tasks.py +6 -6
  175. robotframework-6.1rc1/src/robot/htmldata/rebot/common.css +0 -239
  176. robotframework-6.1rc1/src/robot/libraries/Reserved.py +0 -48
  177. robotframework-6.1rc1/src/robot/model/keyword.py +0 -173
  178. robotframework-6.1rc1/src/robot/output/console/dotted.py +0 -90
  179. robotframework-6.1rc1/src/robot/output/listenerarguments.py +0 -165
  180. robotframework-6.1rc1/src/robot/output/listenermethods.py +0 -113
  181. robotframework-6.1rc1/src/robot/output/listeners.py +0 -174
  182. robotframework-6.1rc1/src/robot/output/output.py +0 -95
  183. robotframework-6.1rc1/src/robot/output/xmllogger.py +0 -354
  184. robotframework-6.1rc1/src/robot/parsing/model/visitor.py +0 -67
  185. robotframework-6.1rc1/src/robot/result/keywordremover.py +0 -183
  186. robotframework-6.1rc1/src/robot/result/model.py +0 -957
  187. robotframework-6.1rc1/src/robot/running/arguments/argumentconverter.py +0 -79
  188. robotframework-6.1rc1/src/robot/running/arguments/argumentresolver.py +0 -131
  189. robotframework-6.1rc1/src/robot/running/arguments/embedded.py +0 -146
  190. robotframework-6.1rc1/src/robot/running/arguments/typevalidator.py +0 -56
  191. robotframework-6.1rc1/src/robot/running/builder/transformers.py +0 -642
  192. robotframework-6.1rc1/src/robot/running/handlers.py +0 -321
  193. robotframework-6.1rc1/src/robot/running/handlerstore.py +0 -66
  194. robotframework-6.1rc1/src/robot/running/librarykeywordrunner.py +0 -238
  195. robotframework-6.1rc1/src/robot/running/libraryscopes.py +0 -97
  196. robotframework-6.1rc1/src/robot/running/modelcombiner.py +0 -32
  197. robotframework-6.1rc1/src/robot/running/suiterunner.py +0 -249
  198. robotframework-6.1rc1/src/robot/running/testlibraries.py +0 -420
  199. robotframework-6.1rc1/src/robot/running/usererrorhandler.py +0 -75
  200. robotframework-6.1rc1/src/robot/running/userkeyword.py +0 -111
  201. robotframework-6.1rc1/src/robot/running/userkeywordrunner.py +0 -274
  202. robotframework-6.1rc1/src/robot/variables/tablesetter.py +0 -156
  203. {robotframework-6.1rc1 → robotframework-7.0}/AUTHORS.rst +0 -0
  204. {robotframework-6.1rc1 → robotframework-7.0}/BUILD.rst +0 -0
  205. {robotframework-6.1rc1 → robotframework-7.0}/CONTRIBUTING.rst +0 -0
  206. {robotframework-6.1rc1 → robotframework-7.0}/COPYRIGHT.txt +0 -0
  207. {robotframework-6.1rc1 → robotframework-7.0}/LICENSE.txt +0 -0
  208. {robotframework-6.1rc1 → robotframework-7.0}/MANIFEST.in +0 -0
  209. {robotframework-6.1rc1 → robotframework-7.0}/setup.cfg +0 -0
  210. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/__init__.py +0 -0
  211. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/__main__.py +0 -0
  212. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/conf/__init__.py +0 -0
  213. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/errors.py +0 -0
  214. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/__init__.py +0 -0
  215. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/common/__init__.py +0 -0
  216. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/common/js_disabled.css +0 -0
  217. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/jsonwriter.py +0 -0
  218. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/__init__.py +0 -0
  219. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  220. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.min.js +0 -0
  221. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  222. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  223. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  224. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/__init__.py +0 -0
  225. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  226. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/print.css +0 -0
  227. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/libdoc/pygments.css +0 -0
  228. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/__init__.py +0 -0
  229. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/fileloading.js +0 -0
  230. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/log.js +0 -0
  231. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/print.css +0 -0
  232. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/rebot/util.js +0 -0
  233. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/testdoc/__init__.py +0 -0
  234. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  235. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  236. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdoc.py +0 -0
  237. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/__init__.py +0 -0
  238. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/consoleviewer.py +0 -0
  239. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/htmlwriter.py +0 -0
  240. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/jsonwriter.py +0 -0
  241. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/output.py +0 -0
  242. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libdocpkg/writer.py +0 -0
  243. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Dialogs.py +0 -0
  244. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Easter.py +0 -0
  245. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Screenshot.py +0 -0
  246. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/libraries/Telnet.py +0 -0
  247. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/fixture.py +0 -0
  248. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/metadata.py +0 -0
  249. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/statistics.py +0 -0
  250. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/suitestatistics.py +0 -0
  251. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/tagsetter.py +0 -0
  252. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/tagstatistics.py +0 -0
  253. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/model/totalstatistics.py +0 -0
  254. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/__init__.py +0 -0
  255. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/__init__.py +0 -0
  256. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/console/highlighting.py +0 -0
  257. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/output/pyloggingconf.py +0 -0
  258. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/__init__.py +0 -0
  259. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/__init__.py +0 -0
  260. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/lexer/tokenizer.py +0 -0
  261. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/model/__init__.py +0 -0
  262. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/__init__.py +0 -0
  263. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/blockparsers.py +0 -0
  264. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/fileparser.py +0 -0
  265. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/parser/parser.py +0 -0
  266. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/parsing/suitestructure.py +0 -0
  267. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/pythonpathsetter.py +0 -0
  268. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/__init__.py +0 -0
  269. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jsexecutionresult.py +0 -0
  270. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/reporting/jswriter.py +0 -0
  271. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/executionerrors.py +0 -0
  272. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/messagefilter.py +0 -0
  273. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/suiteteardownfailed.py +0 -0
  274. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/result/visitor.py +0 -0
  275. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/builder/__init__.py +0 -0
  276. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/randomizer.py +0 -0
  277. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/runkwregister.py +0 -0
  278. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/signalhandler.py +0 -0
  279. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/status.py +0 -0
  280. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/timeouts/__init__.py +0 -0
  281. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/timeouts/posix.py +0 -0
  282. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/running/timeouts/windows.py +0 -0
  283. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/application.py +0 -0
  284. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/argumentparser.py +0 -0
  285. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/asserts.py +0 -0
  286. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/charwidth.py +0 -0
  287. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/compress.py +0 -0
  288. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/encoding.py +0 -0
  289. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/error.py +0 -0
  290. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/etreewrapper.py +0 -0
  291. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/filereader.py +0 -0
  292. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/frange.py +0 -0
  293. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/htmlformatters.py +0 -0
  294. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/markuputils.py +0 -0
  295. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/match.py +0 -0
  296. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/recommendations.py +0 -0
  297. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/restreader.py +0 -0
  298. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotenv.py +0 -0
  299. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/robotinspect.py +0 -0
  300. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/sortable.py +0 -0
  301. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/utils/typehints.py +0 -0
  302. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/finders.py +0 -0
  303. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/notfound.py +0 -0
  304. {robotframework-6.1rc1 → robotframework-7.0}/src/robot/variables/resolvable.py +0 -0
  305. {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/dependency_links.txt +0 -0
  306. {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/entry_points.txt +0 -0
  307. {robotframework-6.1rc1 → robotframework-7.0}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -0,0 +1,90 @@
1
+ # Copyright 2008-2015 Nokia Networks
2
+ # Copyright 2016- Robot Framework Foundation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import sys
17
+
18
+ from robot.model import SuiteVisitor
19
+ from robot.result import TestCase, TestSuite
20
+ from robot.utils import plural_or_not as s, secs_to_timestr
21
+
22
+ from .highlighting import HighlightingStream
23
+ from ..loggerapi import LoggerApi
24
+
25
+
26
+ class DottedOutput(LoggerApi):
27
+
28
+ def __init__(self, width=78, colors='AUTO', stdout=None, stderr=None):
29
+ self.width = width
30
+ self.stdout = HighlightingStream(stdout or sys.__stdout__, colors)
31
+ self.stderr = HighlightingStream(stderr or sys.__stderr__, colors)
32
+ self.markers_on_row = 0
33
+
34
+ def start_suite(self, data, result):
35
+ if not data.parent:
36
+ count = data.test_count
37
+ ts = ('test' if not data.rpa else 'task') + s(count)
38
+ self.stdout.write(f"Running suite '{result.name}' with {count} {ts}.\n")
39
+ self.stdout.write('=' * self.width + '\n')
40
+
41
+ def end_test(self, data, result):
42
+ if self.markers_on_row == self.width:
43
+ self.stdout.write('\n')
44
+ self.markers_on_row = 0
45
+ self.markers_on_row += 1
46
+ if result.passed:
47
+ self.stdout.write('.')
48
+ elif result.skipped:
49
+ self.stdout.highlight('s', 'SKIP')
50
+ elif result.tags.robot('exit'):
51
+ self.stdout.write('x')
52
+ else:
53
+ self.stdout.highlight('F', 'FAIL')
54
+
55
+ def end_suite(self, data, result):
56
+ if not data.parent:
57
+ self.stdout.write('\n')
58
+ StatusReporter(self.stdout, self.width).report(result)
59
+ self.stdout.write('\n')
60
+
61
+ def message(self, msg):
62
+ if msg.level in ('WARN', 'ERROR'):
63
+ self.stderr.error(msg.message, msg.level)
64
+
65
+ def result_file(self, kind, path):
66
+ self.stdout.write(f"{kind+':':8} {path}\n")
67
+
68
+
69
+ class StatusReporter(SuiteVisitor):
70
+
71
+ def __init__(self, stream, width):
72
+ self.stream = stream
73
+ self.width = width
74
+
75
+ def report(self, suite: TestSuite):
76
+ suite.visit(self)
77
+ stats = suite.statistics
78
+ ts = ('test' if not suite.rpa else 'task') + s(stats.total)
79
+ elapsed = secs_to_timestr(suite.elapsed_time)
80
+ self.stream.write(f"{'=' * self.width}\nRun suite '{suite.name}' with "
81
+ f"{stats.total} {ts} in {elapsed}.\n\n")
82
+ ed = 'ED' if suite.status != 'SKIP' else 'PED'
83
+ self.stream.highlight(suite.status + ed, suite.status)
84
+ self.stream.write(f'\n{stats.message}\n')
85
+
86
+ def visit_test(self, test: TestCase):
87
+ if test.failed and not test.tags.robot('exit'):
88
+ self.stream.write('-' * self.width + '\n')
89
+ self.stream.highlight('FAIL')
90
+ self.stream.write(f': {test.full_name}\n{test.message.strip()}\n')
@@ -16,9 +16,10 @@
16
16
  import sys
17
17
 
18
18
  from .highlighting import HighlightingStream
19
+ from ..loggerapi import LoggerApi
19
20
 
20
21
 
21
- class QuietOutput:
22
+ class QuietOutput(LoggerApi):
22
23
 
23
24
  def __init__(self, colors='AUTO', stderr=None):
24
25
  self._stderr = HighlightingStream(stderr or sys.__stderr__, colors)
@@ -28,5 +29,5 @@ class QuietOutput:
28
29
  self._stderr.error(msg.message, msg.level)
29
30
 
30
31
 
31
- class NoOutput:
32
+ class NoOutput(LoggerApi):
32
33
  pass
@@ -16,58 +16,58 @@
16
16
  import sys
17
17
 
18
18
  from robot.errors import DataError
19
- from robot.utils import (get_console_length, getshortdoc, isatty,
20
- pad_console_length)
19
+ from robot.utils import get_console_length, getshortdoc, isatty, pad_console_length
21
20
 
22
21
  from .highlighting import HighlightingStream
22
+ from ..loggerapi import LoggerApi
23
23
 
24
24
 
25
- class VerboseOutput:
25
+ class VerboseOutput(LoggerApi):
26
26
 
27
27
  def __init__(self, width=78, colors='AUTO', markers='AUTO', stdout=None,
28
28
  stderr=None):
29
- self._writer = VerboseWriter(width, colors, markers, stdout, stderr)
30
- self._started = False
31
- self._started_keywords = 0
32
- self._running_test = False
33
-
34
- def start_suite(self, suite):
35
- if not self._started:
36
- self._writer.suite_separator()
37
- self._started = True
38
- self._writer.info(suite.longname, suite.doc, start_suite=True)
39
- self._writer.suite_separator()
40
-
41
- def end_suite(self, suite):
42
- self._writer.info(suite.longname, suite.doc)
43
- self._writer.status(suite.status)
44
- self._writer.message(suite.full_message)
45
- self._writer.suite_separator()
46
-
47
- def start_test(self, test):
48
- self._writer.info(test.name, test.doc)
49
- self._running_test = True
50
-
51
- def end_test(self, test):
52
- self._writer.status(test.status, clear=True)
53
- self._writer.message(test.message)
54
- self._writer.test_separator()
55
- self._running_test = False
56
-
57
- def start_keyword(self, kw):
58
- self._started_keywords += 1
59
-
60
- def end_keyword(self, kw):
61
- self._started_keywords -= 1
62
- if self._running_test and not self._started_keywords:
63
- self._writer.keyword_marker(kw.status)
29
+ self.writer = VerboseWriter(width, colors, markers, stdout, stderr)
30
+ self.started = False
31
+ self.started_keywords = 0
32
+ self.running_test = False
33
+
34
+ def start_suite(self, data, result):
35
+ if not self.started:
36
+ self.writer.suite_separator()
37
+ self.started = True
38
+ self.writer.info(data.full_name, result.doc, start_suite=True)
39
+ self.writer.suite_separator()
40
+
41
+ def end_suite(self, data, result):
42
+ self.writer.info(data.full_name, result.doc)
43
+ self.writer.status(result.status)
44
+ self.writer.message(result.full_message)
45
+ self.writer.suite_separator()
46
+
47
+ def start_test(self, data, result):
48
+ self.writer.info(result.name, result.doc)
49
+ self.running_test = True
50
+
51
+ def end_test(self, data, result):
52
+ self.writer.status(result.status, clear=True)
53
+ self.writer.message(result.message)
54
+ self.writer.test_separator()
55
+ self.running_test = False
56
+
57
+ def start_body_item(self, data, result):
58
+ self.started_keywords += 1
59
+
60
+ def end_body_item(self, data, result):
61
+ self.started_keywords -= 1
62
+ if self.running_test and not self.started_keywords:
63
+ self.writer.keyword_marker(result.status)
64
64
 
65
65
  def message(self, msg):
66
66
  if msg.level in ('WARN', 'ERROR'):
67
- self._writer.error(msg.message, msg.level, clear=self._running_test)
67
+ self.writer.error(msg.message, msg.level, clear=self.running_test)
68
68
 
69
- def output_file(self, name, path):
70
- self._writer.output(name, path)
69
+ def result_file(self, kind, path):
70
+ self.writer.output(kind, path)
71
71
 
72
72
 
73
73
  class VerboseWriter:
@@ -75,10 +75,10 @@ class VerboseWriter:
75
75
 
76
76
  def __init__(self, width=78, colors='AUTO', markers='AUTO', stdout=None,
77
77
  stderr=None):
78
- self._width = width
79
- self._stdout = HighlightingStream(stdout or sys.__stdout__, colors)
80
- self._stderr = HighlightingStream(stderr or sys.__stderr__, colors)
81
- self._keyword_marker = KeywordMarker(self._stdout, markers)
78
+ self.width = width
79
+ self.stdout = HighlightingStream(stdout or sys.__stdout__, colors)
80
+ self.stderr = HighlightingStream(stderr or sys.__stderr__, colors)
81
+ self._keyword_marker = KeywordMarker(self.stdout, markers)
82
82
  self._last_info = None
83
83
 
84
84
  def info(self, name, doc, start_suite=False):
@@ -88,18 +88,18 @@ class VerboseWriter:
88
88
  self._keyword_marker.reset_count()
89
89
 
90
90
  def _write_info(self):
91
- self._stdout.write(self._last_info)
91
+ self.stdout.write(self._last_info)
92
92
 
93
93
  def _get_info_width_and_separator(self, start_suite):
94
94
  if start_suite:
95
- return self._width, '\n'
96
- return self._width - self._status_length - 1, ' '
95
+ return self.width, '\n'
96
+ return self.width - self._status_length - 1, ' '
97
97
 
98
98
  def _get_info(self, name, doc, width):
99
99
  if get_console_length(name) > width:
100
100
  return pad_console_length(name, width)
101
101
  doc = getshortdoc(doc, linesep=' ')
102
- info = '%s :: %s' % (name, doc) if doc else name
102
+ info = f'{name} :: {doc}' if doc else name
103
103
  return pad_console_length(info, width)
104
104
 
105
105
  def suite_separator(self):
@@ -109,14 +109,14 @@ class VerboseWriter:
109
109
  self._fill('-')
110
110
 
111
111
  def _fill(self, char):
112
- self._stdout.write('%s\n' % (char * self._width))
112
+ self.stdout.write(f'{char * self.width}\n')
113
113
 
114
114
  def status(self, status, clear=False):
115
115
  if self._should_clear_markers(clear):
116
116
  self._clear_status()
117
- self._stdout.write('| ', flush=False)
118
- self._stdout.highlight(status, flush=False)
119
- self._stdout.write(' |\n')
117
+ self.stdout.write('| ', flush=False)
118
+ self.stdout.highlight(status, flush=False)
119
+ self.stdout.write(' |\n')
120
120
 
121
121
  def _should_clear_markers(self, clear):
122
122
  return clear and self._keyword_marker.marking_enabled
@@ -126,12 +126,12 @@ class VerboseWriter:
126
126
  self._write_info()
127
127
 
128
128
  def _clear_info(self):
129
- self._stdout.write('\r%s\r' % (' ' * self._width))
129
+ self.stdout.write(f"\r{' ' * self.width}\r")
130
130
  self._keyword_marker.reset_count()
131
131
 
132
132
  def message(self, message):
133
133
  if message:
134
- self._stdout.write(message.strip() + '\n')
134
+ self.stdout.write(message.strip() + '\n')
135
135
 
136
136
  def keyword_marker(self, status):
137
137
  if self._keyword_marker.marker_count == self._status_length:
@@ -142,18 +142,18 @@ class VerboseWriter:
142
142
  def error(self, message, level, clear=False):
143
143
  if self._should_clear_markers(clear):
144
144
  self._clear_info()
145
- self._stderr.error(message, level)
145
+ self.stderr.error(message, level)
146
146
  if self._should_clear_markers(clear):
147
147
  self._write_info()
148
148
 
149
149
  def output(self, name, path):
150
- self._stdout.write('%-8s %s\n' % (name+':', path))
150
+ self.stdout.write(f"{name+':':8} {path}\n")
151
151
 
152
152
 
153
153
  class KeywordMarker:
154
154
 
155
155
  def __init__(self, highlighter, markers):
156
- self._highlighter = highlighter
156
+ self.highlighter = highlighter
157
157
  self.marking_enabled = self._marking_enabled(markers, highlighter)
158
158
  self.marker_count = 0
159
159
 
@@ -164,13 +164,13 @@ class KeywordMarker:
164
164
  try:
165
165
  return options[markers.upper()]
166
166
  except KeyError:
167
- raise DataError("Invalid console marker value '%s'. Available "
168
- "'AUTO', 'ON' and 'OFF'." % markers)
167
+ raise DataError(f"Invalid console marker value '{markers}'. "
168
+ f"Available 'AUTO', 'ON' and 'OFF'.")
169
169
 
170
170
  def mark(self, status):
171
171
  if self.marking_enabled:
172
172
  marker, status = ('.', 'PASS') if status != 'FAIL' else ('F', 'FAIL')
173
- self._highlighter.highlight(marker, status)
173
+ self.highlighter.highlight(marker, status)
174
174
  self.marker_count += 1
175
175
 
176
176
  def reset_count(self):
@@ -13,10 +13,13 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from pathlib import Path
17
+
16
18
  from robot.errors import DataError
17
- from robot.utils import get_timestamp, file_writer, seq2str2
19
+ from robot.utils import file_writer, seq2str2
18
20
 
19
21
  from .logger import LOGGER
22
+ from .loggerapi import LoggerApi
20
23
  from .loggerhelper import IsLogged
21
24
 
22
25
 
@@ -34,7 +37,7 @@ def DebugFile(path):
34
37
  return _DebugFileWriter(outfile)
35
38
 
36
39
 
37
- class _DebugFileWriter:
40
+ class _DebugFileWriter(LoggerApi):
38
41
  _separators = {'SUITE': '=', 'TEST': '-', 'KEYWORD': '~'}
39
42
 
40
43
  def __init__(self, outfile):
@@ -44,64 +47,76 @@ class _DebugFileWriter:
44
47
  self._outfile = outfile
45
48
  self._is_logged = IsLogged('DEBUG')
46
49
 
47
- def start_suite(self, suite):
50
+ def start_suite(self, data, result):
48
51
  self._separator('SUITE')
49
- self._start('SUITE', suite.longname)
52
+ self._start('SUITE', data.full_name, result.start_time)
50
53
  self._separator('SUITE')
51
54
 
52
- def end_suite(self, suite):
55
+ def end_suite(self, data, result):
53
56
  self._separator('SUITE')
54
- self._end('SUITE', suite.longname, suite.elapsedtime)
57
+ self._end('SUITE', data.full_name, result.end_time, result.elapsed_time)
55
58
  self._separator('SUITE')
56
59
  if self._indent == 0:
57
- LOGGER.output_file('Debug', self._outfile.name)
60
+ LOGGER.debug_file(Path(self._outfile.name))
58
61
  self.close()
59
62
 
60
- def start_test(self, test):
63
+ def start_test(self, data, result):
61
64
  self._separator('TEST')
62
- self._start('TEST', test.name)
65
+ self._start('TEST', result.name, result.start_time)
63
66
  self._separator('TEST')
64
67
 
65
- def end_test(self, test):
68
+ def end_test(self, data, result):
66
69
  self._separator('TEST')
67
- self._end('TEST', test.name, test.elapsedtime)
70
+ self._end('TEST', result.name, result.end_time, result.elapsed_time)
68
71
  self._separator('TEST')
69
72
 
70
- def start_keyword(self, kw):
73
+ def start_keyword(self, data, result):
74
+ if self._kw_level == 0:
75
+ self._separator('KEYWORD')
76
+ self._start(result.type, result.full_name, result.start_time, seq2str2(result.args))
77
+ self._kw_level += 1
78
+
79
+ def end_keyword(self, data, result):
80
+ self._end(result.type, result.full_name, result.end_time, result.elapsed_time)
81
+ self._kw_level -= 1
82
+
83
+ def start_body_item(self, data, result):
71
84
  if self._kw_level == 0:
72
85
  self._separator('KEYWORD')
73
- self._start(kw.type, kw.name, kw.args)
86
+ self._start(result.type, result._log_name, result.start_time)
74
87
  self._kw_level += 1
75
88
 
76
- def end_keyword(self, kw):
77
- self._end(kw.type, kw.name, kw.elapsedtime)
89
+ def end_body_item(self, data, result):
90
+ self._end(result.type, result._log_name, result.end_time, result.elapsed_time)
78
91
  self._kw_level -= 1
79
92
 
80
93
  def log_message(self, msg):
81
94
  if self._is_logged(msg.level):
82
- self._write(msg.message, level=msg.level, timestamp=msg.timestamp)
95
+ self._write(f'{msg.timestamp} - {msg.level} - {msg.message}')
83
96
 
84
97
  def close(self):
85
98
  if not self._outfile.closed:
86
99
  self._outfile.close()
87
100
 
88
- def _start(self, type_, name, args=''):
89
- args = ' ' + seq2str2(args)
90
- self._write('+%s START %s: %s%s' % ('-'*self._indent, type_, name, args))
101
+ def _start(self, type, name, timestamp, extra=''):
102
+ if extra:
103
+ extra = f' {extra}'
104
+ indent = '-' * self._indent
105
+ self._write(f'{timestamp} - INFO - +{indent} START {type}: {name}{extra}')
91
106
  self._indent += 1
92
107
 
93
- def _end(self, type_, name, elapsed):
108
+ def _end(self, type, name, timestamp, elapsed):
94
109
  self._indent -= 1
95
- self._write('+%s END %s: %s (%s)' % ('-'*self._indent, type_, name, elapsed))
110
+ indent = '-' * self._indent
111
+ elapsed = elapsed.total_seconds()
112
+ self._write(f'{timestamp} - INFO - +{indent} END {type}: {name} ({elapsed} s)')
96
113
 
97
114
  def _separator(self, type_):
98
115
  self._write(self._separators[type_] * 78, separator=True)
99
116
 
100
- def _write(self, text, separator=False, level='INFO', timestamp=None):
117
+ def _write(self, text, separator=False):
101
118
  if separator and self._separator_written_last:
102
119
  return
103
- if not separator:
104
- text = '%s - %s - %s' % (timestamp or get_timestamp(), level, text)
105
120
  self._outfile.write(text.rstrip() + '\n')
106
121
  self._outfile.flush()
107
122
  self._separator_written_last = separator
@@ -16,9 +16,10 @@
16
16
  from robot.utils import file_writer
17
17
 
18
18
  from .loggerhelper import AbstractLogger
19
+ from .loggerapi import LoggerApi
19
20
 
20
21
 
21
- class FileLogger(AbstractLogger):
22
+ class FileLogger(AbstractLogger, LoggerApi):
22
23
 
23
24
  def __init__(self, path, level):
24
25
  super().__init__(level)
@@ -33,26 +34,28 @@ class FileLogger(AbstractLogger):
33
34
  msg.message)
34
35
  self._writer.write(entry)
35
36
 
36
- def start_suite(self, suite):
37
- self.info("Started suite '%s'." % suite.name)
37
+ def start_suite(self, data, result):
38
+ self.info("Started suite '%s'." % result.name)
38
39
 
39
- def end_suite(self, suite):
40
- self.info("Ended suite '%s'." % suite.name)
40
+ def end_suite(self, data, result):
41
+ self.info("Ended suite '%s'." % result.name)
41
42
 
42
- def start_test(self, test):
43
- self.info("Started test '%s'." % test.name)
43
+ def start_test(self, data, result):
44
+ self.info("Started test '%s'." % result.name)
44
45
 
45
- def end_test(self, test):
46
- self.info("Ended test '%s'." % test.name)
46
+ def end_test(self, data, result):
47
+ self.info("Ended test '%s'." % result.name)
47
48
 
48
- def start_keyword(self, kw):
49
- self.debug(lambda: "Started keyword '%s'." % kw.name)
49
+ def start_body_item(self, data, result):
50
+ self.debug(lambda: "Started keyword '%s'." % result.name
51
+ if result.type in result.KEYWORD_TYPES else result._log_name)
50
52
 
51
- def end_keyword(self, kw):
52
- self.debug(lambda: "Ended keyword '%s'." % kw.name)
53
+ def end_body_item(self, data, result):
54
+ self.debug(lambda: "Ended keyword '%s'." % result.name
55
+ if result.type in result.KEYWORD_TYPES else result._log_name)
53
56
 
54
- def output_file(self, name, path):
55
- self.info('%s: %s' % (name, path))
57
+ def result_file(self, kind, path):
58
+ self.info('%s: %s' % (kind, path))
56
59
 
57
60
  def close(self):
58
61
  self._writer.close()
@@ -20,6 +20,7 @@ here to avoid cyclic imports.
20
20
  """
21
21
 
22
22
  import threading
23
+ from typing import Callable
23
24
 
24
25
  from .logger import LOGGER
25
26
  from .loggerhelper import Message, write_to_console
@@ -28,7 +29,7 @@ from .loggerhelper import Message, write_to_console
28
29
  LOGGING_THREADS = ('MainThread', 'RobotFrameworkTimeoutThread')
29
30
 
30
31
 
31
- def write(msg, level, html=False):
32
+ def write(msg: 'str | Callable[[], str]', level: str, html: bool = False):
32
33
  # Callable messages allow lazy logging internally, but we don't want to
33
34
  # expose this functionality publicly. See the following issue for details:
34
35
  # https://github.com/robotframework/robotframework/issues/1505
@@ -66,5 +67,5 @@ def error(msg, html=False):
66
67
  write(msg, 'ERROR', html)
67
68
 
68
69
 
69
- def console(msg, newline=True, stream='stdout'):
70
+ def console(msg: str, newline: bool = True, stream: str = 'stdout'):
70
71
  write_to_console(msg, newline, stream)