robotframework 7.4rc2__tar.gz → 7.4.2__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 (289) hide show
  1. {robotframework-7.4rc2 → robotframework-7.4.2}/INSTALL.rst +8 -0
  2. {robotframework-7.4rc2 → robotframework-7.4.2}/PKG-INFO +2 -2
  3. {robotframework-7.4rc2 → robotframework-7.4.2}/setup.py +1 -1
  4. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/conf/languages.py +4 -4
  5. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/libdoc/libdoc.html +2 -2
  6. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/htmlutils.py +25 -31
  7. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/robotbuilder.py +7 -3
  8. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/BuiltIn.py +54 -13
  9. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Process.py +312 -264
  10. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/String.py +10 -7
  11. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Telnet.py +15 -11
  12. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/tags.py +1 -1
  13. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/tokenizer.py +22 -11
  14. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/model.py +2 -0
  15. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/resultbuilder.py +6 -0
  16. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/typeinfo.py +16 -6
  17. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/model.py +10 -10
  18. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/testdoc.py +3 -0
  19. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/importer.py +2 -0
  20. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/normalizing.py +36 -1
  21. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/robottypes.py +11 -9
  22. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/version.py +1 -1
  23. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robotframework.egg-info/PKG-INFO +2 -2
  24. {robotframework-7.4rc2 → robotframework-7.4.2}/AUTHORS.rst +0 -0
  25. {robotframework-7.4rc2 → robotframework-7.4.2}/BUILD.rst +0 -0
  26. {robotframework-7.4rc2 → robotframework-7.4.2}/CONTRIBUTING.rst +0 -0
  27. {robotframework-7.4rc2 → robotframework-7.4.2}/COPYRIGHT.txt +0 -0
  28. {robotframework-7.4rc2 → robotframework-7.4.2}/LICENSE.txt +0 -0
  29. {robotframework-7.4rc2 → robotframework-7.4.2}/MANIFEST.in +0 -0
  30. {robotframework-7.4rc2 → robotframework-7.4.2}/README.rst +0 -0
  31. {robotframework-7.4rc2 → robotframework-7.4.2}/pyproject.toml +0 -0
  32. {robotframework-7.4rc2 → robotframework-7.4.2}/setup.cfg +0 -0
  33. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/__init__.py +0 -0
  34. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/__main__.py +0 -0
  35. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/__init__.py +0 -0
  36. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/deco.py +0 -0
  37. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/exceptions.py +0 -0
  38. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/interfaces.py +0 -0
  39. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/logger.py +0 -0
  40. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/parsing.py +0 -0
  41. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/py.typed +0 -0
  42. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/api/types.py +0 -0
  43. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/conf/__init__.py +0 -0
  44. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/conf/gatherfailed.py +0 -0
  45. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/conf/settings.py +0 -0
  46. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/errors.py +0 -0
  47. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/__init__.py +0 -0
  48. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/common/__init__.py +0 -0
  49. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/common/js_disabled.css +0 -0
  50. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/common/storage.js +0 -0
  51. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/htmlfilewriter.py +0 -0
  52. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/jsonwriter.py +0 -0
  53. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/lib/__init__.py +0 -0
  54. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  55. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.min.js +0 -0
  56. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  57. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  58. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  59. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/libdoc/__init__.py +0 -0
  60. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/__init__.py +0 -0
  61. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/common.css +0 -0
  62. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  63. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/fileloading.js +0 -0
  64. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/log.css +0 -0
  65. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/log.html +0 -0
  66. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/log.js +0 -0
  67. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/model.js +0 -0
  68. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/print.css +0 -0
  69. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/report.css +0 -0
  70. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/report.html +0 -0
  71. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/testdata.js +0 -0
  72. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/util.js +0 -0
  73. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/rebot/view.js +0 -0
  74. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/template.py +0 -0
  75. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/testdoc/__init__.py +0 -0
  76. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  77. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  78. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdoc.py +0 -0
  79. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/__init__.py +0 -0
  80. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/builder.py +0 -0
  81. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/consoleviewer.py +0 -0
  82. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/datatypes.py +0 -0
  83. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/htmlwriter.py +0 -0
  84. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/jsonbuilder.py +0 -0
  85. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/jsonwriter.py +0 -0
  86. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/languages.py +0 -0
  87. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/model.py +0 -0
  88. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/output.py +0 -0
  89. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/standardtypes.py +0 -0
  90. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/writer.py +0 -0
  91. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  92. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libdocpkg/xmlwriter.py +0 -0
  93. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Collections.py +0 -0
  94. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/DateTime.py +0 -0
  95. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Dialogs.py +0 -0
  96. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Easter.py +0 -0
  97. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/OperatingSystem.py +0 -0
  98. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Remote.py +0 -0
  99. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/Screenshot.py +0 -0
  100. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/XML.py +0 -0
  101. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/__init__.py +0 -0
  102. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/dialogs_py.py +0 -0
  103. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/normalizer.py +0 -0
  104. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/libraries/py.typed +0 -0
  105. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/logo.png +0 -0
  106. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/__init__.py +0 -0
  107. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/body.py +0 -0
  108. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/configurer.py +0 -0
  109. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/control.py +0 -0
  110. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/filter.py +0 -0
  111. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/fixture.py +0 -0
  112. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/itemlist.py +0 -0
  113. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/keyword.py +0 -0
  114. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/message.py +0 -0
  115. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/metadata.py +0 -0
  116. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/modelobject.py +0 -0
  117. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/modifier.py +0 -0
  118. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/namepatterns.py +0 -0
  119. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/statistics.py +0 -0
  120. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/stats.py +0 -0
  121. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/suitestatistics.py +0 -0
  122. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/tagsetter.py +0 -0
  123. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/tagstatistics.py +0 -0
  124. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/testcase.py +0 -0
  125. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/testsuite.py +0 -0
  126. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/totalstatistics.py +0 -0
  127. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/model/visitor.py +0 -0
  128. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/__init__.py +0 -0
  129. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/console/__init__.py +0 -0
  130. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/console/dotted.py +0 -0
  131. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/console/highlighting.py +0 -0
  132. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/console/quiet.py +0 -0
  133. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/console/verbose.py +0 -0
  134. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/debugfile.py +0 -0
  135. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/filelogger.py +0 -0
  136. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/jsonlogger.py +0 -0
  137. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/librarylogger.py +0 -0
  138. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/listeners.py +0 -0
  139. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/logger.py +0 -0
  140. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/loggerapi.py +0 -0
  141. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/loggerhelper.py +0 -0
  142. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/loglevel.py +0 -0
  143. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/output.py +0 -0
  144. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/outputfile.py +0 -0
  145. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/pyloggingconf.py +0 -0
  146. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/stdoutlogsplitter.py +0 -0
  147. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/output/xmllogger.py +0 -0
  148. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/__init__.py +0 -0
  149. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/__init__.py +0 -0
  150. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/blocklexers.py +0 -0
  151. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/context.py +0 -0
  152. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/lexer.py +0 -0
  153. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/settings.py +0 -0
  154. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/statementlexers.py +0 -0
  155. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/lexer/tokens.py +0 -0
  156. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/model/__init__.py +0 -0
  157. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/model/blocks.py +0 -0
  158. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/model/statements.py +0 -0
  159. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/model/visitor.py +0 -0
  160. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/parser/__init__.py +0 -0
  161. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/parser/blockparsers.py +0 -0
  162. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/parser/fileparser.py +0 -0
  163. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/parser/parser.py +0 -0
  164. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/parsing/suitestructure.py +0 -0
  165. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/pythonpathsetter.py +0 -0
  166. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/rebot.py +0 -0
  167. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/__init__.py +0 -0
  168. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  169. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/jsbuildingcontext.py +0 -0
  170. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/jsexecutionresult.py +0 -0
  171. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/jsmodelbuilders.py +0 -0
  172. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/jswriter.py +0 -0
  173. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/logreportwriters.py +0 -0
  174. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/outputwriter.py +0 -0
  175. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/resultwriter.py +0 -0
  176. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/stringcache.py +0 -0
  177. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/reporting/xunitwriter.py +0 -0
  178. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/__init__.py +0 -0
  179. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/configurer.py +0 -0
  180. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/executionerrors.py +0 -0
  181. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/executionresult.py +0 -0
  182. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/flattenkeywordmatcher.py +0 -0
  183. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/keywordremover.py +0 -0
  184. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/merger.py +0 -0
  185. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/messagefilter.py +0 -0
  186. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/modeldeprecation.py +0 -0
  187. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/suiteteardownfailed.py +0 -0
  188. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/visitor.py +0 -0
  189. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/result/xmlelementhandlers.py +0 -0
  190. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/run.py +0 -0
  191. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/__init__.py +0 -0
  192. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/__init__.py +0 -0
  193. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/argumentconverter.py +0 -0
  194. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/argumentmapper.py +0 -0
  195. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/argumentparser.py +0 -0
  196. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/argumentresolver.py +0 -0
  197. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/argumentspec.py +0 -0
  198. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/argumentvalidator.py +0 -0
  199. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/customconverters.py +0 -0
  200. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/embedded.py +0 -0
  201. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/typeconverters.py +0 -0
  202. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/typeinfoparser.py +0 -0
  203. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/arguments/typevalidator.py +0 -0
  204. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/bodyrunner.py +0 -0
  205. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/builder/__init__.py +0 -0
  206. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/builder/builders.py +0 -0
  207. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/builder/parsers.py +0 -0
  208. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/builder/settings.py +0 -0
  209. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/builder/transformers.py +0 -0
  210. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/context.py +0 -0
  211. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/dynamicmethods.py +0 -0
  212. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/importer.py +0 -0
  213. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/invalidkeyword.py +0 -0
  214. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/keywordfinder.py +0 -0
  215. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/keywordimplementation.py +0 -0
  216. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/librarykeyword.py +0 -0
  217. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/librarykeywordrunner.py +0 -0
  218. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/libraryscopes.py +0 -0
  219. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/namespace.py +0 -0
  220. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/outputcapture.py +0 -0
  221. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/randomizer.py +0 -0
  222. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/resourcemodel.py +0 -0
  223. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/runkwregister.py +0 -0
  224. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/signalhandler.py +0 -0
  225. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/status.py +0 -0
  226. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/statusreporter.py +0 -0
  227. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/suiterunner.py +0 -0
  228. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/testlibraries.py +0 -0
  229. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/timeouts/__init__.py +0 -0
  230. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/timeouts/nosupport.py +0 -0
  231. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/timeouts/posix.py +0 -0
  232. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/timeouts/runner.py +0 -0
  233. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/timeouts/timeout.py +0 -0
  234. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/timeouts/windows.py +0 -0
  235. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/running/userkeywordrunner.py +0 -0
  236. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/__init__.py +0 -0
  237. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/application.py +0 -0
  238. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/argumentparser.py +0 -0
  239. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/asserts.py +0 -0
  240. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/charwidth.py +0 -0
  241. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/compress.py +0 -0
  242. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/connectioncache.py +0 -0
  243. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/dotdict.py +0 -0
  244. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/encoding.py +0 -0
  245. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/encodingsniffer.py +0 -0
  246. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/error.py +0 -0
  247. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/escaping.py +0 -0
  248. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/etreewrapper.py +0 -0
  249. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/filereader.py +0 -0
  250. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/frange.py +0 -0
  251. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/htmlformatters.py +0 -0
  252. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/json.py +0 -0
  253. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/markuputils.py +0 -0
  254. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/markupwriters.py +0 -0
  255. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/match.py +0 -0
  256. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/misc.py +0 -0
  257. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/notset.py +0 -0
  258. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/platform.py +0 -0
  259. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/recommendations.py +0 -0
  260. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/restreader.py +0 -0
  261. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/robotenv.py +0 -0
  262. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/robotinspect.py +0 -0
  263. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/robotio.py +0 -0
  264. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/robotpath.py +0 -0
  265. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/robottime.py +0 -0
  266. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/secret.py +0 -0
  267. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/setter.py +0 -0
  268. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/sortable.py +0 -0
  269. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/text.py +0 -0
  270. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/typehints.py +0 -0
  271. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/utils/unic.py +0 -0
  272. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/__init__.py +0 -0
  273. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/assigner.py +0 -0
  274. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/evaluation.py +0 -0
  275. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/filesetter.py +0 -0
  276. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/finders.py +0 -0
  277. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/notfound.py +0 -0
  278. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/replacer.py +0 -0
  279. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/resolvable.py +0 -0
  280. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/scopes.py +0 -0
  281. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/search.py +0 -0
  282. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/store.py +0 -0
  283. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/tablesetter.py +0 -0
  284. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robot/variables/variables.py +0 -0
  285. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robotframework.egg-info/SOURCES.txt +0 -0
  286. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robotframework.egg-info/entry_points.txt +0 -0
  288. {robotframework-7.4rc2 → robotframework-7.4.2}/src/robotframework.egg-info/top_level.txt +0 -0
  289. {robotframework-7.4rc2 → robotframework-7.4.2}/tasks.py +0 -0
