robotframework 7.3.2__tar.gz → 7.4__tar.gz

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 (291) hide show
  1. {robotframework-7.3.2 → robotframework-7.4}/PKG-INFO +2 -2
  2. {robotframework-7.3.2 → robotframework-7.4}/setup.py +1 -1
  3. {robotframework-7.3.2 → robotframework-7.4}/src/robot/api/__init__.py +3 -0
  4. {robotframework-7.3.2 → robotframework-7.4}/src/robot/api/interfaces.py +3 -3
  5. robotframework-7.4/src/robot/api/logger.py +219 -0
  6. robotframework-7.4/src/robot/api/types.py +36 -0
  7. {robotframework-7.3.2 → robotframework-7.4}/src/robot/conf/settings.py +1 -1
  8. {robotframework-7.3.2 → robotframework-7.4}/src/robot/errors.py +4 -0
  9. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/htmlfilewriter.py +8 -11
  10. robotframework-7.4/src/robot/htmldata/libdoc/libdoc.html +385 -0
  11. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/common.css +10 -18
  12. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/log.css +59 -58
  13. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/log.html +47 -36
  14. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/log.js +2 -1
  15. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/model.js +1 -1
  16. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/report.html +2 -2
  17. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/view.js +2 -2
  18. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/model.py +9 -2
  19. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/robotbuilder.py +5 -3
  20. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/standardtypes.py +139 -41
  21. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/BuiltIn.py +1273 -1054
  22. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Collections.py +411 -449
  23. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/DateTime.py +91 -62
  24. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Dialogs.py +13 -5
  25. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/OperatingSystem.py +288 -221
  26. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Process.py +464 -382
  27. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Screenshot.py +15 -13
  28. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/String.py +337 -138
  29. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/XML.py +360 -179
  30. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/dialogs_py.py +24 -8
  31. robotframework-7.4/src/robot/libraries/normalizer.py +144 -0
  32. robotframework-7.4/src/robot/libraries/py.typed +0 -0
  33. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/tags.py +13 -6
  34. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/__init__.py +1 -1
  35. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/console/dotted.py +1 -1
  36. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/console/quiet.py +1 -1
  37. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/console/verbose.py +1 -1
  38. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/filelogger.py +5 -1
  39. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/librarylogger.py +18 -15
  40. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/logger.py +39 -43
  41. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/loggerhelper.py +28 -10
  42. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/loglevel.py +11 -13
  43. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/stdoutlogsplitter.py +1 -4
  44. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/model.py +16 -17
  45. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/argumentconverter.py +7 -2
  46. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/argumentspec.py +1 -1
  47. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/typeconverters.py +193 -95
  48. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/typeinfo.py +32 -21
  49. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/typevalidator.py +3 -1
  50. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/builder/transformers.py +1 -5
  51. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/context.py +5 -2
  52. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/model.py +10 -0
  53. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/namespace.py +51 -24
  54. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/resourcemodel.py +1 -1
  55. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/suiterunner.py +15 -14
  56. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/timeouts/timeout.py +1 -1
  57. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/userkeywordrunner.py +23 -9
  58. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/__init__.py +2 -0
  59. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/application.py +6 -6
  60. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/argumentparser.py +60 -50
  61. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/connectioncache.py +22 -21
  62. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/etreewrapper.py +12 -9
  63. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/misc.py +1 -1
  64. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/restreader.py +24 -17
  65. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/robottime.py +8 -2
  66. robotframework-7.4/src/robot/utils/secret.py +58 -0
  67. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/text.py +57 -5
  68. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/scopes.py +4 -1
  69. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/tablesetter.py +59 -5
  70. {robotframework-7.3.2 → robotframework-7.4}/src/robot/version.py +1 -1
  71. {robotframework-7.3.2 → robotframework-7.4}/src/robotframework.egg-info/PKG-INFO +2 -2
  72. {robotframework-7.3.2 → robotframework-7.4}/src/robotframework.egg-info/SOURCES.txt +4 -0
  73. robotframework-7.3.2/src/robot/api/logger.py +0 -152
  74. robotframework-7.3.2/src/robot/htmldata/libdoc/libdoc.html +0 -408
  75. {robotframework-7.3.2 → robotframework-7.4}/AUTHORS.rst +0 -0
  76. {robotframework-7.3.2 → robotframework-7.4}/BUILD.rst +0 -0
  77. {robotframework-7.3.2 → robotframework-7.4}/CONTRIBUTING.rst +0 -0
  78. {robotframework-7.3.2 → robotframework-7.4}/COPYRIGHT.txt +0 -0
  79. {robotframework-7.3.2 → robotframework-7.4}/INSTALL.rst +0 -0
  80. {robotframework-7.3.2 → robotframework-7.4}/LICENSE.txt +0 -0
  81. {robotframework-7.3.2 → robotframework-7.4}/MANIFEST.in +0 -0
  82. {robotframework-7.3.2 → robotframework-7.4}/README.rst +0 -0
  83. {robotframework-7.3.2 → robotframework-7.4}/pyproject.toml +0 -0
  84. {robotframework-7.3.2 → robotframework-7.4}/setup.cfg +0 -0
  85. {robotframework-7.3.2 → robotframework-7.4}/src/robot/__init__.py +0 -0
  86. {robotframework-7.3.2 → robotframework-7.4}/src/robot/__main__.py +0 -0
  87. {robotframework-7.3.2 → robotframework-7.4}/src/robot/api/deco.py +0 -0
  88. {robotframework-7.3.2 → robotframework-7.4}/src/robot/api/exceptions.py +0 -0
  89. {robotframework-7.3.2 → robotframework-7.4}/src/robot/api/parsing.py +0 -0
  90. {robotframework-7.3.2 → robotframework-7.4}/src/robot/api/py.typed +0 -0
  91. {robotframework-7.3.2 → robotframework-7.4}/src/robot/conf/__init__.py +0 -0
  92. {robotframework-7.3.2 → robotframework-7.4}/src/robot/conf/gatherfailed.py +0 -0
  93. {robotframework-7.3.2 → robotframework-7.4}/src/robot/conf/languages.py +0 -0
  94. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/__init__.py +0 -0
  95. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/common/__init__.py +0 -0
  96. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/common/js_disabled.css +0 -0
  97. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/common/storage.js +0 -0
  98. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/jsonwriter.py +0 -0
  99. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/lib/__init__.py +0 -0
  100. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/lib/jquery.highlight.min.js +0 -0
  101. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/lib/jquery.min.js +0 -0
  102. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/lib/jquery.tablesorter.min.js +0 -0
  103. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/lib/jquery.tmpl.min.js +0 -0
  104. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/lib/jsxcompressor.min.js +0 -0
  105. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/libdoc/__init__.py +0 -0
  106. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/__init__.py +0 -0
  107. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/doc_formatting.css +0 -0
  108. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/fileloading.js +0 -0
  109. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/print.css +0 -0
  110. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/report.css +0 -0
  111. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/testdata.js +0 -0
  112. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/rebot/util.js +0 -0
  113. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/template.py +0 -0
  114. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/testdoc/__init__.py +0 -0
  115. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/testdoc/testdoc.css +0 -0
  116. {robotframework-7.3.2 → robotframework-7.4}/src/robot/htmldata/testdoc/testdoc.html +0 -0
  117. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdoc.py +0 -0
  118. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/__init__.py +0 -0
  119. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/builder.py +0 -0
  120. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/consoleviewer.py +0 -0
  121. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/datatypes.py +0 -0
  122. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/htmlutils.py +0 -0
  123. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/htmlwriter.py +0 -0
  124. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/jsonbuilder.py +0 -0
  125. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/jsonwriter.py +0 -0
  126. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/languages.py +0 -0
  127. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/output.py +0 -0
  128. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/writer.py +0 -0
  129. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/xmlbuilder.py +0 -0
  130. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libdocpkg/xmlwriter.py +0 -0
  131. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Easter.py +0 -0
  132. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Remote.py +0 -0
  133. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/Telnet.py +0 -0
  134. {robotframework-7.3.2 → robotframework-7.4}/src/robot/libraries/__init__.py +0 -0
  135. {robotframework-7.3.2 → robotframework-7.4}/src/robot/logo.png +0 -0
  136. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/__init__.py +0 -0
  137. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/body.py +0 -0
  138. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/configurer.py +0 -0
  139. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/control.py +0 -0
  140. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/filter.py +0 -0
  141. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/fixture.py +0 -0
  142. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/itemlist.py +0 -0
  143. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/keyword.py +0 -0
  144. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/message.py +0 -0
  145. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/metadata.py +0 -0
  146. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/modelobject.py +0 -0
  147. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/modifier.py +0 -0
  148. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/namepatterns.py +0 -0
  149. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/statistics.py +0 -0
  150. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/stats.py +0 -0
  151. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/suitestatistics.py +0 -0
  152. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/tagsetter.py +0 -0
  153. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/tagstatistics.py +0 -0
  154. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/testcase.py +0 -0
  155. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/testsuite.py +0 -0
  156. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/totalstatistics.py +0 -0
  157. {robotframework-7.3.2 → robotframework-7.4}/src/robot/model/visitor.py +0 -0
  158. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/console/__init__.py +0 -0
  159. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/console/highlighting.py +0 -0
  160. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/debugfile.py +0 -0
  161. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/jsonlogger.py +0 -0
  162. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/listeners.py +0 -0
  163. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/loggerapi.py +0 -0
  164. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/output.py +0 -0
  165. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/outputfile.py +0 -0
  166. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/pyloggingconf.py +0 -0
  167. {robotframework-7.3.2 → robotframework-7.4}/src/robot/output/xmllogger.py +0 -0
  168. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/__init__.py +0 -0
  169. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/__init__.py +0 -0
  170. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/blocklexers.py +0 -0
  171. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/context.py +0 -0
  172. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/lexer.py +0 -0
  173. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/settings.py +0 -0
  174. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/statementlexers.py +0 -0
  175. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/tokenizer.py +0 -0
  176. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/lexer/tokens.py +0 -0
  177. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/model/__init__.py +0 -0
  178. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/model/blocks.py +0 -0
  179. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/model/statements.py +0 -0
  180. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/model/visitor.py +0 -0
  181. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/parser/__init__.py +0 -0
  182. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/parser/blockparsers.py +0 -0
  183. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/parser/fileparser.py +0 -0
  184. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/parser/parser.py +0 -0
  185. {robotframework-7.3.2 → robotframework-7.4}/src/robot/parsing/suitestructure.py +0 -0
  186. {robotframework-7.3.2 → robotframework-7.4}/src/robot/pythonpathsetter.py +0 -0
  187. {robotframework-7.3.2 → robotframework-7.4}/src/robot/rebot.py +0 -0
  188. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/__init__.py +0 -0
  189. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/expandkeywordmatcher.py +0 -0
  190. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/jsbuildingcontext.py +0 -0
  191. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/jsexecutionresult.py +0 -0
  192. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/jsmodelbuilders.py +0 -0
  193. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/jswriter.py +0 -0
  194. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/logreportwriters.py +0 -0
  195. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/outputwriter.py +0 -0
  196. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/resultwriter.py +0 -0
  197. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/stringcache.py +0 -0
  198. {robotframework-7.3.2 → robotframework-7.4}/src/robot/reporting/xunitwriter.py +0 -0
  199. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/__init__.py +0 -0
  200. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/configurer.py +0 -0
  201. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/executionerrors.py +0 -0
  202. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/executionresult.py +0 -0
  203. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/flattenkeywordmatcher.py +0 -0
  204. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/keywordremover.py +0 -0
  205. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/merger.py +0 -0
  206. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/messagefilter.py +0 -0
  207. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/modeldeprecation.py +0 -0
  208. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/resultbuilder.py +0 -0
  209. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/suiteteardownfailed.py +0 -0
  210. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/visitor.py +0 -0
  211. {robotframework-7.3.2 → robotframework-7.4}/src/robot/result/xmlelementhandlers.py +0 -0
  212. {robotframework-7.3.2 → robotframework-7.4}/src/robot/run.py +0 -0
  213. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/__init__.py +0 -0
  214. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/__init__.py +0 -0
  215. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/argumentmapper.py +0 -0
  216. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/argumentparser.py +0 -0
  217. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/argumentresolver.py +0 -0
  218. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/argumentvalidator.py +0 -0
  219. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/customconverters.py +0 -0
  220. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/embedded.py +0 -0
  221. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/arguments/typeinfoparser.py +0 -0
  222. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/bodyrunner.py +0 -0
  223. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/builder/__init__.py +0 -0
  224. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/builder/builders.py +0 -0
  225. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/builder/parsers.py +0 -0
  226. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/builder/settings.py +0 -0
  227. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/dynamicmethods.py +0 -0
  228. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/importer.py +0 -0
  229. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/invalidkeyword.py +0 -0
  230. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/keywordfinder.py +0 -0
  231. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/keywordimplementation.py +0 -0
  232. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/librarykeyword.py +0 -0
  233. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/librarykeywordrunner.py +0 -0
  234. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/libraryscopes.py +0 -0
  235. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/outputcapture.py +0 -0
  236. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/randomizer.py +0 -0
  237. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/runkwregister.py +0 -0
  238. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/signalhandler.py +0 -0
  239. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/status.py +0 -0
  240. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/statusreporter.py +0 -0
  241. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/testlibraries.py +0 -0
  242. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/timeouts/__init__.py +0 -0
  243. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/timeouts/nosupport.py +0 -0
  244. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/timeouts/posix.py +0 -0
  245. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/timeouts/runner.py +0 -0
  246. {robotframework-7.3.2 → robotframework-7.4}/src/robot/running/timeouts/windows.py +0 -0
  247. {robotframework-7.3.2 → robotframework-7.4}/src/robot/testdoc.py +0 -0
  248. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/asserts.py +0 -0
  249. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/charwidth.py +0 -0
  250. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/compress.py +0 -0
  251. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/dotdict.py +0 -0
  252. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/encoding.py +0 -0
  253. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/encodingsniffer.py +0 -0
  254. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/error.py +0 -0
  255. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/escaping.py +0 -0
  256. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/filereader.py +0 -0
  257. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/frange.py +0 -0
  258. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/htmlformatters.py +0 -0
  259. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/importer.py +0 -0
  260. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/json.py +0 -0
  261. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/markuputils.py +0 -0
  262. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/markupwriters.py +0 -0
  263. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/match.py +0 -0
  264. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/normalizing.py +0 -0
  265. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/notset.py +0 -0
  266. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/platform.py +0 -0
  267. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/recommendations.py +0 -0
  268. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/robotenv.py +0 -0
  269. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/robotinspect.py +0 -0
  270. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/robotio.py +0 -0
  271. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/robotpath.py +0 -0
  272. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/robottypes.py +0 -0
  273. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/setter.py +0 -0
  274. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/sortable.py +0 -0
  275. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/typehints.py +0 -0
  276. {robotframework-7.3.2 → robotframework-7.4}/src/robot/utils/unic.py +0 -0
  277. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/__init__.py +0 -0
  278. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/assigner.py +0 -0
  279. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/evaluation.py +0 -0
  280. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/filesetter.py +0 -0
  281. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/finders.py +0 -0
  282. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/notfound.py +0 -0
  283. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/replacer.py +0 -0
  284. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/resolvable.py +0 -0
  285. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/search.py +0 -0
  286. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/store.py +0 -0
  287. {robotframework-7.3.2 → robotframework-7.4}/src/robot/variables/variables.py +0 -0
  288. {robotframework-7.3.2 → robotframework-7.4}/src/robotframework.egg-info/dependency_links.txt +0 -0
  289. {robotframework-7.3.2 → robotframework-7.4}/src/robotframework.egg-info/entry_points.txt +0 -0
  290. {robotframework-7.3.2 → robotframework-7.4}/src/robotframework.egg-info/top_level.txt +0 -0
  291. {robotframework-7.3.2 → robotframework-7.4}/tasks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robotframework
