robotframework 6.1.1__zip → 7.0__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 (307) hide show
  1. {robotframework-6.1.1 → robotframework-7.0}/INSTALL.rst +25 -25
  2. {robotframework-6.1.1 → robotframework-7.0}/PKG-INFO +6 -8
  3. {robotframework-6.1.1 → robotframework-7.0}/README.rst +3 -2
  4. {robotframework-6.1.1 → robotframework-7.0}/setup.py +3 -6
  5. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/__init__.py +4 -1
  6. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/deco.py +60 -14
  7. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/exceptions.py +6 -6
  8. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/interfaces.py +402 -67
  9. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/logger.py +27 -20
  10. {robotframework-6.1.1 → robotframework-7.0}/src/robot/api/parsing.py +4 -2
  11. robotframework-7.0/src/robot/api/py.typed +0 -0
  12. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/gatherfailed.py +2 -2
  13. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/languages.py +0 -9
  14. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/settings.py +21 -14
  15. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/storage.js +11 -6
  16. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/htmlfilewriter.py +1 -1
  17. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.css +10 -2
  18. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/libdoc.html +10 -0
  19. robotframework-7.0/src/robot/htmldata/rebot/common.css +362 -0
  20. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/doc_formatting.css +13 -7
  21. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.css +51 -10
  22. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.html +14 -23
  23. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/model.js +2 -4
  24. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.css +83 -19
  25. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/report.html +22 -7
  26. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/testdata.js +10 -3
  27. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/view.js +84 -0
  28. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/template.py +3 -3
  29. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/builder.py +0 -8
  30. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/datatypes.py +9 -10
  31. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlutils.py +4 -7
  32. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonbuilder.py +38 -20
  33. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/model.py +21 -28
  34. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/robotbuilder.py +50 -31
  35. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/standardtypes.py +9 -1
  36. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlbuilder.py +35 -20
  37. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/xmlwriter.py +18 -38
  38. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/BuiltIn.py +255 -205
  39. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Collections.py +384 -240
  40. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/DateTime.py +73 -60
  41. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/OperatingSystem.py +6 -5
  42. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Process.py +26 -27
  43. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Remote.py +40 -36
  44. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/String.py +66 -76
  45. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/XML.py +66 -59
  46. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/__init__.py +2 -2
  47. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/__init__.py +5 -5
  48. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/body.py +44 -13
  49. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/configurer.py +15 -11
  50. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/control.py +226 -84
  51. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/filter.py +31 -25
  52. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/itemlist.py +9 -8
  53. robotframework-7.0/src/robot/model/keyword.py +77 -0
  54. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/message.py +19 -10
  55. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modelobject.py +25 -7
  56. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/namepatterns.py +3 -25
  57. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/stats.py +9 -15
  58. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tags.py +1 -1
  59. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testcase.py +15 -27
  60. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/testsuite.py +17 -26
  61. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/visitor.py +35 -8
  62. robotframework-7.0/src/robot/output/console/dotted.py +90 -0
  63. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/quiet.py +3 -2
  64. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/verbose.py +61 -61
  65. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/debugfile.py +39 -24
  66. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/filelogger.py +18 -15
  67. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/librarylogger.py +3 -2
  68. robotframework-7.0/src/robot/output/listeners.py +753 -0
  69. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/logger.py +216 -80
  70. robotframework-7.0/src/robot/output/loggerapi.py +215 -0
  71. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/loggerhelper.py +23 -56
  72. robotframework-7.0/src/robot/output/output.py +185 -0
  73. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/stdoutlogsplitter.py +8 -5
  74. robotframework-7.0/src/robot/output/xmllogger.py +459 -0
  75. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/blocklexers.py +17 -13
  76. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/context.py +12 -2
  77. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/lexer.py +1 -1
  78. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/settings.py +6 -3
  79. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/statementlexers.py +39 -10
  80. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokens.py +27 -29
  81. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/blocks.py +19 -6
  82. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/statements.py +193 -94
  83. robotframework-7.0/src/robot/parsing/model/visitor.py +100 -0
  84. {robotframework-6.1.1 → robotframework-7.0}/src/robot/rebot.py +2 -0
  85. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/expandkeywordmatcher.py +1 -1
  86. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsbuildingcontext.py +8 -6
  87. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsmodelbuilders.py +88 -61
  88. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/logreportwriters.py +16 -10
  89. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/outputwriter.py +18 -2
  90. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/resultwriter.py +4 -4
  91. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/stringcache.py +3 -3
  92. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/xunitwriter.py +15 -21
  93. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/__init__.py +3 -2
  94. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/configurer.py +12 -9
  95. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionresult.py +56 -8
  96. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/flattenkeywordmatcher.py +48 -9
  97. robotframework-7.0/src/robot/result/keywordremover.py +207 -0
  98. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/merger.py +1 -1
  99. robotframework-7.0/src/robot/result/model.py +1185 -0
  100. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/modeldeprecation.py +9 -3
  101. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/resultbuilder.py +46 -36
  102. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/xmlelementhandlers.py +83 -43
  103. {robotframework-6.1.1 → robotframework-7.0}/src/robot/run.py +2 -0
  104. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/__init__.py +14 -4
  105. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/__init__.py +2 -1
  106. robotframework-7.0/src/robot/running/arguments/argumentconverter.py +100 -0
  107. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentmapper.py +26 -24
  108. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentparser.py +82 -60
  109. robotframework-7.0/src/robot/running/arguments/argumentresolver.py +158 -0
  110. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentspec.py +83 -116
  111. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/argumentvalidator.py +33 -27
  112. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/customconverters.py +15 -12
  113. robotframework-7.0/src/robot/running/arguments/embedded.py +145 -0
  114. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/arguments/typeconverters.py +233 -213
  115. robotframework-7.0/src/robot/running/arguments/typeinfo.py +317 -0
  116. robotframework-7.0/src/robot/running/arguments/typeinfoparser.py +219 -0
  117. robotframework-7.0/src/robot/running/arguments/typevalidator.py +60 -0
  118. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/bodyrunner.py +147 -129
  119. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/builders.py +2 -1
  120. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/parsers.py +10 -11
  121. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/settings.py +9 -17
  122. robotframework-7.0/src/robot/running/builder/transformers.py +535 -0
  123. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/context.py +113 -31
  124. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/dynamicmethods.py +62 -34
  125. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/importer.py +27 -49
  126. robotframework-7.0/src/robot/running/invalidkeyword.py +67 -0
  127. robotframework-7.0/src/robot/running/keywordfinder.py +91 -0
  128. robotframework-7.0/src/robot/running/keywordimplementation.py +164 -0
  129. robotframework-7.0/src/robot/running/librarykeyword.py +392 -0
  130. robotframework-7.0/src/robot/running/librarykeywordrunner.py +250 -0
  131. robotframework-7.0/src/robot/running/libraryscopes.py +115 -0
  132. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/model.py +195 -377
  133. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/namespace.py +124 -137
  134. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/outputcapture.py +20 -12
  135. robotframework-7.0/src/robot/running/resourcemodel.py +448 -0
  136. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/statusreporter.py +16 -13
  137. robotframework-7.0/src/robot/running/suiterunner.py +265 -0
  138. robotframework-7.0/src/robot/running/testlibraries.py +500 -0
  139. robotframework-7.0/src/robot/running/userkeywordrunner.py +260 -0
  140. {robotframework-6.1.1 → robotframework-7.0}/src/robot/testdoc.py +18 -13
  141. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/__init__.py +53 -35
  142. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/connectioncache.py +64 -59
  143. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/dotdict.py +3 -0
  144. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encodingsniffer.py +1 -1
  145. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/escaping.py +19 -19
  146. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/importer.py +2 -2
  147. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markupwriters.py +23 -15
  148. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/misc.py +1 -2
  149. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/normalizing.py +9 -24
  150. robotframework-7.0/src/robot/utils/notset.py +33 -0
  151. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/platform.py +15 -5
  152. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotio.py +9 -9
  153. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotpath.py +1 -0
  154. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottime.py +122 -90
  155. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robottypes.py +21 -31
  156. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/setter.py +0 -5
  157. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/text.py +7 -4
  158. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/unic.py +2 -2
  159. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/__init__.py +2 -2
  160. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/assigner.py +17 -19
  161. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/evaluation.py +20 -17
  162. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/filesetter.py +80 -80
  163. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/replacer.py +33 -36
  164. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/scopes.py +17 -12
  165. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/search.py +66 -41
  166. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/store.py +14 -16
  167. robotframework-7.0/src/robot/variables/tablesetter.py +164 -0
  168. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/variables.py +1 -1
  169. {robotframework-6.1.1 → robotframework-7.0}/src/robot/version.py +1 -1
  170. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/PKG-INFO +6 -8
  171. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/SOURCES.txt +10 -8
  172. {robotframework-6.1.1 → robotframework-7.0}/tasks.py +6 -6
  173. robotframework-6.1.1/src/robot/htmldata/rebot/common.css +0 -239
  174. robotframework-6.1.1/src/robot/libraries/Reserved.py +0 -48
  175. robotframework-6.1.1/src/robot/model/keyword.py +0 -173
  176. robotframework-6.1.1/src/robot/output/console/dotted.py +0 -90
  177. robotframework-6.1.1/src/robot/output/listenerarguments.py +0 -165
  178. robotframework-6.1.1/src/robot/output/listenermethods.py +0 -113
  179. robotframework-6.1.1/src/robot/output/listeners.py +0 -174
  180. robotframework-6.1.1/src/robot/output/output.py +0 -95
  181. robotframework-6.1.1/src/robot/output/xmllogger.py +0 -354
  182. robotframework-6.1.1/src/robot/parsing/model/visitor.py +0 -67
  183. robotframework-6.1.1/src/robot/result/keywordremover.py +0 -183
  184. robotframework-6.1.1/src/robot/result/model.py +0 -957
  185. robotframework-6.1.1/src/robot/running/arguments/argumentconverter.py +0 -79
  186. robotframework-6.1.1/src/robot/running/arguments/argumentresolver.py +0 -131
  187. robotframework-6.1.1/src/robot/running/arguments/embedded.py +0 -146
  188. robotframework-6.1.1/src/robot/running/arguments/typevalidator.py +0 -56
  189. robotframework-6.1.1/src/robot/running/builder/transformers.py +0 -642
  190. robotframework-6.1.1/src/robot/running/handlers.py +0 -321
  191. robotframework-6.1.1/src/robot/running/handlerstore.py +0 -66
  192. robotframework-6.1.1/src/robot/running/librarykeywordrunner.py +0 -238
  193. robotframework-6.1.1/src/robot/running/libraryscopes.py +0 -97
  194. robotframework-6.1.1/src/robot/running/modelcombiner.py +0 -32
  195. robotframework-6.1.1/src/robot/running/suiterunner.py +0 -248
  196. robotframework-6.1.1/src/robot/running/testlibraries.py +0 -423
  197. robotframework-6.1.1/src/robot/running/usererrorhandler.py +0 -75
  198. robotframework-6.1.1/src/robot/running/userkeyword.py +0 -111
  199. robotframework-6.1.1/src/robot/running/userkeywordrunner.py +0 -274
  200. robotframework-6.1.1/src/robot/variables/tablesetter.py +0 -156
  201. {robotframework-6.1.1 → robotframework-7.0}/AUTHORS.rst +0 -0
  202. {robotframework-6.1.1 → robotframework-7.0}/BUILD.rst +0 -0
  203. {robotframework-6.1.1 → robotframework-7.0}/CONTRIBUTING.rst +0 -0
  204. {robotframework-6.1.1 → robotframework-7.0}/COPYRIGHT.txt +0 -0
  205. {robotframework-6.1.1 → robotframework-7.0}/LICENSE.txt +0 -0
  206. {robotframework-6.1.1 → robotframework-7.0}/MANIFEST.in +0 -0
  207. {robotframework-6.1.1 → robotframework-7.0}/setup.cfg +0 -0
  208. {robotframework-6.1.1 → robotframework-7.0}/src/robot/__init__.py +0 -0
  209. {robotframework-6.1.1 → robotframework-7.0}/src/robot/__main__.py +0 -0
  210. {robotframework-6.1.1 → robotframework-7.0}/src/robot/conf/__init__.py +0 -0
  211. {robotframework-6.1.1 → robotframework-7.0}/src/robot/errors.py +0 -0
  212. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/__init__.py +0 -0
  213. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/__init__.py +0 -0
  214. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/common/js_disabled.css +0 -0
  215. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/jsonwriter.py +0 -0
  216. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/__init__.py +0 -0
  217. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  218. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.min.js +0 -0
  219. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  220. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  221. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  222. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/__init__.py +0 -0
  223. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/doc_formatting.css +0 -0
  224. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/print.css +0 -0
  225. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/libdoc/pygments.css +0 -0
  226. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/__init__.py +0 -0
  227. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/fileloading.js +0 -0
  228. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/log.js +0 -0
  229. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/print.css +0 -0
  230. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/rebot/util.js +0 -0
  231. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/__init__.py +0 -0
  232. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  233. {robotframework-6.1.1 → robotframework-7.0}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  234. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdoc.py +0 -0
  235. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/__init__.py +0 -0
  236. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/consoleviewer.py +0 -0
  237. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/htmlwriter.py +0 -0
  238. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/jsonwriter.py +0 -0
  239. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/output.py +0 -0
  240. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libdocpkg/writer.py +0 -0
  241. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Dialogs.py +0 -0
  242. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Easter.py +0 -0
  243. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Screenshot.py +0 -0
  244. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/Telnet.py +0 -0
  245. {robotframework-6.1.1 → robotframework-7.0}/src/robot/libraries/dialogs_py.py +0 -0
  246. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/fixture.py +0 -0
  247. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/metadata.py +0 -0
  248. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/modifier.py +0 -0
  249. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/statistics.py +0 -0
  250. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/suitestatistics.py +0 -0
  251. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagsetter.py +0 -0
  252. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/tagstatistics.py +0 -0
  253. {robotframework-6.1.1 → robotframework-7.0}/src/robot/model/totalstatistics.py +0 -0
  254. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/__init__.py +0 -0
  255. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/__init__.py +0 -0
  256. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/console/highlighting.py +0 -0
  257. {robotframework-6.1.1 → robotframework-7.0}/src/robot/output/pyloggingconf.py +0 -0
  258. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/__init__.py +0 -0
  259. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/__init__.py +0 -0
  260. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/lexer/tokenizer.py +0 -0
  261. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/model/__init__.py +0 -0
  262. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/__init__.py +0 -0
  263. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/blockparsers.py +0 -0
  264. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/fileparser.py +0 -0
  265. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/parser/parser.py +0 -0
  266. {robotframework-6.1.1 → robotframework-7.0}/src/robot/parsing/suitestructure.py +0 -0
  267. {robotframework-6.1.1 → robotframework-7.0}/src/robot/pythonpathsetter.py +0 -0
  268. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/__init__.py +0 -0
  269. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jsexecutionresult.py +0 -0
  270. {robotframework-6.1.1 → robotframework-7.0}/src/robot/reporting/jswriter.py +0 -0
  271. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/executionerrors.py +0 -0
  272. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/messagefilter.py +0 -0
  273. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/suiteteardownfailed.py +0 -0
  274. {robotframework-6.1.1 → robotframework-7.0}/src/robot/result/visitor.py +0 -0
  275. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/builder/__init__.py +0 -0
  276. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/randomizer.py +0 -0
  277. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/runkwregister.py +0 -0
  278. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/signalhandler.py +0 -0
  279. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/status.py +0 -0
  280. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/__init__.py +0 -0
  281. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/posix.py +0 -0
  282. {robotframework-6.1.1 → robotframework-7.0}/src/robot/running/timeouts/windows.py +0 -0
  283. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/application.py +0 -0
  284. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/argumentparser.py +0 -0
  285. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/asserts.py +0 -0
  286. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/charwidth.py +0 -0
  287. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/compress.py +0 -0
  288. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/encoding.py +0 -0
  289. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/error.py +0 -0
  290. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/etreewrapper.py +0 -0
  291. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/filereader.py +0 -0
  292. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/frange.py +0 -0
  293. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/htmlformatters.py +0 -0
  294. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/markuputils.py +0 -0
  295. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/match.py +0 -0
  296. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/recommendations.py +0 -0
  297. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/restreader.py +0 -0
  298. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotenv.py +0 -0
  299. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/robotinspect.py +0 -0
  300. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/sortable.py +0 -0
  301. {robotframework-6.1.1 → robotframework-7.0}/src/robot/utils/typehints.py +0 -0
  302. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/finders.py +0 -0
  303. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/notfound.py +0 -0
  304. {robotframework-6.1.1 → robotframework-7.0}/src/robot/variables/resolvable.py +0 -0
  305. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/dependency_links.txt +0 -0
  306. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/entry_points.txt +0 -0
  307. {robotframework-6.1.1 → robotframework-7.0}/src/robotframework.egg-info/top_level.txt +0 -0
