robotframework 6.1rc1__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.1rc1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
  2. {robotframework-6.1rc1 → robotframework-7.0a1}/setup.py +2 -5
  3. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/interfaces.py +36 -49
  4. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
  5. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
  6. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/languages.py +61 -25
  7. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
  8. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
  9. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
  10. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
  11. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
  12. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
  13. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
  14. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
  15. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
  16. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
  17. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
  18. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +14 -4
  19. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
  20. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
  21. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
  22. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
  23. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
  24. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
  25. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
  26. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
  27. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
  28. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
  29. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
  30. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +14 -2
  31. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
  32. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
  33. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/configurer.py +19 -15
  34. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/control.py +155 -85
  35. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
  36. robotframework-7.0a1/src/robot/model/keyword.py +70 -0
  37. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
  38. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modelobject.py +2 -8
  39. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/modifier.py +1 -1
  40. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
  41. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
  42. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
  43. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
  44. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/testsuite.py +43 -24
  45. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
  46. robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
  47. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
  48. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
  49. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
  50. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
  51. robotframework-7.0a1/src/robot/output/listeners.py +586 -0
  52. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
  53. robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
  54. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
  55. robotframework-7.0a1/src/robot/output/output.py +158 -0
  56. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
  57. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
  58. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
  59. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
  60. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
  61. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
  62. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
  63. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
  64. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
  65. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
  66. robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
  67. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  68. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
  69. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
  70. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
  71. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
  72. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
  73. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
  74. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
  75. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
  76. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
  77. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
  78. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
  79. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
  80. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
  81. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/run.py +1 -1
  82. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
  83. robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
  84. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
  85. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +3 -1
  86. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
  87. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
  88. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
  89. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
  90. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
  91. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +210 -220
  92. robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
  93. robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
  94. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
  95. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +15 -25
  96. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +15 -10
  97. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
  98. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
  99. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
  100. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
  101. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
  102. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
  103. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/model.py +156 -36
  104. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
  105. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
  106. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +18 -21
  107. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +35 -39
  108. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
  109. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
  110. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
  111. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
  112. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
  113. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
  114. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +9 -4
  115. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
  116. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
  117. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
  118. robotframework-7.0a1/src/robot/utils/notset.py +33 -0
  119. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
  120. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
  121. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
  122. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
  123. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
  124. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
  125. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
  126. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
  127. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
  128. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
  129. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
  130. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
  131. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
  132. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
  133. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
  134. robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
  135. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
  136. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/version.py +1 -1
  137. {robotframework-6.1rc1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
  138. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
  139. {robotframework-6.1rc1 → robotframework-7.0a1}/tasks.py +6 -6
  140. robotframework-6.1rc1/src/robot/libraries/Reserved.py +0 -48
  141. robotframework-6.1rc1/src/robot/model/keyword.py +0 -173
  142. robotframework-6.1rc1/src/robot/output/console/dotted.py +0 -90
  143. robotframework-6.1rc1/src/robot/output/listenerarguments.py +0 -165
  144. robotframework-6.1rc1/src/robot/output/listenermethods.py +0 -113
  145. robotframework-6.1rc1/src/robot/output/listeners.py +0 -174
  146. robotframework-6.1rc1/src/robot/output/output.py +0 -95
  147. robotframework-6.1rc1/src/robot/parsing/model/visitor.py +0 -67
  148. robotframework-6.1rc1/src/robot/running/arguments/argumentconverter.py +0 -79
  149. robotframework-6.1rc1/src/robot/running/arguments/typevalidator.py +0 -56
  150. robotframework-6.1rc1/src/robot/running/modelcombiner.py +0 -32
  151. robotframework-6.1rc1/src/robot/variables/tablesetter.py +0 -156
  152. {robotframework-6.1rc1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
  153. {robotframework-6.1rc1 → robotframework-7.0a1}/BUILD.rst +0 -0
  154. {robotframework-6.1rc1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
  155. {robotframework-6.1rc1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
  156. {robotframework-6.1rc1 → robotframework-7.0a1}/INSTALL.rst +0 -0
  157. {robotframework-6.1rc1 → robotframework-7.0a1}/LICENSE.txt +0 -0
  158. {robotframework-6.1rc1 → robotframework-7.0a1}/MANIFEST.in +0 -0
  159. {robotframework-6.1rc1 → robotframework-7.0a1}/README.rst +0 -0
  160. {robotframework-6.1rc1 → robotframework-7.0a1}/setup.cfg +0 -0
  161. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
  162. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
  163. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
  164. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
  165. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
  166. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
  167. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
  168. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
  169. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
  170. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
  171. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
  172. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
  173. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  174. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
  175. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
  176. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  177. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  178. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  179. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  180. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  181. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  182. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  183. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  184. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  185. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
  186. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  187. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
  188. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
  189. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  190. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  191. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
  192. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
  193. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
  194. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
  195. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
  196. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
  197. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  198. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  199. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  200. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
  201. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
  202. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  203. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  204. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  205. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
  206. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
  207. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
  208. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
  209. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
  210. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
  211. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
  212. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
  213. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
  214. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
  215. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
  216. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
  217. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
  218. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
  219. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
  220. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
  221. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
  222. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
  223. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
  224. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
  225. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
  226. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
  227. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  228. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
  229. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
  230. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
  231. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
  232. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
  233. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
  234. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
  235. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
  236. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
  237. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
  238. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
  239. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
  240. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
  241. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
  242. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
  243. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
  244. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
  245. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
  246. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
  247. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
  248. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
  249. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
  250. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
  251. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
  252. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
  253. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
  254. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
  255. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
  256. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
  257. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
  258. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
  259. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
  260. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
  261. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
  262. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
  263. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
  264. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
  265. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
  266. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
  267. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
  268. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
  269. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
  270. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
  271. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
  272. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
  273. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
  274. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
  275. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
  276. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
  277. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
  278. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
  279. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
  280. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
  281. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
  282. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
  283. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
  284. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
  285. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
  286. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
  288. {robotframework-6.1rc1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -13,21 +13,21 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ import re
17
+ import time
16
18
  from collections import OrderedDict
17
19
  from contextlib import contextmanager
20
+ from datetime import datetime
18
21
  from itertools import zip_longest
19
- import re
20
- import time
21
22
 
22
23
  from robot.errors import (BreakLoop, ContinueLoop, DataError, ExecutionFailed,
23
24
  ExecutionFailures, ExecutionPassed, ExecutionStatus)
24
25
  from robot.result import (For as ForResult, While as WhileResult, If as IfResult,
25
- IfBranch as IfBranchResult, Try as TryResult,
26
- TryBranch as TryBranchResult)
26
+ Try as TryResult)
27
27
  from robot.output import librarylogger as logger
28
- from robot.utils import (cut_assign_value, frange, get_error_message, get_timestamp,
29
- is_list_like, is_number, plural_or_not as s, secs_to_timestr,
30
- seq2str, split_from_equals, type_name, Matcher, timestr_to_secs)
28
+ from robot.utils import (cut_assign_value, frange, get_error_message, is_list_like,
29
+ is_number, plural_or_not as s, secs_to_timestr, seq2str,
30
+ split_from_equals, type_name, Matcher, timestr_to_secs)
31
31
  from robot.variables import is_dict_variable, evaluate_expression
32
32
 
33
33
  from .statusreporter import StatusReporter
@@ -101,7 +101,7 @@ class ForInRunner:
101
101
  error = DataError(data.error, syntax=True)
102
102
  else:
103
103
  run = True
104
- result = ForResult(data.variables, data.flavor, data.values, data.start,
104
+ result = ForResult(data.assign, data.flavor, data.values, data.start,
105
105
  data.mode, data.fill)
106
106
  with StatusReporter(data, result, self._context, run) as status:
107
107
  if run:
@@ -143,7 +143,7 @@ class ForInRunner:
143
143
  def _get_values_for_rounds(self, data):
144
144
  if self._context.dry_run:
145
145
  return [None]
146
- values_per_round = len(data.variables)
146
+ values_per_round = len(data.assign)
147
147
  if self._is_dict_iteration(data.values):
148
148
  values = self._resolve_dict_values(data.values)
149
149
  values = self._map_dict_values_to_rounds(values, values_per_round)
@@ -218,10 +218,10 @@ class ForInRunner:
218
218
  variables = self._context.variables
219
219
  else: # Not really run (earlier failure, unexecuted IF branch, dry-run)
220
220
  variables = {}
221
- values = [''] * len(data.variables)
222
- for name, value in self._map_variables_and_values(data.variables, values):
221
+ values = [''] * len(data.assign)
222
+ for name, value in self._map_variables_and_values(data.assign, values):
223
223
  variables[name] = value
224
- result.variables[name] = cut_assign_value(value)
224
+ result.assign[name] = cut_assign_value(value)
225
225
  runner = BodyRunner(self._context, run, self._templated)
226
226
  with StatusReporter(data, result, self._context, run):
227
227
  runner.run(data.body)
@@ -274,13 +274,13 @@ class ForInZipRunner(ForInRunner):
274
274
  if not mode or self._context.dry_run:
275
275
  return None
276
276
  try:
277
- mode = self._context.variables.replace_string(mode).upper()
278
- if mode in ('STRICT', 'SHORTEST', 'LONGEST'):
279
- return mode
280
- raise DataError(f"Mode must be 'STRICT', 'SHORTEST' or 'LONGEST', "
281
- f"got '{mode}'.")
277
+ mode = self._context.variables.replace_string(mode)
278
+ if mode.upper() in ('STRICT', 'SHORTEST', 'LONGEST'):
279
+ return mode.upper()
280
+ raise DataError(f"Value '{mode}' is not accepted. Valid values "
281
+ f"are 'STRICT', 'SHORTEST' and 'LONGEST'.")
282
282
  except DataError as err:
283
- raise DataError(f'Invalid mode: {err}')
283
+ raise DataError(f'Invalid FOR IN ZIP mode: {err}')
284
284
 
285
285
  def _resolve_fill(self, fill):
286
286
  if not fill or self._context.dry_run:
@@ -288,7 +288,7 @@ class ForInZipRunner(ForInRunner):
288
288
  try:
289
289
  return self._context.variables.replace_scalar(fill)
290
290
  except DataError as err:
291
- raise DataError(f'Invalid fill value: {err}')
291
+ raise DataError(f'Invalid FOR IN ZIP fill value: {err}')
292
292
 
293
293
  def _resolve_dict_values(self, values):
294
294
  raise DataError('FOR IN ZIP loops do not support iterating over dictionaries.',
@@ -302,6 +302,8 @@ class ForInZipRunner(ForInRunner):
302
302
  return zip_longest(*values, fillvalue=self._fill)
303
303
  if self._mode == 'STRICT':
304
304
  self._validate_strict_lengths(values)
305
+ if self._mode is None:
306
+ self._deprecate_different_lengths(values)
305
307
  return zip(*values)
306
308
 
307
309
  def _validate_types(self, values):
@@ -316,12 +318,21 @@ class ForInZipRunner(ForInRunner):
316
318
  try:
317
319
  lengths.append(len(item))
318
320
  except TypeError:
319
- raise DataError(f"FOR IN ZIP items should have length in STRICT mode, "
320
- f"but item {index} does not.")
321
+ raise DataError(f"FOR IN ZIP items must have length in the STRICT "
322
+ f"mode, but item {index} does not.")
321
323
  if len(set(lengths)) > 1:
322
- raise DataError(f"FOR IN ZIP items should have equal lengths in STRICT "
324
+ raise DataError(f"FOR IN ZIP items must have equal lengths in the STRICT "
323
325
  f"mode, but lengths are {seq2str(lengths, quote='')}.")
324
326
 
327
+ def _deprecate_different_lengths(self, values):
328
+ try:
329
+ self._validate_strict_lengths(values)
330
+ except DataError as err:
331
+ logger.warn(f"FOR IN ZIP default mode will be changed from SHORTEST to "
332
+ f"STRICT in Robot Framework 8.0. Use 'mode=SHORTEST' to keep "
333
+ f"using the SHORTEST mode. If the mode is not changed, "
334
+ f"execution will fail like this in the future: {err}")
335
+
325
336
 
326
337
  class ForInEnumerateRunner(ForInRunner):
327
338
  flavor = 'IN ENUMERATE'
@@ -339,9 +350,9 @@ class ForInEnumerateRunner(ForInRunner):
339
350
  try:
340
351
  return int(start)
341
352
  except ValueError:
342
- raise DataError(f"Start value must be an integer, got '{start}'.")
353
+ raise DataError(f"Value must be an integer, got '{start}'.")
343
354
  except DataError as err:
344
- raise DataError(f'Invalid start value: {err}')
355
+ raise DataError(f'Invalid FOR IN ENUMERATE start value: {err}')
345
356
 
346
357
  def _map_dict_values_to_rounds(self, values, per_round):
347
358
  if per_round > 3:
@@ -375,10 +386,12 @@ class WhileRunner:
375
386
  error = None
376
387
  run = False
377
388
  limit = None
378
- loop_result = WhileResult(data.condition, data.limit,
379
- data.on_limit, data.on_limit_message,
380
- starttime=get_timestamp())
381
- iter_result = loop_result.body.create_iteration(starttime=get_timestamp())
389
+ loop_result = WhileResult(data.condition,
390
+ data.limit,
391
+ data.on_limit,
392
+ data.on_limit_message,
393
+ start_time=datetime.now())
394
+ iter_result = loop_result.body.create_iteration(start_time=datetime.now())
382
395
  if self._run:
383
396
  if data.error:
384
397
  error = DataError(data.error, syntax=True)
@@ -420,7 +433,7 @@ class WhileRunner:
420
433
  errors.extend(failed.get_errors())
421
434
  if not failed.can_continue(ctx, self._templated):
422
435
  break
423
- iter_result = loop_result.body.create_iteration(starttime=get_timestamp())
436
+ iter_result = loop_result.body.create_iteration(start_time=datetime.now())
424
437
  if not self._should_run(data.condition, ctx.variables):
425
438
  break
426
439
  if errors:
@@ -453,10 +466,11 @@ class IfRunner:
453
466
  def run(self, data):
454
467
  with self._dry_run_recursion_detection(data) as recursive_dry_run:
455
468
  error = None
456
- with StatusReporter(data, IfResult(), self._context, self._run):
469
+ result = IfResult()
470
+ with StatusReporter(data, result, self._context, self._run):
457
471
  for branch in data.body:
458
472
  try:
459
- if self._run_if_branch(branch, recursive_dry_run, data.error):
473
+ if self._run_if_branch(branch, result, recursive_dry_run, data.error):
460
474
  self._run = False
461
475
  except ExecutionStatus as err:
462
476
  error = err
@@ -478,9 +492,9 @@ class IfRunner:
478
492
  if dry_run:
479
493
  self._dry_run_stack.pop()
480
494
 
481
- def _run_if_branch(self, branch, recursive_dry_run=False, syntax_error=None):
495
+ def _run_if_branch(self, branch, result, recursive_dry_run=False, syntax_error=None):
482
496
  context = self._context
483
- result = IfBranchResult(branch.type, branch.condition, starttime=get_timestamp())
497
+ result = result.body.create_branch(branch.type, branch.condition, start_time=datetime.now())
484
498
  error = None
485
499
  if syntax_error:
486
500
  run_branch = False
@@ -525,28 +539,29 @@ class TryRunner:
525
539
 
526
540
  def run(self, data):
527
541
  run = self._run
528
- with StatusReporter(data, TryResult(), self._context, run):
542
+ result = TryResult()
543
+ with StatusReporter(data, result, self._context, run):
529
544
  if data.error:
530
- self._run_invalid(data)
545
+ self._run_invalid(data, result)
531
546
  return
532
- error = self._run_try(data, run)
547
+ error = self._run_try(data, result, run)
533
548
  run_excepts_or_else = self._should_run_excepts_or_else(error, run)
534
549
  if error:
535
- error = self._run_excepts(data, error, run=run_excepts_or_else)
536
- self._run_else(data, run=False)
550
+ error = self._run_excepts(data, result, error, run=run_excepts_or_else)
551
+ self._run_else(data, result, run=False)
537
552
  else:
538
- self._run_excepts(data, error, run=False)
539
- error = self._run_else(data, run=run_excepts_or_else)
540
- error = self._run_finally(data, run) or error
553
+ self._run_excepts(data, result, error, run=False)
554
+ error = self._run_else(data, result, run=run_excepts_or_else)
555
+ error = self._run_finally(data, result, run) or error
541
556
  if error:
542
557
  raise error
543
558
 
544
- def _run_invalid(self, data):
559
+ def _run_invalid(self, data, result):
545
560
  error_reported = False
546
561
  for branch in data.body:
547
- result = TryBranchResult(branch.type, branch.patterns, branch.pattern_type,
548
- branch.variable)
549
- with StatusReporter(branch, result, self._context, run=False, suppress=True):
562
+ branch_result = result.body.create_branch(branch.type, branch.patterns,
563
+ branch.pattern_type, branch.assign)
564
+ with StatusReporter(branch, branch_result, self._context, run=False, suppress=True):
550
565
  runner = BodyRunner(self._context, run=False, templated=self._templated)
551
566
  runner.run(branch.body)
552
567
  if not error_reported:
@@ -554,8 +569,8 @@ class TryRunner:
554
569
  raise DataError(data.error, syntax=True)
555
570
  raise ExecutionFailed(data.error, syntax=True)
556
571
 
557
- def _run_try(self, data, run):
558
- result = TryBranchResult(data.TRY)
572
+ def _run_try(self, data, result, run):
573
+ result = result.body.create_branch(data.TRY)
559
574
  return self._run_branch(data.try_branch, result, run)
560
575
 
561
576
  def _should_run_excepts_or_else(self, error, run):
@@ -577,7 +592,7 @@ class TryRunner:
577
592
  else:
578
593
  return None
579
594
 
580
- def _run_excepts(self, data, error, run):
595
+ def _run_excepts(self, data, result, error, run):
581
596
  for branch in data.except_branches:
582
597
  try:
583
598
  run_branch = run and self._should_run_except(branch, error)
@@ -586,15 +601,15 @@ class TryRunner:
586
601
  pattern_error = err
587
602
  else:
588
603
  pattern_error = None
589
- result = TryBranchResult(branch.type, branch.patterns,
590
- branch.pattern_type, branch.variable)
604
+ branch_result = result.body.create_branch(branch.type, branch.patterns,
605
+ branch.pattern_type, branch.assign)
591
606
  if run_branch:
592
- if branch.variable:
593
- self._context.variables[branch.variable] = str(error)
594
- error = self._run_branch(branch, result, error=pattern_error)
607
+ if branch.assign:
608
+ self._context.variables[branch.assign] = str(error)
609
+ error = self._run_branch(branch, branch_result, error=pattern_error)
595
610
  run = False
596
611
  else:
597
- self._run_branch(branch, result, run=False)
612
+ self._run_branch(branch, branch_result, run=False)
598
613
  return error
599
614
 
600
615
  def _should_run_except(self, branch, error):
@@ -602,9 +617,9 @@ class TryRunner:
602
617
  return True
603
618
  matchers = {
604
619
  'GLOB': lambda m, p: Matcher(p, spaceless=False, caseless=False).match(m),
620
+ 'REGEXP': lambda m, p: re.fullmatch(p, m) is not None,
621
+ 'START': lambda m, p: m.startswith(p),
605
622
  'LITERAL': lambda m, p: m == p,
606
- 'REGEXP': lambda m, p: re.match(rf'{p}\Z', m) is not None,
607
- 'START': lambda m, p: m.startswith(p)
608
623
  }
609
624
  if branch.pattern_type:
610
625
  pattern_type = self._context.variables.replace_string(branch.pattern_type)
@@ -612,21 +627,21 @@ class TryRunner:
612
627
  pattern_type = 'LITERAL'
613
628
  matcher = matchers.get(pattern_type.upper())
614
629
  if not matcher:
615
- raise DataError(f"Invalid EXCEPT pattern type '{pattern_type}', "
616
- f"expected {seq2str(matchers, lastsep=' or ')}.")
630
+ raise DataError(f"Invalid EXCEPT pattern type '{pattern_type}'. "
631
+ f"Valid values are {seq2str(matchers)}.")
617
632
  for pattern in branch.patterns:
618
633
  if matcher(error.message, self._context.variables.replace_string(pattern)):
619
634
  return True
620
635
  return False
621
636
 
622
- def _run_else(self, data, run):
637
+ def _run_else(self, data, result, run):
623
638
  if data.else_branch:
624
- result = TryBranchResult(data.ELSE)
639
+ result = result.body.create_branch(data.ELSE)
625
640
  return self._run_branch(data.else_branch, result, run)
626
641
 
627
- def _run_finally(self, data, run):
642
+ def _run_finally(self, data, result, run):
628
643
  if data.finally_branch:
629
- result = TryBranchResult(data.FINALLY)
644
+ result = result.body.create_branch(data.FINALLY)
630
645
  try:
631
646
  with StatusReporter(data.finally_branch, result, self._context, run):
632
647
  runner = BodyRunner(self._context, run, self._templated)
@@ -679,15 +694,15 @@ class WhileLimit:
679
694
  return None
680
695
  try:
681
696
  on_limit = variables.replace_string(on_limit)
682
- if on_limit.upper() not in ['PASS', 'FAIL']:
683
- raise DataError("Value must be 'PASS' or 'FAIL'.")
697
+ if on_limit.upper() in ('PASS', 'FAIL'):
698
+ return on_limit.upper()
699
+ raise DataError(f"Value '{on_limit}' is not accepted. Valid values "
700
+ f"are 'PASS' and 'FAIL'.")
684
701
  except DataError as err:
685
- raise DataError(f"Invalid WHILE loop 'on_limit' value '{on_limit}': {err}")
686
- else:
687
- return on_limit.lower()
702
+ raise DataError(f"Invalid WHILE loop 'on_limit' value: {err}")
688
703
 
689
704
  def limit_exceeded(self):
690
- on_limit_pass = self.on_limit == 'pass'
705
+ on_limit_pass = self.on_limit == 'PASS'
691
706
  if self.on_limit_message:
692
707
  raise LimitExceeded(on_limit_pass, self.on_limit_message)
693
708
  else:
@@ -84,8 +84,8 @@ class TestSuiteBuilder:
84
84
  New in RF 6.1.
85
85
  :param rpa:
86
86
  Explicit execution mode. ``True`` for RPA and ``False`` for test
87
- automation. By default, mode is got from data file headers and possible
88
- conflicting headers cause an error. Same as ``--rpa`` or ``--norpa``.
87
+ automation. By default, mode is got from data file headers.
88
+ Same as ``--rpa`` or ``--norpa``.
89
89
  :param lang:
90
90
  Additional languages to be supported during parsing.
91
91
  Can be a string matching any of the supported language codes or names,
@@ -111,7 +111,7 @@ class TestSuiteBuilder:
111
111
  if included_suites != 'DEPRECATED':
112
112
  warnings.warn("'TestSuiteBuilder' argument 'included_suites' is deprecated "
113
113
  "and has no effect. Use the new 'included_files' argument "
114
- "or filter the parsed suite instead.")
114
+ "or filter the created suite instead.")
115
115
 
116
116
  def _get_standard_parsers(self, lang: LanguagesLike,
117
117
  process_curdir: bool) -> 'dict[str, Parser]':
@@ -201,11 +201,11 @@ class TestSuiteBuilder:
201
201
  class SuiteStructureParser(SuiteStructureVisitor):
202
202
 
203
203
  def __init__(self, parsers: 'dict[str|None, Parser]',
204
- defaults: 'TestDefaults|None' = None, rpa: 'bool|None' = None):
204
+ defaults: 'TestDefaults|None' = None,
205
+ rpa: 'bool|None' = None):
205
206
  self.parsers = parsers
206
207
  self.rpa = rpa
207
208
  self.defaults = defaults
208
- self._rpa_given = rpa is not None
209
209
  self.suite: 'TestSuite|None' = None
210
210
  self._stack: 'list[tuple[TestSuite, TestDefaults]]' = []
211
211
 
@@ -215,13 +215,13 @@ class SuiteStructureParser(SuiteStructureVisitor):
215
215
 
216
216
  def parse(self, structure: SuiteStructure) -> TestSuite:
217
217
  structure.visit(self)
218
- suite = cast(TestSuite, self.suite)
219
- suite.rpa = self.rpa
220
- return suite
218
+ return cast(TestSuite, self.suite)
221
219
 
222
220
  def visit_file(self, structure: SuiteFile):
223
221
  LOGGER.info(f"Parsing file '{structure.source}'.")
224
222
  suite = self._build_suite_file(structure)
223
+ if self.rpa is not None:
224
+ suite.rpa = self.rpa
225
225
  if self.suite is None:
226
226
  self.suite = suite
227
227
  else:
@@ -239,8 +239,13 @@ class SuiteStructureParser(SuiteStructureVisitor):
239
239
 
240
240
  def end_directory(self, structure: SuiteDirectory):
241
241
  suite, _ = self._stack.pop()
242
- if suite.rpa is None and suite.suites:
243
- suite.rpa = suite.suites[0].rpa
242
+ if self.rpa is not None:
243
+ suite.rpa = self.rpa
244
+ elif suite.rpa is None and suite.suites:
245
+ if all(s.rpa is False for s in suite.suites):
246
+ suite.rpa = False
247
+ elif all(s.rpa is True for s in suite.suites):
248
+ suite.rpa = True
244
249
 
245
250
  def _build_suite_file(self, structure: SuiteFile):
246
251
  source = cast(Path, structure.source)
@@ -250,7 +255,6 @@ class SuiteStructureParser(SuiteStructureVisitor):
250
255
  suite = parser.parse_suite_file(source, defaults)
251
256
  if not suite.tests:
252
257
  LOGGER.info(f"Data source '{source}' has no tests or tasks.")
253
- self._validate_execution_mode(suite)
254
258
  except DataError as err:
255
259
  raise DataError(f"Parsing '{source}' failed: {err.message}")
256
260
  return suite
@@ -267,20 +271,6 @@ class SuiteStructureParser(SuiteStructureVisitor):
267
271
  raise DataError(f"Parsing '{source}' failed: {err.message}")
268
272
  return suite, defaults
269
273
 
270
- def _validate_execution_mode(self, suite: TestSuite):
271
- if self._rpa_given:
272
- suite.rpa = self.rpa
273
- elif suite.rpa is None:
274
- pass
275
- elif self.rpa is None:
276
- self.rpa = suite.rpa
277
- elif self.rpa is not suite.rpa:
278
- this, that = ('tasks', 'tests') if suite.rpa else ('tests', 'tasks')
279
- raise DataError(f"Conflicting execution modes. File has {this} "
280
- f"but files parsed earlier have {that}. Fix headers "
281
- f"or use '--rpa' or '--norpa' options to set the "
282
- f"execution mode explicitly.")
283
-
284
274
 
285
275
  class ResourceFileBuilder:
286
276
 
@@ -53,22 +53,21 @@ class RobotParser(Parser):
53
53
  def parse_suite_file(self, source: Path, defaults: TestDefaults) -> TestSuite:
54
54
  model = get_model(self._get_source(source), data_only=True,
55
55
  curdir=self._get_curdir(source), lang=self.lang)
56
- suite = TestSuite(name=TestSuite.name_from_source(source, self.extensions),
57
- source=source)
58
- SuiteBuilder(suite, FileSettings(defaults)).build(model)
59
- return suite
56
+ model.source = source
57
+ return self.parse_model(model, defaults)
60
58
 
61
59
  def parse_init_file(self, source: Path, defaults: TestDefaults) -> TestSuite:
62
60
  model = get_init_model(self._get_source(source), data_only=True,
63
61
  curdir=self._get_curdir(source), lang=self.lang)
64
- directory = source.parent
65
- suite = TestSuite(name=TestSuite.name_from_source(directory), source=directory)
62
+ model.source = source
63
+ suite = TestSuite(name=TestSuite.name_from_source(source.parent),
64
+ source=source.parent, rpa=None)
66
65
  SuiteBuilder(suite, InitFileSettings(defaults)).build(model)
67
66
  return suite
68
67
 
69
68
  def parse_model(self, model: File, defaults: 'TestDefaults|None' = None) -> TestSuite:
70
- source = model.source
71
- suite = TestSuite(name=TestSuite.name_from_source(source), source=source)
69
+ name = TestSuite.name_from_source(model.source, self.extensions)
70
+ suite = TestSuite(name=name, source=model.source)
72
71
  SuiteBuilder(suite, FileSettings(defaults)).build(model)
73
72
  return suite
74
73
 
@@ -81,7 +80,12 @@ class RobotParser(Parser):
81
80
  def parse_resource_file(self, source: Path) -> ResourceFile:
82
81
  model = get_resource_model(self._get_source(source), data_only=True,
83
82
  curdir=self._get_curdir(source), lang=self.lang)
84
- resource = ResourceFile(source=source)
83
+ model.source = source
84
+ resource = self.parse_resource_model(model)
85
+ return resource
86
+
87
+ def parse_resource_model(self, model: File) -> ResourceFile:
88
+ resource = ResourceFile(source=model.source)
85
89
  ResourceBuilder(resource).build(model)
86
90
  return resource
87
91
 
@@ -112,7 +116,8 @@ class JsonParser(Parser):
112
116
  class NoInitFileDirectoryParser(Parser):
113
117
 
114
118
  def parse_init_file(self, source: Path, defaults: TestDefaults) -> TestSuite:
115
- return TestSuite(name=TestSuite.name_from_source(source), source=source)
119
+ return TestSuite(name=TestSuite.name_from_source(source),
120
+ source=source, rpa=None)
116
121
 
117
122
 
118
123
  class CustomParser(Parser):
@@ -13,31 +13,23 @@
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
  from collections.abc import Sequence
17
+ from typing import TypedDict
18
18
 
19
19
  from ..model import TestCase
20
20
 
21
21
 
22
- if sys.version_info >= (3, 8):
23
- from typing import TypedDict
22
+ class OptionalItems(TypedDict, total=False):
23
+ args: 'Sequence[str]'
24
+ lineno: int
24
25
 
25
26
 
26
- class OptionalItems(TypedDict, total=False):
27
- args: 'Sequence[str]'
28
- lineno: int
27
+ class FixtureDict(OptionalItems):
28
+ """Dictionary containing setup or teardown info.
29
29
 
30
-
31
- class FixtureDict(OptionalItems):
32
- """Dictionary containing setup or teardown info.
33
-
34
- :attr:`args` and :attr:`lineno` are optional.
35
- """
36
- name: str
37
-
38
- else:
39
- class FixtureDict(dict):
40
- pass
30
+ :attr:`args` and :attr:`lineno` are optional.
31
+ """
32
+ name: str
41
33
 
42
34
 
43
35
  class TestDefaults: