coverage 7.6.10__cp312-cp312-musllinux_1_2_aarch64.whl → 7.12.0__cp312-cp312-musllinux_1_2_aarch64.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 (57) hide show
  1. coverage/__init__.py +3 -1
  2. coverage/__main__.py +3 -1
  3. coverage/annotate.py +2 -3
  4. coverage/bytecode.py +178 -4
  5. coverage/cmdline.py +330 -155
  6. coverage/collector.py +32 -43
  7. coverage/config.py +167 -63
  8. coverage/context.py +5 -6
  9. coverage/control.py +165 -86
  10. coverage/core.py +71 -34
  11. coverage/data.py +4 -5
  12. coverage/debug.py +113 -57
  13. coverage/disposition.py +2 -1
  14. coverage/env.py +29 -78
  15. coverage/exceptions.py +29 -7
  16. coverage/execfile.py +19 -14
  17. coverage/files.py +24 -19
  18. coverage/html.py +118 -75
  19. coverage/htmlfiles/coverage_html.js +12 -10
  20. coverage/htmlfiles/index.html +45 -10
  21. coverage/htmlfiles/pyfile.html +2 -2
  22. coverage/htmlfiles/style.css +54 -6
  23. coverage/htmlfiles/style.scss +85 -3
  24. coverage/inorout.py +62 -45
  25. coverage/jsonreport.py +22 -9
  26. coverage/lcovreport.py +16 -18
  27. coverage/misc.py +51 -47
  28. coverage/multiproc.py +12 -7
  29. coverage/numbits.py +4 -5
  30. coverage/parser.py +150 -251
  31. coverage/patch.py +166 -0
  32. coverage/phystokens.py +25 -26
  33. coverage/plugin.py +14 -14
  34. coverage/plugin_support.py +37 -36
  35. coverage/python.py +13 -14
  36. coverage/pytracer.py +31 -33
  37. coverage/regions.py +3 -2
  38. coverage/report.py +60 -44
  39. coverage/report_core.py +7 -10
  40. coverage/results.py +152 -68
  41. coverage/sqldata.py +261 -211
  42. coverage/sqlitedb.py +37 -29
  43. coverage/sysmon.py +237 -162
  44. coverage/templite.py +19 -7
  45. coverage/tomlconfig.py +13 -13
  46. coverage/tracer.cpython-312-aarch64-linux-musl.so +0 -0
  47. coverage/tracer.pyi +3 -1
  48. coverage/types.py +26 -23
  49. coverage/version.py +4 -19
  50. coverage/xmlreport.py +17 -14
  51. {coverage-7.6.10.dist-info → coverage-7.12.0.dist-info}/METADATA +50 -28
  52. coverage-7.12.0.dist-info/RECORD +59 -0
  53. {coverage-7.6.10.dist-info → coverage-7.12.0.dist-info}/WHEEL +1 -1
  54. coverage-7.6.10.dist-info/RECORD +0 -58
  55. {coverage-7.6.10.dist-info → coverage-7.12.0.dist-info}/entry_points.txt +0 -0
  56. {coverage-7.6.10.dist-info → coverage-7.12.0.dist-info/licenses}/LICENSE.txt +0 -0
  57. {coverage-7.6.10.dist-info → coverage-7.12.0.dist-info}/top_level.txt +0 -0
coverage/tomlconfig.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
- # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
2
+ # For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
3
3
 
4
4
  """TOML configuration support for coverage.py"""
5
5
 
@@ -7,11 +7,10 @@ from __future__ import annotations
7
7
 
8
8
  import os
9
9
  import re
10
-
11
- from typing import Any, Callable, TypeVar
12
10
  from collections.abc import Iterable
11
+ from typing import Any, Callable, TypeVar
13
12
 
14
- from coverage import env
13
+ from coverage import config, env
15
14
  from coverage.exceptions import ConfigError
16
15
  from coverage.misc import import_third_party, isolate_module, substitute_variables
17
16
  from coverage.types import TConfigSectionOut, TConfigValueOut
@@ -19,7 +18,8 @@ from coverage.types import TConfigSectionOut, TConfigValueOut
19
18
  os = isolate_module(os)
20
19
 
21
20
  if env.PYVERSION >= (3, 11, 0, "alpha", 7):
22
- import tomllib # pylint: disable=import-error
21
+ import tomllib # pylint: disable=import-error
22
+
23
23
  has_tomllib = True
24
24
  else:
25
25
  # TOML support on Python 3.10 and below is an install-time extra option.
@@ -28,11 +28,13 @@ else:
28
28
 
29
29
  class TomlDecodeError(Exception):
30
30
  """An exception class that exists even when toml isn't installed."""
31
+
31
32
  pass
32
33
 
33
34
 
34
35
  TWant = TypeVar("TWant")
35
36
 
37
+
36
38
  class TomlConfigParser:
37
39
  """TOML file reading with the interface of HandyConfigParser."""