@@ -39,7 +39,7 @@ It is possible to log messages using levels ``TRACE``, ``DEBUG``, ``INFO``,
39
39
  commonly, with the log level specific :func:`trace`, :func:`debug`,
40
40
  :func:`info`, :func:`warn`, :func:`error` functions.
41
41
 
42
- By default the trace and debug messages are not logged but that can be
42
+ The trace and debug messages are not logged by default, but that can be
43
43
  changed with the ``--loglevel`` command line option. Warnings and errors are
44
44
  automatically written also to the console and to the *Test Execution Errors*
45
45
  section in the log file.
@@ -60,18 +60,22 @@ Example
60
60
  from robot.api import logger
61
61
 
62
62
  def my_keyword(arg):
63
- logger.debug('Got argument %s.' % arg)
63
+ logger.debug(f'Got argument {arg}.')
64
64
  do_something()
65
65
  logger.info('<i>This</i> is a boring example.', html=True)
66
66
  """
67
67
 
68
68
  import logging
69
+ from typing import Literal
69
70
 
70
71
  from robot.output import librarylogger
71
72
  from robot.running.context import EXECUTION_CONTEXTS
72
73
 
73
74
 
74
- def write(msg, level='INFO', html=False):
75
+ LOGLEVEL = Literal['TRACE', 'DEBUG', 'INFO', 'CONSOLE', 'HTML', 'WARN', 'ERROR']
76
+
77
+
78
+ def write(msg: str, level: LOGLEVEL = 'INFO', html: bool = False):
75
79
  """Writes the message to the log file using the given level.
