robotframework 7.0.1rc2__zip → 7.1rc1__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. {robotframework-7.0.1rc2/src/robotframework.egg-info → robotframework-7.1rc1}/PKG-INFO +3 -2
  2. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/setup.py +2 -1
  3. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/interfaces.py +32 -0
  4. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/languages.py +73 -18
  5. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/settings.py +1 -1
  6. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/model.js +22 -33
  7. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/jsonbuilder.py +1 -1
  8. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/BuiltIn.py +16 -3
  9. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/DateTime.py +3 -2
  10. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Dialogs.py +12 -4
  11. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/OperatingSystem.py +4 -4
  12. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Process.py +7 -3
  13. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/String.py +4 -1
  14. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/dialogs_py.py +17 -1
  15. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/modelobject.py +1 -6
  16. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/dotted.py +1 -1
  17. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/highlighting.py +69 -56
  18. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/verbose.py +3 -3
  19. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/listeners.py +61 -217
  20. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/logger.py +30 -14
  21. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/loggerapi.py +11 -0
  22. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/loggerhelper.py +6 -1
  23. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/output.py +2 -1
  24. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/statements.py +1 -1
  25. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/executionresult.py +1 -0
  26. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/model.py +1 -1
  27. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/resultbuilder.py +12 -11
  28. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/xmlelementhandlers.py +12 -0
  29. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/__init__.py +1 -1
  30. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentresolver.py +15 -11
  31. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentspec.py +2 -2
  32. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentvalidator.py +0 -8
  33. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/embedded.py +2 -2
  34. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/invalidkeyword.py +4 -1
  35. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/keywordimplementation.py +9 -5
  36. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/librarykeyword.py +19 -9
  37. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/librarykeywordrunner.py +25 -19
  38. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/model.py +45 -26
  39. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/namespace.py +20 -26
  40. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/resourcemodel.py +9 -1
  41. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/statusreporter.py +9 -4
  42. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/testlibraries.py +2 -2
  43. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/userkeywordrunner.py +10 -7
  44. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/encodingsniffer.py +3 -1
  45. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robottime.py +5 -3
  46. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/evaluation.py +1 -4
  47. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/tablesetter.py +17 -20
  48. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/version.py +1 -1
  49. {robotframework-7.0.1rc2 → robotframework-7.1rc1/src/robotframework.egg-info}/PKG-INFO +3 -2
  50. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/AUTHORS.rst +0 -0
  51. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/BUILD.rst +0 -0
  52. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/CONTRIBUTING.rst +0 -0
  53. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/COPYRIGHT.txt +0 -0
  54. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/INSTALL.rst +0 -0
  55. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/LICENSE.txt +0 -0
  56. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/MANIFEST.in +0 -0
  57. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/README.rst +0 -0
  58. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/setup.cfg +0 -0
  59. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/__init__.py +0 -0
  60. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/__main__.py +0 -0
  61. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/__init__.py +0 -0
  62. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/deco.py +0 -0
  63. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/exceptions.py +0 -0
  64. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/logger.py +0 -0
  65. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/parsing.py +0 -0
  66. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/api/py.typed +0 -0
  67. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/__init__.py +0 -0
  68. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/conf/gatherfailed.py +0 -0
  69. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/errors.py +0 -0
  70. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/__init__.py +0 -0
  71. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/__init__.py +0 -0
  72. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/js_disabled.css +0 -0
  73. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/common/storage.js +0 -0
  74. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  75. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/jsonwriter.py +0 -0
  76. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/__init__.py +0 -0
  77. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  78. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  79. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  80. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  81. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  82. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  83. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  84. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  85. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  86. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/print.css +0 -0
  87. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  88. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/__init__.py +0 -0
  89. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/common.css +0 -0
  90. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  91. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  92. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.css +0 -0
  93. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.html +0 -0
  94. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/log.js +0 -0
  95. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/print.css +0 -0
  96. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/report.css +0 -0
  97. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/report.html +0 -0
  98. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/testdata.js +0 -0
  99. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/util.js +0 -0
  100. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/rebot/view.js +0 -0
  101. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/template.py +0 -0
  102. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  103. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  104. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  105. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdoc.py +0 -0
  106. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/__init__.py +0 -0
  107. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/builder.py +0 -0
  108. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  109. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/datatypes.py +0 -0
  110. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/htmlutils.py +0 -0
  111. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  112. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  113. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/model.py +0 -0
  114. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/output.py +0 -0
  115. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/robotbuilder.py +0 -0
  116. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/standardtypes.py +0 -0
  117. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/writer.py +0 -0
  118. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  119. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libdocpkg/xmlwriter.py +0 -0
  120. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Collections.py +0 -0
  121. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Easter.py +0 -0
  122. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Remote.py +0 -0
  123. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Screenshot.py +0 -0
  124. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/Telnet.py +0 -0
  125. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/XML.py +0 -0
  126. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/libraries/__init__.py +0 -0
  127. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/__init__.py +0 -0
  128. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/body.py +0 -0
  129. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/configurer.py +0 -0
  130. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/control.py +0 -0
  131. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/filter.py +0 -0
  132. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/fixture.py +0 -0
  133. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/itemlist.py +0 -0
  134. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/keyword.py +0 -0
  135. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/message.py +0 -0
  136. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/metadata.py +0 -0
  137. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/modifier.py +0 -0
  138. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/namepatterns.py +0 -0
  139. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/statistics.py +0 -0
  140. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/stats.py +0 -0
  141. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/suitestatistics.py +0 -0
  142. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tags.py +0 -0
  143. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tagsetter.py +0 -0
  144. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/tagstatistics.py +0 -0
  145. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/testcase.py +0 -0
  146. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/testsuite.py +0 -0
  147. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/totalstatistics.py +0 -0
  148. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/model/visitor.py +0 -0
  149. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/__init__.py +0 -0
  150. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/__init__.py +0 -0
  151. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/console/quiet.py +0 -0
  152. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/debugfile.py +0 -0
  153. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/filelogger.py +0 -0
  154. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/librarylogger.py +0 -0
  155. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/pyloggingconf.py +0 -0
  156. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/stdoutlogsplitter.py +0 -0
  157. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/output/xmllogger.py +0 -0
  158. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/__init__.py +0 -0
  159. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/__init__.py +0 -0
  160. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/blocklexers.py +0 -0
  161. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/context.py +0 -0
  162. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/lexer.py +0 -0
  163. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/settings.py +0 -0
  164. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/statementlexers.py +0 -0
  165. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  166. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/lexer/tokens.py +0 -0
  167. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/__init__.py +0 -0
  168. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/blocks.py +0 -0
  169. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/model/visitor.py +0 -0
  170. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/__init__.py +0 -0
  171. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/blockparsers.py +0 -0
  172. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/fileparser.py +0 -0
  173. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/parser/parser.py +0 -0
  174. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/parsing/suitestructure.py +0 -0
  175. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/pythonpathsetter.py +0 -0
  176. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/rebot.py +0 -0
  177. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/__init__.py +0 -0
  178. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  179. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsbuildingcontext.py +0 -0
  180. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsexecutionresult.py +0 -0
  181. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jsmodelbuilders.py +0 -0
  182. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/jswriter.py +0 -0
  183. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/logreportwriters.py +0 -0
  184. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/outputwriter.py +0 -0
  185. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/resultwriter.py +0 -0
  186. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/stringcache.py +0 -0
  187. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/reporting/xunitwriter.py +0 -0
  188. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/__init__.py +0 -0
  189. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/configurer.py +0 -0
  190. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/executionerrors.py +0 -0
  191. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/flattenkeywordmatcher.py +0 -0
  192. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/keywordremover.py +0 -0
  193. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/merger.py +0 -0
  194. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/messagefilter.py +0 -0
  195. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/modeldeprecation.py +0 -0
  196. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/suiteteardownfailed.py +0 -0
  197. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/result/visitor.py +0 -0
  198. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/run.py +0 -0
  199. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/__init__.py +0 -0
  200. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentconverter.py +0 -0
  201. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentmapper.py +0 -0
  202. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/argumentparser.py +0 -0
  203. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/customconverters.py +0 -0
  204. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeconverters.py +0 -0
  205. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeinfo.py +0 -0
  206. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typeinfoparser.py +0 -0
  207. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/arguments/typevalidator.py +0 -0
  208. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/bodyrunner.py +0 -0
  209. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/__init__.py +0 -0
  210. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/builders.py +0 -0
  211. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/parsers.py +0 -0
  212. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/settings.py +0 -0
  213. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/builder/transformers.py +0 -0
  214. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/context.py +0 -0
  215. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/dynamicmethods.py +0 -0
  216. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/importer.py +0 -0
  217. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/keywordfinder.py +0 -0
  218. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/libraryscopes.py +0 -0
  219. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/outputcapture.py +0 -0
  220. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/randomizer.py +0 -0
  221. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/runkwregister.py +0 -0
  222. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/signalhandler.py +0 -0
  223. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/status.py +0 -0
  224. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/suiterunner.py +0 -0
  225. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/__init__.py +0 -0
  226. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/nosupport.py +0 -0
  227. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/posix.py +0 -0
  228. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/running/timeouts/windows.py +0 -0
  229. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/testdoc.py +0 -0
  230. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/__init__.py +0 -0
  231. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/application.py +0 -0
  232. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/argumentparser.py +0 -0
  233. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/asserts.py +0 -0
  234. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/charwidth.py +0 -0
  235. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/compress.py +0 -0
  236. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/connectioncache.py +0 -0
  237. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/dotdict.py +0 -0
  238. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/encoding.py +0 -0
  239. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/error.py +0 -0
  240. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/escaping.py +0 -0
  241. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/etreewrapper.py +0 -0
  242. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/filereader.py +0 -0
  243. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/frange.py +0 -0
  244. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/htmlformatters.py +0 -0
  245. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/importer.py +0 -0
  246. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/markuputils.py +0 -0
  247. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/markupwriters.py +0 -0
  248. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/match.py +0 -0
  249. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/misc.py +0 -0
  250. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/normalizing.py +0 -0
  251. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/notset.py +0 -0
  252. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/platform.py +0 -0
  253. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/recommendations.py +0 -0
  254. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/restreader.py +0 -0
  255. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotenv.py +0 -0
  256. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotinspect.py +0 -0
  257. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotio.py +0 -0
  258. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robotpath.py +0 -0
  259. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/robottypes.py +0 -0
  260. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/setter.py +0 -0
  261. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/sortable.py +0 -0
  262. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/text.py +0 -0
  263. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/typehints.py +0 -0
  264. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/utils/unic.py +0 -0
  265. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/__init__.py +0 -0
  266. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/assigner.py +0 -0
  267. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/filesetter.py +0 -0
  268. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/finders.py +0 -0
  269. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/notfound.py +0 -0
  270. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/replacer.py +0 -0
  271. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/resolvable.py +0 -0
  272. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/scopes.py +0 -0
  273. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/search.py +0 -0
  274. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/store.py +0 -0
  275. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robot/variables/variables.py +0 -0
  276. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/SOURCES.txt +0 -0
  277. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  278. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/entry_points.txt +0 -0
  279. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/src/robotframework.egg-info/top_level.txt +0 -0
  280. {robotframework-7.0.1rc2 → robotframework-7.1rc1}/tasks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robotframework
