robotframework 7.3rc1__tar.gz → 7.3rc2__tar.gz

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 (287) hide show
  1. robotframework-7.3rc2/PKG-INFO +190 -0
  2. robotframework-7.3rc2/pyproject.toml +39 -0
  3. {robotframework-7.3rc1 → robotframework-7.3rc2}/setup.py +2 -1
  4. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/BuiltIn.py +4 -1
  5. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/itemlist.py +13 -9
  6. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/modelobject.py +1 -1
  7. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/listeners.py +27 -44
  8. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/model/statements.py +31 -17
  9. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/typeconverters.py +6 -7
  10. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/typeinfo.py +15 -6
  11. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/bodyrunner.py +41 -21
  12. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/timeouts/runner.py +9 -5
  13. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/timeouts/timeout.py +20 -6
  14. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/timeouts/windows.py +26 -16
  15. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/importer.py +41 -23
  16. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/robottypes.py +6 -7
  17. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/assigner.py +30 -27
  18. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/search.py +0 -2
  19. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/version.py +1 -1
  20. robotframework-7.3rc2/src/robotframework.egg-info/PKG-INFO +190 -0
  21. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robotframework.egg-info/SOURCES.txt +1 -0
  22. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robotframework.egg-info/entry_points.txt +0 -1
  23. robotframework-7.3rc1/PKG-INFO +0 -187
  24. robotframework-7.3rc1/src/robotframework.egg-info/PKG-INFO +0 -187
  25. {robotframework-7.3rc1 → robotframework-7.3rc2}/AUTHORS.rst +0 -0
  26. {robotframework-7.3rc1 → robotframework-7.3rc2}/BUILD.rst +0 -0
  27. {robotframework-7.3rc1 → robotframework-7.3rc2}/CONTRIBUTING.rst +0 -0
  28. {robotframework-7.3rc1 → robotframework-7.3rc2}/COPYRIGHT.txt +0 -0
  29. {robotframework-7.3rc1 → robotframework-7.3rc2}/INSTALL.rst +0 -0
  30. {robotframework-7.3rc1 → robotframework-7.3rc2}/LICENSE.txt +0 -0
  31. {robotframework-7.3rc1 → robotframework-7.3rc2}/MANIFEST.in +0 -0
  32. {robotframework-7.3rc1 → robotframework-7.3rc2}/README.rst +0 -0
  33. {robotframework-7.3rc1 → robotframework-7.3rc2}/setup.cfg +0 -0
  34. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/__init__.py +0 -0
  35. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/__main__.py +0 -0
  36. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/__init__.py +0 -0
  37. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/deco.py +0 -0
  38. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/exceptions.py +0 -0
  39. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/interfaces.py +0 -0
  40. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/logger.py +0 -0
  41. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/parsing.py +0 -0
  42. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/api/py.typed +0 -0
  43. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/conf/__init__.py +0 -0
  44. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/conf/gatherfailed.py +0 -0
  45. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/conf/languages.py +0 -0
  46. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/conf/settings.py +0 -0
  47. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/errors.py +0 -0
  48. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/__init__.py +0 -0
  49. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/common/__init__.py +0 -0
  50. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/common/js_disabled.css +0 -0
  51. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/common/storage.js +0 -0
  52. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/htmlfilewriter.py +0 -0
  53. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/jsonwriter.py +0 -0
  54. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/lib/__init__.py +0 -0
  55. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  56. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/lib/jquery.min.js +0 -0
  57. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  58. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  59. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  60. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/libdoc/__init__.py +0 -0
  61. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  62. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/__init__.py +0 -0
  63. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/common.css +0 -0
  64. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  65. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/fileloading.js +0 -0
  66. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/log.css +0 -0
  67. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/log.html +0 -0
  68. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/log.js +0 -0
  69. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/model.js +0 -0
  70. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/print.css +0 -0
  71. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/report.css +0 -0
  72. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/report.html +0 -0
  73. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/testdata.js +0 -0
  74. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/util.js +0 -0
  75. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/rebot/view.js +0 -0
  76. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/template.py +0 -0
  77. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/testdoc/__init__.py +0 -0
  78. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  79. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  80. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdoc.py +0 -0
  81. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/__init__.py +0 -0
  82. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/builder.py +0 -0
  83. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/consoleviewer.py +0 -0
  84. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/datatypes.py +0 -0
  85. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/htmlutils.py +0 -0
  86. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/htmlwriter.py +0 -0
  87. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/jsonbuilder.py +0 -0
  88. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/jsonwriter.py +0 -0
  89. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/languages.py +0 -0
  90. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/model.py +0 -0
  91. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/output.py +0 -0
  92. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/robotbuilder.py +0 -0
  93. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/standardtypes.py +0 -0
  94. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/writer.py +0 -0
  95. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  96. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libdocpkg/xmlwriter.py +0 -0
  97. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Collections.py +0 -0
  98. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/DateTime.py +0 -0
  99. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Dialogs.py +0 -0
  100. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Easter.py +0 -0
  101. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/OperatingSystem.py +0 -0
  102. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Process.py +0 -0
  103. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Remote.py +0 -0
  104. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Screenshot.py +0 -0
  105. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/String.py +0 -0
  106. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/Telnet.py +0 -0
  107. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/XML.py +0 -0
  108. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/__init__.py +0 -0
  109. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/libraries/dialogs_py.py +0 -0
  110. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/logo.png +0 -0
  111. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/__init__.py +0 -0
  112. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/body.py +0 -0
  113. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/configurer.py +0 -0
  114. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/control.py +0 -0
  115. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/filter.py +0 -0
  116. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/fixture.py +0 -0
  117. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/keyword.py +0 -0
  118. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/message.py +0 -0
  119. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/metadata.py +0 -0
  120. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/modifier.py +0 -0
  121. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/namepatterns.py +0 -0
  122. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/statistics.py +0 -0
  123. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/stats.py +0 -0
  124. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/suitestatistics.py +0 -0
  125. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/tags.py +0 -0
  126. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/tagsetter.py +0 -0
  127. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/tagstatistics.py +0 -0
  128. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/testcase.py +0 -0
  129. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/testsuite.py +0 -0
  130. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/totalstatistics.py +0 -0
  131. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/model/visitor.py +0 -0
  132. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/__init__.py +0 -0
  133. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/console/__init__.py +0 -0
  134. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/console/dotted.py +0 -0
  135. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/console/highlighting.py +0 -0
  136. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/console/quiet.py +0 -0
  137. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/console/verbose.py +0 -0
  138. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/debugfile.py +0 -0
  139. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/filelogger.py +0 -0
  140. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/jsonlogger.py +0 -0
  141. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/librarylogger.py +0 -0
  142. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/logger.py +0 -0
  143. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/loggerapi.py +0 -0
  144. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/loggerhelper.py +0 -0
  145. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/loglevel.py +0 -0
  146. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/output.py +0 -0
  147. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/outputfile.py +0 -0
  148. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/pyloggingconf.py +0 -0
  149. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/stdoutlogsplitter.py +0 -0
  150. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/output/xmllogger.py +0 -0
  151. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/__init__.py +0 -0
  152. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/__init__.py +0 -0
  153. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/blocklexers.py +0 -0
  154. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/context.py +0 -0
  155. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/lexer.py +0 -0
  156. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/settings.py +0 -0
  157. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/statementlexers.py +0 -0
  158. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/tokenizer.py +0 -0
  159. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/lexer/tokens.py +0 -0
  160. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/model/__init__.py +0 -0
  161. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/model/blocks.py +0 -0
  162. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/model/visitor.py +0 -0
  163. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/parser/__init__.py +0 -0
  164. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/parser/blockparsers.py +0 -0
  165. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/parser/fileparser.py +0 -0
  166. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/parser/parser.py +0 -0
  167. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/parsing/suitestructure.py +0 -0
  168. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/pythonpathsetter.py +0 -0
  169. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/rebot.py +0 -0
  170. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/__init__.py +0 -0
  171. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  172. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/jsbuildingcontext.py +0 -0
  173. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/jsexecutionresult.py +0 -0
  174. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/jsmodelbuilders.py +0 -0
  175. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/jswriter.py +0 -0
  176. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/logreportwriters.py +0 -0
  177. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/outputwriter.py +0 -0
  178. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/resultwriter.py +0 -0
  179. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/stringcache.py +0 -0
  180. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/reporting/xunitwriter.py +0 -0
  181. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/__init__.py +0 -0
  182. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/configurer.py +0 -0
  183. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/executionerrors.py +0 -0
  184. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/executionresult.py +0 -0
  185. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/flattenkeywordmatcher.py +0 -0
  186. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/keywordremover.py +0 -0
  187. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/merger.py +0 -0
  188. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/messagefilter.py +0 -0
  189. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/model.py +0 -0
  190. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/modeldeprecation.py +0 -0
  191. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/resultbuilder.py +0 -0
  192. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/suiteteardownfailed.py +0 -0
  193. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/visitor.py +0 -0
  194. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/result/xmlelementhandlers.py +0 -0
  195. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/run.py +0 -0
  196. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/__init__.py +0 -0
  197. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/__init__.py +0 -0
  198. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/argumentconverter.py +0 -0
  199. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/argumentmapper.py +0 -0
  200. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/argumentparser.py +0 -0
  201. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/argumentresolver.py +0 -0
  202. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/argumentspec.py +0 -0
  203. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/argumentvalidator.py +0 -0
  204. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/customconverters.py +0 -0
  205. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/embedded.py +0 -0
  206. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/typeinfoparser.py +0 -0
  207. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/arguments/typevalidator.py +0 -0
  208. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/builder/__init__.py +0 -0
  209. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/builder/builders.py +0 -0
  210. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/builder/parsers.py +0 -0
  211. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/builder/settings.py +0 -0
  212. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/builder/transformers.py +0 -0
  213. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/context.py +0 -0
  214. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/dynamicmethods.py +0 -0
  215. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/importer.py +0 -0
  216. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/invalidkeyword.py +0 -0
  217. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/keywordfinder.py +0 -0
  218. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/keywordimplementation.py +0 -0
  219. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/librarykeyword.py +0 -0
  220. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/librarykeywordrunner.py +0 -0
  221. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/libraryscopes.py +0 -0
  222. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/model.py +0 -0
  223. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/namespace.py +0 -0
  224. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/outputcapture.py +0 -0
  225. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/randomizer.py +0 -0
  226. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/resourcemodel.py +0 -0
  227. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/runkwregister.py +0 -0
  228. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/signalhandler.py +0 -0
  229. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/status.py +0 -0
  230. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/statusreporter.py +0 -0
  231. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/suiterunner.py +0 -0
  232. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/testlibraries.py +0 -0
  233. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/timeouts/__init__.py +0 -0
  234. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/timeouts/nosupport.py +0 -0
  235. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/timeouts/posix.py +0 -0
  236. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/running/userkeywordrunner.py +0 -0
  237. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/testdoc.py +0 -0
  238. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/__init__.py +0 -0
  239. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/application.py +0 -0
  240. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/argumentparser.py +0 -0
  241. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/asserts.py +0 -0
  242. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/charwidth.py +0 -0
  243. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/compress.py +0 -0
  244. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/connectioncache.py +0 -0
  245. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/dotdict.py +0 -0
  246. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/encoding.py +0 -0
  247. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/encodingsniffer.py +0 -0
  248. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/error.py +0 -0
  249. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/escaping.py +0 -0
  250. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/etreewrapper.py +0 -0
  251. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/filereader.py +0 -0
  252. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/frange.py +0 -0
  253. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/htmlformatters.py +0 -0
  254. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/json.py +0 -0
  255. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/markuputils.py +0 -0
  256. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/markupwriters.py +0 -0
  257. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/match.py +0 -0
  258. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/misc.py +0 -0
  259. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/normalizing.py +0 -0
  260. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/notset.py +0 -0
  261. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/platform.py +0 -0
  262. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/recommendations.py +0 -0
  263. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/restreader.py +0 -0
  264. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/robotenv.py +0 -0
  265. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/robotinspect.py +0 -0
  266. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/robotio.py +0 -0
  267. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/robotpath.py +0 -0
  268. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/robottime.py +0 -0
  269. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/setter.py +0 -0
  270. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/sortable.py +0 -0
  271. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/text.py +0 -0
  272. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/typehints.py +0 -0
  273. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/utils/unic.py +0 -0
  274. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/__init__.py +0 -0
  275. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/evaluation.py +0 -0
  276. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/filesetter.py +0 -0
  277. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/finders.py +0 -0
  278. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/notfound.py +0 -0
  279. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/replacer.py +0 -0
  280. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/resolvable.py +0 -0
  281. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/scopes.py +0 -0
  282. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/store.py +0 -0
  283. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/tablesetter.py +0 -0
  284. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robot/variables/variables.py +0 -0
  285. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robotframework.egg-info/dependency_links.txt +0 -0
  286. {robotframework-7.3rc1 → robotframework-7.3rc2}/src/robotframework.egg-info/top_level.txt +0 -0
  287. {robotframework-7.3rc1 → robotframework-7.3rc2}/tasks.py +0 -0