38
40
 
@@ -51,7 +53,7 @@ class TomlConfigParser:
51
53
  filename = os.fspath(filenames)
52
54
 
53
55
  try:
54
- with open(filename, encoding='utf-8') as fp:
56
+ with open(filename, encoding="utf-8") as fp:
55
57
  toml_text = fp.read()
56
58
  except OSError:
57
59
  return []
@@ -178,6 +180,10 @@ class TomlConfigParser:
178
180
  bool_strings = {"true": True, "false": False}
179
181
  return self._check_type(name, option, value, bool, bool_strings.__getitem__, "a boolean")
180
182
 
183
+ def getfile(self, section: str, option: str) -> str:
184
+ _, value = self._get_single(section, option)
185
+ return config.process_file_value(value)
186
+
181
187
  def _get_list(self, section: str, option: str) -> tuple[str, list[str]]:
182
188
  """Get a list of strings, substituting environment variables in the elements."""
183
189
  name, values = self._get(section, option)
@@ -191,13 +197,7 @@ class TomlConfigParser:
191
197
 
192
198
  def getregexlist(self, section: str, option: str) -> list[str]:
193
199
  name, values = self._get_list(section, option)
194
- for value in values:
195
- value = value.strip()
196
- try:
197
- re.compile(value)
198
- except re.error as e:
199
- raise ConfigError(f"Invalid [{name}].{option} value {value!r}: {e}") from e
200
- return values
200
+ return config.process_regexlist(name, option, values)
201
201
 
202
202
  def getint(self, section: str, option: str) -> int:
203
203
  name, value = self._get_single(section, option)
coverage/tracer.pyi CHANGED
@@ -1,5 +1,5 @@
1
1
  # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
- # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
2
+ # For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
3
3
 
4
4
  """Typing information for the constructs from our .c files."""
5
5
 
@@ -9,6 +9,7 @@ from coverage.types import TFileDisposition, TTraceData, TTraceFn, Tracer
9
9
 
10
10
  class CFileDisposition(TFileDisposition):
11
11
  """CFileDisposition is in ctracer/filedisp.c"""
12
+
12
13
  canonical_filename: Any
13
14
  file_tracer: Any
14
15
  has_dynamic_filename: Any
@@ -20,6 +21,7 @@ class CFileDisposition(TFileDisposition):
20
21
 
21
22
  class CTracer(Tracer):
22
23
  """CTracer is in ctracer/tracer.c"""
24
+
23
25
  check_include: Any
24
26
  concur_id_func: Any
25
27
  data: TTraceData
coverage/types.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
- # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
2
+ # For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
3
3
 
