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
@@ -18,10 +18,11 @@ from ast import NodeVisitor
18
18
  from robot.errors import DataError
19
19
  from robot.output import LOGGER
20
20
  from robot.parsing import File, Token
21
- from robot.variables import VariableIterator
21
+ from robot.variables import VariableMatches
22
22
 
23
23
  from .settings import FileSettings
24
- from ..model import ResourceFile, TestSuite
24
+ from ..model import (For, If, IfBranch, ResourceFile, TestSuite, TestCase, Try,
25
+ TryBranch, UserKeyword, While)
25
26
 
26
27
 
27
28
  class SettingsBuilder(NodeVisitor):
@@ -61,7 +62,7 @@ class SettingsBuilder(NodeVisitor):
61
62
  def visit_DefaultTags(self, node):
62
63
  self.settings.default_tags = node.values
63
64
 
64
- def visit_ForceTags(self, node):
65
+ def visit_TestTags(self, node):
65
66
  self.settings.test_tags = node.values
66
67
 
67
68
  def visit_KeywordTags(self, node):
@@ -109,6 +110,7 @@ class SuiteBuilder(NodeVisitor):
109
110
  def visit_Variable(self, node):
110
111
  self.suite.resource.variables.create(name=node.name,
111
112
  value=node.value,
113
+ separator=node.separator,
112
114
  lineno=node.lineno,
113
115
  error=format_error(node.errors))
114
116
 
@@ -120,10 +122,10 @@ class SuiteBuilder(NodeVisitor):
120
122
  self.generic_visit(node)
121
123
 
122
124
  def visit_TestCase(self, node):
123
- TestCaseBuilder(self.suite, self.settings).visit(node)
125
+ TestCaseBuilder(self.suite, self.settings).build(node)
124
126
 
125
127
  def visit_Keyword(self, node):
126
- KeywordBuilder(self.suite.resource, self.settings).visit(node)
128
+ KeywordBuilder(self.suite.resource, self.settings).build(node)
127
129
 
128
130
 
129
131
  class ResourceBuilder(NodeVisitor):
@@ -154,40 +156,86 @@ class ResourceBuilder(NodeVisitor):
154
156
  def visit_Variable(self, node):
155
157
  self.resource.variables.create(name=node.name,
156
158
  value=node.value,
159
+ separator=node.separator,
157
160
  lineno=node.lineno,
158
161
  error=format_error(node.errors))
159
162
 
160
163
  def visit_Keyword(self, node):
161
- KeywordBuilder(self.resource, self.settings).visit(node)
164
+ KeywordBuilder(self.resource, self.settings).build(node)
162
165
 
163
166
 
164
- class TestCaseBuilder(NodeVisitor):
167
+ class BodyBuilder(NodeVisitor):
168
+
169
+ def __init__(self, model: 'TestCase|UserKeyword|For|If|Try|While|None' = None):
170
+ self.model = model
171
+
172
+ def visit_For(self, node):
173
+ ForBuilder(self.model).build(node)
174
+
175
+ def visit_While(self, node):
176
+ WhileBuilder(self.model).build(node)
177
+
178
+ def visit_If(self, node):
179
+ IfBuilder(self.model).build(node)
180
+
181
+ def visit_Try(self, node):
182
+ TryBuilder(self.model).build(node)
183
+
184
+ def visit_KeywordCall(self, node):
185
+ self.model.body.create_keyword(name=node.keyword, args=node.args,
186
+ assign=node.assign, lineno=node.lineno)
187
+
188
+ def visit_TemplateArguments(self, node):
189
+ self.model.body.create_keyword(args=node.args, lineno=node.lineno)
190
+
191
+ def visit_Var(self, node):
192
+ self.model.body.create_var(node.name, node.value, node.scope, node.separator,
193
+ lineno=node.lineno, error=format_error(node.errors))
194
+
195
+ def visit_ReturnStatement(self, node):
196
+ self.model.body.create_return(node.values, lineno=node.lineno,
197
+ error=format_error(node.errors))
198
+
199
+ def visit_Continue(self, node):
200
+ self.model.body.create_continue(lineno=node.lineno,
201
+ error=format_error(node.errors))
202
+
203
+ def visit_Break(self, node):
204
+ self.model.body.create_break(lineno=node.lineno,
205
+ error=format_error(node.errors))
206
+
207
+ def visit_Error(self, node):
208
+ self.model.body.create_error(lineno=node.lineno,
209
+ values=node.values, error=format_error(node.errors))
210
+
211
+
212
+ class TestCaseBuilder(BodyBuilder):
213
+ model: TestCase
165
214
 
