robotframework 6.1.1__zip → 7.0a1__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 (288) hide show
  1. {robotframework-6.1.1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
  2. {robotframework-6.1.1 → robotframework-7.0a1}/setup.py +2 -5
  3. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/interfaces.py +35 -48
  4. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
  5. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
  6. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/languages.py +0 -9
  7. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
  8. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
  9. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
  10. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
  11. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
  12. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
  13. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
  14. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
  15. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
  16. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
  17. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
  18. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +13 -3
  19. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
  20. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
  21. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
  22. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
  23. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
  24. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
  25. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
  26. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
  27. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
  28. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
  29. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
  30. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
  31. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
  32. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/configurer.py +15 -11
  33. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/control.py +151 -81
  34. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
  35. robotframework-7.0a1/src/robot/model/keyword.py +70 -0
  36. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
  37. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
  38. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
  39. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
  40. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
  41. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/testsuite.py +16 -22
  42. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
  43. robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
  44. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
  45. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
  46. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
  47. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
  48. robotframework-7.0a1/src/robot/output/listeners.py +586 -0
  49. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
  50. robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
  51. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
  52. robotframework-7.0a1/src/robot/output/output.py +158 -0
  53. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
  54. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
  55. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
  56. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
  57. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
  58. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
  59. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
  60. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
  61. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
  62. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
  63. robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
  64. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  65. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
  66. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
  67. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
  68. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
  69. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
  70. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
  71. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
  72. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
  73. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
  74. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
  75. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
  76. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
  77. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
  78. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
  79. robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
  80. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
  81. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
  82. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
  83. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
  84. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
  85. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
  86. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +175 -213
  87. robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
  88. robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
  89. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
  90. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +8 -10
  91. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
  92. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
  93. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
  94. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
  95. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
  96. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
  97. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/model.py +109 -32
  98. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
  99. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
  100. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +15 -17
  101. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +33 -40
  102. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
  103. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
  104. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
  105. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
  106. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
  107. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
  108. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +1 -1
  109. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
  110. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
  111. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
  112. robotframework-7.0a1/src/robot/utils/notset.py +33 -0
  113. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
  114. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
  115. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
  116. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
  117. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
  118. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
  119. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
  120. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
  121. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
  122. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
  123. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
  124. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
  125. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
  126. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
  127. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
  128. robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
  129. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
  130. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/version.py +1 -1
  131. {robotframework-6.1.1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
  132. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
  133. {robotframework-6.1.1 → robotframework-7.0a1}/tasks.py +6 -6
  134. robotframework-6.1.1/src/robot/libraries/Reserved.py +0 -48
  135. robotframework-6.1.1/src/robot/model/keyword.py +0 -173
  136. robotframework-6.1.1/src/robot/output/console/dotted.py +0 -90
  137. robotframework-6.1.1/src/robot/output/listenerarguments.py +0 -165
  138. robotframework-6.1.1/src/robot/output/listenermethods.py +0 -113
  139. robotframework-6.1.1/src/robot/output/listeners.py +0 -174
  140. robotframework-6.1.1/src/robot/output/output.py +0 -95
  141. robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
  142. robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
  143. robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
  144. robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
  145. robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
  146. {robotframework-6.1.1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
  147. {robotframework-6.1.1 → robotframework-7.0a1}/BUILD.rst +0 -0
  148. {robotframework-6.1.1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
  149. {robotframework-6.1.1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
  150. {robotframework-6.1.1 → robotframework-7.0a1}/INSTALL.rst +0 -0
  151. {robotframework-6.1.1 → robotframework-7.0a1}/LICENSE.txt +0 -0
  152. {robotframework-6.1.1 → robotframework-7.0a1}/MANIFEST.in +0 -0
  153. {robotframework-6.1.1 → robotframework-7.0a1}/README.rst +0 -0
  154. {robotframework-6.1.1 → robotframework-7.0a1}/setup.cfg +0 -0
  155. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
  156. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
  157. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
  158. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
  159. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
  160. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
  161. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
  162. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
  163. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
  164. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
  165. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
  166. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
  167. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  168. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
  169. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
  170. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  171. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  172. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  173. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  174. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  175. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  176. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  177. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  178. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  179. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
  180. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  181. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
  182. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
  183. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  184. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  185. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
  186. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
  187. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
  188. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
  189. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
  190. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
  191. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  192. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  193. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  194. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
  195. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
  196. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  197. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  198. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  199. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
  200. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
  201. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
  202. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
  203. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
  204. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
  205. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
  206. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +0 -0
  207. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
  208. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
  209. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
  210. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/modelobject.py +0 -0
  211. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/modifier.py +0 -0
  212. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
  213. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
  214. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
  215. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
  216. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
  217. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
  218. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
  219. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
  220. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
  221. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
  222. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
  223. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
  224. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  225. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
  226. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
  227. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
  228. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
  229. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
  230. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
  231. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
  232. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
  233. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
  234. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
  235. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
  236. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
  237. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
  238. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
  239. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
  240. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
  241. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
  242. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
  243. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
  244. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/run.py +0 -0
  245. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
  246. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +0 -0
  247. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
  248. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +0 -0
  249. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
  250. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
  251. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
  252. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
  253. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
  254. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
  255. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
  256. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
  257. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
  258. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
  259. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
  260. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
  261. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
  262. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
  263. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
  264. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
  265. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
  266. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
  267. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
  268. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
  269. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
  270. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
  271. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
  272. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
  273. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
  274. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
  275. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
  276. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
  277. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
  278. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
  279. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
  280. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
  281. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
  282. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
  283. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
  284. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
  285. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
  286. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
  288. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -13,7 +13,6 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- import sys
17
16
  import inspect
18
17
  import asyncio
19
18
  from contextlib import contextmanager
@@ -43,9 +42,6 @@ class Asynchronous:
43
42
  return inspect.iscoroutine(obj) and not self._is_loop_running()
44
43
 
45
44
  def _is_loop_running(self):
46
- # ensure 3.6 compatibility
47
- if sys.version_info.minor == 6:
48
- return asyncio._get_running_loop() is not None
49
45
  try:
50
46
  asyncio.get_running_loop()
51
47
  except RuntimeError:
@@ -150,7 +146,7 @@ class _ExecutionContext:
150
146
  def warn_on_invalid_private_call(self, handler):
151
147
  parent = self.user_keywords[-1] if self.user_keywords else None
152
148
  if not parent or parent.source != handler.source:
153
- self.warn(f"Keyword '{handler.longname}' is private and should only "
149
+ self.warn(f"Keyword '{handler.full_name}' is private and should only "
154
150
  f"be called by keywords in the same file.")
155
151
 
156
152
  @contextmanager
@@ -184,24 +180,24 @@ class _ExecutionContext:
184
180
 
185
181
  @property
186
182
  def allow_loop_control(self):
187
- for step in reversed(self.steps):
183
+ for _, step in reversed(self.steps):
188
184
  if step.type == 'ITERATION':
189
185
  return True
190
- if step.type == 'KEYWORD' and step.libname != 'BuiltIn':
186
+ if step.type == 'KEYWORD' and step.owner != 'BuiltIn':
191
187
  return False
192
188
  return False
193
189
 
194
- def end_suite(self, suite):
190
+ def end_suite(self, data, result):
195
191
  for name in ['${PREV_TEST_NAME}',
196
192
  '${PREV_TEST_STATUS}',
197
193
  '${PREV_TEST_MESSAGE}']:
198
194
  self.variables.set_global(name, self.variables[name])
199
- self.output.end_suite(suite)
200
- self.namespace.end_suite(suite)
195
+ self.output.end_suite(data, result)
196
+ self.namespace.end_suite(data)
201
197
  EXECUTION_CONTEXTS.end_suite()
202
198
 
203
199
  def set_suite_variables(self, suite):
204
- self.variables['${SUITE_NAME}'] = suite.longname
200
+ self.variables['${SUITE_NAME}'] = suite.full_name
205
201
  self.variables['${SUITE_SOURCE}'] = str(suite.source or '')
206
202
  self.variables['${SUITE_DOCUMENTATION}'] = suite.doc
207
203
  self.variables['${SUITE_METADATA}'] = suite.metadata.copy()
@@ -210,13 +206,14 @@ class _ExecutionContext:
210
206
  self.variables['${SUITE_STATUS}'] = status
211
207
  self.variables['${SUITE_MESSAGE}'] = message
212
208
 
213
- def start_test(self, test):
214
- self.test = test
215
- self._add_timeout(test.timeout)
209
+ def start_test(self, data, result):
210
+ self.test = result
211
+ self._add_timeout(result.timeout)
216
212
  self.namespace.start_test()
217
- self.variables.set_test('${TEST_NAME}', test.name)
218
- self.variables.set_test('${TEST_DOCUMENTATION}', test.doc)
219
- self.variables.set_test('@{TEST_TAGS}', list(test.tags))
213
+ self.variables.set_test('${TEST_NAME}', result.name)
214
+ self.variables.set_test('${TEST_DOCUMENTATION}', result.doc)
215
+ self.variables.set_test('@{TEST_TAGS}', list(result.tags))
216
+ self.output.start_test(data, result)
220
217
 
221
218
  def _add_timeout(self, timeout):
222
219
  if timeout:
@@ -236,19 +233,77 @@ class _ExecutionContext:
236
233
  self.variables.set_suite('${PREV_TEST_MESSAGE}', test.message)
237
234
  self.timeout_occurred = False
238
235
 
239
- def start_keyword(self, keyword):
240
- self.steps.append(keyword)
236
+ def start_body_item(self, data, result):
237
+ self.steps.append((data, result))
241
238
  if len(self.steps) > self._started_keywords_threshold:
242
239
  raise DataError('Maximum limit of started keywords and control '
243
240
  'structures exceeded.')
244
- self.output.start_keyword(keyword)
245
-
246
- def end_keyword(self, keyword):
247
- self.output.end_keyword(keyword)
241
+ output = self.output
242
+ if result.type in (result.ELSE, result.ITERATION):
243
+ method = {
244
+ result.IF_ELSE_ROOT: output.start_if_branch,
245
+ result.TRY_EXCEPT_ROOT: output.start_try_branch,
246
+ result.FOR: output.start_for_iteration,
247
+ result.WHILE: output.start_while_iteration,
248
+ }[result.parent.type]
249
+ else:
250
+ method = {
251
+ result.KEYWORD: output.start_keyword,
252
+ result.SETUP: output.start_keyword,
253
+ result.TEARDOWN: output.start_keyword,
254
+ result.FOR: output.start_for,
255
+ result.WHILE: output.start_while,
256
+ result.IF_ELSE_ROOT: output.start_if,
257
+ result.IF: output.start_if_branch,
258
+ result.ELSE: output.start_if_branch,
259
+ result.ELSE_IF: output.start_if_branch,
260
+ result.TRY_EXCEPT_ROOT: output.start_try,
261
+ result.TRY: output.start_try_branch,
262
+ result.EXCEPT: output.start_try_branch,
263
+ result.FINALLY: output.start_try_branch,
264
+ result.VAR: output.start_var,
265
+ result.BREAK: output.start_break,
266
+ result.CONTINUE: output.start_continue,
267
+ result.RETURN: output.start_return,
268
+ result.ERROR: output.start_error,
269
+ }[result.type]
270
+ method(data, result)
271
+
272
+ def end_body_item(self, data, result):
273
+ output = self.output
274
+ if result.type in (result.ELSE, result.ITERATION):
275
+ method = {
276
+ result.IF_ELSE_ROOT: output.end_if_branch,
277
+ result.TRY_EXCEPT_ROOT: output.end_try_branch,
278
+ result.FOR: output.end_for_iteration,
279
+ result.WHILE: output.end_while_iteration,
280
+ }[result.parent.type]
281
+ else:
282
+ method = {
283
+ result.KEYWORD: output.end_keyword,
284
+ result.SETUP: output.end_keyword,
285
+ result.TEARDOWN: output.end_keyword,
286
+ result.FOR: output.end_for,
287
+ result.WHILE: output.end_while,
288
+ result.IF_ELSE_ROOT: output.end_if,
289
+ result.IF: output.end_if_branch,
290
+ result.ELSE: output.end_if_branch,
291
+ result.ELSE_IF: output.end_if_branch,
292
+ result.TRY_EXCEPT_ROOT: output.end_try,
293
+ result.TRY: output.end_try_branch,
294
+ result.EXCEPT: output.end_try_branch,
295
+ result.FINALLY: output.end_try_branch,
296
+ result.VAR: output.end_var,
297
+ result.BREAK: output.end_break,
298
+ result.CONTINUE: output.end_continue,
299
+ result.RETURN: output.end_return,
300
+ result.ERROR: output.end_error,
301
+ }[result.type]
302
+ method(data, result)
248
303
  self.steps.pop()
249
304
 
250
- def get_runner(self, name):
251
- return self.namespace.get_runner(name)
305
+ def get_runner(self, name, recommend_on_failure=True):
306
+ return self.namespace.get_runner(name, recommend_on_failure)
252
307
 
253
308
  def trace(self, message):
254
309
  self.output.trace(message)
@@ -13,8 +13,8 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from copy import copy
17
16
  import inspect
17
+ from copy import copy
18
18
 
19
19
  from robot.utils import (getdoc, getshortdoc, is_list_like, normpath, printable_name,
20
20
  split_tags_from_doc, type_name)
@@ -91,15 +91,15 @@ class _RunnableHandler:
91
91
  return self._doc
92
92
 
93
93
  @property
94
- def longname(self):
94
+ def full_name(self):
95
95
  return f'{self.library.name}.{self.name}'
96
96
 
97
97
  @property
98
- def shortdoc(self):
98
+ def short_doc(self):
99
99
  return getshortdoc(self.doc)
100
100
 
101
101
  @property
102
- def libname(self):
102
+ def owner(self):
103
103
  return self.library.name
104
104
 
105
105
  @property
@@ -137,7 +137,7 @@ class _PythonHandler(_RunnableHandler):
137
137
  super().__init__(library, handler_name, handler_method, getdoc(handler_method))
138
138
 
139
139
  def _parse_arguments(self, handler_method):
140
- return PythonArgumentParser().parse(handler_method, self.longname)
140
+ return PythonArgumentParser().parse(handler_method, self.full_name)
141
141
 
142
142
  @property
143
143
  def source(self):
@@ -175,7 +175,7 @@ class _DynamicHandler(_RunnableHandler):
175
175
  self._source_info = None
176
176
 
177
177
  def _parse_arguments(self, handler_method):
178
- spec = DynamicArgumentParser().parse(self._argspec, self.longname)
178
+ spec = DynamicArgumentParser().parse(self._argspec, self.full_name)
179
179
  if not self._supports_kwargs:
180
180
  name = self._run_keyword_method_name
181
181
  if spec.var_named:
@@ -285,7 +285,6 @@ class EmbeddedArgumentsHandler:
285
285
  supports_embedded_args = True
286
286
 
287
287
  def __init__(self, embedded, orig_handler):
288
- self.arguments = ArgumentSpec() # Show empty argument spec for Libdoc
289
288
  self.embedded = embedded
290
289
  self._orig_handler = orig_handler
291
290
 
@@ -307,15 +306,11 @@ class EmbeddedArgumentsHandler:
307
306
  return EmbeddedArgumentsRunner(self, name)
308
307
 
309
308
  def resolve_arguments(self, args, variables=None, languages=None):
310
- argspec = self._orig_handler.arguments
311
- if variables:
312
- if argspec.var_positional:
313
- args = variables.replace_list(args)
314
- else:
315
- args = [variables.replace_scalar(a) for a in args]
316
- self.embedded.validate(args)
317
- return argspec.convert(args, named={}, converters=self.library.converters,
318
- dry_run=not variables)
309
+ positional, named = self.arguments.resolve(args, variables,
310
+ self.library.converters,
311
+ languages=languages)
312
+ self.embedded.validate(positional)
313
+ return positional, named
319
314
 
320
315
  def __copy__(self):
321
316
  return EmbeddedArgumentsHandler(self.embedded, copy(self._orig_handler))
@@ -35,7 +35,7 @@ class HandlerStore:
35
35
  else:
36
36
  error = DataError('Keyword with same name defined multiple times.')
37
37
  self._normal[handler.name] = UserErrorHandler(error, handler.name,
38
- handler.libname)
38
+ handler.owner)
39
39
  raise error
40
40
 
41
41
  def __iter__(self):
@@ -39,12 +39,8 @@ class LibraryKeywordRunner:
39
39
  return self._handler.library
40
40
 
41
41
  @property
42
- def libname(self):
43
- return self._handler.library.name
44
-
45
- @property
46
- def longname(self):
47
- return '%s.%s' % (self.library.name, self.name)
42
+ def full_name(self):
43
+ return f'{self.library.name}.{self.name}'
48
44
 
49
45
  def run(self, kw, context, run=True):
50
46
  assignment = VariableAssignment(kw.assign)
@@ -58,9 +54,9 @@ class LibraryKeywordRunner:
58
54
 
59
55
  def _get_result(self, kw, assignment):
60
56
  handler = self._handler
61
- return KeywordResult(kwname=self.name,
62
- libname=handler.libname,
63
- doc=handler.shortdoc,
57
+ return KeywordResult(name=self.name,
58
+ owner=handler.owner,
59
+ doc=handler.short_doc,
64
60
  args=kw.args,
65
61
  assign=tuple(assignment),
66
62
  tags=handler.tags,
@@ -129,8 +125,7 @@ class LibraryKeywordRunner:
129
125
  'BuiltIn.Set Library Search Order',
130
126
  'BuiltIn.Set Tags',
131
127
  'BuiltIn.Remove Tags')
132
- return (handler.libname == 'Reserved' or
133
- handler.longname in keywords_to_execute)
128
+ return handler.full_name in keywords_to_execute
134
129
 
135
130
 
136
131
  class EmbeddedArgumentsRunner(LibraryKeywordRunner):
@@ -140,17 +135,14 @@ class EmbeddedArgumentsRunner(LibraryKeywordRunner):
140
135
  self.embedded_args = handler.embedded.match(name).groups()
141
136
 
142
137
  def _run(self, context, args):
143
- if args:
144
- raise DataError("Positional arguments are not allowed when using "
145
- "embedded arguments.")
146
- return super()._run(context, self.embedded_args)
138
+ return super()._run(context, self.embedded_args + args)
147
139
 
148
140
  def _dry_run(self, context, args):
149
- return super()._dry_run(context, self.embedded_args)
141
+ return super()._dry_run(context, self.embedded_args + args)
150
142
 
151
143
  def _get_result(self, kw, assignment):
152
144
  result = super()._get_result(kw, assignment)
153
- result.sourcename = self._handler.name
145
+ result.source_name = self._handler.name
154
146
  return result
155
147
 
156
148
 
@@ -34,22 +34,19 @@ __ http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#
34
34
  __ http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#listener-interface
35
35
  """
36
36
 
37
- import sys
38
37
  import warnings
39
38
  from pathlib import Path
40
- from typing import Any, Mapping, Sequence, TYPE_CHECKING, Union
41
- if sys.version_info >= (3, 8):
42
- from typing import Literal
39
+ from typing import Any, Literal, Mapping, Sequence, TYPE_CHECKING, Union
43
40
 
44
41
  from robot import model
45
42
  from robot.conf import RobotSettings
46
- from robot.errors import BreakLoop, ContinueLoop, DataError, ReturnFromKeyword
47
- from robot.model import (BodyItem, create_fixture, DataDict, Keywords, ModelObject,
48
- TestCases, TestSuites)
43
+ from robot.errors import BreakLoop, ContinueLoop, DataError, ReturnFromKeyword, VariableError
44
+ from robot.model import BodyItem, create_fixture, DataDict, ModelObject, TestSuites
49
45
  from robot.output import LOGGER, Output, pyloggingconf
50
46
  from robot.result import (Break as BreakResult, Continue as ContinueResult,
51
- Error as ErrorResult, Return as ReturnResult)
47
+ Error as ErrorResult, Return as ReturnResult, Var as VarResult)
52
48
  from robot.utils import setter
49
+ from robot.variables import VariableResolver
53
50
 
54
51
  from .bodyrunner import ForRunner, IfRunner, KeywordRunner, TryRunner, WhileRunner
55
52
  from .randomizer import Randomizer
@@ -64,8 +61,8 @@ BodyItemParent = Union['TestSuite', 'TestCase', 'UserKeyword', 'For', 'If', 'IfB
64
61
  'Try', 'TryBranch', 'While', None]
65
62
 
66
63
 
67
- class Body(model.BaseBody['Keyword', 'For', 'While', 'If', 'Try', 'Return', 'Continue',
68
- 'Break', 'model.Message', 'Error']):
64
+ class Body(model.BaseBody['Keyword', 'For', 'While', 'If', 'Try', 'Var', 'Return',
65
+ 'Continue', 'Break', 'model.Message', 'Error']):
69
66
  __slots__ = []
70
67
 
71
68
 
@@ -117,8 +114,8 @@ class For(model.For, WithSource):
117
114
  __slots__ = ['lineno', 'error']
118
115
  body_class = Body
119
116
 
120
- def __init__(self, variables: Sequence[str] = (),
121
- flavor: "Literal['IN', 'IN RANGE', 'IN ENUMERATE', 'IN ZIP']" = 'IN',
117
+ def __init__(self, assign: Sequence[str] = (),
118
+ flavor: Literal['IN', 'IN RANGE', 'IN ENUMERATE', 'IN ZIP'] = 'IN',
122
119
  values: Sequence[str] = (),
123
120
  start: 'str|None' = None,
124
121
  mode: 'str|None' = None,
@@ -126,10 +123,17 @@ class For(model.For, WithSource):
126
123
  parent: BodyItemParent = None,
127
124
  lineno: 'int|None' = None,
128
125
  error: 'str|None' = None):
129
- super().__init__(variables, flavor, values, start, mode, fill, parent)
126
+ super().__init__(assign, flavor, values, start, mode, fill, parent)
130
127
  self.lineno = lineno
131
128
  self.error = error
132
129
 
130
+ @classmethod
131
+ def from_dict(cls, data: DataDict) -> 'For':
132
+ # RF 6.1 compatibility
133
+ if 'variables' in data:
134
+ data['assign'] = data.pop('variables')
135
+ return super().from_dict(data)
136
+
133
137
  def to_dict(self) -> DataDict:
134
138
  data = super().to_dict()
135
139
  if self.lineno:
@@ -219,12 +223,19 @@ class TryBranch(model.TryBranch, WithSource):
219
223
  def __init__(self, type: str = BodyItem.TRY,
220
224
  patterns: Sequence[str] = (),
221
225
  pattern_type: 'str|None' = None,
222
- variable: 'str|None' = None,
226
+ assign: 'str|None' = None,
223
227
  parent: BodyItemParent = None,
224
228
  lineno: 'int|None' = None):
225
- super().__init__(type, patterns, pattern_type, variable, parent)
229
+ super().__init__(type, patterns, pattern_type, assign, parent)
226
230
  self.lineno = lineno
227
231
 
232
+ @classmethod
233
+ def from_dict(cls, data: DataDict) -> 'TryBranch':
234
+ # RF 6.1 compatibility.
235
+ if 'variable' in data:
236
+ data['assign'] = data.pop('variable')
237
+ return super().from_dict(data)
238
+
228
239
  def to_dict(self) -> DataDict:
229
240
  data = super().to_dict()
230
241
  if self.lineno:
@@ -256,6 +267,59 @@ class Try(model.Try, WithSource):
256
267
  return data
257
268
 
258
269
 
270
+ @Body.register
271
+ class Var(model.Var, WithSource):
272
+ __slots__ = ['lineno', 'error']
273
+
274
+ def __init__(self, name: str = '',
275
+ value: 'str|Sequence[str]' = (),
276
+ scope: 'str|None' = None,
277
+ separator: 'str|None' = None,
278
+ parent: BodyItemParent = None,
279
+ lineno: 'int|None' = None,
280
+ error: 'str|None' = None):
281
+ super().__init__(name, value, scope, separator, parent)
282
+ self.lineno = lineno
283
+ self.error = error
284
+
285
+ def run(self, context, run=True, templated=False):
286
+ result = VarResult(self.name, self.value, self.scope, self.separator)
287
+ with StatusReporter(self, result, context, run):
288
+ if run:
289
+ if self.error:
290
+ raise DataError(self.error, syntax=True)
291
+ if not context.dry_run:
292
+ scope = self._get_scope(context.variables)
293
+ setter = getattr(context.variables, f'set_{scope}')
294
+ try:
295
+ resolver = VariableResolver.from_variable(self)
296
+ setter(self.name, resolver.resolve(context.variables))
297
+ except DataError as err:
298
+ raise VariableError(f"Setting variable '{self.name}' failed: {err}")
299
+
300
+ def _get_scope(self, variables):
301
+ if not self.scope:
302
+ return 'local'
303
+ try:
304
+ scope = variables.replace_string(self.scope)
305
+ if scope.upper() == 'TASK':
306
+ return 'test'
307
+ if scope.upper() in ('GLOBAL', 'SUITE', 'TEST', 'LOCAL'):
308
+ return scope.lower()
309
+ raise DataError(f"Value '{scope}' is not accepted. Valid values are "
310
+ f"'GLOBAL', 'SUITE', 'TEST', 'TASK' and 'LOCAL'.")
311
+ except DataError as err:
312
+ raise DataError(f"Invalid VAR scope: {err}")
313
+
314
+ def to_dict(self) -> DataDict:
315
+ data = super().to_dict()
316
+ if self.lineno:
317
+ data['lineno'] = self.lineno
318
+ if self.error:
319
+ data['error'] = self.error
320
+ return data
321
+
322
+
259
323
  @Body.register
260
324
  class Return(model.Return, WithSource):
261
325
  __slots__ = ['lineno', 'error']
@@ -614,15 +678,17 @@ class TestSuite(model.TestSuite[Keyword, TestCase]):
614
678
 
615
679
 
616
680
  class Variable(ModelObject):
617
- repr_args = ('name', 'value')
681
+ repr_args = ('name', 'value', 'separator')
618
682
 
619
683
  def __init__(self, name: str = '',
620
684
  value: Sequence[str] = (),
685
+ separator: 'str|None' = None,
621
686
  parent: 'ResourceFile|None' = None,
622
687
  lineno: 'int|None' = None,
623
688
  error: 'str|None' = None):
624
689
  self.name = name
625
690
  self.value = tuple(value)
691
+ self.separator = separator
626
692
  self.parent = parent
627
693
  self.lineno = lineno
628
694
  self.error = error
@@ -631,7 +697,7 @@ class Variable(ModelObject):
631
697
  def source(self) -> 'Path|None':
632
698
  return self.parent.source if self.parent is not None else None
633
699
 
634
- def report_invalid_syntax(self, message: str, level: str = 'ERROR'):
700
+ def report_error(self, message: str, level: str = 'ERROR'):
635
701
  source = self.source or '<unknown>'
636
702
  line = f' on line {self.lineno}' if self.lineno else ''
637
703
  LOGGER.write(f"Error in file '{source}'{line}: "
@@ -749,7 +815,7 @@ class UserKeyword(ModelObject):
749
815
  repr_args = ('name', 'args')
750
816
  fixture_class = Keyword
751
817
  __slots__ = ['name', 'args', 'doc', 'return_', 'timeout', 'lineno', 'parent',
752
- 'error', '_teardown']
818
+ 'error', '_setup', '_teardown']
753
819
 
754
820
  def __init__(self, name: str = '',
755
821
  args: Sequence[str] = (),
@@ -770,6 +836,7 @@ class UserKeyword(ModelObject):
770
836
  self.parent = parent
771
837
  self.error = error
772
838
  self.body = []
839
+ self._setup = None
773
840
  self._teardown = None
774
841
 
775
842
  @setter
@@ -777,24 +844,32 @@ class UserKeyword(ModelObject):
777
844
  return Body(self, body)
778
845
 
779
846
  @property
780
- def keywords(self) -> Keywords:
781
- """Deprecated since Robot Framework 4.0.
847
+ def setup(self) -> Keyword:
848
+ """User keyword setup as a :class:`Keyword` object.
782
849
 
783
- Use :attr:`body` or :attr:`teardown` instead.
850
+ New in Robot Framework 7.0.
784
851
  """
785
- kws = list(self.body)
786
- if self.teardown:
787
- kws.append(self.teardown)
788
- return Keywords(self, kws)
852
+ if self._setup is None:
853
+ self.setup = None
854
+ return self._setup
789
855
 
790
- @keywords.setter
791
- def keywords(self, keywords):
792
- Keywords.raise_deprecation_error()
856
+ @setup.setter
857
+ def setup(self, setup: 'Keyword|DataDict|None'):
858
+ self._setup = create_fixture(self.fixture_class, setup, self, Keyword.SETUP)
859
+
860
+ @property
861
+ def has_setup(self) -> bool:
862
+ """Check does a keyword have a setup without creating a setup object.
863
+
864
+ See :attr:`has_teardown` for more information. New in Robot Framework 7.0.
865
+ """
866
+ return bool(self._setup)
793
867
 
794
868
  @property
795
869
  def teardown(self) -> Keyword:
870
+ """User keyword teardown as a :class:`Keyword` object."""
796
871
  if self._teardown is None:
797
- self._teardown = create_fixture(self.fixture_class, None, self, Keyword.TEARDOWN)
872
+ self.teardown = None
798
873
  return self._teardown
799
874
 
800
875
  @teardown.setter
@@ -805,7 +880,7 @@ class UserKeyword(ModelObject):
805
880
  def has_teardown(self) -> bool:
806
881
  """Check does a keyword have a teardown without creating a teardown object.
807
882
 
808
- A difference between using ``if uk.has_teardown:`` and ``if uk.teardown:``
883
+ A difference between using ``if kw.has_teardown:`` and ``if kw.teardown:``
809
884
  is that accessing the :attr:`teardown` attribute creates a :class:`Keyword`
810
885
  object representing the teardown even when the user keyword actually does
811
886
  not have one. This can have an effect on memory usage.
@@ -833,6 +908,8 @@ class UserKeyword(ModelObject):
833
908
  ('error', self.error)]:
834
909
  if value:
835
910
  data[name] = value
911
+ if self.has_setup:
912
+ data['setup'] = self.setup.to_dict()
836
913
  data['body'] = self.body.to_dicts()
837
914
  if self.has_teardown:
838
915
  data['teardown'] = self.teardown.to_dict()
@@ -845,7 +922,7 @@ class Import(ModelObject):
845
922
  RESOURCE = 'RESOURCE'
846
923
  VARIABLES = 'VARIABLES'
847
924
 
848
- def __init__(self, type: "Literal['LIBRARY', 'RESOURCE', 'VARIABLES']",
925
+ def __init__(self, type: Literal['LIBRARY', 'RESOURCE', 'VARIABLES'],
849
926
  name: str,
850
927
  args: Sequence[str] = (),
851
928
  alias: 'str|None' = None,
@@ -879,7 +956,7 @@ class Import(ModelObject):
879
956
  self.RESOURCE: resource,
880
957
  self.VARIABLES: variables}[self.type]
881
958
 
882
- def report_invalid_syntax(self, message: str, level: str = 'ERROR'):
959
+ def report_error(self, message: str, level: str = 'ERROR'):
883
960
  source = self.source or '<unknown>'
884
961
  line = f' on line {self.lineno}' if self.lineno else ''
885
962
  LOGGER.write(f"Error in file '{source}'{line}: {message}", level)