76
80
 
77
81
  Valid log levels are ``TRACE``, ``DEBUG``, ``INFO`` (default), ``WARN``,
@@ -89,27 +93,29 @@ def write(msg, level='INFO', html=False):
89
93
  librarylogger.write(msg, level, html)
90
94
  else:
91
95
  logger = logging.getLogger("RobotFramework")
92
- level = {'TRACE': logging.DEBUG // 2,
93
- 'DEBUG': logging.DEBUG,
94
- 'INFO': logging.INFO,
95
- 'CONSOLE': logging.INFO,
96
- 'HTML': logging.INFO,
97
- 'WARN': logging.WARN,
98
- 'ERROR': logging.ERROR}[level]
99
- logger.log(level, msg)
100
-
101
-
102
- def trace(msg, html=False):
96
+ level_int = {
97
+ 'TRACE': logging.DEBUG // 2,
98
+ 'DEBUG': logging.DEBUG,
99
+ 'INFO': logging.INFO,
100
+ 'CONSOLE': logging.INFO,
101
+ 'HTML': logging.INFO,
102
+ 'WARN': logging.WARN,
103
+ 'ERROR': logging.ERROR
104
+ }[level]
105
+ logger.log(level_int, msg)
106
+
107
+
108
+ def trace(msg: str, html: bool = False):
103
109
  """Writes the message to the log file using the ``TRACE`` level."""
