robotframework 6.1.1__zip → 7.0a1__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. {robotframework-6.1.1/src/robotframework.egg-info → robotframework-7.0a1}/PKG-INFO +3 -6
  2. {robotframework-6.1.1 → robotframework-7.0a1}/setup.py +2 -5
  3. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/interfaces.py +35 -48
  4. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/parsing.py +4 -2
  5. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/gatherfailed.py +2 -2
  6. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/languages.py +0 -9
  7. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/settings.py +8 -5
  8. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.css +4 -0
  9. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.html +9 -1
  10. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/model.js +2 -4
  11. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/testdata.js +10 -3
  12. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/template.py +3 -3
  13. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/builder.py +0 -8
  14. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/datatypes.py +9 -10
  15. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlutils.py +4 -7
  16. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonbuilder.py +14 -10
  17. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/model.py +13 -25
  18. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/robotbuilder.py +13 -3
  19. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlbuilder.py +8 -8
  20. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/xmlwriter.py +12 -38
  21. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/BuiltIn.py +215 -189
  22. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Collections.py +2 -9
  23. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/DateTime.py +1 -1
  24. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/OperatingSystem.py +4 -3
  25. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Process.py +26 -27
  26. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Remote.py +40 -36
  27. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/String.py +4 -4
  28. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/XML.py +7 -8
  29. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/__init__.py +2 -2
  30. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/__init__.py +4 -4
  31. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/body.py +14 -6
  32. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/configurer.py +15 -11
  33. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/control.py +151 -81
  34. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/filter.py +31 -25
  35. robotframework-7.0a1/src/robot/model/keyword.py +70 -0
  36. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/message.py +19 -10
  37. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/namepatterns.py +3 -25
  38. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/stats.py +9 -15
  39. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tags.py +1 -1
  40. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/testcase.py +12 -21
  41. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/testsuite.py +16 -22
  42. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/visitor.py +35 -8
  43. robotframework-7.0a1/src/robot/output/console/dotted.py +90 -0
  44. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/quiet.py +3 -2
  45. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/verbose.py +60 -60
  46. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/debugfile.py +36 -23
  47. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/filelogger.py +16 -13
  48. robotframework-7.0a1/src/robot/output/listeners.py +586 -0
  49. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/logger.py +164 -77
  50. robotframework-7.0a1/src/robot/output/loggerapi.py +152 -0
  51. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/loggerhelper.py +23 -56
  52. robotframework-7.0a1/src/robot/output/output.py +158 -0
  53. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/stdoutlogsplitter.py +8 -5
  54. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/xmllogger.py +163 -109
  55. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/blocklexers.py +17 -13
  56. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/context.py +12 -2
  57. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/lexer.py +1 -1
  58. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/settings.py +6 -3
  59. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/statementlexers.py +39 -10
  60. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokens.py +27 -29
  61. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/blocks.py +19 -6
  62. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/statements.py +184 -84
  63. robotframework-7.0a1/src/robot/parsing/model/visitor.py +102 -0
  64. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  65. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsbuildingcontext.py +8 -6
  66. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsmodelbuilders.py +88 -61
  67. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/stringcache.py +4 -3
  68. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/xunitwriter.py +15 -21
  69. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/__init__.py +3 -2
  70. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/configurer.py +12 -9
  71. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/flattenkeywordmatcher.py +8 -8
  72. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/keywordremover.py +71 -54
  73. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/merger.py +1 -1
  74. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/model.py +400 -316
  75. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/modeldeprecation.py +9 -3
  76. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/resultbuilder.py +21 -23
  77. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/xmlelementhandlers.py +76 -40
  78. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/__init__.py +1 -1
  79. robotframework-7.0a1/src/robot/running/arguments/argumentconverter.py +101 -0
  80. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentmapper.py +16 -14
  81. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentresolver.py +41 -33
  82. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentspec.py +24 -90
  83. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentvalidator.py +34 -27
  84. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/customconverters.py +14 -11
  85. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/embedded.py +23 -26
  86. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/typeconverters.py +175 -213
  87. robotframework-7.0a1/src/robot/running/arguments/typeinfo.py +367 -0
  88. robotframework-7.0a1/src/robot/running/arguments/typevalidator.py +62 -0
  89. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/bodyrunner.py +83 -68
  90. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/parsers.py +8 -10
  91. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/settings.py +9 -17
  92. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/transformers.py +166 -308
  93. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/context.py +80 -25
  94. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/handlers.py +11 -16
  95. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/handlerstore.py +1 -1
  96. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/librarykeywordrunner.py +9 -17
  97. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/model.py +109 -32
  98. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/namespace.py +18 -19
  99. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/statusreporter.py +13 -12
  100. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/suiterunner.py +15 -17
  101. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/testlibraries.py +33 -40
  102. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/usererrorhandler.py +8 -8
  103. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/userkeyword.py +13 -8
  104. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/userkeywordrunner.py +18 -21
  105. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/testdoc.py +18 -13
  106. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/__init__.py +50 -35
  107. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/connectioncache.py +64 -59
  108. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/encodingsniffer.py +1 -1
  109. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/escaping.py +11 -9
  110. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/markupwriters.py +20 -13
  111. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/normalizing.py +9 -24
  112. robotframework-7.0a1/src/robot/utils/notset.py +33 -0
  113. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/platform.py +15 -5
  114. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotpath.py +1 -0
  115. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robottime.py +120 -88
  116. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robottypes.py +16 -31
  117. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/setter.py +0 -5
  118. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/text.py +7 -4
  119. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/unic.py +2 -2
  120. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/__init__.py +2 -2
  121. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/assigner.py +17 -19
  122. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/evaluation.py +20 -17
  123. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/filesetter.py +80 -80
  124. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/replacer.py +33 -36
  125. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/scopes.py +3 -3
  126. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/search.py +66 -41
  127. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/store.py +14 -16
  128. robotframework-7.0a1/src/robot/variables/tablesetter.py +164 -0
  129. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/variables.py +1 -1
  130. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/version.py +1 -1
  131. {robotframework-6.1.1 → robotframework-7.0a1/src/robotframework.egg-info}/PKG-INFO +3 -6
  132. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/SOURCES.txt +3 -4
  133. {robotframework-6.1.1 → robotframework-7.0a1}/tasks.py +6 -6
  134. robotframework-6.1.1/src/robot/libraries/Reserved.py +0 -48
  135. robotframework-6.1.1/src/robot/model/keyword.py +0 -173
  136. robotframework-6.1.1/src/robot/output/console/dotted.py +0 -90
  137. robotframework-6.1.1/src/robot/output/listenerarguments.py +0 -165
  138. robotframework-6.1.1/src/robot/output/listenermethods.py +0 -113
  139. robotframework-6.1.1/src/robot/output/listeners.py +0 -174
  140. robotframework-6.1.1/src/robot/output/output.py +0 -95
  141. robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
  142. robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
  143. robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
  144. robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
  145. robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
  146. {robotframework-6.1.1 → robotframework-7.0a1}/AUTHORS.rst +0 -0
  147. {robotframework-6.1.1 → robotframework-7.0a1}/BUILD.rst +0 -0
  148. {robotframework-6.1.1 → robotframework-7.0a1}/CONTRIBUTING.rst +0 -0
  149. {robotframework-6.1.1 → robotframework-7.0a1}/COPYRIGHT.txt +0 -0
  150. {robotframework-6.1.1 → robotframework-7.0a1}/INSTALL.rst +0 -0
  151. {robotframework-6.1.1 → robotframework-7.0a1}/LICENSE.txt +0 -0
  152. {robotframework-6.1.1 → robotframework-7.0a1}/MANIFEST.in +0 -0
  153. {robotframework-6.1.1 → robotframework-7.0a1}/README.rst +0 -0
  154. {robotframework-6.1.1 → robotframework-7.0a1}/setup.cfg +0 -0
  155. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/__init__.py +0 -0
  156. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/__main__.py +0 -0
  157. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/__init__.py +0 -0
  158. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/deco.py +0 -0
  159. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/exceptions.py +0 -0
  160. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/api/logger.py +0 -0
  161. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/conf/__init__.py +0 -0
  162. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/errors.py +0 -0
  163. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/__init__.py +0 -0
  164. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/__init__.py +0 -0
  165. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/js_disabled.css +0 -0
  166. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/common/storage.js +0 -0
  167. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/htmlfilewriter.py +0 -0
  168. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/jsonwriter.py +0 -0
  169. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/__init__.py +0 -0
  170. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  171. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.min.js +0 -0
  172. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  173. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  174. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  175. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/__init__.py +0 -0
  176. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  177. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.css +0 -0
  178. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/libdoc.html +0 -0
  179. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/print.css +0 -0
  180. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/libdoc/pygments.css +0 -0
  181. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/__init__.py +0 -0
  182. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/common.css +0 -0
  183. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  184. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/fileloading.js +0 -0
  185. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/log.js +0 -0
  186. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/print.css +0 -0
  187. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.css +0 -0
  188. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/report.html +0 -0
  189. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/util.js +0 -0
  190. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/rebot/view.js +0 -0
  191. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/__init__.py +0 -0
  192. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  193. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  194. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdoc.py +0 -0
  195. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/__init__.py +0 -0
  196. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/consoleviewer.py +0 -0
  197. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/htmlwriter.py +0 -0
  198. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/jsonwriter.py +0 -0
  199. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/output.py +0 -0
  200. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/standardtypes.py +0 -0
  201. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libdocpkg/writer.py +0 -0
  202. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Dialogs.py +0 -0
  203. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Easter.py +0 -0
  204. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Screenshot.py +0 -0
  205. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/Telnet.py +0 -0
  206. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/libraries/dialogs_py.py +0 -0
  207. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/fixture.py +0 -0
  208. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/itemlist.py +0 -0
  209. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/metadata.py +0 -0
  210. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/modelobject.py +0 -0
  211. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/modifier.py +0 -0
  212. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/statistics.py +0 -0
  213. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/suitestatistics.py +0 -0
  214. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tagsetter.py +0 -0
  215. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/tagstatistics.py +0 -0
  216. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/model/totalstatistics.py +0 -0
  217. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/__init__.py +0 -0
  218. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/__init__.py +0 -0
  219. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/console/highlighting.py +0 -0
  220. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/librarylogger.py +0 -0
  221. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/output/pyloggingconf.py +0 -0
  222. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/__init__.py +0 -0
  223. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/__init__.py +0 -0
  224. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/lexer/tokenizer.py +0 -0
  225. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/model/__init__.py +0 -0
  226. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/__init__.py +0 -0
  227. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/blockparsers.py +0 -0
  228. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/fileparser.py +0 -0
  229. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/parser/parser.py +0 -0
  230. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/parsing/suitestructure.py +0 -0
  231. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/pythonpathsetter.py +0 -0
  232. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/rebot.py +0 -0
  233. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/__init__.py +0 -0
  234. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jsexecutionresult.py +0 -0
  235. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/jswriter.py +0 -0
  236. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/logreportwriters.py +0 -0
  237. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/outputwriter.py +0 -0
  238. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/reporting/resultwriter.py +0 -0
  239. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/executionerrors.py +0 -0
  240. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/executionresult.py +0 -0
  241. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/messagefilter.py +0 -0
  242. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/suiteteardownfailed.py +0 -0
  243. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/result/visitor.py +0 -0
  244. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/run.py +0 -0
  245. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/__init__.py +0 -0
  246. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/arguments/argumentparser.py +0 -0
  247. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/__init__.py +0 -0
  248. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/builder/builders.py +0 -0
  249. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/dynamicmethods.py +0 -0
  250. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/importer.py +0 -0
  251. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/libraryscopes.py +0 -0
  252. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/outputcapture.py +0 -0
  253. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/randomizer.py +0 -0
  254. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/runkwregister.py +0 -0
  255. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/signalhandler.py +0 -0
  256. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/status.py +0 -0
  257. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/__init__.py +0 -0
  258. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/posix.py +0 -0
  259. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/running/timeouts/windows.py +0 -0
  260. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/application.py +0 -0
  261. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/argumentparser.py +0 -0
  262. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/asserts.py +0 -0
  263. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/charwidth.py +0 -0
  264. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/compress.py +0 -0
  265. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/dotdict.py +0 -0
  266. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/encoding.py +0 -0
  267. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/error.py +0 -0
  268. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/etreewrapper.py +0 -0
  269. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/filereader.py +0 -0
  270. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/frange.py +0 -0
  271. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/htmlformatters.py +0 -0
  272. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/importer.py +0 -0
  273. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/markuputils.py +0 -0
  274. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/match.py +0 -0
  275. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/misc.py +0 -0
  276. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/recommendations.py +0 -0
  277. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/restreader.py +0 -0
  278. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotenv.py +0 -0
  279. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotinspect.py +0 -0
  280. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/robotio.py +0 -0
  281. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/sortable.py +0 -0
  282. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/utils/typehints.py +0 -0
  283. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/finders.py +0 -0
  284. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/notfound.py +0 -0
  285. {robotframework-6.1.1 → robotframework-7.0a1}/src/robot/variables/resolvable.py +0 -0
  286. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/dependency_links.txt +0 -0
  287. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/entry_points.txt +0 -0
  288. {robotframework-6.1.1 → robotframework-7.0a1}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -13,28 +13,34 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ import warnings