@@ -0,0 +1,190 @@
1
+ Metadata-Version: 2.1
2
+ Name: robotframework
3
+ Version: 7.3rc2
4
+ Summary: Generic automation framework for acceptance testing and robotic process automation (RPA)
5
+ Home-page: https://robotframework.org
6
+ Download-URL: https://pypi.org/project/robotframework
7
+ Author: Pekka Klärck
8
+ Author-email: peke@eliga.fi
9
+ License: Apache License 2.0
10
+ Project-URL: Source, https://github.com/robotframework/robotframework
11
+ Project-URL: Issue Tracker, https://github.com/robotframework/robotframework/issues
12
+ Project-URL: Documentation, https://robotframework.org/robotframework
13
+ Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.3rc2.rst
14
+ Project-URL: Slack, http://slack.robotframework.org
15
+ Keywords: robotframework automation testautomation rpa testing acceptancetesting atdd bdd
16
+ Platform: any
17
+ Classifier: Development Status :: 5 - Production/Stable
18
+ Classifier: License :: OSI Approved :: Apache Software License
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Programming Language :: Python :: 3.8
23
+ Classifier: Programming Language :: Python :: 3.9
24
+ Classifier: Programming Language :: Python :: 3.10
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
28
+ Classifier: Programming Language :: Python :: 3.14
29
+ Classifier: Programming Language :: Python :: Implementation :: CPython
30
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
31
+ Classifier: Topic :: Software Development :: Testing
32
+ Classifier: Topic :: Software Development :: Testing :: Acceptance
33
+ Classifier: Topic :: Software Development :: Testing :: BDD
34
+ Classifier: Framework :: Robot Framework
35
+ Requires-Python: >=3.8
36
+ Description-Content-Type: text/x-rst
37
+ License-File: LICENSE.txt
38
+ License-File: AUTHORS.rst
39
+
40
+ Robot Framework
41
+ ===============
42
+
43
+ .. contents::
44
+ :local:
45
+
46
+ Introduction
47
+ ------------
48
+
49
+ `Robot Framework <http://robotframework.org>`_ |r| is a generic open source
50
+ automation framework for acceptance testing, acceptance test driven
51
+ development (ATDD), and robotic process automation (RPA). It has simple plain
52
+ text syntax and it can be extended easily with generic and custom libraries.
53
+
54
+ Robot Framework is operating system and application independent. It is
55
+ implemented using `Python <http://python.org>`_ which is also the primary
56
+ language to extend it. The framework has a rich ecosystem around it consisting
57
+ of various generic libraries and tools that are developed as separate projects.
58
+ For more information about Robot Framework and the ecosystem, see
59
+ http://robotframework.org.
60
+
61
+ Robot Framework project is hosted on GitHub_ where you can find source code,
62
+ an issue tracker, and some further documentation. Downloads are hosted on PyPI_.
63
+
64
+ Robot Framework development is sponsored by non-profit `Robot Framework Foundation
65
+ <http://robotframework.org/foundation>`_. If you are using the framework
66
+ and benefiting from it, consider joining the foundation to help maintaining
67
+ the framework and developing it further.
68
+
69
+ .. _GitHub: https://github.com/robotframework/robotframework
70
+ .. _PyPI: https://pypi.python.org/pypi/robotframework
71
+
72
+ .. image:: https://img.shields.io/pypi/v/robotframework.svg?label=version
73
+ :target: https://pypi.python.org/pypi/robotframework
74
+ :alt: Latest version
75
+
76
+ .. image:: https://img.shields.io/pypi/l/robotframework.svg
77
+ :target: http://www.apache.org/licenses/LICENSE-2.0.html
78
+ :alt: License
79
+
80
+ Installation
81
+ ------------
82
+
83
+ If you already have Python_ with `pip <https://pip.pypa.io>`_ installed,
84
+ you can simply run::
85
+
86
+ pip install robotframework
87
+
88
+ For more detailed installation instructions, including installing Python, see
89
+ `INSTALL.rst <https://github.com/robotframework/robotframework/blob/master/INSTALL.rst>`__.
90
+
91
+ Robot Framework requires Python 3.8 or newer and runs also on `PyPy <http://pypy.org>`_.
92
+ The latest version that supports Python 3.6 and 3.7 is `Robot Framework 6.1.1`__.
93
+ If you need to use Python 2, `Jython <http://jython.org>`_ or
94
+ `IronPython <http://ironpython.net>`_, you can use `Robot Framework 4.1.3`__.
95
+
96
+ __ https://github.com/robotframework/robotframework/tree/v6.1.1#readme
97
+ __ https://github.com/robotframework/robotframework/tree/v4.1.3#readme
98
+
99
+ Example
100
+ -------
101
+
102
+ Below is a simple example test case for testing login to some system.
103
+ You can find more examples with links to related demo projects from
104
+ http://robotframework.org.
105
+
106
+ .. code:: robotframework
107
+
108
+ *** Settings ***
109
+ Documentation A test suite with a single test for valid login.
110
+ ...
111
+ ... This test has a workflow that is created using keywords in
112
+ ... the imported resource file.
113
+ Resource login.resource
114
+
115
+ *** Test Cases ***
116
+ Valid Login
117
+ Open Browser To Login Page
118
+ Input Username demo
119
+ Input Password mode
120
+ Submit Credentials
121
+ Welcome Page Should Be Open
122
+ [Teardown] Close Browser
123
+
124
+ Usage
125
+ -----
126
+
127
+ Tests (or tasks) are executed from the command line using the ``robot``
128
+ command or by executing the ``robot`` module directly like ``python -m robot`` .
129
+
130
+ The basic usage is giving a path to a test (or task) file or directory as an
131
+ argument with possible command line options before the path::
132
+
133
+ robot tests.robot
134
+ robot --variable BROWSER:Firefox --outputdir results path/to/tests/
135
+
136
+ Additionally, there is the ``rebot`` tool for combining results and otherwise
137
+ post-processing outputs::
138
+
139
+ rebot --name Example output1.xml output2.xml
140
+
141
+ Run ``robot --help`` and ``rebot --help`` for more information about the command
142
+ line usage. For a complete reference manual see `Robot Framework User Guide`_.
143
+
144
+ Documentation
145
+ -------------
146
+
147
+ - `Robot Framework User Guide
148
+ <http://robotframework.org/robotframework/#user-guide>`_
149
+ - `Standard libraries
150
+ <http://robotframework.org/robotframework/#standard-libraries>`_
151
+ - `API documentation <http://robot-framework.readthedocs.org>`_
152
+ - `General documentation <http://robotframework.org/>`_
153
+
154
+ Support and Contact
155
+ -------------------
156
+
157
+ - `Slack <http://slack.robotframework.org/>`_
158
+ - `Forum <https://forum.robotframework.org/>`_
159
+ - `robotframework-users
160
+ <https://groups.google.com/group/robotframework-users/>`_ mailing list
161
+
162
+ Contributing
163
+ ------------
164
+
165
+ Interested to contribute to Robot Framework? Great! In that case it is a good
166
+ start by looking at the `CONTRIBUTING.rst <https://github.com/robotframework/robotframework/blob/master/CONTRIBUTING.rst>`__. If you
167
+ do not already have an issue you would like to work on, you can check
168
+ issues with `good new issue`__ and `help wanted`__ labels.
169
+
170
+ Remember also that there are many other tools and libraries in the wider
171
+ `Robot Framework ecosystem <http://robotframework.org>`_ that you can
172
+ contribute to!
173
+
174
+ __ https://github.com/robotframework/robotframework/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22
175
+ __ https://github.com/robotframework/robotframework/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22
176
+
177
+ License and Trademark
178
+ ---------------------
179
+
180
+ Robot Framework is open source software provided under the `Apache License 2.0`__.
181
+ Robot Framework documentation and other similar content use the
182
+ `Creative Commons Attribution 3.0 Unported`__ license. Most libraries and tools
183
+ in the ecosystem are also open source, but they may use different licenses.
184
+
185
+ Robot Framework trademark is owned by `Robot Framework Foundation`_.
186
+
187
+ __ http://apache.org/licenses/LICENSE-2.0
188
+ __ http://creativecommons.org/licenses/by/3.0
189
+
190
+ .. |r| unicode:: U+00AE
@@ -0,0 +1,39 @@
1
+ [project]
2
+ requires-python = ">=3.8"
3
+
4
+ [tool.black]
5
+ line_length = 88
6
+ extend-exclude = "atest/result/"
7
+
8
+ [tool.ruff]
9
+ extend-exclude = ["atest/result/"]
10
+
11
+ [tool.ruff.format]
12
+ quote-style = "double"
13
+
14
+ [tool.ruff.lint]
15
+ extend-select = ["I"] # imports
16
+ ignore = ["E731"] # lambda assignment
17
+
18
+ [tool.ruff.lint.pyflakes]
19
+ # Needed due to https://github.com/astral-sh/ruff/issues/9298
20
+ extend-generics = ["robot.model.body.BaseBranches"]
21
+
22
+ [tool.ruff.lint.isort]
23
+ # Ruff is used to sort and fix imports first. Multiline imports are organized so
24
+ # that each item is on its own line. This is same as the Vertical Hanging Indent
25
+ # mode with isort.
26
+ combine-as-imports = true
27
+ order-by-type = false
28
+
29
+ [tool.isort]
30
+ # isort is used after Ruff to sort "normal" imports so that multiline imports use
31
+ # the Hanging Grid Grouped mode. Files contained redundant import aliases denoting
32
+ # module/package API are excluded. For details about multiline modes see:
33
+ # https://pycqa.github.io/isort/docs/configuration/multi_line_output_modes.html
34
+ multi_line_output = 5
35
+ extend_skip = ["__init__.py", "src/robot/api/parsing.py"]
36
+ skip_glob = ["atest/result/*"]
37
+ combine_as_imports = true
38
+ order_by_type = false
39
+ line_length = 88
@@ -6,7 +6,7 @@ from setuptools import find_packages, setup
6
6
 