3
- Version: 7.0.1rc2
3
+ Version: 7.1rc1
4
4
  Summary: Generic automation framework for acceptance testing and robotic process automation (RPA)
5
5
  Home-page: https://robotframework.org
6
6
  Author: Pekka Klärck
@@ -10,7 +10,7 @@ Download-URL: https://pypi.org/project/robotframework
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.0.1rc2.rst
13
+ Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.1rc1.rst
14
14
  Project-URL: Slack, http://slack.robotframework.org
15
15
  Description: Robot Framework
16
16
  ===============
@@ -176,6 +176,7 @@ Classifier: Programming Language :: Python :: 3.9
176
176
  Classifier: Programming Language :: Python :: 3.10
177
177
  Classifier: Programming Language :: Python :: 3.11
178
178
  Classifier: Programming Language :: Python :: 3.12
179
+ Classifier: Programming Language :: Python :: 3.13
179
180
  Classifier: Programming Language :: Python :: Implementation :: CPython
180
181
  Classifier: Programming Language :: Python :: Implementation :: PyPy
181
182
  Classifier: Topic :: Software Development :: Testing
@@ -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.0.1rc2'
9
+ VERSION = '7.1rc1'
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'
@@ -27,6 +27,7 @@ Programming Language :: Python :: 3.9
27
27
  Programming Language :: Python :: 3.10