17
+
16
18
  from robot.model import Tags
17
19
 
18
20
 
19
21
  def deprecated(method):
20
22
  def wrapper(self, *args, **kws):
21
23
  """Deprecated."""
24
+ warnings.warn(f"'robot.result.{type(self).__name__}.{method.__name__}' is "
25
+ f"deprecated and will be removed in Robot Framework 8.0.",
26
+ stacklevel=1)
22
27
  return method(self, *args, **kws)
23
28
  return wrapper
24
29
 
25
30
 
26
31
  class DeprecatedAttributesMixin:
27
32
  __slots__ = []
33
+ _log_name = ''
28
34
 
29
35
  @property
30
36
  @deprecated
31
37
  def name(self):
32
- return ''
38
+ return self._log_name
33
39
 
34
40
  @property
35
41
  @deprecated
36
42
  def kwname(self):
37
- return self.name
43
+ return self._log_name
38
44
 
39
45
  @property
40
46
  @deprecated
@@ -63,5 +69,5 @@ class DeprecatedAttributesMixin:
63
69
 
64
70
  @property
65
71
  @deprecated
66
- def message(self):
72
+ def doc(self):
67
73
  return ''
@@ -15,7 +15,7 @@
15
15
 
16
16
  from robot.errors import DataError
17
17
  from robot.model import SuiteVisitor