3
- Version: 7.3.2
3
+ Version: 7.4
4
4
  Summary: Generic automation framework for acceptance testing and robotic process automation (RPA)
5
5
  Home-page: https://robotframework.org
6
6
  Download-URL: https://pypi.org/project/robotframework
@@ -10,7 +10,7 @@ License: Apache License 2.0
10
10
  Project-URL: Source, https://github.com/robotframework/robotframework
11
11
  Project-URL: Issue Tracker, https://github.com/robotframework/robotframework/issues
12
12
  Project-URL: Documentation, https://robotframework.org/robotframework
13
- Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.3.2.rst
13
+ Project-URL: Release Notes, https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-7.4.rst
14
14
  Project-URL: Slack, http://slack.robotframework.org
15
15
  Keywords: robotframework automation testautomation rpa testing acceptancetesting atdd bdd
16
16
  Platform: any
@@ -6,7 +6,7 @@ from setuptools import find_packages, setup
6
6
 
7
7
  # Version number typically updated by running `invoke set-version <version>`.
8
8
  # Run `invoke --help set-version` or see tasks.py for details.
9
- VERSION = "7.3.2"
9
+ VERSION = "7.4"
10
10
  with open(join(dirname(abspath(__file__)), "README.rst")) as f:
11
11
  LONG_DESCRIPTION = f.read()
