robotframework 7.3rc1__tar.gz → 7.3rc3__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 (288) hide show
  1. robotframework-7.3rc3/PKG-INFO +190 -0
  2. robotframework-7.3rc3/pyproject.toml +33 -0
  3. {robotframework-7.3rc1 → robotframework-7.3rc3}/setup.py +4 -3
  4. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/standardtypes.py +11 -5
  5. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/BuiltIn.py +4 -1
  6. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Process.py +5 -0
  7. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/itemlist.py +13 -9
  8. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/modelobject.py +1 -1
  9. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/listeners.py +27 -44
  10. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/outputfile.py +1 -1
  11. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/statements.py +31 -17
  12. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/embedded.py +18 -4
  13. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typeconverters.py +10 -7
  14. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typeinfo.py +15 -6
  15. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/bodyrunner.py +41 -21
  16. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/model.py +2 -1
  17. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/signalhandler.py +1 -0
  18. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/runner.py +9 -5
  19. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/timeout.py +20 -6
  20. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/windows.py +26 -16
  21. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/importer.py +41 -23
  22. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robottypes.py +6 -7
  23. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/assigner.py +30 -27
  24. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/scopes.py +21 -2
  25. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/search.py +0 -2
  26. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/version.py +1 -1
  27. robotframework-7.3rc3/src/robotframework.egg-info/PKG-INFO +190 -0
  28. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robotframework.egg-info/SOURCES.txt +1 -0
  29. robotframework-7.3rc3/src/robotframework.egg-info/entry_points.txt +4 -0
  30. robotframework-7.3rc1/PKG-INFO +0 -187
  31. robotframework-7.3rc1/src/robotframework.egg-info/PKG-INFO +0 -187
  32. robotframework-7.3rc1/src/robotframework.egg-info/entry_points.txt +0 -5
  33. {robotframework-7.3rc1 → robotframework-7.3rc3}/AUTHORS.rst +0 -0
  34. {robotframework-7.3rc1 → robotframework-7.3rc3}/BUILD.rst +0 -0
  35. {robotframework-7.3rc1 → robotframework-7.3rc3}/CONTRIBUTING.rst +0 -0
  36. {robotframework-7.3rc1 → robotframework-7.3rc3}/COPYRIGHT.txt +0 -0
  37. {robotframework-7.3rc1 → robotframework-7.3rc3}/INSTALL.rst +0 -0
  38. {robotframework-7.3rc1 → robotframework-7.3rc3}/LICENSE.txt +0 -0
  39. {robotframework-7.3rc1 → robotframework-7.3rc3}/MANIFEST.in +0 -0
  40. {robotframework-7.3rc1 → robotframework-7.3rc3}/README.rst +0 -0
  41. {robotframework-7.3rc1 → robotframework-7.3rc3}/setup.cfg +0 -0
  42. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/__init__.py +0 -0
  43. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/__main__.py +0 -0
  44. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/__init__.py +0 -0
  45. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/deco.py +0 -0
  46. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/exceptions.py +0 -0
  47. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/interfaces.py +0 -0
  48. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/logger.py +0 -0
  49. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/parsing.py +0 -0
  50. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/api/py.typed +0 -0
  51. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/__init__.py +0 -0
  52. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/gatherfailed.py +0 -0
  53. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/languages.py +0 -0
  54. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/conf/settings.py +0 -0
  55. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/errors.py +0 -0
  56. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/__init__.py +0 -0
  57. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/common/__init__.py +0 -0
  58. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/common/js_disabled.css +0 -0
  59. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/common/storage.js +0 -0
  60. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/htmlfilewriter.py +0 -0
  61. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/jsonwriter.py +0 -0
  62. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/__init__.py +0 -0
  63. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  64. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.min.js +0 -0
  65. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  66. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  67. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  68. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/libdoc/__init__.py +0 -0
  69. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  70. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/__init__.py +0 -0
  71. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/common.css +0 -0
  72. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  73. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/fileloading.js +0 -0
  74. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/log.css +0 -0
  75. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/log.html +0 -0
  76. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/log.js +0 -0
  77. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/model.js +0 -0
  78. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/print.css +0 -0
  79. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/report.css +0 -0
  80. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/report.html +0 -0
  81. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/testdata.js +0 -0
  82. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/util.js +0 -0
  83. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/rebot/view.js +0 -0
  84. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/template.py +0 -0
  85. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/testdoc/__init__.py +0 -0
  86. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  87. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  88. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdoc.py +0 -0
  89. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/__init__.py +0 -0
  90. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/builder.py +0 -0
  91. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/consoleviewer.py +0 -0
  92. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/datatypes.py +0 -0
  93. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/htmlutils.py +0 -0
  94. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/htmlwriter.py +0 -0
  95. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/jsonbuilder.py +0 -0
  96. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/jsonwriter.py +0 -0
  97. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/languages.py +0 -0
  98. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/model.py +0 -0
  99. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/output.py +0 -0
  100. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/robotbuilder.py +0 -0
  101. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/writer.py +0 -0
  102. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  103. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libdocpkg/xmlwriter.py +0 -0
  104. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Collections.py +0 -0
  105. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/DateTime.py +0 -0
  106. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Dialogs.py +0 -0
  107. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Easter.py +0 -0
  108. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/OperatingSystem.py +0 -0
  109. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Remote.py +0 -0
  110. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Screenshot.py +0 -0
  111. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/String.py +0 -0
  112. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/Telnet.py +0 -0
  113. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/XML.py +0 -0
  114. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/__init__.py +0 -0
  115. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/libraries/dialogs_py.py +0 -0
  116. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/logo.png +0 -0
  117. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/__init__.py +0 -0
  118. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/body.py +0 -0
  119. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/configurer.py +0 -0
  120. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/control.py +0 -0
  121. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/filter.py +0 -0
  122. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/fixture.py +0 -0
  123. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/keyword.py +0 -0
  124. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/message.py +0 -0
  125. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/metadata.py +0 -0
  126. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/modifier.py +0 -0
  127. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/namepatterns.py +0 -0
  128. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/statistics.py +0 -0
  129. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/stats.py +0 -0
  130. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/suitestatistics.py +0 -0
  131. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/tags.py +0 -0
  132. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/tagsetter.py +0 -0
  133. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/tagstatistics.py +0 -0
  134. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/testcase.py +0 -0
  135. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/testsuite.py +0 -0
  136. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/totalstatistics.py +0 -0
  137. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/model/visitor.py +0 -0
  138. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/__init__.py +0 -0
  139. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/__init__.py +0 -0
  140. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/dotted.py +0 -0
  141. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/highlighting.py +0 -0
  142. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/quiet.py +0 -0
  143. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/console/verbose.py +0 -0
  144. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/debugfile.py +0 -0
  145. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/filelogger.py +0 -0
  146. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/jsonlogger.py +0 -0
  147. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/librarylogger.py +0 -0
  148. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/logger.py +0 -0
  149. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/loggerapi.py +0 -0
  150. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/loggerhelper.py +0 -0
  151. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/loglevel.py +0 -0
  152. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/output.py +0 -0
  153. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/pyloggingconf.py +0 -0
  154. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/stdoutlogsplitter.py +0 -0
  155. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/output/xmllogger.py +0 -0
  156. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/__init__.py +0 -0
  157. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/__init__.py +0 -0
  158. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/blocklexers.py +0 -0
  159. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/context.py +0 -0
  160. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/lexer.py +0 -0
  161. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/settings.py +0 -0
  162. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/statementlexers.py +0 -0
  163. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/tokenizer.py +0 -0
  164. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/lexer/tokens.py +0 -0
  165. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/__init__.py +0 -0
  166. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/blocks.py +0 -0
  167. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/model/visitor.py +0 -0
  168. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/__init__.py +0 -0
  169. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/blockparsers.py +0 -0
  170. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/fileparser.py +0 -0
  171. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/parser/parser.py +0 -0
  172. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/parsing/suitestructure.py +0 -0
  173. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/pythonpathsetter.py +0 -0
  174. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/rebot.py +0 -0
  175. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/__init__.py +0 -0
  176. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  177. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jsbuildingcontext.py +0 -0
  178. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jsexecutionresult.py +0 -0
  179. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jsmodelbuilders.py +0 -0
  180. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/jswriter.py +0 -0
  181. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/logreportwriters.py +0 -0
  182. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/outputwriter.py +0 -0
  183. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/resultwriter.py +0 -0
  184. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/stringcache.py +0 -0
  185. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/reporting/xunitwriter.py +0 -0
  186. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/__init__.py +0 -0
  187. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/configurer.py +0 -0
  188. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/executionerrors.py +0 -0
  189. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/executionresult.py +0 -0
  190. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/flattenkeywordmatcher.py +0 -0
  191. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/keywordremover.py +0 -0
  192. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/merger.py +0 -0
  193. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/messagefilter.py +0 -0
  194. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/model.py +0 -0
  195. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/modeldeprecation.py +0 -0
  196. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/resultbuilder.py +0 -0
  197. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/suiteteardownfailed.py +0 -0
  198. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/visitor.py +0 -0
  199. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/result/xmlelementhandlers.py +0 -0
  200. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/run.py +0 -0
  201. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/__init__.py +0 -0
  202. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/__init__.py +0 -0
  203. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentconverter.py +0 -0
  204. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentmapper.py +0 -0
  205. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentparser.py +0 -0
  206. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentresolver.py +0 -0
  207. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentspec.py +0 -0
  208. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/argumentvalidator.py +0 -0
  209. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/customconverters.py +0 -0
  210. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typeinfoparser.py +0 -0
  211. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/arguments/typevalidator.py +0 -0
  212. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/__init__.py +0 -0
  213. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/builders.py +0 -0
  214. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/parsers.py +0 -0
  215. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/settings.py +0 -0
  216. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/builder/transformers.py +0 -0
  217. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/context.py +0 -0
  218. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/dynamicmethods.py +0 -0
  219. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/importer.py +0 -0
  220. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/invalidkeyword.py +0 -0
  221. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/keywordfinder.py +0 -0
  222. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/keywordimplementation.py +0 -0
  223. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/librarykeyword.py +0 -0
  224. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/librarykeywordrunner.py +0 -0
  225. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/libraryscopes.py +0 -0
  226. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/namespace.py +0 -0
  227. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/outputcapture.py +0 -0
  228. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/randomizer.py +0 -0
  229. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/resourcemodel.py +0 -0
  230. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/runkwregister.py +0 -0
  231. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/status.py +0 -0
  232. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/statusreporter.py +0 -0
  233. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/suiterunner.py +0 -0
  234. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/testlibraries.py +0 -0
  235. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/__init__.py +0 -0
  236. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/nosupport.py +0 -0
  237. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/timeouts/posix.py +0 -0
  238. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/running/userkeywordrunner.py +0 -0
  239. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/testdoc.py +0 -0
  240. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/__init__.py +0 -0
  241. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/application.py +0 -0
  242. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/argumentparser.py +0 -0
  243. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/asserts.py +0 -0
  244. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/charwidth.py +0 -0
  245. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/compress.py +0 -0
  246. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/connectioncache.py +0 -0
  247. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/dotdict.py +0 -0
  248. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/encoding.py +0 -0
  249. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/encodingsniffer.py +0 -0
  250. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/error.py +0 -0
  251. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/escaping.py +0 -0
  252. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/etreewrapper.py +0 -0
  253. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/filereader.py +0 -0
  254. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/frange.py +0 -0
  255. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/htmlformatters.py +0 -0
  256. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/json.py +0 -0
  257. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/markuputils.py +0 -0
  258. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/markupwriters.py +0 -0
  259. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/match.py +0 -0
  260. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/misc.py +0 -0
  261. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/normalizing.py +0 -0
  262. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/notset.py +0 -0
  263. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/platform.py +0 -0
  264. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/recommendations.py +0 -0
  265. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/restreader.py +0 -0
  266. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotenv.py +0 -0
  267. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotinspect.py +0 -0
  268. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotio.py +0 -0
  269. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robotpath.py +0 -0
  270. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/robottime.py +0 -0
  271. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/setter.py +0 -0
  272. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/sortable.py +0 -0
  273. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/text.py +0 -0
  274. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/typehints.py +0 -0
  275. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/utils/unic.py +0 -0
  276. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/__init__.py +0 -0
  277. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/evaluation.py +0 -0
  278. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/filesetter.py +0 -0
  279. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/finders.py +0 -0
  280. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/notfound.py +0 -0
  281. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/replacer.py +0 -0
  282. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/resolvable.py +0 -0
  283. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/store.py +0 -0
  284. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/tablesetter.py +0 -0
  285. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robot/variables/variables.py +0 -0
  286. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-7.3rc1 → robotframework-7.3rc3}/src/robotframework.egg-info/top_level.txt +0 -0
  288. {robotframework-7.3rc1 → robotframework-7.3rc3}/tasks.py +0 -0