18
- from robot.utils import ET, ETSource, get_error_message
18
+ from robot.utils import ET, ETSource, get_error_message, html_escape
19
19
 
20
20
  from .executionresult import Result, CombinedResult
21
21
  from .flattenkeywordmatcher import (FlattenByNameMatcher, FlattenByTypeMatcher,
@@ -144,50 +144,48 @@ class ExecutionResultBuilder:
144
144
  name_match, by_name = self._get_matcher(FlattenByNameMatcher, flattened)
145
145
  type_match, by_type = self._get_matcher(FlattenByTypeMatcher, flattened)
146
146
  tags_match, by_tags = self._get_matcher(FlattenByTagMatcher, flattened)
147
- started = -1 # if 0 or more, we are flattening
147
+ started = -1 # if 0 or more, we are flattening
148
148
  tags = []
149
149
  containers = {'kw', 'for', 'while', 'iter', 'if', 'try'}
150
- inside_kw = 0 # to make sure we don't read tags from a test
151
- seen_doc = False
150
+ inside = 0 # to make sure we don't read tags from a test
152
151
  for event, elem in context:
153
152
  tag = elem.tag
154
- start = event == 'start'
155
- end = not start
156
- if start:
153
+ if event == 'start':
157
154
  if tag in containers:
158
- inside_kw += 1
155
+ inside += 1
159
156
  if started >= 0:
160
157
  started += 1
161
- elif by_name and name_match(elem.get('name', ''), elem.get('library')):
158
+ elif by_name and name_match(elem.get('name', ''), elem.get('owner')
159
+ or elem.get('library')):
162
160
  started = 0
163
- seen_doc = False
164
161
  elif by_type and type_match(tag):
165
162
  started = 0
166
- seen_doc = False
167
163
  tags = []
168
164
  else:
169
165
  if tag in containers:
170
- inside_kw -= 1
171
- if started == 0 and not seen_doc:
172
- doc = ET.Element('doc')
173
- doc.text = '_*Content flattened.*_'
174
- yield 'start', doc
175
- yield 'end', doc
176
- elif by_tags and inside_kw and started < 0 and tag == 'tag':
166
+ inside -= 1
167
+ elif by_tags and inside and started < 0 and tag == 'tag':
177
168
  tags.append(elem.text or '')
178
169
  if tags_match(tags):
179
170
  started = 0
180
- seen_doc = False
181
- elif started == 0 and tag == 'doc':
182
- seen_doc = True
183
- elem.text = f"{elem.text or ''}\n\n_*Content flattened.*_".strip()
171
+ elif started == 0 and tag == 'status':
172
+ elem.text = self._create_flattened_message(elem.text)
184
173
  if started <= 0 or tag == 'msg':
185
174
  yield event, elem
186
175
  else:
187
176
  elem.clear()
188
- if started >= 0 and end and tag in containers:
177
+ if started >= 0 and event == 'end' and tag in containers:
189
178
  started -= 1
190
179
 
180
+ def _create_flattened_message(self, original):
181
+ if not original:
182
+ start = ''
183
+ elif original.startswith('*HTML*'):
184
+ start = original[6:].strip() + '<hr>'
185
+ else:
186
+ start = html_escape(original) + '<hr>'
187
+ return f'*HTML* {start}<span class="robot-note">Content flattened.</span>'
188
+
191
189
  def _get_matcher(self, matcher_class, flattened):
192
190
  matcher = matcher_class(flattened)
193
191
  return matcher.match, bool(matcher)
@@ -13,6 +13,8 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from datetime import datetime
17
+
16
18
  from robot.errors import DataError
17
19
 
18
20
 
@@ -58,9 +60,13 @@ class ElementHandler:
58
60
  def end(self, elem, result):
59
61
  pass
60
62
 
61
- def _timestamp(self, elem, attr_name):
62
- timestamp = elem.get(attr_name)
63
- return timestamp if timestamp != 'N/A' else None
63
+ def _legacy_timestamp(self, elem, attr_name):
64
+ ts = elem.get(attr_name)
65
+ if ts == 'N/A' or not ts:
66
+ return None
67
+ ts = ts.ljust(24, '0')
68
+ return datetime(int(ts[:4]), int(ts[4:6]), int(ts[6:8]),
69
+ int(ts[9:11]), int(ts[12:14]), int(ts[15:17]), int(ts[18:24]))
64
70
 
65
71
 
66
72
  class RootHandler(ElementHandler):
@@ -106,7 +112,8 @@ class TestHandler(ElementHandler):
106
112
  tag = 'test'
107
113
  # 'tags' is for RF < 4 compatibility.
108
114
  children = frozenset(('doc', 'tags', 'tag', 'timeout', 'status', 'kw', 'if', 'for',
109
- 'try', 'while', 'return', 'break', 'continue', 'error', 'msg'))
115
+ 'try', 'while', 'variable', 'return', 'break', 'continue',
116
+ 'error', 'msg'))
110
117
 