12
12
  base_url = "https://github.com/robotframework/robotframework/blob/master"
@@ -33,6 +33,9 @@ Currently exposed APIs are:
33
33
  * :mod:`.interfaces` module containing optional base classes that can be used
34
34
  when creating libraries and other extensions. New in Robot Framework 6.1.
35
35
 
36
+ * :mod:`.types` module with types exposed for libraries and other extensions.
37
+ New in Robot Framework 7.4.
38
+
36
39
  * :mod:`.parsing` module exposing the parsing APIs. This module is new in Robot
37
40
  Framework 4.0. Various parsing related functions and classes were exposed
38
41
  directly via :mod:`robot.api` already in Robot Framework 3.2, but they are
@@ -22,8 +22,8 @@ Module contents:
22
22
  - :class:`ListenerV2` for `listener interface version 2`__.
23
23
  - :class:`ListenerV3` for `listener interface version 3`__.
24
24
  - :class:`Parser` for `custom parsers`__. Also
25
- :class:`~robot.running.builder.settings.TestDefaults` used in ``Parser``
26
- type hints can be imported via this module if needed.
25
+ :class:`~robot.running.builder.settings.TestDefaults` used in :class:`Parser`
26
+ type hints is exposed via this module.
27
27
  - Type definitions used by the aforementioned classes.
