robotframework 7.4.1__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.4.1 → robotframework-7.4.2}/INSTALL.rst +8 -0
  2. {robotframework-7.4.1 → robotframework-7.4.2}/PKG-INFO +2 -2
  3. {robotframework-7.4.1 → robotframework-7.4.2}/setup.py +1 -1
  4. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/conf/languages.py +4 -4
  5. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/libdoc/libdoc.html +2 -2
  6. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/htmlutils.py +25 -31
  7. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/robotbuilder.py +7 -3
  8. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Process.py +6 -6
  9. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Telnet.py +15 -11
  10. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/tokenizer.py +22 -11
  11. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/testdoc.py +3 -0
  12. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/importer.py +2 -0
  13. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/normalizing.py +12 -1
  14. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/version.py +1 -1
  15. {robotframework-7.4.1 → robotframework-7.4.2}/src/robotframework.egg-info/PKG-INFO +2 -2
  16. {robotframework-7.4.1 → robotframework-7.4.2}/AUTHORS.rst +0 -0
  17. {robotframework-7.4.1 → robotframework-7.4.2}/BUILD.rst +0 -0
  18. {robotframework-7.4.1 → robotframework-7.4.2}/CONTRIBUTING.rst +0 -0
  19. {robotframework-7.4.1 → robotframework-7.4.2}/COPYRIGHT.txt +0 -0
  20. {robotframework-7.4.1 → robotframework-7.4.2}/LICENSE.txt +0 -0
  21. {robotframework-7.4.1 → robotframework-7.4.2}/MANIFEST.in +0 -0
  22. {robotframework-7.4.1 → robotframework-7.4.2}/README.rst +0 -0
  23. {robotframework-7.4.1 → robotframework-7.4.2}/pyproject.toml +0 -0
  24. {robotframework-7.4.1 → robotframework-7.4.2}/setup.cfg +0 -0
  25. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/__init__.py +0 -0
  26. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/__main__.py +0 -0
  27. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/__init__.py +0 -0
  28. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/deco.py +0 -0
  29. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/exceptions.py +0 -0
  30. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/interfaces.py +0 -0
  31. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/logger.py +0 -0
  32. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/parsing.py +0 -0
  33. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/py.typed +0 -0
  34. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/api/types.py +0 -0
  35. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/conf/__init__.py +0 -0
  36. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/conf/gatherfailed.py +0 -0
  37. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/conf/settings.py +0 -0
  38. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/errors.py +0 -0
  39. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/__init__.py +0 -0
  40. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/common/__init__.py +0 -0
  41. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/common/js_disabled.css +0 -0
  42. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/common/storage.js +0 -0
  43. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/htmlfilewriter.py +0 -0
  44. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/jsonwriter.py +0 -0
  45. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/lib/__init__.py +0 -0
  46. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  47. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.min.js +0 -0
  48. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  49. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  50. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  51. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/libdoc/__init__.py +0 -0
  52. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/__init__.py +0 -0
  53. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/common.css +0 -0
  54. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  55. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/fileloading.js +0 -0
  56. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/log.css +0 -0
  57. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/log.html +0 -0
  58. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/log.js +0 -0
  59. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/model.js +0 -0
  60. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/print.css +0 -0
  61. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/report.css +0 -0
  62. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/report.html +0 -0
  63. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/testdata.js +0 -0
  64. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/util.js +0 -0
  65. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/rebot/view.js +0 -0
  66. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/template.py +0 -0
  67. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/testdoc/__init__.py +0 -0
  68. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  69. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  70. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdoc.py +0 -0
  71. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/__init__.py +0 -0
  72. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/builder.py +0 -0
  73. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/consoleviewer.py +0 -0
  74. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/datatypes.py +0 -0
  75. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/htmlwriter.py +0 -0
  76. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/jsonbuilder.py +0 -0
  77. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/jsonwriter.py +0 -0
  78. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/languages.py +0 -0
  79. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/model.py +0 -0
  80. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/output.py +0 -0
  81. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/standardtypes.py +0 -0
  82. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/writer.py +0 -0
  83. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  84. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libdocpkg/xmlwriter.py +0 -0
  85. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/BuiltIn.py +0 -0
  86. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Collections.py +0 -0
  87. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/DateTime.py +0 -0
  88. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Dialogs.py +0 -0
  89. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Easter.py +0 -0
  90. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/OperatingSystem.py +0 -0
  91. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Remote.py +0 -0
  92. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/Screenshot.py +0 -0
  93. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/String.py +0 -0
  94. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/XML.py +0 -0
  95. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/__init__.py +0 -0
  96. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/dialogs_py.py +0 -0
  97. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/normalizer.py +0 -0
  98. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/libraries/py.typed +0 -0
  99. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/logo.png +0 -0
  100. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/__init__.py +0 -0
  101. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/body.py +0 -0
  102. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/configurer.py +0 -0
  103. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/control.py +0 -0
  104. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/filter.py +0 -0
  105. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/fixture.py +0 -0
  106. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/itemlist.py +0 -0
  107. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/keyword.py +0 -0
  108. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/message.py +0 -0
  109. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/metadata.py +0 -0
  110. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/modelobject.py +0 -0
  111. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/modifier.py +0 -0
  112. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/namepatterns.py +0 -0
  113. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/statistics.py +0 -0
  114. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/stats.py +0 -0
  115. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/suitestatistics.py +0 -0
  116. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/tags.py +0 -0
  117. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/tagsetter.py +0 -0
  118. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/tagstatistics.py +0 -0
  119. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/testcase.py +0 -0
  120. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/testsuite.py +0 -0
  121. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/totalstatistics.py +0 -0
  122. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/model/visitor.py +0 -0
  123. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/__init__.py +0 -0
  124. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/console/__init__.py +0 -0
  125. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/console/dotted.py +0 -0
  126. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/console/highlighting.py +0 -0
  127. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/console/quiet.py +0 -0
  128. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/console/verbose.py +0 -0
  129. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/debugfile.py +0 -0
  130. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/filelogger.py +0 -0
  131. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/jsonlogger.py +0 -0
  132. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/librarylogger.py +0 -0
  133. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/listeners.py +0 -0
  134. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/logger.py +0 -0
  135. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/loggerapi.py +0 -0
  136. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/loggerhelper.py +0 -0
  137. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/loglevel.py +0 -0
  138. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/output.py +0 -0
  139. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/outputfile.py +0 -0
  140. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/pyloggingconf.py +0 -0
  141. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/stdoutlogsplitter.py +0 -0
  142. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/output/xmllogger.py +0 -0
  143. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/__init__.py +0 -0
  144. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/__init__.py +0 -0
  145. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/blocklexers.py +0 -0
  146. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/context.py +0 -0
  147. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/lexer.py +0 -0
  148. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/settings.py +0 -0
  149. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/statementlexers.py +0 -0
  150. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/lexer/tokens.py +0 -0
  151. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/model/__init__.py +0 -0
  152. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/model/blocks.py +0 -0
  153. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/model/statements.py +0 -0
  154. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/model/visitor.py +0 -0
  155. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/parser/__init__.py +0 -0
  156. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/parser/blockparsers.py +0 -0
  157. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/parser/fileparser.py +0 -0
  158. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/parser/parser.py +0 -0
  159. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/parsing/suitestructure.py +0 -0
  160. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/pythonpathsetter.py +0 -0
  161. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/rebot.py +0 -0
  162. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/__init__.py +0 -0
  163. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  164. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/jsbuildingcontext.py +0 -0
  165. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/jsexecutionresult.py +0 -0
  166. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/jsmodelbuilders.py +0 -0
  167. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/jswriter.py +0 -0
  168. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/logreportwriters.py +0 -0
  169. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/outputwriter.py +0 -0
  170. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/resultwriter.py +0 -0
  171. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/stringcache.py +0 -0
  172. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/reporting/xunitwriter.py +0 -0
  173. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/__init__.py +0 -0
  174. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/configurer.py +0 -0
  175. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/executionerrors.py +0 -0
  176. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/executionresult.py +0 -0
  177. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/flattenkeywordmatcher.py +0 -0
  178. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/keywordremover.py +0 -0
  179. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/merger.py +0 -0
  180. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/messagefilter.py +0 -0
  181. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/model.py +0 -0
  182. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/modeldeprecation.py +0 -0
  183. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/resultbuilder.py +0 -0
  184. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/suiteteardownfailed.py +0 -0
  185. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/visitor.py +0 -0
  186. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/result/xmlelementhandlers.py +0 -0
  187. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/run.py +0 -0
  188. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/__init__.py +0 -0
  189. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/__init__.py +0 -0
  190. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/argumentconverter.py +0 -0
  191. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/argumentmapper.py +0 -0
  192. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/argumentparser.py +0 -0
  193. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/argumentresolver.py +0 -0
  194. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/argumentspec.py +0 -0
  195. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/argumentvalidator.py +0 -0
  196. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/customconverters.py +0 -0
  197. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/embedded.py +0 -0
  198. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/typeconverters.py +0 -0
  199. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/typeinfo.py +0 -0
  200. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/typeinfoparser.py +0 -0
  201. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/arguments/typevalidator.py +0 -0
  202. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/bodyrunner.py +0 -0
  203. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/builder/__init__.py +0 -0
  204. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/builder/builders.py +0 -0
  205. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/builder/parsers.py +0 -0
  206. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/builder/settings.py +0 -0
  207. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/builder/transformers.py +0 -0
  208. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/context.py +0 -0
  209. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/dynamicmethods.py +0 -0
  210. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/importer.py +0 -0
  211. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/invalidkeyword.py +0 -0
  212. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/keywordfinder.py +0 -0
  213. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/keywordimplementation.py +0 -0
  214. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/librarykeyword.py +0 -0
  215. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/librarykeywordrunner.py +0 -0
  216. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/libraryscopes.py +0 -0
  217. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/model.py +0 -0
  218. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/namespace.py +0 -0
  219. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/outputcapture.py +0 -0
  220. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/randomizer.py +0 -0
  221. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/resourcemodel.py +0 -0
  222. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/runkwregister.py +0 -0
  223. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/signalhandler.py +0 -0
  224. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/status.py +0 -0
  225. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/statusreporter.py +0 -0
  226. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/suiterunner.py +0 -0
  227. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/testlibraries.py +0 -0
  228. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/timeouts/__init__.py +0 -0
  229. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/timeouts/nosupport.py +0 -0
  230. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/timeouts/posix.py +0 -0
  231. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/timeouts/runner.py +0 -0
  232. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/timeouts/timeout.py +0 -0
  233. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/timeouts/windows.py +0 -0
  234. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/running/userkeywordrunner.py +0 -0
  235. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/__init__.py +0 -0
  236. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/application.py +0 -0
  237. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/argumentparser.py +0 -0
  238. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/asserts.py +0 -0
  239. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/charwidth.py +0 -0
  240. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/compress.py +0 -0
  241. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/connectioncache.py +0 -0
  242. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/dotdict.py +0 -0
  243. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/encoding.py +0 -0
  244. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/encodingsniffer.py +0 -0
  245. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/error.py +0 -0
  246. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/escaping.py +0 -0
  247. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/etreewrapper.py +0 -0
  248. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/filereader.py +0 -0
  249. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/frange.py +0 -0
  250. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/htmlformatters.py +0 -0
  251. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/json.py +0 -0
  252. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/markuputils.py +0 -0
  253. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/markupwriters.py +0 -0
  254. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/match.py +0 -0
  255. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/misc.py +0 -0
  256. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/notset.py +0 -0
  257. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/platform.py +0 -0
  258. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/recommendations.py +0 -0
  259. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/restreader.py +0 -0
  260. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/robotenv.py +0 -0
  261. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/robotinspect.py +0 -0
  262. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/robotio.py +0 -0
  263. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/robotpath.py +0 -0
  264. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/robottime.py +0 -0
  265. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/robottypes.py +0 -0
  266. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/secret.py +0 -0
  267. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/setter.py +0 -0
  268. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/sortable.py +0 -0
  269. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/text.py +0 -0
  270. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/typehints.py +0 -0
  271. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/utils/unic.py +0 -0
  272. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/__init__.py +0 -0
  273. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/assigner.py +0 -0
  274. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/evaluation.py +0 -0
  275. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/filesetter.py +0 -0
  276. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/finders.py +0 -0
  277. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/notfound.py +0 -0
  278. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/replacer.py +0 -0
  279. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/resolvable.py +0 -0
  280. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/scopes.py +0 -0
  281. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/search.py +0 -0
  282. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/store.py +0 -0
  283. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/tablesetter.py +0 -0
  284. {robotframework-7.4.1 → robotframework-7.4.2}/src/robot/variables/variables.py +0 -0
  285. {robotframework-7.4.1 → robotframework-7.4.2}/src/robotframework.egg-info/SOURCES.txt +0 -0
  286. {robotframework-7.4.1 → robotframework-7.4.2}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-7.4.1 → robotframework-7.4.2}/src/robotframework.egg-info/entry_points.txt +0 -0
  288. {robotframework-7.4.1 → robotframework-7.4.2}/src/robotframework.egg-info/top_level.txt +0 -0
  289. {robotframework-7.4.1 → 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.4.1
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.4.1.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.4.1"
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):
@@ -298,11 +298,11 @@ class ProcessConfiguration:
298
298
  }