111
118
  def start(self, elem, result):
112
119
  lineno = elem.get('line')
@@ -121,7 +128,7 @@ class KeywordHandler(ElementHandler):
121
128
  # 'arguments', 'assign' and 'tags' are for RF < 4 compatibility.
122
129
  children = frozenset(('doc', 'arguments', 'arg', 'assign', 'var', 'tags', 'tag',
123
130
  'timeout', 'status', 'msg', 'kw', 'if', 'for', 'try',
124
- 'while', 'return', 'break', 'continue', 'error'))
131
+ 'while', 'variable', 'return', 'break', 'continue', 'error'))
125
132
 
126
133
  def start(self, elem, result):
127
134
  elem_type = elem.get('type')
@@ -136,9 +143,15 @@ class KeywordHandler(ElementHandler):
136
143
  body = result.body
137
144
  except AttributeError:
138
145
  body = self._get_body_for_suite_level_keyword(result)
139
- return body.create_keyword(kwname=elem.get('name', ''),
140
- libname=elem.get('library'),
141
- sourcename=elem.get('sourcename'))
146
+ return body.create_keyword(**self._get_keyword_attrs(elem))
147
+
148
+ def _get_keyword_attrs(self, elem):
149
+ # 'library' and 'sourcename' are RF < 7 compatibility.
150
+ return {
151
+ 'name': elem.get('name', ''),
152
+ 'owner': elem.get('owner') or elem.get('library'),
153
+ 'source_name': elem.get('source_name') or elem.get('sourcename')
154
+ }
142
155
 