104
110
  write(msg, 'TRACE', html)
105
111
 
106
112
 
107
- def debug(msg, html=False):
113
+ def debug(msg: str, html: bool = False):
108
114
  """Writes the message to the log file using the ``DEBUG`` level."""
109
115
  write(msg, 'DEBUG', html)
110
116
 
111
117
 
112
- def info(msg, html=False, also_console=False):
118
+ def info(msg: str, html: bool = False, also_console: bool = False):
113
119
  """Writes the message to the log file using the ``INFO`` level.
114
120
 
115
121
  If ``also_console`` argument is set to ``True``, the message is
@@ -120,24 +126,25 @@ def info(msg, html=False, also_console=False):
120
126
  console(msg)
121
127
 
122
128
 
123
- def warn(msg, html=False):
129
+ def warn(msg: str, html: bool = False):
124
130
  """Writes the message to the log file using the ``WARN`` level."""
125
131
  write(msg, 'WARN', html)
126
132
 
127
133
 
128
- def error(msg, html=False):
134
+ def error(msg: str, html: bool = False):
129
135
  """Writes the message to the log file using the ``ERROR`` level.
130
136
  """
131
137
  write(msg, 'ERROR', html)
132
138
 
133
139
 
134
- def console(msg, newline=True, stream='stdout'):
140
+ def console(msg: str, newline: bool = True,
141
+ stream: Literal['stdout', 'stderr'] = 'stdout'):
135
142
  """Writes the message to the console.