@@ -302,6 +302,14 @@ version.
302
302
  C:\>py -3.11 -m robot --version
303
303
  Robot Framework 7.0 (Python 3.11.7 on win32)
304
304
 
305
+ Dependencies
306
+ ------------
307
+
308
+ Robot Framework core functionality has no mandatory dependencies other than
309
+ Python and its standard library. Some individual features may require optional
310
+ dependencies to be installed, though. What dependencies are needed is always
311
+ explained in the relevant documentation.
312
+
305
313
  Virtual environments
306
314
  --------------------
307
315
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robotframework
3
- Version: 7.4rc2
3
+ Version: 7.4.2
4
4
  Summary: Generic automation framework for acceptance testing and robotic process automation (RPA)
5
5
  Home-page: https://robotframework.org
6
6
  Download-URL: https://pypi.org/project/robotframework
@@ -10,7 +10,7 @@ License: Apache License 2.0
10
10
  Project-URL: Source, https://github.com/robotframework/robotframework
11
11
  Project-URL: Issue Tracker, https://github.com/robotframework/robotframework/issues
12
12
  Project-URL: Documentation, https://robotframework.org/robotframework
13
- Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.4rc2.rst
13
+ Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.4.2.rst
14
14
  Project-URL: Slack, http://slack.robotframework.org
