robotframework 6.1rc1__zip → 7.0a1__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 (288) hide show
  1. {robotframework-6.1rc1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
  2. {robotframework-6.1rc1 → robotframework-7.0a1}/setup.py +2 -5
  3. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/interfaces.py +36 -49
  4. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
  5. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
  6. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/languages.py +61 -25
  7. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
  8. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
  9. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
  10. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
  11. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
  12. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
  13. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
  14. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
  15. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
  16. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
  17. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
  18. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +14 -4
  19. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
  20. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
  21. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
  22. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
  23. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
  24. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
  25. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
  26. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
  27. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
  28. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
  29. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
  30. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +14 -2
  31. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
  32. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
  33. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/configurer.py +19 -15
  34. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/control.py +155 -85
  35. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
  36. robotframework-7.0a1/src/robot/model/keyword.py +70 -0
  37. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
  38. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modelobject.py +2 -8
  39. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modifier.py +1 -1
  40. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
  41. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
  42. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
  43. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
  44. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testsuite.py +43 -24
  45. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
  46. robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
  47. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
  48. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
  49. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
  50. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
  51. robotframework-7.0a1/src/robot/output/listeners.py +586 -0
  52. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
  53. robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
  54. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
  55. robotframework-7.0a1/src/robot/output/output.py +158 -0
  56. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
  57. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
  58. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
  59. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
  60. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
  61. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
  62. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
  63. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
  64. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
  65. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
  66. robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
  67. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  68. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
  69. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
  70. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
  71. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
  72. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
  73. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
  74. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
  75. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
  76. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
  77. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
  78. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
  79. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
  80. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
  81. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/run.py +1 -1
  82. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
  83. robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
  84. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
  85. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +3 -1
  86. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
  87. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
  88. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
  89. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
  90. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
  91. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +210 -220
  92. robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
  93. robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
  94. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
  95. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +15 -25
  96. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +15 -10
  97. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
  98. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
  99. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
  100. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
  101. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
  102. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
  103. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/model.py +156 -36
  104. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
  105. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
  106. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +18 -21
  107. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +35 -39
  108. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
  109. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
  110. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
  111. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
  112. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
  113. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
  114. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +9 -4
  115. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
  116. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
  117. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
  118. robotframework-7.0a1/src/robot/utils/notset.py +33 -0
  119. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
  120. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
  121. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
  122. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
  123. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
  124. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
  125. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
  126. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
  127. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
  128. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
  129. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
  130. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
  131. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
  132. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
  133. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
  134. robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
  135. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
  136. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/version.py +1 -1
  137. {robotframework-6.1rc1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
  138. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
  139. {robotframework-6.1rc1 → robotframework-7.0a1}/tasks.py +6 -6
  140. robotframework-6.1rc1/src/robot/libraries/Reserved.py +0 -48
  141. robotframework-6.1rc1/src/robot/model/keyword.py +0 -173
  142. robotframework-6.1rc1/src/robot/output/console/dotted.py +0 -90
  143. robotframework-6.1rc1/src/robot/output/listenerarguments.py +0 -165
  144. robotframework-6.1rc1/src/robot/output/listenermethods.py +0 -113
  145. robotframework-6.1rc1/src/robot/output/listeners.py +0 -174
  146. robotframework-6.1rc1/src/robot/output/output.py +0 -95
  147. robotframework-6.1rc1/src/robot/parsing/model/visitor.py +0 -67
  148. robotframework-6.1rc1/src/robot/running/arguments/argumentconverter.py +0 -79
  149. robotframework-6.1rc1/src/robot/running/arguments/typevalidator.py +0 -56
  150. robotframework-6.1rc1/src/robot/running/modelcombiner.py +0 -32
  151. robotframework-6.1rc1/src/robot/variables/tablesetter.py +0 -156
  152. {robotframework-6.1rc1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
  153. {robotframework-6.1rc1 → robotframework-7.0a1}/BUILD.rst +0 -0
  154. {robotframework-6.1rc1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
  155. {robotframework-6.1rc1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
  156. {robotframework-6.1rc1 → robotframework-7.0a1}/INSTALL.rst +0 -0
  157. {robotframework-6.1rc1 → robotframework-7.0a1}/LICENSE.txt +0 -0
  158. {robotframework-6.1rc1 → robotframework-7.0a1}/MANIFEST.in +0 -0
  159. {robotframework-6.1rc1 → robotframework-7.0a1}/README.rst +0 -0
  160. {robotframework-6.1rc1 → robotframework-7.0a1}/setup.cfg +0 -0
  161. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
  162. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
  163. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
  164. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
  165. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
  166. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
  167. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
  168. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
  169. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
  170. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
  171. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
  172. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
  173. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  174. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
  175. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
  176. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  177. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  178. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  179. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  180. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  181. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  182. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  183. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  184. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  185. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
  186. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  187. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
  188. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
  189. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  190. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  191. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
  192. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
  193. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
  194. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
  195. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
  196. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
  197. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  198. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  199. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  200. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
  201. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
  202. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  203. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  204. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  205. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
  206. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
  207. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
  208. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
  209. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
  210. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
  211. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
  212. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
  213. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
  214. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
  215. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
  216. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
  217. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
  218. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
  219. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
  220. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
  221. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
  222. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
  223. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
  224. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
  225. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
  226. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
  227. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  228. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
  229. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
  230. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
  231. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
  232. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
  233. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
  234. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
  235. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
  236. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
  237. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
  238. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
  239. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
  240. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
  241. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
  242. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
  243. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
  244. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
  245. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
  246. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
  247. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
  248. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
  249. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
  250. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
  251. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
  252. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
  253. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
  254. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
  255. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
  256. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
  257. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
  258. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
  259. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
  260. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
  261. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
  262. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
  263. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
  264. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
  265. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
  266. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
  267. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
  268. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
  269. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
  270. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
  271. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
  272. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
  273. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
  274. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
  275. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
  276. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
  277. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
  278. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
  279. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
  280. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
  281. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
  282. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
  283. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
  284. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
  285. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
  286. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
  288. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -0,0 +1,158 @@
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 . import pyloggingconf
17
+ from .debugfile import DebugFile
18
+ from .listeners import Listeners, LibraryListeners
19
+ from .logger import LOGGER
20
+ from .loggerapi import LoggerApi
21
+ from .loggerhelper import AbstractLogger
22
+ from .xmllogger import XmlLoggerAdapter
23
+
24
+
25
+ class Output(AbstractLogger, LoggerApi):
26
+
27
+ def __init__(self, settings):
28
+ AbstractLogger.__init__(self)
29
+ self._xml_logger = XmlLoggerAdapter(settings.output, settings.log_level,
30
+ settings.rpa)
31
+ self.listeners = Listeners(settings.listeners, settings.log_level)
32
+ self.library_listeners = LibraryListeners(settings.log_level)
33
+ self._register_loggers(DebugFile(settings.debug_file))
34
+ self._settings = settings
35
+
36
+ def _register_loggers(self, debug_file):
37
+ LOGGER.register_xml_logger(self._xml_logger)
38
+ LOGGER.register_listeners(self.listeners or None, self.library_listeners)
39
+ if debug_file:
40
+ LOGGER.register_logger(debug_file)
41
+
42
+ def register_error_listener(self, listener):
43
+ LOGGER.register_error_listener(listener)
44
+
45
+ def close(self, result):
46
+ self._xml_logger.logger.visit_statistics(result.statistics)
47
+ self._xml_logger.close()
48
+ LOGGER.unregister_xml_logger()
49
+ LOGGER.output_file('Output', self._settings['Output'])
50
+
51
+ def start_suite(self, data, result):
52
+ LOGGER.start_suite(data, result)
53
+
54
+ def end_suite(self, data, result):
55
+ LOGGER.end_suite(data, result)
56
+
57
+ def start_test(self, data, result):
58
+ LOGGER.start_test(data, result)
59
+
60
+ def end_test(self, data, result):
61
+ LOGGER.end_test(data, result)
62
+
63
+ def start_keyword(self, data, result):
64
+ LOGGER.start_keyword(data, result)
65
+
66
+ def end_keyword(self, data, result):
67
+ LOGGER.end_keyword(data, result)
68
+
69
+ def start_for(self, data, result):
70
+ LOGGER.start_for(data, result)
71
+
72
+ def end_for(self, data, result):
73
+ LOGGER.end_for(data, result)
74
+
75
+ def start_for_iteration(self, data, result):
76
+ LOGGER.start_for_iteration(data, result)
77
+
78
+ def end_for_iteration(self, data, result):
79
+ LOGGER.end_for_iteration(data, result)
80
+
81
+ def start_while(self, data, result):
82
+ LOGGER.start_while(data, result)
83
+
84
+ def end_while(self, data, result):
85
+ LOGGER.end_while(data, result)
86
+
87
+ def start_while_iteration(self, data, result):
88
+ LOGGER.start_while_iteration(data, result)
89
+
90
+ def end_while_iteration(self, data, result):
91
+ LOGGER.end_while_iteration(data, result)
92
+
93
+ def start_if(self, data, result):
94
+ LOGGER.start_if(data, result)
95
+
96
+ def end_if(self, data, result):
97
+ LOGGER.end_if(data, result)
98
+
99
+ def start_if_branch(self, data, result):
100
+ LOGGER.start_if_branch(data, result)
101
+
102
+ def end_if_branch(self, data, result):
103
+ LOGGER.end_if_branch(data, result)
104
+
105
+ def start_try(self, data, result):
106
+ LOGGER.start_try(data, result)
107
+
108
+ def end_try(self, data, result):
109
+ LOGGER.end_try(data, result)
110
+
111
+ def start_try_branch(self, data, result):
112
+ LOGGER.start_try_branch(data, result)
113
+
114
+ def end_try_branch(self, data, result):
115
+ LOGGER.end_try_branch(data, result)
116
+
117
+ def start_var(self, data, result):
118
+ LOGGER.start_var(data, result)
119
+
120
+ def end_var(self, data, result):
121
+ LOGGER.end_var(data, result)
122
+
123
+ def start_break(self, data, result):
124
+ LOGGER.start_break(data, result)
125
+
126
+ def end_break(self, data, result):
127
+ LOGGER.end_break(data, result)
128
+
129
+ def start_continue(self, data, result):
130
+ LOGGER.start_continue(data, result)
131
+
132
+ def end_continue(self, data, result):
133
+ LOGGER.end_continue(data, result)
134
+
135
+ def start_return(self, data, result):
136
+ LOGGER.start_return(data, result)
137
+
138
+ def end_return(self, data, result):
139
+ LOGGER.end_return(data, result)
140
+
141
+ def start_error(self, data, result):
142
+ LOGGER.start_error(data, result)
143
+
144
+ def end_error(self, data, result):
145
+ LOGGER.end_error(data, result)
146
+
147
+ def message(self, msg):
148
+ LOGGER.log_message(msg)
149
+
150
+ def trace(self, msg, write_if_flat=True):
151
+ if write_if_flat or not self._xml_logger.flatten_level:
152
+ self.write(msg, 'TRACE')
153
+
154
+ def set_log_level(self, level):
155
+ pyloggingconf.set_level(level)
156
+ self.listeners.set_log_level(level)
157
+ self.library_listeners.set_log_level(level)
158
+ return self._xml_logger.set_log_level(level)
@@ -14,8 +14,8 @@
14
14
  # limitations under the License.
15
15
 
16
16
  import re
17
+ from datetime import datetime
17
18
 
18
- from robot.utils import format_time
19
19
  from .loggerhelper import Message, write_to_console
20
20
 
21
21
 
@@ -36,7 +36,7 @@ class StdoutLogSplitter:
36
36
  write_to_console(msg.lstrip())
37
37
  level = 'INFO'
38
38
  if timestamp:
39
- timestamp = self._format_timestamp(timestamp[1:])
39
+ timestamp = datetime.fromtimestamp(float(timestamp[1:]) / 1000)
40
40
  yield Message(msg.strip(), level, timestamp=timestamp)
41
41
 
42
42
  def _split_output(self, output):
@@ -53,8 +53,11 @@ class StdoutLogSplitter:
53
53
  def _output_started_with_level(self, tokens):
54
54
  return tokens[0] == ''
55
55
 
56
- def _format_timestamp(self, millis):
57
- return format_time(float(millis)/1000, millissep='.')
58
-
59
56
  def __iter__(self):
60
57
  return iter(self._messages)
58
+
59
+ def __len__(self):
60
+ return len(self._messages)
61
+
62
+ def __getitem__(self, item):
63
+ return self._messages[item]
@@ -13,19 +13,142 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from robot.utils import get_timestamp, NullMarkupWriter, safe_str, XmlWriter
16
+ from datetime import datetime
17
+
18
+ from robot.utils import NullMarkupWriter, safe_str, XmlWriter
17
19
  from robot.version import get_full_version
18
20
  from robot.result.visitor import ResultVisitor
19
21
 
22
+ from .loggerapi import LoggerApi
20
23
  from .loggerhelper import IsLogged
21
24
 
22
25
 
26
+ class XmlLoggerAdapter(LoggerApi):
27
+
28
+ def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot'):
29
+ self.logger = XmlLogger(path, log_level, rpa, generator)
30
+
31
+ @property
32
+ def flatten_level(self):
33
+ return self.logger.flatten_level
34
+
35
+ def close(self):
36
+ self.logger.close()
37
+
38
+ def set_log_level(self, level):
39
+ return self.logger.set_log_level(level)
40
+
41
+ def start_suite(self, data, result):
42
+ self.logger.start_suite(result)
43
+
44
+ def end_suite(self, data, result):
45
+ self.logger.end_suite(result)
46
+
47
+ def start_test(self, data, result):
48
+ self.logger.start_test(result)
49
+
50
+ def end_test(self, data, result):
51
+ self.logger.end_test(result)
52
+
53
+ def start_keyword(self, data, result):
54
+ self.logger.start_keyword(result)
55
+
56
+ def end_keyword(self, data, result):
57
+ self.logger.end_keyword(result)
58
+
59
+ def start_for(self, data, result):
60
+ self.logger.start_for(result)
61
+
62
+ def end_for(self, data, result):
63
+ self.logger.end_for(result)
64
+
65
+ def start_for_iteration(self, data, result):
66
+ self.logger.start_for_iteration(result)
67
+
68
+ def end_for_iteration(self, data, result):
69
+ self.logger.end_for_iteration(result)
70
+
71
+ def start_while(self, data, result):
72
+ self.logger.start_while(result)
73
+
74
+ def end_while(self, data, result):
75
+ self.logger.end_while(result)
76
+
77
+ def start_while_iteration(self, data, result):
78
+ self.logger.start_while_iteration(result)
79
+
80
+ def end_while_iteration(self, data, result):
81
+ self.logger.end_while_iteration(result)
82
+
83
+ def start_if(self, data, result):
84
+ self.logger.start_if(result)
85
+
86
+ def end_if(self, data, result):
87
+ self.logger.end_if(result)
88
+
89
+ def start_if_branch(self, data, result):
90
+ self.logger.start_if_branch(result)
91
+
92
+ def end_if_branch(self, data, result):
93
+ self.logger.end_if_branch(result)
94
+
95
+ def start_try(self, data, result):
96
+ self.logger.start_try(result)
97
+
98
+ def end_try(self, data, result):
99
+ self.logger.end_try(result)
100
+
101
+ def start_try_branch(self, data, result):
102
+ self.logger.start_try_branch(result)
103
+
104
+ def end_try_branch(self, data, result):
105
+ self.logger.end_try_branch(result)
106
+
107
+ def start_var(self, data, result):
108
+ self.logger.start_var(result)
109
+
110
+ def end_var(self, data, result):
111
+ self.logger.end_var(result)
112
+
113
+ def start_break(self, data, result):
114
+ self.logger.start_break(result)
115
+
116
+ def end_break(self, data, result):
117
+ self.logger.end_break(result)
118
+
119
+ def start_continue(self, data, result):
120
+ self.logger.start_continue(result)
121
+
122
+ def end_continue(self, data, result):
123
+ self.logger.end_continue(result)
124
+
125
+ def start_return(self, data, result):
126
+ self.logger.start_return(result)
127
+
128
+ def end_return(self, data, result):
129
+ self.logger.end_return(result)
130
+
131
+ def start_error(self, data, result):
132
+ self.logger.start_error(result)
133
+
134
+ def end_error(self, data, result):
135
+ self.logger.end_error(result)
136
+
137
+ def log_message(self, message):
138
+ self.logger.log_message(message)
139
+
140
+ def message(self, message):
141
+ self.logger.message(message)
142
+
143
+
23
144
  class XmlLogger(ResultVisitor):
24
145
 
25
146
  def __init__(self, path, log_level='TRACE', rpa=False, generator='Robot'):
26
147
  self._log_message_is_logged = IsLogged(log_level)
27
148
  self._error_message_is_logged = IsLogged('WARN')
28
- self._writer = self._get_writer(path, rpa, generator)
149
+ # `_writer` is set to NullMarkupWriter when flattening, `_xml_writer` is not.
150
+ self._writer = self._xml_writer = self._get_writer(path, rpa, generator)
151
+ self.flatten_level = 0
29
152
  self._errors = []
30
153
 
31
154
  def _get_writer(self, path, rpa, generator):
@@ -33,9 +156,9 @@ class XmlLogger(ResultVisitor):
33
156
  return NullMarkupWriter()
34
157
  writer = XmlWriter(path, write_empty=False, usage='output')
35
158
  writer.start('robot', {'generator': get_full_version(generator),
36
- 'generated': get_timestamp(),
159
+ 'generated': datetime.now().isoformat(),
37
160
  'rpa': 'true' if rpa else 'false',
38
- 'schemaversion': '4'})
161
+ 'schemaversion': '5'})
39
162
  return writer
40
163
 
41
164
  def close(self):
@@ -58,25 +181,33 @@ class XmlLogger(ResultVisitor):
58
181
  self._write_message(msg)
59
182
 
60
183
  def _write_message(self, msg):
61
- attrs = {'timestamp': msg.timestamp or 'N/A', 'level': msg.level}
184
+ attrs = {'time': msg.timestamp.isoformat() if msg.timestamp else None,
185
+ 'level': msg.level}
62
186
  if msg.html:
63
187
  attrs['html'] = 'true'
64
- self._writer.element('msg', msg.message, attrs)
188
+ # Use `_xml_writer`, not `_writer` to write messages also when flattening.
189
+ self._xml_writer.element('msg', msg.message, attrs)
65
190
 
66
191
  def start_keyword(self, kw):
67
- attrs = {'name': kw.kwname, 'library': kw.libname}
192
+ attrs = {'name': kw.name, 'owner': kw.owner}
68
193
  if kw.type != 'KEYWORD':
69
194
  attrs['type'] = kw.type
70
- if kw.sourcename:
71
- attrs['sourcename'] = kw.sourcename
195
+ if kw.source_name:
196
+ attrs['source_name'] = kw.source_name
72
197
  self._writer.start('kw', attrs)
73
198
  self._write_list('var', kw.assign)
74
199
  self._write_list('arg', [safe_str(a) for a in kw.args])
75
200
  self._write_list('tag', kw.tags)
76
- # Must be after tags to allow adding message when using --flattenkeywords.
77
201
  self._writer.element('doc', kw.doc)
202
+ if kw.tags.robot('flatten'):
203
+ self.flatten_level += 1
204
+ self._writer = NullMarkupWriter()
78
205
 
79
206
  def end_keyword(self, kw):
207
+ if kw.tags.robot('flatten'):
208
+ self.flatten_level -= 1
209
+ if self.flatten_level == 0:
210
+ self._writer = self._xml_writer
80
211
  if kw.timeout:
81
212
  self._writer.element('timeout', attrs={'value': str(kw.timeout)})
82
213
  self._write_status(kw)
@@ -84,7 +215,6 @@ class XmlLogger(ResultVisitor):
84
215
 
85
216
  def start_if(self, if_):
86
217
  self._writer.start('if')
87
- self._writer.element('doc', if_.doc)
88
218
 
89
219
  def end_if(self, if_):
90
220
  self._write_status(if_)
@@ -93,7 +223,6 @@ class XmlLogger(ResultVisitor):
93
223
  def start_if_branch(self, branch):
94
224
  self._writer.start('branch', {'type': branch.type,
95
225
  'condition': branch.condition})
96
- self._writer.element('doc', branch.doc)
97
226
 
98
227
  def end_if_branch(self, branch):
99
228
  self._write_status(branch)
@@ -104,11 +233,10 @@ class XmlLogger(ResultVisitor):
104
233
  'start': for_.start,
105
234
  'mode': for_.mode,
106
235
  'fill': for_.fill})
107
- for name in for_.variables:
236
+ for name in for_.assign:
108
237
  self._writer.element('var', name)
109
238
  for value in for_.values:
110
239
  self._writer.element('value', value)
111
- self._writer.element('doc', for_.doc)
112
240
 
113
241
  def end_for(self, for_):
114
242
  self._write_status(for_)
@@ -116,9 +244,8 @@ class XmlLogger(ResultVisitor):
116
244
 
117
245
  def start_for_iteration(self, iteration):
118
246
  self._writer.start('iter')
119
- for name, value in iteration.variables.items():
247
+ for name, value in iteration.assign.items():
120
248
  self._writer.element('var', value, {'name': name})
121
- self._writer.element('doc', iteration.doc)
122
249
 
123
250
  def end_for_iteration(self, iteration):
124
251
  self._write_status(iteration)
@@ -134,8 +261,9 @@ class XmlLogger(ResultVisitor):
134
261
  def start_try_branch(self, branch):
135
262
  if branch.type == branch.EXCEPT:
136
263
  self._writer.start('branch', attrs={
137
- 'type': 'EXCEPT', 'variable': branch.variable,
138
- 'pattern_type': branch.pattern_type
264
+ 'type': 'EXCEPT',
265
+ 'pattern_type': branch.pattern_type,
266
+ 'assign': branch.assign
139
267
  })
140
268
  self._write_list('pattern', branch.patterns)
141
269
  else:
@@ -152,7 +280,6 @@ class XmlLogger(ResultVisitor):
152
280
  'on_limit': while_.on_limit,
153
281
  'on_limit_message': while_.on_limit_message
154
282
  })