166
215
  def __init__(self, suite: TestSuite, settings: FileSettings):
167
- self.suite = suite
216
+ super().__init__(suite.tests.create())
168
217
  self.settings = settings
169
- self.test = None
170
- self.tags = None
218
+ self._test_has_tags = False
171
219
 
172
- def visit_TestCase(self, node):
173
- error = format_error(node.errors + node.header.errors)
220
+ def build(self, node):
174
221
  settings = self.settings
175
- self.test = self.suite.tests.create(name=node.name,
176
- lineno=node.lineno,
177
- tags=settings.test_tags,
178
- timeout=settings.test_timeout,
179
- template=settings.test_template,
180
- error=error)
222
+ # Possible parsing errors aren't reported further with tests because:
223
+ # - We only validate that test body or name isn't empty.
224
+ # - That is validated again during execution.
225
+ # - This way e.g. model modifiers can add content to body.
226
+ self.model.config(name=node.name, tags=settings.test_tags,
227
+ timeout=settings.test_timeout,
228
+ template=settings.test_template,
229
+ lineno=node.lineno)
181
230
  if settings.test_setup:
182
- self.test.setup.config(**settings.test_setup)
231
+ self.model.setup.config(**settings.test_setup)
183
232
  if settings.test_teardown:
184
- self.test.teardown.config(**settings.test_teardown)
233
+ self.model.teardown.config(**settings.test_teardown)
185
234
  self.generic_visit(node)
186
- tags = self.tags if self.tags is not None else settings.default_tags
187
- if tags:
188
- self.test.tags.add(tags)
189
- if self.test.template:
190
- self._set_template(self.test, self.test.template)
235
+ if not self._test_has_tags:
236
+ self.model.tags.add(settings.default_tags)
237
+ if self.model.template:
238
+ self._set_template(self.model, self.model.template)
191
239
 
192
240
  def _set_template(self, parent, template):
193
241
  for item in parent.body:
@@ -202,154 +250,98 @@ class TestCaseBuilder(NodeVisitor):
202
250
  item.args = args
203
251
 
204
252
  def _format_template(self, template, arguments):
205
- variables = VariableIterator(template, identifiers='$')
206
- count = len(variables)
253
+ matches = VariableMatches(template, identifiers='$')
254
+ count = len(matches)
207
255
  if count == 0 or count != len(arguments):
208
256
  return template, arguments
209
257
  temp = []
210
- for (before, _, after), arg in zip(variables, arguments):
211
- temp.extend([before, arg])
212
- temp.append(after)
258
+ for match, arg in zip(matches, arguments):
259
+ temp[-1:] = [match.before, arg, match.after]
213
260
  return ''.join(temp), ()
214
261
 
215
- def visit_For(self, node):
216
- ForBuilder(self.test).build(node)
217
-
218
- def visit_While(self, node):
219
- WhileBuilder(self.test).build(node)
220
-
221
- def visit_If(self, node):
222
- IfBuilder(self.test).build(node)
223
-
224
- def visit_Try(self, node):
225
- TryBuilder(self.test).build(node)
226
-
227
- def visit_TemplateArguments(self, node):
228
- self.test.body.create_keyword(args=node.args, lineno=node.lineno)
229
-
230
262
  def visit_Documentation(self, node):