4
4
  """
5
5
  Types for use throughout coverage.py.
@@ -9,13 +9,9 @@ from __future__ import annotations
9
9
 
10
10
  import os
11
11
  import pathlib
12
-
13
12
  from collections.abc import Iterable, Mapping
14
13
  from types import FrameType, ModuleType
15
- from typing import (
16
- Any, Callable, Optional, Protocol,
17
- Union, TYPE_CHECKING,
18
- )
14
+ from typing import TYPE_CHECKING, Any, Callable, Optional, Protocol
19
15
 
20
16
  if TYPE_CHECKING:
21
17
  from coverage.plugin import FileTracer
@@ -26,35 +22,37 @@ AnyCallable = Callable[..., Any]
26
22
  ## File paths
27
23
 
28
24
  # For arguments that are file paths:
29
- if TYPE_CHECKING:
30
- FilePath = Union[str, os.PathLike[str]]
31
- else:
32
- # PathLike < python3.9 doesn't support subscription
33
- FilePath = Union[str, os.PathLike]
25
+ FilePath = str | os.PathLike[str]
34
26
  # For testing FilePath arguments
35
27
  FilePathClasses = [str, pathlib.Path]
36
- FilePathType = Union[type[str], type[pathlib.Path]]
28
+ FilePathType = type[str] | type[pathlib.Path]
37
29
 
38
30
  ## Python tracing
39
31
 
32
+
40
33
  class TTraceFn(Protocol):
41
34
  """A Python trace function."""
35
+
42
36
  def __call__(
43
37
  self,
44
38
  frame: FrameType,
45
39
  event: str,
46
40
  arg: Any,
47
41
  lineno: TLineNo | None = None, # Our own twist, see collector.py
48
- ) -> TTraceFn | None:
49
- ...
42
+ ) -> TTraceFn | None: ...
43
+
50
44
 
51
45
  ## Coverage.py tracing
52
46
 
53
47
  # Line numbers are pervasive enough that they deserve their own type.
54
48
  TLineNo = int
55
49
 
50
+ # Bytecode offsets are pervasive enough that they deserve their own type.
51
+ TOffset = int
52
+
56
53
  TArc = tuple[TLineNo, TLineNo]
57
54
 
55
+
58
56
  class TFileDisposition(Protocol):
59
57
  """A simple value type for recording what to do with a file."""
60
58
 
@@ -75,14 +73,15 @@ class TFileDisposition(Protocol):
75
73
  # - If measuring arcs in the C tracer, the values are sets of packed arcs (two
76
74
  # line numbers combined into one integer).
77
75
 
78
- TTraceFileData = Union[set[TLineNo], set[TArc], set[int]]
76
+ TTraceFileData = set[TLineNo] | set[TArc] | set[int]
79
77
 
80
78
  TTraceData = dict[str, TTraceFileData]
81
79
 
82
80
  # Functions passed into collectors.
83
81
  TShouldTraceFn = Callable[[str, FrameType], TFileDisposition]
84
82
  TCheckIncludeFn = Callable[[str, FrameType], bool]
85
- TShouldStartContextFn = Callable[[FrameType], Union[str, None]]
83
+ TShouldStartContextFn = Callable[[FrameType], str | None]
84
+
86
85
 
87
86
  class Tracer(Protocol):
88
87
  """Anything that can report on Python execution."""
@@ -97,8 +96,7 @@ class Tracer(Protocol):
97
96
  unlock_data: Callable[[], None]
98
97
  warn: TWarnFn
99
98
 
100
- def __init__(self) -> None:
101
- ...
99
+ def __init__(self) -> None: ...
102
100
 
103
101
  def start(self) -> TTraceFn | None:
104
102
  """Start this tracer, return a trace function if based on sys.settrace."""
@@ -125,12 +123,13 @@ TCovKwargs = Any
125
123
  ## Configuration
126
124
 
127
125
  # One value read from a config file.
128
- TConfigValueIn = Optional[Union[bool, int, float, str, Iterable[str]]]
129
- TConfigValueOut = Optional[Union[bool, int, float, str, list[str]]]
126
+ TConfigValueIn = Optional[bool | int | float | str | Iterable[str] | Mapping[str, Iterable[str]]]
127
+ TConfigValueOut = Optional[bool | int | float | str | list[str] | dict[str, list[str]]]
130
128
  # An entire config section, mapping option names to values.
131
129
  TConfigSectionIn = Mapping[str, TConfigValueIn]
132
130
  TConfigSectionOut = Mapping[str, TConfigValueOut]
133
131
 
132
+
134
133
  class TConfigurable(Protocol):
135
134
  """Something that can proxy to the coverage configuration settings."""
136
135
 
@@ -156,6 +155,7 @@ class TConfigurable(Protocol):
156
155
 
157
156
  """
158
157
 
158
+
159
159
  class TPluginConfig(Protocol):
160
160
  """Something that can provide options to a plugin."""
161
161
 
@@ -165,25 +165,28 @@ class TPluginConfig(Protocol):
165
165
 
166
166
  ## Parsing
167
167
 
168
- TMorf = Union[ModuleType, str]
168
+ TMorf = ModuleType | str
169
169
 
170
170
  TSourceTokenLines = Iterable[list[tuple[str, str]]]
171
171
 
172
172
 
173
173
  ## Plugins
174
174
 
175
+
175
176
  class TPlugin(Protocol):
176
177
  """What all plugins have in common."""
178
+
177
179
  _coverage_plugin_name: str
178
180
  _coverage_enabled: bool
179
181
 
180
182
 
181
183
  ## Debugging
182
184
 
185
+
183
186
  class TWarnFn(Protocol):
184
187
  """A callable warn() function."""
185
- def __call__(self, msg: str, slug: str | None = None, once: bool = False) -> None:
186
- ...
188
+
189
+ def __call__(self, msg: str, slug: str | None = None, once: bool = False) -> None: ...
187
190
 
188
191
 
189
192
  class TDebugCtl(Protocol):
coverage/version.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
- # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
2
+ # For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
3
3
 
4
4
  """The version and URL for coverage.py"""
5
5
  # This file is exec'ed in setup.py, don't import anything!
@@ -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, 6, 10, "final", 0)
11
+ version_info = (7, 12, 0, "final", 0)
12
12
  _dev = 0
13
13
 
14
14
 
@@ -22,7 +22,7 @@ def _make_version(
22
22
  ) -> str:
23
23
  """Create a readable version string from version_info tuple components."""
24
24
  assert releaselevel in ["alpha", "beta", "candidate", "final"]
25
- version = "%d.%d.%d" % (major, minor, micro)
25
+ version = f"{major}.{minor}.{micro}"
26
26
  if releaselevel != "final":
27
27
  short = {"alpha": "a", "beta": "b", "candidate": "rc"}[releaselevel]
28
28
  version += f"{short}{serial}"