15
15
  Keywords: robotframework automation testautomation rpa testing acceptancetesting atdd bdd
16
16
  Platform: any
@@ -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.4rc2"
9
+ VERSION = "7.4.2"
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"
@@ -16,7 +16,7 @@
16
16
  import inspect
17
17
  import re
18
18
  from pathlib import Path
19
- from typing import cast, Iterable, Iterator, Union
19
+ from typing import Iterable, Iterator, Union
20
20
 
21
21
  from robot.errors import DataError
22
22
  from robot.utils import classproperty, Importer, is_list_like, normalize
@@ -148,8 +148,8 @@ class Languages:
148
148
  def _get_available_languages(self) -> "dict[str, type[Language]]":
149
149
  available = {}
150
150
  for lang in Language.__subclasses__():
151
- available[normalize(cast(str, lang.code), ignore="-")] = lang
152
- available[normalize(cast(str, lang.name))] = lang
151
+ available[normalize(lang.code, ignore="-")] = lang
152
+ available[normalize(lang.name)] = lang
153
153
  if "" in available:
154
154
  available.pop("")
155
155
  return available
@@ -252,7 +252,7 @@ class Language:
252
252
  """
253
253
  if cls is Language:
254
254
  return cls.__dict__["code"]
255
- code = cast(type, cls).__name__.lower()
255
+ code = cls.__name__.lower()
256
256
  if len(code) < 3:
257
257
  return code
258
258
  return f"{code[:2]}-{code[2:].upper()}"
@@ -30,7 +30,7 @@ you have encountered a bug.
30
30
  <script>document.getElementById("javascript-disabled").style.display="none",window.addEventListener("hashchange",function(){document.getElementsByClassName("hamburger-menu")[0].checked=!1},!1),window.addEventListener("hashchange",function(){if(0==window.location.hash.indexOf("#type-")){let e="#type-modal-"+decodeURI(window.location.hash.slice(6)),n=document.querySelector(".data-types").querySelector(e);n&&showModal(n)}},!1);</script>
31
31
 
32
32
  <style>:root{--background-color:white;--text-color:black;--border-color:#e0e0e2;--light-background-color:#f3f3f3;--robot-highlight:#00c0b5;--highlighted-color:var(--text-color);--highlighted-background-color:yellow;--less-important-text-color:gray;--link-color:#00e}[data-theme=dark]{--background-color:#1c2227;--text-color:#e2e1d7;--border-color:#4e4e4e;--light-background-color:#002b36;--robot-highlight:yellow;--highlighted-color:var(--background-color);--highlighted-background-color:yellow;--less-important-text-color:#5b6a6f;--link-color:#52adff;color-scheme:dark}body{background:var(--background-color);color:var(--text-color);margin:0;font-family:system-ui,-apple-system,sans-serif}input,button,select{background:var(--background-color);color:var(--text-color)}a{color:var(--link-color)}.base-container{display:flex}.libdoc-overview{background:#fff;background:var(--background-color);flex-direction:column;height:100vh;display:flex;position:sticky;top:0}.libdoc-overview h4{margin-top:.5rem;margin-bottom:.5rem}.keyword-search-box{border:1px solid var(--border-color);border-radius:3px;justify-content:space-between;height:30px;margin-top:.5rem;display:flex}#tags-shortcuts-container{border:1px solid var(--border-color);border-radius:3px;height:30px;margin-top:.5rem}.search-input{text-indent:4px;border:none;flex:1}.clear-search{border:none}#shortcuts-container{flex-direction:column;height:100%;display:flex}.libdoc-details{max-width:1000px;margin-top:60px;padding-left:2%;padding-right:2%;overflow:auto}.libdoc-title{width:300px;height:36px;color:var(--text-color);align-items:center;margin:.5rem;padding:.5rem;text-decoration:none;display:flex;position:fixed;top:0;left:0}#language-container{z-index:1000;position:fixed;top:0;right:0}#language-container button{border:none;padding-top:15px;padding-right:15px}#language-container svg{width:20px;height:20px}#language-container svg path{stroke:var(--text-color);fill:var(--background-color)}#language-container ul{background-color:var(--background-color);margin:0;padding:10px;list-style:none}#language-container a{cursor:pointer;color:var(--less-important-text-color);text-decoration:none}#language-container a.selected{color:var(--text-color)}.hamburger-menu{z-index:100;display:none;position:fixed}input.hamburger-menu{cursor:pointer;opacity:0;z-index:2;-webkit-touch-callout:none;width:67px;height:46px;display:none;position:fixed;top:0;right:0}span.hamburger-menu{background:#000;background:var(--text-color);z-index:1;transform-origin:4px 0;border-radius:2px;width:31px;height:2px;margin-bottom:5px;transition:transform .3s cubic-bezier(.77,.2,.05,1),opacity .35s;position:fixed;right:20px}span.hamburger-menu-1{transform-origin:0 0;top:14px}span.hamburger-menu-2{top:24px}span.hamburger-menu-3{transform-origin:0 100%;top:34px}input.hamburger-menu:checked~span.hamburger-menu-1{opacity:1;background:var(--text-color);transform:rotate(45deg)translate(2px,-3px)}input.hamburger-menu:checked~span.hamburger-menu-2{opacity:0;transform:rotate(0)scale(.2)}input.hamburger-menu:checked~span.hamburger-menu-3{background:var(--text-color);transform:rotate(-45deg)translate(2px,3px)}.libdoc-title>svg{width:42px;height:42px;padding-top:2px}#robot-svg-path{fill:var(--text-color);stroke:none;fill-opacity:1;fill-rule:nonzero}.keywords-overview{border:1px solid var(--border-color);border-radius:3px;flex-direction:column;flex:1;height:0;max-height:calc(100vh - 60px - .5rem);margin:60px 0 .5rem .5rem;padding-left:.5rem;padding-right:.5rem;display:flex}.keywords-overview-header-row{justify-content:space-between;display:flex}.shortcuts{flex:1;max-width:320px;margin:0;padding-left:0;font-size:.9em;list-style:none;overflow:auto}.shortcuts.keyword-wall{flex:unset}.shortcuts a{white-space:nowrap;color:var(--text-color);padding:.5rem;text-decoration:none;display:block}.shortcuts a:hover{background:var(--light-background-color)}.shortcuts a:first-letter{letter-spacing:.1em;font-weight:700}.shortcuts.keyword-wall a{padding:0 .5rem .5rem 0}.shortcuts.keyword-wall a:after{content:"·";padding-left:.5rem}.enum-type-members,.dt-usages-list{padding-left:1em;list-style:none}.dt-usages-list>li{margin-bottom:.2em}.dt-usages a{color:var(--text-color);font-size:.9em;text-decoration:none;display:inline-block}.dt-usages a:first-letter{letter-spacing:.1em;font-weight:700}.arguments-list-container{margin-bottom:1.33rem;overflow-y:auto}.arguments-list{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr 1fr;grid-template-columns:auto auto auto;row-gap:3px;display:inline-grid}.typed-dict-annotation>span,.enum-type-members span,.arguments-list .arg-name{-ms-grid-column:1;white-space:nowrap;border-radius:3px;grid-column:1;justify-self:start;padding-left:.5rem;padding-right:.5rem}.arguments-list .arg-default-container{-ms-grid-column:2;grid-column:2;display:flex}.optional-key{font-style:italic}.arguments-list .arg-default-eq{background:var(--background-color);margin-left:2rem;margin-right:.5rem}.arguments-list .arg-default-value{border-radius:3px;padding-left:.5rem;padding-right:.5rem}.arguments-list .base-arg-data{min-width:150px;display:flex}.arguments-list .arg-type,.return-type .arg-type{-ms-grid-column:3;background:var(--background-color);white-space:nowrap;-webkit-text-size-adjust:none;grid-column:3;margin-left:2rem}.tags .kw-tags{margin-left:2rem;display:flex}.tag-link{cursor:pointer}.tag-link:hover{text-decoration:underline}.arguments-list .arg-kind{color:#0000;text-shadow:0 0 0 var(--less-important-text-color);padding:0;font-size:.8em}@media only screen and (width>=900px){.libdoc-details{z-index:1;background:var(--background-color)}#toggle-keyword-shortcuts{border:1px solid var(--border-color);border-radius:3px;margin-top:3px;margin-bottom:3px}#toggle-keyword-shortcuts:hover{background:var(--light-background-color)}.shortcuts.keyword-wall{flex-wrap:wrap;width:320px;max-width:none;display:flex}}@media only screen and (width>=1200px){.shortcuts.keyword-wall{width:640px}}@media only screen and (width<=899px){.libdoc-overview,#toggle-keyword-shortcuts{display:none}.libdoc-title{border-bottom:1px solid var(--border-color);background:#fff;background:var(--background-color);width:100%;margin:0;padding:.5rem}.libdoc-title>svg{margin-right:60px}.libdoc-details{padding-left:.5rem}input.hamburger-menu,.hamburger-menu{display:block}.hamburger-menu:checked~.libdoc-overview{width:100%;height:100vh;display:block;position:fixed}.keywords-overview{border:none;margin:60px 0 0}.shortcuts{overscroll-behavior:none;max-width:100vw}#language-container{width:100px;right:50px}#language-container button{cursor:pointer}}.metadata{margin-top:.5rem}.metadata th{text-align:left;padding-right:1em}a.name,span.name{font-style:italic}.libdoc-details a img{border:1px solid #c30!important}a:hover,a:active{color:var(--text-color);text-decoration:underline}a:hover{text-decoration:underline!important}.normal-first-letter:first-letter{letter-spacing:0!important;font-weight:400!important}.shortcut-list-toggle,.tag-list-toggle{margin-bottom:1em;font-size:.9em}input.switch{display:none}.slider{background-color:var(--border-color);width:36px;height:18px;display:inline-block;position:relative;top:5px}.slider:before{background-color:var(--background-color);content:"";width:12px;height:12px;position:absolute;top:3px;left:3px}input.switch:checked+.slider:before{background-color:var(--background-color);left:21px}.keywords{flex-direction:column;display:flex}.kw-overview{flex-direction:column;justify-content:start;display:flex}@media only screen and (width>=899px){.kw-overview{max-width:850px;margin-right:1.5rem}}.kw-docs{flex-direction:column;display:flex;overflow-y:auto}.dt-name:link,.kw-name:link,.dt-name:visited,.kw-name:visited{color:var(--text-color);text-decoration:none}.kw{align-items:baseline;min-width:250px;display:flex}h4{margin-right:.5rem}.keyword-container{border:1px solid var(--border-color);border-radius:3px;flex-direction:column;margin-bottom:.5rem;padding:.5rem 1rem;scroll-margin-top:60px;display:flex}.keyword-container:target{box-shadow:0 0 4px var(--robot-highlight)}.data-type-content,.keyword-content{flex-direction:column;display:flex}.data-type-container{border-top:1px solid var(--border-color);flex-direction:column;margin-bottom:.5rem;padding:.5rem 1rem;scroll-margin-top:60px;display:flex}.kw-row{border:1px solid var(--border-color);border-radius:3px;flex-direction:column;justify-content:start;margin-bottom:.5rem;padding:.5rem 1rem;text-decoration:none;display:flex}.kw a{color:inherit;font-weight:700;text-decoration:none}.args{min-width:200px}.enum-type-members span,.args span,.return-type span,.args a{background:var(--light-background-color);padding:0 .1em;font-family:monospace;font-size:1.1em}.arg-type,span.type,a.type{background:0 0;padding:0;font-size:1em}.typed-dict-item .td-type:after{content:","}.typed-dict-item .td-type:nth-last-child(2):after{content:""}.td-item:before{content:" ";white-space:pre}.typed-dict-item{background:var(--light-background-color);padding:.4rem;font-family:monospace;font-size:1.1em;display:block}.args span .highlight{background:var(--highlighted-background-color);color:var(--highlighted-color)}.tags,.return-type{align-items:baseline;display:flex}.tags a{color:inherit;padding:0 .1em;text-decoration:none}.footer{font-size:.9em}.doc div>:last-child{margin-bottom:0}.highlight{background:var(--highlighted-background-color);color:var(--highlighted-color)}.data-type{font-style:italic}.no-match{color:var(--less-important-text-color)!important}.no-match .dt-name,.no-match .kw-name{color:var(--less-important-text-color)}.modal-icon{cursor:pointer;background:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" height=\"100%\" width=\"100%\"><path stroke=\"black\" fill=\"none\" stroke-width=\"2px\" stroke-linecap=\"round\" d=\"M1 8 L1 1 L8 1 M16 1 L23 1 L23 8 M23 16 L23 23 L16 23 M8 23 L1 23 L1 16\"></path><path fill=\"black\" stroke=\"none\" stroke-width=\"1px\" transform=\"scale(1.3) translate(-3 -2.5)\" d=\"M19 7.97zm-8 9.2-4-2.3v-4.63l4 2.33v4.6zm1-6.33L8.04 8.53 12 6.25l3.96 2.28L12 10.84zm5 4.03-4 2.3v-4.6l4-2.33v4.63z\"></path></svg>");border:none;width:1rem;height:1rem;margin:0 .25rem;padding:0;font-size:12px;font-weight:600}@media (prefers-color-scheme:dark){.modal-icon{background:url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" height=\"100%\" width=\"100%\"><path stroke=\"%23e2e1d7\" fill=\"none\" stroke-width=\"2px\" stroke-linecap=\"round\" d=\"M1 8 L1 1 L8 1 M16 1 L23 1 L23 8 M23 16 L23 23 L16 23 M8 23 L1 23 L1 16\"></path><path fill=\"%23e2e1d7\" stroke=\"none\" stroke-width=\"1px\" transform=\"scale(1.3) translate(-3 -2.5)\" d=\"M19 7.97zm-8 9.2-4-2.3v-4.63l4 2.33v4.6zm1-6.33L8.04 8.53 12 6.25l3.96 2.28L12 10.84zm5 4.03-4 2.3v-4.6l4-2.33v4.63z\"></path></svg>")}}.modal-background,.modal{opacity:0;pointer-events:none;transition:opacity .2s}.modal-background{z-index:1;background-color:#000000b3;position:fixed;inset:0}.modal{background-color:var(--background-color);border:1px solid var(--border-color);z-index:2;border-radius:3px;flex-flow:column;width:720px;max-width:calc(100vw - 2rem);height:calc(100vh - 6rem);margin:0 auto;transition-delay:.1s;display:flex;overflow:auto}.modal-content{margin-bottom:3rem}.modal>.modal-content>.data-type-container{border-top:none}.modal-close-button-wrapper{justify-content:flex-end;display:flex}.modal-close-button-container{width:720px;max-width:calc(100vw - 2rem);margin:0 auto;overflow:auto}.modal-close-button{border:1px solid var(--border-color);cursor:pointer;border-radius:3px;margin:.5rem 0;padding:.25rem .5rem}.modal-background.visible,.modal.visible{opacity:1;pointer-events:all}#data-types-container,.hidden{display:none}</style>
33
- <style>#introduction-container>h2,.doc>h1,.doc>h2,.section>h1,.section>h2{margin-top:4rem;margin-bottom:1rem}.doc>h3,.section>h3{margin-top:3rem;margin-bottom:1rem}.doc>h4,.section>h4{margin-top:2rem;margin-bottom:1rem}.doc>p,.section>p{margin-top:1rem;margin-bottom:.5rem}.doc>:first-child{margin-top:.1em}.doc table{border-collapse:collapse;empty-cells:show;background:0 0;border:none;font-size:.9em;display:block;overflow-y:auto}.doc table th,.doc table td{border:1px solid var(--border-color);background:0 0;height:1.2em;padding:.1em .3em}.doc table th{text-align:center;letter-spacing:.1em}.doc pre{letter-spacing:.05em;background:var(--light-background-color);border-radius:3px;padding:.3rem;font-size:1.1em;overflow-y:auto}.doc code,.docutils.literal{letter-spacing:.05em;background:var(--light-background-color);border-radius:3px;padding:1px;font-size:1.1em}.doc li{list-style-type:square;list-style-position:inside}.doc img{border:1px solid #ccc}.doc hr{background:#ccc;border:0;height:1px}</style>
33
+ <style>#introduction-container>h2,.doc>h1,.doc>h2,.section>h1,.section>h2{margin-top:4rem;margin-bottom:1rem}.doc>h3,.section>h3{margin-top:3rem;margin-bottom:1rem}.doc>h4,.section>h4{margin-top:2rem;margin-bottom:1rem}.doc>p,.section>p{margin-top:1rem;margin-bottom:.5rem}.doc>:first-child{margin-top:.1em}.doc table{border-collapse:collapse;empty-cells:show;background:0 0;border:none;font-size:.9em;display:block;overflow-y:auto}.doc table th,.doc table td{border:1px solid var(--border-color);background:0 0;height:1.2em;padding:.1em .3em}.doc table th{text-align:center;letter-spacing:.1em}.doc pre{letter-spacing:.05em;background:var(--light-background-color);border-radius:3px;padding:.3rem;font-size:1.1em;overflow-y:auto}.doc code,.docutils.literal{letter-spacing:.05em;background:var(--light-background-color);border-radius:3px;padding:1px;font-size:1.1em}.doc ul li{list-style-type:square;list-style-position:inside}.doc img{border:1px solid #ccc}.doc hr{background:#ccc;border:0;height:1px}</style>
34
34
  <style>.code .hll{background-color:#ffc}.code{background:#f8f8f8}.code .c{color:#408080;font-style:italic}.code .err{border:1px solid red}.code .k{color:green;font-weight:700}.code .o{color:#666}.code .ch,.code .cm{color:#408080;font-style:italic}.code .cp{color:#bc7a00}.code .cpf,.code .c1,.code .cs{color:#408080;font-style:italic}.code .gd{color:#a00000}.code .ge{font-style:italic}.code .gr{color:red}.code .gh{color:navy;font-weight:700}.code .gi{color:#00a000}.code .go{color:#888}.code .gp{color:navy;font-weight:700}.code .gs{font-weight:700}.code .gu{color:purple;font-weight:700}.code .gt{color:#04d}.code .kc,.code .kd,.code .kn{color:green;font-weight:700}.code .kp{color:green}.code .kr{color:green;font-weight:700}.code .kt{color:#b00040}.code .m{color:#666}.code .s{color:#ba2121}.code .na{color:#7d9029}.code .nb{color:green}.code .nc{color:#00f;font-weight:700}.code .no{color:#800}.code .nd{color:#a2f}.code .ni{color:#999;font-weight:700}.code .ne{color:#d2413a;font-weight:700}.code .nf{color:#00f}.code .nl{color:#a0a000}.code .nn{color:#00f;font-weight:700}.code .nt{color:green;font-weight:700}.code .nv{color:#19177c}.code .ow{color:#a2f;font-weight:700}.code .w{color:#bbb}.code .mb,.code .mf,.code .mh,.code .mi,.code .mo{color:#666}.code .sa,.code .sb,.code .sc,.code .dl{color:#ba2121}.code .sd{color:#ba2121;font-style:italic}.code .s2{color:#ba2121}.code .se{color:#b62;font-weight:700}.code .sh{color:#ba2121}.code .si{color:#b68;font-weight:700}.code .sx{color:green}.code .sr{color:#b68}.code .s1{color:#ba2121}.code .ss{color:#19177c}.code .bp{color:green}.code .fm{color:#00f}.code .vc,.code .vg,.code .vi,.code .vm{color:#19177c}.code .il{color:#666}@media (prefers-color-scheme:dark){.code .hll{background-color:#073642}.code{color:#839496;background:#002b36}.code .c{color:#586e75;font-style:italic}.code .err{color:#839496;background-color:#dc322f}.code .esc,.code .g{color:#839496}.code .k{color:#859900}.code .l,.code .n{color:#839496}.code .o{color:#586e75}.code .x,.code .p{color:#839496}.code .ch,.code .cm{color:#586e75;font-style:italic}.code .cp{color:#d33682}.code .cpf{color:#586e75}.code .c1,.code .cs{color:#586e75;font-style:italic}.code .gd{color:#dc322f}.code .ge{color:#839496;font-style:italic}.code .gr{color:#dc322f}.code .gh{color:#839496;font-weight:700}.code .gi{color:#859900}.code .go,.code .gp{color:#839496}.code .gs{color:#839496;font-weight:700}.code .gu{color:#839496;text-decoration:underline}.code .gt{color:#268bd2}.code .kc,.code .kd{color:#2aa198}.code .kn{color:#cb4b16}.code .kp,.code .kr{color:#859900}.code .kt{color:#b58900}.code .ld{color:#839496}.code .m,.code .s{color:#2aa198}.code .na{color:#839496}.code .nb,.code .nc,.code .no,.code .nd,.code .ni,.code .ne,.code .nf,.code .nl,.code .nn{color:#268bd2}.code .nx,.code .py{color:#839496}.code .nt,.code .nv{color:#268bd2}.code .ow{color:#859900}.code .w{color:#839496}.code .mb,.code .mf,.code .mh,.code .mi,.code .mo,.code .sa,.code .sb,.code .sc,.code .dl{color:#2aa198}.code .sd{color:#586e75}.code .s2,.code .se,.code .sh,.code .si,.code .sx{color:#2aa198}.code .sr{color:#cb4b16}.code .s1,.code .ss{color:#2aa198}.code .bp,.code .fm,.code .vc,.code .vg,.code .vi,.code .vm{color:#268bd2}.code .il{color:#2aa198}}</style>
35
35
  <style media=print>body{margin:0;padding:0;font-size:8pt}a{text-decoration:none}#search,#open-search{display:none}</style>
36
36
 
@@ -56,7 +56,7 @@ type="checkbox"
56
56
  >{{scope}}</td></tr>{{/if}}
57
57
  </table>
58
58
  <div id="introduction-container">
59
- <h2 id="introduction">{{t "intro"}}</h2>
59
+ <h2 id="Introduction">{{t "intro"}}</h2>
60
60
  <div class="doc">{{{doc}}}</div>
61
61
  </div>
62
62
  <div id="importing-container"></div>
@@ -23,18 +23,17 @@ from robot.utils.htmlformatters import HeaderFormatter
23
23
 
24
24
  class DocFormatter:
25
25
  _header_regexp = re.compile(r"<h([234])>(.+?)</h\1>")
26
- _name_regexp = re.compile("`(.+?)`")
27
26
 
28
27
  def __init__(self, keywords, type_info, introduction, doc_format="ROBOT"):
29
- self._doc_to_html = DocToHtml(doc_format)
30
- self._targets = self._get_targets(
28
+ targets = self._get_targets(
31
29
  keywords,
30
+ type_info,
32
31
  introduction,
33
32
  robot_format=doc_format == "ROBOT",
34
33
  )
35
- self._type_info_targets = self._get_type_info_targets(type_info)
34
+ self._doc_to_html = DocToHtml(doc_format, targets)
36
35
 
37
- def _get_targets(self, keywords, introduction, robot_format):
36
+ def _get_targets(self, keywords, type_info, introduction, robot_format):
38
37
  targets = {
39
38
  "introduction": "Introduction",
40
39
  "library introduction": "Introduction",
@@ -42,16 +41,17 @@ class DocFormatter:
42
41
  "library importing": "Importing",
43
42
  "keywords": "Keywords",
44
43
  }
45
- for kw in keywords:
46
- targets[kw.name] = kw.name
44
+ for info in type_info:
45
+ targets[info.name] = "type-" + info.name
47
46
  if robot_format:
48
47
  for header in self._yield_header_targets(introduction):
49
48
  targets[header] = header
50
- return self._escape_and_encode_targets(targets)
51
-
52
- def _get_type_info_targets(self, type_info):
53
- targets = {info.name: info.name for info in type_info}
54
- return self._escape_and_encode_targets(targets)
49
+ for kw in keywords:
50
+ targets[kw.name] = kw.name
51
+ return {
52
+ html_escape(key): "#" + self._encode_uri_component(value)
53
+ for key, value in targets.items()
54
+ }
55
55
 
56
56
  def _yield_header_targets(self, introduction):
57
57
  headers = HeaderFormatter()
@@ -60,12 +60,6 @@ class DocFormatter:
60
60
  if match:
61
61
  yield match.group(2)
62
62
 
63
- def _escape_and_encode_targets(self, targets):
64
- return NormalizedDict(
65
- (html_escape(key), self._encode_uri_component(value))
66
- for key, value in targets.items()
67
- )
68
-
69
63
  def _encode_uri_component(self, value):
70
64
  # Emulates encodeURIComponent javascript function
71
65
  return quote(value.encode("UTF-8"), safe="-_.!~*'()")
@@ -74,23 +68,15 @@ class DocFormatter:
74
68
  doc = self._doc_to_html(doc)
75
69
  if intro:
76
70
  doc = self._header_regexp.sub(r'<h\1 id="\2">\2</h\1>', doc)
77
- return self._name_regexp.sub(self._link_keywords, doc)
78
-
79
- def _link_keywords(self, match):
80
- name = match.group(1)
81
- targets = self._targets
82
- types = self._type_info_targets
83
- if name in targets:
84
- return f'<a href="#{targets[name]}" class="name">{name}</a>'
85
- if name in types:
86
- return f'<a href="#type-{types[name]}" class="name">{name}</a>'
87
- return f'<span class="name">{name}</span>'
71
+ return doc
88
72
 
89
73
 
90
74
  class DocToHtml:
75
+ _name_regexp = re.compile("`(.+?)`")
91
76
 
92
- def __init__(self, doc_format):
77
+ def __init__(self, doc_format, targets=None):
93
78
  self._formatter = self._get_formatter(doc_format)
79
+ self._targets = NormalizedDict(targets)
94
80
 
95
81
  def _get_formatter(self, doc_format):
96
82
  try:
@@ -119,7 +105,15 @@ class DocToHtml:
119
105
  return parts["html_body"]
120
106
 
121
107
  def __call__(self, doc):
122
- return self._formatter(doc)
108
+ doc = self._formatter(doc)
109
+ return self._name_regexp.sub(self._link_keywords, doc)
110
+
111
+ def _link_keywords(self, match):
112
+ name = match.group(1)
113
+ target = self._targets.get(name)
114
+ if target:
115
+ return f'<a href="{target}" class="name">{name}</a>'
116
+ return f'<span class="name">{name}</span>'
123
117
 
124
118
 
125
119
  class HtmlToText:
@@ -46,7 +46,7 @@ class LibraryDocBuilder:
46
46
  )
47
47
  libdoc.inits = self._get_initializers(lib)
48
48
  libdoc.keywords = KeywordDocBuilder().build_keywords(lib)
49
- libdoc.type_docs = self._get_type_docs(
49
+ libdoc.type_docs = TypeDocBuilder().build(
50
50
  libdoc.inits + libdoc.keywords,
51
51
  lib.converters,
52
52
  )
@@ -71,8 +71,11 @@ class LibraryDocBuilder:
71
71
  return [KeywordDocBuilder().build_keyword(lib.init)]
72
72
  return []
73
73
 
74
- def _get_type_docs(self, keywords, custom_converters):
75
- all_type_docs = {}
74
+
75
+ class TypeDocBuilder:
76
+
77
+ def build(self, keywords, custom_converters=None):
78
+ all_type_docs: dict[TypeDoc, set[str]] = {}
76
79
  for kw in keywords:
77
80
  for name, type_info in self._yield_names_and_infos(kw.args):
78
81
  type_docs = kw.type_docs.setdefault(name, {})
@@ -114,6 +117,7 @@ class ResourceDocBuilder:
114
117
  lineno=1,
115
118
  )
116
119
  libdoc.keywords = KeywordDocBuilder(resource=True).build_keywords(resource)
120
+ libdoc.type_docs = TypeDocBuilder().build(libdoc.keywords)
117
121
  return libdoc
118
122
 
119
123
  def _import_resource(self, path):
@@ -45,9 +45,49 @@ from robot.version import get_version
45
45
 
46
46
  from .normalizer import Normalizer, StripSpaces
47
47
 
48
- # Type alias for expressions that are evaluated in Python. We may want to replace
49
- # this with a concrete type with a custom type documentation.
50
- Expression = object
48
+
49
+ class Expression:
50
+ """An expression evaluated in Python.
51
+
52
+ Expressions are evaluated using Python's
53
+ [http://docs.python.org/library/functions.html#eval|eval] function so
54
+ that all Python built-ins like ``len()`` and ``int()`` are available.
55
+ In addition to that, all unrecognized variables are considered to be
56
+ modules that are automatically imported. It is possible to use all
57
+ available Python modules, including the standard modules and the installed
58
+ third party modules.
59
+
60
+ Examples:
61
+ | `Should Be True` len('${result}') > 3
62
+ | `Run Keyword If` os.sep == '/' Non-Windows Keyword
63
+ | ${version} = `Evaluate` robot.__version__
64
+
65
+ When a variable is used in the expressing using the normal ``${variable}``
66
+ syntax, its value is replaced before the expression is evaluated. This
67
+ means that the value used in the expression will be the string
68
+ representation of the variable value, not the variable value itself.
69
+ This is not a problem with numbers and other objects that have a string
70
+ representation that can be evaluated directly, but with other objects
71
+ the behavior depends on the string representation. Most importantly,
72
+ strings must always be quoted, and if they can contain newlines, they must
73
+ be triple quoted.
74
+
75
+ Examples:
76
+ | `Should Be True` ${rc} < 10 Return code greater than 10
77
+ | `Run Keyword If` '${status}' == 'PASS' `Log` Passed
78
+ | `Run Keyword If` 'FAIL' in '''${output}''' `Log` Output contains FAIL
79
+
80
+ Actual variables values are also available in the evaluation namespace.
81
+ They can be accessed using special variable syntax without the curly
82
+ braces like ``$variable``. These variables should never be quoted.
83
+
84
+ Examples:
85
+ | `Should Be True` $rc < 10 Return code greater than 10
86
+ | `Run Keyword If` $status == 'PASS' `Log` Passed
87
+ | `Run Keyword If` 'FAIL' in $output `Log` Output contains FAIL
88
+ | `Should Be True` len($result) > 1 and $result[1] == 'OK'
89
+ | `Should Be True` $result is not None
90
+ """
51
91
 
52
92
 
53
93
  def run_keyword_variant(resolve, dry_run=False):
@@ -1775,7 +1815,7 @@ class _Variables(_BuiltInBase):
1775
1815
  return self._variables.as_dict(decoration=not no_decoration)
1776
1816
 
1777
1817
  @run_keyword_variant(resolve=0)
1778
- def get_variable_value(self, name: str, default: object = None, /) -> object:
1818
+ def get_variable_value(self, name: str, default: object = None) -> object:
1779
1819
  r"""Returns variable value or ``default`` if the variable does not exist.
1780
1820
 
1781
1821
  The name of the variable can be given either as a normal variable name
@@ -1826,7 +1866,7 @@ class _Variables(_BuiltInBase):
1826
1866
  return name, value
1827
1867
 
1828
1868
  @run_keyword_variant(resolve=0)
1829
- def variable_should_exist(self, name: str, message: "str | None" = None, /):
1869
+ def variable_should_exist(self, name: str, message: "str | None" = None):
1830
1870
  r"""Fails unless the given variable exists within the current scope.
1831
1871
 
1832
1872
  The name of the variable can be given either as a normal variable name
@@ -1851,7 +1891,7 @@ class _Variables(_BuiltInBase):
1851
1891
  )
1852
1892
 
1853
1893
  @run_keyword_variant(resolve=0)
1854
- def variable_should_not_exist(self, name: str, message: "str | None" = None, /):
1894
+ def variable_should_not_exist(self, name: str, message: "str | None" = None):
1855
1895
  r"""Fails if the given variable exists within the current scope.
1856
1896
 
1857
1897
  The name of the variable can be given either as a normal variable name
@@ -3350,7 +3390,7 @@ class _Control(_BuiltInBase):
3350
3390
  raise PassExecution(message)
3351
3391
 
3352
3392
  @run_keyword_variant(resolve=1)
3353
- def pass_execution_if(self, condition: Expression, message: str, /, *tags: str):
3393
+ def pass_execution_if(self, condition: Expression, message: str, *tags: str):
3354
3394
  """Conditionally skips rest of the current test, setup, or teardown with PASS status.
3355
3395
 
3356
3396
  A wrapper for `Pass Execution` to skip rest of the current test,
@@ -3640,7 +3680,7 @@ class _Misc(_BuiltInBase):
3640
3680
  logger.info(f"Reloaded library {lib.name} with {len(lib.keywords)} keywords.")
3641
3681
 
3642
3682
  @run_keyword_variant(resolve=0)
3643
- def import_library(self, name: str, /, *args: object):
3683
+ def import_library(self, name: str, *args: object):
3644
3684
  """Imports a library with the given name and optional arguments.
3645
3685
 
3646
3686
  This functionality allows dynamic importing of libraries while tests
@@ -3676,7 +3716,7 @@ class _Misc(_BuiltInBase):
3676
3716
  return args, None
3677
3717
 
3678
3718
  @run_keyword_variant(resolve=0)
3679
- def import_variables(self, path: str, /, *args: object):
3719
+ def import_variables(self, path: str, *args: object):
3680
3720
  """Imports a variable file with the given path and optional arguments.
3681
3721
 
3682
3722
  Variables imported with this keyword are set into the test suite scope
@@ -3701,7 +3741,7 @@ class _Misc(_BuiltInBase):
3701
3741
  raise RuntimeError(str(err))
3702
3742
 
3703
3743
  @run_keyword_variant(resolve=0)
3704
- def import_resource(self, path: str, /):
3744
+ def import_resource(self, path: str):
3705
3745
  """Imports a resource file with the given path.
3706
3746
 
3707
3747
  Resources imported with this keyword are set into the test suite scope
@@ -4250,6 +4290,7 @@ class _Misc(_BuiltInBase):
4250
4290
  converters={
4251
4291
  KeywordName: lambda value: str(value),
4252
4292
  KeywordArgument: lambda value: value,
4293
+ Expression: lambda value: value,
4253
4294
  },
4254
4295
  auto_keywords=True,
4255
4296
  )