231
- self.test.doc = node.value
263
+ self.model.doc = node.value
232
264
 
233
265
  def visit_Setup(self, node):
234
- self.test.setup.config(name=node.name, args=node.args, lineno=node.lineno)
266
+ self.model.setup.config(name=node.name, args=node.args, lineno=node.lineno)
235
267
 
236
268
  def visit_Teardown(self, node):
237
- self.test.teardown.config(name=node.name, args=node.args, lineno=node.lineno)
269
+ self.model.teardown.config(name=node.name, args=node.args, lineno=node.lineno)
238
270
 
239
271
  def visit_Timeout(self, node):
240
- self.test.timeout = node.value
272
+ self.model.timeout = node.value
241
273
 
242
274
  def visit_Tags(self, node):
243
- deprecate_tags_starting_with_hyphen(node, self.suite.source)
244
- self.tags = node.values
275
+ for tag in node.values:
276
+ if tag.startswith('-'):
277
+ self.model.tags.remove(tag[1:])
278
+ else:
279
+ self.model.tags.add(tag)
280
+ self._test_has_tags = True
245
281
 
246
282
  def visit_Template(self, node):
247
- self.test.template = node.value
283
+ self.model.template = node.value
248
284
 
249
- def visit_KeywordCall(self, node):
250
- self.test.body.create_keyword(name=node.keyword, args=node.args,
251
- assign=node.assign, lineno=node.lineno)
252
285
 
253
- def visit_ReturnStatement(self, node):
254
- self.test.body.create_return(node.values, lineno=node.lineno,
255
- error=format_error(node.errors))
256
-
257
- def visit_Continue(self, node):
258
- self.test.body.create_continue(lineno=node.lineno,
259
- error=format_error(node.errors))
260
-
261
- def visit_Break(self, node):
262
- self.test.body.create_break(lineno=node.lineno,
263
- error=format_error(node.errors))
264
-
265
- def visit_Error(self, node):
266
- self.test.body.create_error(lineno=node.lineno,
267
- values=node.values, error=format_error(node.errors))
268
-
269
-
270
- class KeywordBuilder(NodeVisitor):
286
+ class KeywordBuilder(BodyBuilder):
287
+ model: UserKeyword
271
288
 
272
289
  def __init__(self, resource: ResourceFile, settings: FileSettings):
273
- self.resource = resource
274
- self.settings = settings
275
- self.kw = None
290
+ super().__init__(resource.keywords.create(tags=settings.keyword_tags))
276
291
 
277
- def visit_Keyword(self, node):
278
- error = format_error(node.errors + node.header.errors)
279
- self.kw = self.resource.keywords.create(name=node.name,
280
- tags=self.settings.keyword_tags,
281
- lineno=node.lineno,
282
- error=error)
292
+ def build(self, node):
293
+ # Possible parsing errors aren't reported further because:
294
+ # - We only validate that keyword body or name isn't empty.
295
+ # - That is validated again during execution.
296
+ # - This way e.g. model modifiers can add content to body.
297
+ self.model.config(name=node.name, lineno=node.lineno)
283
298
  self.generic_visit(node)
284
299
 
285
300
  def visit_Documentation(self, node):
286
- self.kw.doc = node.value
301
+ self.model.doc = node.value
287
302
 
288
303
  def visit_Arguments(self, node):
289
- self.kw.args = node.values
304
+ self.model.args = node.values
290
305
  if node.errors:
291
306
  error = format_error(node.errors)
292
- self.kw.error = f'Invalid argument specification: {error}'
307
+ self.model.error = f'Invalid argument specification: {error}'
293
308
 
294
309
  def visit_Tags(self, node):