155
- self._writer.element('doc', while_.doc)
156
283
 
157
284
  def end_while(self, while_):
158
285
  self._write_status(while_)
@@ -160,12 +287,25 @@ class XmlLogger(ResultVisitor):
160
287
 
161
288
  def start_while_iteration(self, iteration):
162
289
  self._writer.start('iter')
163
- self._writer.element('doc', iteration.doc)
164
290
 
165
291
  def end_while_iteration(self, iteration):
166
292
  self._write_status(iteration)
167
293
  self._writer.end('iter')
168
294
 
295
+ def start_var(self, var):
296
+ attr = {'name': var.name}
297
+ if var.scope is not None:
298
+ attr['scope'] = var.scope
299
+ if var.separator is not None:
300
+ attr['separator'] = var.separator
301
+ self._writer.start('variable', attr, write_empty=True)
302
+ for val in var.value:
303
+ self._writer.element('var', val)
304
+
305
+ def end_var(self, var):
306
+ self._write_status(var)
307
+ self._writer.end('variable')
308
+
169
309
  def start_return(self, return_):
170
310
  self._writer.start('return')
171
311
  for value in return_.values:
@@ -262,93 +402,7 @@ class XmlLogger(ResultVisitor):
262
402
  self._writer.element(tag, item)
263
403
 
