coverage 7.15.3__tar.gz → 7.15.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/kit.yml +19 -5
  2. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/publish.yml +1 -1
  3. {coverage-7.15.3 → coverage-7.15.4}/.pre-commit-config.yaml +1 -1
  4. {coverage-7.15.3 → coverage-7.15.4}/CHANGES.rst +23 -0
  5. {coverage-7.15.3 → coverage-7.15.4}/PKG-INFO +8 -8
  6. {coverage-7.15.3 → coverage-7.15.4}/README.rst +1 -1
  7. {coverage-7.15.3 → coverage-7.15.4}/coverage/cmdline.py +1 -4
  8. {coverage-7.15.3 → coverage-7.15.4}/coverage/collector.py +1 -4
  9. {coverage-7.15.3 → coverage-7.15.4}/coverage/config.py +1 -5
  10. {coverage-7.15.3 → coverage-7.15.4}/coverage/control.py +1 -4
  11. {coverage-7.15.3 → coverage-7.15.4}/coverage/env.py +1 -1
  12. {coverage-7.15.3 → coverage-7.15.4}/coverage/exceptions.py +0 -18
  13. {coverage-7.15.3 → coverage-7.15.4}/coverage/html.py +1 -10
  14. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/index.html +4 -4
  15. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/pyfile.html +4 -4
  16. {coverage-7.15.3 → coverage-7.15.4}/coverage/inorout.py +1 -4
  17. {coverage-7.15.3 → coverage-7.15.4}/coverage/lcovreport.py +18 -4
  18. {coverage-7.15.3 → coverage-7.15.4}/coverage/parser.py +2 -2
  19. {coverage-7.15.3 → coverage-7.15.4}/coverage/plugin.py +1 -2
  20. {coverage-7.15.3 → coverage-7.15.4}/coverage/plugin_support.py +1 -5
  21. {coverage-7.15.3 → coverage-7.15.4}/coverage/pytracer.py +1 -4
  22. {coverage-7.15.3 → coverage-7.15.4}/coverage/sqlitedb.py +1 -4
  23. {coverage-7.15.3 → coverage-7.15.4}/coverage/sysmon.py +1 -1
  24. {coverage-7.15.3 → coverage-7.15.4}/coverage/templite.py +0 -4
  25. {coverage-7.15.3 → coverage-7.15.4}/coverage/tomlconfig.py +0 -2
  26. {coverage-7.15.3 → coverage-7.15.4}/coverage/tracer.pyi +2 -2
  27. {coverage-7.15.3 → coverage-7.15.4}/coverage/version.py +1 -1
  28. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/PKG-INFO +8 -8
  29. {coverage-7.15.3 → coverage-7.15.4}/doc/conf.py +3 -3
  30. {coverage-7.15.3 → coverage-7.15.4}/doc/index.rst +1 -1
  31. {coverage-7.15.3 → coverage-7.15.4}/doc/requirements.pip +228 -228
  32. {coverage-7.15.3 → coverage-7.15.4}/pyproject.toml +17 -12
  33. {coverage-7.15.3 → coverage-7.15.4}/requirements/dev.pip +191 -186
  34. {coverage-7.15.3 → coverage-7.15.4}/requirements/kit.pip +15 -15
  35. {coverage-7.15.3 → coverage-7.15.4}/requirements/light-threads.pip +127 -128
  36. {coverage-7.15.3 → coverage-7.15.4}/requirements/mypy.pip +63 -59
  37. {coverage-7.15.3 → coverage-7.15.4}/requirements/pip.pip +12 -12
  38. {coverage-7.15.3 → coverage-7.15.4}/requirements/pytest.pip +63 -59
  39. {coverage-7.15.3 → coverage-7.15.4}/requirements/tox.pip +26 -25
  40. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/b_branch/b_py.html +1 -1
  41. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/bom/bom_py.html +2 -2
  42. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/contexts/two_tests_py.html +1 -1
  43. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/isolatin1/isolatin1_py.html +1 -1
  44. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/multiline/multiline_py.html +3 -3
  45. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/other/blah_blah_other_py.html +2 -2
  46. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/partial/partial_py.html +2 -2
  47. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/unicode/unicode_py.html +2 -2
  48. {coverage-7.15.3 → coverage-7.15.4}/tests/hypo.py +1 -1
  49. {coverage-7.15.3 → coverage-7.15.4}/tests/mixins.py +0 -1
  50. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/process_test/try_execfile.py +3 -3
  51. {coverage-7.15.3 → coverage-7.15.4}/tests/test_arcs.py +1 -1
  52. {coverage-7.15.3 → coverage-7.15.4}/tests/test_data.py +1 -4
  53. {coverage-7.15.3 → coverage-7.15.4}/tests/test_html.py +47 -10
  54. {coverage-7.15.3 → coverage-7.15.4}/tests/test_lcov.py +25 -0
  55. {coverage-7.15.3 → coverage-7.15.4}/.editorconfig +0 -0
  56. {coverage-7.15.3 → coverage-7.15.4}/.git-blame-ignore-revs +0 -0
  57. {coverage-7.15.3 → coverage-7.15.4}/.github/CODE_OF_CONDUCT.md +0 -0
  58. {coverage-7.15.3 → coverage-7.15.4}/.github/FUNDING.yml +0 -0
  59. {coverage-7.15.3 → coverage-7.15.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  60. {coverage-7.15.3 → coverage-7.15.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  61. {coverage-7.15.3 → coverage-7.15.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  62. {coverage-7.15.3 → coverage-7.15.4}/.github/ISSUE_TEMPLATE/support.md +0 -0
  63. {coverage-7.15.3 → coverage-7.15.4}/.github/SECURITY.md +0 -0
  64. {coverage-7.15.3 → coverage-7.15.4}/.github/dependabot.yml +0 -0
  65. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/codeql-analysis.yml +0 -0
  66. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/coverage.yml +0 -0
  67. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/dependency-review.yml +0 -0
  68. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/python-nightly.yml +0 -0
  69. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/quality.yml +0 -0
  70. {coverage-7.15.3 → coverage-7.15.4}/.github/workflows/testsuite.yml +0 -0
  71. {coverage-7.15.3 → coverage-7.15.4}/.github/zizmor.yml +0 -0
  72. {coverage-7.15.3 → coverage-7.15.4}/.ignore +0 -0
  73. {coverage-7.15.3 → coverage-7.15.4}/.readthedocs.yaml +0 -0
  74. {coverage-7.15.3 → coverage-7.15.4}/CITATION.cff +0 -0
  75. {coverage-7.15.3 → coverage-7.15.4}/CONTRIBUTORS.txt +0 -0
  76. {coverage-7.15.3 → coverage-7.15.4}/LICENSE.txt +0 -0
  77. {coverage-7.15.3 → coverage-7.15.4}/MANIFEST.in +0 -0
  78. {coverage-7.15.3 → coverage-7.15.4}/Makefile +0 -0
  79. {coverage-7.15.3 → coverage-7.15.4}/NOTICE.txt +0 -0
  80. {coverage-7.15.3 → coverage-7.15.4}/__main__.py +0 -0
  81. {coverage-7.15.3 → coverage-7.15.4}/a1_coverage.pth +0 -0
  82. {coverage-7.15.3 → coverage-7.15.4}/ci/README.txt +0 -0
  83. {coverage-7.15.3 → coverage-7.15.4}/ci/comment_on_fixes.py +0 -0
  84. {coverage-7.15.3 → coverage-7.15.4}/ci/session.py +0 -0
  85. {coverage-7.15.3 → coverage-7.15.4}/ci/trigger_action.py +0 -0
  86. {coverage-7.15.3 → coverage-7.15.4}/ci/update_rtfd.py +0 -0
  87. {coverage-7.15.3 → coverage-7.15.4}/coverage/__init__.py +0 -0
  88. {coverage-7.15.3 → coverage-7.15.4}/coverage/__main__.py +0 -0
  89. {coverage-7.15.3 → coverage-7.15.4}/coverage/annotate.py +0 -0
  90. {coverage-7.15.3 → coverage-7.15.4}/coverage/bytecode.py +0 -0
  91. {coverage-7.15.3 → coverage-7.15.4}/coverage/context.py +0 -0
  92. {coverage-7.15.3 → coverage-7.15.4}/coverage/core.py +0 -0
  93. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/datastack.c +0 -0
  94. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/datastack.h +0 -0
  95. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/filedisp.c +0 -0
  96. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/filedisp.h +0 -0
  97. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/module.c +0 -0
  98. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/stats.h +0 -0
  99. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/tracer.c +0 -0
  100. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/tracer.h +0 -0
  101. {coverage-7.15.3 → coverage-7.15.4}/coverage/ctracer/util.h +0 -0
  102. {coverage-7.15.3 → coverage-7.15.4}/coverage/data.py +0 -0
  103. {coverage-7.15.3 → coverage-7.15.4}/coverage/debug.py +0 -0
  104. {coverage-7.15.3 → coverage-7.15.4}/coverage/disposition.py +0 -0
  105. {coverage-7.15.3 → coverage-7.15.4}/coverage/execfile.py +0 -0
  106. {coverage-7.15.3 → coverage-7.15.4}/coverage/files.py +0 -0
  107. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/coverage_html.js +0 -0
  108. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/favicon_32.png +0 -0
  109. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/keybd_closed.png +0 -0
  110. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/style.css +0 -0
  111. {coverage-7.15.3 → coverage-7.15.4}/coverage/htmlfiles/style.scss +0 -0
  112. {coverage-7.15.3 → coverage-7.15.4}/coverage/jsonreport.py +0 -0
  113. {coverage-7.15.3 → coverage-7.15.4}/coverage/misc.py +0 -0
  114. {coverage-7.15.3 → coverage-7.15.4}/coverage/multiproc.py +0 -0
  115. {coverage-7.15.3 → coverage-7.15.4}/coverage/numbits.py +0 -0
  116. {coverage-7.15.3 → coverage-7.15.4}/coverage/patch.py +0 -0
  117. {coverage-7.15.3 → coverage-7.15.4}/coverage/phystokens.py +0 -0
  118. {coverage-7.15.3 → coverage-7.15.4}/coverage/pth_file.py +0 -0
  119. {coverage-7.15.3 → coverage-7.15.4}/coverage/py.typed +0 -0
  120. {coverage-7.15.3 → coverage-7.15.4}/coverage/python.py +0 -0
  121. {coverage-7.15.3 → coverage-7.15.4}/coverage/regions.py +0 -0
  122. {coverage-7.15.3 → coverage-7.15.4}/coverage/report.py +0 -0
  123. {coverage-7.15.3 → coverage-7.15.4}/coverage/report_core.py +0 -0
  124. {coverage-7.15.3 → coverage-7.15.4}/coverage/results.py +0 -0
  125. {coverage-7.15.3 → coverage-7.15.4}/coverage/sqldata.py +0 -0
  126. {coverage-7.15.3 → coverage-7.15.4}/coverage/types.py +0 -0
  127. {coverage-7.15.3 → coverage-7.15.4}/coverage/xmlreport.py +0 -0
  128. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/SOURCES.txt +0 -0
  129. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/dependency_links.txt +0 -0
  130. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/entry_points.txt +0 -0
  131. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/not-zip-safe +0 -0
  132. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/requires.txt +0 -0
  133. {coverage-7.15.3 → coverage-7.15.4}/coverage.egg-info/top_level.txt +0 -0
  134. {coverage-7.15.3 → coverage-7.15.4}/doc/_static/coverage.css +0 -0
  135. {coverage-7.15.3 → coverage-7.15.4}/doc/api.rst +0 -0
  136. {coverage-7.15.3 → coverage-7.15.4}/doc/api_coverage.rst +0 -0
  137. {coverage-7.15.3 → coverage-7.15.4}/doc/api_coveragedata.rst +0 -0
  138. {coverage-7.15.3 → coverage-7.15.4}/doc/api_exceptions.rst +0 -0
  139. {coverage-7.15.3 → coverage-7.15.4}/doc/api_module.rst +0 -0
  140. {coverage-7.15.3 → coverage-7.15.4}/doc/api_plugin.rst +0 -0
  141. {coverage-7.15.3 → coverage-7.15.4}/doc/branch.rst +0 -0
  142. {coverage-7.15.3 → coverage-7.15.4}/doc/changes.rst +0 -0
  143. {coverage-7.15.3 → coverage-7.15.4}/doc/cog_helpers.py +0 -0
  144. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_annotate.rst +0 -0
  145. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_combine.rst +0 -0
  146. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_debug.rst +0 -0
  147. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_erase.rst +0 -0
  148. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_html.rst +0 -0
  149. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_json.rst +0 -0
  150. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_lcov.rst +0 -0
  151. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_report.rst +0 -0
  152. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_reporting.rst +0 -0
  153. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_run.rst +0 -0
  154. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/cmd_xml.rst +0 -0
  155. {coverage-7.15.3 → coverage-7.15.4}/doc/commands/index.rst +0 -0
  156. {coverage-7.15.3 → coverage-7.15.4}/doc/config.rst +0 -0
  157. {coverage-7.15.3 → coverage-7.15.4}/doc/contexts.rst +0 -0
  158. {coverage-7.15.3 → coverage-7.15.4}/doc/contributing.rst +0 -0
  159. {coverage-7.15.3 → coverage-7.15.4}/doc/dbschema.rst +0 -0
  160. {coverage-7.15.3 → coverage-7.15.4}/doc/dict.txt +0 -0
  161. {coverage-7.15.3 → coverage-7.15.4}/doc/excluding.rst +0 -0
  162. {coverage-7.15.3 → coverage-7.15.4}/doc/faq.rst +0 -0
  163. {coverage-7.15.3 → coverage-7.15.4}/doc/howitworks.rst +0 -0
  164. {coverage-7.15.3 → coverage-7.15.4}/doc/install.rst +0 -0
  165. {coverage-7.15.3 → coverage-7.15.4}/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White.png +0 -0
  166. {coverage-7.15.3 → coverage-7.15.4}/doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png +0 -0
  167. {coverage-7.15.3 → coverage-7.15.4}/doc/media/sleepy-snake-600.png +0 -0
  168. {coverage-7.15.3 → coverage-7.15.4}/doc/media/sleepy-snake-circle-150.png +0 -0
  169. {coverage-7.15.3 → coverage-7.15.4}/doc/messages.rst +0 -0
  170. {coverage-7.15.3 → coverage-7.15.4}/doc/migrating.rst +0 -0
  171. {coverage-7.15.3 → coverage-7.15.4}/doc/other.rst +0 -0
  172. {coverage-7.15.3 → coverage-7.15.4}/doc/plugins.rst +0 -0
  173. {coverage-7.15.3 → coverage-7.15.4}/doc/python-coverage.1.txt +0 -0
  174. {coverage-7.15.3 → coverage-7.15.4}/doc/requirements.in +0 -0
  175. {coverage-7.15.3 → coverage-7.15.4}/doc/sample_html/favicon_32_cb_c827f16f.png +0 -0
  176. {coverage-7.15.3 → coverage-7.15.4}/doc/sample_html/keybd_closed_cb_900cfef5.png +0 -0
  177. {coverage-7.15.3 → coverage-7.15.4}/doc/sleepy.rst +0 -0
  178. {coverage-7.15.3 → coverage-7.15.4}/doc/source.rst +0 -0
  179. {coverage-7.15.3 → coverage-7.15.4}/doc/subprocess.rst +0 -0
  180. {coverage-7.15.3 → coverage-7.15.4}/doc/trouble.rst +0 -0
  181. {coverage-7.15.3 → coverage-7.15.4}/doc/whatsnew5x.rst +0 -0
  182. {coverage-7.15.3 → coverage-7.15.4}/howto.txt +0 -0
  183. {coverage-7.15.3 → coverage-7.15.4}/igor.py +0 -0
  184. {coverage-7.15.3 → coverage-7.15.4}/lab/README.txt +0 -0
  185. {coverage-7.15.3 → coverage-7.15.4}/lab/branches.py +0 -0
  186. {coverage-7.15.3 → coverage-7.15.4}/lab/compare_times.sh +0 -0
  187. {coverage-7.15.3 → coverage-7.15.4}/lab/coverage-04.dtd +0 -0
  188. {coverage-7.15.3 → coverage-7.15.4}/lab/extract_code.py +0 -0
  189. {coverage-7.15.3 → coverage-7.15.4}/lab/goals.py +0 -0
  190. {coverage-7.15.3 → coverage-7.15.4}/lab/hack_pyc.py +0 -0
  191. {coverage-7.15.3 → coverage-7.15.4}/lab/notes/arcs-to-branches.txt +0 -0
  192. {coverage-7.15.3 → coverage-7.15.4}/lab/notes/bug1303.txt +0 -0
  193. {coverage-7.15.3 → coverage-7.15.4}/lab/notes/pypy-738-decorated-functions.txt +0 -0
  194. {coverage-7.15.3 → coverage-7.15.4}/lab/parse_all.py +0 -0
  195. {coverage-7.15.3 → coverage-7.15.4}/lab/parser.py +0 -0
  196. {coverage-7.15.3 → coverage-7.15.4}/lab/pick.py +0 -0
  197. {coverage-7.15.3 → coverage-7.15.4}/lab/platform_info.py +0 -0
  198. {coverage-7.15.3 → coverage-7.15.4}/lab/run_sysmon.py +0 -0
  199. {coverage-7.15.3 → coverage-7.15.4}/lab/run_trace.py +0 -0
  200. {coverage-7.15.3 → coverage-7.15.4}/lab/select_contexts.py +0 -0
  201. {coverage-7.15.3 → coverage-7.15.4}/lab/show_platform.py +0 -0
  202. {coverage-7.15.3 → coverage-7.15.4}/lab/show_pyc.py +0 -0
  203. {coverage-7.15.3 → coverage-7.15.4}/lab/treetopy.sh +0 -0
  204. {coverage-7.15.3 → coverage-7.15.4}/lab/warn_executed.py +0 -0
  205. {coverage-7.15.3 → coverage-7.15.4}/lab/warn_executed.toml +0 -0
  206. {coverage-7.15.3 → coverage-7.15.4}/metacov.ini +0 -0
  207. {coverage-7.15.3 → coverage-7.15.4}/requirements/dev.in +0 -0
  208. {coverage-7.15.3 → coverage-7.15.4}/requirements/kit.in +0 -0
  209. {coverage-7.15.3 → coverage-7.15.4}/requirements/light-threads.in +0 -0
  210. {coverage-7.15.3 → coverage-7.15.4}/requirements/mypy.in +0 -0
  211. {coverage-7.15.3 → coverage-7.15.4}/requirements/pins.pip +0 -0
  212. {coverage-7.15.3 → coverage-7.15.4}/requirements/pip.in +0 -0
  213. {coverage-7.15.3 → coverage-7.15.4}/requirements/pytest.in +0 -0
  214. {coverage-7.15.3 → coverage-7.15.4}/requirements/tox.in +0 -0
  215. {coverage-7.15.3 → coverage-7.15.4}/setup.cfg +0 -0
  216. {coverage-7.15.3 → coverage-7.15.4}/setup.py +0 -0
  217. {coverage-7.15.3 → coverage-7.15.4}/tests/__init__.py +0 -0
  218. {coverage-7.15.3 → coverage-7.15.4}/tests/conftest.py +0 -0
  219. {coverage-7.15.3 → coverage-7.15.4}/tests/coveragetest.py +0 -0
  220. {coverage-7.15.3 → coverage-7.15.4}/tests/covmodzip1.py +0 -0
  221. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/README.rst +0 -0
  222. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/anno_dir/multi.py,cover +0 -0
  223. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/anno_dir/z_80084bf2fba02475___init__.py,cover +0 -0
  224. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/anno_dir/z_80084bf2fba02475_a.py,cover +0 -0
  225. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/anno_dir/z_b039179a8a4ce2c2___init__.py,cover +0 -0
  226. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/anno_dir/z_b039179a8a4ce2c2_b.py,cover +0 -0
  227. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/encodings/utf8.py,cover +0 -0
  228. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/mae/mae.py,cover +0 -0
  229. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/multi/a/__init__.py,cover +0 -0
  230. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/multi/a/a.py,cover +0 -0
  231. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/multi/b/__init__.py,cover +0 -0
  232. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/multi/b/b.py,cover +0 -0
  233. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/multi/multi.py,cover +0 -0
  234. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/annotate/white/white.py,cover +0 -0
  235. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/Makefile +0 -0
  236. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/a/a_py.html +0 -0
  237. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/a/class_index.html +0 -0
  238. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/a/function_index.html +0 -0
  239. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/a/index.html +0 -0
  240. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/b_branch/class_index.html +0 -0
  241. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/b_branch/function_index.html +0 -0
  242. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/b_branch/index.html +0 -0
  243. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/bom/class_index.html +0 -0
  244. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/bom/function_index.html +0 -0
  245. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/bom/index.html +0 -0
  246. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/contexts/class_index.html +0 -0
  247. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/contexts/function_index.html +0 -0
  248. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/contexts/index.html +0 -0
  249. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/isolatin1/class_index.html +0 -0
  250. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/isolatin1/function_index.html +0 -0
  251. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/isolatin1/index.html +0 -0
  252. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/multiline/class_index.html +0 -0
  253. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/multiline/function_index.html +0 -0
  254. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/multiline/index.html +0 -0
  255. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/class_index.html +0 -0
  256. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/function_index.html +0 -0
  257. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/index.html +0 -0
  258. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/m1_py.html +0 -0
  259. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/m2_py.html +0 -0
  260. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/m3_py.html +0 -0
  261. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_1/main_py.html +0 -0
  262. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_2/class_index.html +0 -0
  263. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_2/function_index.html +0 -0
  264. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_2/index.html +0 -0
  265. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_2/m2_py.html +0 -0
  266. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_2/m3_py.html +0 -0
  267. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_2/main_py.html +0 -0
  268. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_3/class_index.html +0 -0
  269. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_3/function_index.html +0 -0
  270. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_3/index.html +0 -0
  271. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_3/m3_py.html +0 -0
  272. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_3/main_py.html +0 -0
  273. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_4/class_index.html +0 -0
  274. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_4/function_index.html +0 -0
  275. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_4/index.html +0 -0
  276. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_4/m1_py.html +0 -0
  277. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_4/m3_py.html +0 -0
  278. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_4/main_py.html +0 -0
  279. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_5/class_index.html +0 -0
  280. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_5/function_index.html +0 -0
  281. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_5/index.html +0 -0
  282. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_5/m1_py.html +0 -0
  283. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/omit_5/main_py.html +0 -0
  284. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/other/class_index.html +0 -0
  285. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/other/function_index.html +0 -0
  286. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/other/here_py.html +0 -0
  287. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/other/index.html +0 -0
  288. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/partial/class_index.html +0 -0
  289. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/partial/function_index.html +0 -0
  290. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/partial/index.html +0 -0
  291. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/styled/a_py.html +0 -0
  292. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/styled/class_index.html +0 -0
  293. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/styled/function_index.html +0 -0
  294. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/styled/index.html +0 -0
  295. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/styled/myextra.css +0 -0
  296. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/styled/style.css +0 -0
  297. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/support/coverage_html_cb_dd2e7eb5.js +0 -0
  298. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/support/favicon_32_cb_c827f16f.png +0 -0
  299. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/support/keybd_closed_cb_900cfef5.png +0 -0
  300. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/support/style_cb_a90a112a.css +0 -0
  301. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/unicode/class_index.html +0 -0
  302. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/unicode/function_index.html +0 -0
  303. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/html/unicode/index.html +0 -0
  304. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/testing/getty/gettysburg.txt +0 -0
  305. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/testing/xml/output.xml +0 -0
  306. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/xml/x_xml/coverage.xml +0 -0
  307. {coverage-7.15.3 → coverage-7.15.4}/tests/gold/xml/y_xml_branch/coverage.xml +0 -0
  308. {coverage-7.15.3 → coverage-7.15.4}/tests/goldtest.py +0 -0
  309. {coverage-7.15.3 → coverage-7.15.4}/tests/helpers.py +0 -0
  310. {coverage-7.15.3 → coverage-7.15.4}/tests/js/index.html +0 -0
  311. {coverage-7.15.3 → coverage-7.15.4}/tests/js/tests.js +0 -0
  312. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/__init__.py +0 -0
  313. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/afile.odd.py +0 -0
  314. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/afile.py +0 -0
  315. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/bb/__init__.py +0 -0
  316. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/bb/bfile.odd.py +0 -0
  317. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/bb/bfile.py +0 -0
  318. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/bb/cc/__init__.py +0 -0
  319. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/bb/cc/cfile.py +0 -0
  320. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/bb.odd/bfile.py +0 -0
  321. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/aa/zfile.py +0 -0
  322. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/ambiguous/__init__.py +0 -0
  323. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/ambiguous/pkg1/__init__.py +0 -0
  324. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/ambiguous/pkg1/ambiguous.py +0 -0
  325. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/checkspec.py +0 -0
  326. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/covmod1.py +0 -0
  327. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/namespace_420/sub1/__init__.py +0 -0
  328. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/__init__.py +0 -0
  329. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/__main__.py +0 -0
  330. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/p1a.py +0 -0
  331. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/p1b.py +0 -0
  332. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/p1c.py +0 -0
  333. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/runmod2.py +0 -0
  334. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/sub/__init__.py +0 -0
  335. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/sub/__main__.py +0 -0
  336. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/sub/ps1a.py +0 -0
  337. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg1/sub/runmod3.py +0 -0
  338. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg2/__init__.py +0 -0
  339. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg2/p2a.py +0 -0
  340. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/pkg2/p2b.py +0 -0
  341. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/plugins/__init__.py +0 -0
  342. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/plugins/a_plugin.py +0 -0
  343. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/plugins/another.py +0 -0
  344. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/process_test/__init__.py +0 -0
  345. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/runmod1.py +0 -0
  346. {coverage-7.15.3 → coverage-7.15.4}/tests/modules/usepkgs.py +0 -0
  347. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/namespace_420/sub2/__init__.py +0 -0
  348. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/othermods/__init__.py +0 -0
  349. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/othermods/othera.py +0 -0
  350. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/othermods/otherb.py +0 -0
  351. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/othermods/sub/__init__.py +0 -0
  352. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/othermods/sub/osa.py +0 -0
  353. {coverage-7.15.3 → coverage-7.15.4}/tests/moremodules/othermods/sub/osb.py +0 -0
  354. {coverage-7.15.3 → coverage-7.15.4}/tests/osinfo.py +0 -0
  355. {coverage-7.15.3 → coverage-7.15.4}/tests/plugin1.py +0 -0
  356. {coverage-7.15.3 → coverage-7.15.4}/tests/plugin2.py +0 -0
  357. {coverage-7.15.3 → coverage-7.15.4}/tests/plugin_config.py +0 -0
  358. {coverage-7.15.3 → coverage-7.15.4}/tests/qunit/jquery.tmpl.min.js +0 -0
  359. {coverage-7.15.3 → coverage-7.15.4}/tests/select_plugin.py +0 -0
  360. {coverage-7.15.3 → coverage-7.15.4}/tests/strategies.py +0 -0
  361. {coverage-7.15.3 → coverage-7.15.4}/tests/stress_phystoken.tok +0 -0
  362. {coverage-7.15.3 → coverage-7.15.4}/tests/stress_phystoken_dos.tok +0 -0
  363. {coverage-7.15.3 → coverage-7.15.4}/tests/test_annotate.py +0 -0
  364. {coverage-7.15.3 → coverage-7.15.4}/tests/test_api.py +0 -0
  365. {coverage-7.15.3 → coverage-7.15.4}/tests/test_bytecode.py +0 -0
  366. {coverage-7.15.3 → coverage-7.15.4}/tests/test_cmdline.py +0 -0
  367. {coverage-7.15.3 → coverage-7.15.4}/tests/test_collector.py +0 -0
  368. {coverage-7.15.3 → coverage-7.15.4}/tests/test_concurrency.py +0 -0
  369. {coverage-7.15.3 → coverage-7.15.4}/tests/test_config.py +0 -0
  370. {coverage-7.15.3 → coverage-7.15.4}/tests/test_context.py +0 -0
  371. {coverage-7.15.3 → coverage-7.15.4}/tests/test_core.py +0 -0
  372. {coverage-7.15.3 → coverage-7.15.4}/tests/test_coverage.py +0 -0
  373. {coverage-7.15.3 → coverage-7.15.4}/tests/test_debug.py +0 -0
  374. {coverage-7.15.3 → coverage-7.15.4}/tests/test_execfile.py +0 -0
  375. {coverage-7.15.3 → coverage-7.15.4}/tests/test_filereporter.py +0 -0
  376. {coverage-7.15.3 → coverage-7.15.4}/tests/test_files.py +0 -0
  377. {coverage-7.15.3 → coverage-7.15.4}/tests/test_goldtest.py +0 -0
  378. {coverage-7.15.3 → coverage-7.15.4}/tests/test_json.py +0 -0
  379. {coverage-7.15.3 → coverage-7.15.4}/tests/test_misc.py +0 -0
  380. {coverage-7.15.3 → coverage-7.15.4}/tests/test_mixins.py +0 -0
  381. {coverage-7.15.3 → coverage-7.15.4}/tests/test_numbits.py +0 -0
  382. {coverage-7.15.3 → coverage-7.15.4}/tests/test_oddball.py +0 -0
  383. {coverage-7.15.3 → coverage-7.15.4}/tests/test_parser.py +0 -0
  384. {coverage-7.15.3 → coverage-7.15.4}/tests/test_phystokens.py +0 -0
  385. {coverage-7.15.3 → coverage-7.15.4}/tests/test_plugins.py +0 -0
  386. {coverage-7.15.3 → coverage-7.15.4}/tests/test_process.py +0 -0
  387. {coverage-7.15.3 → coverage-7.15.4}/tests/test_python.py +0 -0
  388. {coverage-7.15.3 → coverage-7.15.4}/tests/test_regions.py +0 -0
  389. {coverage-7.15.3 → coverage-7.15.4}/tests/test_report.py +0 -0
  390. {coverage-7.15.3 → coverage-7.15.4}/tests/test_report_common.py +0 -0
  391. {coverage-7.15.3 → coverage-7.15.4}/tests/test_report_core.py +0 -0
  392. {coverage-7.15.3 → coverage-7.15.4}/tests/test_results.py +0 -0
  393. {coverage-7.15.3 → coverage-7.15.4}/tests/test_setup.py +0 -0
  394. {coverage-7.15.3 → coverage-7.15.4}/tests/test_sqlitedb.py +0 -0
  395. {coverage-7.15.3 → coverage-7.15.4}/tests/test_sysmon.py +0 -0
  396. {coverage-7.15.3 → coverage-7.15.4}/tests/test_templite.py +0 -0
  397. {coverage-7.15.3 → coverage-7.15.4}/tests/test_testing.py +0 -0
  398. {coverage-7.15.3 → coverage-7.15.4}/tests/test_venv.py +0 -0
  399. {coverage-7.15.3 → coverage-7.15.4}/tests/test_version.py +0 -0
  400. {coverage-7.15.3 → coverage-7.15.4}/tests/test_xml.py +0 -0
  401. {coverage-7.15.3 → coverage-7.15.4}/tests/testenv.py +0 -0
  402. {coverage-7.15.3 → coverage-7.15.4}/tests/zipsrc/zip1/__init__.py +0 -0
  403. {coverage-7.15.3 → coverage-7.15.4}/tests/zipsrc/zip1/zip1.py +0 -0
  404. {coverage-7.15.3 → coverage-7.15.4}/tox.ini +0 -0
@@ -36,7 +36,7 @@ env:
36
36
  PIP_DISABLE_PIP_VERSION_CHECK: 1
37
37
  # PYVERSIONS: changing the list of versions will change the number of
38
38
  # expected distributions. This must match the same number in publish.yml.
39
- EXPECTED: 91
39
+ EXPECTED: 121
40
40
 
41
41
  permissions:
42
42
  contents: read
@@ -79,13 +79,13 @@ jobs:
79
79
  # # of Python: https://cibuildwheel.readthedocs.io/en/stable/options/#enable
80
80
  # # When changing this, also adjust SHIPPING_WHEELS in env.py.
81
81
  #
82
- # pys = ["cp310", "cp311", "cp312", "cp313", "cp314"]
82
+ # pys = ["cp310", "cp311", "cp312", "cp313", "cp314", "cp315"]
83
83
  # cipy = "3.11" # PYVERSIONS, default for cibuildwheel
84
84
  #
85
85
  # # Some OS/arch combinations need overrides for the Python versions:
86
86
  # os_arch_pys = {
87
87
  # # ("macos", "arm64"): ["cp38", "cp39", "cp310", "cp311", "cp312"],
88
- # ("windows", "ARM64"): ["cp311", "cp312", "cp313", "cp314"],
88
+ # ("windows", "ARM64"): ["cp311", "cp312", "cp313", "cp314", "cp315"],
89
89
  # }
90
90
  #
91
91
  # #----- ^^^ ---------------------- ^^^ -----
@@ -117,51 +117,61 @@ jobs:
117
117
  - {"os": "ubuntu", "py": "cp312", "arch": "x86_64", "cipy": "3.11"}
118
118
  - {"os": "ubuntu", "py": "cp313", "arch": "x86_64", "cipy": "3.11"}
119
119
  - {"os": "ubuntu", "py": "cp314", "arch": "x86_64", "cipy": "3.11"}
120
+ - {"os": "ubuntu", "py": "cp315", "arch": "x86_64", "cipy": "3.11"}
120
121
  - {"os": "ubuntu", "py": "cp310", "arch": "i686", "cipy": "3.11"}
121
122
  - {"os": "ubuntu", "py": "cp311", "arch": "i686", "cipy": "3.11"}
122
123
  - {"os": "ubuntu", "py": "cp312", "arch": "i686", "cipy": "3.11"}
123
124
  - {"os": "ubuntu", "py": "cp313", "arch": "i686", "cipy": "3.11"}
124
125
  - {"os": "ubuntu", "py": "cp314", "arch": "i686", "cipy": "3.11"}
126
+ - {"os": "ubuntu", "py": "cp315", "arch": "i686", "cipy": "3.11"}
125
127
  - {"os": "ubuntu", "py": "cp310", "arch": "aarch64", "cipy": "3.11", "os-version": "22.04-arm"}
126
128
  - {"os": "ubuntu", "py": "cp311", "arch": "aarch64", "cipy": "3.11", "os-version": "22.04-arm"}
127
129
  - {"os": "ubuntu", "py": "cp312", "arch": "aarch64", "cipy": "3.11", "os-version": "22.04-arm"}
128
130
  - {"os": "ubuntu", "py": "cp313", "arch": "aarch64", "cipy": "3.11", "os-version": "22.04-arm"}
129
131
  - {"os": "ubuntu", "py": "cp314", "arch": "aarch64", "cipy": "3.11", "os-version": "22.04-arm"}
132
+ - {"os": "ubuntu", "py": "cp315", "arch": "aarch64", "cipy": "3.11", "os-version": "22.04-arm"}
130
133
  - {"os": "ubuntu", "py": "cp310", "arch": "riscv64", "cipy": "3.11"}
131
134
  - {"os": "ubuntu", "py": "cp311", "arch": "riscv64", "cipy": "3.11"}
132
135
  - {"os": "ubuntu", "py": "cp312", "arch": "riscv64", "cipy": "3.11"}
133
136
  - {"os": "ubuntu", "py": "cp313", "arch": "riscv64", "cipy": "3.11"}
134
137
  - {"os": "ubuntu", "py": "cp314", "arch": "riscv64", "cipy": "3.11"}
138
+ - {"os": "ubuntu", "py": "cp315", "arch": "riscv64", "cipy": "3.11"}
135
139
  - {"os": "ubuntu", "py": "cp310", "arch": "ppc64le", "cipy": "3.11", "os-version": "24.04-ppc64le"}
136
140
  - {"os": "ubuntu", "py": "cp311", "arch": "ppc64le", "cipy": "3.11", "os-version": "24.04-ppc64le"}
137
141
  - {"os": "ubuntu", "py": "cp312", "arch": "ppc64le", "cipy": "3.11", "os-version": "24.04-ppc64le"}
138
142
  - {"os": "ubuntu", "py": "cp313", "arch": "ppc64le", "cipy": "3.11", "os-version": "24.04-ppc64le"}
139
143
  - {"os": "ubuntu", "py": "cp314", "arch": "ppc64le", "cipy": "3.11", "os-version": "24.04-ppc64le"}
144
+ - {"os": "ubuntu", "py": "cp315", "arch": "ppc64le", "cipy": "3.11", "os-version": "24.04-ppc64le"}
140
145
  - {"os": "macos", "py": "cp310", "arch": "arm64", "cipy": "3.11", "os-version": "14"}
141
146
  - {"os": "macos", "py": "cp311", "arch": "arm64", "cipy": "3.11", "os-version": "14"}
142
147
  - {"os": "macos", "py": "cp312", "arch": "arm64", "cipy": "3.11", "os-version": "14"}
143
148
  - {"os": "macos", "py": "cp313", "arch": "arm64", "cipy": "3.11", "os-version": "14"}
144
149
  - {"os": "macos", "py": "cp314", "arch": "arm64", "cipy": "3.11", "os-version": "14"}
150
+ - {"os": "macos", "py": "cp315", "arch": "arm64", "cipy": "3.11", "os-version": "14"}
145
151
  - {"os": "macos", "py": "cp310", "arch": "x86_64", "cipy": "3.11", "os-version": "14"}
146
152
  - {"os": "macos", "py": "cp311", "arch": "x86_64", "cipy": "3.11", "os-version": "14"}
147
153
  - {"os": "macos", "py": "cp312", "arch": "x86_64", "cipy": "3.11", "os-version": "14"}
148
154
  - {"os": "macos", "py": "cp313", "arch": "x86_64", "cipy": "3.11", "os-version": "14"}
149
155
  - {"os": "macos", "py": "cp314", "arch": "x86_64", "cipy": "3.11", "os-version": "14"}
156
+ - {"os": "macos", "py": "cp315", "arch": "x86_64", "cipy": "3.11", "os-version": "14"}
150
157
  - {"os": "windows", "py": "cp310", "arch": "x86", "cipy": "3.11"}
151
158
  - {"os": "windows", "py": "cp311", "arch": "x86", "cipy": "3.11"}
152
159
  - {"os": "windows", "py": "cp312", "arch": "x86", "cipy": "3.11"}
153
160
  - {"os": "windows", "py": "cp313", "arch": "x86", "cipy": "3.11"}
154
161
  - {"os": "windows", "py": "cp314", "arch": "x86", "cipy": "3.11"}
162
+ - {"os": "windows", "py": "cp315", "arch": "x86", "cipy": "3.11"}
155
163
  - {"os": "windows", "py": "cp310", "arch": "AMD64", "cipy": "3.11"}
156
164
  - {"os": "windows", "py": "cp311", "arch": "AMD64", "cipy": "3.11"}
157
165
  - {"os": "windows", "py": "cp312", "arch": "AMD64", "cipy": "3.11"}
158
166
  - {"os": "windows", "py": "cp313", "arch": "AMD64", "cipy": "3.11"}
159
167
  - {"os": "windows", "py": "cp314", "arch": "AMD64", "cipy": "3.11"}
168
+ - {"os": "windows", "py": "cp315", "arch": "AMD64", "cipy": "3.11"}
160
169
  - {"os": "windows", "py": "cp311", "arch": "ARM64", "cipy": "3.11", "os-version": "11-arm"}
161
170
  - {"os": "windows", "py": "cp312", "arch": "ARM64", "cipy": "3.11", "os-version": "11-arm"}
162
171
  - {"os": "windows", "py": "cp313", "arch": "ARM64", "cipy": "3.11", "os-version": "11-arm"}
163
172
  - {"os": "windows", "py": "cp314", "arch": "ARM64", "cipy": "3.11", "os-version": "11-arm"}
164
- # [[[end]]] (sum: AhCqn9SafY)
173
+ - {"os": "windows", "py": "cp315", "arch": "ARM64", "cipy": "3.11", "os-version": "11-arm"}
174
+ # [[[end]]] (sum: N6DRns0iG/)
165
175
  # ^^^^^^^^^^^^^^^
166
176
  # If a check fails and points to this checksum line, it means you edited
167
177
  # the matrix directly instead of editing the Python code in the comment
@@ -204,12 +214,16 @@ jobs:
204
214
  if: ${{ matrix.arch == 'riscv64' }}
205
215
  uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
206
216
 
217
+ - name: "Show environment"
218
+ run: |
219
+ python -VV
220
+ python -m site
221
+
207
222
  - name: "Build binary wheels"
208
223
  env:
209
224
  CIBW_BUILD: ${{ matrix.py }}*-*
210
225
  CIBW_ARCHS: ${{ matrix.arch }}
211
226
  CIBW_ENVIRONMENT: PIP_DISABLE_PIP_VERSION_CHECK=1
212
- CIBW_ENABLE: cpython-prerelease
213
227
  CIBW_TEST_COMMAND: python -c "from coverage.tracer import CTracer; print('CTracer OK!')"
214
228
  run: |
215
229
  python -m cibuildwheel --output-dir wheelhouse
@@ -17,7 +17,7 @@ defaults:
17
17
  env:
18
18
  # PYVERSIONS: changing the list of versions will change the number of
19
19
  # expected distributions. This must match the same number in kit.yml.
20
- EXPECTED: 91
20
+ EXPECTED: 121
21
21
 
22
22
  permissions:
23
23
  contents: read
@@ -16,7 +16,7 @@ repos:
16
16
  exclude: "stress_phystoken|\\.py,cover$"
17
17
 
18
18
  - repo: https://github.com/astral-sh/ruff-pre-commit
19
- rev: v0.16.0
19
+ rev: v0.16.1
20
20
  hooks:
21
21
  - id: ruff-format
22
22
 
@@ -22,6 +22,29 @@ upgrading your version of coverage.py.
22
22
 
23
23
  .. start-releases
24
24
 
25
+ .. _changes_7-15-4:
26
+
27
+ Version 7.15.4 — 2026-08-06
28
+ ---------------------------
29
+
30
+ - Fix: in the HTML report, a source file name containing a double quote (legal
31
+ on POSIX) wasn't escaped where it's dropped into the ``href`` of the index
32
+ and prev/next links, so it could close the attribute early and inject markup.
33
+ Page URLs are now escaped. Thanks, `Rajath Mohare <pull 2227_>`_.
34
+
35
+ - Fix: the LCOV report wrote file names and other fields into its
36
+ line-oriented records without neutralizing control characters. A measured
37
+ file whose name contained a newline (legal on POSIX) could forge extra
38
+ records, inflating the coverage seen by tools that read the report. Control
39
+ characters in a field are now replaced. Thanks, `Rajath Mohare <pull
40
+ 2226_>`_.
41
+
42
+ - Wheels are now provided for Python 3.15.
43
+
44
+ .. _pull 2226: https://github.com/coveragepy/coveragepy/pull/2226
45
+ .. _pull 2227: https://github.com/coveragepy/coveragepy/pull/2227
46
+
47
+
25
48
  .. _changes_7-15-3:
26
49
 
27
50
  Version 7.15.3 — 2026-08-02
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coverage
3
- Version: 7.15.3
3
+ Version: 7.15.4
4
4
  Summary: Code coverage measurement for Python
5
5
  Home-page: https://github.com/coveragepy/coveragepy
6
6
  Author: Ned Batchelder and 263 others
7
7
  Author-email: ned@nedbatchelder.com
8
8
  License: Apache-2.0
9
- Project-URL: Documentation, https://coverage.readthedocs.io/en/7.15.3
9
+ Project-URL: Documentation, https://coverage.readthedocs.io/en/7.15.4
10
10
  Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi
11
11
  Project-URL: Issues, https://github.com/coveragepy/coveragepy/issues
12
12
  Project-URL: Mastodon, https://hachyderm.io/@coveragepy
@@ -78,13 +78,13 @@ Coverage.py runs on these versions of Python:
78
78
 
79
79
  .. PYVERSIONS
80
80
 
81
- * Python 3.10 through 3.15 beta, including free-threading.
81
+ * Python 3.10 through 3.15 rc1, including free-threading.
82
82
  * PyPy3 versions 3.10 and 3.11.
83
83
 
84
84
  Documentation is on `Read the Docs`_. Code repository and issue tracker are on
85
85
  `GitHub`_.
86
86
 
87
- .. _Read the Docs: https://coverage.readthedocs.io/en/7.15.3/
87
+ .. _Read the Docs: https://coverage.readthedocs.io/en/7.15.4/
88
88
  .. _GitHub: https://github.com/coveragepy/coveragepy
89
89
 
90
90
 
@@ -113,7 +113,7 @@ Getting Started
113
113
  Looking to run ``coverage`` on your test suite? See the `Quick Start section`_
114
114
  of the docs.
115
115
 
116
- .. _Quick Start section: https://coverage.readthedocs.io/en/7.15.3/#quick-start
116
+ .. _Quick Start section: https://coverage.readthedocs.io/en/7.15.4/#quick-start
117
117
 
118
118
 
119
119
  Change history
@@ -121,7 +121,7 @@ Change history
121
121
 
122
122
  The complete history of changes is on the `change history page`_.
123
123
 
124
- .. _change history page: https://coverage.readthedocs.io/en/7.15.3/changes.html
124
+ .. _change history page: https://coverage.readthedocs.io/en/7.15.4/changes.html
125
125
 
126
126
 
127
127
  Code of Conduct
@@ -140,7 +140,7 @@ Contributing
140
140
  Found a bug? Want to help improve the code or documentation? See the
141
141
  `Contributing section`_ of the docs.
142
142
 
143
- .. _Contributing section: https://coverage.readthedocs.io/en/7.15.3/contributing.html
143
+ .. _Contributing section: https://coverage.readthedocs.io/en/7.15.4/contributing.html
144
144
 
145
145
 
146
146
  Security
@@ -168,7 +168,7 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_.
168
168
  :target: https://github.com/coveragepy/coveragepy/actions/workflows/quality.yml
169
169
  :alt: Quality check status
170
170
  .. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat
171
- :target: https://coverage.readthedocs.io/en/7.15.3/
171
+ :target: https://coverage.readthedocs.io/en/7.15.4/
172
172
  :alt: Documentation
173
173
  .. |kit| image:: https://img.shields.io/pypi/v/coverage
174
174
  :target: https://pypi.org/project/coverage/
@@ -26,7 +26,7 @@ Coverage.py runs on these versions of Python:
26
26
 
27
27
  .. PYVERSIONS
28
28
 
29
- * Python 3.10 through 3.15 beta, including free-threading.
29
+ * Python 3.10 through 3.15 rc1, including free-threading.
30
30
  * PyPy3 versions 3.10 and 3.11.
31
31
 
32
32
  Documentation is on `Read the Docs`_. Code repository and issue tracker are on
@@ -432,8 +432,6 @@ class CoverageOptionParser(optparse.OptionParser):
432
432
  class OptionParserError(Exception):
433
433
  """Used to stop the optparse error handler ending the process."""
434
434
 
435
- pass
436
-
437
435
  def parse_args_ok(self, args: list[str]) -> tuple[bool, optparse.Values | None, list[str]]:
438
436
  """Call optparse.parse_args, but return a triple:
439
437
 
@@ -753,8 +751,7 @@ def show_help(
753
751
  # coverage-3.5-script.py. argv[0] is the .py file, but we want to
754
752
  # get back to the original form.
755
753
  auto_suffix = "-script.py"
756
- if program_name.endswith(auto_suffix):
757
- program_name = program_name[: -len(auto_suffix)]
754
+ program_name = program_name.removesuffix(auto_suffix)
758
755
 
759
756
  help_params = dict(coverage.__dict__)
760
757
  help_params["__url__"] = __url__
@@ -148,10 +148,7 @@ class Collector:
148
148
 
149
149
  if self.concur_id_func and not hasattr(core.tracer_class, "concur_id_func"):
150
150
  raise ConfigError(
151
- "Can't support concurrency={} with {}, only threads are supported.".format(
152
- tried,
153
- self.tracer_name(),
154
- ),
151
+ f"Can't support concurrency={tried} with {self.tracer_name()}, only threads are supported.",
155
152
  )
156
153
 
157
154
  if do_threading or not concurrency:
@@ -344,11 +344,7 @@ class CoverageConfig(TConfigurable, TPluginConfig):
344
344
  if real_section:
345
345
  for unknown in set(cp.options(section)) - options:
346
346
  warn(
347
- "Unrecognized option '[{}] {}=' in config file {}".format(
348
- real_section,
349
- unknown,
350
- filename,
351
- ),
347
+ f"Unrecognized option '[{real_section}] {unknown}=' in config file {filename}",
352
348
  )
353
349
 
354
350
  # [paths] is special
@@ -1048,10 +1048,7 @@ class Coverage(TConfigurable):
1048
1048
  file_reporter = plugin.file_reporter(mapped_morf)
1049
1049
  if file_reporter is None:
1050
1050
  raise PluginError(
1051
- "Plugin {!r} did not provide a file reporter for {!r}.".format(
1052
- plugin._coverage_plugin_name,
1053
- morf,
1054
- ),
1051
+ f"Plugin {plugin._coverage_plugin_name!r} did not provide a file reporter for {morf!r}.",
1055
1052
  )
1056
1053
 
1057
1054
  if file_reporter == "python":
@@ -49,7 +49,7 @@ FREE_THREADED = bool(sysconfig.get_config_var("Py_GIL_DISABLED"))
49
49
 
50
50
  # Do we ship compiled coveragepy wheels for this version?
51
51
  SHIPPING_WHEELS = (
52
- CPYTHON and PYVERSION[:2] <= (3, 14) and not (FREE_THREADED and PYVERSION[:2] == (3, 13))
52
+ CPYTHON and PYVERSION[:2] <= (3, 15) and not (FREE_THREADED and PYVERSION[:2] == (3, 13))
53
53
  )
54
54
 
55
55
  # Should we default to sys.monitoring?
@@ -30,44 +30,30 @@ class CoverageException(Exception):
30
30
  class ConfigError(CoverageException):
31
31
  """A problem with a config file, or a value in one."""
32
32
 
33
- pass
34
-
35
33
 
36
34
  class DataError(CoverageException):
37
35
  """An error in using a data file."""
38
36
 
39
- pass
40
-
41
37
 
42
38
  class NoDataError(CoverageException):
43
39
  """We didn't have data to work with."""
44
40
 
45
- pass
46
-
47
41
 
48
42
  class NoSource(CoverageException):
49
43
  """We couldn't find the source for a module."""
50
44
 
51
- pass
52
-
53
45
 
54
46
  class NoCode(NoSource):
55
47
  """We couldn't find any code at all."""
56
48
 
57
- pass
58
-
59
49
 
60
50
  class NotPython(CoverageException):
61
51
  """A source file turned out not to be parsable Python."""
62
52
 
63
- pass
64
-
65
53
 
66
54
  class PluginError(CoverageException):
67
55
  """A plugin misbehaved."""
68
56
 
69
- pass
70
-
71
57
 
72
58
  class _ExceptionDuringRun(CoverageException):
73
59
  """An exception happened while running customer code.
@@ -76,10 +62,6 @@ class _ExceptionDuringRun(CoverageException):
76
62
 
77
63
  """
78
64
 
79
- pass
80
-
81
65
 
82
66
  class CoverageWarning(Warning):
83
67
  """A warning from Coverage.py."""
84
-
85
- pass
@@ -15,6 +15,7 @@ import re
15
15
  import string
16
16
  from collections.abc import Iterable
17
17
  from dataclasses import dataclass, field
18
+ from html import escape
18
19
  from typing import TYPE_CHECKING, Any
19
20
 
20
21
  import coverage
@@ -849,16 +850,6 @@ class IncrementalChecker:
849
850
  # Helpers for templates and generating HTML
850
851
 
851
852
 
852
- def escape(t: str) -> str:
853
- """HTML-escape the text in `t`.
854
-
855
- This is only suitable for HTML text, not attributes.
856
-
857
- """
858
- # Convert HTML special chars into HTML entities.
859
- return t.replace("&", "&amp;").replace("<", "&lt;")
860
-
861
-
862
853
  def pair(ratio: tuple[int, int]) -> str:
863
854
  """Format a pair of numbers so JavaScript can read them in an attribute."""
864
855
  return "{} {}".format(*ratio)
@@ -120,9 +120,9 @@
120
120
  <tbody>
121
121
  {% for region in regions %}
122
122
  <tr class="region">
123
- <td class="name"><a href="{{region.url}}">{{region.file|escape|pretty_file}}</a></td>
123
+ <td class="name"><a href="{{region.url|escape}}">{{region.file|escape|pretty_file}}</a></td>
124
124
  {% if region_noun %}
125
- <td class="name"><a href="{{region.url}}">{{region.description}}</a></td>
125
+ <td class="name"><a href="{{region.url|escape}}">{{region.description}}</a></td>
126
126
  {% endif %}
127
127
  <td class="spacer">&nbsp;</td>
128
128
  {% if has_arcs %}
@@ -187,8 +187,8 @@
187
187
  </p>
188
188
  </div>
189
189
  <aside class="hidden">
190
- <a id="prevFileLink" class="nav" href="{{ final_html }}"></a>
191
- <a id="nextFileLink" class="nav" href="{{ first_html }}"></a>
190
+ <a id="prevFileLink" class="nav" href="{{ final_html|escape }}"></a>
191
+ <a id="nextFileLink" class="nav" href="{{ first_html|escape }}"></a>
192
192
  <button type="button" class="button_prev_file" data-shortcut="["></button>
193
193
  <button type="button" class="button_next_file" data-shortcut="]"></button>
194
194
  <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
@@ -83,9 +83,9 @@
83
83
  </h2>
84
84
 
85
85
  <p class="text">
86
- <a id="prevFileLink" class="nav" href="{{ prev_html }}">&#xab; prev</a> &nbsp; &nbsp;
86
+ <a id="prevFileLink" class="nav" href="{{ prev_html|escape }}">&#xab; prev</a> &nbsp; &nbsp;
87
87
  <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
88
- <a id="nextFileLink" class="nav" href="{{ next_html }}">&#xbb; next</a>
88
+ <a id="nextFileLink" class="nav" href="{{ next_html|escape }}">&#xbb; next</a>
89
89
  &nbsp; &nbsp; &nbsp;
90
90
  <a class="nav" href="{{__url__}}">coverage.py v{{__version__}}</a>,
91
91
  created at {{ time_stamp }}
@@ -135,9 +135,9 @@
135
135
  <footer>
136
136
  <div class="content">
137
137
  <p>
138
- <a class="nav" href="{{ prev_html }}">&#xab; prev</a> &nbsp; &nbsp;
138
+ <a class="nav" href="{{ prev_html|escape }}">&#xab; prev</a> &nbsp; &nbsp;
139
139
  <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
140
- <a class="nav" href="{{ next_html }}">&#xbb; next</a>
140
+ <a class="nav" href="{{ next_html|escape }}">&#xbb; next</a>
141
141
  &nbsp; &nbsp; &nbsp;
142
142
  <a class="nav" href="{{__url__}}">coverage.py v{{__version__}}</a>,
143
143
  created at {{ time_stamp }}
@@ -539,10 +539,7 @@ class InOrOut:
539
539
  warned.add(filename)
540
540
  elif self.debug and self.debug.should("trace"):
541
541
  self.debug.write(
542
- "Didn't trace already imported file {!r}: {}".format(
543
- disp.original_filename,
544
- disp.reason,
545
- ),
542
+ f"Didn't trace already imported file {disp.original_filename!r}: {disp.reason}",
546
543
  )
547
544
 
548
545
  def warn_unimported_source(self) -> None:
@@ -19,6 +19,19 @@ if TYPE_CHECKING:
19
19
  from coverage import Coverage
20
20
 
21
21
 
22
+ def lcov_field(text: str) -> str:
23
+ """Make `text` safe to write as a field in a single LCOV record.
24
+
25
+ LCOV records are newline-delimited and the format has no escaping, so a
26
+ value carrying a newline (a legal character in a POSIX file name) would
27
+ spill into fabricated records. Replace any control characters, which can't
28
+ appear in a valid one-line field, and leave printable text untouched.
29
+ """
30
+ if text.isprintable():
31
+ return text
32
+ return "".join(ch if ch.isprintable() else "?" for ch in text)
33
+
34
+
22
35
  def line_hash(line: str) -> str:
23
36
  """Produce a hash of a source line for use in the LCOV file."""
24
37
  # The LCOV file format optionally allows each line to be MD5ed as a
@@ -97,8 +110,9 @@ def lcov_functions(
97
110
  hit = int(analysis.numbers.n_executed > 0)
98
111
  functions_hit += hit
99
112
 
100
- outfile.write(f"FN:{first_line},{last_line},{region.name}\n")
101
- outfile.write(f"FNDA:{hit},{region.name}\n")
113
+ name = lcov_field(region.name)
114
+ outfile.write(f"FN:{first_line},{last_line},{name}\n")
115
+ outfile.write(f"FNDA:{hit},{name}\n")
102
116
 
103
117
  outfile.write(f"FNF:{functions_found}\n")
104
118
  outfile.write(f"FNH:{functions_hit}\n")
@@ -145,7 +159,7 @@ def lcov_arcs(
145
159
  destinations.sort(key=lambda d: (d[0] < 0, d))
146
160
 
147
161
  for dst, hit in destinations:
148
- branch = fr.arc_description(line, dst)
162
+ branch = lcov_field(fr.arc_description(line, dst))
149
163
  outfile.write(f"BRDA:{line},0,{branch},{hit}\n")
150
164
 
151
165
  # Summary of the branch coverage.
@@ -207,7 +221,7 @@ class LcovReporter:
207
221
  if self.config.skip_empty:
208
222
  return
209
223
 
210
- outfile.write(f"SF:{rel_fname}\n")
224
+ outfile.write(f"SF:{lcov_field(rel_fname)}\n")
211
225
 
212
226
  lines = sorted(analysis.statements)
213
227
  if self.config.lcov_line_checksums:
@@ -13,7 +13,7 @@ import token
13
13
  import tokenize
14
14
  from collections.abc import Callable, Iterable, Sequence
15
15
  from dataclasses import dataclass
16
- from typing import Optional, Protocol, cast
16
+ from typing import Protocol, cast
17
17
 
18
18
  from coverage import env
19
19
  from coverage.bytecode import ByteParser
@@ -521,7 +521,7 @@ class TAddArcFn(Protocol):
521
521
  """
522
522
 
523
523
 
524
- TArcFragments = dict[TArc, list[tuple[Optional[str], Optional[str]]]]
524
+ TArcFragments = dict[TArc, list[tuple[str | None, str | None]]]
525
525
 
526
526
 
527
527
  class Block:
@@ -237,7 +237,6 @@ class CoveragePlugin:
237
237
  methods on the `config` object.
238
238
 
239
239
  """
240
- pass
241
240
 
242
241
  def sys_info(self) -> Iterable[tuple[str, Any]]:
243
242
  """Get a list of information useful for debugging.
@@ -607,7 +606,7 @@ class FileReporter(CoveragePluginBase):
607
606
  """
608
607
  return []
609
608
 
610
- def __eq__(self, other: Any) -> bool:
609
+ def __eq__(self, other: object) -> bool:
611
610
  return isinstance(other, FileReporter) and self.filename == other.filename
612
611
 
613
612
  def __lt__(self, other: Any) -> bool:
@@ -226,11 +226,7 @@ class DebugFileTracerWrapper(FileTracer):
226
226
  def dynamic_source_filename(self, filename: str, frame: FrameType) -> str | None:
227
227
  dyn = self.tracer.dynamic_source_filename(filename, frame)
228
228
  self.debug.write(
229
- "dynamic_source_filename({!r}, {}) --> {!r}".format(
230
- filename,
231
- self._show_frame(frame),
232
- dyn,
233
- )
229
+ f"dynamic_source_filename({filename!r}, {self._show_frame(frame)}) --> {dyn!r}"
234
230
  )
235
231
  return dyn
236
232
 
@@ -130,10 +130,7 @@ class PyTracer(Tracer):
130
130
  f.write(f"{marker} {self.id}[{len(self.data_stack)}]")
131
131
  if 0: # if you want thread ids..
132
132
  f.write( # type: ignore[unreachable]
133
- ".{:x}.{:x}".format(
134
- self.thread.ident,
135
- self.threading.current_thread().ident,
136
- )
133
+ f".{self.thread.ident:x}.{self.threading.current_thread().ident:x}"
137
134
  )
138
135
  f.write(" {}".format(" ".join(map(str, args))))
139
136
  if 0: # if you want callers..
@@ -212,10 +212,7 @@ class SqliteDb:
212
212
  """Same as :meth:`python:sqlite3.Connection.executescript`."""
213
213
  if self.debug.should("sql"):
214
214
  self.debug.write(
215
- "Executing script with {} chars: {}".format(
216
- len(script),
217
- clipped_repr(script, 100),
218
- )
215
+ f"Executing script with {len(script)} chars: {clipped_repr(script, 100)}"
219
216
  )
220
217
  assert self.con is not None
221
218
  self.con.executescript(script).close()
@@ -110,7 +110,7 @@ if LOG: # pragma: debugging
110
110
  try:
111
111
  print(f"{pid}:{tslug}: {msg}", file=f, flush=True)
112
112
  except UnicodeError:
113
- print(f"{pid}:{tslug}: {ascii(msg)}", file=f, flush=True)
113
+ print(f"{pid}:{tslug}: {msg!a}", file=f, flush=True)
114
114
 
115
115
  def arg_repr(arg: Any) -> str:
116
116
  """Make a customized repr for logged values."""
@@ -20,14 +20,10 @@ from typing import Any, NoReturn, cast
20
20
  class TempliteSyntaxError(ValueError):
21
21
  """Raised when a template has a syntax error."""
22
22
 
23
- pass
24
-
25
23
 
26
24
  class TempliteValueError(ValueError):
27
25
  """Raised when an expression won't evaluate in a template."""
28
26
 
29
- pass
30
-
31
27
 
32
28
  class CodeBuilder:
33
29
  """Build source code conveniently."""
@@ -29,8 +29,6 @@ else:
29
29
  class TomlDecodeError(Exception):
30
30
  """An exception class that exists even when toml isn't installed."""
31
31
 
32
- pass
33
-
34
32
 
35
33
  TWant = TypeVar("TWant")
36
34
 
@@ -3,7 +3,7 @@
3
3
 
4
4
  """Typing information for the constructs from our .c files."""
5
5
 
6
- from typing import Any, Dict
6
+ from typing import Any
7
7
 
8
8
  from coverage.types import TFileDisposition, TTraceData, TTraceFn, Tracer
9
9
 
@@ -37,7 +37,7 @@ class CTracer(Tracer):
37
37
  warn: Any
38
38
  def __init__(self) -> None: ...
39
39
  def activity(self) -> bool: ...
40
- def get_stats(self) -> Dict[str, int]: ...
40
+ def get_stats(self) -> dict[str, int]: ...
41
41
  def reset_activity(self) -> Any: ...
42
42
  def start(self) -> TTraceFn: ...
43
43
  def stop(self) -> None: ...
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  # version_info: same semantics as sys.version_info.
10
10
  # _dev: the .devN suffix if any.
11
- version_info = (7, 15, 3, "final", 0)
11
+ version_info = (7, 15, 4, "final", 0)
12
12
  _dev = 0
13
13
 
14
14