295
- deprecate_tags_starting_with_hyphen(node, self.resource.source)
296
- self.kw.tags.add(node.values)
310
+ for tag in node.values:
311
+ if tag.startswith('-'):
312
+ self.model.tags.remove(tag[1:])
313
+ else:
314
+ self.model.tags.add(tag)
297
315
 
298
316
  def visit_Return(self, node):
299
- self.kw.return_ = node.values
317
+ ErrorReporter(self.model.source).visit(node)
318
+ self.model.return_ = node.values
300
319
 
301
320
  def visit_Timeout(self, node):
302
- self.kw.timeout = node.value
321
+ self.model.timeout = node.value
322
+
323
+ def visit_Setup(self, node):
324
+ self.model.setup.config(name=node.name, args=node.args, lineno=node.lineno)
303
325
 
304
326
  def visit_Teardown(self, node):
305
- self.kw.teardown.config(name=node.name, args=node.args,
306
- lineno=node.lineno)
327
+ self.model.teardown.config(name=node.name, args=node.args, lineno=node.lineno)
307
328
 
308
329
  def visit_KeywordCall(self, node):
309
- self.kw.body.create_keyword(name=node.keyword, args=node.args,
310
- assign=node.assign, lineno=node.lineno)
311
-
312
- def visit_ReturnStatement(self, node):
313
- self.kw.body.create_return(node.values, lineno=node.lineno,
314
- error=format_error(node.errors))
315
-
316
- def visit_Continue(self, node):
317
- self.kw.body.create_continue(lineno=node.lineno,
318
- error=format_error(node.errors))
319
-
320
- def visit_Break(self, node):
321
- self.kw.body.create_break(lineno=node.lineno,
322
- error=format_error(node.errors))
323
-
324
- def visit_For(self, node):
325
- ForBuilder(self.kw).build(node)
326
-
327
- def visit_While(self, node):
328
- WhileBuilder(self.kw).build(node)
329
-
330
- def visit_If(self, node):
331
- IfBuilder(self.kw).build(node)
332
-
333
- def visit_Try(self, node):
334
- TryBuilder(self.kw).build(node)
335
-
336
- def visit_Error(self, node):
337
- self.kw.body.create_error(lineno=node.lineno,
338
- values=node.values, error=format_error(node.errors))
330
+ self.model.body.create_keyword(name=node.keyword, args=node.args,
331
+ assign=node.assign, lineno=node.lineno)
339
332
 
340
333
 
341
- class ForBuilder(NodeVisitor):
334
+ class ForBuilder(BodyBuilder):
335
+ model: For
342
336
 
343
- def __init__(self, parent):
344
- self.parent = parent
345
- self.model = None
337
+ def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
338
+ super().__init__(parent.body.create_for())
346
339
 
347
340
  def build(self, node):
348
341
  error = format_error(self._get_errors(node))
349
- self.model = self.parent.body.create_for(
350
- node.variables, node.flavor, node.values, node.start, node.mode, node.fill,
351
- lineno=node.lineno, error=error
352
- )
342
+ self.model.config(assign=node.assign, flavor=node.flavor, values=node.values,
343
+ start=node.start, mode=node.mode, fill=node.fill,
344
+ lineno=node.lineno, error=error)
353
345
  for step in node.body:
354
346
  self.visit(step)
355
347
  return self.model
@@ -360,57 +352,22 @@ class ForBuilder(NodeVisitor):
360
352
  errors += node.end.errors
361
353
  return errors
362
354
 
363
- def visit_KeywordCall(self, node):
364
- self.model.body.create_keyword(name=node.keyword, args=node.args,
365
- assign=node.assign, lineno=node.lineno)
366
-
367
- def visit_TemplateArguments(self, node):
368
- self.model.body.create_keyword(args=node.args, lineno=node.lineno)
369
-
370
- def visit_For(self, node):
371
- ForBuilder(self.model).build(node)
372
-
373
- def visit_While(self, node):
374
- WhileBuilder(self.model).build(node)
375
355
 