264
404
  def _write_status(self, item):
265
- attrs = {'status': item.status, 'starttime': item.starttime or 'N/A',
266
- 'endtime': item.endtime or 'N/A'}
267
- if not (item.starttime and item.endtime):
268
- attrs['elapsedtime'] = str(item.elapsedtime)
405
+ attrs = {'status': item.status,
406
+ 'start': item.start_time.isoformat() if item.start_time else None,
407
+ 'elapsed': format(item.elapsed_time.total_seconds(), 'f')}
269
408
  self._writer.element('status', item.message, attrs)
270
-
271
-
272
- class FlatXmlLogger(XmlLogger):
273
-
274
- def __init__(self, real_xml_logger):
275
- super().__init__(None)
276
- self._writer = real_xml_logger._writer
277
-
278
- def start_keyword(self, kw):
279
- pass
280
-
281
- def end_keyword(self, kw):
282
- pass
283
-
284
- def start_for(self, for_):
285
- pass
286
-
287
- def end_for(self, for_):
288
- pass
289
-
290
- def start_for_iteration(self, iteration):
291
- pass
292
-
293
- def end_for_iteration(self, iteration):
294
- pass
295
-
296
- def start_if(self, if_):
297
- pass
298
-
299
- def end_if(self, if_):
300
- pass
301
-
302
- def start_if_branch(self, branch):
303
- pass
304
-
305
- def end_if_branch(self, branch):
306
- pass
307
-
308
- def start_try(self, root):
309
- pass
310
-
311
- def end_try(self, root):
312
- pass
313
-
314
- def start_try_branch(self, branch):
315
- pass
316
-
317
- def end_try_branch(self, branch):
318
- pass
319
-
320
- def start_while(self, while_):
321
- pass
322
-
323
- def end_while(self, while_):
324
- pass
325
-
326
- def start_while_iteration(self, iteration):
327
- pass
328
-
329
- def end_while_iteration(self, iteration):
330
- pass
331
-
332
- def start_break(self, break_):
333
- pass
334
-
335
- def end_break(self, break_):
336
- pass
337
-
338
- def start_continue(self, continue_):
339
- pass
340
-
341
- def end_continue(self, continue_):
342
- pass
343
-
344
- def start_return(self, return_):
345
- pass
346
-
347
- def end_return(self, return_):
348
- pass
349
-
350
- def start_error(self, error):
351
- pass
352
-
353
- def end_error(self, error):
354
- pass
@@ -29,8 +29,9 @@ from .statementlexers import (BreakLexer, CommentLexer, CommentSectionHeaderLexe
29
29
  KeywordSettingLexer, Lexer, ReturnLexer, SettingLexer,
30
30
  SettingSectionHeaderLexer, SyntaxErrorLexer,
31
31
  TaskSectionHeaderLexer, TestCaseSectionHeaderLexer,
32
- TestCaseSettingLexer, TryHeaderLexer, VariableLexer,
33
- VariableSectionHeaderLexer, WhileHeaderLexer)
32
+ TestCaseSettingLexer, TryHeaderLexer, VarLexer,
33
+ VariableLexer, VariableSectionHeaderLexer,
34
+ WhileHeaderLexer)
34
35
  from .tokens import StatementTokens, Token