@@ -31,20 +31,5 @@ def _make_version(
31
31
  return version
32
32
 
33
33
 
34
- def _make_url(
35
- major: int,
36
- minor: int,
37
- micro: int,
38
- releaselevel: str,
39
- serial: int = 0,
40
- dev: int = 0,
41
- ) -> str:
42
- """Make the URL people should start at for this version of coverage.py."""
43
- return (
44
- "https://coverage.readthedocs.io/en/"
45
- + _make_version(major, minor, micro, releaselevel, serial, dev)
46
- )
47
-
48
-
49
34
  __version__ = _make_version(*version_info, _dev)
50
- __url__ = _make_url(*version_info, _dev)
35
+ __url__ = f"https://coverage.readthedocs.io/en/{__version__}"
coverage/xmlreport.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
- # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
2
+ # For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
3
3
 
4
4
  """XML reporting for coverage.py"""
5
5
 
@@ -10,13 +10,12 @@ import os.path
10
10
  import sys
11
11
  import time
12
12
  import xml.dom.minidom
13
-
14
- from dataclasses import dataclass
15
- from typing import Any, IO, TYPE_CHECKING
16
13
  from collections.abc import Iterable
14
+ from dataclasses import dataclass
15
+ from typing import IO, TYPE_CHECKING, Any
17
16
 
18
17
  from coverage import __version__, files
19
- from coverage.misc import isolate_module, human_sorted, human_sorted_items
18
+ from coverage.misc import human_sorted, human_sorted_items, isolate_module
20
19
  from coverage.plugin import FileReporter
21
20
  from coverage.report_core import get_analysis_to_report
22
21
  from coverage.results import Analysis
@@ -37,12 +36,13 @@ def rate(hit: int, num: int) -> str:
37
36
  if num == 0:
38
37
  return "1"
39
38
  else:
40
- return "%.4g" % (hit / num)
39
+ return f"{hit / num:.4g}"
41
40
 
42
41
 
43
42
  @dataclass
44
43
  class PackageData:
45
44
  """Data we keep about each "package" (in Java terms)."""
45
+
46
46
  elements: dict[str, xml.dom.minidom.Element]
47
47
  hits: int
48
48
  lines: int
@@ -95,11 +95,14 @@ class XmlReporter:
95
95
 
96
96
  # Write header stuff.
97
97
  xcoverage = self.xml_out.documentElement
98
+ assert xcoverage is not None
98
99
  xcoverage.setAttribute("version", __version__)
99
- xcoverage.setAttribute("timestamp", str(int(time.time()*1000)))
100
- xcoverage.appendChild(self.xml_out.createComment(
101
- f" Generated by coverage.py: {__url__} ",
102
- ))
100
+ xcoverage.setAttribute("timestamp", str(int(time.time() * 1000)))
101
+ xcoverage.appendChild(
102
+ self.xml_out.createComment(
103
+ f" Generated by coverage.py: {__url__} ",
104
+ )
105
+ )
103
106
  xcoverage.appendChild(self.xml_out.createComment(f" Based on {DTD_URL} "))
104
107
 
105
108
  # Call xml_file for each file in the data.
@@ -182,14 +185,14 @@ class XmlReporter:
182
185
  if not self.config.relative_files:
183
186
  source_path = files.canonical_filename(source_path)
184
187
  if filename.startswith(source_path.replace("\\", "/") + "/"):
185
- rel_name = filename[len(source_path)+1:]
188
+ rel_name = filename[len(source_path) + 1 :]
186
189
  break
187
190
  else:
188
191
  rel_name = fr.relative_filename().replace("\\", "/")
189
- self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/"))
192
+ self.source_paths.add(fr.filename[: -len(rel_name)].rstrip(r"\/"))
190
193
 
191
194
  dirname = os.path.dirname(rel_name) or "."
192
- dirname = "/".join(dirname.split("/")[:self.config.xml_package_depth])
195
+ dirname = "/".join(dirname.split("/")[: self.config.xml_package_depth])
193
196
  package_name = dirname.replace("/", ".")
194
197
 
195
198
  package = self.packages.setdefault(package_name, PackageData({}, 0, 0, 0, 0))
@@ -223,7 +226,7 @@ class XmlReporter:
223
226
  xline.setAttribute("branch", "true")
224
227
  xline.setAttribute(
225
228
  "condition-coverage",
226
- "%d%% (%d/%d)" % (100*taken//total, taken, total),
229
+ f"{100 * taken // total}% ({taken}/{total})",
227
230
  )
228
231
  if line in missing_branch_arcs:
229
232
  annlines = ["exit" if b < 0 else str(b) for b in missing_branch_arcs[line]]
@@ -1,42 +1,55 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: coverage
3
- Version: 7.6.10
3
+ Version: 7.12.0
4
4
  Summary: Code coverage measurement for Python
5
- Home-page: https://github.com/nedbat/coveragepy
6
- Author: Ned Batchelder and 235 others
5
+ Home-page: https://github.com/coveragepy/coveragepy
6
+ Author: Ned Batchelder and 245 others
7
7
  Author-email: ned@nedbatchelder.com
8
8
  License: Apache-2.0
9
- Project-URL: Documentation, https://coverage.readthedocs.io/en/7.6.10
9
+ Project-URL: Documentation, https://coverage.readthedocs.io/en/7.12.0
10
10
  Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi
11
- Project-URL: Issues, https://github.com/nedbat/coveragepy/issues
11
+ Project-URL: Issues, https://github.com/coveragepy/coveragepy/issues
12
12
  Project-URL: Mastodon, https://hachyderm.io/@coveragepy
13
13
  Project-URL: Mastodon (nedbat), https://hachyderm.io/@nedbat
14
14
  Keywords: code coverage testing
15
15
  Classifier: Environment :: Console
16
16
  Classifier: Intended Audience :: Developers
17
- Classifier: License :: OSI Approved :: Apache Software License
18
17
  Classifier: Operating System :: OS Independent
19
18
  Classifier: Programming Language :: Python
20
19
  Classifier: Programming Language :: Python :: 3
21
- Classifier: Programming Language :: Python :: 3.9
22
20
  Classifier: Programming Language :: Python :: 3.10
23
21
  Classifier: Programming Language :: Python :: 3.11
24
22
  Classifier: Programming Language :: Python :: 3.12
25
23
  Classifier: Programming Language :: Python :: 3.13
26
24
  Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Programming Language :: Python :: 3.15
26
+ Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
27
27
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
28
  Classifier: Programming Language :: Python :: Implementation :: PyPy
29
29
  Classifier: Topic :: Software Development :: Quality Assurance
30
30
  Classifier: Topic :: Software Development :: Testing
31
31
  Classifier: Development Status :: 5 - Production/Stable
32
- Requires-Python: >=3.9
32
+ Requires-Python: >=3.10
33
33
  Description-Content-Type: text/x-rst
34
34
  License-File: LICENSE.txt
35
35
  Provides-Extra: toml
36
36
  Requires-Dist: tomli; python_full_version <= "3.11.0a6" and extra == "toml"
37
+ Dynamic: author
38
+ Dynamic: author-email
39
+ Dynamic: classifier
40
+ Dynamic: description
41
+ Dynamic: description-content-type
42
+ Dynamic: home-page
43
+ Dynamic: keywords
44
+ Dynamic: license
45
+ Dynamic: license-file
46
+ Dynamic: project-url
47
+ Dynamic: provides-extra
48
+ Dynamic: requires-python
49
+ Dynamic: summary
37
50
 
38
51
  .. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
39
- .. For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
52
+ .. For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
40
53
 
41
54
  ===========
42
55
  Coverage.py
@@ -53,6 +66,7 @@ Code coverage measurement for Python.
53
66
  | |kit| |license| |versions|
54
67
  | |test-status| |quality-status| |docs| |metacov|
55
68
  | |tidelift| |sponsor| |stars| |mastodon-coveragepy| |mastodon-nedbat|
69
+ |bluesky-nedbat|
56
70
 
57
71
  Coverage.py measures code coverage, typically during test execution. It uses
58
72
  the code analysis tools and tracing hooks provided in the Python standard
@@ -62,20 +76,25 @@ Coverage.py runs on these versions of Python:
62
76
 
63
77
  .. PYVERSIONS
64
78
 
65
- * Python 3.9 through 3.14 alpha 2, including free-threading.
66
- * PyPy3 versions 3.9 and 3.10.
79
+ * Python 3.10 through 3.15 alpha, including free-threading.
80
+ * PyPy3 versions 3.10 and 3.11.
67
81
 
68
82
  Documentation is on `Read the Docs`_. Code repository and issue tracker are on
69
83
  `GitHub`_.
70
84
 
71
- .. _Read the Docs: https://coverage.readthedocs.io/en/7.6.10/
72
- .. _GitHub: https://github.com/nedbat/coveragepy
85
+ .. _Read the Docs: https://coverage.readthedocs.io/en/7.12.0/
86
+ .. _GitHub: https://github.com/coveragepy/coveragepy
73
87
 
74
88
  **New in 7.x:**
89
+ ``[run] patch`` setting;
90
+ ``--save-signal`` option;
91
+ ``[run] core`` setting;
92
+ ``[run] source_dirs`` setting;
93
+ ``Coverage.branch_stats()``;
75
94
  multi-line exclusion patterns;
76
95
  function/class reporting;
77
96
  experimental support for sys.monitoring;
78
- dropped support for Python 3.7 and 3.8;
97
+ dropped support for Python up to 3.9;
79
98
  added ``Coverage.collect()`` context manager;
80
99
  improved data combining;
81
100
  ``[run] exclude_also`` setting;
@@ -113,7 +132,7 @@ Getting Started
113
132
  Looking to run ``coverage`` on your test suite? See the `Quick Start section`_
114
133
  of the docs.
115
134
 
116
- .. _Quick Start section: https://coverage.readthedocs.io/en/7.6.10/#quick-start
135
+ .. _Quick Start section: https://coverage.readthedocs.io/en/7.12.0/#quick-start
117
136
 
118
137
 
119
138
  Change history
@@ -121,7 +140,7 @@ Change history
121
140
 
122
141
  The complete history of changes is on the `change history page`_.
123
142
 
124
- .. _change history page: https://coverage.readthedocs.io/en/7.6.10/changes.html
143
+ .. _change history page: https://coverage.readthedocs.io/en/7.12.0/changes.html
125
144
 
126
145
 
127
146
  Code of Conduct
@@ -140,7 +159,7 @@ Contributing
140
159
  Found a bug? Want to help improve the code or documentation? See the
141
160
  `Contributing section`_ of the docs.
142
161
 
143
- .. _Contributing section: https://coverage.readthedocs.io/en/7.6.10/contributing.html
162
+ .. _Contributing section: https://coverage.readthedocs.io/en/7.12.0/contributing.html
144
163
 
145
164
 
146
165
  Security
@@ -158,17 +177,17 @@ License
158
177
  Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_.
159
178
 
160
179
  .. _Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
161
- .. _NOTICE.txt: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
180
+ .. _NOTICE.txt: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
162
181
 
163
182
 
164
- .. |test-status| image:: https://github.com/nedbat/coveragepy/actions/workflows/testsuite.yml/badge.svg?branch=master&event=push
165
- :target: https://github.com/nedbat/coveragepy/actions/workflows/testsuite.yml
183
+ .. |test-status| image:: https://github.com/coveragepy/coveragepy/actions/workflows/testsuite.yml/badge.svg?branch=main&event=push
184
+ :target: https://github.com/coveragepy/coveragepy/actions/workflows/testsuite.yml
166
185
  :alt: Test suite status
167
- .. |quality-status| image:: https://github.com/nedbat/coveragepy/actions/workflows/quality.yml/badge.svg?branch=master&event=push
168
- :target: https://github.com/nedbat/coveragepy/actions/workflows/quality.yml
186
+ .. |quality-status| image:: https://github.com/coveragepy/coveragepy/actions/workflows/quality.yml/badge.svg?branch=main&event=push
187
+ :target: https://github.com/coveragepy/coveragepy/actions/workflows/quality.yml
169
188
  :alt: Quality check status
170
189
  .. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat
171
- :target: https://coverage.readthedocs.io/en/7.6.10/
190
+ :target: https://coverage.readthedocs.io/en/7.12.0/
172
191
  :alt: Documentation
173
192
  .. |kit| image:: https://img.shields.io/pypi/v/coverage
174
193
  :target: https://pypi.org/project/coverage/
@@ -177,16 +196,16 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_.
177
196
  :target: https://pypi.org/project/coverage/
178
197
  :alt: Python versions supported
179
198
  .. |license| image:: https://img.shields.io/pypi/l/coverage.svg
180
- :target: https://pypi.org/project/coverage/
199
+ :target: https://github.com/coveragepy/coveragepy/blob/main/LICENSE.txt
181
200
  :alt: License
182
201
  .. |metacov| image:: https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/nedbat/8c6980f77988a327348f9b02bbaf67f5/raw/metacov.json
183
- :target: https://nedbat.github.io/coverage-reports/latest.html
202
+ :target: https://coveragepy.github.io/metacov-reports/latest.html
184
203
  :alt: Coverage reports
185
204
  .. |tidelift| image:: https://tidelift.com/badges/package/pypi/coverage
186
205
  :target: https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=readme
187
206
  :alt: Tidelift
188
- .. |stars| image:: https://img.shields.io/github/stars/nedbat/coveragepy.svg?logo=github
189
- :target: https://github.com/nedbat/coveragepy/stargazers
207
+ .. |stars| image:: https://img.shields.io/github/stars/coveragepy/coveragepy.svg?logo=github&style=flat
208
+ :target: https://github.com/coveragepy/coveragepy/stargazers
190
209
  :alt: GitHub stars
191
210
  .. |mastodon-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&label=@nedbat&query=followers_count&url=https%3A%2F%2Fhachyderm.io%2Fapi%2Fv1%2Faccounts%2Flookup%3Facct=nedbat
192
211
  :target: https://hachyderm.io/@nedbat
@@ -194,6 +213,9 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_.
194
213
  .. |mastodon-coveragepy| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&label=@coveragepy&query=followers_count&url=https%3A%2F%2Fhachyderm.io%2Fapi%2Fv1%2Faccounts%2Flookup%3Facct=coveragepy
195
214
  :target: https://hachyderm.io/@coveragepy
196
215
  :alt: coveragepy on Mastodon
216
+ .. |bluesky-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&color=96a3b0&labelColor=3686f7&logo=icloud&logoColor=white&label=@nedbat&url=https%3A%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor=nedbat.com&query=followersCount
217
+ :target: https://bsky.app/profile/nedbat.com
218
+ :alt: nedbat on Bluesky
197
219
  .. |sponsor| image:: https://img.shields.io/badge/%E2%9D%A4-Sponsor%20me-brightgreen?style=flat&logo=GitHub
198
220
  :target: https://github.com/sponsors/nedbat
199
221
  :alt: Sponsor me on GitHub
@@ -0,0 +1,59 @@
1
+ coverage/__init__.py,sha256=deRlSPNGXQa-6Mr9q3FpSXvS51dc-xpHxdLS58TDE3k,1065
2
+ coverage/__main__.py,sha256=rAq5mnzJvTfjnZxufsY-YoKZkHM81vdhkUsAmOU4wt8,297
3
+ coverage/annotate.py,sha256=vI_P4Qj9W7OqdJaMJyvSp57hvT6ljCsnEf5ZyfaKvkM,3751
4
+ coverage/bytecode.py,sha256=n_4YzE8Gas37i0mRgwvbTgu4v6yfekCh4qWZ7YVq0tk,6666
5
+ coverage/cmdline.py,sha256=t7l_LoWAUhUuEmMogiVEAOducHdrudqmwezrZxVhaYE,36819
6
+ coverage/collector.py,sha256=doMi0mv8Z-zDY3kf7NJifLjH3Kz7QuXr3o9aSrHzMTQ,18541
7
+ coverage/config.py,sha256=tXVjZ0EwLI9oxEcRCVJZRiDktCXoUpD1d7L0JNvBM5Y,25964
8
+ coverage/context.py,sha256=Ef1NlMuuD5g2Z3vJhK9fr6yg_NxOYTJmGTACRLU1uno,2434
9
+ coverage/control.py,sha256=ZH_GxR7uc9uJBOkj1IKv0xsJP-63g3JuEDe21QQHz88,54818
10
+ coverage/core.py,sha256=wQG--Xm1Hvyt_jYO7VgfP-CT2vE1o4zIbFI2CtfTsXw,5404
11
+ coverage/data.py,sha256=b-4KXkMlpocqS-T_HHa1LlPOxnz-I35OpcH4ztfvYP4,8127
12
+ coverage/debug.py,sha256=5f1JSbSVeQnulJTOu0E_kelo29cih5A9gS2o27OX3h8,21753
13
+ coverage/disposition.py,sha256=T6p5yH1b6dnnsXq7YI9nbP8UAqFk6V9PyFOivkV5Qr8,1897
14
+ coverage/env.py,sha256=_0HqQJiQIeY44ziVwiMohYIaox0btbc2fLoJMnSt1RI,4972
15
+ coverage/exceptions.py,sha256=VD6utQATQ5GRIAK0SPJyOlL2och54qRfVD9vlt9EElA,1640
16
+ coverage/execfile.py,sha256=IL3TzwhAxiMLs6QwUvF-HK-A2Scjgh8GjkpOKhcWFtY,11993
17
+ coverage/files.py,sha256=WrI3dw_zEMG1YNS6674vFP9TPoUXvXg0itxVSWeOoNc,19357
18
+ coverage/html.py,sha256=hQVh56hKJcF_v0Di02Gd-ov22_MCYF29f3A-0lHwZmg,31524
19
+ coverage/inorout.py,sha256=jFUz-I_g50G_8vGR935hWuwXdrNPep3nfnwVYmAVYEQ,24345
20
+ coverage/jsonreport.py,sha256=mpNhylwzkx3bitcEKOSrvYtP0uAzR4rz1Ofq-JHiwcs,7333
21
+ coverage/lcovreport.py,sha256=Q9-g1QS7dUO-9ckqxecRs1_18yfxQPcHw-Mu8y2XU1U,7874
22
+ coverage/misc.py,sha256=iPEV4g_HsXhQmpuzuN1CPy82uF2YLjKOleMnWgXJyDA,11291
23
+ coverage/multiproc.py,sha256=Y1AeYjch8pD4Zb5HjoW51IVz5yeLDY5-ipIOOk-Adyk,4175
24
+ coverage/numbits.py,sha256=4B171qTbHyZ0WDnYGjGo456_PC2jDZSe22F9KCrmZ4Q,4673
25
+ coverage/parser.py,sha256=Toq-DgeZBl_ZawrKpWPDkfAYbLxMLQPJwi4UlWMPDjY,46313
26
+ coverage/patch.py,sha256=oEcBoH6lcSAB9Y0jxuk3ZbFWqJI05R76fJtMHtsp8PY,5567
27
+ coverage/phystokens.py,sha256=Z7chMvCxuYMu2Wj9Oc1vlO8dV1OOqZXWfzALsWfEC7s,7450
28
+ coverage/plugin.py,sha256=4fF3Bq9JVZIIxPUI-DCUGUqeGNzvYldJnqMvP6JlsKY,21509
29
+ coverage/plugin_support.py,sha256=X0I5D3q7MX2IsZZUBBkJJ6lP3guF-zNo_2oTu1XyePs,10444
30
+ coverage/py.typed,sha256=_B1ZXy5hKJZ2Zo3jWSXjqy1SO3rnLdZsUULnKGTplfc,72
31
+ coverage/python.py,sha256=X6-ypbCYnJoihsSj1M5thX_kFRyHjN37ajOHQWo5F1E,8753
32
+ coverage/pytracer.py,sha256=RBs6GaQQHSEau-eSiuyjIyS64W5Jg61GRVRO2wo1rZA,15322
33
+ coverage/regions.py,sha256=hIf6Hly1Zsfl4hPA2FQgDtDT6Lcv0fLlFCXmc94WOlY,4500
34
+ coverage/report.py,sha256=QrMfQaXfghss5g301vp7BudGLaQXD_eaKrFLFFC4Ixg,10818
35
+ coverage/report_core.py,sha256=xyhYM93YVQUu05fDpPkG1raDtTQyQbzPUjIwrlUf-ns,4044
36
+ coverage/results.py,sha256=I1SBr07T-EtHdgmOBYj7ivydla7QskEVzqBPiHjrojQ,17242
37
+ coverage/sqldata.py,sha256=ba76NYiiMWNwfsFWxTrrgjSVKVvA9vw42x4cZv-c_dU,45528
38
+ coverage/sqlitedb.py,sha256=R6A4B4D0LQNqMUPZTE4W66hC7V5OenHN9hRWb_pXJSg,10024
39
+ coverage/sysmon.py,sha256=ZDJfR27XU6jSOH4LtrKU6bVqgQxtt2CZHnoz7gJBhnA,19729
40
+ coverage/templite.py,sha256=OXquHdxqm3SWGY4GnGb6SjCUNa40_yXmzzY3hnV6zNU,11307
41
+ coverage/tomlconfig.py,sha256=9KXQWUPpnqkmRYFhyJMS8ZOfJ4bG69EsskVXm_NT7j8,7558
42
+ coverage/tracer.cpython-312-aarch64-linux-musl.so,sha256=WLhWv_O1zOT3rzSYdqhghIMFN5KOK8WA1UpeMvLmC-M,148640
43
+ coverage/tracer.pyi,sha256=53ZiaWNz6q6qWiEZWFMHeLLkbg6-4oBAzNJ2i1-hA-g,1207
44
+ coverage/types.py,sha256=nOLSWf-CMhaa9h7SMTcueFsklX0vuLdXdmsqzp2Tuqg,5600
45
+ coverage/version.py,sha256=y8jqxYmM1nutdtr6SU9gzKhY_7sW5jywPrrQq_HS86Q,1094
46
+ coverage/xmlreport.py,sha256=ayeJ8DEqIX6f9pdRFJvULIGA4WJ8wDR9BEjoKLdK1PA,9871
47
+ coverage/htmlfiles/coverage_html.js,sha256=c3j5ad-4xXqf3u_aBPpiNhoHYn2mTYsKmercXP2XW3M,25450
48
+ coverage/htmlfiles/favicon_32.png,sha256=vIEA-odDwRvSQ-syWfSwEnWGUWEv2b-Tv4tzTRfwJWE,1732
49
+ coverage/htmlfiles/index.html,sha256=8_Resfvt6vgAJs82-dF5gtKCjkPp8by8PMff4eWmMkU,8702
50
+ coverage/htmlfiles/keybd_closed.png,sha256=fZv4rmY3DkNJtPQjrFJ5UBOE5DdNof3mdeCZWC7TOoo,9004
51
+ coverage/htmlfiles/pyfile.html,sha256=iBCg74uV_XEcCTP2F02daNZYlIuzzh0vhsZi35zkpGU,6508
52
+ coverage/htmlfiles/style.css,sha256=vkP6XozR7sM-MQotUpXV03kyobzBvl8rquzommeX58A,15941
53
+ coverage/htmlfiles/style.scss,sha256=fzKmMXr61ZvtnpvtgbDeA9kSnfNmbFFY7jYmmiP9SxI,21291
54
+ coverage-7.12.0.dist-info/METADATA,sha256=PGD12wCXYeynkpPbVge35bwwiNBgbO6zkLCeeAozPuE,9074
55
+ coverage-7.12.0.dist-info/WHEEL,sha256=OhR_OrUHeSS9Wv6z5202HxeJVPkI7JBt4nUD2fey9No,113
56
+ coverage-7.12.0.dist-info/entry_points.txt,sha256=s7x_4Bg6sI_AjEov0yLrWDOVR__vCWpFoIGw-MZk2qA,123
57
+ coverage-7.12.0.dist-info/top_level.txt,sha256=BjhyiIvusb5OJkqCXjRncTF3soKF-mDOby-hxkWwwv0,9
58
+ coverage-7.12.0.dist-info/RECORD,,
59
+ coverage-7.12.0.dist-info/licenses/LICENSE.txt,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-musllinux_1_2_aarch64
5
5