376
- def visit_If(self, node):
377
- IfBuilder(self.model).build(node)
378
-
379
- def visit_Try(self, node):
380
- TryBuilder(self.model).build(node)
356
+ class IfBuilder(BodyBuilder):
357
+ model: 'IfBranch|None'
381
358
 
382
- def visit_ReturnStatement(self, node):
383
- self.model.body.create_return(node.values, lineno=node.lineno,
384
- error=format_error(node.errors))
385
-
386
- def visit_Continue(self, node):
387
- self.model.body.create_continue(lineno=node.lineno,
388
- error=format_error(node.errors))
389
-
390
- def visit_Break(self, node):
391
- self.model.body.create_break(lineno=node.lineno,
392
- error=format_error(node.errors))
393
-
394
- def visit_Error(self, node):
395
- self.model.body.create_error(lineno=node.lineno,
396
- values=node.values, error=format_error(node.errors))
397
-
398
-
399
- class IfBuilder(NodeVisitor):
400
-
401
- def __init__(self, parent):
402
- self.parent = parent
403
- self.model = None
359
+ def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
360
+ super().__init__()
361
+ self.root = parent.body.create_if()
404
362
 
405
363
  def build(self, node):
406
- root = self.parent.body.create_if(lineno=node.lineno,
407
- error=format_error(self._get_errors(node)))
364
+ self.root.config(lineno=node.lineno, error=format_error(self._get_errors(node)))
408
365
  assign = node.assign
409
366
  node_type = None
410
367
  while node:
411
368
  node_type = node.type if node.type != 'INLINE IF' else 'IF'
412
- self.model = root.body.create_branch(node_type, node.condition,
413
- lineno=node.lineno)
369
+ self.model = self.root.body.create_branch(node_type, node.condition,
370
+ lineno=node.lineno)
414
371
  for step in node.body:
415
372
  self.visit(step)
416
373
  if assign:
@@ -422,10 +379,10 @@ class IfBuilder(NodeVisitor):
422
379
  node = node.orelse
423
380
  # Smallish hack to make sure assignment is always run.
424
381
  if assign and node_type != 'ELSE':