35
36
 
36
37
 
@@ -200,8 +201,8 @@ class TestCaseLexer(TestOrKeywordLexer):
200
201
  self._lex_with_priority(priority=TestCaseSettingLexer)
201
202
 
202
203
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
203
- return (TestCaseSettingLexer, ForLexer, InlineIfLexer, IfLexer,
204
- TryLexer, WhileLexer, SyntaxErrorLexer, KeywordCallLexer)
204
+ return (TestCaseSettingLexer, ForLexer, InlineIfLexer, IfLexer, TryLexer,
205
+ WhileLexer, VarLexer, SyntaxErrorLexer, KeywordCallLexer)
205
206
 
206
207
 
207
208
  class KeywordLexer(TestOrKeywordLexer):
@@ -211,8 +212,8 @@ class KeywordLexer(TestOrKeywordLexer):
211
212
  super().__init__(ctx.keyword_context())
212
213
 
213
214
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
214
- return (KeywordSettingLexer, ForLexer, InlineIfLexer, IfLexer, ReturnLexer,
215
- TryLexer, WhileLexer, SyntaxErrorLexer, KeywordCallLexer)
215
+ return (KeywordSettingLexer, ForLexer, InlineIfLexer, IfLexer, TryLexer,
216
+ WhileLexer, VarLexer, ReturnLexer, SyntaxErrorLexer, KeywordCallLexer)
216
217
 