143
156
  def _get_body_for_suite_level_keyword(self, result):
144
157
  # Someone, most likely a listener, has created a `<kw>` element on suite level.
@@ -149,24 +162,22 @@ class KeywordHandler(ElementHandler):
149
162
  kw_type = 'teardown' if result.tests or result.suites else 'setup'
150
163
  keyword = getattr(result, kw_type)
151
164
  if not keyword:
152
- keyword.config(kwname=f'Implicit {kw_type}', status=keyword.PASS)
165
+ keyword.config(name=f'Implicit {kw_type}', status=keyword.PASS)
153
166
  return keyword.body
154
167
 
155
168
  def _create_setup(self, elem, result):
156
- return result.setup.config(kwname=elem.get('name', ''),
157
- libname=elem.get('library'))
169
+ return result.setup.config(**self._get_keyword_attrs(elem))
158
170
 
159
171
  def _create_teardown(self, elem, result):
160
- return result.teardown.config(kwname=elem.get('name', ''),
161
- libname=elem.get('library'))
172
+ return result.teardown.config(**self._get_keyword_attrs(elem))
162
173
 
163
174
  # RF < 4 compatibility.
164
175
 
165
176
  def _create_for(self, elem, result):
166
- return result.body.create_keyword(kwname=elem.get('name'), type='FOR')
177
+ return result.body.create_keyword(name=elem.get('name'), type='FOR')
167
178
 
168
179
  def _create_foritem(self, elem, result):
