robotframework 7.1rc2__zip → 7.2b1__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 (286) hide show
  1. {robotframework-7.1rc2 → robotframework-7.2b1}/BUILD.rst +7 -7
  2. {robotframework-7.1rc2 → robotframework-7.2b1}/PKG-INFO +2 -2
  3. {robotframework-7.1rc2 → robotframework-7.2b1}/setup.py +1 -1
  4. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/__init__.py +33 -9
  5. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/deco.py +8 -6
  6. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/interfaces.py +66 -15
  7. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/parsing.py +72 -68
  8. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/languages.py +4 -3
  9. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/settings.py +11 -10
  10. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/errors.py +3 -3
  11. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/htmlfilewriter.py +3 -0
  12. robotframework-7.2b1/src/robot/htmldata/libdoc/libdoc.html +408 -0
  13. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/log.html +1 -1
  14. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/report.html +1 -1
  15. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/testdata.js +1 -1
  16. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/template.py +0 -2
  17. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdoc.py +19 -11
  18. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/htmlwriter.py +7 -4
  19. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/model.py +7 -5
  20. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/writer.py +2 -2
  21. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/BuiltIn.py +121 -32
  22. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Collections.py +20 -7
  23. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/__init__.py +3 -3
  24. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/body.py +48 -57
  25. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/control.py +35 -4
  26. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/message.py +13 -8
  27. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/modelobject.py +26 -0
  28. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/statistics.py +13 -9
  29. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/stats.py +12 -14
  30. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/suitestatistics.py +8 -9
  31. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/tags.py +10 -0
  32. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/tagstatistics.py +7 -8
  33. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/testcase.py +1 -0
  34. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/testsuite.py +1 -0
  35. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/totalstatistics.py +14 -21
  36. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/visitor.py +29 -3
  37. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/__init__.py +3 -2
  38. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/dotted.py +6 -3
  39. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/highlighting.py +18 -10
  40. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/debugfile.py +3 -3
  41. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/filelogger.py +7 -3
  42. robotframework-7.2b1/src/robot/output/jsonlogger.py +338 -0
  43. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/librarylogger.py +12 -11
  44. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/listeners.py +49 -47
  45. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/logger.py +33 -20
  46. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/loggerapi.py +6 -0
  47. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/loggerhelper.py +29 -57
  48. robotframework-7.2b1/src/robot/output/loglevel.py +54 -0
  49. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/output.py +21 -17
  50. robotframework-7.2b1/src/robot/output/outputfile.py +174 -0
  51. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/pyloggingconf.py +2 -0
  52. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/xmllogger.py +40 -169
  53. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/blocklexers.py +25 -12
  54. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/statementlexers.py +16 -7
  55. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/tokens.py +2 -1
  56. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/__init__.py +1 -1
  57. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/blocks.py +34 -2
  58. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/statements.py +32 -2
  59. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/blockparsers.py +7 -2
  60. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/rebot.py +10 -2
  61. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jsmodelbuilders.py +1 -1
  62. robotframework-7.2b1/src/robot/reporting/outputwriter.py +30 -0
  63. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/__init__.py +1 -1
  64. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/executionerrors.py +9 -9
  65. robotframework-7.2b1/src/robot/result/executionresult.py +331 -0
  66. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/messagefilter.py +14 -10
  67. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/model.py +90 -18
  68. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/resultbuilder.py +2 -5
  69. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/xmlelementhandlers.py +20 -9
  70. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/run.py +18 -6
  71. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/__init__.py +1 -1
  72. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/embedded.py +7 -6
  73. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typeconverters.py +14 -2
  74. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typeinfo.py +23 -4
  75. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/bodyrunner.py +41 -0
  76. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/settings.py +2 -1
  77. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/transformers.py +46 -20
  78. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/context.py +22 -11
  79. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/librarykeyword.py +1 -1
  80. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/librarykeywordrunner.py +29 -23
  81. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/model.py +31 -4
  82. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/outputcapture.py +2 -1
  83. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/signalhandler.py +7 -3
  84. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/status.py +49 -38
  85. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/statusreporter.py +1 -1
  86. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/suiterunner.py +22 -15
  87. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/userkeywordrunner.py +4 -0
  88. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/importer.py +39 -23
  89. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/unic.py +7 -8
  90. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/evaluation.py +21 -2
  91. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/replacer.py +20 -24
  92. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/scopes.py +19 -9
  93. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/variables.py +4 -1
  94. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/version.py +1 -1
  95. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/PKG-INFO +2 -2
  96. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/SOURCES.txt +3 -4
  97. robotframework-7.1rc2/src/robot/htmldata/libdoc/doc_formatting.css +0 -74
  98. robotframework-7.1rc2/src/robot/htmldata/libdoc/libdoc.css +0 -747
  99. robotframework-7.1rc2/src/robot/htmldata/libdoc/libdoc.html +0 -702
  100. robotframework-7.1rc2/src/robot/htmldata/libdoc/print.css +0 -11
  101. robotframework-7.1rc2/src/robot/htmldata/libdoc/pygments.css +0 -162
  102. robotframework-7.1rc2/src/robot/reporting/outputwriter.py +0 -48
  103. robotframework-7.1rc2/src/robot/result/executionresult.py +0 -201
  104. {robotframework-7.1rc2 → robotframework-7.2b1}/AUTHORS.rst +0 -0
  105. {robotframework-7.1rc2 → robotframework-7.2b1}/CONTRIBUTING.rst +0 -0
  106. {robotframework-7.1rc2 → robotframework-7.2b1}/COPYRIGHT.txt +0 -0
  107. {robotframework-7.1rc2 → robotframework-7.2b1}/INSTALL.rst +0 -0
  108. {robotframework-7.1rc2 → robotframework-7.2b1}/LICENSE.txt +0 -0
  109. {robotframework-7.1rc2 → robotframework-7.2b1}/MANIFEST.in +0 -0
  110. {robotframework-7.1rc2 → robotframework-7.2b1}/README.rst +0 -0
  111. {robotframework-7.1rc2 → robotframework-7.2b1}/setup.cfg +0 -0
  112. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/__init__.py +0 -0
  113. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/__main__.py +0 -0
  114. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/exceptions.py +0 -0
  115. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/logger.py +0 -0
  116. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/api/py.typed +0 -0
  117. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/__init__.py +0 -0
  118. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/conf/gatherfailed.py +0 -0
  119. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/__init__.py +0 -0
  120. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/common/__init__.py +0 -0
  121. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/common/js_disabled.css +0 -0
  122. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/common/storage.js +0 -0
  123. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/jsonwriter.py +0 -0
  124. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/__init__.py +0 -0
  125. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  126. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  127. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  128. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  129. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  130. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  131. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/__init__.py +0 -0
  132. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/common.css +0 -0
  133. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  134. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  135. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/log.css +0 -0
  136. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/log.js +0 -0
  137. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/model.js +0 -0
  138. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/print.css +0 -0
  139. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/report.css +0 -0
  140. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/util.js +0 -0
  141. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/rebot/view.js +0 -0
  142. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  143. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  144. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  145. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/__init__.py +0 -0
  146. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/builder.py +0 -0
  147. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  148. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/datatypes.py +0 -0
  149. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/htmlutils.py +0 -0
  150. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/jsonbuilder.py +0 -0
  151. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  152. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/output.py +0 -0
  153. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/robotbuilder.py +0 -0
  154. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/standardtypes.py +0 -0
  155. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  156. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libdocpkg/xmlwriter.py +0 -0
  157. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/DateTime.py +0 -0
  158. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Dialogs.py +0 -0
  159. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Easter.py +0 -0
  160. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/OperatingSystem.py +0 -0
  161. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Process.py +0 -0
  162. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Remote.py +0 -0
  163. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Screenshot.py +0 -0
  164. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/String.py +0 -0
  165. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/Telnet.py +0 -0
  166. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/XML.py +0 -0
  167. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/__init__.py +0 -0
  168. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/libraries/dialogs_py.py +0 -0
  169. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/configurer.py +0 -0
  170. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/filter.py +0 -0
  171. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/fixture.py +0 -0
  172. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/itemlist.py +0 -0
  173. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/keyword.py +0 -0
  174. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/metadata.py +0 -0
  175. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/modifier.py +0 -0
  176. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/namepatterns.py +0 -0
  177. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/model/tagsetter.py +0 -0
  178. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/__init__.py +0 -0
  179. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/quiet.py +0 -0
  180. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/console/verbose.py +0 -0
  181. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/output/stdoutlogsplitter.py +0 -0
  182. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/__init__.py +0 -0
  183. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/__init__.py +0 -0
  184. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/context.py +0 -0
  185. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/lexer.py +0 -0
  186. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/settings.py +0 -0
  187. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  188. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/model/visitor.py +0 -0
  189. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/__init__.py +0 -0
  190. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/fileparser.py +0 -0
  191. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/parser/parser.py +0 -0
  192. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/parsing/suitestructure.py +0 -0
  193. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/pythonpathsetter.py +0 -0
  194. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/__init__.py +0 -0
  195. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  196. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jsbuildingcontext.py +0 -0
  197. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jsexecutionresult.py +0 -0
  198. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/jswriter.py +0 -0
  199. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/logreportwriters.py +0 -0
  200. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/resultwriter.py +0 -0
  201. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/stringcache.py +0 -0
  202. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/reporting/xunitwriter.py +0 -0
  203. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/configurer.py +0 -0
  204. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/flattenkeywordmatcher.py +0 -0
  205. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/keywordremover.py +0 -0
  206. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/merger.py +0 -0
  207. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/modeldeprecation.py +0 -0
  208. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/suiteteardownfailed.py +0 -0
  209. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/result/visitor.py +0 -0
  210. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/__init__.py +0 -0
  211. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentconverter.py +0 -0
  212. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentmapper.py +0 -0
  213. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentparser.py +0 -0
  214. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentresolver.py +0 -0
  215. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentspec.py +0 -0
  216. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/argumentvalidator.py +0 -0
  217. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/customconverters.py +0 -0
  218. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typeinfoparser.py +0 -0
  219. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/arguments/typevalidator.py +0 -0
  220. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/__init__.py +0 -0
  221. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/builders.py +0 -0
  222. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/builder/parsers.py +0 -0
  223. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/dynamicmethods.py +0 -0
  224. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/importer.py +0 -0
  225. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/invalidkeyword.py +0 -0
  226. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/keywordfinder.py +0 -0
  227. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/keywordimplementation.py +0 -0
  228. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/libraryscopes.py +0 -0
  229. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/namespace.py +0 -0
  230. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/randomizer.py +0 -0
  231. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/resourcemodel.py +0 -0
  232. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/runkwregister.py +0 -0
  233. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/testlibraries.py +0 -0
  234. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/__init__.py +0 -0
  235. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/nosupport.py +0 -0
  236. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/posix.py +0 -0
  237. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/running/timeouts/windows.py +0 -0
  238. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/testdoc.py +0 -0
  239. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/__init__.py +0 -0
  240. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/application.py +0 -0
  241. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/argumentparser.py +0 -0
  242. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/asserts.py +0 -0
  243. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/charwidth.py +0 -0
  244. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/compress.py +0 -0
  245. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/connectioncache.py +0 -0
  246. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/dotdict.py +0 -0
  247. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/encoding.py +0 -0
  248. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/encodingsniffer.py +0 -0
  249. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/error.py +0 -0
  250. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/escaping.py +0 -0
  251. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/etreewrapper.py +0 -0
  252. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/filereader.py +0 -0
  253. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/frange.py +0 -0
  254. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/htmlformatters.py +0 -0
  255. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/markuputils.py +0 -0
  256. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/markupwriters.py +0 -0
  257. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/match.py +0 -0
  258. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/misc.py +0 -0
  259. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/normalizing.py +0 -0
  260. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/notset.py +0 -0
  261. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/platform.py +0 -0
  262. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/recommendations.py +0 -0
  263. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/restreader.py +0 -0
  264. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotenv.py +0 -0
  265. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotinspect.py +0 -0
  266. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotio.py +0 -0
  267. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robotpath.py +0 -0
  268. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robottime.py +0 -0
  269. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/robottypes.py +0 -0
  270. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/setter.py +0 -0
  271. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/sortable.py +0 -0
  272. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/text.py +0 -0
  273. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/utils/typehints.py +0 -0
  274. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/__init__.py +0 -0
  275. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/assigner.py +0 -0
  276. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/filesetter.py +0 -0
  277. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/finders.py +0 -0
  278. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/notfound.py +0 -0
  279. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/resolvable.py +0 -0
  280. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/search.py +0 -0
  281. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/store.py +0 -0
  282. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robot/variables/tablesetter.py +0 -0
  283. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  284. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/entry_points.txt +0 -0
  285. {robotframework-7.1rc2 → robotframework-7.2b1}/src/robotframework.egg-info/top_level.txt +0 -0
  286. {robotframework-7.1rc2 → robotframework-7.2b1}/tasks.py +0 -0
