primary-api-models 0.1.0__py3-none-any.whl

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 (1580) hide show
  1. primary_api_models/__init__.py +53 -0
  2. primary_api_models/account_data.py +62 -0
  3. primary_api_models/commons.py +49 -0
  4. primary_api_models/detailed_instruments.py +11 -0
  5. primary_api_models/detailed_position.py +53 -0
  6. primary_api_models/enhanced_models.py +27 -0
  7. primary_api_models/enums.py +184 -0
  8. primary_api_models/instrument_details.py +48 -0
  9. primary_api_models/listed_instruments.py +14 -0
  10. primary_api_models/market_data.py +25 -0
  11. primary_api_models/order_report.py +34 -0
  12. primary_api_models/order_status.py +11 -0
  13. primary_api_models/positions.py +27 -0
  14. primary_api_models-0.1.0.dist-info/METADATA +7 -0
  15. primary_api_models-0.1.0.dist-info/RECORD +1580 -0
  16. primary_api_models-0.1.0.dist-info/WHEEL +5 -0
  17. primary_api_models-0.1.0.dist-info/top_level.txt +3 -0
  18. tests/conftest.py +6 -0
  19. tests/test_models.py +61 -0
  20. venv/Lib/site-packages/_pytest/__init__.py +13 -0
  21. venv/Lib/site-packages/_pytest/_argcomplete.py +117 -0
  22. venv/Lib/site-packages/_pytest/_code/__init__.py +26 -0
  23. venv/Lib/site-packages/_pytest/_code/code.py +1571 -0
  24. venv/Lib/site-packages/_pytest/_code/source.py +225 -0
  25. venv/Lib/site-packages/_pytest/_io/__init__.py +10 -0
  26. venv/Lib/site-packages/_pytest/_io/pprint.py +673 -0
  27. venv/Lib/site-packages/_pytest/_io/saferepr.py +130 -0
  28. venv/Lib/site-packages/_pytest/_io/terminalwriter.py +258 -0
  29. venv/Lib/site-packages/_pytest/_io/wcwidth.py +57 -0
  30. venv/Lib/site-packages/_pytest/_py/__init__.py +0 -0
  31. venv/Lib/site-packages/_pytest/_py/error.py +119 -0
  32. venv/Lib/site-packages/_pytest/_py/path.py +1475 -0
  33. venv/Lib/site-packages/_pytest/_version.py +24 -0
  34. venv/Lib/site-packages/_pytest/assertion/__init__.py +208 -0
  35. venv/Lib/site-packages/_pytest/assertion/rewrite.py +1202 -0
  36. venv/Lib/site-packages/_pytest/assertion/truncate.py +137 -0
  37. venv/Lib/site-packages/_pytest/assertion/util.py +615 -0
  38. venv/Lib/site-packages/_pytest/cacheprovider.py +646 -0
  39. venv/Lib/site-packages/_pytest/capture.py +1144 -0
  40. venv/Lib/site-packages/_pytest/compat.py +314 -0
  41. venv/Lib/site-packages/_pytest/config/__init__.py +2203 -0
  42. venv/Lib/site-packages/_pytest/config/argparsing.py +578 -0
  43. venv/Lib/site-packages/_pytest/config/compat.py +85 -0
  44. venv/Lib/site-packages/_pytest/config/exceptions.py +15 -0
  45. venv/Lib/site-packages/_pytest/config/findpaths.py +350 -0
  46. venv/Lib/site-packages/_pytest/debugging.py +407 -0
  47. venv/Lib/site-packages/_pytest/deprecated.py +99 -0
  48. venv/Lib/site-packages/_pytest/doctest.py +736 -0
  49. venv/Lib/site-packages/_pytest/faulthandler.py +119 -0
  50. venv/Lib/site-packages/_pytest/fixtures.py +2047 -0
  51. venv/Lib/site-packages/_pytest/freeze_support.py +45 -0
  52. venv/Lib/site-packages/_pytest/helpconfig.py +293 -0
  53. venv/Lib/site-packages/_pytest/hookspec.py +1342 -0
  54. venv/Lib/site-packages/_pytest/junitxml.py +695 -0
  55. venv/Lib/site-packages/_pytest/legacypath.py +468 -0
  56. venv/Lib/site-packages/_pytest/logging.py +960 -0
  57. venv/Lib/site-packages/_pytest/main.py +1203 -0
  58. venv/Lib/site-packages/_pytest/mark/__init__.py +301 -0
  59. venv/Lib/site-packages/_pytest/mark/expression.py +353 -0
  60. venv/Lib/site-packages/_pytest/mark/structures.py +664 -0
  61. venv/Lib/site-packages/_pytest/monkeypatch.py +435 -0
  62. venv/Lib/site-packages/_pytest/nodes.py +772 -0
  63. venv/Lib/site-packages/_pytest/outcomes.py +308 -0
  64. venv/Lib/site-packages/_pytest/pastebin.py +117 -0
  65. venv/Lib/site-packages/_pytest/pathlib.py +1063 -0
  66. venv/Lib/site-packages/_pytest/py.typed +0 -0
  67. venv/Lib/site-packages/_pytest/pytester.py +1791 -0
  68. venv/Lib/site-packages/_pytest/pytester_assertions.py +74 -0
  69. venv/Lib/site-packages/_pytest/python.py +1772 -0
  70. venv/Lib/site-packages/_pytest/python_api.py +819 -0
  71. venv/Lib/site-packages/_pytest/raises.py +1517 -0
  72. venv/Lib/site-packages/_pytest/recwarn.py +367 -0
  73. venv/Lib/site-packages/_pytest/reports.py +694 -0
  74. venv/Lib/site-packages/_pytest/runner.py +580 -0
  75. venv/Lib/site-packages/_pytest/scope.py +91 -0
  76. venv/Lib/site-packages/_pytest/setuponly.py +98 -0
  77. venv/Lib/site-packages/_pytest/setupplan.py +39 -0
  78. venv/Lib/site-packages/_pytest/skipping.py +321 -0
  79. venv/Lib/site-packages/_pytest/stash.py +116 -0
  80. venv/Lib/site-packages/_pytest/stepwise.py +209 -0
  81. venv/Lib/site-packages/_pytest/subtests.py +411 -0
  82. venv/Lib/site-packages/_pytest/terminal.py +1763 -0
  83. venv/Lib/site-packages/_pytest/terminalprogress.py +30 -0
  84. venv/Lib/site-packages/_pytest/threadexception.py +152 -0
  85. venv/Lib/site-packages/_pytest/timing.py +95 -0
  86. venv/Lib/site-packages/_pytest/tmpdir.py +337 -0
  87. venv/Lib/site-packages/_pytest/tracemalloc.py +24 -0
  88. venv/Lib/site-packages/_pytest/unittest.py +632 -0
  89. venv/Lib/site-packages/_pytest/unraisableexception.py +163 -0
  90. venv/Lib/site-packages/_pytest/warning_types.py +172 -0
  91. venv/Lib/site-packages/_pytest/warnings.py +151 -0
  92. venv/Lib/site-packages/annotated_types/__init__.py +432 -0
  93. venv/Lib/site-packages/annotated_types/py.typed +0 -0
  94. venv/Lib/site-packages/annotated_types/test_cases.py +151 -0
  95. venv/Lib/site-packages/build/__init__.py +47 -0
  96. venv/Lib/site-packages/build/__main__.py +654 -0
  97. venv/Lib/site-packages/build/_builder.py +393 -0
  98. venv/Lib/site-packages/build/_compat/__init__.py +0 -0
  99. venv/Lib/site-packages/build/_compat/importlib.py +22 -0
  100. venv/Lib/site-packages/build/_compat/tarfile.py +31 -0
  101. venv/Lib/site-packages/build/_compat/tomllib.py +19 -0
  102. venv/Lib/site-packages/build/_ctx.py +105 -0
  103. venv/Lib/site-packages/build/_exceptions.py +69 -0
  104. venv/Lib/site-packages/build/_types.py +22 -0
  105. venv/Lib/site-packages/build/_util.py +68 -0
  106. venv/Lib/site-packages/build/env.py +507 -0
  107. venv/Lib/site-packages/build/py.typed +0 -0
  108. venv/Lib/site-packages/build/util.py +70 -0
  109. venv/Lib/site-packages/certifi/__init__.py +4 -0
  110. venv/Lib/site-packages/certifi/__main__.py +12 -0
  111. venv/Lib/site-packages/certifi/core.py +83 -0
  112. venv/Lib/site-packages/certifi/py.typed +0 -0
  113. venv/Lib/site-packages/charset_normalizer/__init__.py +48 -0
  114. venv/Lib/site-packages/charset_normalizer/__main__.py +6 -0
  115. venv/Lib/site-packages/charset_normalizer/api.py +988 -0
  116. venv/Lib/site-packages/charset_normalizer/cd.py +454 -0
  117. venv/Lib/site-packages/charset_normalizer/cli/__init__.py +8 -0
  118. venv/Lib/site-packages/charset_normalizer/cli/__main__.py +362 -0
  119. venv/Lib/site-packages/charset_normalizer/constant.py +2050 -0
  120. venv/Lib/site-packages/charset_normalizer/legacy.py +79 -0
  121. venv/Lib/site-packages/charset_normalizer/md.py +936 -0
  122. venv/Lib/site-packages/charset_normalizer/models.py +369 -0
  123. venv/Lib/site-packages/charset_normalizer/py.typed +0 -0
  124. venv/Lib/site-packages/charset_normalizer/utils.py +422 -0
  125. venv/Lib/site-packages/charset_normalizer/version.py +8 -0
  126. venv/Lib/site-packages/colorama/__init__.py +7 -0
  127. venv/Lib/site-packages/colorama/ansi.py +102 -0
  128. venv/Lib/site-packages/colorama/ansitowin32.py +277 -0
  129. venv/Lib/site-packages/colorama/initialise.py +121 -0
  130. venv/Lib/site-packages/colorama/tests/__init__.py +1 -0
  131. venv/Lib/site-packages/colorama/tests/ansi_test.py +76 -0
  132. venv/Lib/site-packages/colorama/tests/ansitowin32_test.py +294 -0
  133. venv/Lib/site-packages/colorama/tests/initialise_test.py +189 -0
  134. venv/Lib/site-packages/colorama/tests/isatty_test.py +57 -0
  135. venv/Lib/site-packages/colorama/tests/utils.py +49 -0
  136. venv/Lib/site-packages/colorama/tests/winterm_test.py +131 -0
  137. venv/Lib/site-packages/colorama/win32.py +180 -0
  138. venv/Lib/site-packages/colorama/winterm.py +195 -0
  139. venv/Lib/site-packages/docutils/__init__.py +341 -0
  140. venv/Lib/site-packages/docutils/__main__.py +103 -0
  141. venv/Lib/site-packages/docutils/core.py +855 -0
  142. venv/Lib/site-packages/docutils/examples.py +123 -0
  143. venv/Lib/site-packages/docutils/frontend.py +1178 -0
  144. venv/Lib/site-packages/docutils/io.py +716 -0
  145. venv/Lib/site-packages/docutils/languages/__init__.py +117 -0
  146. venv/Lib/site-packages/docutils/languages/af.py +58 -0
  147. venv/Lib/site-packages/docutils/languages/ar.py +60 -0
  148. venv/Lib/site-packages/docutils/languages/ca.py +65 -0
  149. venv/Lib/site-packages/docutils/languages/cs.py +60 -0
  150. venv/Lib/site-packages/docutils/languages/da.py +61 -0
  151. venv/Lib/site-packages/docutils/languages/de.py +58 -0
  152. venv/Lib/site-packages/docutils/languages/en.py +60 -0
  153. venv/Lib/site-packages/docutils/languages/eo.py +61 -0
  154. venv/Lib/site-packages/docutils/languages/es.py +58 -0
  155. venv/Lib/site-packages/docutils/languages/fa.py +60 -0
  156. venv/Lib/site-packages/docutils/languages/fi.py +60 -0
  157. venv/Lib/site-packages/docutils/languages/fr.py +58 -0
  158. venv/Lib/site-packages/docutils/languages/gl.py +62 -0
  159. venv/Lib/site-packages/docutils/languages/he.py +62 -0
  160. venv/Lib/site-packages/docutils/languages/it.py +58 -0
  161. venv/Lib/site-packages/docutils/languages/ja.py +60 -0
  162. venv/Lib/site-packages/docutils/languages/ka.py +58 -0
  163. venv/Lib/site-packages/docutils/languages/ko.py +60 -0
  164. venv/Lib/site-packages/docutils/languages/lt.py +60 -0
  165. venv/Lib/site-packages/docutils/languages/lv.py +59 -0
  166. venv/Lib/site-packages/docutils/languages/nl.py +60 -0
  167. venv/Lib/site-packages/docutils/languages/pl.py +60 -0
  168. venv/Lib/site-packages/docutils/languages/pt_br.py +60 -0
  169. venv/Lib/site-packages/docutils/languages/ru.py +58 -0
  170. venv/Lib/site-packages/docutils/languages/sk.py +58 -0
  171. venv/Lib/site-packages/docutils/languages/sv.py +59 -0
  172. venv/Lib/site-packages/docutils/languages/uk.py +58 -0
  173. venv/Lib/site-packages/docutils/languages/zh_cn.py +62 -0
  174. venv/Lib/site-packages/docutils/languages/zh_tw.py +61 -0
  175. venv/Lib/site-packages/docutils/nodes.py +3341 -0
  176. venv/Lib/site-packages/docutils/parsers/__init__.py +115 -0
  177. venv/Lib/site-packages/docutils/parsers/commonmark_wrapper.py +56 -0
  178. venv/Lib/site-packages/docutils/parsers/docutils_xml.py +194 -0
  179. venv/Lib/site-packages/docutils/parsers/null.py +24 -0
  180. venv/Lib/site-packages/docutils/parsers/recommonmark_wrapper.py +174 -0
  181. venv/Lib/site-packages/docutils/parsers/rst/__init__.py +414 -0
  182. venv/Lib/site-packages/docutils/parsers/rst/directives/__init__.py +480 -0
  183. venv/Lib/site-packages/docutils/parsers/rst/directives/admonitions.py +101 -0
  184. venv/Lib/site-packages/docutils/parsers/rst/directives/body.py +329 -0
  185. venv/Lib/site-packages/docutils/parsers/rst/directives/html.py +21 -0
  186. venv/Lib/site-packages/docutils/parsers/rst/directives/images.py +186 -0
  187. venv/Lib/site-packages/docutils/parsers/rst/directives/misc.py +690 -0
  188. venv/Lib/site-packages/docutils/parsers/rst/directives/parts.py +129 -0
  189. venv/Lib/site-packages/docutils/parsers/rst/directives/references.py +28 -0
  190. venv/Lib/site-packages/docutils/parsers/rst/directives/tables.py +523 -0
  191. venv/Lib/site-packages/docutils/parsers/rst/languages/__init__.py +63 -0
  192. venv/Lib/site-packages/docutils/parsers/rst/languages/af.py +107 -0
  193. venv/Lib/site-packages/docutils/parsers/rst/languages/ar.py +99 -0
  194. venv/Lib/site-packages/docutils/parsers/rst/languages/ca.py +130 -0
  195. venv/Lib/site-packages/docutils/parsers/rst/languages/cs.py +110 -0
  196. venv/Lib/site-packages/docutils/parsers/rst/languages/da.py +113 -0
  197. venv/Lib/site-packages/docutils/parsers/rst/languages/de.py +106 -0
  198. venv/Lib/site-packages/docutils/parsers/rst/languages/en.py +115 -0
  199. venv/Lib/site-packages/docutils/parsers/rst/languages/eo.py +118 -0
  200. venv/Lib/site-packages/docutils/parsers/rst/languages/es.py +121 -0
  201. venv/Lib/site-packages/docutils/parsers/rst/languages/fa.py +102 -0
  202. venv/Lib/site-packages/docutils/parsers/rst/languages/fi.py +98 -0
  203. venv/Lib/site-packages/docutils/parsers/rst/languages/fr.py +107 -0
  204. venv/Lib/site-packages/docutils/parsers/rst/languages/gl.py +106 -0
  205. venv/Lib/site-packages/docutils/parsers/rst/languages/he.py +110 -0
  206. venv/Lib/site-packages/docutils/parsers/rst/languages/it.py +98 -0
  207. venv/Lib/site-packages/docutils/parsers/rst/languages/ja.py +119 -0
  208. venv/Lib/site-packages/docutils/parsers/rst/languages/ka.py +89 -0
  209. venv/Lib/site-packages/docutils/parsers/rst/languages/ko.py +111 -0
  210. venv/Lib/site-packages/docutils/parsers/rst/languages/lt.py +109 -0
  211. venv/Lib/site-packages/docutils/parsers/rst/languages/lv.py +108 -0
  212. venv/Lib/site-packages/docutils/parsers/rst/languages/nl.py +113 -0
  213. venv/Lib/site-packages/docutils/parsers/rst/languages/pl.py +100 -0
  214. venv/Lib/site-packages/docutils/parsers/rst/languages/pt_br.py +109 -0
  215. venv/Lib/site-packages/docutils/parsers/rst/languages/ru.py +90 -0
  216. venv/Lib/site-packages/docutils/parsers/rst/languages/sk.py +96 -0
  217. venv/Lib/site-packages/docutils/parsers/rst/languages/sv.py +96 -0
  218. venv/Lib/site-packages/docutils/parsers/rst/languages/uk.py +91 -0
  219. venv/Lib/site-packages/docutils/parsers/rst/languages/zh_cn.py +104 -0
  220. venv/Lib/site-packages/docutils/parsers/rst/languages/zh_tw.py +109 -0
  221. venv/Lib/site-packages/docutils/parsers/rst/roles.py +450 -0
  222. venv/Lib/site-packages/docutils/parsers/rst/states.py +3266 -0
  223. venv/Lib/site-packages/docutils/parsers/rst/tableparser.py +543 -0
  224. venv/Lib/site-packages/docutils/readers/__init__.py +135 -0
  225. venv/Lib/site-packages/docutils/readers/doctree.py +50 -0
  226. venv/Lib/site-packages/docutils/readers/pep.py +55 -0
  227. venv/Lib/site-packages/docutils/readers/standalone.py +65 -0
  228. venv/Lib/site-packages/docutils/statemachine.py +1534 -0
  229. venv/Lib/site-packages/docutils/transforms/__init__.py +196 -0
  230. venv/Lib/site-packages/docutils/transforms/components.py +56 -0
  231. venv/Lib/site-packages/docutils/transforms/frontmatter.py +548 -0
  232. venv/Lib/site-packages/docutils/transforms/misc.py +143 -0
  233. venv/Lib/site-packages/docutils/transforms/parts.py +175 -0
  234. venv/Lib/site-packages/docutils/transforms/peps.py +315 -0
  235. venv/Lib/site-packages/docutils/transforms/references.py +990 -0
  236. venv/Lib/site-packages/docutils/transforms/universal.py +364 -0
  237. venv/Lib/site-packages/docutils/transforms/writer_aux.py +57 -0
  238. venv/Lib/site-packages/docutils/utils/__init__.py +850 -0
  239. venv/Lib/site-packages/docutils/utils/_roman_numerals.py +264 -0
  240. venv/Lib/site-packages/docutils/utils/_typing.py +39 -0
  241. venv/Lib/site-packages/docutils/utils/code_analyzer.py +140 -0
  242. venv/Lib/site-packages/docutils/utils/math/__init__.py +77 -0
  243. venv/Lib/site-packages/docutils/utils/math/latex2mathml.py +1252 -0
  244. venv/Lib/site-packages/docutils/utils/math/math2html.py +3166 -0
  245. venv/Lib/site-packages/docutils/utils/math/mathalphabet2unichar.py +892 -0
  246. venv/Lib/site-packages/docutils/utils/math/mathml_elements.py +482 -0
  247. venv/Lib/site-packages/docutils/utils/math/tex2mathml_extern.py +263 -0
  248. venv/Lib/site-packages/docutils/utils/math/tex2unichar.py +730 -0
  249. venv/Lib/site-packages/docutils/utils/math/unichar2tex.py +808 -0
  250. venv/Lib/site-packages/docutils/utils/punctuation_chars.py +123 -0
  251. venv/Lib/site-packages/docutils/utils/smartquotes.py +1006 -0
  252. venv/Lib/site-packages/docutils/utils/urischemes.py +138 -0
  253. venv/Lib/site-packages/docutils/writers/__init__.py +277 -0
  254. venv/Lib/site-packages/docutils/writers/_html_base.py +1895 -0
  255. venv/Lib/site-packages/docutils/writers/docutils_xml.py +191 -0
  256. venv/Lib/site-packages/docutils/writers/html4css1/__init__.py +964 -0
  257. venv/Lib/site-packages/docutils/writers/html5_polyglot/__init__.py +398 -0
  258. venv/Lib/site-packages/docutils/writers/latex2e/__init__.py +3417 -0
  259. venv/Lib/site-packages/docutils/writers/manpage.py +1353 -0
  260. venv/Lib/site-packages/docutils/writers/null.py +28 -0
  261. venv/Lib/site-packages/docutils/writers/odf_odt/__init__.py +3461 -0
  262. venv/Lib/site-packages/docutils/writers/odf_odt/prepstyles.py +80 -0
  263. venv/Lib/site-packages/docutils/writers/odf_odt/pygmentsformatter.py +106 -0
  264. venv/Lib/site-packages/docutils/writers/pep_html/__init__.py +102 -0
  265. venv/Lib/site-packages/docutils/writers/pseudoxml.py +41 -0
  266. venv/Lib/site-packages/docutils/writers/s5_html/__init__.py +354 -0
  267. venv/Lib/site-packages/docutils/writers/xetex/__init__.py +168 -0
  268. venv/Lib/site-packages/id/__init__.py +114 -0
  269. venv/Lib/site-packages/id/__main__.py +88 -0
  270. venv/Lib/site-packages/id/_internal/oidc/__init__.py +13 -0
  271. venv/Lib/site-packages/id/_internal/oidc/ambient.py +363 -0
  272. venv/Lib/site-packages/id/py.typed +4 -0
  273. venv/Lib/site-packages/idna/__init__.py +45 -0
  274. venv/Lib/site-packages/idna/codec.py +122 -0
  275. venv/Lib/site-packages/idna/compat.py +15 -0
  276. venv/Lib/site-packages/idna/core.py +440 -0
  277. venv/Lib/site-packages/idna/idnadata.py +4367 -0
  278. venv/Lib/site-packages/idna/intranges.py +57 -0
  279. venv/Lib/site-packages/idna/package_data.py +1 -0
  280. venv/Lib/site-packages/idna/py.typed +0 -0
  281. venv/Lib/site-packages/idna/uts46data.py +8384 -0
  282. venv/Lib/site-packages/iniconfig/__init__.py +249 -0
  283. venv/Lib/site-packages/iniconfig/_parse.py +163 -0
  284. venv/Lib/site-packages/iniconfig/_version.py +34 -0
  285. venv/Lib/site-packages/iniconfig/exceptions.py +16 -0
  286. venv/Lib/site-packages/iniconfig/py.typed +0 -0
  287. venv/Lib/site-packages/jaraco/classes/__init__.py +0 -0
  288. venv/Lib/site-packages/jaraco/classes/ancestry.py +76 -0
  289. venv/Lib/site-packages/jaraco/classes/meta.py +85 -0
  290. venv/Lib/site-packages/jaraco/classes/properties.py +241 -0
  291. venv/Lib/site-packages/jaraco/classes/py.typed +0 -0
  292. venv/Lib/site-packages/jaraco/context/__init__.py +422 -0
  293. venv/Lib/site-packages/jaraco/context/py.typed +0 -0
  294. venv/Lib/site-packages/jaraco/functools/__init__.py +722 -0
  295. venv/Lib/site-packages/jaraco/functools/__init__.pyi +123 -0
  296. venv/Lib/site-packages/jaraco/functools/py.typed +0 -0
  297. venv/Lib/site-packages/keyring/__init__.py +17 -0
  298. venv/Lib/site-packages/keyring/__main__.py +4 -0
  299. venv/Lib/site-packages/keyring/backend.py +300 -0
  300. venv/Lib/site-packages/keyring/backends/SecretService.py +120 -0
  301. venv/Lib/site-packages/keyring/backends/Windows.py +168 -0
  302. venv/Lib/site-packages/keyring/backends/__init__.py +0 -0
  303. venv/Lib/site-packages/keyring/backends/chainer.py +71 -0
  304. venv/Lib/site-packages/keyring/backends/fail.py +30 -0
  305. venv/Lib/site-packages/keyring/backends/kwallet.py +164 -0
  306. venv/Lib/site-packages/keyring/backends/libsecret.py +155 -0
  307. venv/Lib/site-packages/keyring/backends/macOS/__init__.py +85 -0
  308. venv/Lib/site-packages/keyring/backends/macOS/api.py +184 -0
  309. venv/Lib/site-packages/keyring/backends/null.py +20 -0
  310. venv/Lib/site-packages/keyring/cli.py +220 -0
  311. venv/Lib/site-packages/keyring/compat/__init__.py +7 -0
  312. venv/Lib/site-packages/keyring/compat/properties.py +169 -0
  313. venv/Lib/site-packages/keyring/compat/py312.py +9 -0
  314. venv/Lib/site-packages/keyring/completion.py +55 -0
  315. venv/Lib/site-packages/keyring/core.py +202 -0
  316. venv/Lib/site-packages/keyring/credentials.py +85 -0
  317. venv/Lib/site-packages/keyring/devpi_client.py +29 -0
  318. venv/Lib/site-packages/keyring/errors.py +67 -0
  319. venv/Lib/site-packages/keyring/http.py +39 -0
  320. venv/Lib/site-packages/keyring/py.typed +0 -0
  321. venv/Lib/site-packages/keyring/testing/__init__.py +0 -0
  322. venv/Lib/site-packages/keyring/testing/backend.py +200 -0
  323. venv/Lib/site-packages/keyring/testing/util.py +68 -0
  324. venv/Lib/site-packages/keyring/util/__init__.py +11 -0
  325. venv/Lib/site-packages/keyring/util/platform_.py +40 -0
  326. venv/Lib/site-packages/markdown_it/__init__.py +6 -0
  327. venv/Lib/site-packages/markdown_it/_compat.py +1 -0
  328. venv/Lib/site-packages/markdown_it/_punycode.py +67 -0
  329. venv/Lib/site-packages/markdown_it/cli/__init__.py +0 -0
  330. venv/Lib/site-packages/markdown_it/cli/parse.py +127 -0
  331. venv/Lib/site-packages/markdown_it/common/__init__.py +0 -0
  332. venv/Lib/site-packages/markdown_it/common/entities.py +5 -0
  333. venv/Lib/site-packages/markdown_it/common/html_blocks.py +69 -0
  334. venv/Lib/site-packages/markdown_it/common/html_re.py +39 -0
  335. venv/Lib/site-packages/markdown_it/common/normalize_url.py +81 -0
  336. venv/Lib/site-packages/markdown_it/common/utils.py +313 -0
  337. venv/Lib/site-packages/markdown_it/helpers/__init__.py +6 -0
  338. venv/Lib/site-packages/markdown_it/helpers/parse_link_destination.py +83 -0
  339. venv/Lib/site-packages/markdown_it/helpers/parse_link_label.py +44 -0
  340. venv/Lib/site-packages/markdown_it/helpers/parse_link_title.py +75 -0
  341. venv/Lib/site-packages/markdown_it/main.py +351 -0
  342. venv/Lib/site-packages/markdown_it/parser_block.py +113 -0
  343. venv/Lib/site-packages/markdown_it/parser_core.py +46 -0
  344. venv/Lib/site-packages/markdown_it/parser_inline.py +215 -0
  345. venv/Lib/site-packages/markdown_it/presets/__init__.py +48 -0
  346. venv/Lib/site-packages/markdown_it/presets/commonmark.py +75 -0
  347. venv/Lib/site-packages/markdown_it/presets/default.py +36 -0
  348. venv/Lib/site-packages/markdown_it/presets/zero.py +44 -0
  349. venv/Lib/site-packages/markdown_it/py.typed +1 -0
  350. venv/Lib/site-packages/markdown_it/renderer.py +356 -0
  351. venv/Lib/site-packages/markdown_it/ruler.py +275 -0
  352. venv/Lib/site-packages/markdown_it/rules_block/__init__.py +28 -0
  353. venv/Lib/site-packages/markdown_it/rules_block/blockquote.py +368 -0
  354. venv/Lib/site-packages/markdown_it/rules_block/code.py +36 -0
  355. venv/Lib/site-packages/markdown_it/rules_block/fence.py +146 -0
  356. venv/Lib/site-packages/markdown_it/rules_block/heading.py +69 -0
  357. venv/Lib/site-packages/markdown_it/rules_block/hr.py +56 -0
  358. venv/Lib/site-packages/markdown_it/rules_block/html_block.py +90 -0
  359. venv/Lib/site-packages/markdown_it/rules_block/lheading.py +86 -0
  360. venv/Lib/site-packages/markdown_it/rules_block/list.py +408 -0
  361. venv/Lib/site-packages/markdown_it/rules_block/paragraph.py +66 -0
  362. venv/Lib/site-packages/markdown_it/rules_block/reference.py +235 -0
  363. venv/Lib/site-packages/markdown_it/rules_block/state_block.py +261 -0
  364. venv/Lib/site-packages/markdown_it/rules_block/table.py +250 -0
  365. venv/Lib/site-packages/markdown_it/rules_core/__init__.py +19 -0
  366. venv/Lib/site-packages/markdown_it/rules_core/block.py +13 -0
  367. venv/Lib/site-packages/markdown_it/rules_core/inline.py +10 -0
  368. venv/Lib/site-packages/markdown_it/rules_core/linkify.py +149 -0
  369. venv/Lib/site-packages/markdown_it/rules_core/normalize.py +19 -0
  370. venv/Lib/site-packages/markdown_it/rules_core/replacements.py +127 -0
  371. venv/Lib/site-packages/markdown_it/rules_core/smartquotes.py +202 -0
  372. venv/Lib/site-packages/markdown_it/rules_core/state_core.py +25 -0
  373. venv/Lib/site-packages/markdown_it/rules_core/text_join.py +53 -0
  374. venv/Lib/site-packages/markdown_it/rules_inline/__init__.py +31 -0
  375. venv/Lib/site-packages/markdown_it/rules_inline/autolink.py +77 -0
  376. venv/Lib/site-packages/markdown_it/rules_inline/backticks.py +72 -0
  377. venv/Lib/site-packages/markdown_it/rules_inline/balance_pairs.py +138 -0
  378. venv/Lib/site-packages/markdown_it/rules_inline/emphasis.py +102 -0
  379. venv/Lib/site-packages/markdown_it/rules_inline/entity.py +53 -0
  380. venv/Lib/site-packages/markdown_it/rules_inline/escape.py +93 -0
  381. venv/Lib/site-packages/markdown_it/rules_inline/fragments_join.py +54 -0
  382. venv/Lib/site-packages/markdown_it/rules_inline/html_inline.py +43 -0
  383. venv/Lib/site-packages/markdown_it/rules_inline/image.py +148 -0
  384. venv/Lib/site-packages/markdown_it/rules_inline/link.py +149 -0
  385. venv/Lib/site-packages/markdown_it/rules_inline/linkify.py +62 -0
  386. venv/Lib/site-packages/markdown_it/rules_inline/newline.py +44 -0
  387. venv/Lib/site-packages/markdown_it/rules_inline/state_inline.py +167 -0
  388. venv/Lib/site-packages/markdown_it/rules_inline/strikethrough.py +173 -0
  389. venv/Lib/site-packages/markdown_it/rules_inline/text.py +23 -0
  390. venv/Lib/site-packages/markdown_it/token.py +178 -0
  391. venv/Lib/site-packages/markdown_it/tree.py +333 -0
  392. venv/Lib/site-packages/markdown_it/utils.py +194 -0
  393. venv/Lib/site-packages/mdurl/__init__.py +18 -0
  394. venv/Lib/site-packages/mdurl/_decode.py +104 -0
  395. venv/Lib/site-packages/mdurl/_encode.py +85 -0
  396. venv/Lib/site-packages/mdurl/_format.py +27 -0
  397. venv/Lib/site-packages/mdurl/_parse.py +304 -0
  398. venv/Lib/site-packages/mdurl/_url.py +14 -0
  399. venv/Lib/site-packages/mdurl/py.typed +1 -0
  400. venv/Lib/site-packages/more_itertools/__init__.py +6 -0
  401. venv/Lib/site-packages/more_itertools/__init__.pyi +2 -0
  402. venv/Lib/site-packages/more_itertools/more.py +5457 -0
  403. venv/Lib/site-packages/more_itertools/more.pyi +963 -0
  404. venv/Lib/site-packages/more_itertools/py.typed +0 -0
  405. venv/Lib/site-packages/more_itertools/recipes.py +1599 -0
  406. venv/Lib/site-packages/more_itertools/recipes.pyi +234 -0
  407. venv/Lib/site-packages/nh3/__init__.py +5 -0
  408. venv/Lib/site-packages/nh3/__init__.pyi +42 -0
  409. venv/Lib/site-packages/nh3/py.typed +0 -0
  410. venv/Lib/site-packages/packaging/__init__.py +15 -0
  411. venv/Lib/site-packages/packaging/_elffile.py +108 -0
  412. venv/Lib/site-packages/packaging/_manylinux.py +262 -0
  413. venv/Lib/site-packages/packaging/_musllinux.py +85 -0
  414. venv/Lib/site-packages/packaging/_parser.py +393 -0
  415. venv/Lib/site-packages/packaging/_structures.py +33 -0
  416. venv/Lib/site-packages/packaging/_tokenizer.py +193 -0
  417. venv/Lib/site-packages/packaging/dependency_groups.py +302 -0
  418. venv/Lib/site-packages/packaging/direct_url.py +325 -0
  419. venv/Lib/site-packages/packaging/errors.py +94 -0
  420. venv/Lib/site-packages/packaging/licenses/__init__.py +186 -0
  421. venv/Lib/site-packages/packaging/licenses/_spdx.py +799 -0
  422. venv/Lib/site-packages/packaging/markers.py +492 -0
  423. venv/Lib/site-packages/packaging/metadata.py +964 -0
  424. venv/Lib/site-packages/packaging/py.typed +0 -0
  425. venv/Lib/site-packages/packaging/pylock.py +905 -0
  426. venv/Lib/site-packages/packaging/requirements.py +129 -0
  427. venv/Lib/site-packages/packaging/specifiers.py +1943 -0
  428. venv/Lib/site-packages/packaging/tags.py +932 -0
  429. venv/Lib/site-packages/packaging/utils.py +296 -0
  430. venv/Lib/site-packages/packaging/version.py +1231 -0
  431. venv/Lib/site-packages/pip/__init__.py +13 -0
  432. venv/Lib/site-packages/pip/__main__.py +24 -0
  433. venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  434. venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
  435. venv/Lib/site-packages/pip/_internal/build_env.py +606 -0
  436. venv/Lib/site-packages/pip/_internal/cache.py +291 -0
  437. venv/Lib/site-packages/pip/_internal/cli/__init__.py +3 -0
  438. venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +184 -0
  439. venv/Lib/site-packages/pip/_internal/cli/base_command.py +255 -0
  440. venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1267 -0
  441. venv/Lib/site-packages/pip/_internal/cli/command_context.py +28 -0
  442. venv/Lib/site-packages/pip/_internal/cli/index_command.py +195 -0
  443. venv/Lib/site-packages/pip/_internal/cli/main.py +85 -0
  444. venv/Lib/site-packages/pip/_internal/cli/main_parser.py +136 -0
  445. venv/Lib/site-packages/pip/_internal/cli/parser.py +358 -0
  446. venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +153 -0
  447. venv/Lib/site-packages/pip/_internal/cli/req_command.py +447 -0
  448. venv/Lib/site-packages/pip/_internal/cli/spinners.py +235 -0
  449. venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
  450. venv/Lib/site-packages/pip/_internal/commands/__init__.py +139 -0
  451. venv/Lib/site-packages/pip/_internal/commands/cache.py +255 -0
  452. venv/Lib/site-packages/pip/_internal/commands/check.py +66 -0
  453. venv/Lib/site-packages/pip/_internal/commands/completion.py +136 -0
  454. venv/Lib/site-packages/pip/_internal/commands/configuration.py +288 -0
  455. venv/Lib/site-packages/pip/_internal/commands/debug.py +203 -0
  456. venv/Lib/site-packages/pip/_internal/commands/download.py +146 -0
  457. venv/Lib/site-packages/pip/_internal/commands/freeze.py +107 -0
  458. venv/Lib/site-packages/pip/_internal/commands/hash.py +58 -0
  459. venv/Lib/site-packages/pip/_internal/commands/help.py +40 -0
  460. venv/Lib/site-packages/pip/_internal/commands/index.py +166 -0
  461. venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
  462. venv/Lib/site-packages/pip/_internal/commands/install.py +810 -0
  463. venv/Lib/site-packages/pip/_internal/commands/list.py +398 -0
  464. venv/Lib/site-packages/pip/_internal/commands/lock.py +175 -0
  465. venv/Lib/site-packages/pip/_internal/commands/search.py +178 -0
  466. venv/Lib/site-packages/pip/_internal/commands/show.py +231 -0
  467. venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
  468. venv/Lib/site-packages/pip/_internal/commands/wheel.py +171 -0
  469. venv/Lib/site-packages/pip/_internal/configuration.py +396 -0
  470. venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
  471. venv/Lib/site-packages/pip/_internal/distributions/base.py +55 -0
  472. venv/Lib/site-packages/pip/_internal/distributions/installed.py +33 -0
  473. venv/Lib/site-packages/pip/_internal/distributions/sdist.py +164 -0
  474. venv/Lib/site-packages/pip/_internal/distributions/wheel.py +44 -0
  475. venv/Lib/site-packages/pip/_internal/exceptions.py +971 -0
  476. venv/Lib/site-packages/pip/_internal/index/__init__.py +1 -0
  477. venv/Lib/site-packages/pip/_internal/index/collector.py +488 -0
  478. venv/Lib/site-packages/pip/_internal/index/package_finder.py +1125 -0
  479. venv/Lib/site-packages/pip/_internal/index/sources.py +287 -0
  480. venv/Lib/site-packages/pip/_internal/locations/__init__.py +440 -0
  481. venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
  482. venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +218 -0
  483. venv/Lib/site-packages/pip/_internal/locations/base.py +82 -0
  484. venv/Lib/site-packages/pip/_internal/main.py +12 -0
  485. venv/Lib/site-packages/pip/_internal/metadata/__init__.py +169 -0
  486. venv/Lib/site-packages/pip/_internal/metadata/_json.py +87 -0
  487. venv/Lib/site-packages/pip/_internal/metadata/base.py +685 -0
  488. venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +6 -0
  489. venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +87 -0
  490. venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +229 -0
  491. venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +143 -0
  492. venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +298 -0
  493. venv/Lib/site-packages/pip/_internal/models/__init__.py +1 -0
  494. venv/Lib/site-packages/pip/_internal/models/candidate.py +25 -0
  495. venv/Lib/site-packages/pip/_internal/models/direct_url.py +227 -0
  496. venv/Lib/site-packages/pip/_internal/models/format_control.py +78 -0
  497. venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
  498. venv/Lib/site-packages/pip/_internal/models/installation_report.py +57 -0
  499. venv/Lib/site-packages/pip/_internal/models/link.py +617 -0
  500. venv/Lib/site-packages/pip/_internal/models/release_control.py +92 -0
  501. venv/Lib/site-packages/pip/_internal/models/scheme.py +25 -0
  502. venv/Lib/site-packages/pip/_internal/models/search_scope.py +126 -0
  503. venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +56 -0
  504. venv/Lib/site-packages/pip/_internal/models/target_python.py +122 -0
  505. venv/Lib/site-packages/pip/_internal/models/wheel.py +80 -0
  506. venv/Lib/site-packages/pip/_internal/network/__init__.py +1 -0
  507. venv/Lib/site-packages/pip/_internal/network/auth.py +568 -0
  508. venv/Lib/site-packages/pip/_internal/network/cache.py +128 -0
  509. venv/Lib/site-packages/pip/_internal/network/download.py +341 -0
  510. venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +215 -0
  511. venv/Lib/site-packages/pip/_internal/network/session.py +532 -0
  512. venv/Lib/site-packages/pip/_internal/network/utils.py +98 -0
  513. venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +61 -0
  514. venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  515. venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  516. venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +140 -0
  517. venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
  518. venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
  519. venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +38 -0
  520. venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +47 -0
  521. venv/Lib/site-packages/pip/_internal/operations/check.py +175 -0
  522. venv/Lib/site-packages/pip/_internal/operations/freeze.py +259 -0
  523. venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +1 -0
  524. venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +745 -0
  525. venv/Lib/site-packages/pip/_internal/operations/prepare.py +747 -0
  526. venv/Lib/site-packages/pip/_internal/pyproject.py +123 -0
  527. venv/Lib/site-packages/pip/_internal/req/__init__.py +103 -0
  528. venv/Lib/site-packages/pip/_internal/req/constructors.py +568 -0
  529. venv/Lib/site-packages/pip/_internal/req/pep723.py +41 -0
  530. venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py +75 -0
  531. venv/Lib/site-packages/pip/_internal/req/req_file.py +631 -0
  532. venv/Lib/site-packages/pip/_internal/req/req_install.py +828 -0
  533. venv/Lib/site-packages/pip/_internal/req/req_set.py +81 -0
  534. venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +639 -0
  535. venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  536. venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
  537. venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  538. venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +598 -0
  539. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  540. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +142 -0
  541. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +591 -0
  542. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +856 -0
  543. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +166 -0
  544. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +285 -0
  545. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +98 -0
  546. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +251 -0
  547. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +332 -0
  548. venv/Lib/site-packages/pip/_internal/self_outdated_check.py +255 -0
  549. venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  550. venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
  551. venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
  552. venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
  553. venv/Lib/site-packages/pip/_internal/utils/compat.py +85 -0
  554. venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +201 -0
  555. venv/Lib/site-packages/pip/_internal/utils/datetime.py +28 -0
  556. venv/Lib/site-packages/pip/_internal/utils/deprecation.py +126 -0
  557. venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
  558. venv/Lib/site-packages/pip/_internal/utils/egg_link.py +81 -0
  559. venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +88 -0
  560. venv/Lib/site-packages/pip/_internal/utils/filesystem.py +203 -0
  561. venv/Lib/site-packages/pip/_internal/utils/filetypes.py +24 -0
  562. venv/Lib/site-packages/pip/_internal/utils/glibc.py +102 -0
  563. venv/Lib/site-packages/pip/_internal/utils/hashes.py +150 -0
  564. venv/Lib/site-packages/pip/_internal/utils/logging.py +396 -0
  565. venv/Lib/site-packages/pip/_internal/utils/misc.py +771 -0
  566. venv/Lib/site-packages/pip/_internal/utils/packaging.py +44 -0
  567. venv/Lib/site-packages/pip/_internal/utils/pylock.py +116 -0
  568. venv/Lib/site-packages/pip/_internal/utils/retry.py +45 -0
  569. venv/Lib/site-packages/pip/_internal/utils/subprocess.py +248 -0
  570. venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +294 -0
  571. venv/Lib/site-packages/pip/_internal/utils/unpacking.py +362 -0
  572. venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
  573. venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +105 -0
  574. venv/Lib/site-packages/pip/_internal/utils/wheel.py +132 -0
  575. venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
  576. venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +130 -0
  577. venv/Lib/site-packages/pip/_internal/vcs/git.py +571 -0
  578. venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +186 -0
  579. venv/Lib/site-packages/pip/_internal/vcs/subversion.py +335 -0
  580. venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +695 -0
  581. venv/Lib/site-packages/pip/_internal/wheel_builder.py +261 -0
  582. venv/Lib/site-packages/pip/_vendor/__init__.py +117 -0
  583. venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +32 -0
  584. venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +70 -0
  585. venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +167 -0
  586. venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +75 -0
  587. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +8 -0
  588. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +145 -0
  589. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +48 -0
  590. venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +511 -0
  591. venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +121 -0
  592. venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +157 -0
  593. venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed +0 -0
  594. venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +146 -0
  595. venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +43 -0
  596. venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
  597. venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
  598. venv/Lib/site-packages/pip/_vendor/certifi/core.py +83 -0
  599. venv/Lib/site-packages/pip/_vendor/certifi/py.typed +0 -0
  600. venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py +13 -0
  601. venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py +65 -0
  602. venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py +209 -0
  603. venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +59 -0
  604. venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +62 -0
  605. venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +9 -0
  606. venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed +0 -0
  607. venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +33 -0
  608. venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1137 -0
  609. venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
  610. venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +447 -0
  611. venv/Lib/site-packages/pip/_vendor/distlib/util.py +1984 -0
  612. venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
  613. venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
  614. venv/Lib/site-packages/pip/_vendor/distro/distro.py +1403 -0
  615. venv/Lib/site-packages/pip/_vendor/distro/py.typed +0 -0
  616. venv/Lib/site-packages/pip/_vendor/idna/__init__.py +45 -0
  617. venv/Lib/site-packages/pip/_vendor/idna/codec.py +122 -0
  618. venv/Lib/site-packages/pip/_vendor/idna/compat.py +15 -0
  619. venv/Lib/site-packages/pip/_vendor/idna/core.py +437 -0
  620. venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +4309 -0
  621. venv/Lib/site-packages/pip/_vendor/idna/intranges.py +57 -0
  622. venv/Lib/site-packages/pip/_vendor/idna/package_data.py +1 -0
  623. venv/Lib/site-packages/pip/_vendor/idna/py.typed +0 -0
  624. venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8841 -0
  625. venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +55 -0
  626. venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
  627. venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +170 -0
  628. venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +929 -0
  629. venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +15 -0
  630. venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py +108 -0
  631. venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +262 -0
  632. venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +85 -0
  633. venv/Lib/site-packages/pip/_vendor/packaging/_parser.py +365 -0
  634. venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +69 -0
  635. venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py +193 -0
  636. venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py +147 -0
  637. venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py +799 -0
  638. venv/Lib/site-packages/pip/_vendor/packaging/markers.py +388 -0
  639. venv/Lib/site-packages/pip/_vendor/packaging/metadata.py +978 -0
  640. venv/Lib/site-packages/pip/_vendor/packaging/py.typed +0 -0
  641. venv/Lib/site-packages/pip/_vendor/packaging/pylock.py +635 -0
  642. venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +86 -0
  643. venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +1068 -0
  644. venv/Lib/site-packages/pip/_vendor/packaging/tags.py +651 -0
  645. venv/Lib/site-packages/pip/_vendor/packaging/utils.py +158 -0
  646. venv/Lib/site-packages/pip/_vendor/packaging/version.py +792 -0
  647. venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3676 -0
  648. venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +631 -0
  649. venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +55 -0
  650. venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +249 -0
  651. venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +299 -0
  652. venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +146 -0
  653. venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed +0 -0
  654. venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +272 -0
  655. venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +34 -0
  656. venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +278 -0
  657. venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
  658. venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
  659. venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
  660. venv/Lib/site-packages/pip/_vendor/pygments/filter.py +70 -0
  661. venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
  662. venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +129 -0
  663. venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +157 -0
  664. venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
  665. venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +963 -0
  666. venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
  667. venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +602 -0
  668. venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1201 -0
  669. venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
  670. venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +72 -0
  671. venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
  672. venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
  673. venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +247 -0
  674. venv/Lib/site-packages/pip/_vendor/pygments/style.py +203 -0
  675. venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +61 -0
  676. venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py +54 -0
  677. venv/Lib/site-packages/pip/_vendor/pygments/token.py +214 -0
  678. venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
  679. venv/Lib/site-packages/pip/_vendor/pygments/util.py +324 -0
  680. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +31 -0
  681. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +410 -0
  682. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +21 -0
  683. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +389 -0
  684. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed +0 -0
  685. venv/Lib/site-packages/pip/_vendor/requests/__init__.py +179 -0
  686. venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
  687. venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
  688. venv/Lib/site-packages/pip/_vendor/requests/adapters.py +696 -0
  689. venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
  690. venv/Lib/site-packages/pip/_vendor/requests/auth.py +314 -0
  691. venv/Lib/site-packages/pip/_vendor/requests/certs.py +17 -0
  692. venv/Lib/site-packages/pip/_vendor/requests/compat.py +90 -0
  693. venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
  694. venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +151 -0
  695. venv/Lib/site-packages/pip/_vendor/requests/help.py +127 -0
  696. venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
  697. venv/Lib/site-packages/pip/_vendor/requests/models.py +1039 -0
  698. venv/Lib/site-packages/pip/_vendor/requests/packages.py +25 -0
  699. venv/Lib/site-packages/pip/_vendor/requests/sessions.py +831 -0
  700. venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
  701. venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
  702. venv/Lib/site-packages/pip/_vendor/requests/utils.py +1086 -0
  703. venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +27 -0
  704. venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +196 -0
  705. venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed +0 -0
  706. venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +55 -0
  707. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +27 -0
  708. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +47 -0
  709. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +48 -0
  710. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +57 -0
  711. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +627 -0
  712. venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +209 -0
  713. venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
  714. venv/Lib/site-packages/pip/_vendor/rich/__main__.py +245 -0
  715. venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +454 -0
  716. venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
  717. venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
  718. venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
  719. venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
  720. venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
  721. venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +268 -0
  722. venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
  723. venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
  724. venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
  725. venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
  726. venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
  727. venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +153 -0
  728. venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
  729. venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
  730. venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
  731. venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +661 -0
  732. venv/Lib/site-packages/pip/_vendor/rich/_windows.py +71 -0
  733. venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
  734. venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +93 -0
  735. venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
  736. venv/Lib/site-packages/pip/_vendor/rich/align.py +306 -0
  737. venv/Lib/site-packages/pip/_vendor/rich/ansi.py +241 -0
  738. venv/Lib/site-packages/pip/_vendor/rich/bar.py +93 -0
  739. venv/Lib/site-packages/pip/_vendor/rich/box.py +474 -0
  740. venv/Lib/site-packages/pip/_vendor/rich/cells.py +174 -0
  741. venv/Lib/site-packages/pip/_vendor/rich/color.py +621 -0
  742. venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
  743. venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
  744. venv/Lib/site-packages/pip/_vendor/rich/console.py +2680 -0
  745. venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
  746. venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
  747. venv/Lib/site-packages/pip/_vendor/rich/control.py +219 -0
  748. venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +193 -0
  749. venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +39 -0
  750. venv/Lib/site-packages/pip/_vendor/rich/emoji.py +91 -0
  751. venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
  752. venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
  753. venv/Lib/site-packages/pip/_vendor/rich/filesize.py +88 -0
  754. venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
  755. venv/Lib/site-packages/pip/_vendor/rich/json.py +139 -0
  756. venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
  757. venv/Lib/site-packages/pip/_vendor/rich/layout.py +442 -0
  758. venv/Lib/site-packages/pip/_vendor/rich/live.py +400 -0
  759. venv/Lib/site-packages/pip/_vendor/rich/live_render.py +106 -0
  760. venv/Lib/site-packages/pip/_vendor/rich/logging.py +297 -0
  761. venv/Lib/site-packages/pip/_vendor/rich/markup.py +251 -0
  762. venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
  763. venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
  764. venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
  765. venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
  766. venv/Lib/site-packages/pip/_vendor/rich/panel.py +317 -0
  767. venv/Lib/site-packages/pip/_vendor/rich/pretty.py +1016 -0
  768. venv/Lib/site-packages/pip/_vendor/rich/progress.py +1715 -0
  769. venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +223 -0
  770. venv/Lib/site-packages/pip/_vendor/rich/prompt.py +400 -0
  771. venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
  772. venv/Lib/site-packages/pip/_vendor/rich/py.typed +0 -0
  773. venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
  774. venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
  775. venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
  776. venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
  777. venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
  778. venv/Lib/site-packages/pip/_vendor/rich/segment.py +752 -0
  779. venv/Lib/site-packages/pip/_vendor/rich/spinner.py +132 -0
  780. venv/Lib/site-packages/pip/_vendor/rich/status.py +131 -0
  781. venv/Lib/site-packages/pip/_vendor/rich/style.py +792 -0
  782. venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
  783. venv/Lib/site-packages/pip/_vendor/rich/syntax.py +985 -0
  784. venv/Lib/site-packages/pip/_vendor/rich/table.py +1006 -0
  785. venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
  786. venv/Lib/site-packages/pip/_vendor/rich/text.py +1361 -0
  787. venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
  788. venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
  789. venv/Lib/site-packages/pip/_vendor/rich/traceback.py +899 -0
  790. venv/Lib/site-packages/pip/_vendor/rich/tree.py +257 -0
  791. venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +8 -0
  792. venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +777 -0
  793. venv/Lib/site-packages/pip/_vendor/tomli/_re.py +115 -0
  794. venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
  795. venv/Lib/site-packages/pip/_vendor/tomli/py.typed +1 -0
  796. venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py +4 -0
  797. venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py +229 -0
  798. venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed +1 -0
  799. venv/Lib/site-packages/pip/_vendor/truststore/__init__.py +36 -0
  800. venv/Lib/site-packages/pip/_vendor/truststore/_api.py +341 -0
  801. venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +571 -0
  802. venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py +68 -0
  803. venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py +31 -0
  804. venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +567 -0
  805. venv/Lib/site-packages/pip/_vendor/truststore/py.typed +0 -0
  806. venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
  807. venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +355 -0
  808. venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
  809. venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
  810. venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1140 -0
  811. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  812. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
  813. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  814. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
  815. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
  816. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
  817. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
  818. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
  819. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
  820. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
  821. venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
  822. venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
  823. venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
  824. venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
  825. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  826. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
  827. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
  828. venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
  829. venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +540 -0
  830. venv/Lib/site-packages/pip/_vendor/urllib3/request.py +191 -0
  831. venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
  832. venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
  833. venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
  834. venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
  835. venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
  836. venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
  837. venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
  838. venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +622 -0
  839. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +504 -0
  840. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
  841. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
  842. venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
  843. venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
  844. venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
  845. venv/Lib/site-packages/pip/py.typed +4 -0
  846. venv/Lib/site-packages/pluggy/__init__.py +30 -0
  847. venv/Lib/site-packages/pluggy/_callers.py +169 -0
  848. venv/Lib/site-packages/pluggy/_hooks.py +714 -0
  849. venv/Lib/site-packages/pluggy/_manager.py +523 -0
  850. venv/Lib/site-packages/pluggy/_result.py +107 -0
  851. venv/Lib/site-packages/pluggy/_tracing.py +72 -0
  852. venv/Lib/site-packages/pluggy/_version.py +21 -0
  853. venv/Lib/site-packages/pluggy/_warnings.py +27 -0
  854. venv/Lib/site-packages/pluggy/py.typed +0 -0
  855. venv/Lib/site-packages/py.py +15 -0
  856. venv/Lib/site-packages/pydantic/__init__.py +456 -0
  857. venv/Lib/site-packages/pydantic/_internal/__init__.py +0 -0
  858. venv/Lib/site-packages/pydantic/_internal/_config.py +386 -0
  859. venv/Lib/site-packages/pydantic/_internal/_core_metadata.py +97 -0
  860. venv/Lib/site-packages/pydantic/_internal/_core_utils.py +174 -0
  861. venv/Lib/site-packages/pydantic/_internal/_dataclasses.py +315 -0
  862. venv/Lib/site-packages/pydantic/_internal/_decorators.py +873 -0
  863. venv/Lib/site-packages/pydantic/_internal/_decorators_v1.py +174 -0
  864. venv/Lib/site-packages/pydantic/_internal/_discriminated_union.py +494 -0
  865. venv/Lib/site-packages/pydantic/_internal/_docs_extraction.py +113 -0
  866. venv/Lib/site-packages/pydantic/_internal/_fields.py +729 -0
  867. venv/Lib/site-packages/pydantic/_internal/_forward_ref.py +23 -0
  868. venv/Lib/site-packages/pydantic/_internal/_generate_schema.py +2934 -0
  869. venv/Lib/site-packages/pydantic/_internal/_generics.py +530 -0
  870. venv/Lib/site-packages/pydantic/_internal/_git.py +27 -0
  871. venv/Lib/site-packages/pydantic/_internal/_import_utils.py +20 -0
  872. venv/Lib/site-packages/pydantic/_internal/_internal_dataclass.py +7 -0
  873. venv/Lib/site-packages/pydantic/_internal/_known_annotated_metadata.py +403 -0
  874. venv/Lib/site-packages/pydantic/_internal/_mock_val_ser.py +228 -0
  875. venv/Lib/site-packages/pydantic/_internal/_model_construction.py +868 -0
  876. venv/Lib/site-packages/pydantic/_internal/_namespace_utils.py +293 -0
  877. venv/Lib/site-packages/pydantic/_internal/_repr.py +124 -0
  878. venv/Lib/site-packages/pydantic/_internal/_schema_gather.py +212 -0
  879. venv/Lib/site-packages/pydantic/_internal/_schema_generation_shared.py +125 -0
  880. venv/Lib/site-packages/pydantic/_internal/_serializers.py +53 -0
  881. venv/Lib/site-packages/pydantic/_internal/_signature.py +189 -0
  882. venv/Lib/site-packages/pydantic/_internal/_typing_extra.py +785 -0
  883. venv/Lib/site-packages/pydantic/_internal/_utils.py +446 -0
  884. venv/Lib/site-packages/pydantic/_internal/_validate_call.py +141 -0
  885. venv/Lib/site-packages/pydantic/_internal/_validators.py +534 -0
  886. venv/Lib/site-packages/pydantic/_migration.py +316 -0
  887. venv/Lib/site-packages/pydantic/alias_generators.py +62 -0
  888. venv/Lib/site-packages/pydantic/aliases.py +135 -0
  889. venv/Lib/site-packages/pydantic/annotated_handlers.py +122 -0
  890. venv/Lib/site-packages/pydantic/class_validators.py +5 -0
  891. venv/Lib/site-packages/pydantic/color.py +604 -0
  892. venv/Lib/site-packages/pydantic/config.py +1296 -0
  893. venv/Lib/site-packages/pydantic/dataclasses.py +413 -0
  894. venv/Lib/site-packages/pydantic/datetime_parse.py +5 -0
  895. venv/Lib/site-packages/pydantic/decorator.py +5 -0
  896. venv/Lib/site-packages/pydantic/deprecated/__init__.py +0 -0
  897. venv/Lib/site-packages/pydantic/deprecated/class_validators.py +256 -0
  898. venv/Lib/site-packages/pydantic/deprecated/config.py +72 -0
  899. venv/Lib/site-packages/pydantic/deprecated/copy_internals.py +224 -0
  900. venv/Lib/site-packages/pydantic/deprecated/decorator.py +284 -0
  901. venv/Lib/site-packages/pydantic/deprecated/json.py +141 -0
  902. venv/Lib/site-packages/pydantic/deprecated/parse.py +80 -0
  903. venv/Lib/site-packages/pydantic/deprecated/tools.py +103 -0
  904. venv/Lib/site-packages/pydantic/env_settings.py +5 -0
  905. venv/Lib/site-packages/pydantic/error_wrappers.py +5 -0
  906. venv/Lib/site-packages/pydantic/errors.py +189 -0
  907. venv/Lib/site-packages/pydantic/experimental/__init__.py +1 -0
  908. venv/Lib/site-packages/pydantic/experimental/arguments_schema.py +44 -0
  909. venv/Lib/site-packages/pydantic/experimental/missing_sentinel.py +5 -0
  910. venv/Lib/site-packages/pydantic/experimental/pipeline.py +663 -0
  911. venv/Lib/site-packages/pydantic/fields.py +1892 -0
  912. venv/Lib/site-packages/pydantic/functional_serializers.py +470 -0
  913. venv/Lib/site-packages/pydantic/functional_validators.py +889 -0
  914. venv/Lib/site-packages/pydantic/generics.py +5 -0
  915. venv/Lib/site-packages/pydantic/json.py +5 -0
  916. venv/Lib/site-packages/pydantic/json_schema.py +2911 -0
  917. venv/Lib/site-packages/pydantic/main.py +1838 -0
  918. venv/Lib/site-packages/pydantic/mypy.py +1412 -0
  919. venv/Lib/site-packages/pydantic/networks.py +1332 -0
  920. venv/Lib/site-packages/pydantic/parse.py +5 -0
  921. venv/Lib/site-packages/pydantic/plugin/__init__.py +193 -0
  922. venv/Lib/site-packages/pydantic/plugin/_loader.py +58 -0
  923. venv/Lib/site-packages/pydantic/plugin/_schema_validator.py +143 -0
  924. venv/Lib/site-packages/pydantic/py.typed +0 -0
  925. venv/Lib/site-packages/pydantic/root_model.py +157 -0
  926. venv/Lib/site-packages/pydantic/schema.py +5 -0
  927. venv/Lib/site-packages/pydantic/tools.py +5 -0
  928. venv/Lib/site-packages/pydantic/type_adapter.py +801 -0
  929. venv/Lib/site-packages/pydantic/types.py +3310 -0
  930. venv/Lib/site-packages/pydantic/typing.py +5 -0
  931. venv/Lib/site-packages/pydantic/utils.py +5 -0
  932. venv/Lib/site-packages/pydantic/v1/__init__.py +131 -0
  933. venv/Lib/site-packages/pydantic/v1/_hypothesis_plugin.py +391 -0
  934. venv/Lib/site-packages/pydantic/v1/annotated_types.py +72 -0
  935. venv/Lib/site-packages/pydantic/v1/class_validators.py +361 -0
  936. venv/Lib/site-packages/pydantic/v1/color.py +494 -0
  937. venv/Lib/site-packages/pydantic/v1/config.py +191 -0
  938. venv/Lib/site-packages/pydantic/v1/dataclasses.py +500 -0
  939. venv/Lib/site-packages/pydantic/v1/datetime_parse.py +248 -0
  940. venv/Lib/site-packages/pydantic/v1/decorator.py +264 -0
  941. venv/Lib/site-packages/pydantic/v1/env_settings.py +350 -0
  942. venv/Lib/site-packages/pydantic/v1/error_wrappers.py +161 -0
  943. venv/Lib/site-packages/pydantic/v1/errors.py +646 -0
  944. venv/Lib/site-packages/pydantic/v1/fields.py +1253 -0
  945. venv/Lib/site-packages/pydantic/v1/generics.py +400 -0
  946. venv/Lib/site-packages/pydantic/v1/json.py +112 -0
  947. venv/Lib/site-packages/pydantic/v1/main.py +1130 -0
  948. venv/Lib/site-packages/pydantic/v1/mypy.py +949 -0
  949. venv/Lib/site-packages/pydantic/v1/networks.py +747 -0
  950. venv/Lib/site-packages/pydantic/v1/parse.py +66 -0
  951. venv/Lib/site-packages/pydantic/v1/py.typed +0 -0
  952. venv/Lib/site-packages/pydantic/v1/schema.py +1163 -0
  953. venv/Lib/site-packages/pydantic/v1/tools.py +92 -0
  954. venv/Lib/site-packages/pydantic/v1/types.py +1205 -0
  955. venv/Lib/site-packages/pydantic/v1/typing.py +627 -0
  956. venv/Lib/site-packages/pydantic/v1/utils.py +807 -0
  957. venv/Lib/site-packages/pydantic/v1/validators.py +768 -0
  958. venv/Lib/site-packages/pydantic/v1/version.py +38 -0
  959. venv/Lib/site-packages/pydantic/validate_call_decorator.py +116 -0
  960. venv/Lib/site-packages/pydantic/validators.py +5 -0
  961. venv/Lib/site-packages/pydantic/version.py +113 -0
  962. venv/Lib/site-packages/pydantic/warnings.py +122 -0
  963. venv/Lib/site-packages/pydantic_core/__init__.py +171 -0
  964. venv/Lib/site-packages/pydantic_core/_pydantic_core.pyi +1056 -0
  965. venv/Lib/site-packages/pydantic_core/core_schema.py +4461 -0
  966. venv/Lib/site-packages/pydantic_core/py.typed +0 -0
  967. venv/Lib/site-packages/pygments/__init__.py +82 -0
  968. venv/Lib/site-packages/pygments/__main__.py +17 -0
  969. venv/Lib/site-packages/pygments/cmdline.py +668 -0
  970. venv/Lib/site-packages/pygments/console.py +70 -0
  971. venv/Lib/site-packages/pygments/filter.py +70 -0
  972. venv/Lib/site-packages/pygments/filters/__init__.py +942 -0
  973. venv/Lib/site-packages/pygments/formatter.py +129 -0
  974. venv/Lib/site-packages/pygments/formatters/__init__.py +157 -0
  975. venv/Lib/site-packages/pygments/formatters/_mapping.py +23 -0
  976. venv/Lib/site-packages/pygments/formatters/bbcode.py +108 -0
  977. venv/Lib/site-packages/pygments/formatters/groff.py +170 -0
  978. venv/Lib/site-packages/pygments/formatters/html.py +997 -0
  979. venv/Lib/site-packages/pygments/formatters/img.py +686 -0
  980. venv/Lib/site-packages/pygments/formatters/irc.py +153 -0
  981. venv/Lib/site-packages/pygments/formatters/latex.py +518 -0
  982. venv/Lib/site-packages/pygments/formatters/other.py +160 -0
  983. venv/Lib/site-packages/pygments/formatters/pangomarkup.py +83 -0
  984. venv/Lib/site-packages/pygments/formatters/rtf.py +349 -0
  985. venv/Lib/site-packages/pygments/formatters/svg.py +185 -0
  986. venv/Lib/site-packages/pygments/formatters/terminal.py +127 -0
  987. venv/Lib/site-packages/pygments/formatters/terminal256.py +338 -0
  988. venv/Lib/site-packages/pygments/lexer.py +963 -0
  989. venv/Lib/site-packages/pygments/lexers/__init__.py +362 -0
  990. venv/Lib/site-packages/pygments/lexers/_ada_builtins.py +103 -0
  991. venv/Lib/site-packages/pygments/lexers/_asy_builtins.py +1644 -0
  992. venv/Lib/site-packages/pygments/lexers/_cl_builtins.py +231 -0
  993. venv/Lib/site-packages/pygments/lexers/_cocoa_builtins.py +75 -0
  994. venv/Lib/site-packages/pygments/lexers/_csound_builtins.py +1780 -0
  995. venv/Lib/site-packages/pygments/lexers/_css_builtins.py +558 -0
  996. venv/Lib/site-packages/pygments/lexers/_googlesql_builtins.py +918 -0
  997. venv/Lib/site-packages/pygments/lexers/_julia_builtins.py +411 -0
  998. venv/Lib/site-packages/pygments/lexers/_lasso_builtins.py +5326 -0
  999. venv/Lib/site-packages/pygments/lexers/_lilypond_builtins.py +5184 -0
  1000. venv/Lib/site-packages/pygments/lexers/_lua_builtins.py +285 -0
  1001. venv/Lib/site-packages/pygments/lexers/_luau_builtins.py +62 -0
  1002. venv/Lib/site-packages/pygments/lexers/_mapping.py +603 -0
  1003. venv/Lib/site-packages/pygments/lexers/_mql_builtins.py +1171 -0
  1004. venv/Lib/site-packages/pygments/lexers/_mysql_builtins.py +1384 -0
  1005. venv/Lib/site-packages/pygments/lexers/_openedge_builtins.py +2600 -0
  1006. venv/Lib/site-packages/pygments/lexers/_php_builtins.py +3328 -0
  1007. venv/Lib/site-packages/pygments/lexers/_postgres_builtins.py +739 -0
  1008. venv/Lib/site-packages/pygments/lexers/_qlik_builtins.py +666 -0
  1009. venv/Lib/site-packages/pygments/lexers/_scheme_builtins.py +1609 -0
  1010. venv/Lib/site-packages/pygments/lexers/_scilab_builtins.py +3093 -0
  1011. venv/Lib/site-packages/pygments/lexers/_sourcemod_builtins.py +1151 -0
  1012. venv/Lib/site-packages/pygments/lexers/_sql_builtins.py +106 -0
  1013. venv/Lib/site-packages/pygments/lexers/_stan_builtins.py +761 -0
  1014. venv/Lib/site-packages/pygments/lexers/_stata_builtins.py +457 -0
  1015. venv/Lib/site-packages/pygments/lexers/_tsql_builtins.py +1003 -0
  1016. venv/Lib/site-packages/pygments/lexers/_usd_builtins.py +112 -0
  1017. venv/Lib/site-packages/pygments/lexers/_vbscript_builtins.py +279 -0
  1018. venv/Lib/site-packages/pygments/lexers/_vim_builtins.py +1938 -0
  1019. venv/Lib/site-packages/pygments/lexers/actionscript.py +243 -0
  1020. venv/Lib/site-packages/pygments/lexers/ada.py +144 -0
  1021. venv/Lib/site-packages/pygments/lexers/agile.py +25 -0
  1022. venv/Lib/site-packages/pygments/lexers/algebra.py +300 -0
  1023. venv/Lib/site-packages/pygments/lexers/ambient.py +75 -0
  1024. venv/Lib/site-packages/pygments/lexers/amdgpu.py +54 -0
  1025. venv/Lib/site-packages/pygments/lexers/ampl.py +87 -0
  1026. venv/Lib/site-packages/pygments/lexers/apdlexer.py +593 -0
  1027. venv/Lib/site-packages/pygments/lexers/apl.py +103 -0
  1028. venv/Lib/site-packages/pygments/lexers/archetype.py +315 -0
  1029. venv/Lib/site-packages/pygments/lexers/arrow.py +116 -0
  1030. venv/Lib/site-packages/pygments/lexers/arturo.py +249 -0
  1031. venv/Lib/site-packages/pygments/lexers/asc.py +55 -0
  1032. venv/Lib/site-packages/pygments/lexers/asm.py +1058 -0
  1033. venv/Lib/site-packages/pygments/lexers/asn1.py +178 -0
  1034. venv/Lib/site-packages/pygments/lexers/automation.py +379 -0
  1035. venv/Lib/site-packages/pygments/lexers/bare.py +101 -0
  1036. venv/Lib/site-packages/pygments/lexers/basic.py +656 -0
  1037. venv/Lib/site-packages/pygments/lexers/bdd.py +57 -0
  1038. venv/Lib/site-packages/pygments/lexers/berry.py +99 -0
  1039. venv/Lib/site-packages/pygments/lexers/bibtex.py +159 -0
  1040. venv/Lib/site-packages/pygments/lexers/blueprint.py +173 -0
  1041. venv/Lib/site-packages/pygments/lexers/boa.py +97 -0
  1042. venv/Lib/site-packages/pygments/lexers/bqn.py +112 -0
  1043. venv/Lib/site-packages/pygments/lexers/business.py +625 -0
  1044. venv/Lib/site-packages/pygments/lexers/c_cpp.py +415 -0
  1045. venv/Lib/site-packages/pygments/lexers/c_like.py +738 -0
  1046. venv/Lib/site-packages/pygments/lexers/capnproto.py +74 -0
  1047. venv/Lib/site-packages/pygments/lexers/carbon.py +95 -0
  1048. venv/Lib/site-packages/pygments/lexers/cddl.py +172 -0
  1049. venv/Lib/site-packages/pygments/lexers/chapel.py +139 -0
  1050. venv/Lib/site-packages/pygments/lexers/clean.py +180 -0
  1051. venv/Lib/site-packages/pygments/lexers/codeql.py +80 -0
  1052. venv/Lib/site-packages/pygments/lexers/comal.py +81 -0
  1053. venv/Lib/site-packages/pygments/lexers/compiled.py +35 -0
  1054. venv/Lib/site-packages/pygments/lexers/configs.py +1433 -0
  1055. venv/Lib/site-packages/pygments/lexers/console.py +114 -0
  1056. venv/Lib/site-packages/pygments/lexers/cplint.py +43 -0
  1057. venv/Lib/site-packages/pygments/lexers/crystal.py +364 -0
  1058. venv/Lib/site-packages/pygments/lexers/csound.py +466 -0
  1059. venv/Lib/site-packages/pygments/lexers/css.py +632 -0
  1060. venv/Lib/site-packages/pygments/lexers/d.py +259 -0
  1061. venv/Lib/site-packages/pygments/lexers/dalvik.py +126 -0
  1062. venv/Lib/site-packages/pygments/lexers/data.py +763 -0
  1063. venv/Lib/site-packages/pygments/lexers/dax.py +135 -0
  1064. venv/Lib/site-packages/pygments/lexers/devicetree.py +120 -0
  1065. venv/Lib/site-packages/pygments/lexers/diff.py +169 -0
  1066. venv/Lib/site-packages/pygments/lexers/dns.py +109 -0
  1067. venv/Lib/site-packages/pygments/lexers/dotnet.py +873 -0
  1068. venv/Lib/site-packages/pygments/lexers/dsls.py +970 -0
  1069. venv/Lib/site-packages/pygments/lexers/dylan.py +279 -0
  1070. venv/Lib/site-packages/pygments/lexers/ecl.py +144 -0
  1071. venv/Lib/site-packages/pygments/lexers/eiffel.py +68 -0
  1072. venv/Lib/site-packages/pygments/lexers/elm.py +123 -0
  1073. venv/Lib/site-packages/pygments/lexers/elpi.py +201 -0
  1074. venv/Lib/site-packages/pygments/lexers/email.py +132 -0
  1075. venv/Lib/site-packages/pygments/lexers/erlang.py +526 -0
  1076. venv/Lib/site-packages/pygments/lexers/esoteric.py +300 -0
  1077. venv/Lib/site-packages/pygments/lexers/ezhil.py +76 -0
  1078. venv/Lib/site-packages/pygments/lexers/factor.py +363 -0
  1079. venv/Lib/site-packages/pygments/lexers/fantom.py +251 -0
  1080. venv/Lib/site-packages/pygments/lexers/felix.py +275 -0
  1081. venv/Lib/site-packages/pygments/lexers/fift.py +68 -0
  1082. venv/Lib/site-packages/pygments/lexers/floscript.py +81 -0
  1083. venv/Lib/site-packages/pygments/lexers/forth.py +178 -0
  1084. venv/Lib/site-packages/pygments/lexers/fortran.py +212 -0
  1085. venv/Lib/site-packages/pygments/lexers/foxpro.py +427 -0
  1086. venv/Lib/site-packages/pygments/lexers/freefem.py +893 -0
  1087. venv/Lib/site-packages/pygments/lexers/func.py +110 -0
  1088. venv/Lib/site-packages/pygments/lexers/functional.py +21 -0
  1089. venv/Lib/site-packages/pygments/lexers/futhark.py +105 -0
  1090. venv/Lib/site-packages/pygments/lexers/gcodelexer.py +35 -0
  1091. venv/Lib/site-packages/pygments/lexers/gdscript.py +189 -0
  1092. venv/Lib/site-packages/pygments/lexers/gleam.py +74 -0
  1093. venv/Lib/site-packages/pygments/lexers/go.py +97 -0
  1094. venv/Lib/site-packages/pygments/lexers/grammar_notation.py +262 -0
  1095. venv/Lib/site-packages/pygments/lexers/graph.py +108 -0
  1096. venv/Lib/site-packages/pygments/lexers/graphics.py +794 -0
  1097. venv/Lib/site-packages/pygments/lexers/graphql.py +176 -0
  1098. venv/Lib/site-packages/pygments/lexers/graphviz.py +58 -0
  1099. venv/Lib/site-packages/pygments/lexers/gsql.py +103 -0
  1100. venv/Lib/site-packages/pygments/lexers/hare.py +73 -0
  1101. venv/Lib/site-packages/pygments/lexers/haskell.py +867 -0
  1102. venv/Lib/site-packages/pygments/lexers/haxe.py +941 -0
  1103. venv/Lib/site-packages/pygments/lexers/hdl.py +466 -0
  1104. venv/Lib/site-packages/pygments/lexers/hexdump.py +102 -0
  1105. venv/Lib/site-packages/pygments/lexers/html.py +670 -0
  1106. venv/Lib/site-packages/pygments/lexers/idl.py +284 -0
  1107. venv/Lib/site-packages/pygments/lexers/igor.py +435 -0
  1108. venv/Lib/site-packages/pygments/lexers/inferno.py +95 -0
  1109. venv/Lib/site-packages/pygments/lexers/installers.py +352 -0
  1110. venv/Lib/site-packages/pygments/lexers/int_fiction.py +1370 -0
  1111. venv/Lib/site-packages/pygments/lexers/iolang.py +61 -0
  1112. venv/Lib/site-packages/pygments/lexers/j.py +151 -0
  1113. venv/Lib/site-packages/pygments/lexers/javascript.py +1591 -0
  1114. venv/Lib/site-packages/pygments/lexers/jmespath.py +69 -0
  1115. venv/Lib/site-packages/pygments/lexers/jslt.py +94 -0
  1116. venv/Lib/site-packages/pygments/lexers/json5.py +83 -0
  1117. venv/Lib/site-packages/pygments/lexers/jsonnet.py +169 -0
  1118. venv/Lib/site-packages/pygments/lexers/jsx.py +100 -0
  1119. venv/Lib/site-packages/pygments/lexers/julia.py +294 -0
  1120. venv/Lib/site-packages/pygments/lexers/jvm.py +1807 -0
  1121. venv/Lib/site-packages/pygments/lexers/kuin.py +332 -0
  1122. venv/Lib/site-packages/pygments/lexers/kusto.py +93 -0
  1123. venv/Lib/site-packages/pygments/lexers/ldap.py +155 -0
  1124. venv/Lib/site-packages/pygments/lexers/lean.py +241 -0
  1125. venv/Lib/site-packages/pygments/lexers/lilypond.py +225 -0
  1126. venv/Lib/site-packages/pygments/lexers/lisp.py +3152 -0
  1127. venv/Lib/site-packages/pygments/lexers/macaulay2.py +1847 -0
  1128. venv/Lib/site-packages/pygments/lexers/make.py +212 -0
  1129. venv/Lib/site-packages/pygments/lexers/maple.py +291 -0
  1130. venv/Lib/site-packages/pygments/lexers/markup.py +1659 -0
  1131. venv/Lib/site-packages/pygments/lexers/math.py +21 -0
  1132. venv/Lib/site-packages/pygments/lexers/matlab.py +3307 -0
  1133. venv/Lib/site-packages/pygments/lexers/maxima.py +84 -0
  1134. venv/Lib/site-packages/pygments/lexers/meson.py +139 -0
  1135. venv/Lib/site-packages/pygments/lexers/mime.py +210 -0
  1136. venv/Lib/site-packages/pygments/lexers/minecraft.py +392 -0
  1137. venv/Lib/site-packages/pygments/lexers/mips.py +130 -0
  1138. venv/Lib/site-packages/pygments/lexers/ml.py +958 -0
  1139. venv/Lib/site-packages/pygments/lexers/modeling.py +368 -0
  1140. venv/Lib/site-packages/pygments/lexers/modula2.py +1579 -0
  1141. venv/Lib/site-packages/pygments/lexers/mojo.py +707 -0
  1142. venv/Lib/site-packages/pygments/lexers/monte.py +203 -0
  1143. venv/Lib/site-packages/pygments/lexers/mosel.py +447 -0
  1144. venv/Lib/site-packages/pygments/lexers/ncl.py +894 -0
  1145. venv/Lib/site-packages/pygments/lexers/nimrod.py +199 -0
  1146. venv/Lib/site-packages/pygments/lexers/nit.py +63 -0
  1147. venv/Lib/site-packages/pygments/lexers/nix.py +144 -0
  1148. venv/Lib/site-packages/pygments/lexers/numbair.py +63 -0
  1149. venv/Lib/site-packages/pygments/lexers/oberon.py +120 -0
  1150. venv/Lib/site-packages/pygments/lexers/objective.py +513 -0
  1151. venv/Lib/site-packages/pygments/lexers/ooc.py +84 -0
  1152. venv/Lib/site-packages/pygments/lexers/openscad.py +96 -0
  1153. venv/Lib/site-packages/pygments/lexers/other.py +41 -0
  1154. venv/Lib/site-packages/pygments/lexers/parasail.py +78 -0
  1155. venv/Lib/site-packages/pygments/lexers/parsers.py +798 -0
  1156. venv/Lib/site-packages/pygments/lexers/pascal.py +644 -0
  1157. venv/Lib/site-packages/pygments/lexers/pawn.py +202 -0
  1158. venv/Lib/site-packages/pygments/lexers/pddl.py +82 -0
  1159. venv/Lib/site-packages/pygments/lexers/perl.py +733 -0
  1160. venv/Lib/site-packages/pygments/lexers/phix.py +363 -0
  1161. venv/Lib/site-packages/pygments/lexers/php.py +335 -0
  1162. venv/Lib/site-packages/pygments/lexers/pointless.py +70 -0
  1163. venv/Lib/site-packages/pygments/lexers/pony.py +93 -0
  1164. venv/Lib/site-packages/pygments/lexers/praat.py +303 -0
  1165. venv/Lib/site-packages/pygments/lexers/procfile.py +41 -0
  1166. venv/Lib/site-packages/pygments/lexers/prolog.py +318 -0
  1167. venv/Lib/site-packages/pygments/lexers/promql.py +176 -0
  1168. venv/Lib/site-packages/pygments/lexers/prql.py +251 -0
  1169. venv/Lib/site-packages/pygments/lexers/ptx.py +119 -0
  1170. venv/Lib/site-packages/pygments/lexers/python.py +1204 -0
  1171. venv/Lib/site-packages/pygments/lexers/q.py +187 -0
  1172. venv/Lib/site-packages/pygments/lexers/qlik.py +117 -0
  1173. venv/Lib/site-packages/pygments/lexers/qvt.py +153 -0
  1174. venv/Lib/site-packages/pygments/lexers/r.py +196 -0
  1175. venv/Lib/site-packages/pygments/lexers/rdf.py +468 -0
  1176. venv/Lib/site-packages/pygments/lexers/rebol.py +419 -0
  1177. venv/Lib/site-packages/pygments/lexers/rego.py +57 -0
  1178. venv/Lib/site-packages/pygments/lexers/rell.py +68 -0
  1179. venv/Lib/site-packages/pygments/lexers/resource.py +83 -0
  1180. venv/Lib/site-packages/pygments/lexers/ride.py +138 -0
  1181. venv/Lib/site-packages/pygments/lexers/rita.py +42 -0
  1182. venv/Lib/site-packages/pygments/lexers/rnc.py +66 -0
  1183. venv/Lib/site-packages/pygments/lexers/roboconf.py +81 -0
  1184. venv/Lib/site-packages/pygments/lexers/robotframework.py +551 -0
  1185. venv/Lib/site-packages/pygments/lexers/ruby.py +518 -0
  1186. venv/Lib/site-packages/pygments/lexers/rust.py +222 -0
  1187. venv/Lib/site-packages/pygments/lexers/sas.py +227 -0
  1188. venv/Lib/site-packages/pygments/lexers/savi.py +171 -0
  1189. venv/Lib/site-packages/pygments/lexers/scdoc.py +85 -0
  1190. venv/Lib/site-packages/pygments/lexers/scripting.py +1638 -0
  1191. venv/Lib/site-packages/pygments/lexers/sgf.py +59 -0
  1192. venv/Lib/site-packages/pygments/lexers/shell.py +902 -0
  1193. venv/Lib/site-packages/pygments/lexers/sieve.py +78 -0
  1194. venv/Lib/site-packages/pygments/lexers/slash.py +183 -0
  1195. venv/Lib/site-packages/pygments/lexers/smalltalk.py +194 -0
  1196. venv/Lib/site-packages/pygments/lexers/smithy.py +77 -0
  1197. venv/Lib/site-packages/pygments/lexers/smv.py +78 -0
  1198. venv/Lib/site-packages/pygments/lexers/snobol.py +82 -0
  1199. venv/Lib/site-packages/pygments/lexers/solidity.py +87 -0
  1200. venv/Lib/site-packages/pygments/lexers/soong.py +78 -0
  1201. venv/Lib/site-packages/pygments/lexers/sophia.py +102 -0
  1202. venv/Lib/site-packages/pygments/lexers/special.py +122 -0
  1203. venv/Lib/site-packages/pygments/lexers/spice.py +70 -0
  1204. venv/Lib/site-packages/pygments/lexers/sql.py +1111 -0
  1205. venv/Lib/site-packages/pygments/lexers/srcinfo.py +62 -0
  1206. venv/Lib/site-packages/pygments/lexers/stata.py +170 -0
  1207. venv/Lib/site-packages/pygments/lexers/supercollider.py +94 -0
  1208. venv/Lib/site-packages/pygments/lexers/tablegen.py +177 -0
  1209. venv/Lib/site-packages/pygments/lexers/tact.py +303 -0
  1210. venv/Lib/site-packages/pygments/lexers/tal.py +77 -0
  1211. venv/Lib/site-packages/pygments/lexers/tcl.py +148 -0
  1212. venv/Lib/site-packages/pygments/lexers/teal.py +88 -0
  1213. venv/Lib/site-packages/pygments/lexers/templates.py +2355 -0
  1214. venv/Lib/site-packages/pygments/lexers/teraterm.py +335 -0
  1215. venv/Lib/site-packages/pygments/lexers/testing.py +209 -0
  1216. venv/Lib/site-packages/pygments/lexers/text.py +27 -0
  1217. venv/Lib/site-packages/pygments/lexers/textedit.py +205 -0
  1218. venv/Lib/site-packages/pygments/lexers/textfmts.py +436 -0
  1219. venv/Lib/site-packages/pygments/lexers/theorem.py +410 -0
  1220. venv/Lib/site-packages/pygments/lexers/thingsdb.py +143 -0
  1221. venv/Lib/site-packages/pygments/lexers/tlb.py +59 -0
  1222. venv/Lib/site-packages/pygments/lexers/tls.py +54 -0
  1223. venv/Lib/site-packages/pygments/lexers/tnt.py +270 -0
  1224. venv/Lib/site-packages/pygments/lexers/trafficscript.py +51 -0
  1225. venv/Lib/site-packages/pygments/lexers/typoscript.py +216 -0
  1226. venv/Lib/site-packages/pygments/lexers/typst.py +160 -0
  1227. venv/Lib/site-packages/pygments/lexers/ul4.py +309 -0
  1228. venv/Lib/site-packages/pygments/lexers/unicon.py +413 -0
  1229. venv/Lib/site-packages/pygments/lexers/urbi.py +145 -0
  1230. venv/Lib/site-packages/pygments/lexers/usd.py +85 -0
  1231. venv/Lib/site-packages/pygments/lexers/varnish.py +189 -0
  1232. venv/Lib/site-packages/pygments/lexers/verification.py +113 -0
  1233. venv/Lib/site-packages/pygments/lexers/verifpal.py +65 -0
  1234. venv/Lib/site-packages/pygments/lexers/vip.py +150 -0
  1235. venv/Lib/site-packages/pygments/lexers/vyper.py +140 -0
  1236. venv/Lib/site-packages/pygments/lexers/web.py +24 -0
  1237. venv/Lib/site-packages/pygments/lexers/webassembly.py +119 -0
  1238. venv/Lib/site-packages/pygments/lexers/webidl.py +298 -0
  1239. venv/Lib/site-packages/pygments/lexers/webmisc.py +1006 -0
  1240. venv/Lib/site-packages/pygments/lexers/wgsl.py +406 -0
  1241. venv/Lib/site-packages/pygments/lexers/whiley.py +115 -0
  1242. venv/Lib/site-packages/pygments/lexers/wowtoc.py +120 -0
  1243. venv/Lib/site-packages/pygments/lexers/wren.py +98 -0
  1244. venv/Lib/site-packages/pygments/lexers/x10.py +66 -0
  1245. venv/Lib/site-packages/pygments/lexers/xorg.py +38 -0
  1246. venv/Lib/site-packages/pygments/lexers/yang.py +103 -0
  1247. venv/Lib/site-packages/pygments/lexers/yara.py +69 -0
  1248. venv/Lib/site-packages/pygments/lexers/zig.py +125 -0
  1249. venv/Lib/site-packages/pygments/modeline.py +43 -0
  1250. venv/Lib/site-packages/pygments/plugin.py +74 -0
  1251. venv/Lib/site-packages/pygments/regexopt.py +102 -0
  1252. venv/Lib/site-packages/pygments/scanner.py +104 -0
  1253. venv/Lib/site-packages/pygments/sphinxext.py +247 -0
  1254. venv/Lib/site-packages/pygments/style.py +203 -0
  1255. venv/Lib/site-packages/pygments/styles/__init__.py +61 -0
  1256. venv/Lib/site-packages/pygments/styles/_mapping.py +54 -0
  1257. venv/Lib/site-packages/pygments/styles/abap.py +32 -0
  1258. venv/Lib/site-packages/pygments/styles/algol.py +65 -0
  1259. venv/Lib/site-packages/pygments/styles/algol_nu.py +65 -0
  1260. venv/Lib/site-packages/pygments/styles/arduino.py +100 -0
  1261. venv/Lib/site-packages/pygments/styles/autumn.py +67 -0
  1262. venv/Lib/site-packages/pygments/styles/borland.py +53 -0
  1263. venv/Lib/site-packages/pygments/styles/bw.py +52 -0
  1264. venv/Lib/site-packages/pygments/styles/coffee.py +80 -0
  1265. venv/Lib/site-packages/pygments/styles/colorful.py +83 -0
  1266. venv/Lib/site-packages/pygments/styles/default.py +76 -0
  1267. venv/Lib/site-packages/pygments/styles/dracula.py +90 -0
  1268. venv/Lib/site-packages/pygments/styles/emacs.py +75 -0
  1269. venv/Lib/site-packages/pygments/styles/friendly.py +76 -0
  1270. venv/Lib/site-packages/pygments/styles/friendly_grayscale.py +80 -0
  1271. venv/Lib/site-packages/pygments/styles/fruity.py +47 -0
  1272. venv/Lib/site-packages/pygments/styles/gh_dark.py +113 -0
  1273. venv/Lib/site-packages/pygments/styles/gruvbox.py +118 -0
  1274. venv/Lib/site-packages/pygments/styles/igor.py +32 -0
  1275. venv/Lib/site-packages/pygments/styles/inkpot.py +72 -0
  1276. venv/Lib/site-packages/pygments/styles/lightbulb.py +110 -0
  1277. venv/Lib/site-packages/pygments/styles/lilypond.py +62 -0
  1278. venv/Lib/site-packages/pygments/styles/lovelace.py +100 -0
  1279. venv/Lib/site-packages/pygments/styles/manni.py +79 -0
  1280. venv/Lib/site-packages/pygments/styles/material.py +124 -0
  1281. venv/Lib/site-packages/pygments/styles/monokai.py +112 -0
  1282. venv/Lib/site-packages/pygments/styles/murphy.py +82 -0
  1283. venv/Lib/site-packages/pygments/styles/native.py +70 -0
  1284. venv/Lib/site-packages/pygments/styles/nord.py +156 -0
  1285. venv/Lib/site-packages/pygments/styles/onedark.py +73 -0
  1286. venv/Lib/site-packages/pygments/styles/paraiso_dark.py +124 -0
  1287. venv/Lib/site-packages/pygments/styles/paraiso_light.py +124 -0
  1288. venv/Lib/site-packages/pygments/styles/pastie.py +78 -0
  1289. venv/Lib/site-packages/pygments/styles/perldoc.py +73 -0
  1290. venv/Lib/site-packages/pygments/styles/rainbow_dash.py +95 -0
  1291. venv/Lib/site-packages/pygments/styles/rrt.py +54 -0
  1292. venv/Lib/site-packages/pygments/styles/sas.py +46 -0
  1293. venv/Lib/site-packages/pygments/styles/solarized.py +144 -0
  1294. venv/Lib/site-packages/pygments/styles/staroffice.py +31 -0
  1295. venv/Lib/site-packages/pygments/styles/stata_dark.py +42 -0
  1296. venv/Lib/site-packages/pygments/styles/stata_light.py +42 -0
  1297. venv/Lib/site-packages/pygments/styles/tango.py +143 -0
  1298. venv/Lib/site-packages/pygments/styles/trac.py +66 -0
  1299. venv/Lib/site-packages/pygments/styles/vim.py +67 -0
  1300. venv/Lib/site-packages/pygments/styles/vs.py +41 -0
  1301. venv/Lib/site-packages/pygments/styles/xcode.py +53 -0
  1302. venv/Lib/site-packages/pygments/styles/zenburn.py +83 -0
  1303. venv/Lib/site-packages/pygments/token.py +214 -0
  1304. venv/Lib/site-packages/pygments/unistring.py +153 -0
  1305. venv/Lib/site-packages/pygments/util.py +324 -0
  1306. venv/Lib/site-packages/pyproject_hooks/__init__.py +31 -0
  1307. venv/Lib/site-packages/pyproject_hooks/_impl.py +410 -0
  1308. venv/Lib/site-packages/pyproject_hooks/_in_process/__init__.py +21 -0
  1309. venv/Lib/site-packages/pyproject_hooks/_in_process/_in_process.py +389 -0
  1310. venv/Lib/site-packages/pyproject_hooks/py.typed +0 -0
  1311. venv/Lib/site-packages/pytest/__init__.py +186 -0
  1312. venv/Lib/site-packages/pytest/__main__.py +9 -0
  1313. venv/Lib/site-packages/pytest/py.typed +0 -0
  1314. venv/Lib/site-packages/readme_renderer/__init__.py +13 -0
  1315. venv/Lib/site-packages/readme_renderer/__main__.py +66 -0
  1316. venv/Lib/site-packages/readme_renderer/clean.py +89 -0
  1317. venv/Lib/site-packages/readme_renderer/markdown.py +123 -0
  1318. venv/Lib/site-packages/readme_renderer/py.typed +0 -0
  1319. venv/Lib/site-packages/readme_renderer/rst.py +135 -0
  1320. venv/Lib/site-packages/readme_renderer/txt.py +24 -0
  1321. venv/Lib/site-packages/requests/__init__.py +183 -0
  1322. venv/Lib/site-packages/requests/__version__.py +14 -0
  1323. venv/Lib/site-packages/requests/_internal_utils.py +51 -0
  1324. venv/Lib/site-packages/requests/adapters.py +697 -0
  1325. venv/Lib/site-packages/requests/api.py +157 -0
  1326. venv/Lib/site-packages/requests/auth.py +314 -0
  1327. venv/Lib/site-packages/requests/certs.py +18 -0
  1328. venv/Lib/site-packages/requests/compat.py +106 -0
  1329. venv/Lib/site-packages/requests/cookies.py +561 -0
  1330. venv/Lib/site-packages/requests/exceptions.py +152 -0
  1331. venv/Lib/site-packages/requests/help.py +131 -0
  1332. venv/Lib/site-packages/requests/hooks.py +34 -0
  1333. venv/Lib/site-packages/requests/models.py +1041 -0
  1334. venv/Lib/site-packages/requests/packages.py +23 -0
  1335. venv/Lib/site-packages/requests/sessions.py +834 -0
  1336. venv/Lib/site-packages/requests/status_codes.py +128 -0
  1337. venv/Lib/site-packages/requests/structures.py +99 -0
  1338. venv/Lib/site-packages/requests/utils.py +1083 -0
  1339. venv/Lib/site-packages/requests_toolbelt/__init__.py +34 -0
  1340. venv/Lib/site-packages/requests_toolbelt/_compat.py +302 -0
  1341. venv/Lib/site-packages/requests_toolbelt/adapters/__init__.py +15 -0
  1342. venv/Lib/site-packages/requests_toolbelt/adapters/appengine.py +206 -0
  1343. venv/Lib/site-packages/requests_toolbelt/adapters/fingerprint.py +48 -0
  1344. venv/Lib/site-packages/requests_toolbelt/adapters/host_header_ssl.py +43 -0
  1345. venv/Lib/site-packages/requests_toolbelt/adapters/socket_options.py +129 -0
  1346. venv/Lib/site-packages/requests_toolbelt/adapters/source.py +67 -0
  1347. venv/Lib/site-packages/requests_toolbelt/adapters/ssl.py +66 -0
  1348. venv/Lib/site-packages/requests_toolbelt/adapters/x509.py +196 -0
  1349. venv/Lib/site-packages/requests_toolbelt/auth/__init__.py +0 -0
  1350. venv/Lib/site-packages/requests_toolbelt/auth/_digest_auth_compat.py +29 -0
  1351. venv/Lib/site-packages/requests_toolbelt/auth/guess.py +146 -0
  1352. venv/Lib/site-packages/requests_toolbelt/auth/handler.py +142 -0
  1353. venv/Lib/site-packages/requests_toolbelt/auth/http_proxy_digest.py +103 -0
  1354. venv/Lib/site-packages/requests_toolbelt/cookies/__init__.py +0 -0
  1355. venv/Lib/site-packages/requests_toolbelt/cookies/forgetful.py +7 -0
  1356. venv/Lib/site-packages/requests_toolbelt/downloadutils/__init__.py +0 -0
  1357. venv/Lib/site-packages/requests_toolbelt/downloadutils/stream.py +176 -0
  1358. venv/Lib/site-packages/requests_toolbelt/downloadutils/tee.py +123 -0
  1359. venv/Lib/site-packages/requests_toolbelt/exceptions.py +25 -0
  1360. venv/Lib/site-packages/requests_toolbelt/multipart/__init__.py +31 -0
  1361. venv/Lib/site-packages/requests_toolbelt/multipart/decoder.py +156 -0
  1362. venv/Lib/site-packages/requests_toolbelt/multipart/encoder.py +655 -0
  1363. venv/Lib/site-packages/requests_toolbelt/sessions.py +89 -0
  1364. venv/Lib/site-packages/requests_toolbelt/streaming_iterator.py +116 -0
  1365. venv/Lib/site-packages/requests_toolbelt/threaded/__init__.py +97 -0
  1366. venv/Lib/site-packages/requests_toolbelt/threaded/pool.py +211 -0
  1367. venv/Lib/site-packages/requests_toolbelt/threaded/thread.py +53 -0
  1368. venv/Lib/site-packages/requests_toolbelt/utils/__init__.py +0 -0
  1369. venv/Lib/site-packages/requests_toolbelt/utils/deprecated.py +91 -0
  1370. venv/Lib/site-packages/requests_toolbelt/utils/dump.py +198 -0
  1371. venv/Lib/site-packages/requests_toolbelt/utils/formdata.py +108 -0
  1372. venv/Lib/site-packages/requests_toolbelt/utils/user_agent.py +143 -0
  1373. venv/Lib/site-packages/rfc3986/__init__.py +53 -0
  1374. venv/Lib/site-packages/rfc3986/_mixin.py +373 -0
  1375. venv/Lib/site-packages/rfc3986/abnf_regexp.py +275 -0
  1376. venv/Lib/site-packages/rfc3986/api.py +104 -0
  1377. venv/Lib/site-packages/rfc3986/builder.py +388 -0
  1378. venv/Lib/site-packages/rfc3986/compat.py +59 -0
  1379. venv/Lib/site-packages/rfc3986/exceptions.py +120 -0
  1380. venv/Lib/site-packages/rfc3986/iri.py +161 -0
  1381. venv/Lib/site-packages/rfc3986/misc.py +131 -0
  1382. venv/Lib/site-packages/rfc3986/normalizers.py +171 -0
  1383. venv/Lib/site-packages/rfc3986/parseresult.py +474 -0
  1384. venv/Lib/site-packages/rfc3986/uri.py +160 -0
  1385. venv/Lib/site-packages/rfc3986/validators.py +440 -0
  1386. venv/Lib/site-packages/rich/__init__.py +177 -0
  1387. venv/Lib/site-packages/rich/__main__.py +245 -0
  1388. venv/Lib/site-packages/rich/_emoji_codes.py +3610 -0
  1389. venv/Lib/site-packages/rich/_emoji_replace.py +31 -0
  1390. venv/Lib/site-packages/rich/_export_format.py +76 -0
  1391. venv/Lib/site-packages/rich/_extension.py +10 -0
  1392. venv/Lib/site-packages/rich/_fileno.py +24 -0
  1393. venv/Lib/site-packages/rich/_inspect.py +272 -0
  1394. venv/Lib/site-packages/rich/_log_render.py +94 -0
  1395. venv/Lib/site-packages/rich/_loop.py +43 -0
  1396. venv/Lib/site-packages/rich/_null_file.py +69 -0
  1397. venv/Lib/site-packages/rich/_palettes.py +309 -0
  1398. venv/Lib/site-packages/rich/_pick.py +17 -0
  1399. venv/Lib/site-packages/rich/_ratio.py +153 -0
  1400. venv/Lib/site-packages/rich/_spinners.py +482 -0
  1401. venv/Lib/site-packages/rich/_stack.py +16 -0
  1402. venv/Lib/site-packages/rich/_timer.py +19 -0
  1403. venv/Lib/site-packages/rich/_unicode_data/__init__.py +93 -0
  1404. venv/Lib/site-packages/rich/_unicode_data/_versions.py +23 -0
  1405. venv/Lib/site-packages/rich/_unicode_data/unicode10-0-0.py +611 -0
  1406. venv/Lib/site-packages/rich/_unicode_data/unicode11-0-0.py +625 -0
  1407. venv/Lib/site-packages/rich/_unicode_data/unicode12-0-0.py +637 -0
  1408. venv/Lib/site-packages/rich/_unicode_data/unicode12-1-0.py +636 -0
  1409. venv/Lib/site-packages/rich/_unicode_data/unicode13-0-0.py +648 -0
  1410. venv/Lib/site-packages/rich/_unicode_data/unicode14-0-0.py +661 -0
  1411. venv/Lib/site-packages/rich/_unicode_data/unicode15-0-0.py +671 -0
  1412. venv/Lib/site-packages/rich/_unicode_data/unicode15-1-0.py +670 -0
  1413. venv/Lib/site-packages/rich/_unicode_data/unicode16-0-0.py +683 -0
  1414. venv/Lib/site-packages/rich/_unicode_data/unicode17-0-0.py +691 -0
  1415. venv/Lib/site-packages/rich/_unicode_data/unicode4-1-0.py +425 -0
  1416. venv/Lib/site-packages/rich/_unicode_data/unicode5-0-0.py +430 -0
  1417. venv/Lib/site-packages/rich/_unicode_data/unicode5-1-0.py +433 -0
  1418. venv/Lib/site-packages/rich/_unicode_data/unicode5-2-0.py +461 -0
  1419. venv/Lib/site-packages/rich/_unicode_data/unicode6-0-0.py +469 -0
  1420. venv/Lib/site-packages/rich/_unicode_data/unicode6-1-0.py +480 -0
  1421. venv/Lib/site-packages/rich/_unicode_data/unicode6-2-0.py +480 -0
  1422. venv/Lib/site-packages/rich/_unicode_data/unicode6-3-0.py +481 -0
  1423. venv/Lib/site-packages/rich/_unicode_data/unicode7-0-0.py +507 -0
  1424. venv/Lib/site-packages/rich/_unicode_data/unicode8-0-0.py +515 -0
  1425. venv/Lib/site-packages/rich/_unicode_data/unicode9-0-0.py +598 -0
  1426. venv/Lib/site-packages/rich/_win32_console.py +661 -0
  1427. venv/Lib/site-packages/rich/_windows.py +71 -0
  1428. venv/Lib/site-packages/rich/_windows_renderer.py +56 -0
  1429. venv/Lib/site-packages/rich/_wrap.py +93 -0
  1430. venv/Lib/site-packages/rich/abc.py +33 -0
  1431. venv/Lib/site-packages/rich/align.py +320 -0
  1432. venv/Lib/site-packages/rich/ansi.py +241 -0
  1433. venv/Lib/site-packages/rich/bar.py +93 -0
  1434. venv/Lib/site-packages/rich/box.py +474 -0
  1435. venv/Lib/site-packages/rich/cells.py +352 -0
  1436. venv/Lib/site-packages/rich/color.py +621 -0
  1437. venv/Lib/site-packages/rich/color_triplet.py +38 -0
  1438. venv/Lib/site-packages/rich/columns.py +187 -0
  1439. venv/Lib/site-packages/rich/console.py +2698 -0
  1440. venv/Lib/site-packages/rich/constrain.py +37 -0
  1441. venv/Lib/site-packages/rich/containers.py +167 -0
  1442. venv/Lib/site-packages/rich/control.py +219 -0
  1443. venv/Lib/site-packages/rich/default_styles.py +196 -0
  1444. venv/Lib/site-packages/rich/diagnose.py +39 -0
  1445. venv/Lib/site-packages/rich/emoji.py +93 -0
  1446. venv/Lib/site-packages/rich/errors.py +34 -0
  1447. venv/Lib/site-packages/rich/file_proxy.py +60 -0
  1448. venv/Lib/site-packages/rich/filesize.py +88 -0
  1449. venv/Lib/site-packages/rich/highlighter.py +232 -0
  1450. venv/Lib/site-packages/rich/json.py +139 -0
  1451. venv/Lib/site-packages/rich/jupyter.py +101 -0
  1452. venv/Lib/site-packages/rich/layout.py +442 -0
  1453. venv/Lib/site-packages/rich/live.py +404 -0
  1454. venv/Lib/site-packages/rich/live_render.py +116 -0
  1455. venv/Lib/site-packages/rich/logging.py +305 -0
  1456. venv/Lib/site-packages/rich/markdown.py +802 -0
  1457. venv/Lib/site-packages/rich/markup.py +251 -0
  1458. venv/Lib/site-packages/rich/measure.py +151 -0
  1459. venv/Lib/site-packages/rich/padding.py +141 -0
  1460. venv/Lib/site-packages/rich/pager.py +34 -0
  1461. venv/Lib/site-packages/rich/palette.py +100 -0
  1462. venv/Lib/site-packages/rich/panel.py +317 -0
  1463. venv/Lib/site-packages/rich/pretty.py +1016 -0
  1464. venv/Lib/site-packages/rich/progress.py +1716 -0
  1465. venv/Lib/site-packages/rich/progress_bar.py +223 -0
  1466. venv/Lib/site-packages/rich/prompt.py +400 -0
  1467. venv/Lib/site-packages/rich/protocol.py +41 -0
  1468. venv/Lib/site-packages/rich/py.typed +0 -0
  1469. venv/Lib/site-packages/rich/region.py +10 -0
  1470. venv/Lib/site-packages/rich/repr.py +150 -0
  1471. venv/Lib/site-packages/rich/rule.py +130 -0
  1472. venv/Lib/site-packages/rich/scope.py +92 -0
  1473. venv/Lib/site-packages/rich/screen.py +54 -0
  1474. venv/Lib/site-packages/rich/segment.py +780 -0
  1475. venv/Lib/site-packages/rich/spinner.py +132 -0
  1476. venv/Lib/site-packages/rich/status.py +131 -0
  1477. venv/Lib/site-packages/rich/style.py +796 -0
  1478. venv/Lib/site-packages/rich/styled.py +42 -0
  1479. venv/Lib/site-packages/rich/syntax.py +988 -0
  1480. venv/Lib/site-packages/rich/table.py +1015 -0
  1481. venv/Lib/site-packages/rich/terminal_theme.py +153 -0
  1482. venv/Lib/site-packages/rich/text.py +1363 -0
  1483. venv/Lib/site-packages/rich/theme.py +116 -0
  1484. venv/Lib/site-packages/rich/themes.py +5 -0
  1485. venv/Lib/site-packages/rich/traceback.py +924 -0
  1486. venv/Lib/site-packages/rich/tree.py +257 -0
  1487. venv/Lib/site-packages/twine/__init__.py +54 -0
  1488. venv/Lib/site-packages/twine/__main__.py +54 -0
  1489. venv/Lib/site-packages/twine/auth.py +307 -0
  1490. venv/Lib/site-packages/twine/cli.py +139 -0
  1491. venv/Lib/site-packages/twine/commands/__init__.py +93 -0
  1492. venv/Lib/site-packages/twine/commands/check.py +195 -0
  1493. venv/Lib/site-packages/twine/commands/register.py +87 -0
  1494. venv/Lib/site-packages/twine/commands/upload.py +253 -0
  1495. venv/Lib/site-packages/twine/distribution.py +8 -0
  1496. venv/Lib/site-packages/twine/exceptions.py +175 -0
  1497. venv/Lib/site-packages/twine/package.py +403 -0
  1498. venv/Lib/site-packages/twine/py.typed +0 -0
  1499. venv/Lib/site-packages/twine/repository.py +246 -0
  1500. venv/Lib/site-packages/twine/sdist.py +83 -0
  1501. venv/Lib/site-packages/twine/settings.py +360 -0
  1502. venv/Lib/site-packages/twine/utils.py +387 -0
  1503. venv/Lib/site-packages/twine/wheel.py +81 -0
  1504. venv/Lib/site-packages/typing_extensions.py +4317 -0
  1505. venv/Lib/site-packages/typing_inspection/__init__.py +0 -0
  1506. venv/Lib/site-packages/typing_inspection/introspection.py +587 -0
  1507. venv/Lib/site-packages/typing_inspection/py.typed +0 -0
  1508. venv/Lib/site-packages/typing_inspection/typing_objects.py +607 -0
  1509. venv/Lib/site-packages/typing_inspection/typing_objects.pyi +417 -0
  1510. venv/Lib/site-packages/urllib3/__init__.py +211 -0
  1511. venv/Lib/site-packages/urllib3/_base_connection.py +167 -0
  1512. venv/Lib/site-packages/urllib3/_collections.py +486 -0
  1513. venv/Lib/site-packages/urllib3/_request_methods.py +278 -0
  1514. venv/Lib/site-packages/urllib3/_version.py +24 -0
  1515. venv/Lib/site-packages/urllib3/connection.py +1099 -0
  1516. venv/Lib/site-packages/urllib3/connectionpool.py +1191 -0
  1517. venv/Lib/site-packages/urllib3/contrib/__init__.py +0 -0
  1518. venv/Lib/site-packages/urllib3/contrib/emscripten/__init__.py +17 -0
  1519. venv/Lib/site-packages/urllib3/contrib/emscripten/connection.py +260 -0
  1520. venv/Lib/site-packages/urllib3/contrib/emscripten/fetch.py +726 -0
  1521. venv/Lib/site-packages/urllib3/contrib/emscripten/request.py +22 -0
  1522. venv/Lib/site-packages/urllib3/contrib/emscripten/response.py +281 -0
  1523. venv/Lib/site-packages/urllib3/contrib/pyopenssl.py +563 -0
  1524. venv/Lib/site-packages/urllib3/contrib/socks.py +228 -0
  1525. venv/Lib/site-packages/urllib3/exceptions.py +335 -0
  1526. venv/Lib/site-packages/urllib3/fields.py +341 -0
  1527. venv/Lib/site-packages/urllib3/filepost.py +89 -0
  1528. venv/Lib/site-packages/urllib3/http2/__init__.py +53 -0
  1529. venv/Lib/site-packages/urllib3/http2/connection.py +356 -0
  1530. venv/Lib/site-packages/urllib3/http2/probe.py +87 -0
  1531. venv/Lib/site-packages/urllib3/poolmanager.py +653 -0
  1532. venv/Lib/site-packages/urllib3/py.typed +2 -0
  1533. venv/Lib/site-packages/urllib3/response.py +1493 -0
  1534. venv/Lib/site-packages/urllib3/util/__init__.py +42 -0
  1535. venv/Lib/site-packages/urllib3/util/connection.py +137 -0
  1536. venv/Lib/site-packages/urllib3/util/proxy.py +43 -0
  1537. venv/Lib/site-packages/urllib3/util/request.py +263 -0
  1538. venv/Lib/site-packages/urllib3/util/response.py +101 -0
  1539. venv/Lib/site-packages/urllib3/util/retry.py +557 -0
  1540. venv/Lib/site-packages/urllib3/util/ssl_.py +477 -0
  1541. venv/Lib/site-packages/urllib3/util/ssl_match_hostname.py +153 -0
  1542. venv/Lib/site-packages/urllib3/util/ssltransport.py +271 -0
  1543. venv/Lib/site-packages/urllib3/util/timeout.py +275 -0
  1544. venv/Lib/site-packages/urllib3/util/url.py +469 -0
  1545. venv/Lib/site-packages/urllib3/util/util.py +42 -0
  1546. venv/Lib/site-packages/urllib3/util/wait.py +124 -0
  1547. venv/Lib/site-packages/win32ctypes/__init__.py +8 -0
  1548. venv/Lib/site-packages/win32ctypes/core/__init__.py +60 -0
  1549. venv/Lib/site-packages/win32ctypes/core/_winerrors.py +9 -0
  1550. venv/Lib/site-packages/win32ctypes/core/cffi/__init__.py +11 -0
  1551. venv/Lib/site-packages/win32ctypes/core/cffi/_authentication.py +172 -0
  1552. venv/Lib/site-packages/win32ctypes/core/cffi/_common.py +29 -0
  1553. venv/Lib/site-packages/win32ctypes/core/cffi/_dll.py +30 -0
  1554. venv/Lib/site-packages/win32ctypes/core/cffi/_nl_support.py +18 -0
  1555. venv/Lib/site-packages/win32ctypes/core/cffi/_resource.py +132 -0
  1556. venv/Lib/site-packages/win32ctypes/core/cffi/_system_information.py +32 -0
  1557. venv/Lib/site-packages/win32ctypes/core/cffi/_time.py +18 -0
  1558. venv/Lib/site-packages/win32ctypes/core/cffi/_util.py +105 -0
  1559. venv/Lib/site-packages/win32ctypes/core/compat.py +10 -0
  1560. venv/Lib/site-packages/win32ctypes/core/ctypes/__init__.py +11 -0
  1561. venv/Lib/site-packages/win32ctypes/core/ctypes/_authentication.py +122 -0
  1562. venv/Lib/site-packages/win32ctypes/core/ctypes/_common.py +53 -0
  1563. venv/Lib/site-packages/win32ctypes/core/ctypes/_dll.py +21 -0
  1564. venv/Lib/site-packages/win32ctypes/core/ctypes/_nl_support.py +12 -0
  1565. venv/Lib/site-packages/win32ctypes/core/ctypes/_resource.py +148 -0
  1566. venv/Lib/site-packages/win32ctypes/core/ctypes/_system_information.py +36 -0
  1567. venv/Lib/site-packages/win32ctypes/core/ctypes/_time.py +15 -0
  1568. venv/Lib/site-packages/win32ctypes/core/ctypes/_util.py +78 -0
  1569. venv/Lib/site-packages/win32ctypes/pywin32/__init__.py +12 -0
  1570. venv/Lib/site-packages/win32ctypes/pywin32/pywintypes.py +67 -0
  1571. venv/Lib/site-packages/win32ctypes/pywin32/win32api.py +294 -0
  1572. venv/Lib/site-packages/win32ctypes/pywin32/win32cred.py +145 -0
  1573. venv/Lib/site-packages/win32ctypes/pywintypes.py +13 -0
  1574. venv/Lib/site-packages/win32ctypes/tests/__init__.py +21 -0
  1575. venv/Lib/site-packages/win32ctypes/tests/test_backends.py +36 -0
  1576. venv/Lib/site-packages/win32ctypes/tests/test_win32api.py +304 -0
  1577. venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py +230 -0
  1578. venv/Lib/site-packages/win32ctypes/version.py +1 -0
  1579. venv/Lib/site-packages/win32ctypes/win32api.py +13 -0
  1580. venv/Lib/site-packages/win32ctypes/win32cred.py +13 -0