7
7
  # Version number typically updated by running `invoke set-version <version>`.
8
8
  # Run `invoke --help set-version` or see tasks.py for details.
9
- VERSION = "7.3rc1"
9
+ VERSION = "7.3rc2"
10
10
  with open(join(dirname(abspath(__file__)), "README.rst")) as f:
11
11
  LONG_DESCRIPTION = f.read()
12
12
  base_url = "https://github.com/robotframework/robotframework/blob/master"
@@ -28,6 +28,7 @@ Programming Language :: Python :: 3.10
28
28
  Programming Language :: Python :: 3.11
29
29
  Programming Language :: Python :: 3.12
30
30
  Programming Language :: Python :: 3.13
31
+ Programming Language :: Python :: 3.14
31
32
  Programming Language :: Python :: Implementation :: CPython
32
33
  Programming Language :: Python :: Implementation :: PyPy
33
34
  Topic :: Software Development :: Testing
@@ -4382,7 +4382,10 @@ def register_run_keyword(library, keyword, args_to_process=0, deprecation_warnin
4382
4382
  - Their arguments are not resolved normally (use ``args_to_process``
4383
4383
  to control that). This basically means not replacing variables or
4384
4384
  handling escapes.
4385
- - They are not stopped by timeouts.
4385
+ - They are not stopped by timeouts. Prior to Robot Framework 7.3, timeouts
4386
+ occurring when these keywords were executing other keywords could corrupt
4387
+ output files. That bug has been fixed, so this use case why to register
4388
+ keywords as run keyword variants is not relevant anymore.
4386
4389
  - If there are conflicts with keyword names, these keywords have
4387
4390
  *lower* precedence than other keywords.
4388
4391
 
@@ -18,9 +18,9 @@ from typing import (
18
18
  Any, Iterable, Iterator, MutableSequence, overload, Type, TYPE_CHECKING, TypeVar
19
19
  )
20
20
 
21
- from robot.utils import copy_signature, KnownAtRuntime, type_name
21
+ from robot.utils import copy_signature, KnownAtRuntime
22
22
 
23
- from .modelobject import DataDict
23
+ from .modelobject import DataDict, full_name, ModelObject
24
24
 
25
25
  if TYPE_CHECKING:
26
26
  from .visitor import SuiteVisitor
@@ -77,14 +77,18 @@ class ItemList(MutableSequence[T]):
77
77
  item = self._item_from_dict(item)
78
78
  else:
79
79
  raise TypeError(
80
- f"Only {type_name(self._item_class)} objects "
81
- f"accepted, got {type_name(item)}."
80
+ f"Only '{self._type_name(self._item_class)}' objects accepted, "
81
+ f"got '{self._type_name(item)}'."
82
82
  )
83
83
  if self._common_attrs:
84
84
  for attr, value in self._common_attrs.items():
85
85
  setattr(item, attr, value)
86
86
  return item
87
87
 
88
+ def _type_name(self, item: "type|object") -> str:
89
+ typ = item if isinstance(item, type) else type(item)
90
+ return full_name(typ) if issubclass(typ, ModelObject) else typ.__name__
91
+
88
92
  def _item_from_dict(self, data: DataDict) -> T:
89
93
  if hasattr(self._item_class, "from_dict"):
90
94
  return self._item_class.from_dict(data) # type: ignore
@@ -193,21 +197,21 @@ class ItemList(MutableSequence[T]):
193
197
 
194
198
  def __lt__(self, other: "ItemList[T]") -> bool:
195
199
  if not isinstance(other, ItemList):
196
- raise TypeError(f"Cannot order ItemList and {type_name(other)}.")
200
+ raise TypeError(f"Cannot order 'ItemList' and '{self._type_name(other)}'.")
197
201
  if not self._is_compatible(other):
198
- raise TypeError("Cannot order incompatible ItemLists.")
202
+ raise TypeError("Cannot order incompatible 'ItemList' objects.")
199
203
  return self._items < other._items
200
204
 
201
205
  def __add__(self: Self, other: "ItemList[T]") -> Self:
202
206
  if not isinstance(other, ItemList):
203
- raise TypeError(f"Cannot add ItemList and {type_name(other)}.")
207
+ raise TypeError(f"Cannot add 'ItemList' and '{self._type_name(other)}'.")
204
208
  if not self._is_compatible(other):
205
- raise TypeError("Cannot add incompatible ItemLists.")
209
+ raise TypeError("Cannot add incompatible 'ItemList' objects.")
206
210
  return self._create_new_from(self._items + other._items)
207
211
 
208
212
  def __iadd__(self: Self, other: Iterable[T]) -> Self:
209
213
  if isinstance(other, ItemList) and not self._is_compatible(other):
210
- raise TypeError("Cannot add incompatible ItemLists.")
214
+ raise TypeError("Cannot add incompatible 'ItemList' objects.")
211
215
  self.extend(other)
212
216
  return self
213
217
 
@@ -241,7 +241,7 @@ class ModelObject(metaclass=SetterAwareType):
241
241
 
242
242
 
243
243
  def full_name(obj_or_cls):
244
- cls = type(obj_or_cls) if not isinstance(obj_or_cls, type) else obj_or_cls
244
+ cls = obj_or_cls if isinstance(obj_or_cls, type) else type(obj_or_cls)
245
245
  parts = [*cls.__module__.split("."), cls.__name__]
246
246
  if len(parts) > 1 and parts[0] == "robot":
247
247
  parts[2:-1] = []
@@ -174,15 +174,34 @@ class ListenerV3Facade(ListenerFacade):
174
174
  # Fallbacks for body items
175
175
  start_body_item = get("start_body_item")
176
176
  end_body_item = get("end_body_item")
177
+ # Fallbacks for keywords
178
+ start_keyword = get("start_keyword", start_body_item)
179
+ end_keyword = get("end_keyword", end_body_item)
177
180
  # Keywords
178
- self.start_keyword = get("start_keyword", start_body_item)
179
- self.end_keyword = get("end_keyword", end_body_item)
180
- self._start_user_keyword = get("start_user_keyword")
181
- self._end_user_keyword = get("end_user_keyword")
182
- self._start_library_keyword = get("start_library_keyword")
183
- self._end_library_keyword = get("end_library_keyword")
184
- self._start_invalid_keyword = get("start_invalid_keyword")
185
- self._end_invalid_keyword = get("end_invalid_keyword")
181
+ self.start_user_keyword = get(
182
+ "start_user_keyword",
183
+ lambda data, implementation, result: start_keyword(data, result),
184
+ )
185
+ self.end_user_keyword = get(
186
+ "end_user_keyword",
187
+ lambda data, implementation, result: end_keyword(data, result),
188
+ )
189
+ self.start_library_keyword = get(
190
+ "start_library_keyword",
191
+ lambda data, implementation, result: start_keyword(data, result),
192
+ )
193
+ self.end_library_keyword = get(
194
+ "end_library_keyword",
195
+ lambda data, implementation, result: end_keyword(data, result),
196
+ )
197
+ self.start_invalid_keyword = get(
198
+ "start_invalid_keyword",
199
+ lambda data, implementation, result: start_keyword(data, result),
200
+ )
201
+ self.end_invalid_keyword = get(
202
+ "end_invalid_keyword",
203
+ lambda data, implementation, result: end_keyword(data, result),
204
+ )
186
205
  # IF
187
206
  self.start_if = get("start_if", start_body_item)
188
207
  self.end_if = get("end_if", end_body_item)
@@ -237,42 +256,6 @@ class ListenerV3Facade(ListenerFacade):
237
256
  # Close
238
257
  self.close = get("close")
239
258
 
240
- def start_user_keyword(self, data, implementation, result):
241
- if self._start_user_keyword:
242
- self._start_user_keyword(data, implementation, result)
243
- else:
244
- self.start_keyword(data, result)
245
-
246
- def end_user_keyword(self, data, implementation, result):
247
- if self._end_user_keyword:
248
- self._end_user_keyword(data, implementation, result)
249
- else:
250
- self.end_keyword(data, result)
251
-
252
- def start_library_keyword(self, data, implementation, result):
253
- if self._start_library_keyword:
254
- self._start_library_keyword(data, implementation, result)
255
- else:
256
- self.start_keyword(data, result)
257
-
258
- def end_library_keyword(self, data, implementation, result):
259
- if self._end_library_keyword:
260
- self._end_library_keyword(data, implementation, result)
261
- else:
262
- self.end_keyword(data, result)
263
-
264
- def start_invalid_keyword(self, data, implementation, result):
265
- if self._start_invalid_keyword:
266
- self._start_invalid_keyword(data, implementation, result)
267
- else:
268
- self.start_keyword(data, result)
269
-
270
- def end_invalid_keyword(self, data, implementation, result):
271
- if self._end_invalid_keyword:
272
- self._end_invalid_keyword(data, implementation, result)
273
- else:
274
- self.end_keyword(data, result)
275
-
276
259
  def log_message(self, message):
277
260
  if self._is_logged(message):
278
261
  self._log_message(message)
@@ -1077,14 +1077,7 @@ class KeywordCall(Statement):
1077
1077
  return self.get_values(Token.ASSIGN)
1078
1078
 
1079
1079
  def validate(self, ctx: "ValidationContext"):
1080
- assignment = VariableAssignment(self.assign)
1081
- if assignment.error:
1082
- self.errors += (assignment.error.message,)
1083
- for variable in assignment:
1084
- try:
1085
- TypeInfo.from_variable(variable)
1086
- except DataError as err:
1087
- self.errors += (str(err),)
1080
+ AssignmentValidator().validate(self)
1088
1081
 
1089
1082
 
1090
1083
  @Statement.register
@@ -1182,20 +1175,23 @@ class ForHeader(Statement):
1182
1175
 
1183
1176
  def validate(self, ctx: "ValidationContext"):
1184
1177
  if not self.assign:
1185
- self._add_error("no loop variables")
1178
+ self.errors += ("FOR loop has no variables.",)
1186
1179
  if not self.flavor:
1187
- self._add_error("no 'IN' or other valid separator")
1180
+ self.errors += ("FOR loop has no 'IN' or other valid separator.",)
1188
1181
  else:
1189
1182
  for var in self.assign:
1190
- if not is_scalar_assign(var):
1191
- self._add_error(f"invalid loop variable '{var}'")
1183
+ match = search_variable(var, ignore_errors=True, parse_type=True)
1184
+ if not match.is_scalar_assign():
1185
+ self.errors += (f"Invalid FOR loop variable '{var}'.",)
1186
+ elif match.type:
1187
+ try:
1188
+ TypeInfo.from_variable(match)
1189
+ except DataError as err:
1190
+ self.errors += (f"Invalid FOR loop variable '{var}': {err}",)
1192
1191
  if not self.values:
1193
- self._add_error("no loop values")
1192
+ self.errors += ("FOR loop has no values.",)
1194
1193
  self._validate_options()
1195
1194
 
1196
- def _add_error(self, error: str):
1197
- self.errors += (f"FOR loop has {error}.",)
1198
-
1199
1195
 
1200
1196
  class IfElseHeader(Statement, ABC):
1201
1197
 
@@ -1266,6 +1262,10 @@ class InlineIfHeader(IfElseHeader):
1266
1262
  ]