@@ -131,7 +131,7 @@ function addExecutionLog(main) {
131
131
 
132
132
  <script type="text/x-jquery-tmpl" id="tagStatisticsRowTemplate">
133
133
  <tr class="row-${$item.index}">
134
- <td class="stats-col-name" title="{{html doc}}">
134
+ <td class="stats-col-name" title="${doc}">
135
135
  <div class="stat-name">
136
136
  <span>{{html label}}</span>
137
137
  {{if info}}(${info}){{/if}}
@@ -467,7 +467,7 @@ function hideHiddenDetailsColumns(elem) {
467
467
 
468
468
  <script type="text/x-jquery-tmpl" id="tagStatisticsRowTemplate">
469
469
  <tr onclick="tagDetailSelected('${label}')" class="row-${$item.index}">
470
- <td class="stats-col-name" title="{{html doc}}">
470
+ <td class="stats-col-name" title="${doc}">
471
471
  <div class="stat-name">
472
472
  <a href="#tags?${label}">{{html label}}</a>
473
473
  {{if info}}(${info}){{/if}}
@@ -7,7 +7,7 @@ window.testdata = function () {
7
7
  var STATUSES = ['FAIL', 'PASS', 'SKIP', 'NOT RUN'];
8
8
  var KEYWORD_TYPES = ['KEYWORD', 'SETUP', 'TEARDOWN', 'FOR', 'ITERATION', 'IF',
9
9
  'ELSE IF', 'ELSE', 'RETURN', 'VAR', 'TRY', 'EXCEPT', 'FINALLY',
10
- 'WHILE', 'CONTINUE', 'BREAK', 'ERROR'];
10
+ 'WHILE', 'GROUP', 'CONTINUE', 'BREAK', 'ERROR'];
11
11
 
12
12
  function addElement(elem) {
13
13
  if (!elem.id)
@@ -20,8 +20,6 @@ from pathlib import Path
20
20
 
21
21
 
22
22
  if sys.version_info < (3, 9) and not Path(__file__).exists(): # zipsafe
23
- # `importlib.resources.files` is new in Python 3.9, but that version does
24
- # not seem to be compatible with zipapp.
25
23
  try:
26
24
  from importlib_resources import files
27
25
  except ImportError:
@@ -67,9 +67,6 @@ the normal installation. Alternatively it is possible to execute the
67
67
  can be replaced with any supported Python interpreter. Yet another alternative
68
68
  is running the module as a script like `python path/to/robot/libdoc.py`.
69
69
 
70
- The separate `libdoc` command and the support for JSON spec files are new in
71
- Robot Framework 4.0.
72
-
73
70
  Options
74
71
  =======
75
72
 
@@ -85,7 +82,7 @@ Options
85
82
  documentation format and HTML means converting
86
83
  documentation to HTML. The default is RAW with XML
87
84
  spec files and HTML with JSON specs and when using
88
- the special LIBSPEC format. New in RF 4.0.
85
+ the special LIBSPEC format.
89
86
  -F --docformat ROBOT|HTML|TEXT|REST
90
87
  Specifies the source documentation format. Possible
91
88
  values are Robot Framework's documentation format,
@@ -96,11 +93,14 @@ Options
96
93
  Use dark or light HTML theme. If this option is not
97
94
  used, or the value is NONE, the theme is selected
98
95
  based on the browser color scheme. New in RF 6.0.
96
+ --language lang Set the default language in documentation. `lang`
97
+ must be a code of a built-in language, which are
98
+ `en` and `fi`. New in RF 7.2.
99
99
  -n --name name Sets the name of the documented library or resource.
100
100
  -v --version version Sets the version of the documented library or
101
101
  resource.
102
102
  --quiet Do not print the path of the generated output file
103
- to the console. New in RF 4.0.
103
+ to the console.
104
104
  -P --pythonpath path * Additional locations where to search for libraries
105
105
  and resources.
106
106
  -h -? --help Print this help.
@@ -179,7 +179,7 @@ class LibDoc(Application):
179
179
  return options, arguments
180
180
 
181
181
  def main(self, args, name='', version='', format=None, docformat=None,
182
- specdocformat=None, theme=None, pythonpath=None, quiet=False):
182
+ specdocformat=None, theme=None, language=None, pythonpath=None, quiet=False):
183
183
  if pythonpath:
184
184
  sys.path = pythonpath + sys.path
185
185
  lib_or_res, output = args[:2]
@@ -194,7 +194,8 @@ class LibDoc(Application):
194
194
  or specdocformat == 'HTML'
195
195
  or format in ('JSON', 'LIBSPEC') and specdocformat != 'RAW'):
196
196
  libdoc.convert_docs_to_html()
197
- libdoc.save(output, format, self._validate_theme(theme, format))
197
+ libdoc.save(output, format, self._validate_theme(theme, format),
198
+ self._validate_lang(language, format))
198
199
  if not quiet:
199
200
  self.console(Path(output).absolute())
200
201
 
@@ -229,13 +230,21 @@ class LibDoc(Application):
229
230
  raise DataError("The --theme option is only applicable with HTML outputs.")
230
231
  return theme
231
232
 
233
+ def _validate_lang(self, lang, format):
234
+ theme = self._validate('Language', lang, 'FI', 'EN', 'NONE')
235
+ if not theme or theme == 'NONE':
236
+ return None
237
+ if format != 'HTML':
238
+ raise DataError("The --theme option is only applicable with HTML outputs.")
239
+ return theme
240
+
232
241
 
233
242
  def libdoc_cli(arguments=None, exit=True):
234
243
  """Executes Libdoc similarly as from the command line.
235
244
 
236
245
  :param arguments: Command line options and arguments as a list of strings.
237
- Starting from RF 4.0, defaults to ``sys.argv[1:]`` if not given.
238
- :param exit: If ``True``, call ``sys.exit`` automatically. New in RF 4.0.
246
+ Defaults to ``sys.argv[1:]`` if not given.
247
+ :param exit: If ``True``, call ``sys.exit`` automatically.
239
248
 
240
249
  The :func:`libdoc` function may work better in programmatic usage.
241
250
 
@@ -271,9 +280,8 @@ def libdoc(library_or_resource, outfile, name='', version='', format=None,
271
280
  files is converted to HTML regardless of the original documentation
272
281
  format. Possible values are ``'HTML'`` (convert to HTML) and ``'RAW'``
273
282
  (use original format). The default depends on the output format.
274
- New in Robot Framework 4.0.
275
283
  :param quiet: When true, the path of the generated output file is not
276
- printed the console. New in Robot Framework 4.0.
284
+ printed the console.
277
285
 
278
286
  Arguments have same semantics as Libdoc command line options with same names.
279
287
  Run ``libdoc --help`` or consult the Libdoc section in the Robot Framework
@@ -18,23 +18,26 @@ from robot.htmldata import HtmlFileWriter, ModelWriter, LIBDOC
18
18
 
19
19
  class LibdocHtmlWriter:
20
20
 
21
- def __init__(self, theme=None):
21
+ def __init__(self, theme=None, lang=None):
22
22
  self.theme = theme
23
+ self.lang = lang
23
24
 
24
25
  def write(self, libdoc, output):
25
- model_writer = LibdocModelWriter(output, libdoc, self.theme)
26
+ model_writer = LibdocModelWriter(output, libdoc, self.theme, self.lang)
26
27
  HtmlFileWriter(output, model_writer).write(LIBDOC)
27
28
 
28
29
 
29
30
  class LibdocModelWriter(ModelWriter):
30
31
 
31
- def __init__(self, output, libdoc, theme=None):
32
+ def __init__(self, output, libdoc, theme=None, lang=None):
32
33
  self.output = output
33
34
  self.libdoc = libdoc
34
35
  self.theme = theme
36
+ self.lang = lang
35
37
 
36
38
  def write(self, line):
37
- data = self.libdoc.to_json(include_private=False, theme=self.theme)
39
+ data = self.libdoc.to_json(include_private=False, theme=self.theme,
40
+ lang=self.lang)
38
41
  self.output.write(f'<script type="text/javascript">\n'
39
42
  f'libdoc = {data}\n'
40
43
  f'</script>\n')
@@ -89,9 +89,9 @@ class LibraryDoc:
89
89
  def all_tags(self):
90
90
  return Tags(chain.from_iterable(kw.tags for kw in self.keywords))
91
91
 
92
- def save(self, output=None, format='HTML', theme=None):
92
+ def save(self, output=None, format='HTML', theme=None, lang=None):
93
93
  with LibdocOutput(output, format) as outfile:
94
- LibdocWriter(format, theme).write(self, outfile)
94
+ LibdocWriter(format, theme, lang).write(self, outfile)
95
95
 
96
96
  def convert_docs_to_html(self):
97
97
  formatter = DocFormatter(self.keywords, self.type_docs, self.doc, self.doc_format)
@@ -111,7 +111,7 @@ class LibraryDoc:
111
111
  type_doc.doc = formatter.html(type_doc.doc)
112
112
  self.doc_format = 'HTML'
113
113
 
114
- def to_dictionary(self, include_private=False, theme=None):
114
+ def to_dictionary(self, include_private=False, theme=None, lang=None):
115
115
  data = {
116
116
  'specversion': 3,
117
117
  'name': self.name,
@@ -131,10 +131,12 @@ class LibraryDoc:
131
131
  }
132
132
  if theme:
133
133
  data['theme'] = theme.lower()
134
+ if lang:
135
+ data['lang'] = lang.lower()
134
136
  return data
135
137
 
136
- def to_json(self, indent=None, include_private=True, theme=None):
137
- data = self.to_dictionary(include_private, theme)
138
+ def to_json(self, indent=None, include_private=True, theme=None, lang=None):
139
+ data = self.to_dictionary(include_private, theme, lang)
138
140
  return json.dumps(data, indent=indent)
139
141
 
140
142
 
@@ -20,10 +20,10 @@ from .xmlwriter import LibdocXmlWriter
20
20
  from .jsonwriter import LibdocJsonWriter
21
21
 
22
22
 
23
- def LibdocWriter(format=None, theme=None):
23
+ def LibdocWriter(format=None, theme=None, lang=None):
24
24
  format = (format or 'HTML')
25
25
  if format == 'HTML':
26
- return LibdocHtmlWriter(theme)
26
+ return LibdocHtmlWriter(theme, lang)
27
27
  if format == 'XML':
28
28
  return LibdocXmlWriter()
29
29
  if format == 'LIBSPEC':
@@ -24,7 +24,7 @@ from robot.api.deco import keyword
24
24
  from robot.errors import (BreakLoop, ContinueLoop, DataError, ExecutionFailed,
25
25
  ExecutionFailures, ExecutionPassed, PassExecution,
26
26
  ReturnFromKeyword, VariableError)
27
- from robot.running import Keyword, RUN_KW_REGISTER
27
+ from robot.running import Keyword, RUN_KW_REGISTER, TypeInfo
28
28
  from robot.running.context import EXECUTION_CONTEXTS
29
29
  from robot.utils import (DotDict, escape, format_assign_message, get_error_message,
30
30
  get_time, html_escape, is_falsy, is_integer, is_list_like,
@@ -341,8 +341,8 @@ class _Converter(_BuiltInBase):
341
341
  - ``text:`` Converts text to bytes character by character. All
342
342
  characters with ordinal below 256 can be used and are converted to
343
343
  bytes with same values. Many characters are easiest to represent
344
- using escapes like ``\x00`` or ``\xff``. Supports both Unicode
345
- strings and bytes.
344
+ using escapes like ``\x00`` or ``\xff``. In practice this is the same
345
+ as Latin-1 encoding.
346
346
 
347
347
  - ``int:`` Converts integers separated by spaces to bytes. Similarly as
348
348
  with `Convert To Integer`, it is possible to use binary, octal, or
@@ -380,10 +380,10 @@ class _Converter(_BuiltInBase):
380
380
  """
381
381
  try:
382
382
  try:
383
- ordinals = getattr(self, f'_get_ordinals_from_{input_type}')
383
+ get_ordinals = getattr(self, f'_get_ordinals_from_{input_type}')
384
384
  except AttributeError:
385
385
  raise RuntimeError(f"Invalid input type '{input_type}'.")
386
- return bytes(bytearray(o for o in ordinals(input)))
386
+ return bytes(o for o in get_ordinals(input))
387
387
  except:
388
388
  raise RuntimeError("Creating bytes failed: " + get_error_message())
389
389
 
@@ -583,8 +583,8 @@ class _Verify(_BuiltInBase):
583
583
 
584
584
  def should_be_equal(self, first, second, msg=None, values=True,
585
585
  ignore_case=False, formatter='str', strip_spaces=False,
586
- collapse_spaces=False):
587
- """Fails if the given objects are unequal.
586
+ collapse_spaces=False, type=None, types=None):
587
+ r"""Fails if the given objects are unequal.
588
588
 
589
589
  Optional ``msg``, ``values`` and ``formatter`` arguments specify how
590
590
  to construct the error message if this keyword fails:
@@ -614,15 +614,33 @@ class _Verify(_BuiltInBase):
614
614
  arguments are strings, the comparison is done with all white spaces replaced by
615
615
  a single space character.
616
616
 
617
+ The ``type`` and ``types`` arguments control optional type conversion:
618
+ - If ``type`` is used, the argument ``second`` is converted to that type.
619
+ In addition to that, the argument ``first`` is validated to match the type.
620
+ - If ``types`` is used, both ``first`` and ``second`` are converted.
621
+ - Supported types are the same as supported by
622
+ [https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#supported-conversions|
623
+ automatic argument conversion] such as ``int``, ``bytes`` and ``list``.
624
+ Also parameterized types like ``list[int]`` and unions like ``int | float``
625
+ are supported.
626
+ - When using ``type``, a special value ``auto`` can be used to convert
627
+ ``second`` to the same type that ``first`` has.
628
+ - Using both ``type`` and ``types`` at the same time is an error.
629
+
617
630
  Examples:
618
631
  | Should Be Equal | ${x} | expected |
619
632
  | Should Be Equal | ${x} | expected | Custom error message |
620
633
  | Should Be Equal | ${x} | expected | Custom message | values=False |
621
634
  | Should Be Equal | ${x} | expected | ignore_case=True | formatter=repr |
635
+ | Should Be Equal | ${x} | \x00\x01 | type=bytes |
636
+ | Should Be Equal | ${x} | ${y} | types=int|float |
622
637
 
623
638
  ``strip_spaces`` is new in Robot Framework 4.0 and
624
639
  ``collapse_spaces`` is new in Robot Framework 4.1.
640
+ ``type`` and ``types`` are new in Robot Framework 7.2.
625
641
  """
642
+ if type or types:
643
+ first, second = self._type_convert(first, second, type, types)
626
644
  self._log_types_at_info_if_different(first, second)
627
645
  if is_string(first) and is_string(second):
628
646
  if ignore_case:
@@ -636,6 +654,21 @@ class _Verify(_BuiltInBase):
636
654
  second = self._collapse_spaces(second)
637
655
  self._should_be_equal(first, second, msg, values, formatter)
638
656
 
657
+ def _type_convert(self, first, second, type, types, type_builtin=type):
658
+ if type and types:
659
+ raise TypeError("Cannot use both 'type' and 'types' arguments.")
660
+ elif types:
661
+ type = types
662
+ elif isinstance(type, str) and type.upper() == 'AUTO':
663
+ type = type_builtin(first)
664
+ converter = TypeInfo.from_type_hint(type).get_converter()
665
+ if types:
666
+ first = converter.convert(first, 'first')
667
+ elif not converter.no_conversion_needed(first):
668
+ raise ValueError(f"Argument 'first' got value {first!r} that "
669
+ f"does not match type {type!r}.")
670
+ return first, converter.convert(second, 'second')
671
+
639
672
  def _should_be_equal(self, first, second, msg, values, formatter='str'):
640
673
  include_values = self._include_values(values)
641
674
  formatter = self._get_formatter(formatter)
@@ -1527,8 +1560,12 @@ class _Variables(_BuiltInBase):
1527
1560
  For the reasons explained in the `Using variables with keywords creating
1528
1561
  or accessing variables` section, using the escaped format is recommended.
1529
1562
 
1563
+ Notice that ``default`` must be given positionally like ``example`` and
1564
+ not using the named-argument syntax like ``default=example``. We hope to
1565
+ be able to remove this limitation in the future.
1566
+
1530
1567
  Examples:
1531
- | ${x} = `Get Variable Value` $a default
1568
+ | ${x} = `Get Variable Value` $a example
1532
1569
  | ${y} = `Get Variable Value` $a ${b}
1533
1570
  | ${z} = `Get Variable Value` $z
1534
1571
  =>
@@ -1567,7 +1604,7 @@ class _Variables(_BuiltInBase):
1567
1604
  return name, value
1568
1605
 
1569
1606
  @run_keyword_variant(resolve=0)
1570
- def variable_should_exist(self, name, msg=None):
1607
+ def variable_should_exist(self, name, message=None):
1571
1608
  r"""Fails unless the given variable exists within the current scope.
1572
1609
 
1573
1610
  The name of the variable can be given either as a normal variable name
@@ -1575,7 +1612,10 @@ class _Variables(_BuiltInBase):
1575
1612
  For the reasons explained in the `Using variables with keywords creating
1576
1613
  or accessing variables` section, using the escaped format is recommended.
1577
1614
 
1578
- The default error message can be overridden with the ``msg`` argument.
1615
+ The default error message can be overridden with the ``message`` argument.
1616
+ Notice that it must be given positionally like ``A message`` and not
1617
+ using the named-argument syntax like ``message=A message``. We hope to
1618
+ be able to remove this limitation in the future.
1579
1619
 
1580
1620
  See also `Variable Should Not Exist` and `Keyword Should Exist`.
1581
1621
  """
@@ -1583,11 +1623,11 @@ class _Variables(_BuiltInBase):
1583
1623
  try:
1584
1624
  self._variables.replace_scalar(name)
1585
1625
  except VariableError:
1586
- raise AssertionError(self._variables.replace_string(msg)
1587
- if msg else f"Variable '{name}' does not exist.")
1626
+ raise AssertionError(self._variables.replace_string(message)
1627
+ if message else f"Variable '{name}' does not exist.")
1588
1628
 
1589
1629
  @run_keyword_variant(resolve=0)
1590
- def variable_should_not_exist(self, name, msg=None):
1630
+ def variable_should_not_exist(self, name, message=None):
1591
1631
  r"""Fails if the given variable exists within the current scope.
1592
1632
 
1593
1633
  The name of the variable can be given either as a normal variable name
@@ -1595,7 +1635,10 @@ class _Variables(_BuiltInBase):
1595
1635
  For the reasons explained in the `Using variables with keywords creating
1596
1636
  or accessing variables` section, using the escaped format is recommended.
1597
1637
 
1598
- The default error message can be overridden with the ``msg`` argument.
1638
+ The default error message can be overridden with the ``message`` argument.
1639
+ Notice that it must be given positionally like ``A message`` and not
1640
+ using the named-argument syntax like ``message=A message``. We hope to
1641
+ be able to remove this limitation in the future.
1599
1642
 
1600
1643
  See also `Variable Should Exist` and `Keyword Should Exist`.
1601
1644
  """
@@ -1605,8 +1648,8 @@ class _Variables(_BuiltInBase):
1605
1648
  except VariableError:
1606
1649
  pass
1607
1650
  else:
1608
- raise AssertionError(self._variables.replace_string(msg)
1609
- if msg else f"Variable '{name}' exists.")
1651
+ raise AssertionError(self._variables.replace_string(message)
1652
+ if message else f"Variable '{name}' exists.")
1610
1653
 
1611
1654
  def replace_variables(self, text):
1612
1655
  """Replaces variables in the given text with their current values.
@@ -1710,8 +1753,12 @@ class _Variables(_BuiltInBase):
1710
1753
  variable in a user keyword, it is available both in the test case level
1711
1754
  and also in all other user keywords used in the current test. Other
1712
1755
  test cases will not see variables set with this keyword.
1713
- It is an error to call `Set Test Variable` outside the
1714
- scope of a test (e.g. in a Suite Setup or Teardown).
1756
+
1757
+ If `Set Test Variable` is used in suite setup, the variable is available
1758
+ everywhere within that suite setup as well as in the corresponding suite
1759
+ teardown, but it is not seen by tests or possible child suites. If the
1760
+ keyword is used in a suite teardown, the variable is available only in that
1761
+ teardown.
1715
1762
 
1716
1763
  See `Set Suite Variable` for more information and usage examples. See
1717
1764
  also the `Using variables with keywords creating or accessing variables`
@@ -1724,6 +1771,9 @@ class _Variables(_BuiltInBase):
1724
1771
 
1725
1772
  *NOTE:* The ``VAR`` syntax introduced in Robot Framework 7.0 is recommended
1726
1773
  over this keyword.
1774
+
1775
+ *NOTE:* Prior to Robot Framework 7.2, using `Set Test Variable` in a suite
1776
+ setup or teardown was an error.
1727
1777
  """
1728
1778
  name = self._get_var_name(name)
1729
1779
  value = self._get_var_value(name, values)
@@ -1914,7 +1964,7 @@ class _RunKeyword(_BuiltInBase):
1914
1964
  if not (ctx.dry_run or self._accepts_embedded_arguments(name, ctx)):
1915
1965
  name, args = self._replace_variables_in_name([name] + list(args))
1916
1966
  if ctx.steps:
1917
- data, result = ctx.steps[-1]
1967
+ data, result, _ = ctx.steps[-1]
1918
1968
  lineno = data.lineno
1919
1969
  else: # Called, typically by a listener, when no keyword started.
1920
1970
  data = lineno = None
@@ -2415,6 +2465,7 @@ class _RunKeyword(_BuiltInBase):
2415
2465
  try:
2416
2466
  return self.run_keyword(name, *args)
2417
2467
  except ExecutionFailed as err:
2468
+ self._reset_keyword_timeout_in_teardown(err, self._context)
2418
2469
  if err.dont_continue or err.skip:
2419
2470
  raise
2420
2471
  count -= 1
@@ -2434,6 +2485,17 @@ class _RunKeyword(_BuiltInBase):
2434
2485
  )
2435
2486
  self._sleep_in_parts(sleep_time)
2436
2487
 
2488
+ def _reset_keyword_timeout_in_teardown(self, err, context):
2489
+ # Keyword timeouts in teardowns have been converted to normal failures
2490
+ # to allow execution to continue on higher level:
2491
+ # https://github.com/robotframework/robotframework/issues/3398
2492
+ # We need to reset it here to not continue unnecessarily:
2493
+ # https://github.com/robotframework/robotframework/issues/5237
2494
+ if context.in_teardown:
2495
+ timeouts = [t for t in context.timeouts if t.type == 'Keyword']
2496
+ if timeouts and min(timeouts).timed_out():
2497
+ err.keyword_timeout = True
2498
+
2437
2499
  @run_keyword_variant(resolve=1)
2438
2500
  def set_variable_if(self, condition, *values):
2439
2501
  """Sets variable based on the given condition.
@@ -3550,12 +3612,16 @@ class _Misc(_BuiltInBase):
3550
3612
  return re.escape(patterns[0])
3551
3613
  return [re.escape(p) for p in patterns]
3552
3614
 
3553
- def set_test_message(self, message, append=False):
3615
+ def set_test_message(self, message, append=False, separator=' '):
3554
3616
  """Sets message for the current test case.
3555
3617
 
3556
3618
  If the optional ``append`` argument is given a true value (see `Boolean
3557
3619
  arguments`), the given ``message`` is added after the possible earlier
3558
- message by joining the messages with a space.
3620
+ message.
3621
+
3622
+ An optional ``separator`` argument can be used to provide custom separator
3623
+ string when appending to the old text. A single space is used as separator
3624
+ by default.
3559
3625
 
3560
3626
  In test teardown this keyword can alter the possible failure message,
3561
3627
  but otherwise failures override messages set by this keyword. Notice
@@ -3572,19 +3638,21 @@ class _Misc(_BuiltInBase):
3572
3638
  | Set Test Message | `*`HTML`*` <b>Hello!</b> | |
3573
3639
 
3574
3640
  This keyword can not be used in suite setup or suite teardown.
3641
+
3642
+ The ``separator`` argument is new in Robot Framework 7.2.
3575
3643
  """
3576
3644
  test = self._context.test
3577
3645
  if not test:
3578
3646
  raise RuntimeError("'Set Test Message' keyword cannot be used in "
3579
3647
  "suite setup or teardown.")
3580
- test.message = self._get_new_text(test.message, message,
3581
- append, handle_html=True)
3648
+ test.message = self._get_new_text(
3649
+ test.message, message, append, handle_html=True, separator=separator)
3582
3650
  if self._context.in_test_teardown:
3583
3651
  self._variables.set_test("${TEST_MESSAGE}", test.message)
3584
3652
  message, level = self._get_logged_test_message_and_level(test.message)
3585
3653
  self.log(f'Set test message to:\n{message}', level)
3586
3654
 
3587
- def _get_new_text(self, old, new, append, handle_html=False):
3655
+ def _get_new_text(self, old, new, append, handle_html=False, separator=' '):
3588
3656
  if not is_string(new):
3589
3657
  new = str(new)
3590
3658
  if not (is_truthy(append) and old):
@@ -3594,35 +3662,43 @@ class _Misc(_BuiltInBase):
3594
3662
  new = new[6:].lstrip()
3595
3663
  if not old.startswith('*HTML*'):
3596
3664
  old = f'*HTML* {html_escape(old)}'
3665
+ separator = html_escape(separator)
3597
3666
  elif old.startswith('*HTML*'):
3598
3667
  new = html_escape(new)
3599
- return f'{old} {new}'
3668
+ separator = html_escape(separator)
3669
+ return f'{old}{separator}{new}'
3600
3670
 
3601
3671
  def _get_logged_test_message_and_level(self, message):
3602
3672
  if message.startswith('*HTML*'):
3603
3673
  return message[6:].lstrip(), 'HTML'
3604
3674
  return message, 'INFO'
3605
3675
 
3606
- def set_test_documentation(self, doc, append=False):
3676
+ def set_test_documentation(self, doc, append=False, separator=' '):
3607
3677
  """Sets documentation for the current test case.
3608
3678
 
3609
- By default the possible existing documentation is overwritten, but
3679
+ The possible existing documentation is overwritten by default, but
3610
3680
  this can be changed using the optional ``append`` argument similarly
3611
3681
  as with `Set Test Message` keyword.
3612
3682
 
3683
+ An optional ``separator`` argument can be used to provide custom separator
3684
+ string when appending to the old text. A single space is used as separator
3685
+ by default.
3686
+
3613
3687
  The current test documentation is available as a built-in variable
3614
3688
  ``${TEST DOCUMENTATION}``. This keyword can not be used in suite
3615
3689
  setup or suite teardown.
3690
+
3691
+ The ``separator`` argument is new in Robot Framework 7.2.
3616
3692
  """
3617
3693
  test = self._context.test
3618
3694
  if not test:
3619
3695
  raise RuntimeError("'Set Test Documentation' keyword cannot be "
3620
3696
  "used in suite setup or teardown.")
3621
- test.doc = self._get_new_text(test.doc, doc, append)
3697
+ test.doc = self._get_new_text(test.doc, doc, append, separator=separator)
3622
3698
  self._variables.set_test('${TEST_DOCUMENTATION}', test.doc)
3623
3699
  self.log(f'Set test documentation to:\n{test.doc}')
3624
3700
 
3625
- def set_suite_documentation(self, doc, append=False, top=False):
3701
+ def set_suite_documentation(self, doc, append=False, top=False, separator=' '):
3626
3702
  """Sets documentation for the current test suite.
3627
3703
 
3628
3704
  By default, the possible existing documentation is overwritten, but
@@ -3634,15 +3710,21 @@ class _Misc(_BuiltInBase):
3634
3710
  arguments`), the documentation of the top level suite is altered
3635
3711
  instead.
3636
3712
 
3713
+ An optional ``separator`` argument can be used to provide custom separator
3714
+ string when appending to the old text. A single space is used as separator
3715
+ by default.
3716
+
3637
3717
  The documentation of the current suite is available as a built-in
3638
3718
  variable ``${SUITE DOCUMENTATION}``.
3719
+
3720
+ The ``separator`` argument is new in Robot Framework 7.2.
3639
3721
  """
3640
3722
  suite = self._get_context(top).suite
3641
- suite.doc = self._get_new_text(suite.doc, doc, append)
3723
+ suite.doc = self._get_new_text(suite.doc, doc, append, separator=separator)
3642
3724
  self._variables.set_suite('${SUITE_DOCUMENTATION}', suite.doc, top)
3643
3725
  self.log(f'Set suite documentation to:\n{suite.doc}')
3644
3726
 
3645
- def set_suite_metadata(self, name, value, append=False, top=False):
3727
+ def set_suite_metadata(self, name, value, append=False, top=False, separator=' '):
3646
3728
  """Sets metadata for the current test suite.
3647
3729
 
3648
3730
  By default, possible existing metadata values are overwritten, but
@@ -3653,15 +3735,22 @@ class _Misc(_BuiltInBase):
3653
3735
  If the optional ``top`` argument is given a true value (see `Boolean
3654
3736
  arguments`), the metadata of the top level suite is altered instead.
3655
3737
 
3738
+ An optional ``separator`` argument can be used to provide custom separator
3739
+ string when appending to the old text. A single space is used as separator
3740
+ by default.
3741
+
3656
3742
  The metadata of the current suite is available as a built-in variable
3657
3743
  ``${SUITE METADATA}`` in a Python dictionary. Notice that modifying this
3658
3744
  variable directly has no effect on the actual metadata the suite has.
3745
+
3746
+ The ``separator`` argument is new in Robot Framework 7.2.
3659
3747
  """
3660
3748
  if not is_string(name):
3661
3749
  name = str(name)
3662
3750
  metadata = self._get_context(top).suite.metadata
3663
3751
  original = metadata.get(name, '')
3664
- metadata[name] = self._get_new_text(original, value, append)
3752
+ metadata[name] = self._get_new_text(original, value, append,
3753
+ separator=separator)
3665
3754
  self._variables.set_suite('${SUITE_METADATA}', metadata.copy(), top)
3666
3755
  self.log(f"Set suite metadata '{name}' to value '{metadata[name]}'.")
3667
3756
 
@@ -455,9 +455,8 @@ class _List:
455
455
  normalize = Normalizer(ignore_case).normalize
456
456
  list1 = normalize(list1)
457
457
  list2 = normalize(list2)
458
- diffs = ', '.join(str(item) for item in list2 if item not in list1)
459
- _verify_condition(not diffs,
460
- f'Following values were not found from first list: {diffs}',
458
+ diffs = [item for item in list2 if item not in list1]
459
+ _verify_condition(not diffs, f'Following values are missing: {seq2str(diffs)}',
461
460
  msg, values)
462
461
 
463
462
  def log_list(self, list_, level='INFO'):
@@ -784,7 +783,8 @@ class _Dictionary:
784
783
  )
785
784
 
786
785
  def dictionaries_should_be_equal(self, dict1, dict2, msg=None, values=True,
787
- ignore_keys=None, ignore_case=False):
786
+ ignore_keys=None, ignore_case=False,
787
+ ignore_value_order=False):
788
788
  """Fails if the given dictionaries are not equal.
789
789
 
790
790
  First the equality of dictionaries' keys is checked and after that all
@@ -808,9 +808,15 @@ class _Dictionary:
808
808
  The ``ignore_case`` argument can be used to make comparison case-insensitive.
809
809
  See the `Ignore case` section for more details. This option is new in
810
810
  Robot Framework 7.0.
811
+
812
+ The ``ignore_value_order`` argument can be used to make comparison in case of
813
+ list-like values to ignore the order of the elements in the lists.
814
+ Using it requires items to be sortable.
815
+ This option is new in Robot Framework 7.2.
811
816
  """