@@ -0,0 +1,1763 @@
1
+ # mypy: allow-untyped-defs
2
+ """Terminal reporting of the full testing process.
3
+
4
+ This is a good source for looking at the various reporting hooks.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ from collections import Counter
11
+ from collections.abc import Callable
12
+ from collections.abc import Generator
13
+ from collections.abc import Mapping
14
+ from collections.abc import Sequence
15
+ import dataclasses
16
+ import datetime
17
+ from functools import partial
18
+ import inspect
19
+ from pathlib import Path
20
+ import platform
21
+ import sys
22
+ import textwrap
23
+ from typing import Any
24
+ from typing import ClassVar
25
+ from typing import final
26
+ from typing import Literal
27
+ from typing import NamedTuple
28
+ from typing import TextIO
29
+ from typing import TYPE_CHECKING
30
+ import warnings
31
+
32
+ import pluggy
33
+
34
+ from _pytest import compat
35
+ from _pytest import nodes
36
+ from _pytest import timing
37
+ from _pytest._code import ExceptionInfo
38
+ from _pytest._code.code import ExceptionRepr
39
+ from _pytest._io import TerminalWriter
40
+ from _pytest._io.wcwidth import wcswidth
41
+ import _pytest._version
42
+ from _pytest.compat import running_on_ci
43
+ from _pytest.config import _PluggyPlugin
44
+ from _pytest.config import Config
45
+ from _pytest.config import ExitCode
46
+ from _pytest.config import hookimpl
47
+ from _pytest.config.argparsing import Parser
48
+ from _pytest.nodes import Item
49
+ from _pytest.nodes import Node
50
+ from _pytest.pathlib import absolutepath
51
+ from _pytest.pathlib import bestrelpath
52
+ from _pytest.reports import BaseReport
53
+ from _pytest.reports import CollectReport
54
+ from _pytest.reports import TestReport
55
+
56
+
57
+ if TYPE_CHECKING:
58
+ from _pytest.main import Session
59
+
60
+
61
+ REPORT_COLLECTING_RESOLUTION = 0.5
62
+
63
+ KNOWN_TYPES = (
64
+ "failed",
65
+ "passed",
66
+ "skipped",
67
+ "deselected",
68
+ "xfailed",
69
+ "xpassed",
70
+ "warnings",
71
+ "error",
72
+ "subtests passed",
73
+ "subtests failed",
74
+ "subtests skipped",
75
+ )
76
+
77
+ _REPORTCHARS_DEFAULT = "fE"
78
+
79
+
80
+ class MoreQuietAction(argparse.Action):
81
+ """A modified copy of the argparse count action which counts down and updates
82
+ the legacy quiet attribute at the same time.
83
+
84
+ Used to unify verbosity handling.
85
+ """
86
+
87
+ def __init__(
88
+ self,
89
+ option_strings: Sequence[str],
90
+ dest: str,
91
+ default: object = None,
92
+ required: bool = False,
93
+ help: str | None = None,
94
+ ) -> None:
95
+ super().__init__(
96
+ option_strings=option_strings,
97
+ dest=dest,
98
+ nargs=0,
99
+ default=default,
100
+ required=required,
101
+ help=help,
102
+ )
103
+
104
+ def __call__(
105
+ self,
106
+ parser: argparse.ArgumentParser,
107
+ namespace: argparse.Namespace,
108
+ values: str | Sequence[object] | None,
109
+ option_string: str | None = None,
110
+ ) -> None:
111
+ new_count = getattr(namespace, self.dest, 0) - 1
112
+ setattr(namespace, self.dest, new_count)
113
+ # todo Deprecate config.quiet
114
+ namespace.quiet = getattr(namespace, "quiet", 0) + 1
115
+
116
+
117
+ class TestShortLogReport(NamedTuple):
118
+ """Used to store the test status result category, shortletter and verbose word.
119
+ For example ``"rerun", "R", ("RERUN", {"yellow": True})``.
120
+
121
+ :ivar category:
122
+ The class of result, for example ``“passed”``, ``“skipped”``, ``“error”``, or the empty string.
123
+
124
+ :ivar letter:
125
+ The short letter shown as testing progresses, for example ``"."``, ``"s"``, ``"E"``, or the empty string.
126
+
127
+ :ivar word:
128
+ Verbose word is shown as testing progresses in verbose mode, for example ``"PASSED"``, ``"SKIPPED"``,
129
+ ``"ERROR"``, or the empty string.
130
+ """
131
+
132
+ category: str
133
+ letter: str
134
+ word: str | tuple[str, Mapping[str, bool]]
135
+
136
+
137
+ def pytest_addoption(parser: Parser) -> None:
138
+ group = parser.getgroup("terminal reporting", "Reporting", after="general")
139
+ group._addoption( # private to use reserved lower-case short option
140
+ "-v",
141
+ "--verbose",
142
+ action="count",
143
+ default=0,
144
+ dest="verbose",
145
+ help="Increase verbosity",
146
+ )
147
+ group.addoption(
148
+ "--no-header",
149
+ action="store_true",
150
+ default=False,
151
+ dest="no_header",
152
+ help="Disable header",
153
+ )
154
+ group.addoption(
155
+ "--no-summary",
156
+ action="store_true",
157
+ default=False,
158
+ dest="no_summary",
159
+ help="Disable summary",
160
+ )
161
+ group.addoption(
162
+ "--no-fold-skipped",
163
+ action="store_false",
164
+ dest="fold_skipped",
165
+ default=True,
166
+ help="Do not fold skipped tests in short summary.",
167
+ )
168
+ group.addoption(
169
+ "--force-short-summary",
170
+ action="store_true",
171
+ dest="force_short_summary",
172
+ default=False,
173
+ help="Force condensed summary output regardless of verbosity level.",
174
+ )
175
+ group._addoption( # private to use reserved lower-case short option
176
+ "-q",
177
+ "--quiet",
178
+ action=MoreQuietAction,
179
+ default=0,
180
+ dest="verbose",
181
+ help="Decrease verbosity",
182
+ )
183
+ group.addoption(
184
+ "--verbosity",
185
+ dest="verbose",
186
+ type=int,
187
+ default=0,
188
+ help="Set verbosity. Default: 0.",
189
+ )
190
+ group._addoption( # private to use reserved lower-case short option
191
+ "-r",
192
+ action="store",
193
+ dest="reportchars",
194
+ default=_REPORTCHARS_DEFAULT,
195
+ metavar="chars",
196
+ help="Show extra test summary info as specified by chars: (f)ailed, "
197
+ "(E)rror, (s)kipped, (x)failed, (X)passed, "
198
+ "(p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll. "
199
+ "(w)arnings are enabled by default (see --disable-warnings), "
200
+ "'N' can be used to reset the list. (default: 'fE').",
201
+ )
202
+ group.addoption(
203
+ "--disable-warnings",
204
+ "--disable-pytest-warnings",
205
+ default=False,
206
+ dest="disable_warnings",
207
+ action="store_true",
208
+ help="Disable warnings summary",
209
+ )
210
+ group._addoption( # private to use reserved lower-case short option
211
+ "-l",
212
+ "--showlocals",
213
+ action="store_true",
214
+ dest="showlocals",
215
+ default=False,
216
+ help="Show locals in tracebacks (disabled by default)",
217
+ )
218
+ group.addoption(
219
+ "--no-showlocals",
220
+ action="store_false",
221
+ dest="showlocals",
222
+ help="Hide locals in tracebacks (negate --showlocals passed through addopts)",
223
+ )
224
+ group.addoption(
225
+ "--tb",
226
+ metavar="style",
227
+ action="store",
228
+ dest="tbstyle",
229
+ default="auto",
230
+ choices=["auto", "long", "short", "no", "line", "native"],
231
+ help="Traceback print mode (auto/long/short/line/native/no)",
232
+ )
233
+ group.addoption(
234
+ "--xfail-tb",
235
+ action="store_true",
236
+ dest="xfail_tb",
237
+ default=False,
238
+ help="Show tracebacks for xfail (as long as --tb != no)",
239
+ )
240
+ group.addoption(
241
+ "--show-capture",
242
+ action="store",
243
+ dest="showcapture",
244
+ choices=["no", "stdout", "stderr", "log", "all"],
245
+ default="all",
246
+ help="Controls how captured stdout/stderr/log is shown on failed tests. "
247
+ "Default: all.",
248
+ )
249
+ group.addoption(
250
+ "--fulltrace",
251
+ "--full-trace",
252
+ action="store_true",
253
+ default=False,
254
+ help="Don't cut any tracebacks (default is to cut)",
255
+ )
256
+ group.addoption(
257
+ "--color",
258
+ metavar="color",
259
+ action="store",
260
+ dest="color",
261
+ default="auto",
262
+ choices=["yes", "no", "auto"],
263
+ help="Color terminal output (yes/no/auto)",
264
+ )
265
+ group.addoption(
266
+ "--code-highlight",
267
+ default="yes",
268
+ choices=["yes", "no"],
269
+ help="Whether code should be highlighted (only if --color is also enabled). "
270
+ "Default: yes.",
271
+ )
272
+
273
+ parser.addini(
274
+ "console_output_style",
275
+ help='Console output: "classic", or with additional progress information '
276
+ '("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces '
277
+ "progress even when capture=no)",
278
+ default="progress",
279
+ )
280
+ Config._add_verbosity_ini(
281
+ parser,
282
+ Config.VERBOSITY_TEST_CASES,
283
+ help=(
284
+ "Specify a verbosity level for test case execution, overriding the main level. "
285
+ "Higher levels will provide more detailed information about each test case executed."
286
+ ),
287
+ )
288
+
289
+
290
+ def pytest_configure(config: Config) -> None:
291
+ reporter = TerminalReporter(config, sys.stdout)
292
+ config.pluginmanager.register(reporter, "terminalreporter")
293
+ if config.option.debug or config.option.traceconfig:
294
+
295
+ def mywriter(tags, args):
296
+ msg = " ".join(map(str, args))
297
+ reporter.write_line("[traceconfig] " + msg)
298
+
299
+ config.trace.root.setprocessor("pytest:config", mywriter)
300
+
301
+ # See terminalprogress.py.
302
+ # On Windows it's safe to load by default.
303
+ if sys.platform == "win32":
304
+ config.pluginmanager.import_plugin("terminalprogress")
305
+
306
+
307
+ def getreportopt(config: Config) -> str:
308
+ reportchars: str = config.option.reportchars
309
+
310
+ old_aliases = {"F", "S"}
311
+ reportopts = ""
312
+ for char in reportchars:
313
+ if char in old_aliases:
314
+ char = char.lower()
315
+ if char == "a":
316
+ reportopts = "sxXEf"
317
+ elif char == "A":
318
+ reportopts = "PpsxXEf"
319
+ elif char == "N":
320
+ reportopts = ""
321
+ elif char not in reportopts:
322
+ reportopts += char
323
+
324
+ if not config.option.disable_warnings and "w" not in reportopts:
325
+ reportopts = "w" + reportopts
326
+ elif config.option.disable_warnings and "w" in reportopts:
327
+ reportopts = reportopts.replace("w", "")
328
+
329
+ return reportopts
330
+
331
+
332
+ @hookimpl(trylast=True) # after _pytest.runner
333
+ def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str]:
334
+ letter = "F"
335
+ if report.passed:
336
+ letter = "."
337
+ elif report.skipped:
338
+ letter = "s"
339
+
340
+ outcome: str = report.outcome
341
+ if report.when in ("collect", "setup", "teardown") and outcome == "failed":
342
+ outcome = "error"
343
+ letter = "E"
344
+
345
+ return outcome, letter, outcome.upper()
346
+
347
+
348
+ @dataclasses.dataclass
349
+ class WarningReport:
350
+ """Simple structure to hold warnings information captured by ``pytest_warning_recorded``.
351
+
352
+ :ivar str message:
353
+ User friendly message about the warning.
354
+ :ivar str|None nodeid:
355
+ nodeid that generated the warning (see ``get_location``).
356
+ :ivar tuple fslocation:
357
+ File system location of the source of the warning (see ``get_location``).
358
+ """
359
+
360
+ message: str
361
+ nodeid: str | None = None
362
+ fslocation: tuple[str, int] | None = None
363
+
364
+ count_towards_summary: ClassVar = True
365
+
366
+ def get_location(self, config: Config) -> str | None:
367
+ """Return the more user-friendly information about the location of a warning, or None."""
368
+ if self.nodeid:
369
+ return self.nodeid
370
+ if self.fslocation:
371
+ filename, linenum = self.fslocation
372
+ relpath = bestrelpath(config.invocation_params.dir, absolutepath(filename))
373
+ return f"{relpath}:{linenum}"
374
+ return None
375
+
376
+
377
+ @final
378
+ class TerminalReporter:
379
+ def __init__(self, config: Config, file: TextIO | None = None) -> None:
380
+ import _pytest.config
381
+
382
+ self.config = config
383
+ self._numcollected = 0
384
+ self._session: Session | None = None
385
+ self._showfspath: bool | None = None
386
+
387
+ self.stats: dict[str, list[Any]] = {}
388
+ self._main_color: str | None = None
389
+ self._known_types: list[str] | None = None
390
+ self.startpath = config.invocation_params.dir
391
+ if file is None:
392
+ file = sys.stdout
393
+ self._tw = _pytest.config.create_terminal_writer(config, file)
394
+ self._screen_width = self._tw.fullwidth
395
+ self.currentfspath: None | Path | str | int = None
396
+ self.reportchars = getreportopt(config)
397
+ self.foldskipped = config.option.fold_skipped
398
+ self.hasmarkup = self._tw.hasmarkup
399
+ # isatty should be a method but was wrongly implemented as a boolean.
400
+ # We use CallableBool here to support both.
401
+ self.isatty = compat.CallableBool(file.isatty())
402
+ self._progress_nodeids_reported: set[str] = set()
403
+ self._timing_nodeids_reported: set[str] = set()
404
+ self._show_progress_info = self._determine_show_progress_info()
405
+ self._collect_report_last_write = timing.Instant()
406
+ self._already_displayed_warnings: int | None = None
407
+ self._keyboardinterrupt_memo: ExceptionRepr | None = None
408
+
409
+ def _determine_show_progress_info(
410
+ self,
411
+ ) -> Literal["progress", "count", "times", False]:
412
+ """Return whether we should display progress information based on the current config."""
413
+ # do not show progress if we are not capturing output (#3038) unless explicitly
414
+ # overridden by progress-even-when-capture-no
415
+ if (
416
+ self.config.getoption("capture", "no") == "no"
417
+ and self.config.getini("console_output_style")
418
+ != "progress-even-when-capture-no"
419
+ ):
420
+ return False
421
+ # do not show progress if we are showing fixture setup/teardown
422
+ if self.config.getoption("setupshow", False):
423
+ return False
424
+ cfg: str = self.config.getini("console_output_style")
425
+ if cfg in {"progress", "progress-even-when-capture-no"}:
426
+ return "progress"
427
+ elif cfg == "count":
428
+ return "count"
429
+ elif cfg == "times":
430
+ return "times"
431
+ else:
432
+ return False
433
+
434
+ @property
435
+ def verbosity(self) -> int:
436
+ verbosity: int = self.config.option.verbose
437
+ return verbosity
438
+
439
+ @property
440
+ def showheader(self) -> bool:
441
+ return self.verbosity >= 0
442
+
443
+ @property
444
+ def no_header(self) -> bool:
445
+ return bool(self.config.option.no_header)
446
+
447
+ @property
448
+ def no_summary(self) -> bool:
449
+ return bool(self.config.option.no_summary)
450
+
451
+ @property
452
+ def showfspath(self) -> bool:
453
+ if self._showfspath is None:
454
+ return self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) >= 0
455
+ return self._showfspath
456
+
457
+ @showfspath.setter
458
+ def showfspath(self, value: bool | None) -> None:
459
+ self._showfspath = value
460
+
461
+ @property
462
+ def showlongtestinfo(self) -> bool:
463
+ return self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) > 0
464
+
465
+ @property
466
+ def reported_progress(self) -> int:
467
+ """The amount of items reported in the progress so far.
468
+
469
+ :meta private:
470
+ """
471
+ return len(self._progress_nodeids_reported)
472
+
473
+ def hasopt(self, char: str) -> bool:
474
+ char = {"xfailed": "x", "skipped": "s"}.get(char, char)
475
+ return char in self.reportchars
476
+
477
+ def write_fspath_result(self, nodeid: str, res: str, **markup: bool) -> None:
478
+ fspath = self.config.rootpath / nodeid.split("::")[0]
479
+ if self.currentfspath is None or fspath != self.currentfspath:
480
+ if self.currentfspath is not None and self._show_progress_info:
481
+ self._write_progress_information_filling_space()
482
+ self.currentfspath = fspath
483
+ relfspath = bestrelpath(self.startpath, fspath)
484
+ self._tw.line()
485
+ self._tw.write(relfspath + " ")
486
+ self._tw.write(res, flush=True, **markup)
487
+
488
+ def write_ensure_prefix(self, prefix: str, extra: str = "", **kwargs) -> None:
489
+ if self.currentfspath != prefix:
490
+ self._tw.line()
491
+ self.currentfspath = prefix
492
+ self._tw.write(prefix)
493
+ if extra:
494
+ self._tw.write(extra, **kwargs)
495
+ self.currentfspath = -2
496
+
497
+ def ensure_newline(self) -> None:
498
+ if self.currentfspath:
499
+ self._tw.line()
500
+ self.currentfspath = None
501
+
502
+ def wrap_write(
503
+ self,
504
+ content: str,
505
+ *,
506
+ flush: bool = False,
507
+ margin: int = 8,
508
+ line_sep: str = "\n",
509
+ **markup: bool,
510
+ ) -> None:
511
+ """Wrap message with margin for progress info."""
512
+ width_of_current_line = self._tw.width_of_current_line
513
+ wrapped = line_sep.join(
514
+ textwrap.wrap(
515
+ " " * width_of_current_line + content,
516
+ width=self._screen_width - margin,
517
+ drop_whitespace=True,
518
+ replace_whitespace=False,
519
+ ),
520
+ )
521
+ wrapped = wrapped[width_of_current_line:]
522
+ self._tw.write(wrapped, flush=flush, **markup)
523
+
524
+ def write(self, content: str, *, flush: bool = False, **markup: bool) -> None:
525
+ self._tw.write(content, flush=flush, **markup)
526
+
527
+ def write_raw(self, content: str, *, flush: bool = False) -> None:
528
+ self._tw.write_raw(content, flush=flush)
529
+
530
+ def flush(self) -> None:
531
+ self._tw.flush()
532
+
533
+ def write_line(self, line: str | bytes, **markup: bool) -> None:
534
+ if not isinstance(line, str):
535
+ line = str(line, errors="replace")
536
+ self.ensure_newline()
537
+ self._tw.line(line, **markup)
538
+
539
+ def rewrite(self, line: str, **markup: bool) -> None:
540
+ """Rewinds the terminal cursor to the beginning and writes the given line.
541
+
542
+ :param erase:
543
+ If True, will also add spaces until the full terminal width to ensure
544
+ previous lines are properly erased.
545
+
546
+ The rest of the keyword arguments are markup instructions.
547
+ """
548
+ erase = markup.pop("erase", False)
549
+ if erase:
550
+ fill_count = self._tw.fullwidth - len(line) - 1
551
+ fill = " " * fill_count
552
+ else:
553
+ fill = ""
554
+ line = str(line)
555
+ self._tw.write("\r" + line + fill, **markup)
556
+
557
+ def write_sep(
558
+ self,
559
+ sep: str,
560
+ title: str | None = None,
561
+ fullwidth: int | None = None,
562
+ **markup: bool,
563
+ ) -> None:
564
+ self.ensure_newline()
565
+ self._tw.sep(sep, title, fullwidth, **markup)
566
+
567
+ def section(self, title: str, sep: str = "=", **kw: bool) -> None:
568
+ self._tw.sep(sep, title, **kw)
569
+
570
+ def line(self, msg: str, **kw: bool) -> None:
571
+ self._tw.line(msg, **kw)
572
+
573
+ def _add_stats(self, category: str, items: Sequence[Any]) -> None:
574
+ set_main_color = category not in self.stats
575
+ self.stats.setdefault(category, []).extend(items)
576
+ if set_main_color:
577
+ self._set_main_color()
578
+
579
+ def pytest_internalerror(self, excrepr: ExceptionRepr) -> bool:
580
+ for line in str(excrepr).split("\n"):
581
+ self.write_line("INTERNALERROR> " + line)
582
+ return True
583
+
584
+ def pytest_warning_recorded(
585
+ self,
586
+ warning_message: warnings.WarningMessage,
587
+ nodeid: str,
588
+ ) -> None:
589
+ from _pytest.warnings import warning_record_to_str
590
+
591
+ fslocation = warning_message.filename, warning_message.lineno
592
+ message = warning_record_to_str(warning_message)
593
+
594
+ warning_report = WarningReport(
595
+ fslocation=fslocation, message=message, nodeid=nodeid
596
+ )
597
+ self._add_stats("warnings", [warning_report])
598
+
599
+ def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
600
+ if self.config.option.traceconfig:
601
+ msg = f"PLUGIN registered: {plugin}"
602
+ # XXX This event may happen during setup/teardown time
603
+ # which unfortunately captures our output here
604
+ # which garbles our output if we use self.write_line.
605
+ self.write_line(msg)
606
+
607
+ def pytest_deselected(self, items: Sequence[Item]) -> None:
608
+ self._add_stats("deselected", items)
609
+
610
+ def pytest_runtest_logstart(
611
+ self, nodeid: str, location: tuple[str, int | None, str]
612
+ ) -> None:
613
+ fspath, lineno, domain = location
614
+ # Ensure that the path is printed before the
615
+ # 1st test of a module starts running.
616
+ if self.showlongtestinfo:
617
+ line = self._locationline(nodeid, fspath, lineno, domain)
618
+ self.write_ensure_prefix(line, "")
619
+ self.flush()
620
+ elif self.showfspath:
621
+ self.write_fspath_result(nodeid, "")
622
+ self.flush()
623
+
624
+ def pytest_runtest_logreport(self, report: TestReport) -> None:
625
+ self._tests_ran = True
626
+ rep = report
627
+
628
+ res = TestShortLogReport(
629
+ *self.config.hook.pytest_report_teststatus(report=rep, config=self.config)
630
+ )
631
+ category, letter, word = res.category, res.letter, res.word
632
+ if not isinstance(word, tuple):
633
+ markup = None
634
+ else:
635
+ word, markup = word
636
+ self._add_stats(category, [rep])
637
+ if not letter and not word:
638
+ # Probably passed setup/teardown.
639
+ return
640
+ if markup is None:
641
+ was_xfail = hasattr(report, "wasxfail")
642
+ if rep.passed and not was_xfail:
643
+ markup = {"green": True}
644
+ elif rep.passed and was_xfail:
645
+ markup = {"yellow": True}
646
+ elif rep.failed:
647
+ markup = {"red": True}
648
+ elif rep.skipped:
649
+ markup = {"yellow": True}
650
+ else:
651
+ markup = {}
652
+ self._progress_nodeids_reported.add(rep.nodeid)
653
+ if self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) <= 0:
654
+ self._tw.write(letter, **markup)
655
+ # When running in xdist, the logreport and logfinish of multiple
656
+ # items are interspersed, e.g. `logreport`, `logreport`,
657
+ # `logfinish`, `logfinish`. To avoid the "past edge" calculation
658
+ # from getting confused and overflowing (#7166), do the past edge
659
+ # printing here and not in logfinish, except for the 100% which
660
+ # should only be printed after all teardowns are finished.
661
+ if self._show_progress_info and not self._is_last_item:
662
+ self._write_progress_information_if_past_edge()
663
+ else:
664
+ line = self._locationline(rep.nodeid, *rep.location)
665
+ running_xdist = hasattr(rep, "node")
666
+ if not running_xdist:
667
+ self.write_ensure_prefix(line, word, **markup)
668
+ if rep.skipped or hasattr(report, "wasxfail"):
669
+ reason = _get_raw_skip_reason(rep)
670
+ if self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) < 2:
671
+ available_width = (
672
+ (self._tw.fullwidth - self._tw.width_of_current_line)
673
+ - len(" [100%]")
674
+ - 1
675
+ )
676
+ formatted_reason = _format_trimmed(
677
+ " ({})", reason, available_width
678
+ )
679
+ else:
680
+ formatted_reason = f" ({reason})"
681
+
682
+ if reason and formatted_reason is not None:
683
+ self.wrap_write(formatted_reason)
684
+ if self._show_progress_info:
685
+ self._write_progress_information_filling_space()
686
+ else:
687
+ self.ensure_newline()
688
+ self._tw.write(f"[{rep.node.gateway.id}]")
689
+ if self._show_progress_info:
690
+ self._tw.write(
691
+ self._get_progress_information_message() + " ", cyan=True
692
+ )
693
+ else:
694
+ self._tw.write(" ")
695
+ self._tw.write(word, **markup)
696
+ self._tw.write(" " + line)
697
+ self.currentfspath = -2
698
+ self.flush()
699
+
700
+ @property
701
+ def _is_last_item(self) -> bool:
702
+ assert self._session is not None
703
+ return self.reported_progress == self._session.testscollected
704
+
705
+ @hookimpl(wrapper=True)
706
+ def pytest_runtestloop(self) -> Generator[None, object, object]:
707
+ result = yield
708
+
709
+ # Write the final/100% progress -- deferred until the loop is complete.
710
+ if (
711
+ self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) <= 0
712
+ and self._show_progress_info
713
+ and self.reported_progress
714
+ ):
715
+ self._write_progress_information_filling_space()
716
+
717
+ return result
718
+
719
+ def _get_progress_information_message(self) -> str:
720
+ assert self._session
721
+ collected = self._session.testscollected
722
+ if self._show_progress_info == "count":
723
+ if collected:
724
+ progress = self.reported_progress
725
+ counter_format = f"{{:{len(str(collected))}d}}"
726
+ format_string = f" [{counter_format}/{{}}]"
727
+ return format_string.format(progress, collected)
728
+ return f" [ {collected} / {collected} ]"
729
+ if self._show_progress_info == "times":
730
+ if not collected:
731
+ return ""
732
+ all_reports = (
733
+ self._get_reports_to_display("passed")
734
+ + self._get_reports_to_display("xpassed")
735
+ + self._get_reports_to_display("failed")
736
+ + self._get_reports_to_display("xfailed")
737
+ + self._get_reports_to_display("skipped")
738
+ + self._get_reports_to_display("error")
739
+ + self._get_reports_to_display("")
740
+ )
741
+ current_location = all_reports[-1].location[0]
742
+ not_reported = [
743
+ r for r in all_reports if r.nodeid not in self._timing_nodeids_reported
744
+ ]
745
+ tests_in_module = sum(
746
+ i.location[0] == current_location for i in self._session.items
747
+ )
748
+ tests_completed = sum(
749
+ r.when == "setup"
750
+ for r in not_reported
751
+ if r.location[0] == current_location
752
+ )
753
+ last_in_module = tests_completed == tests_in_module
754
+ if self.showlongtestinfo or last_in_module:
755
+ self._timing_nodeids_reported.update(r.nodeid for r in not_reported)
756
+ return format_node_duration(
757
+ sum(r.duration for r in not_reported if isinstance(r, TestReport))
758
+ )
759
+ return ""
760
+ if collected:
761
+ return f" [{self.reported_progress * 100 // collected:3d}%]"
762
+ return " [100%]"
763
+
764
+ def _write_progress_information_if_past_edge(self) -> None:
765
+ w = self._width_of_current_line
766
+ if self._show_progress_info == "count":
767
+ assert self._session
768
+ num_tests = self._session.testscollected
769
+ progress_length = len(f" [{num_tests}/{num_tests}]")
770
+ elif self._show_progress_info == "times":
771
+ progress_length = len(" 99h 59m")
772
+ else:
773
+ progress_length = len(" [100%]")
774
+ past_edge = w + progress_length + 1 >= self._screen_width
775
+ if past_edge:
776
+ main_color, _ = self._get_main_color()
777
+ msg = self._get_progress_information_message()
778
+ self._tw.write(msg + "\n", **{main_color: True})
779
+
780
+ def _write_progress_information_filling_space(self) -> None:
781
+ color, _ = self._get_main_color()
782
+ msg = self._get_progress_information_message()
783
+ w = self._width_of_current_line
784
+ fill = self._tw.fullwidth - w - 1
785
+ self.write(msg.rjust(fill), flush=True, **{color: True})
786
+
787
+ @property
788
+ def _width_of_current_line(self) -> int:
789
+ """Return the width of the current line."""
790
+ return self._tw.width_of_current_line
791
+
792
+ def pytest_collection(self) -> None:
793
+ if self.isatty():
794
+ if self.config.option.verbose >= 0:
795
+ self.write("collecting ... ", flush=True, bold=True)
796
+ elif self.config.option.verbose >= 1:
797
+ self.write("collecting ... ", flush=True, bold=True)
798
+
799
+ def pytest_collectreport(self, report: CollectReport) -> None:
800
+ if report.failed:
801
+ self._add_stats("error", [report])
802
+ elif report.skipped:
803
+ self._add_stats("skipped", [report])
804
+ items = [x for x in report.result if isinstance(x, Item)]
805
+ self._numcollected += len(items)
806
+ if self.isatty():
807
+ self.report_collect()
808
+
809
+ def report_collect(self, final: bool = False) -> None:
810
+ if self.config.option.verbose < 0:
811
+ return
812
+
813
+ if not final:
814
+ # Only write the "collecting" report every `REPORT_COLLECTING_RESOLUTION`.
815
+ if (
816
+ self._collect_report_last_write.elapsed().seconds
817
+ < REPORT_COLLECTING_RESOLUTION
818
+ ):
819
+ return
820
+ self._collect_report_last_write = timing.Instant()
821
+
822
+ errors = len(self.stats.get("error", []))
823
+ skipped = len(self.stats.get("skipped", []))
824
+ deselected = len(self.stats.get("deselected", []))
825
+ selected = self._numcollected - deselected
826
+ line = "collected " if final else "collecting "
827
+ line += (
828
+ str(self._numcollected) + " item" + ("" if self._numcollected == 1 else "s")
829
+ )
830
+ if errors:
831
+ line += f" / {errors} error{'s' if errors != 1 else ''}"
832
+ if deselected:
833
+ line += f" / {deselected} deselected"
834
+ if skipped:
835
+ line += f" / {skipped} skipped"
836
+ if self._numcollected > selected:
837
+ line += f" / {selected} selected"
838
+ if self.isatty():
839
+ self.rewrite(line, bold=True, erase=True)
840
+ if final:
841
+ self.write("\n")
842
+ else:
843
+ self.write_line(line)
844
+
845
+ @hookimpl(trylast=True)
846
+ def pytest_sessionstart(self, session: Session) -> None:
847
+ self._session = session
848
+ self._session_start = timing.Instant()
849
+ if not self.showheader:
850
+ return
851
+ self.write_sep("=", "test session starts", bold=True)
852
+ verinfo = platform.python_version()
853
+ if not self.no_header:
854
+ msg = f"platform {sys.platform} -- Python {verinfo}"
855
+ pypy_version_info = getattr(sys, "pypy_version_info", None)
856
+ if pypy_version_info:
857
+ verinfo = ".".join(map(str, pypy_version_info[:3]))
858
+ msg += f"[pypy-{verinfo}-{pypy_version_info[3]}]"
859
+ msg += f", pytest-{_pytest._version.version}, pluggy-{pluggy.__version__}"
860
+ if (
861
+ self.verbosity > 0
862
+ or self.config.option.debug
863
+ or getattr(self.config.option, "pastebin", None)
864
+ ):
865
+ msg += " -- " + str(sys.executable)
866
+ self.write_line(msg)
867
+ lines = self.config.hook.pytest_report_header(
868
+ config=self.config, start_path=self.startpath
869
+ )
870
+ self._write_report_lines_from_hooks(lines)
871
+
872
+ def _write_report_lines_from_hooks(
873
+ self, lines: Sequence[str | Sequence[str]]
874
+ ) -> None:
875
+ for line_or_lines in reversed(lines):
876
+ if isinstance(line_or_lines, str):
877
+ self.write_line(line_or_lines)
878
+ else:
879
+ for line in line_or_lines:
880
+ self.write_line(line)
881
+
882
+ def pytest_report_header(self, config: Config) -> list[str]:
883
+ result = [f"rootdir: {config.rootpath}"]
884
+
885
+ if config.inipath:
886
+ warning = ""
887
+ if config._ignored_config_files:
888
+ warning = f" (WARNING: ignoring pytest config in {', '.join(config._ignored_config_files)}!)"
889
+ result.append(
890
+ "configfile: " + bestrelpath(config.rootpath, config.inipath) + warning
891
+ )
892
+
893
+ if config.args_source == Config.ArgsSource.TESTPATHS:
894
+ testpaths: list[str] = config.getini("testpaths")
895
+ result.append("testpaths: {}".format(", ".join(testpaths)))
896
+
897
+ plugininfo = config.pluginmanager.list_plugin_distinfo()
898
+ if plugininfo:
899
+ result.append(
900
+ "plugins: {}".format(", ".join(_plugin_nameversions(plugininfo)))
901
+ )
902
+ return result
903
+
904
+ def pytest_collection_finish(self, session: Session) -> None:
905
+ self.report_collect(True)
906
+
907
+ lines = self.config.hook.pytest_report_collectionfinish(
908
+ config=self.config,
909
+ start_path=self.startpath,
910
+ items=session.items,
911
+ )
912
+ self._write_report_lines_from_hooks(lines)
913
+
914
+ if self.config.getoption("collectonly"):
915
+ if session.items:
916
+ if self.config.option.verbose > -1:
917
+ self._tw.line("")
918
+ self._printcollecteditems(session.items)
919
+
920
+ failed = self.stats.get("failed")
921
+ if failed:
922
+ self._tw.sep("!", "collection failures")
923
+ for rep in failed:
924
+ rep.toterminal(self._tw)
925
+
926
+ def _printcollecteditems(self, items: Sequence[Item]) -> None:
927
+ test_cases_verbosity = self.config.get_verbosity(Config.VERBOSITY_TEST_CASES)
928
+ if test_cases_verbosity < 0:
929
+ if test_cases_verbosity < -1:
930
+ counts = Counter(item.nodeid.split("::", 1)[0] for item in items)
931
+ for name, count in sorted(counts.items()):
932
+ self._tw.line(f"{name}: {count}")
933
+ else:
934
+ for item in items:
935
+ self._tw.line(item.nodeid)
936
+ return
937
+ stack: list[Node] = []
938
+ indent = ""
939
+ for item in items:
940
+ needed_collectors = item.listchain()[1:] # strip root node
941
+ while stack:
942
+ if stack == needed_collectors[: len(stack)]:
943
+ break
944
+ stack.pop()
945
+ for col in needed_collectors[len(stack) :]:
946
+ stack.append(col)
947
+ indent = (len(stack) - 1) * " "
948
+ self._tw.line(f"{indent}{col}")
949
+ if test_cases_verbosity >= 1:
950
+ obj = getattr(col, "obj", None)
951
+ doc = inspect.getdoc(obj) if obj else None
952
+ if doc:
953
+ for line in doc.splitlines():
954
+ self._tw.line("{}{}".format(indent + " ", line))
955
+
956
+ @hookimpl(wrapper=True)
957
+ def pytest_sessionfinish(
958
+ self, session: Session, exitstatus: int | ExitCode
959
+ ) -> Generator[None]:
960
+ result = yield
961
+ self._tw.line("")
962
+ summary_exit_codes = (
963
+ ExitCode.OK,
964
+ ExitCode.TESTS_FAILED,
965
+ ExitCode.INTERRUPTED,
966
+ ExitCode.USAGE_ERROR,
967
+ ExitCode.NO_TESTS_COLLECTED,
968
+ )
969
+ if exitstatus in summary_exit_codes and not self.no_summary:
970
+ self.config.hook.pytest_terminal_summary(
971
+ terminalreporter=self, exitstatus=exitstatus, config=self.config
972
+ )
973
+ if session.shouldfail:
974
+ self.write_sep("!", str(session.shouldfail), red=True)
975
+ if exitstatus == ExitCode.INTERRUPTED:
976
+ self._report_keyboardinterrupt()
977
+ self._keyboardinterrupt_memo = None
978
+ elif session.shouldstop:
979
+ self.write_sep("!", str(session.shouldstop), red=True)
980
+ self.summary_stats()
981
+ return result
982
+
983
+ @hookimpl(wrapper=True)
984
+ def pytest_terminal_summary(self) -> Generator[None]:
985
+ self.summary_errors()
986
+ self.summary_failures()
987
+ self.summary_xfailures()
988
+ self.summary_warnings()
989
+ self.summary_passes()
990
+ self.summary_xpasses()
991
+ try:
992
+ return (yield)
993
+ finally:
994
+ self.short_test_summary()
995
+ # Display any extra warnings from teardown here (if any).
996
+ self.summary_warnings()
997
+
998
+ def pytest_keyboard_interrupt(self, excinfo: ExceptionInfo[BaseException]) -> None:
999
+ self._keyboardinterrupt_memo = excinfo.getrepr(funcargs=True)
1000
+
1001
+ def pytest_unconfigure(self) -> None:
1002
+ if self._keyboardinterrupt_memo is not None:
1003
+ self._report_keyboardinterrupt()
1004
+
1005
+ def _report_keyboardinterrupt(self) -> None:
1006
+ excrepr = self._keyboardinterrupt_memo
1007
+ assert excrepr is not None
1008
+ assert excrepr.reprcrash is not None
1009
+ msg = excrepr.reprcrash.message
1010
+ self.write_sep("!", msg)
1011
+ if "KeyboardInterrupt" in msg:
1012
+ if self.config.option.fulltrace:
1013
+ excrepr.toterminal(self._tw)
1014
+ else:
1015
+ excrepr.reprcrash.toterminal(self._tw)
1016
+ self._tw.line(
1017
+ "(to show a full traceback on KeyboardInterrupt use --full-trace)",
1018
+ yellow=True,
1019
+ )
1020
+
1021
+ def _locationline(
1022
+ self, nodeid: str, fspath: str, lineno: int | None, domain: str
1023
+ ) -> str:
1024
+ def mkrel(nodeid: str) -> str:
1025
+ line = self.config.cwd_relative_nodeid(nodeid)
1026
+ if domain and line.endswith(domain):
1027
+ line = line[: -len(domain)]
1028
+ values = domain.split("[")
1029
+ values[0] = values[0].replace(".", "::") # don't replace '.' in params
1030
+ line += "[".join(values)
1031
+ return line
1032
+
1033
+ # fspath comes from testid which has a "/"-normalized path.
1034
+ if fspath:
1035
+ res = mkrel(nodeid)
1036
+ if self.verbosity >= 2 and nodeid.split("::")[0] != fspath.replace(
1037
+ "\\", nodes.SEP
1038
+ ):
1039
+ res += " <- " + bestrelpath(self.startpath, Path(fspath))
1040
+ else:
1041
+ res = "[location]"
1042
+ return res + " "
1043
+
1044
+ def _getfailureheadline(self, rep):
1045
+ head_line = rep.head_line
1046
+ if head_line:
1047
+ return head_line
1048
+ return "test session" # XXX?
1049
+
1050
+ def _getcrashline(self, rep):
1051
+ try:
1052
+ return str(rep.longrepr.reprcrash)
1053
+ except AttributeError:
1054
+ try:
1055
+ return str(rep.longrepr)[:50]
1056
+ except AttributeError:
1057
+ return ""
1058
+
1059
+ #
1060
+ # Summaries for sessionfinish.
1061
+ #
1062
+ def getreports(self, name: str):
1063
+ return [x for x in self.stats.get(name, ()) if not hasattr(x, "_pdbshown")]
1064
+
1065
+ def summary_warnings(self) -> None:
1066
+ if self.hasopt("w"):
1067
+ all_warnings: list[WarningReport] | None = self.stats.get("warnings")
1068
+ if not all_warnings:
1069
+ return
1070
+
1071
+ final = self._already_displayed_warnings is not None
1072
+ if final:
1073
+ warning_reports = all_warnings[self._already_displayed_warnings :]
1074
+ else:
1075
+ warning_reports = all_warnings
1076
+ self._already_displayed_warnings = len(warning_reports)
1077
+ if not warning_reports:
1078
+ return
1079
+
1080
+ reports_grouped_by_message: dict[str, list[WarningReport]] = {}
1081
+ for wr in warning_reports:
1082
+ reports_grouped_by_message.setdefault(wr.message, []).append(wr)
1083
+
1084
+ def collapsed_location_report(reports: list[WarningReport]) -> str:
1085
+ locations = []
1086
+ for w in reports:
1087
+ location = w.get_location(self.config)
1088
+ if location:
1089
+ locations.append(location)
1090
+
1091
+ if len(locations) < 10:
1092
+ return "\n".join(map(str, locations))
1093
+
1094
+ counts_by_filename = Counter(
1095
+ str(loc).split("::", 1)[0] for loc in locations
1096
+ )
1097
+ return "\n".join(
1098
+ "{}: {} warning{}".format(k, v, "s" if v > 1 else "")
1099
+ for k, v in counts_by_filename.items()
1100
+ )
1101
+
1102
+ title = "warnings summary (final)" if final else "warnings summary"
1103
+ self.write_sep("=", title, yellow=True, bold=False)
1104
+ for message, message_reports in reports_grouped_by_message.items():
1105
+ maybe_location = collapsed_location_report(message_reports)
1106
+ if maybe_location:
1107
+ self._tw.line(maybe_location)
1108
+ lines = message.splitlines()
1109
+ indented = "\n".join(" " + x for x in lines)
1110
+ message = indented.rstrip()
1111
+ else:
1112
+ message = message.rstrip()
1113
+ self._tw.line(message)
1114
+ self._tw.line()
1115
+ self._tw.line(
1116
+ "-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html"
1117
+ )
1118
+
1119
+ def summary_passes(self) -> None:
1120
+ self.summary_passes_combined("passed", "PASSES", "P")
1121
+
1122
+ def summary_xpasses(self) -> None:
1123
+ self.summary_passes_combined("xpassed", "XPASSES", "X")
1124
+
1125
+ def summary_passes_combined(
1126
+ self, which_reports: str, sep_title: str, needed_opt: str
1127
+ ) -> None:
1128
+ if self.config.option.tbstyle != "no":
1129
+ if self.hasopt(needed_opt):
1130
+ reports: list[TestReport] = self.getreports(which_reports)
1131
+ if not reports:
1132
+ return
1133
+ self.write_sep("=", sep_title)
1134
+ for rep in reports:
1135
+ if rep.sections:
1136
+ msg = self._getfailureheadline(rep)
1137
+ self.write_sep("_", msg, green=True, bold=True)
1138
+ self._outrep_summary(rep)
1139
+ self._handle_teardown_sections(rep.nodeid)
1140
+
1141
+ def _get_teardown_reports(self, nodeid: str) -> list[TestReport]:
1142
+ reports = self.getreports("")
1143
+ return [
1144
+ report
1145
+ for report in reports
1146
+ if report.when == "teardown" and report.nodeid == nodeid
1147
+ ]
1148
+
1149
+ def _handle_teardown_sections(self, nodeid: str) -> None:
1150
+ for report in self._get_teardown_reports(nodeid):
1151
+ self.print_teardown_sections(report)
1152
+
1153
+ def print_teardown_sections(self, rep: TestReport) -> None:
1154
+ showcapture = self.config.option.showcapture
1155
+ if showcapture == "no":
1156
+ return
1157
+ for secname, content in rep.sections:
1158
+ if showcapture != "all" and showcapture not in secname:
1159
+ continue
1160
+ if "teardown" in secname:
1161
+ self._tw.sep("-", secname)
1162
+ if content[-1:] == "\n":
1163
+ content = content[:-1]
1164
+ self._tw.line(content)
1165
+
1166
+ def summary_failures(self) -> None:
1167
+ style = self.config.option.tbstyle
1168
+ self.summary_failures_combined("failed", "FAILURES", style=style)
1169
+
1170
+ def summary_xfailures(self) -> None:
1171
+ show_tb = self.config.option.xfail_tb
1172
+ style = self.config.option.tbstyle if show_tb else "no"
1173
+ self.summary_failures_combined("xfailed", "XFAILURES", style=style)
1174
+
1175
+ def summary_failures_combined(
1176
+ self,
1177
+ which_reports: str,
1178
+ sep_title: str,
1179
+ *,
1180
+ style: str,
1181
+ needed_opt: str | None = None,
1182
+ ) -> None:
1183
+ if style != "no":
1184
+ if not needed_opt or self.hasopt(needed_opt):
1185
+ reports: list[BaseReport] = self.getreports(which_reports)
1186
+ if not reports:
1187
+ return
1188
+ self.write_sep("=", sep_title)
1189
+ if style == "line":
1190
+ for rep in reports:
1191
+ line = self._getcrashline(rep)
1192
+ self._outrep_summary(rep)
1193
+ self.write_line(line)
1194
+ else:
1195
+ for rep in reports:
1196
+ msg = self._getfailureheadline(rep)
1197
+ self.write_sep("_", msg, red=True, bold=True)
1198
+ self._outrep_summary(rep)
1199
+ self._handle_teardown_sections(rep.nodeid)
1200
+
1201
+ def summary_errors(self) -> None:
1202
+ if self.config.option.tbstyle != "no":
1203
+ reports: list[BaseReport] = self.getreports("error")
1204
+ if not reports:
1205
+ return
1206
+ self.write_sep("=", "ERRORS")
1207
+ for rep in self.stats["error"]:
1208
+ msg = self._getfailureheadline(rep)
1209
+ if rep.when == "collect":
1210
+ msg = "ERROR collecting " + msg
1211
+ else:
1212
+ msg = f"ERROR at {rep.when} of {msg}"
1213
+ self.write_sep("_", msg, red=True, bold=True)
1214
+ self._outrep_summary(rep)
1215
+
1216
+ def _outrep_summary(self, rep: BaseReport) -> None:
1217
+ rep.toterminal(self._tw)
1218
+ showcapture = self.config.option.showcapture
1219
+ if showcapture == "no":
1220
+ return
1221
+ for secname, content in rep.sections:
1222
+ if showcapture != "all" and showcapture not in secname:
1223
+ continue
1224
+ self._tw.sep("-", secname)
1225
+ if content[-1:] == "\n":
1226
+ content = content[:-1]
1227
+ self._tw.line(content)
1228
+
1229
+ def summary_stats(self) -> None:
1230
+ if self.verbosity < -1:
1231
+ return
1232
+
1233
+ session_duration = self._session_start.elapsed()
1234
+ (parts, main_color) = self.build_summary_stats_line()
1235
+ line_parts = []
1236
+
1237
+ display_sep = self.verbosity >= 0
1238
+ if display_sep:
1239
+ fullwidth = self._tw.fullwidth
1240
+ for text, markup in parts:
1241
+ with_markup = self._tw.markup(text, **markup)
1242
+ if display_sep:
1243
+ fullwidth += len(with_markup) - len(text)
1244
+ line_parts.append(with_markup)
1245
+ msg = ", ".join(line_parts)
1246
+
1247
+ main_markup = {main_color: True}
1248
+ duration = f" in {format_session_duration(session_duration.seconds)}"
1249
+ duration_with_markup = self._tw.markup(duration, **main_markup)
1250
+ if display_sep:
1251
+ fullwidth += len(duration_with_markup) - len(duration)
1252
+ msg += duration_with_markup
1253
+
1254
+ if display_sep:
1255
+ markup_for_end_sep = self._tw.markup("", **main_markup)
1256
+ if markup_for_end_sep.endswith("\x1b[0m"):
1257
+ markup_for_end_sep = markup_for_end_sep[:-4]
1258
+ fullwidth += len(markup_for_end_sep)
1259
+ msg += markup_for_end_sep
1260
+
1261
+ if display_sep:
1262
+ self.write_sep("=", msg, fullwidth=fullwidth, **main_markup)
1263
+ else:
1264
+ self.write_line(msg, **main_markup)
1265
+
1266
+ def short_test_summary(self) -> None:
1267
+ if not self.reportchars:
1268
+ return
1269
+
1270
+ def show_simple(lines: list[str], *, stat: str) -> None:
1271
+ failed = self.stats.get(stat, [])
1272
+ if not failed:
1273
+ return
1274
+ config = self.config
1275
+ for rep in failed:
1276
+ color = _color_for_type.get(stat, _color_for_type_default)
1277
+ line = _get_line_with_reprcrash_message(
1278
+ config, rep, self._tw, {color: True}
1279
+ )
1280
+ lines.append(line)
1281
+
1282
+ def show_xfailed(lines: list[str]) -> None:
1283
+ xfailed = self.stats.get("xfailed", [])
1284
+ for rep in xfailed:
1285
+ verbose_word, verbose_markup = rep._get_verbose_word_with_markup(
1286
+ self.config, {_color_for_type["warnings"]: True}
1287
+ )
1288
+ markup_word = self._tw.markup(verbose_word, **verbose_markup)
1289
+ nodeid = _get_node_id_with_markup(self._tw, self.config, rep)
1290
+ line = f"{markup_word} {nodeid}"
1291
+ reason = rep.wasxfail
1292
+ if reason:
1293
+ line += " - " + str(reason)
1294
+
1295
+ lines.append(line)
1296
+
1297
+ def show_xpassed(lines: list[str]) -> None:
1298
+ xpassed = self.stats.get("xpassed", [])
1299
+ for rep in xpassed:
1300
+ verbose_word, verbose_markup = rep._get_verbose_word_with_markup(
1301
+ self.config, {_color_for_type["warnings"]: True}
1302
+ )
1303
+ markup_word = self._tw.markup(verbose_word, **verbose_markup)
1304
+ nodeid = _get_node_id_with_markup(self._tw, self.config, rep)
1305
+ line = f"{markup_word} {nodeid}"
1306
+ reason = rep.wasxfail
1307
+ if reason:
1308
+ line += " - " + str(reason)
1309
+ lines.append(line)
1310
+
1311
+ def show_skipped_folded(lines: list[str]) -> None:
1312
+ skipped: list[CollectReport] = self.stats.get("skipped", [])
1313
+ fskips = _folded_skips(self.startpath, skipped) if skipped else []
1314
+ if not fskips:
1315
+ return
1316
+ verbose_word, verbose_markup = skipped[0]._get_verbose_word_with_markup(
1317
+ self.config, {_color_for_type["warnings"]: True}
1318
+ )
1319
+ markup_word = self._tw.markup(verbose_word, **verbose_markup)
1320
+ prefix = "Skipped: "
1321
+ for num, fspath, lineno, reason in fskips:
1322
+ if reason.startswith(prefix):
1323
+ reason = reason[len(prefix) :]
1324
+ if lineno is not None:
1325
+ lines.append(f"{markup_word} [{num}] {fspath}:{lineno}: {reason}")
1326
+ else:
1327
+ lines.append(f"{markup_word} [{num}] {fspath}: {reason}")
1328
+
1329
+ def show_skipped_unfolded(lines: list[str]) -> None:
1330
+ skipped: list[CollectReport] = self.stats.get("skipped", [])
1331
+
1332
+ for rep in skipped:
1333
+ assert rep.longrepr is not None
1334
+ assert isinstance(rep.longrepr, tuple), (rep, rep.longrepr)
1335
+ assert len(rep.longrepr) == 3, (rep, rep.longrepr)
1336
+
1337
+ verbose_word, verbose_markup = rep._get_verbose_word_with_markup(
1338
+ self.config, {_color_for_type["warnings"]: True}
1339
+ )
1340
+ markup_word = self._tw.markup(verbose_word, **verbose_markup)
1341
+ nodeid = _get_node_id_with_markup(self._tw, self.config, rep)
1342
+ line = f"{markup_word} {nodeid}"
1343
+ reason = rep.longrepr[2]
1344
+ if reason:
1345
+ line += " - " + str(reason)
1346
+ lines.append(line)
1347
+
1348
+ def show_skipped(lines: list[str]) -> None:
1349
+ if self.foldskipped:
1350
+ show_skipped_folded(lines)
1351
+ else:
1352
+ show_skipped_unfolded(lines)
1353
+
1354
+ REPORTCHAR_ACTIONS: Mapping[str, Callable[[list[str]], None]] = {
1355
+ "x": show_xfailed,
1356
+ "X": show_xpassed,
1357
+ "f": partial(show_simple, stat="failed"),
1358
+ "s": show_skipped,
1359
+ "p": partial(show_simple, stat="passed"),
1360
+ "E": partial(show_simple, stat="error"),
1361
+ }
1362
+
1363
+ lines: list[str] = []
1364
+ for char in self.reportchars:
1365
+ action = REPORTCHAR_ACTIONS.get(char)
1366
+ if action: # skipping e.g. "P" (passed with output) here.
1367
+ action(lines)
1368
+
1369
+ if lines:
1370
+ self.write_sep("=", "short test summary info", cyan=True, bold=True)
1371
+ for line in lines:
1372
+ self.write_line(line)
1373
+
1374
+ def _get_main_color(self) -> tuple[str, list[str]]:
1375
+ if self._main_color is None or self._known_types is None or self._is_last_item:
1376
+ self._set_main_color()
1377
+ assert self._main_color
1378
+ assert self._known_types
1379
+ return self._main_color, self._known_types
1380
+
1381
+ def _determine_main_color(self, unknown_type_seen: bool) -> str:
1382
+ stats = self.stats
1383
+ if "failed" in stats or "error" in stats:
1384
+ main_color = "red"
1385
+ elif "warnings" in stats or "xpassed" in stats or unknown_type_seen:
1386
+ main_color = "yellow"
1387
+ elif "passed" in stats or not self._is_last_item:
1388
+ main_color = "green"
1389
+ else:
1390
+ main_color = "yellow"
1391
+ return main_color
1392
+
1393
+ def _set_main_color(self) -> None:
1394
+ unknown_types: list[str] = []
1395
+ for found_type in self.stats:
1396
+ if found_type: # setup/teardown reports have an empty key, ignore them
1397
+ if found_type not in KNOWN_TYPES and found_type not in unknown_types:
1398
+ unknown_types.append(found_type)
1399
+ self._known_types = list(KNOWN_TYPES) + unknown_types
1400
+ self._main_color = self._determine_main_color(bool(unknown_types))
1401
+
1402
+ def build_summary_stats_line(self) -> tuple[list[tuple[str, dict[str, bool]]], str]:
1403
+ """
1404
+ Build the parts used in the last summary stats line.
1405
+
1406
+ The summary stats line is the line shown at the end, "=== 12 passed, 2 errors in Xs===".
1407
+
1408
+ This function builds a list of the "parts" that make up for the text in that line, in
1409
+ the example above it would be::
1410
+
1411
+ [
1412
+ ("12 passed", {"green": True}),
1413
+ ("2 errors", {"red": True}
1414
+ ]
1415
+
1416
+ That last dict for each line is a "markup dictionary", used by TerminalWriter to
1417
+ color output.
1418
+
1419
+ The final color of the line is also determined by this function, and is the second
1420
+ element of the returned tuple.
1421
+ """
1422
+ if self.config.getoption("collectonly"):
1423
+ return self._build_collect_only_summary_stats_line()
1424
+ else:
1425
+ return self._build_normal_summary_stats_line()
1426
+
1427
+ def _get_reports_to_display(self, key: str) -> list[Any]:
1428
+ """Get test/collection reports for the given status key, such as `passed` or `error`."""
1429
+ reports = self.stats.get(key, [])
1430
+ return [x for x in reports if getattr(x, "count_towards_summary", True)]
1431
+
1432
+ def _build_normal_summary_stats_line(
1433
+ self,
1434
+ ) -> tuple[list[tuple[str, dict[str, bool]]], str]:
1435
+ main_color, known_types = self._get_main_color()
1436
+ parts = []
1437
+
1438
+ for key in known_types:
1439
+ reports = self._get_reports_to_display(key)
1440
+ if reports:
1441
+ count = len(reports)
1442
+ color = _color_for_type.get(key, _color_for_type_default)
1443
+ markup = {color: True, "bold": color == main_color}
1444
+ parts.append(("%d %s" % pluralize(count, key), markup)) # noqa: UP031
1445
+
1446
+ if not parts:
1447
+ parts = [("no tests ran", {_color_for_type_default: True})]
1448
+
1449
+ return parts, main_color
1450
+
1451
+ def _build_collect_only_summary_stats_line(
1452
+ self,
1453
+ ) -> tuple[list[tuple[str, dict[str, bool]]], str]:
1454
+ deselected = len(self._get_reports_to_display("deselected"))
1455
+ errors = len(self._get_reports_to_display("error"))
1456
+
1457
+ if self._numcollected == 0:
1458
+ parts = [("no tests collected", {"yellow": True})]
1459
+ main_color = "yellow"
1460
+
1461
+ elif deselected == 0:
1462
+ main_color = "green"
1463
+ collected_output = "%d %s collected" % pluralize(self._numcollected, "test") # noqa: UP031
1464
+ parts = [(collected_output, {main_color: True})]
1465
+ else:
1466
+ all_tests_were_deselected = self._numcollected == deselected
1467
+ if all_tests_were_deselected:
1468
+ main_color = "yellow"
1469
+ collected_output = f"no tests collected ({deselected} deselected)"
1470
+ else:
1471
+ main_color = "green"
1472
+ selected = self._numcollected - deselected
1473
+ collected_output = f"{selected}/{self._numcollected} tests collected ({deselected} deselected)"
1474
+
1475
+ parts = [(collected_output, {main_color: True})]
1476
+
1477
+ if errors:
1478
+ main_color = _color_for_type["error"]
1479
+ parts += [("%d %s" % pluralize(errors, "error"), {main_color: True})] # noqa: UP031
1480
+
1481
+ return parts, main_color
1482
+
1483
+
1484
+ def _get_node_id_with_markup(tw: TerminalWriter, config: Config, rep: BaseReport):
1485
+ nodeid = config.cwd_relative_nodeid(rep.nodeid)
1486
+ path, *parts = nodeid.split("::")
1487
+ if parts:
1488
+ parts_markup = tw.markup("::".join(parts), bold=True)
1489
+ return path + "::" + parts_markup
1490
+ else:
1491
+ return path
1492
+
1493
+
1494
+ def _format_trimmed(format: str, msg: str, available_width: int) -> str | None:
1495
+ """Format msg into format, ellipsizing it if doesn't fit in available_width.
1496
+
1497
+ Returns None if even the ellipsis can't fit.
1498
+ """
1499
+ # Only use the first line.
1500
+ i = msg.find("\n")
1501
+ if i != -1:
1502
+ msg = msg[:i]
1503
+
1504
+ ellipsis = "..."
1505
+ format_width = wcswidth(format.format(""))
1506
+ if format_width + len(ellipsis) > available_width:
1507
+ return None
1508
+
1509
+ if format_width + wcswidth(msg) > available_width:
1510
+ available_width -= len(ellipsis)
1511
+ msg = msg[:available_width]
1512
+ while format_width + wcswidth(msg) > available_width:
1513
+ msg = msg[:-1]
1514
+ msg += ellipsis
1515
+
1516
+ return format.format(msg)
1517
+
1518
+
1519
+ def _get_line_with_reprcrash_message(
1520
+ config: Config, rep: BaseReport, tw: TerminalWriter, word_markup: dict[str, bool]
1521
+ ) -> str:
1522
+ """Get summary line for a report, trying to add reprcrash message."""
1523
+ verbose_word, verbose_markup = rep._get_verbose_word_with_markup(
1524
+ config, word_markup
1525
+ )
1526
+ word = tw.markup(verbose_word, **verbose_markup)
1527
+ node = _get_node_id_with_markup(tw, config, rep)
1528
+
1529
+ line = f"{word} {node}"
1530
+ line_width = wcswidth(line)
1531
+
1532
+ msg: str | None
1533
+ try:
1534
+ if isinstance(rep.longrepr, str):
1535
+ msg = rep.longrepr
1536
+ else:
1537
+ # Type ignored intentionally -- possible AttributeError expected.
1538
+ msg = rep.longrepr.reprcrash.message # type: ignore[union-attr]
1539
+ except AttributeError:
1540
+ pass
1541
+ else:
1542
+ if (
1543
+ running_on_ci() or config.option.verbose >= 2
1544
+ ) and not config.option.force_short_summary:
1545
+ msg = f" - {msg}"
1546
+ else:
1547
+ available_width = tw.fullwidth - line_width
1548
+ msg = _format_trimmed(" - {}", msg, available_width)
1549
+ if msg is not None:
1550
+ line += msg
1551
+
1552
+ return line
1553
+
1554
+
1555
+ def _folded_skips(
1556
+ startpath: Path,
1557
+ skipped: Sequence[CollectReport],
1558
+ ) -> list[tuple[int, str, int | None, str]]:
1559
+ d: dict[tuple[str, int | None, str], list[CollectReport]] = {}
1560
+ for event in skipped:
1561
+ assert event.longrepr is not None
1562
+ assert isinstance(event.longrepr, tuple), (event, event.longrepr)
1563
+ assert len(event.longrepr) == 3, (event, event.longrepr)
1564
+ fspath, lineno, reason = event.longrepr
1565
+ # For consistency, report all fspaths in relative form.
1566
+ fspath = bestrelpath(startpath, Path(fspath))
1567
+ keywords = getattr(event, "keywords", {})
1568
+ # Folding reports with global pytestmark variable.
1569
+ # This is a workaround, because for now we cannot identify the scope of a skip marker
1570
+ # TODO: Revisit after marks scope would be fixed.
1571
+ if (
1572
+ event.when == "setup"
1573
+ and "skip" in keywords
1574
+ and "pytestmark" not in keywords
1575
+ ):
1576
+ key: tuple[str, int | None, str] = (fspath, None, reason)
1577
+ else:
1578
+ key = (fspath, lineno, reason)
1579
+ d.setdefault(key, []).append(event)
1580
+ values: list[tuple[int, str, int | None, str]] = []
1581
+ for key, events in d.items():
1582
+ values.append((len(events), *key))
1583
+ return values
1584
+
1585
+
1586
+ _color_for_type = {
1587
+ "failed": "red",
1588
+ "error": "red",
1589
+ "warnings": "yellow",
1590
+ "passed": "green",
1591
+ "subtests passed": "green",
1592
+ "subtests failed": "red",
1593
+ }
1594
+ _color_for_type_default = "yellow"
1595
+
1596
+
1597
+ def pluralize(count: int, noun: str) -> tuple[int, str]:
1598
+ # No need to pluralize words such as `failed` or `passed`.
1599
+ if noun not in ["error", "warnings", "test"]:
1600
+ return count, noun
1601
+
1602
+ # The `warnings` key is plural. To avoid API breakage, we keep it that way but
1603
+ # set it to singular here so we can determine plurality in the same way as we do
1604
+ # for `error`.
1605
+ noun = noun.replace("warnings", "warning")
1606
+
1607
+ return count, noun + "s" if count != 1 else noun
1608
+
1609
+
1610
+ def _plugin_nameversions(plugininfo) -> list[str]:
1611
+ values: list[str] = []
1612
+ for plugin, dist in plugininfo:
1613
+ # Gets us name and version!
1614
+ name = f"{dist.project_name}-{dist.version}"
1615
+ # Questionable convenience, but it keeps things short.
1616
+ if name.startswith("pytest-"):
1617
+ name = name[7:]
1618
+ # We decided to print python package names they can have more than one plugin.
1619
+ if name not in values:
1620
+ values.append(name)
1621
+ return values
1622
+
1623
+
1624
+ def format_session_duration(seconds: float) -> str:
1625
+ """Format the given seconds in a human readable manner to show in the final summary."""
1626
+ if seconds < 60:
1627
+ return f"{seconds:.2f}s"
1628
+ else:
1629
+ dt = datetime.timedelta(seconds=int(seconds))
1630
+ return f"{seconds:.2f}s ({dt})"
1631
+
1632
+
1633
+ def format_node_duration(seconds: float) -> str:
1634
+ """Format the given seconds in a human readable manner to show in the test progress."""
1635
+ # The formatting is designed to be compact and readable, with at most 7 characters
1636
+ # for durations below 100 hours.
1637
+ if seconds < 0.00001:
1638
+ return f" {seconds * 1000000:.3f}us"
1639
+ if seconds < 0.0001:
1640
+ return f" {seconds * 1000000:.2f}us"
1641
+ if seconds < 0.001:
1642
+ return f" {seconds * 1000000:.1f}us"
1643
+ if seconds < 0.01:
1644
+ return f" {seconds * 1000:.3f}ms"
1645
+ if seconds < 0.1:
1646
+ return f" {seconds * 1000:.2f}ms"
1647
+ if seconds < 1:
1648
+ return f" {seconds * 1000:.1f}ms"
1649
+ if seconds < 60:
1650
+ return f" {seconds:.3f}s"
1651
+ if seconds < 3600:
1652
+ return f" {seconds // 60:.0f}m {seconds % 60:.0f}s"
1653
+ return f" {seconds // 3600:.0f}h {(seconds % 3600) // 60:.0f}m"
1654
+
1655
+
1656
+ def _get_raw_skip_reason(report: TestReport) -> str:
1657
+ """Get the reason string of a skip/xfail/xpass test report.
1658
+
1659
+ The string is just the part given by the user.
1660
+ """
1661
+ if hasattr(report, "wasxfail"):
1662
+ reason = report.wasxfail
1663
+ if reason.startswith("reason: "):
1664
+ reason = reason[len("reason: ") :]
1665
+ return reason
1666
+ else:
1667
+ assert report.skipped
1668
+ assert isinstance(report.longrepr, tuple)
1669
+ _, _, reason = report.longrepr
1670
+ if reason.startswith("Skipped: "):
1671
+ reason = reason[len("Skipped: ") :]
1672
+ elif reason == "Skipped":
1673
+ reason = ""
1674
+ return reason
1675
+
1676
+
1677
+ class TerminalProgressPlugin:
1678
+ """Terminal progress reporting plugin using OSC 9;4 ANSI sequences.
1679
+
1680
+ Emits OSC 9;4 sequences to indicate test progress to terminal
1681
+ tabs/windows/etc.
1682
+
1683
+ Not all terminal emulators support this feature.
1684
+
1685
+ Ref: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
1686
+ """
1687
+
1688
+ def __init__(self, tr: TerminalReporter) -> None:
1689
+ self._tr = tr
1690
+ self._session: Session | None = None
1691
+ self._has_failures = False
1692
+
1693
+ def _emit_progress(
1694
+ self,
1695
+ state: Literal["remove", "normal", "error", "indeterminate", "paused"],
1696
+ progress: int | None = None,
1697
+ ) -> None:
1698
+ """Emit OSC 9;4 sequence for indicating progress to the terminal.
1699
+
1700
+ :param state:
1701
+ Progress state to set.
1702
+ :param progress:
1703
+ Progress value 0-100. Required for "normal", optional for "error"
1704
+ and "paused", otherwise ignored.
1705
+ """
1706
+ assert progress is None or 0 <= progress <= 100
1707
+
1708
+ # OSC 9;4 sequence: ESC ] 9 ; 4 ; state ; progress ST
1709
+ # ST can be ESC \ or BEL. ESC \ seems better supported.
1710
+ match state:
1711
+ case "remove":
1712
+ sequence = "\x1b]9;4;0;\x1b\\"
1713
+ case "normal":
1714
+ assert progress is not None
1715
+ sequence = f"\x1b]9;4;1;{progress}\x1b\\"
1716
+ case "error":
1717
+ if progress is not None:
1718
+ sequence = f"\x1b]9;4;2;{progress}\x1b\\"
1719
+ else:
1720
+ sequence = "\x1b]9;4;2;\x1b\\"
1721
+ case "indeterminate":
1722
+ sequence = "\x1b]9;4;3;\x1b\\"
1723
+ case "paused":
1724
+ if progress is not None:
1725
+ sequence = f"\x1b]9;4;4;{progress}\x1b\\"
1726
+ else:
1727
+ sequence = "\x1b]9;4;4;\x1b\\"
1728
+
1729
+ self._tr.write_raw(sequence, flush=True)
1730
+
1731
+ @hookimpl
1732
+ def pytest_sessionstart(self, session: Session) -> None:
1733
+ self._session = session
1734
+ # Show indeterminate progress during collection.
1735
+ self._emit_progress("indeterminate")
1736
+
1737
+ @hookimpl
1738
+ def pytest_collection_finish(self) -> None:
1739
+ assert self._session is not None
1740
+ if self._session.testscollected > 0:
1741
+ # Switch from indeterminate to 0% progress.
1742
+ self._emit_progress("normal", 0)
1743
+
1744
+ @hookimpl
1745
+ def pytest_runtest_logreport(self, report: TestReport) -> None:
1746
+ if report.failed:
1747
+ self._has_failures = True
1748
+
1749
+ # Let's consider the "call" phase for progress.
1750
+ if report.when != "call":
1751
+ return
1752
+
1753
+ # Calculate and emit progress.
1754
+ assert self._session is not None
1755
+ collected = self._session.testscollected
1756
+ if collected > 0:
1757
+ reported = self._tr.reported_progress
1758
+ progress = min(reported * 100 // collected, 100)
1759
+ self._emit_progress("error" if self._has_failures else "normal", progress)
1760
+
1761
+ @hookimpl
1762
+ def pytest_sessionfinish(self) -> None:
1763
+ self._emit_progress("remove")