136
143
 
137
144
  If the ``newline`` argument is ``True``, a newline character is
138
145
  automatically added to the message.
139
146
 
140
- By default the message is written to the standard output stream.
147
+ The message is written to the standard output stream by default.
141
148
  Using the standard error stream is possibly by giving the ``stream``
142
149
  argument value ``'stderr'``.
143
150
  """
@@ -223,7 +223,7 @@ Statements:
223
223
  - :class:`~robot.parsing.model.statements.Template`
224
224
  - :class:`~robot.parsing.model.statements.Timeout`
225
225
  - :class:`~robot.parsing.model.statements.Arguments`
226
- - :class:`~robot.parsing.model.statements.Return` (deprecated, will mean ``ReturnStatement`` in RF 7.0)
226
+ - :class:`~robot.parsing.model.statements.Return` (deprecated, will mean ``ReturnStatement`` in RF 8.0)
227
227
  - :class:`~robot.parsing.model.statements.ReturnSetting` (alias for ``Return``, new in RF 6.1)
228
228
  - :class:`~robot.parsing.model.statements.KeywordCall`
229
229
  - :class:`~robot.parsing.model.statements.TemplateArguments`
@@ -236,6 +236,7 @@ Statements:
236
236
  - :class:`~robot.parsing.model.statements.FinallyHeader`
237
237
  - :class:`~robot.parsing.model.statements.ForHeader`
238
238
  - :class:`~robot.parsing.model.statements.WhileHeader`
239
+ - :class:`~robot.parsing.model.statements.Var` (new in RF 7.0)
239
240
  - :class:`~robot.parsing.model.statements.End`
240
241
  - :class:`~robot.parsing.model.statements.ReturnStatement`
241
242
  - :class:`~robot.parsing.model.statements.Break`
@@ -519,7 +520,7 @@ from robot.parsing.model.statements import (
519
520
  TestTeardown,
520
521
  TestTemplate,
521
522
  TestTimeout,
522
- ForceTags,
523
+ TestTags,
523
524
  DefaultTags,
524
525
  KeywordTags,
525
526
  Variable,
@@ -545,6 +546,7 @@ from robot.parsing.model.statements import (
545
546
  ForHeader,
546
547
  WhileHeader,
547
548
  End,
549
+ Var,
548
550
  ReturnStatement,
549
551
  Continue,
550
552
  Break,
File without changes
@@ -26,7 +26,7 @@ class GatherFailedTests(SuiteVisitor):
26
26
 
27
27
  def visit_test(self, test):
28
28
  if test.failed:
29
- self.tests.append(glob_escape(test.longname))
29
+ self.tests.append(glob_escape(test.full_name))
30
30
 
31
31
  def visit_keyword(self, kw):
32
32
  pass
@@ -39,7 +39,7 @@ class GatherFailedSuites(SuiteVisitor):
39
39
 
40
40
  def start_suite(self, suite):
41
41
  if any(test.failed for test in suite.tests):
42
- self.suites.append(glob_escape(suite.longname))
42
+ self.suites.append(glob_escape(suite.full_name))
43
43
 
44
44
  def visit_test(self, test):
45
45
  pass
@@ -130,15 +130,6 @@ class Languages:
130
130
  languages = [languages]
131
131
  if add_english:
132
132
  languages.append(En())
133
- # The English singular forms are added for backwards compatibility
134
- self.headers = {
135
- 'Setting': 'Settings',
136
- 'Variable': 'Variables',
137
- 'Test Case': 'Test Cases',
138
- 'Task': 'Tasks',
139
- 'Keyword': 'Keywords',
140
- 'Comment': 'Comments'
141
- }
142
133
  return languages
143
134
 
144
135
  def _get_available_languages(self) -> 'dict[str, type[Language]]':
@@ -18,15 +18,15 @@ import os
18
18
  import random
19
19
  import string
20
20
  import sys
21
- import time
22
21
  import warnings
22
+ from datetime import datetime
23
23
  from pathlib import Path
24
24
 
25
25
  from robot.errors import DataError, FrameworkError
26
26
  from robot.output import LOGGER, loggerhelper
27
27
  from robot.result.keywordremover import KeywordRemover
28
28
  from robot.result.flattenkeywordmatcher import validate_flatten_keyword
29
- from robot.utils import (abspath, create_destination_directory, escape, format_time,
29
+ from robot.utils import (abspath, create_destination_directory, escape,
30
30
  get_link_path, html_escape, is_list_like, plural_or_not as s,
31
31
  seq2str, split_args_from_name_or_path)
32
32
 
@@ -47,6 +47,7 @@ class _BaseSettings:
47
47
  'Include' : ('include', []),
48
48
  'Exclude' : ('exclude', []),
49
49
  'OutputDir' : ('outputdir', abspath('.')),
50
+ 'LegacyOutput' : ('legacyoutput', False),
50
51
  'Log' : ('log', 'log.html'),
51
52
  'Report' : ('report', 'report.html'),
52
53
  'XUnit' : ('xunit', None),
@@ -73,7 +74,7 @@ class _BaseSettings:
73
74
  _output_opts = ['Output', 'Log', 'Report', 'XUnit', 'DebugFile']
74
75
 
75
76
  def __init__(self, options=None, **extra_options):
76
- self.start_timestamp = format_time(time.time(), '', '-', '')
77
+ self.start_time = datetime.now()
77
78
  self._opts = {}
78
79
  self._cli_opts = self._cli_opts.copy()
79
80
  self._cli_opts.update(self._extra_cli_opts)
@@ -112,7 +113,7 @@ class _BaseSettings:
112
113
  return str(value)
113
114
  return value if value and value.upper() != 'NONE' else None
114
115
  if name == 'OutputDir':
115
- return abspath(value)
116
+ return Path(value).absolute()
116
117
  if name in ['SuiteStatLevel', 'ConsoleWidth']:
117
118
  return self._convert_to_positive_integer_or_default(name, value)
118
119
  if name == 'VariableFiles':
@@ -223,14 +224,16 @@ class _BaseSettings:
223
224
  LOGGER.error('Log file cannot be created if output.xml is disabled.')
224
225
  return None
225
226
  name = self._process_output_name(option, name)
226
- path = abspath(os.path.join(self['OutputDir'], name))
227
+ path = self.output_directory / name
227
228
  create_destination_directory(path, f'{option.lower()} file')
228
229
  return path
229
230
 
230
231
  def _process_output_name(self, option, name):
231
232
  base, ext = os.path.splitext(name)
232
233
  if self['TimestampOutputs']:
233
- base = f'{base}-{self.start_timestamp}'
234
+ s = self.start_time
235
+ base = (f'{base}-{s.year}{s.month:02}{s.day:02}-'
236
+ f'{s.hour:02}{s.minute:02}{s.second:02}')
234
237
  ext = self._get_output_extension(ext, option)
235
238
  return base + ext
236
239
 
@@ -336,7 +339,7 @@ class _BaseSettings:
336
339
  def _validate_remove_keywords(self, values):
337
340
  for value in values:
338
341
  try:
339
- KeywordRemover(value)
342
+ KeywordRemover.from_config(value)
340
343
  except DataError as err:
341
344
  self._raise_invalid('RemoveKeywords', err)
342
345
 
@@ -362,23 +365,27 @@ class _BaseSettings:
362
365
  return '\n'.join(f'{name}: {self._opts[name]}' for name in sorted(self._opts))
363
366
 
364
367
  @property
365
- def output_directory(self):
366
- return self['OutputDir']
368
+ def output_directory(self) -> Path:
369
+ return Path(self['OutputDir'])
367
370
 
368
371
  @property
369
- def output(self):
372
+ def output(self) -> 'Path|None':
370
373
  return self['Output']
371
374
 
372
375
  @property
373
- def log(self):
376
+ def legacy_output(self) -> bool:
377
+ return self['LegacyOutput']
378
+
379
+ @property
380
+ def log(self) -> 'Path|None':
374
381
  return self['Log']
375
382
 
376
383
  @property
377
- def report(self):
384
+ def report(self) -> 'Path|None':
378
385
  return self['Report']
379
386
 
380
387
  @property
381
- def xunit(self):
388
+ def xunit(self) -> 'Path|None':
382
389
  return self['XUnit']
383
390
 
384
391
  @property
@@ -488,7 +495,7 @@ class RobotSettings(_BaseSettings):
488
495
 
489
496
  def get_rebot_settings(self):
490
497
  settings = RebotSettings()
491
- settings.start_timestamp = self.start_timestamp
498
+ settings.start_time = self.start_time
492
499
  not_copied = {'Include', 'Exclude', 'TestNames', 'SuiteNames', 'ParseInclude',
493
500
  'Name', 'Doc', 'Metadata', 'SetTag', 'Output', 'LogLevel',
494
501
  'TimestampOutputs'}
@@ -4,7 +4,8 @@ storage = function () {
4
4
  var storage;
5
5
 
6
6
  function init(user) {
7
- prefix += user + '-';
7
+ if (user)
8
+ prefix += user + '-';
8
9
  storage = getStorage();
9
10
  }
10
11
 
@@ -20,16 +21,20 @@ storage = function () {
20
21
  }
21
22
  }
22
23
 
23
- function get(name, defaultValue) {
24
- var value = storage[prefix + name];
24
+ function get(key, defaultValue) {
25
+ var value = storage[fullKey(key)];
25
26
  if (typeof value === 'undefined')
26
27
  return defaultValue;
27
28
  return value;
28
29
  }
29
30
 
30
- function set(name, value) {
31
- storage[prefix + name] = value;
31
+ function set(key, value) {
32
+ storage[fullKey(key)] = value;
32
33
  }
33
34
 
34
- return {init: init, get: get, set: set};
35
+ function fullKey(key) {
36
+ return prefix + key;
37
+ }
38
+
39
+ return {init: init, get: get, set: set, fullKey: fullKey};
35
40
  }();
@@ -113,4 +113,4 @@ class CssFileWriter(InliningWriter):
113
113
 
114
114
  def write(self, line: str):
115
115
  href, media = re.search('href="([^"]+)" media="([^"]+)"', line).groups()
116
- self.inline_file(href, 'style', {'type': 'text/css', 'media': media})
116
+ self.inline_file(href, 'style', {'media': media})
@@ -288,6 +288,7 @@ input.hamburger-menu:checked ~ span.hamburger-menu-3
288
288
 
289
289
  .arguments-list-container {
290
290
  overflow-y: auto;
291
+ margin-bottom: 1.33rem;
291
292
  }
292
293
 
293
294
 
@@ -338,7 +339,8 @@ input.hamburger-menu:checked ~ span.hamburger-menu-3
338
339
  min-width: 150px;
339
340
  }
340
341
 
341
- .arguments-list .arg-type {
342
+ .arguments-list .arg-type,
343
+ .return-type .arg-type {
342
344
  margin-left: 2rem;
343
345
  -ms-grid-column: 3;
344
346
  grid-column: 3;
@@ -347,6 +349,11 @@ input.hamburger-menu:checked ~ span.hamburger-menu-3
347
349
  -webkit-text-size-adjust: none;
348
350
  }
349
351
 
352
+ .tags .kw-tags {
353
+ margin-left: 2rem;
354
+ display: flex;
355
+ }
356
+
350
357
  .arguments-list .arg-kind {
351
358
  color: transparent;
352
359
  text-shadow: 0 0 0 var(--less-important-text-color);
@@ -583,6 +590,7 @@ h4 {
583
590
 
584
591
  .enum-type-members span,
585
592
  .args span,
593
+ .return-type span,
586
594
  .args a
587
595
  {
588
596
  font-family: monospace;
@@ -625,7 +633,7 @@ a.type {
625
633
  color: var(--highlighted-color);
626
634
  }
627
635
 
628
- .tags {
636
+ .tags, .return-type {
629
637
  display: flex;
630
638
  align-items: baseline;
631
639
  }
@@ -536,13 +536,23 @@
536
536
  </div>
537
537
  </div>
538
538
  {{/if}}
539
+ {{if returnType}}
540
+ <div class="return-type">
541
+ <h4>Return Type</h4>
542
+ <span class="arg-type">
543
+ {{tmpl(returnType) 'type-info-template'}}
544
+ </span>
545
+ </div>
546
+ {{/if}}
539
547
  {{if libdoc.tags.length && tags.length}}
540
548
  <div class="tags">
541
549
  <h4>Tags</h4>
550
+ <span class="kw-tags">
542
551
  {{each tags}}
543
552
  <a href="javascript:tagSearch('${$value}')"
544
553
  title="Show keywords with this tag">${$value}</a>{{if $index < tags.length-1}},<br>{{/if}}
545
554
  {{/each}}
555
+ </span>
546
556
  </div>
547
557
  {{/if}}
548
558
  </div>