@@ -4402,7 +4443,7 @@ class BuiltIn(_Verify, _Converter, _Variables, _RunKeyword, _Control, _Misc):
4402
4443
  Examples:
4403
4444
  | `Should Be True` len('${result}') > 3
4404
4445
  | `Run Keyword If` os.sep == '/' Non-Windows Keyword
4405
- | ${version} = `Evaluate` robot.__version__
4446
+ | ${version} = `Evaluate` robot.__version__
4406
4447
 
4407
4448
  `Evaluate` also allows configuring the execution namespace with a custom
4408
4449
  namespace and with custom modules to be imported. The latter functionality
@@ -4425,8 +4466,8 @@ class BuiltIn(_Verify, _Converter, _Variables, _RunKeyword, _Control, _Misc):
4425
4466
 
4426
4467
  Examples:
4427
4468
  | `Should Be True` ${rc} < 10 Return code greater than 10
4428
- | `Run Keyword If` '${status}' == 'PASS' Log Passed
4429
- | `Run Keyword If` 'FAIL' in '''${output}''' Log Output contains FAIL
4469
+ | `Run Keyword If` '${status}' == 'PASS' `Log` Passed
4470
+ | `Run Keyword If` 'FAIL' in '''${output}''' `Log` Output contains FAIL
4430
4471
 
4431
4472
  Actual variables values are also available in the evaluation namespace.
4432
4473
  They can be accessed using special variable syntax without the curly