169
- return result.body.create_keyword(kwname=elem.get('name'), type='ITERATION')
180
+ return result.body.create_keyword(name=elem.get('name'), type='ITERATION')
170
181
 
171
182
  _create_iteration = _create_foritem
172
183
 
@@ -201,7 +212,7 @@ class WhileHandler(ElementHandler):
201
212
  class IterationHandler(ElementHandler):
202
213
  tag = 'iter'
203
214
  children = frozenset(('var', 'doc', 'status', 'kw', 'if', 'for', 'msg', 'try',
204
- 'while', 'return', 'break', 'continue', 'error'))
215
+ 'while', 'variable', 'return', 'break', 'continue', 'error'))
205
216
 
206
217
  def start(self, elem, result):
207
218
  return result.body.create_iteration()
@@ -220,9 +231,11 @@ class IfHandler(ElementHandler):
220
231
  class BranchHandler(ElementHandler):
221
232
  tag = 'branch'
222
233
  children = frozenset(('status', 'kw', 'if', 'for', 'try', 'while', 'msg', 'doc',
223
- 'return', 'pattern', 'break', 'continue', 'error'))
234
+ 'variable', 'return', 'pattern', 'break', 'continue', 'error'))
224
235
 
225
236
  def start(self, elem, result):
237
+ if 'variable' in elem.attrib: # RF < 7.0 compatibility.
238
+ elem.attrib['assign'] = elem.attrib.pop('variable')
226
239
  return result.body.create_branch(**elem.attrib)
227
240
 
228
241
 
@@ -244,10 +257,21 @@ class PatternHandler(ElementHandler):
244
257
  result.patterns += (elem.text or '',)
245
258
 
246
259
 
260
+ @ElementHandler.register
261
+ class VariableHandler(ElementHandler):
262
+ tag = 'variable'
263
+ children = frozenset(('var', 'status', 'msg', 'kw'))
264
+
265
+ def start(self, elem, result):
266
+ return result.body.create_var(name=elem.get('name', ''),
267
+ scope=elem.get('scope'),
268
+ separator=elem.get('separator'))
269
+
270
+
247
271
  @ElementHandler.register
248
272
  class ReturnHandler(ElementHandler):
249
273
  tag = 'return'
250
- children = frozenset(('status', 'value', 'msg', 'kw'))
274
+ children = frozenset(('value', 'status', 'msg', 'kw'))
251
275
 
252
276
  def start(self, elem, result):
253
277
  return result.body.create_return()
@@ -285,11 +309,23 @@ class MessageHandler(ElementHandler):
285
309
  tag = 'msg'
286
310
 
287
311
  def end(self, elem, result):
288
- html_true = ('true', 'yes') # 'yes' is compatibility for RF < 4.
289
- result.body.create_message(elem.text or '',
290
- elem.get('level', 'INFO'),
291
- elem.get('html') in html_true,
292
- self._timestamp(elem, 'timestamp'))
312
+ self._create_message(elem, result.body.create_message)
313
+
314
+ def _create_message(self, elem, creator):
315
+ if 'time' in elem.attrib: # RF >= 7
316
+ timestamp = elem.attrib['time']
317
+ else: # RF < 7
318
+ timestamp = self._legacy_timestamp(elem, 'timestamp')
319
+ creator(elem.text or '',
320
+ elem.get('level', 'INFO'),
321
+ elem.get('html') in ('true', 'yes'), # 'yes' is RF < 4 compatibility
322
+ timestamp)
323
+
324
+
325
+ class ErrorMessageHandler(MessageHandler):
326
+
327
+ def end(self, elem, result):
328
+ self._create_message(elem, result.messages.create)
293
329
 
294
330
 
295
331
  @ElementHandler.register
@@ -302,8 +338,12 @@ class StatusHandler(ElementHandler):
302
338
  def end(self, elem, result):
303
339
  if self.set_status:
304
340
  result.status = elem.get('status', 'FAIL')
305
- result.starttime = self._timestamp(elem, 'starttime')
306
- result.endtime = self._timestamp(elem, 'endtime')
341
+ if 'start' in elem.attrib: # RF >= 7
342
+ result.start_time = elem.attrib['start']
343
+ result.elapsed_time = float(elem.attrib['elapsed'])
344
+ else: # RF < 7
345
+ result.start_time = self._legacy_timestamp(elem, 'starttime')
346
+ result.end_time = self._legacy_timestamp(elem, 'endtime')
307
347
  if elem.text:
308
348
  result.message = elem.text
309
349
 
@@ -313,7 +353,13 @@ class DocHandler(ElementHandler):
313
353
  tag = 'doc'
314
354
 
315
355
  def end(self, elem, result):