812
817
  self._validate_dictionary(dict1, dict2)
813
- normalizer = Normalizer(ignore_case, ignore_keys=ignore_keys)
818
+ normalizer = Normalizer(ignore_case=ignore_case, ignore_keys=ignore_keys,
819
+ ignore_order=ignore_value_order)
814
820
  dict1 = normalizer.normalize(dict1)
815
821
  dict2 = normalizer.normalize(dict2)
816
822
  self._should_have_same_keys(dict1, dict2, msg, values)
@@ -840,7 +846,8 @@ class _Dictionary:
840
846
  _report_error(error, message, values)
841
847
 
842
848
  def dictionary_should_contain_sub_dictionary(self, dict1, dict2, msg=None,
843
- values=True, ignore_case=False):
849
+ values=True, ignore_case=False,
850
+ ignore_value_order=False):
844
851
  """Fails unless all items in ``dict2`` are found from ``dict1``.
845
852
 
846
853
  See `Lists Should Be Equal` for more information about configuring
@@ -849,9 +856,15 @@ class _Dictionary:
849
856
  The ``ignore_case`` argument can be used to make comparison case-insensitive.
850
857
  See the `Ignore case` section for more details. This option is new in
851
858
  Robot Framework 7.0.
859
+
860
+ The ``ignore_value_order`` argument can be used to make comparison in case of
861
+ list-like values to ignore the order of the elements in the lists.
862
+ Using it requires items to be sortable.
863
+ This option is new in Robot Framework 7.2.
852
864
  """