@@ -0,0 +1,190 @@
1
+ Metadata-Version: 2.1
2
+ Name: robotframework
3
+ Version: 7.3rc3
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.3rc3.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,33 @@
1
+ [tool.black]
2
+ line_length = 88
3
+ # When we add [project] with requires-python, remove this and Ruff's target-version
4
+ target-version = ["py38", "py39", "py310", "py311", "py312", "py313"]
5
+
6
+ [tool.ruff]
7
+ target-version = "py38"
8
+
9
+ [tool.ruff.lint]
10
+ extend-select = ["I"] # imports
11
+ ignore = ["E731"] # lambda assignment
12
+
13
+ [tool.ruff.lint.pyflakes]
14
+ # Needed due to https://github.com/astral-sh/ruff/issues/9298
15
+ extend-generics = ["robot.model.body.BaseBranches"]
16
+
17
+ [tool.ruff.lint.isort]
18
+ # Ruff is used to sort and fix imports first. Multiline imports are organized so
19
+ # that each item is on its own line. This is same as the Vertical Hanging Indent
20
+ # mode with isort.
21
+ combine-as-imports = true
22
+ order-by-type = false
23
+
24
+ [tool.isort]
25
+ # isort is used after Ruff to sort "normal" imports so that multiline imports use
26
+ # the Hanging Grid Grouped mode. Files contained redundant import aliases denoting
27
+ # module/package API are excluded. For details about multiline modes see:
28
+ # https://pycqa.github.io/isort/docs/configuration/multi_line_output_modes.html
29
+ multi_line_output = 5
30
+ extend_skip = ["__init__.py", "src/robot/api/parsing.py"]
31
+ combine_as_imports = true
32
+ order_by_type = false
33
+ 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.3rc3"
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
@@ -76,8 +77,8 @@ setup(
76
77
  packages=find_packages("src"),
77
78
  entry_points={
78
79
  "console_scripts": [
79
- "robot = robot.run:run_cli",
80
- "rebot = robot.rebot:rebot_cli",
80
+ "robot = robot:run_cli",
81
+ "rebot = robot:rebot_cli",
81
82
  "libdoc = robot.libdoc:libdoc_cli",
82
83
  ]
83
84
  },
@@ -81,7 +81,7 @@ Examples: ``good``, ``hyvä`` (same as ``hyv\\xE4``), ``\\x00`` (the null byte)
81
81
  """,
82
82
  bytearray: "Set below to same value as `bytes`.",
83
83
  datetime: """\
84
- Strings are expected to be a timestamp in
84
+ String timestamps are expected to be in
85
85
  [https://en.wikipedia.org/wiki/ISO_8601|ISO 8601] like
86
86
  format ``YYYY-MM-DD hh:mm:ss.mmmmmm``, where any non-digit
87
87
  character can be used as a separator or separators can be
@@ -89,20 +89,26 @@ omitted altogether. Additionally, only the date part is
89
89
  mandatory, all possibly missing time components are considered
90
90
  to be zeros.
91
91
 
92
+ A special value ``NOW`` (case-insensitive) can be used to get the
93
+ current local date and time. This is new in Robot Framework 7.3.
94
+
92
95
  Integers and floats are considered to represent seconds since
93
96
  the [https://en.wikipedia.org/wiki/Unix_time|Unix epoch].
94
97
 
95
- Examples: ``2022-02-09T16:39:43.632269``, ``2022-02-09 16:39``,
96
- ``${1644417583.632269}`` (Epoch time)
98
+ Examples: ``2022-02-09T16:39:43.632269``, ``20220209 16:39``,
99
+ ``now``, ``${1644417583.632269}`` (Epoch time)
97
100
  """,
98
101
  date: """\
99
- Strings are expected to be a timestamp in
102
+ String timestamps are expected to be in
100
103
  [https://en.wikipedia.org/wiki/ISO_8601|ISO 8601] like date format
101
104
  ``YYYY-MM-DD``, where any non-digit character can be used as a separator
102
105
  or separators can be omitted altogether. Possible time components are
103
106
  only allowed if they are zeros.
104
107
 
105
- Examples: ``2022-02-09``, ``2022-02-09 00:00``
108
+ A special value ``TODAY`` (case-insensitive) can be used to get
109
+ the current local date. This is new in Robot Framework 7.3.
110
+
111
+ Examples: ``2022-02-09``, ``2022-02-09 00:00``, ``today``
106
112
  """,
107
113
  timedelta: """\
108
114
  Strings are expected to represent a time interval in one of
@@ -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
 
@@ -279,6 +279,11 @@ class Process:
279
279
  | `Should Be Equal` | ${stdout} | ${result.stdout} |
280
280
  | `File Should Be Empty` | ${result.stderr_path} | |
281
281
 
282
+ Notice that in ``stdout`` and ``stderr`` content possible trailing newline
283
+ is removed and ``\\r\\n`` converted to ``\\n`` automatically. If you
284
+ need to see the original process output, redirect it to a file using
285
+ `process configuration` and read it from there.
286
+
282
287
  = Boolean arguments =
283
288
 
284
289
  Some keywords accept arguments that are handled as Boolean values true or
@@ -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)
@@ -77,7 +77,7 @@ class OutputFile(LoggerApi):
77
77
  self._delayed_messages = []
78
78
 
79
79
  def _release_delayed_messages(self):
80
- for msg in self._delayed_messages:
80
+ for msg in self._delayed_messages or ():
81
81
  self.log_message(msg, no_delay=True)
82
82
 
83
83
  def start_suite(self, data, result):
@@ -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}",)
@@ -14,7 +14,8 @@
14
14
  # limitations under the License.
15
15
 
16
16
  import re
17
- from typing import Any, Mapping, Sequence
17
+ import warnings
18
+ from typing import Mapping, Sequence
18
19
 
19
20
  from robot.errors import DataError
20
21
  from robot.utils import get_error_message
@@ -44,11 +45,24 @@ class EmbeddedArguments:
44
45
  def from_name(cls, name: str) -> "EmbeddedArguments|None":
45
46
  return EmbeddedArgumentParser().parse(name) if "${" in name else None
46
47
 
48
+ def match(self, name: str) -> 're.Match|None':
49
+ """Deprecated since Robot Framework 7.3."""
50
+ warnings.warn(
51
+ "'EmbeddedArguments.match()' is deprecated since Robot Framework 7.3. Use "
52
+ "new 'EmbeddedArguments.matches()' or 'EmbeddedArguments.parse_args()' "
53
+ "instead. Alternatively, use 'EmbeddedArguments.name.fullmatch()' to "
54
+ "preserve the old behavior and to be compatible with earlier Robot "
55
+ "Framework versions."
56
+ )
57
+ return self.name.fullmatch(name)
58
+
47
59
  def matches(self, name: str) -> bool:
60
+ """Return ``True`` if ``name`` matches these embedded arguments."""
48
61
  args, _ = self._parse_args(name)
49
62
  return bool(args)
50
63
 
51
64
  def parse_args(self, name: str) -> "tuple[str, ...]":
65
+ """Parse arguments matching these embedded arguments from ``name``."""
52
66
  args, placeholders = self._parse_args(name)
53
67
  if not placeholders:
54
68
  return args
@@ -72,12 +86,12 @@ class EmbeddedArguments:
72
86
  arg = arg.replace(ph, placeholders[ph])
73
87
  return arg
74
88
 
75
- def map(self, args: Sequence[Any]) -> "list[tuple[str, Any]]":
76
- args = [i.convert(a) if i else a for a, i in zip(args, self.types)]
89
+ def map(self, args: Sequence[object]) -> "list[tuple[str, object]]":
90
+ args = [t.convert(a) if t else a for a, t in zip(args, self.types)]
77
91
  self.validate(args)
78
92
  return list(zip(self.args, args))
79
93
 
80
- def validate(self, args: Sequence[Any]):
94
+ def validate(self, args: Sequence[object]):
81
95
  """Validate that embedded args match custom regexps.
82
96
 
83
97
  Initial validation is done already when matching keywords, but this