316
- result.doc = elem.text or ''
356
+ try:
357
+ result.doc = elem.text or ''
358
+ except AttributeError:
359
+ # With RF < 7 control structures can have `<doc>` containing information
360
+ # about flattening or removing date. Nowadays, they don't have `doc`
361
+ # attribute at all and `message` is used for this information.
362
+ result.message = elem.text or ''
317
363
 
318
364
 
319
365
  @ElementHandler.register
@@ -372,12 +418,12 @@ class VarHandler(ElementHandler):
372
418
 
373
419
  def end(self, elem, result):
374
420
  value = elem.text or ''
375
- if result.type == result.KEYWORD:
421
+ if result.type in (result.KEYWORD, result.FOR):
376
422
  result.assign += (value,)
377
- elif result.type == result.FOR:
378
- result.variables += (value,)
379
423
  elif result.type == result.ITERATION:
380
- result.variables[elem.get('name')] = value
424
+ result.assign[elem.get('name')] = value
425
+ elif result.type == result.VAR:
426
+ result.value += (value,)
381
427
  else:
382
428
  raise DataError(f"Invalid element '{elem}' for result '{result!r}'.")
383
429
 
@@ -415,16 +461,6 @@ class ErrorsHandler(ElementHandler):
415
461
  return ErrorMessageHandler()
416
462
 
417
463
 
418
- class ErrorMessageHandler(ElementHandler):
419
-
420
- def end(self, elem, result):
421
- html_true = ('true', 'yes') # 'yes' is compatibility for RF < 4.
422
- result.messages.create(elem.text or '',
423
- elem.get('level', 'INFO'),
424
- elem.get('html') in html_true,
425
- self._timestamp(elem, 'timestamp'))
426
-
427
-
428
464
  @ElementHandler.register
429
465
  class StatisticsHandler(ElementHandler):
430
466
  tag = 'statistics'
@@ -111,7 +111,7 @@ from .arguments import ArgInfo, ArgumentSpec, TypeConverter, TypeInfo
111
111
  from .builder import ResourceFileBuilder, TestDefaults, TestSuiteBuilder
112
112
  from .context import EXECUTION_CONTEXTS
113
113
  from .model import (Break, Continue, Error, For, If, IfBranch, Keyword, Return,
114
- ResourceFile, TestCase, TestSuite, Try, TryBranch, While)
114
+ ResourceFile, TestCase, TestSuite, Try, TryBranch, Var, While)
115
115
  from .runkwregister import RUN_KW_REGISTER
116
116
  from .testlibraries import TestLibrary
117
117
  from .usererrorhandler import UserErrorHandler
@@ -0,0 +1,101 @@
1
+ # Copyright 2008-2015 Nokia Networks
2
+ # Copyright 2016- Robot Framework Foundation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from typing import TYPE_CHECKING
17
+
18
+ from robot.variables import contains_variable
19
+
20
+ from .typeinfo import TypeInfo
21
+ from .typeconverters import TypeConverter
22
+
23
+ if TYPE_CHECKING:
24
+ from robot.conf import LanguagesLike
25
+
26
+ from .argumentspec import ArgumentSpec
27
+ from .customconverters import CustomArgumentConverters
28
+
29
+
30
+ class ArgumentConverter:
31
+
32
+ def __init__(self, arg_spec: 'ArgumentSpec',
33
+ custom_converters: 'CustomArgumentConverters',
34
+ dry_run: bool = False,
35
+ languages: 'LanguagesLike' = None):
36
+ self.spec = arg_spec
37
+ self.custom_converters = custom_converters
38
+ self.dry_run = dry_run
39
+ self.languages = languages
40
+
41
+ def convert(self, positional, named):
42
+ return self._convert_positional(positional), self._convert_named(named)
43
+
44
+ def _convert_positional(self, positional):
45
+ names = self.spec.positional
46
+ converted = [self._convert(name, value)
47
+ for name, value in zip(names, positional)]
48
+ if self.spec.var_positional:
49
+ converted.extend(self._convert(self.spec.var_positional, value)
50
+ for value in positional[len(names):])
51
+ return converted
52
+
53
+ def _convert_named(self, named):
54
+ names = set(self.spec.positional) | set(self.spec.named_only)
55
+ var_named = self.spec.var_named
56
+ return [(name, self._convert(name if name in names else var_named, value))
57
+ for name, value in named]
58
+
59
+ def _convert(self, name, value):
60
+ spec = self.spec
61
+ if (spec.types is None
62
+ or self.dry_run and contains_variable(value, identifiers='$@&%')):
63
+ return value
64
+ conversion_error = None
65
+ # Don't convert None if argument has None as a default value.
66
+ # Python < 3.11 adds None to type hints automatically when using None as
67
+ # a default value which preserves None automatically. This code keeps
68
+ # the same behavior also with newer Python versions. We can consider
69
+ # changing this once Python 3.11 is our minimum supported version.
70
+ if value is None and name in spec.defaults and spec.defaults[name] is None:
71
+ return value
72
+ # Primarily convert arguments based on type hints.
73
+ if name in spec.types:
74
+ info: TypeInfo = spec.types[name]
75
+ try:
76
+ return info.convert(value, name, self.custom_converters, self.languages)
77
+ except ValueError as err:
78
+ conversion_error = err
79
+ except TypeError:
80
+ pass
81
+ # Try conversion also based on the default value type. We probably should
82
+ # do this only if there is no explicit type hint, but Python < 3.11
83
+ # handling `arg: type = None` differently than newer versions would mean
84
+ # that conversion behavior depends on the Python version. Once Python 3.11
85
+ # is our minimum supported version, we can consider reopening
86
+ # https://github.com/robotframework/robotframework/issues/4881
87
+ if name in spec.defaults:
88
+ typ = type(spec.defaults[name])
89
+ if typ == str: # Don't convert arguments to strings.
90
+ info = TypeInfo()
91
+ elif typ == int: # Try also conversion to float.
92
+ info = TypeInfo.from_sequence([int, float])
93
+ else:
94
+ info = TypeInfo.from_type(typ)
95
+ try:
96
+ return info.convert(value, name, languages=self.languages)
97
+ except (ValueError, TypeError):
98
+ pass
99
+ if conversion_error:
100
+ raise conversion_error
101
+ return value
@@ -13,17 +13,21 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ from typing import TYPE_CHECKING
17
+
16
18
  from robot.errors import DataError