853
865
  self._validate_dictionary(dict1, dict2)
854
- normalizer = Normalizer(ignore_case)
866
+ normalizer = Normalizer(ignore_case=ignore_case,
867
+ ignore_order=ignore_value_order)
855
868
  dict1 = normalizer.normalize(dict1)
856
869
  dict2 = normalizer.normalize(dict2)
857
870
  self._should_have_same_keys(dict1, dict2, msg, values, validate_both=False)
@@ -27,12 +27,12 @@ This package is considered stable.
27
27
 
28
28
  from .body import BaseBody, Body, BodyItem, BaseBranches, BaseIterations
29
29
  from .configurer import SuiteConfigurer
30
- from .control import (Break, Continue, Error, For, ForIteration, If, IfBranch,
31
- Return, Try, TryBranch, Var, While, WhileIteration)
30
+ from .control import (Break, Continue, Error, For, ForIteration, Group, If,
31
+ IfBranch, Return, Try, TryBranch, Var, While, WhileIteration)
32
32
  from .fixture import create_fixture
33
33
  from .itemlist import ItemList
34
34
  from .keyword import Keyword
35
- from .message import Message, MessageLevel, Messages
35
+ from .message import Message, MessageLevel
36
36
  from .modelobject import DataDict, ModelObject
37
37
  from .modifier import ModelModifier
38
38
  from .statistics import Statistics