217
218
 
218
219
  class NestedBlockLexer(BlockLexer, ABC):
@@ -242,7 +243,8 @@ class ForLexer(NestedBlockLexer):
242
243
 
243
244
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
244
245
  return (ForHeaderLexer, InlineIfLexer, IfLexer, TryLexer, WhileLexer, EndLexer,
245
- ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer, KeywordCallLexer)
246
+ VarLexer, ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer,
247
+ KeywordCallLexer)
246
248
 
247
249
 
248
250
  class WhileLexer(NestedBlockLexer):
@@ -252,7 +254,8 @@ class WhileLexer(NestedBlockLexer):
252
254
 
253
255
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
254
256
  return (WhileHeaderLexer, ForLexer, InlineIfLexer, IfLexer, TryLexer, EndLexer,
255
- ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer, KeywordCallLexer)
257
+ VarLexer, ReturnLexer, ContinueLexer, BreakLexer, SyntaxErrorLexer,
258
+ KeywordCallLexer)
256
259
 
257
260
 
258
261
  class TryLexer(NestedBlockLexer):
@@ -262,8 +265,9 @@ class TryLexer(NestedBlockLexer):
262
265
 
263
266
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
264
267
  return (TryHeaderLexer, ExceptHeaderLexer, ElseHeaderLexer, FinallyHeaderLexer,
265
- ForLexer, InlineIfLexer, IfLexer, WhileLexer, EndLexer, ReturnLexer,
266
- BreakLexer, ContinueLexer, SyntaxErrorLexer, KeywordCallLexer)
268
+ ForLexer, InlineIfLexer, IfLexer, WhileLexer, EndLexer, VarLexer,
269
+ ReturnLexer, BreakLexer, ContinueLexer, SyntaxErrorLexer,
270
+ KeywordCallLexer)
267
271
 