299
299
 
300
300
  def __str__(self):
301
- printable_env = self.env
302
- if len(self.secret_env_keys):
303
- printable_env = self.env.copy()
304
- for k in self.secret_env_keys:
305
- printable_env[k] = str(Secret(""))
301
+ if self.secret_env_keys:
302
+ secret_env = dict.fromkeys(self.secret_env_keys, str(Secret("")))
303
+ env = {**self.env, **secret_env}
304
+ else:
305
+ env = self.env
306
306
  return f"""\
307
307
  cwd: {self.cwd}
308
308
  shell: {self.shell}
@@ -310,7 +310,7 @@ stdout: {self._stream_name(self.stdout_stream)}
310
310
  stderr: {self._stream_name(self.stderr_stream)}
311
311
  stdin: {self._stream_name(self.stdin_stream)}
312
312
  alias: {self.alias}
313
- env: {printable_env}"""
313
+ env: {env}"""
314
314
 
315
315
  def _stream_name(self, stream):
316
316
  if hasattr(stream, "name"):
@@ -44,6 +44,17 @@ class Telnet:
44
44
 
45
45
  %TOC%
46
46
 
47
+ = Dependencies =
48
+
49
+ ``Telnet`` uses the ``telnetlib`` module internally. This module was
50
+ part of the Python standard library until Python 3.12, but with newer
51
+ versions the [https://pypi.org/project/telnetlib-313-and-up|telnetlib-313-and-up]
52
+ package needs to be installed separately.
53
+
54
+ If there is a need to do `terminal emulation`, the
55
+ [https://pypi.org/project/pyte|pyte] module needs to be installed. It is
56
+ an optional dependency and only needed with terminal emulation.
57
+
47
58
  = Connections =
48
59
 
49
60
  The first step of using ``Telnet`` is opening a connection with `Open
@@ -193,7 +204,7 @@ class Telnet:
193
204
  = Terminal emulation =
194
205
 
195
206
  Telnet library supports terminal
196
- emulation with [http://pyte.readthedocs.io|Pyte]. Terminal emulation
207
+ emulation with [http://pyte.readthedocs.io|pyte]. Terminal emulation
197
208
  will process the output in a virtual screen. This means that ANSI escape
198
209
  codes, like cursor movements, and also control characters, like
199
210
  carriage returns and backspaces, have the same effect on the result as they
@@ -204,7 +215,7 @@ class Telnet:
204
215
  argument a true value (see `Boolean arguments`) either in the library
205
216
  initialization or with `Open Connection`.
206
217
 
207
- As Pyte approximates vt-style terminal, you may also want to set the
218
+ As ``pyte`` approximates vt-style terminal, you may also want to set the
208
219
  terminal type as ``vt100``. We also recommend that you increase the window
209
220
  size, as the terminal emulation will break all lines that are longer than
210
221
  the window row length.
@@ -215,15 +226,8 @@ class Telnet:
215
226
  Examples:
216
227
  | `Open Connection` | lolcathost | terminal_emulation=True | terminal_type=vt100 | window_size=400x100 |
217
228
 
218
- As a prerequisite for using terminal emulation, you need to have Pyte
219
- installed. Due to backwards incompatible changes in Pyte, different
220
- Robot Framework versions support different Pyte versions:
221
-
222
- - Pyte 0.6 and newer are supported by Robot Framework 3.0.3.
223
- Latest Pyte version can be installed (or upgraded) with
224
- ``pip install --upgrade pyte``.
225
- - Pyte 0.5.2 and older are supported by Robot Framework 3.0.2 and earlier.
226
- Pyte 0.5.2 can be installed with ``pip install pyte==0.5.2``.
229
+ As discussed in the `Dependencies` section, ``pyte`` is an optional dependency.
230
+ It needs to be installed separately to be able to use terminal emulation.
227
231
 
228
232
  = Logging =
229
233
 
@@ -36,9 +36,14 @@ class Tokenizer:
36
36
  current.extend(tokens)
37
37
  yield current
38
38
 
39
- def _tokenize_line(self, line: str, lineno: int, include_separators: bool):
39
+ def _tokenize_line(
40
+ self,
41
+ line: str,
42
+ lineno: int,
43
+ include_separators: bool,
44
+ ) -> "list[Token]":
40
45
  # Performance optimized code.
41
- tokens: "list[Token]" = []
46
+ tokens = []
42
47
  append = tokens.append
43
48
  offset = 0
44
49
  if line[:1] == "|" and line[:2].strip() == "|":
@@ -72,7 +77,11 @@ class Tokenizer:
72
77
  yield separator, False
73
78
  yield rest, True
74
79
 
75
- def _cleanup_tokens(self, tokens: "list[Token]", data_only: bool):
80
+ def _cleanup_tokens(
81
+ self,
82
+ tokens: "list[Token]",
83
+ data_only: bool,
84
+ ) -> "tuple[list[Token], bool]":
76
85
  has_data, comments, continues = self._handle_comments_and_continuation(tokens)
77
86
  self._remove_trailing_empty(tokens)
78
87
  if continues:
@@ -90,27 +99,29 @@ class Tokenizer:
90
99
  self,
91
100
  tokens: "list[Token]",
92
101
  ) -> "tuple[bool, bool, bool]":
102
+ first = True
93
103
  has_data = False
94
- commented = False
104
+ comments = False
95
105
  continues = False
96
- for index, token in enumerate(tokens):
106
+ for token in tokens:
97
107
  if token.type is None:
98
- # lstrip needed to strip possible leading space from first token.
99
- # Other leading/trailing spaces have been consumed as separators.
100
- value = token.value if index else token.value.lstrip()
101
- if commented:
108
+ # The first token may have a leading space. With others spaces
109
+ # have been consumed as separators.
110
+ value = token.value.lstrip() if first else token.value
111
+ if comments:
102
112
  token.type = Token.COMMENT
103
113
  elif value:
104
114
  if value[0] == "#":
105
115
  token.type = Token.COMMENT
106
- commented = True
116
+ comments = True
107
117
  elif not has_data:
108
118
  if value == "..." and not continues:
109
119
  token.type = Token.CONTINUATION
110
120
  continues = True
111
121
  else:
112
122
  has_data = True
113
- return has_data, commented, continues
123
+ first = False
124
+ return has_data, comments, continues
114
125
 
115
126
  def _remove_trailing_empty(self, tokens: "list[Token]"):
116
127
  for token in reversed(tokens):
@@ -57,6 +57,9 @@ test data. Generated documentation includes name, documentation and other
57
57
  metadata of each test suite and test case, as well as the top-level keywords
58
58
  and their arguments.
59
59
 
60
+ NOTE: Testdoc is deprecated and will be removed in Robot Framework 8.0.
61
+ Use https://github.com/MarvKler/robotframework-testdoc instead.
62
+
60
63
  Options
61
64
  =======
62
65
 
@@ -339,6 +339,8 @@ class ByPathImporter(_Importer):
339
339
 
340
340
  def _import_by_path(self, path):
341
341
  module_dir, module_name = self._split_path_to_module(path)
342
+ if "." in module_name:
343
+ raise DataError("Module name cannot contain dots when importing by path.")
342
344
  sys.path.insert(0, module_dir)
343
345
  try:
344
346
  return self._import(module_name)
@@ -17,6 +17,8 @@ import re
17
17
  from collections.abc import Iterable, Iterator, Mapping, Sequence
18
18
  from typing import MutableMapping, TypeVar
19
19
 
20
+ from .robottypes import type_name
21
+
20
22
  V = TypeVar("V")
21
23
  Self = TypeVar("Self", bound="NormalizedDict")
22
24
 
@@ -103,14 +105,23 @@ class NormalizedDict(MutableMapping[str, V]):
103
105
  return tuple(self._keys)
104
106
 
105
107
  def __getitem__(self, key: str) -> V:
108
+ if not isinstance(key, str):
109
+ raise KeyError(key)
106
110
  return self._data[self._normalize(key)]
107
111
 
108
112
  def __setitem__(self, key: str, value: V):
113
+ if not isinstance(key, str):
114
+ raise TypeError(
115
+ f"{type_name(self)} only accepts strings as keys, "
116
+ f"got {type_name(key)}."
117
+ )
109
118
  norm_key = self._normalize(key)
110
119
  self._data[norm_key] = value
111
120
  self._keys.setdefault(norm_key, key)
112
121
 
113
122
  def __delitem__(self, key: str):
123
+ if not isinstance(key, str):
124
+ raise KeyError(key)
114
125
  norm_key = self._normalize(key)
115
126
  del self._data[norm_key]
116
127
  del self._keys[norm_key]
@@ -147,7 +158,7 @@ class NormalizedDict(MutableMapping[str, V]):
147
158
  # Speed-ups. Following methods are faster than default implementations.
148
159
 
149
160
  def __contains__(self, key: str) -> bool:
150
- return self._normalize(key) in self._data
161
+ return isinstance(key, str) and self._normalize(key) in self._data
151
162
 
152
163
  def clear(self):
153
164
  self._data.clear()
@@ -18,7 +18,7 @@ import sys
18
18
 
19
19
  # Version number typically updated by running `invoke set-version <version>`.
20
20
  # Run `invoke --help set-version` or see tasks.py for details.
21
- VERSION = "7.4.1"
21
+ VERSION = "7.4.2"
22
22
 
23
23
 
24
24
  def get_version(naked=False):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robotframework
3
- Version: 7.4.1
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.4.1.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
File without changes
File without changes