28
28
 
29
29
  Main benefit of using these base classes is that editors can provide automatic
@@ -54,7 +54,7 @@ else:
54
54
  UnionType = type
55
55
 
56
56
  from robot import result, running
57
- from robot.running import TestDefaults, TestSuite
57
+ from robot.running import TestDefaults as TestDefaults, TestSuite
58
58
 
59
59
  # Type aliases used by DynamicLibrary and HybridLibrary.
60
60
  Name = str
@@ -0,0 +1,219 @@
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
+ """Public logging API for test libraries.
17
+
18
+ This module provides a public API for writing messages to the log file
19
+ and the console. Test libraries can use this API like::
20
+
21
+ logger.info('My message')
22
+
23
+ instead of logging through the standard output like::
24
+
25
+ print('*INFO* My message')
26
+
27
+ In addition to a programmatic interface being cleaner to use, this API
28
+ has a benefit that the log messages have accurate timestamps.
29
+
30
+ If the logging methods are used when Robot Framework is not running,
31
+ the messages are redirected to the standard Python ``logging`` module
32
+ using logger named ``RobotFramework``.
33
+
34
+ Log levels
35
+ ----------
36
+
37
+ It is possible to log messages using levels ``TRACE``, ``DEBUG``, ``INFO``,
38
+ ``WARN`` and ``ERROR`` either using the :func:`write` function or, more
39
+ commonly, with the log level specific :func:`trace`, :func:`debug`,
40
+ :func:`info`, :func:`warn`, :func:`error` functions.
41
+
42
+ The trace and debug messages are not logged by default, but that can be
43
+ changed with the ``--loglevel`` command line option. Warnings and errors are
44
+ automatically written also to the console and to the *Test Execution Errors*
45
+ section in the log file.
46
+
47
+ If libraries accept arbitrary log levels and use type hints, they can use
48
+ the :attr:`LogLevel` type alias as shown in the example_ below. It is new
49
+ in Robot Framework 7.4, but :attr:`LOGLEVEL` with same content exists since
50
+ Robot Framework 7.0 and will be available at least until in Robot Framework 9.0.
51
+
52
+ Logging HTML
53
+ ------------
54
+
55
+ All methods that are used for writing messages to the log file have an
56
+ optional ``html`` argument. If a message to be logged is supposed to be
57
+ shown as HTML, this argument should be set to ``True``. Alternatively,
58
+ :func:`write` accepts a pseudo log level ``HTML``.
59
+
60
+ Logging to console
61
+ ------------------
62
+
63
+ Normal messages are written only to the log file, not to the console.
64
+ There are, however, various ways to log to the console if needed:
65
+
66
+ - Messages with ``WARN`` and ``ERROR`` levels are shown on the console automatically.
67
+ - The :func:`console` function logs only to the console.
68
+ - The :func:`info` function supports logging both to the log file and to
69
+ the console by using the ``also_console`` argument.
70
+ - The :func:`write` function supports a pseudo log level ``CONSOLE`` that
71
+ can be used for logging both the log file and to the console.
72
+
73
+ Example
74
+ -------
75
+
76
+ ::
77
+
78
+ from robot.api import logger
79
+
80
+
81
+ def my_keyword(arg: str):
82
+ logger.debug(f"Got argument {arg}.")
83
+ logger.info("<b>Robot Framework</b> rocks!", html=True)
84
+
85
+
86
+ def another_keyword(arg: int, log_level: logger.LogLevel = "INFO"):
87
+ logger.write(f"Got argument {arg}.", log_level)
88
+ """
89
+
90
+ import logging
91
+ from typing import Literal
92
+
93
+ from robot.output import librarylogger
94
+ from robot.running.context import EXECUTION_CONTEXTS
95
+
96
+ # LOGLEVEL was introduced in RF 7.0 and naming convention compliant LogLevel in RF 7.4.
97
+ # TODO: Deprecate LOGLEVEL in RF 8.0. Update the above "Log levels" section as well.
98
+ LogLevel = Literal["TRACE", "DEBUG", "INFO", "CONSOLE", "HTML", "WARN", "ERROR"]
99
+ LOGLEVEL = LogLevel
100
+
101
+
102
+ def write(
103
+ msg: object,
104
+ level: LogLevel = "INFO",
105
+ html: bool = False,
106
+ console: "bool | None" = None,
107
+ ):
108
+ """Writes the message to the log file using the specified level.
109
+
110
+ :param msg: The message to be logged. Converted to string automatically.
111
+ :param level: Either the actual log level to use or a pseudo log level
112
+ ``HTML`` or ``CONSOLE``.
113
+ :param html: When set to ``True``, the message is considered to be HTML.
114
+ :param console: Controls writing the message to the console in addition
115
+ to the log file. If ``None`` (default), messages with the ``ERROR`` and
116
+ ``WARN`` level are written to the console and others are not.
117
+
118
+ Valid log levels are ``TRACE``, ``DEBUG``, ``INFO`` (default), ``WARN``,
119
+ and ``ERROR``. In addition to that, there are pseudo log levels ``HTML``
120
+ and ``CONSOLE`` for logging messages as HTML and for logging messages
121
+ both to the log file and to the console, respectively. With both of these
122
+ pseudo levels the level in the log file will be ``INFO``.
123
+
124
+ Instead of using this method, it is generally better to use the level
125
+ specific methods such as ``info`` and ``debug``.
126
+
127
+ The ``CONSOLE`` pseudo level is new in Robot Framework 6.1 and
128
+ the ``console`` argument is new in Robot Framework 7.4.
129
+ """
130
+ if EXECUTION_CONTEXTS.current is not None:
131
+ librarylogger.write(msg, level, html, console)
132
+ else:
133
+ logger = logging.getLogger("RobotFramework")
134
+ level_int = {
135
+ "TRACE": logging.DEBUG // 2,
136
+ "DEBUG": logging.DEBUG,
137
+ "INFO": logging.INFO,
138
+ "CONSOLE": logging.INFO,
139
+ "HTML": logging.INFO,
140
+ "WARN": logging.WARNING,
141
+ "ERROR": logging.ERROR,
142
+ }[level]
143
+ logger.log(level_int, msg)
144
+
145
+
146
+ def trace(msg: object, html: bool = False):
147
+ """Writes the message to the log file using the ``TRACE`` level.
148
+
149
+ :param msg: The message to be logged. Converted to string automatically.
150
+ :param html: When set to ``True``, the message is considered to be HTML.
151
+ """
152
+ write(msg, "TRACE", html)
153
+
154
+
155
+ def debug(msg: object, html: bool = False):
156
+ """Writes the message to the log file using the ``DEBUG`` level.
157
+
158
+ :param msg: The message to be logged. Converted to string automatically.
159
+ :param html: When set to ``True``, the message is considered to be HTML.
160
+ """
161
+ write(msg, "DEBUG", html)
162
+
163
+
164
+ def info(
165
+ msg: object,
166
+ html: bool = False,
167
+ also_console: bool = False,
168
+ console: bool = False,
169
+ ):
170
+ """Writes the message to the log file using the ``INFO`` level.
171
+
172
+ :param msg: The message to be logged. Converted to string automatically.
173
+ :param html: When set to ``True``, the message is considered to be HTML.
174
+ :param also_console: Deprecated alias for ``console``.
175
+ :param console: When ``True``, the message is logged to the console in
176
+ addition to the log file.
177
+
178
+ The ``console`` argument was introduced in Robot Framework 7.4 as
179
+ a replacement for the older ``also_console`` argument. Both are supported
180
+ for now, but ``also_console`` will be deprecated and removed in the future.
181
+ """
182
+ write(msg, "INFO", html, also_console or console)
183
+
184
+
185
+ def warn(msg: object, html: bool = False, console: bool = True):
186
+ """Writes the message to the log file using the ``WARN`` level.
187
+
188
+ :param msg: The message to be logged. Converted to string automatically.
189
+ :param html: When set to ``True``, the message is considered to be HTML.
190
+ :param console: When ``False``, the message is not logged to the console.
191
+ New in Robot Framework 7.4.
192
+ """
193
+ write(msg, "WARN", html, console)
194
+
195
+
196
+ def error(msg: object, html: bool = False, console: bool = True):
197
+ """Writes the message to the log file using the ``ERROR`` level.
198
+
199
+ :param msg: The message to be logged. Converted to string automatically.
200
+ :param html: When set to ``True``, the message is considered to be HTML.
201
+ :param console: When ``False``, the message is not logged to the console.
202
+ New in Robot Framework 7.4.
203
+ """
204
+ write(msg, "ERROR", html, console)
205
+
206
+
207
+ def console(
208
+ msg: object,
209
+ newline: bool = True,
210
+ stream: Literal["stdout", "stderr"] = "stdout",
211
+ ):
212
+ """Writes the message to the console.
213
+
214
+ :param msg: The message to be logged. Converted to string automatically.
215
+ :param newline: When ``True``, a newline character is automatically added
216
+ to the message.
217
+ :param stream: Name of the standard stream to write the message to.
218
+ """
219
+ librarylogger.console(msg, newline, stream)
@@ -0,0 +1,36 @@
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
+ """Types that libraries and other extensions can utilize.
17
+
18
+ - The :class:`~robot.utils.secret.Secret` class is used for encapsulating
19
+ passwords, tokens and other such secret information.
20
+
21
+ - :class:`KeywordName` and :class:`KeywordArguments` are used in type hints
22
+ with keywords executing other keywords. External tools can recognize special
23
+ arguments using these types and handle them adequately.
24
+
25
+ New in Robot Framework 7.4.
26
+ """
27
+
28
+ from robot.utils.secret import Secret as Secret
29
+
30
+
31
+ class KeywordName(str):
32
+ """Name of a keyword executed by another keyword."""
33
+
34
+
35
+ class KeywordArgument:
36
+ """Argument of a keyword executed by another keyword."""
@@ -174,7 +174,7 @@ class _BaseSettings:
174
174
  collect = show = level