268
272
 
269
273
  class IfLexer(NestedBlockLexer):
@@ -273,8 +277,8 @@ class IfLexer(NestedBlockLexer):
273
277
 
274
278
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
275
279
  return (InlineIfLexer, IfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer,
276
- ForLexer, TryLexer, WhileLexer, EndLexer, ReturnLexer, ContinueLexer,
277
- BreakLexer, SyntaxErrorLexer, KeywordCallLexer)
280
+ ForLexer, TryLexer, WhileLexer, EndLexer, VarLexer, ReturnLexer,
281
+ ContinueLexer, BreakLexer, SyntaxErrorLexer, KeywordCallLexer)
278
282
 
279
283
 
280
284
  class InlineIfLexer(NestedBlockLexer):
@@ -288,7 +292,7 @@ class InlineIfLexer(NestedBlockLexer):
288
292
  return False
289
293
 
290
294
  def lexer_classes(self) -> 'tuple[type[Lexer], ...]':
291
- return (InlineIfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer,
295
+ return (InlineIfHeaderLexer, ElseIfHeaderLexer, ElseHeaderLexer, VarLexer,
292
296
  ReturnLexer, ContinueLexer, BreakLexer, KeywordCallLexer)
293
297
 
294
298
  def input(self, statement: StatementTokens):
@@ -76,8 +76,18 @@ class FileContext(LexingContext):
76
76
 
77
77
  def _handles_section(self, statement: StatementTokens, header: str) -> bool:
78
78
  marker = statement[0].value
79
- return bool(marker and marker[0] == '*' and
80
- self.languages.headers.get(self._normalize(marker)) == header)
79
+ if not marker or marker[0] != '*':
80
+ return False
81
+ normalized = self._normalize(marker)
82
+ if self.languages.headers.get(normalized) == header:
83
+ return True
84
+ if normalized == header[:-1]:
85
+ statement[0].error = (
86
+ f"Singular section headers like '{marker}' are deprecated. "
87
+ f"Use plural format like '*** {header} ***' instead."
88
+ )
89
+ return True
90
+ return False
81
91
 
82
92
  def _normalize(self, marker: str) -> str:
83
93
  return normalize_whitespace(marker).strip('* ').title()
@@ -128,7 +128,7 @@ class Lexer:
128
128
 
129
129
  def _get_tokens(self, statements: 'Iterable[list[Token]]') -> 'Iterator[Token]':
130
130
  if self.data_only:
131
- ignored_types = {None, Token.COMMENT_HEADER, Token.COMMENT}
131
+ ignored_types = {None, Token.COMMENT}
132
132
  else:
133
133
  ignored_types = {None}
134
134
  inline_if_type = Token.INLINE_IF