28
28
  Programming Language :: Python :: 3.11
29
29
  Programming Language :: Python :: 3.12
30
+ Programming Language :: Python :: 3.13
30
31
  Programming Language :: Python :: Implementation :: CPython
31
32
  Programming Language :: Python :: Implementation :: PyPy
32
33
  Topic :: Software Development :: Testing
@@ -883,6 +883,38 @@ class ListenerV3:
883
883
  if it is enabled.
884
884
  """
885
885
 
886
+ def library_import(self, library: running.TestLibrary, importer: running.Import):
887
+ """Called after a library has been imported.
888
+
889
+ ``library`` represents the imported library. It can be inspected and
890
+ also modified. ``importer`` contains information about the location where
891
+ the library was imported.
892
+
893
+ New in Robot Framework 7.1.
894
+ """
895
+
896
+ def resource_import(self, resource: running.ResourceFile, importer: running.Import):
897
+ """Called after a resource file has been imported.
898
+
899
+ ``resource`` represents the imported resource file. It can be inspected and
900
+ also modified. ``importer`` contains information about the location where
901
+ the resource was imported.
902
+
903
+ New in Robot Framework 7.1.
904
+ """
905
+
906
+ def variables_import(self, attrs: dict, importer: running.Import):
907
+ """Called after a variable file has been imported.
908
+
909
+ ``attrs`` contains information about the imported variable file. It can be
910
+ inspected, but modifications to it have no effect. `importer`` contains
911
+ information about the location where the variable file was imported.
912
+
913
+ New in Robot Framework 7.1. This method will be changed in the future
914
+ so that the ``attrs`` dictionary is replaced with an object representing
915
+ the imported variable file.
916
+ """
917
+
886
918
  def output_file(self, path: Path):
887
919
  """Called after the output file has been created.
888
920
 
@@ -14,6 +14,7 @@
14
14
  # limitations under the License.
15
15
 
16
16
  import inspect
17
+ import re
17
18
  from itertools import chain
18
19
  from pathlib import Path
19
20
  from typing import cast, Iterable, Iterator, Union
@@ -52,11 +53,19 @@ class Languages:
52
53
  self.languages: 'list[Language]' = []
53
54
  self.headers: 'dict[str, str]' = {}
54
55
  self.settings: 'dict[str, str]' = {}
55
- self.bdd_prefixes: 'set[str]' = set()
56
+ self.bdd_prefixes: 'set[str]' = set()
56
57
  self.true_strings: 'set[str]' = {'True', '1'}
57
58
  self.false_strings: 'set[str]' = {'False', '0', 'None', ''}
58
59
  for lang in self._get_languages(languages, add_english):
59
60
  self._add_language(lang)
61
+ self._bdd_prefix_regexp = None
62
+
63
+ @property
64
+ def bdd_prefix_regexp(self):
65
+ if not self._bdd_prefix_regexp:
66
+ prefixes = '|'.join(self.bdd_prefixes).replace(' ', r'\s').lower()
67
+ self._bdd_prefix_regexp = re.compile(rf'({prefixes})\s', re.IGNORECASE)
68
+ return self._bdd_prefix_regexp
60
69
 
61
70
  def reset(self, languages: Iterable[LanguageLike] = (), add_english: bool = True):
62
71
  """Resets the instance to the given languages."""
@@ -87,6 +96,7 @@ class Languages:
87
96
  raise DataError(f'{err1} {err2}') from None
88
97
  for lang in languages:
89
98
  self._add_language(lang)
99
+ self._bdd_prefix_regexp = None
90
100
 
91
101
  def _exists(self, path: Path):
92
102
  try:
@@ -395,7 +405,7 @@ class Nl(Language):
395
405
  variables_header = 'Variabelen'
396
406
  test_cases_header = 'Testgevallen'
397
407
  tasks_header = 'Taken'
398
- keywords_header = 'Sleutelwoorden'
408
+ keywords_header = 'Actiewoorden'
399
409
  comments_header = 'Opmerkingen'
400
410
  library_setting = 'Bibliotheek'
401
411
  resource_setting = 'Resource'
@@ -403,24 +413,24 @@ class Nl(Language):
403
413
  name_setting = 'Naam'
404
414
  documentation_setting = 'Documentatie'
405
415
  metadata_setting = 'Metadata'
406
- suite_setup_setting = 'Suite Preconditie'
407
- suite_teardown_setting = 'Suite Postconditie'
408
- test_setup_setting = 'Test Preconditie'
409
- test_teardown_setting = 'Test Postconditie'
410
- test_template_setting = 'Test Sjabloon'
411
- test_timeout_setting = 'Test Time-out'
412
- test_tags_setting = 'Test Labels'
413
- task_setup_setting = 'Taak Preconditie'
414
- task_teardown_setting = 'Taak Postconditie'
415
- task_template_setting = 'Taak Sjabloon'
416
- task_timeout_setting = 'Taak Time-out'
417
- task_tags_setting = 'Taak Labels'
418
- keyword_tags_setting = 'Sleutelwoord Labels'
416
+ suite_setup_setting = 'Suitevoorbereiding'
417
+ suite_teardown_setting = 'Suite-afronding'
418
+ test_setup_setting = 'Testvoorbereiding'
419
+ test_teardown_setting = 'Testafronding'
420
+ test_template_setting = 'Testsjabloon'
421
+ test_timeout_setting = 'Testtijdslimiet'
422
+ test_tags_setting = 'Testlabels'
423
+ task_setup_setting = 'Taakvoorbereiding'
424
+ task_teardown_setting = 'Taakafronding'
425
+ task_template_setting = 'Taaksjabloon'
426
+ task_timeout_setting = 'Taaktijdslimiet'
427
+ task_tags_setting = 'Taaklabels'
428
+ keyword_tags_setting = 'Actiewoordlabels'
419
429
  tags_setting = 'Labels'
420
- setup_setting = 'Preconditie'
421
- teardown_setting = 'Postconditie'
430
+ setup_setting = 'Voorbereiding'
431
+ teardown_setting = 'Afronding'
422
432
  template_setting = 'Sjabloon'
423
- timeout_setting = 'Time-out'
433
+ timeout_setting = 'Tijdslimiet'
424
434
  arguments_setting = 'Parameters'
425
435
  given_prefixes = ['Stel', 'Gegeven']
426
436
  when_prefixes = ['Als']
@@ -1300,3 +1310,48 @@ class Ja(Language):
1300
1310
  but_prefixes = ['ただし', '但し']
1301
1311
  true_strings = ['真', '有効', 'はい', 'オン']
1302
1312
  false_strings = ['偽', '無効', 'いいえ', 'オフ']
1313
+
1314
+
1315
+ class Ko(Language):
1316
+ """Korean
1317
+
1318
+ New in Robot Framework 7.1.
1319
+ """
1320
+ settings_header = '설정'
1321
+ variables_header = '변수'
1322
+ test_cases_header = '테스트 사례'
1323
+ tasks_header = '작업'
1324
+ keywords_header = '키워드'
1325
+ comments_header = '의견'
1326
+ library_setting = '라이브러리'
1327
+ resource_setting = '자료'
1328
+ variables_setting = '변수'
1329
+ name_setting = '이름'
1330
+ documentation_setting = '문서'
1331
+ metadata_setting = '메타데이터'
1332
+ suite_setup_setting = '스위트 설정'
1333
+ suite_teardown_setting = '스위트 중단'
1334
+ test_setup_setting = '테스트 설정'
1335
+ task_setup_setting = '작업 설정'
1336
+ test_teardown_setting = '테스트 중단'
1337
+ task_teardown_setting = '작업 중단'
1338
+ test_template_setting = '테스트 템플릿'
1339
+ task_template_setting = '작업 템플릿'
1340
+ test_timeout_setting = '테스트 시간 초과'
1341
+ task_timeout_setting = '작업 시간 초과'
1342
+ test_tags_setting = '테스트 태그'
1343
+ task_tags_setting = '작업 태그'
1344
+ keyword_tags_setting = '키워드 태그'
1345
+ setup_setting = '설정'
1346
+ teardown_setting = '중단'
1347
+ template_setting = '템플릿'
1348
+ tags_setting = '태그'
1349
+ timeout_setting = '시간 초과'
1350
+ arguments_setting = '주장'
1351
+ given_prefixes = ['주어진']
1352
+ when_prefixes = ['때']
1353
+ then_prefixes = ['보다']
1354
+ and_prefixes = ['그리고']
1355
+ but_prefixes = ['하지만']
1356
+ true_strings = ['참', '네', '켜기']
1357
+ false_strings = ['거짓', '아니오', '끄기']
@@ -145,7 +145,7 @@ class _BaseSettings:
145
145
  def _process_doc(self, value):
146
146
  if isinstance(value, Path) or (os.path.isfile(value) and value.strip() == value):
147
147
  try:
148
- with open(value) as f:
148
+ with open(value, encoding='UTF-8') as f:
149
149
  value = f.read()
150
150
  except (OSError, IOError) as err:
151
151
  self._raise_invalid('Doc', f"Reading documentation from '{value}' "
@@ -272,26 +272,24 @@ window.stats = (function () {
272
272
  }
273
273
 
274
274
  function calculatePercents(total, passed, failed, skipped) {
275
- if (total == 0) {
275
+ if (total == 0)
276
276
  return [0.0, 0.0, 0.0];
277
- }
278
-
279
277
  var pass = 100.0 * passed / total;
280
278
  var skip = 100.0 * skipped / total;
281
279
  var fail = 100.0 * failed / total;
282
280
  if (pass > 0 && pass < 0.1)
283
- pass = 0.1
281
+ pass = 0.1;
284
282
  if (fail > 0 && fail < 0.1)
285
- fail = 0.1
283
+ fail = 0.1;
286
284
  if (skip > 0 && skip < 0.1)
287
- skip = 0.1
285
+ skip = 0.1;
288
286
  if (pass > 99.95 && pass < 100)
289
- pass = 99.9
287
+ pass = 99.9;
290
288
  if (fail > 99.95 && fail < 100)
291
- fail = 99.9
289
+ fail = 99.9;
292
290
  if (skip > 99.95 && skip < 100)
293
- skip = 99.9
294
- return [Math.round(pass*10)/10, Math.round(skip*10)/10, Math.round(fail*10)/10];
291
+ skip = 99.9;
292
+ return [round1(pass), round1(skip), round1(fail)];
295
293
  }
296
294
 
297
295
  function calculateWidths(num1, num2, num3) {
@@ -299,34 +297,25 @@ window.stats = (function () {
299
297
  return [0.0, 0.0, 0.0];
300
298
  // Make small percentages better visible
301
299
  if (num1 > 0 && num1 < 1)
302
- num1 = 1
300
+ num1 = 1.0;
303
301
  if (num2 > 0 && num2 < 1)
304
- num2 = 1
302
+ num2 = 1.0;
305
303
  if (num3 > 0 && num3 < 1)
306
- num3 = 1
307
-
304
+ num3 = 1.0;
308
305
  // Handle situation where some are rounded up
309
306
  while (num1 + num2 + num3 > 100) {
310
- if (num1 > num2 && num1 > num3)
311
- num1 -= 0.1;
312
- else if (num2 > num1 && num2 > num3)
313
- num2 -= 0.1;
314
- else if (num3 > num1 && num3 > num2)
315
- num3 -= 0.1;
316
- else if (num1 > num3 && num1 == num2) {
317
- num1 -= 0.1;
318
- num2 -= 0.1;
319
- }
320
- else if (num1 > num2 && num1 == num3) {
321
- num1 -= 0.1;
322
- num3 -= 0.1;
323
- }
324
- else if (num2 > num1 && num2 == num3) {
325
- num2 -= 0.1;
326
- num3 -= 0.1;
327
- }
307
+ if (num1 >= num2 && num1 >= num3)
308
+ num1 = round1(num1 - 0.1);
309
+ else if (num2 >= num1 && num2 >= num3)
310
+ num2 = round1(num2 - 0.1);
311
+ else
312
+ num3 = round1(num3 - 0.1);
328
313
  }
329
- return [Math.ceil(num1*10)/10, Math.ceil(num2*10)/10, Math.ceil(num3*10)/10];
314
+ return [num1, num2, num3];
315
+ }
316
+
317
+ function round1(num) {
318
+ return Math.round(num*10) / 10;
330
319
  }
331
320
 
332
321
  return {
@@ -50,7 +50,7 @@ class JsonDocBuilder:
50
50
  def _parse_spec_json(self, path):
51
51
  if not os.path.isfile(path):
52
52
  raise DataError(f"Spec file '{path}' does not exist.")
53
- with open(path) as json_source:
53
+ with open(path, encoding='UTF-8') as json_source:
54
54
  libdoc_dict = json.load(json_source)
55
55
  return libdoc_dict
56
56
 
@@ -1042,7 +1042,7 @@ class _Verify(_BuiltInBase):
1042
1042
  ignore_case=False, strip_spaces=False, collapse_spaces=False):
1043
1043
  """Fails if ``container`` does not contain ``item`` one or more times.
1044
1044
 
1045
- Works with strings, lists, and anything that supports Python's ``in``
1045
+ Works with strings, lists, bytes, and anything that supports Python's ``in``
1046
1046
  operator.
1047
1047
 
1048
1048
  See `Should Be Equal` for an explanation on how to override the default
@@ -1063,15 +1063,28 @@ class _Verify(_BuiltInBase):
1063
1063
  arguments are strings, the comparison is done with all white spaces replaced by
1064
1064
  a single space character.
1065
1065
 
1066
+ If the ``container`` is bytes and the ``item`` is a string, the ``item``
1067
+ is automatically converted to bytes. Conversion is done using the ISO-8859-1
1068
+ encoding that maps each Unicode code point directly to a matching byte.
1069
+
1066
1070
  Examples:
1067
1071
  | Should Contain | ${output} | PASS |
1068
1072
  | Should Contain | ${some list} | value | msg=Failure! | values=False |
1069
1073
  | Should Contain | ${some list} | value | ignore_case=True |
1070
1074
 
1071
- ``strip_spaces`` is new in Robot Framework 4.0 and ``collapse_spaces`` is new
1072
- in Robot Framework 4.1.
1075
+ ``strip_spaces`` is new in Robot Framework 4.0, ``collapse_spaces`` is new
1076
+ in Robot Framework 4.1 and automatically converting ``item`` to bytes
1077
+ is new in Robot Framework 7.1.
1073
1078
  """
1074
1079
  orig_container = container
1080
+ if isinstance(container, (bytes, bytearray)):
1081
+ if isinstance(item, str):
1082
+ try:
1083
+ item = item.encode('ISO-8859-1')
1084
+ except UnicodeEncodeError:
1085
+ raise ValueError(f'{item!r} cannot be encoded into bytes.')
1086
+ elif isinstance(item, int) and item not in range(256):
1087
+ raise ValueError(f'Byte must be in range 0-255, got {item}.')
1075
1088
  if ignore_case and is_string(item):
1076
1089
  item = item.casefold()
1077
1090
  if is_string(container):
@@ -191,6 +191,7 @@ integers or floating point numbers, the whole format is case and space
191
191
  insensitive, and it is possible to add a minus prefix to specify negative
192
192
  times. The available time specifiers are:
193
193
 
194
+ - ``weeks``, ``week``, ``w`` (new in RF 7.1)
194
195
  - ``days``, ``day``, ``d``
195
196
  - ``hours``, ``hour``, ``h``
196
197
  - ``minutes``, ``minute``, ``mins``, ``min``, ``m``
@@ -201,9 +202,9 @@ times. The available time specifiers are:
201
202
 
202
203
  When returning a time string, it is possible to select between ``verbose``
203
204
  and ``compact`` representations using ``result_format`` argument. The verbose
204
- format uses long specifiers ``day``, ``hour``, ``minute``, ``second`` and
205
+ format uses long specifiers ``week``, ``day``, ``hour``, ``minute``, ``second`` and
205
206
  ``millisecond``, and adds ``s`` at the end when needed. The compact format uses
206
- shorter specifiers ``d``, ``h``, ``min``, ``s`` and ``ms``, and even drops
207
+ shorter specifiers ``w``, ``d``, ``h``, ``min``, ``s`` and ``ms``, and even drops
207
208
  the space between the number and the specifier.
208
209
 
209
210
  Examples:
@@ -83,18 +83,26 @@ def get_value_from_user(message, default_value='', hidden=False):
83
83
  is_truthy(hidden)))
84
84
 
85
85
 
86
- def get_selection_from_user(message, *values):
86
+ def get_selection_from_user(message, *values, default=None):
87
87
  """Pauses execution and asks user to select a value.
88
88
 
89
89
  The selected value is returned. Pressing ``Cancel`` fails the keyword.
90
90
 
91
- ``message`` is the instruction shown in the dialog and ``values`` are
92
- the options given to the user.
91
+ ``message`` is the instruction shown in the dialog, ``values`` are
92
+ the options given to the user and ``default`` is the optional default value.
93
+
94
+ The default value can either be one of the specified values or the index of
95
+ the value starting from ``1``. For example, ``default=user1`` and ``default=1``
96
+ in the examples below have the exact same effect.
93
97
 
94
98
  Example:
95
99
  | ${user} = | Get Selection From User | Select user | user1 | user2 | admin |
100
+ | ${user} = | Get Selection From User | Select user | user1 | user2 | admin | default=user1 |
101
+ | ${user} = | Get Selection From User | Select user | user1 | user2 | admin | default=1 |
102
+
103
+ ``default`` is new in Robot Framework 7.1.
96
104
  """
97
- return _validate_user_input(SelectionDialog(message, values))
105
+ return _validate_user_input(SelectionDialog(message, values, default))
98
106
 
99
107
 
100
108
  def get_selections_from_user(message, *values):
@@ -29,8 +29,8 @@ from robot.api.deco import keyword
29
29
  from robot.utils import (abspath, ConnectionCache, console_decode, del_env_var,
30
30
  get_env_var, get_env_vars, get_time, is_truthy,
31
31
  is_string, normpath, parse_time, plural_or_not,
32
- safe_str, secs_to_timestr, seq2str,
33
- set_env_var, timestr_to_secs, CONSOLE_ENCODING, WINDOWS)
32
+ safe_str, secs_to_timestr, seq2str, set_env_var,
33
+ timestr_to_secs, CONSOLE_ENCODING, PY_VERSION, WINDOWS)
34
34
 
35
35
  __version__ = get_version()
36
36
  PROCESSES = ConnectionCache('No active processes.')
@@ -288,7 +288,7 @@ class OperatingSystem:
288
288
  return f.read().replace('\r\n', '\n')
289
289
 
290
290
  def _map_encoding(self, encoding):
291
- return {'SYSTEM': None,
291
+ return {'SYSTEM': 'locale' if PY_VERSION > (3, 10) else None,
292
292
  'CONSOLE': CONSOLE_ENCODING}.get(encoding.upper(), encoding)
293
293
 
294
294
  def get_binary_file(self, path):
@@ -1420,7 +1420,7 @@ class OperatingSystem:
1420
1420
  os.utime(path, (mtime, mtime))
1421
1421
  self._link("Touched existing file '%s'.", path)
1422
1422
  else:
1423
- open(path, 'w').close()
1423
+ open(path, 'w', encoding='ASCII').close()
1424
1424
  self._link("Touched new file '%s'.", path)
1425
1425
 
1426
1426
  def _absnorm(self, path):
@@ -16,6 +16,7 @@
16
16
  import os
17
17
  import signal as signal_module
18
18
  import subprocess
19
+ import sys
19
20
  import time
20
21
  from tempfile import TemporaryFile
21
22
 
@@ -27,6 +28,9 @@ from robot.utils import (cmdline2list, ConnectionCache, console_decode, console_
27
28
  from robot.version import get_version
28
29
 
29
30
 
31
+ LOCALE_ENCODING = 'locale' if sys.version_info >= (3, 10) else None
32
+
33
+
30
34
  class Process:
31
35
  """Robot Framework library for running processes.
32
36
 
@@ -894,10 +898,10 @@ class ProcessConfiguration:
894
898
 
895
899
  def _new_stream(self, name):
896
900
  if name == 'DEVNULL':
897
- return open(os.devnull, 'w')
901
+ return open(os.devnull, 'w', encoding=LOCALE_ENCODING)
898
902
  if name:
899
903
  path = os.path.normpath(os.path.join(self.cwd, name))
900
- return open(path, 'w')
904
+ return open(path, 'w', encoding=LOCALE_ENCODING)
901
905
  return subprocess.PIPE
902
906
 
903
907
  def _get_stderr(self, stderr, stdout, stdout_stream):
@@ -918,7 +922,7 @@ class ProcessConfiguration:
918
922
  return subprocess.PIPE
919
923
  path = os.path.normpath(os.path.join(self.cwd, stdin))
920
924
  if os.path.isfile(path):
921
- return open(path)
925
+ return open(path, encoding=LOCALE_ENCODING)
922
926
  stdin_file = TemporaryFile()
923
927
  stdin_file.write(console_encode(stdin, self.output_encoding, force=True))
924
928
  stdin_file.seek(0)
@@ -184,7 +184,7 @@ class String:
184
184
  raise TypeError('Cannot decode strings.')
185
185
  return bytes.decode(encoding, errors)
186
186
 
187
- def format_string(self, template, *positional, **named):
187
+ def format_string(self, template, /, *positional, **named):
188
188
  """Formats a ``template`` using the given ``positional`` and ``named`` arguments.
189
189
 
190
190
  The template can be either be a string or an absolute path to
@@ -205,6 +205,9 @@ class String:
205
205
  | ${xx} = | Format String | {:*^30} | centered |
206
206
  | ${yy} = | Format String | {0:{width}{base}} | ${42} | base=X | width=10 |
207
207
  | ${zz} = | Format String | ${CURDIR}/template.txt | positional | named=value |
208
+
209
+ Prior to Robot Framework 7.1, possible equal signs in the template string must
210
+ be escaped with a backslash like ``x\\={}`.
208
211
  """
209
212
  if os.path.isabs(template) and os.path.isfile(template):
210
213
  template = template.replace('/', os.sep)
@@ -154,13 +154,29 @@ class InputDialog(TkDialog):
154
154
 
155
155
  class SelectionDialog(TkDialog):
156
156
 
157
- def _create_widget(self, parent, values) -> Listbox:
157
+ def __init__(self, message, values, default=None):
158
+ super().__init__(message, values, default=default)
159
+
160
+ def _create_widget(self, parent, values, default=None) -> Listbox:
158
161
  widget = Listbox(parent)
159
162
  for item in values:
160
163
  widget.insert(END, item)
164
+ if default is not None:
165
+ widget.select_set(self._get_default_value_index(default, values))
161
166
  widget.config(width=0)
162
167
  return widget
163
168
 
169
+ def _get_default_value_index(self, default, values) -> int:
170
+ if default in values:
171
+ return values.index(default)
172
+ try:
173
+ index = int(default) - 1
174
+ except ValueError:
175
+ raise ValueError(f"Invalid default value '{default}'.")
176
+ if index < 0 or index >= len(values):
177
+ raise ValueError(f"Default value index is out of bounds.")
178
+ return index
179
+
164
180
  def _validate_value(self) -> bool:
165
181
  return bool(self.widget.curselection())
166
182
 
@@ -224,12 +224,7 @@ class JsonLoader:
224
224
  def _is_path(self, source):
225
225
  if isinstance(source, Path):
226
226
  return True
227
- if not isinstance(source, str) or '{' in source:
228
- return False
229
- try:
230
- return Path(source).is_file()
231
- except OSError: # Can happen on Windows w/ Python < 3.10.
232
- return False
227
+ return isinstance(source, str) and '{' not in source
233
228
 
234
229
 
235
230
  class JsonDumper:
@@ -63,7 +63,7 @@ class DottedOutput(LoggerApi):
63
63
  self.stderr.error(msg.message, msg.level)
64
64
 
65
65
  def result_file(self, kind, path):
66
- self.stdout.write(f"{kind+':':8} {path}\n")
66
+ self.stdout.result_file(kind, path)
67
67
 
68
68
 
69
69
  class StatusReporter(SuiteVisitor):