175
175
  try:
176
176
  collect, show = LogLevel(collect), LogLevel(show)
177
- except DataError as err:
177
+ except ValueError as err:
178
178
  self._raise_invalid("LogLevel", str(err))
179
179
  if collect.priority > show.priority:
180
180
  self._raise_invalid(
@@ -119,6 +119,10 @@ TimeoutError = TimeoutExceeded
119
119
  class Information(RobotError):
120
120
  """Used by argument parser with --help or --version."""
121
121
 
122
+ def __init__(self, message: str, status_rc: bool = True):
123
+ super().__init__(message)
124
+ self.rc = INFO_PRINTED if status_rc else 0
125
+
122
126
 
123
127
  class ExecutionStatus(RobotError):
124
128
  """Base class for exceptions communicating status in test execution."""
@@ -52,10 +52,10 @@ class HtmlFileWriter:
52
52
 
53
53
 
54
54
  class Writer(ABC):
55
- handles_line = None
55
+ handles_lines: "str | tuple[str, ...]" = ()
56
56
 
57
- def handles(self, line: str):
58
- return line.startswith(self.handles_line)
57
+ def handles(self, line: str) -> bool:
58
+ return line.strip().startswith(self.handles_lines)
59
59
 
60
60
  @abstractmethod
61
61
  def write(self, line: str):
@@ -63,10 +63,7 @@ class Writer(ABC):
63
63
 
64
64
 
65
65
  class ModelWriter(Writer, ABC):
66
- handles_line = "<!-- JS MODEL -->"
67
-
68
- def handles(self, line: str):
69
- return line.strip().startswith(self.handles_line)
66
+ handles_lines = "<!-- JS MODEL -->"
70
67
 
71
68
 
72
69
  class LineWriter(Writer):
@@ -74,7 +71,7 @@ class LineWriter(Writer):
74
71
  def __init__(self, output: TextIOBase):
75
72
  self.output = output
76
73
 
77
- def handles(self, line: str):
74
+ def handles(self, line: str) -> bool:
78
75
  return True
79
76
 
80
77
  def write(self, line: str):
@@ -82,7 +79,7 @@ class LineWriter(Writer):
82
79
 
83
80
 
84
81
  class GeneratorWriter(Writer):
85
- handles_line = '<meta name="Generator" content='
82
+ handles_lines = ('<meta name="Generator" content=', "<meta name=Generator content")
86
83
 
87
84
  def __init__(self, writer: HtmlWriter):
88
85
  self.writer = writer
@@ -106,7 +103,7 @@ class InliningWriter(Writer, ABC):
106
103
 
107
104
 
108
105
  class JsFileWriter(InliningWriter):
109
- handles_line = '<script type="text/javascript" src='
106
+ handles_lines = '<script type="text/javascript" src='
110
107
 
111
108
  def write(self, line: str):
112
109
  src = re.search('src="([^"]+)"', line).group(1)
@@ -114,7 +111,7 @@ class JsFileWriter(InliningWriter):
114
111
 
115
112
 
116
113
  class CssFileWriter(InliningWriter):
117
- handles_line = '<link rel="stylesheet"'
114
+ handles_lines = '<link rel="stylesheet"'
118
115
 
119
116
  def write(self, line: str):
120
117
  href, media = re.search('href="([^"]+)" media="([^"]+)"', line).groups()