425
- root.body.create_branch('ELSE').body.create_keyword(
382
+ self.root.body.create_branch('ELSE').body.create_keyword(
426
383
  assign=assign, name='BuiltIn.Set Variable', args=['${NONE}']
427
384
  )
428
- return root
385
+ return self.root
429
386
 
430
387
  def _get_errors(self, node):
431
388
  errors = node.header.errors + node.errors
@@ -435,64 +392,30 @@ class IfBuilder(NodeVisitor):
435
392
  errors += node.end.errors
436
393
  return errors
437
394
 
438
- def visit_KeywordCall(self, node):
439
- self.model.body.create_keyword(name=node.keyword, args=node.args,
440
- assign=node.assign, lineno=node.lineno)
441
395
 
442
- def visit_TemplateArguments(self, node):
443
- self.model.body.create_keyword(args=node.args, lineno=node.lineno)
444
-
445
- def visit_For(self, node):
446
- ForBuilder(self.model).build(node)
447
-
448
- def visit_While(self, node):
449
- WhileBuilder(self.model).build(node)
396
+ class TryBuilder(BodyBuilder):
397
+ model: 'TryBranch|None'
450
398
 
451
- def visit_If(self, node):
452
- IfBuilder(self.model).build(node)
453
-
454
- def visit_Try(self, node):
455
- TryBuilder(self.model).build(node)
456
-
457
- def visit_ReturnStatement(self, node):
458
- self.model.body.create_return(node.values, lineno=node.lineno,
459
- error=format_error(node.errors))
460
-
461
- def visit_Continue(self, node):
462
- self.model.body.create_continue(lineno=node.lineno,
463
- error=format_error(node.errors))
464
-
465
- def visit_Break(self, node):
466
- self.model.body.create_break(lineno=node.lineno,
467
- error=format_error(node.errors))
468
-
469
- def visit_Error(self, node):
470
- self.model.body.create_error(lineno=node.lineno,
471
- values=node.values, error=format_error(node.errors))
472
-
473
-
474
- class TryBuilder(NodeVisitor):
475
-
476
- def __init__(self, parent):
477
- self.parent = parent
478
- self.model = None
399
+ def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
400
+ super().__init__()
401
+ self.root = parent.body.create_try()
479
402
  self.template_error = None
480
403
 
481
404
  def build(self, node):
482
- root = self.parent.body.create_try(lineno=node.lineno)
405
+ self.root.config(lineno=node.lineno)
483
406
  errors = self._get_errors(node)
484
407
  while node:
485
- self.model = root.body.create_branch(node.type, node.patterns,
486
- node.pattern_type, node.variable,
487
- lineno=node.lineno)
408
+ self.model = self.root.body.create_branch(node.type, node.patterns,
409
+ node.pattern_type, node.assign,
410
+ lineno=node.lineno)
488
411
  for step in node.body:
489
412
  self.visit(step)
490
413
  node = node.next
491
414
  if self.template_error:
492
415
  errors += (self.template_error,)
493
416
  if errors:
494
- root.error = format_error(errors)
495
- return root
417
+ self.root.error = format_error(errors)
418
+ return self.root
496
419
 
497
420
  def _get_errors(self, node):
498
421
  errors = node.header.errors + node.errors
@@ -502,54 +425,21 @@ class TryBuilder(NodeVisitor):
502
425
  errors += node.end.errors
503
426
  return errors
504
427
 
505
- def visit_For(self, node):
506
- ForBuilder(self.model).build(node)
507
-
508
- def visit_While(self, node):
509
- WhileBuilder(self.model).build(node)
510
-
511
- def visit_If(self, node):
512
- IfBuilder(self.model).build(node)
513
-
514
- def visit_Try(self, node):
515
- TryBuilder(self.model).build(node)
516
-
517
- def visit_ReturnStatement(self, node):
518
- self.model.body.create_return(node.values, lineno=node.lineno,
519
- error=format_error(node.errors))
520
-
521
- def visit_Continue(self, node):
522
- self.model.body.create_continue(lineno=node.lineno,
523
- error=format_error(node.errors))
524
-
525
- def visit_Break(self, node):
526
- self.model.body.create_break(lineno=node.lineno,
527
- error=format_error(node.errors))
528
-
529
- def visit_KeywordCall(self, node):
530
- self.model.body.create_keyword(name=node.keyword, args=node.args,
531
- assign=node.assign, lineno=node.lineno)
532
-
533
428
  def visit_TemplateArguments(self, node):
534
429
  self.template_error = 'Templates cannot be used with TRY.'
535
430
 
536
- def visit_Error(self, node):
537
- self.model.body.create_error(lineno=node.lineno,
538
- values=node.values, error=format_error(node.errors))
539
-
540
431
 
541
- class WhileBuilder(NodeVisitor):
432
+ class WhileBuilder(BodyBuilder):
433
+ model: While
542
434
 
543
- def __init__(self, parent):
544
- self.parent = parent
545
- self.model = None
435
+ def __init__(self, parent: 'TestCase|UserKeyword|For|If|Try|While'):
436
+ super().__init__(parent.body.create_while())
546
437
 
547
438
  def build(self, node):
548
439
  error = format_error(self._get_errors(node))
549
- self.model = self.parent.body.create_while(
550
- node.condition, node.limit, node.on_limit,
551
- node.on_limit_message, lineno=node.lineno, error=error
552
- )
440
+ self.model.config(condition=node.condition, limit=node.limit,
441
+ on_limit=node.on_limit, on_limit_message=node.on_limit_message,
442
+ lineno=node.lineno, error=error)
553
443
  for step in node.body:
554
444
  self.visit(step)
555
445
  return self.model
@@ -560,39 +450,6 @@ class WhileBuilder(NodeVisitor):
560
450
  errors += node.end.errors
561
451
  return errors
562
452
 
563
- def visit_KeywordCall(self, node):
564
- self.model.body.create_keyword(name=node.keyword, args=node.args,
565
- assign=node.assign, lineno=node.lineno)
566
-
567
- def visit_TemplateArguments(self, node):
568
- self.model.body.create_keyword(args=node.args, lineno=node.lineno)
569
-
570
- def visit_For(self, node):
571
- ForBuilder(self.model).build(node)
572
-
573
- def visit_While(self, node):
574
- WhileBuilder(self.model).build(node)
575
-
576
- def visit_If(self, node):
577
- IfBuilder(self.model).build(node)
578
-
579
- def visit_Try(self, node):
580
- TryBuilder(self.model).build(node)
581
-
582
- def visit_ReturnStatement(self, node):
583
- self.model.body.create_return(node.values, lineno=node.lineno,
584
- error=format_error(node.errors))
585
-
586
- def visit_Break(self, node):
587
- self.model.body.create_break(error=format_error(node.errors))
588
-
589
- def visit_Continue(self, node):
590
- self.model.body.create_continue(error=format_error(node.errors))
591
-
592
- def visit_Error(self, node):
593
- self.model.body.create_error(lineno=node.lineno,
594
- values=node.values, error=format_error(node.errors))
595
-
596
453
 
597
454
  def format_error(errors):
598
455
  if not errors:
@@ -602,18 +459,6 @@ def format_error(errors):
602
459
  return '\n- '.join(('Multiple errors:',) + errors)
603
460
 
604
461
 
605
- def deprecate_tags_starting_with_hyphen(node, source):
606
- for tag in node.values:
607
- if tag.startswith('-'):
608
- LOGGER.warn(
609
- f"Error in file '{source}' on line {node.lineno}: "
610
- f"Settings tags starting with a hyphen using the '[Tags]' setting "
611
- f"is deprecated. In Robot Framework 7.0 this syntax will be used "
612
- f"for removing tags. Escape '{tag}' like '\\{tag}' to use the "
613
- f"literal value and to avoid this warning."
614
- )
615
-
616
-
617
462
  class ErrorReporter(NodeVisitor):
618
463
 
619
464
  def __init__(self, source, raise_on_invalid_header=False):
@@ -626,13 +471,26 @@ class ErrorReporter(NodeVisitor):
626
471
  def visit_Keyword(self, node):
627
472
  pass
628
473
 
474
+ def visit_Return(self, node):
475
+ # Empty 'visit_Keyword' above prevents calling this when visiting the whole
476
+ # model, but 'KeywordBuilder.visit_Return' visits the node it gets.
477
+ LOGGER.warn(self._format_message(node.get_token(Token.RETURN_SETTING)))
478
+
629
479
  def visit_SectionHeader(self, node):
630
- token = node.get_token(Token.INVALID_HEADER)
631
- if token:
480
+ token = node.get_token(*Token.HEADER_TOKENS)
481
+ if not token.error:
482
+ return
483
+ message = self._format_message(token)
484
+ if token.type == Token.INVALID_HEADER:
632
485
  if self.raise_on_invalid_header:
633
- raise DataError(self._format_message(token))
486
+ raise DataError(message)
634
487
  else:
635
- LOGGER.error(self._format_message(token))
488
+ LOGGER.error(message)
489
+ else:
490
+ # Errors, other than totally invalid headers, can occur only with
491
+ # deprecated singular headers, and we want to report them as warnings.
492
+ # A more generic solution for separating errors and warnings would be good.
493
+ LOGGER.warn(self._format_message(token))
636
494
 
637
495
  def visit_Error(self, node):
638
496
  for error in node.get_tokens(Token.ERROR):