1267
1263
  return cls(tokens)
1268
1264
 
1265
+ def validate(self, ctx: "ValidationContext"):
1266
+ super().validate(ctx)
1267
+ AssignmentValidator().validate(self)
1268
+
1269
1269
 
1270
1270
  @Statement.register
1271
1271
  class ElseIfHeader(IfElseHeader):
@@ -1754,7 +1754,7 @@ class VariableValidator:
1754
1754
  try:
1755
1755
  TypeInfo.from_variable(match)
1756
1756
  except DataError as err:
1757
- statement.errors += (str(err),)
1757
+ statement.errors += (f"Invalid variable '{name}': {err}",)
1758
1758
 
1759
1759
  def _validate_dict_items(self, statement: Statement):
1760
1760
  for item in statement.get_values(Token.ARGUMENT):
@@ -1767,3 +1767,17 @@ class VariableValidator:
1767
1767
  def _is_valid_dict_item(self, item: str) -> bool:
1768
1768
  name, value = split_from_equals(item)
1769
1769
  return value is not None or is_dict_variable(item)
1770
+
1771
+
1772
+ class AssignmentValidator:
1773
+
1774
+ def validate(self, statement: Statement):
1775
+ assignment = statement.get_values(Token.ASSIGN)
1776
+ if assignment:
1777
+ assignment = VariableAssignment(assignment)
1778
+ statement.errors += assignment.errors
1779
+ for variable in assignment:
1780
+ try:
1781
+ TypeInfo.from_variable(variable)
1782
+ except DataError as err:
1783
+ statement.errors += (f"Invalid variable '{variable}': {err}",)
@@ -146,6 +146,7 @@ class TypeConverter:
146
146
  return False