17
19
 
20
+ if TYPE_CHECKING:
21
+ from .argumentspec import ArgumentSpec
22
+
18
23
 
19
24
  class ArgumentMapper:
20
25
 
21
- def __init__(self, argspec):
22
- """:type argspec: :py:class:`robot.running.arguments.ArgumentSpec`"""
23
- self._argspec = argspec
26
+ def __init__(self, arg_spec: 'ArgumentSpec'):
27
+ self.arg_spec = arg_spec
24
28
 
25
29
  def map(self, positional, named, replace_defaults=True):
26
- template = KeywordCallTemplate(self._argspec)
30
+ template = KeywordCallTemplate(self.arg_spec)
27
31
  template.fill_positional(positional)
28
32
  template.fill_named(named)
29
33
  if replace_defaults:
@@ -33,19 +37,18 @@ class ArgumentMapper:
33
37
 
34
38
  class KeywordCallTemplate:
35
39
 
36
- def __init__(self, argspec):
37
- """:type argspec: :py:class:`robot.running.arguments.ArgumentSpec`"""
38
- self._argspec = argspec
39
- self.args = [None if arg not in argspec.defaults
40
- else DefaultValue(argspec.defaults[arg])
41
- for arg in argspec.positional]
40
+ def __init__(self, arg_spec: 'ArgumentSpec'):
41
+ self.arg_spec = arg_spec
42
+ self.args = [None if arg not in arg_spec.defaults
43
+ else DefaultValue(arg_spec.defaults[arg])
44
+ for arg in arg_spec.positional]
42
45
  self.kwargs = []
43
46
 
44
47
  def fill_positional(self, positional):
45
48
  self.args[:len(positional)] = positional
46
49
 
47
50
  def fill_named(self, named):
48
- spec = self._argspec
51
+ spec = self.arg_spec
49
52
  for name, value in named:
50
53
  if name in spec.positional_or_named:
51
54
  index = spec.positional_or_named.index(name)
@@ -53,7 +56,7 @@ class KeywordCallTemplate:
53
56
  elif spec.var_named or name in spec.named_only:
54
57
  self.kwargs.append((name, value))
55
58
  else:
56
- raise DataError("Non-existing named argument '%s'." % name)
59
+ raise DataError(f"Non-existing named argument '{name}'.")
57
60
  named_names = {name for name, _ in named}
58
61
  for name in spec.named_only:
59
62
  if name not in named_names:
@@ -77,5 +80,4 @@ class DefaultValue:
77
80
  try:
78
81
  return variables.replace_scalar(self.value)
79
82
  except DataError as err:
80
- raise DataError('Resolving argument default values failed: %s'
81
- % err.message)
83
+ raise DataError(f'Resolving argument default values failed: {err}')