147
147
 
148
148
  def validate(self):
149
+ """Validate converter. Raise ``TypeError`` for unrecognized types."""
149
150
  if self.nested:
150
151
  self._validate(self.nested)
151
152
 
@@ -163,17 +164,15 @@ class TypeConverter:
163
164
  raise NotImplementedError
164
165
 
165
166
  def _handle_error(self, value, name, kind, error=None):
166
- value_type = "" if isinstance(value, str) else f" ({type_name(value)})"
167
+ typ = "" if isinstance(value, str) else f" ({type_name(value)})"
167
168
  value = safe_str(value)
169
+ kind = kind.capitalize() if kind.islower() else kind
168
170
  ending = f": {error}" if (error and error.args) else "."
171
+ cannot_be_converted = f"cannot be converted to {self.type_name}{ending}"
169
172
  if name is None:
170
- raise ValueError(
171
- f"{kind.capitalize()} '{value}'{value_type} "
172
- f"cannot be converted to {self.type_name}{ending}"
173
- )
173
+ raise ValueError(f"{kind} '{value}'{typ} {cannot_be_converted}")
174
174
  raise ValueError(
175
- f"{kind.capitalize()} '{name}' got value '{value}'{value_type} that "
176
- f"cannot be converted to {self.type_name}{ending}"
175
+ f"{kind} '{name}' got value '{value}'{typ} that {cannot_be_converted}"
177
176
  )
178
177
 
179
178
  def _literal_eval(self, value, expected):
@@ -300,11 +300,20 @@ class TypeInfo(metaclass=SetterAwareType):
300
300
  cls,
301
301
  variable: "str|VariableMatch",
302
302
  handle_list_and_dict: bool = True,
303
- ) -> "TypeInfo|None":
303
+ ) -> "TypeInfo":
304
304
  """Construct a ``TypeInfo`` based on a variable.
305
305
 
306
- Type can be specified using syntax like `${x: int}`. Supports both
307
- strings and already parsed `VariableMatch` objects.
306
+ Type can be specified using syntax like ``${x: int}``.
307
+
308
+ :param variable: Variable as a string or as an already parsed
309
+ ``VariableMatch`` object.
310
+ :param handle_list_and_dict: When ``True``, types in list and dictionary
311
+ variables get ``list[]`` and ``dict[]`` decoration implicitly.
312
+ For example, ``@{x: int}``, ``&{x: int}`` and ``&{x: str=int}``
313
+ yield types ``list[int]``, ``dict[Any, int]`` and ``dict[str, int]``,
314
+ respectively.
315
+ :raises: ``DataError`` if variable has an unrecognized type. Variable
316
+ not having a type is not an error.
308
317
 
309
318
  New in Robot Framework 7.3.
310
319
  """
@@ -342,7 +351,7 @@ class TypeInfo(metaclass=SetterAwareType):
342
351
  languages: "LanguagesLike" = None,
343
352
  kind: str = "Argument",
344
353
  allow_unknown: bool = False,
345
- ):
354
+ ) -> object:
346
355
  """Convert ``value`` based on type information this ``TypeInfo`` contains.
347
356
 
348
357
  :param value: Value to convert.
@@ -356,8 +365,8 @@ class TypeInfo(metaclass=SetterAwareType):
356
365
  :param allow_unknown: If ``False``, a ``TypeError`` is raised if there
357
366
  is no converter for this type or to its nested types. If ``True``,
358
367
  conversion returns the original value instead.
359
- :raises: ``ValueError`` is conversion fails and ``TypeError`` if there
360
- is no converter and unknown converters are not accepted.
368
+ :raises: ``ValueError`` if conversion fails and ``TypeError`` if there is
369
+ no converter for this type and unknown converters are not accepted.
361
370
  :return: Converted value.
362
371
  """
363
372
  converter = self.get_converter(custom_converters, languages, allow_unknown)