From 92fe560a9368a5ac32ad5a2a272913b1b0ebfdd5 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 24 Jan 2023 20:28:00 -0500 Subject: [PATCH 01/43] build: bump version --- CHANGES.rst | 6 ++++++ coverage/version.py | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index fa01b701e..ed8e93d5b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,6 +17,12 @@ development at the same time, such as 4.5.x and 5.0. .. Version 9.8.1 — 2027-07-27 .. -------------------------- +Unreleased +---------- + +Nothing yet. + + .. scriv-start-here .. _changes_7-1-0: diff --git a/coverage/version.py b/coverage/version.py index 6f6375b67..87cb563f9 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -8,8 +8,8 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (7, 1, 0, "final", 0) -_dev = 0 +version_info = (7, 1, 1, "alpha", 0) +_dev = 1 def _make_version( From 2d628d40d60f967f135a8c21a62a000716c45054 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 26 Jan 2023 19:07:54 -0500 Subject: [PATCH 02/43] style: remove needless trailing commas --- coverage/types.py | 2 +- tests/test_parser.py | 2 +- tests/test_phystokens.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coverage/types.py b/coverage/types.py index 3d21ac9d0..b8135d05b 100644 --- a/coverage/types.py +++ b/coverage/types.py @@ -161,7 +161,7 @@ class TPlugin(Protocol): class TWarnFn(Protocol): """A callable warn() function.""" - def __call__(self, msg: str, slug: Optional[str] = None, once: bool = False,) -> None: + def __call__(self, msg: str, slug: Optional[str] = None, once: bool = False) -> None: ... diff --git a/tests/test_parser.py b/tests/test_parser.py index 8009ce51f..f74420b5d 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -533,7 +533,7 @@ def test_ast_dump() -> None: num_lines = len(source.splitlines()) with warnings.catch_warnings(): # stress_phystoken.tok has deprecation warnings, suppress them. - warnings.filterwarnings("ignore", message=r".*invalid escape sequence",) + warnings.filterwarnings("ignore", message=r".*invalid escape sequence") ast_root = ast.parse(source) result: List[str] = [] ast_dump(ast_root, print=result.append) diff --git a/tests/test_phystokens.py b/tests/test_phystokens.py index 5807f00d3..2f1f73071 100644 --- a/tests/test_phystokens.py +++ b/tests/test_phystokens.py @@ -103,7 +103,7 @@ def test_stress(self, fname: str) -> None: # Check the tokenization of the stress-test files. # And check that those files haven't been incorrectly "fixed". with warnings.catch_warnings(): - warnings.filterwarnings("ignore", message=r".*invalid escape sequence",) + warnings.filterwarnings("ignore", message=r".*invalid escape sequence") stress = os.path.join(TESTS_DIR, fname) self.check_file_tokenization(stress) From 6a1c275b94818ccef91481ab01d0eb000906967a Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 27 Jan 2023 07:07:43 -0500 Subject: [PATCH 03/43] exp: an unsupport select_contexts.py #668 --- lab/select_contexts.py | 66 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 lab/select_contexts.py diff --git a/lab/select_contexts.py b/lab/select_contexts.py new file mode 100644 index 000000000..7f8e2cf8a --- /dev/null +++ b/lab/select_contexts.py @@ -0,0 +1,66 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt + +"""\ +Select certain contexts from a coverage.py data file. +""" + +import argparse +import re +import sys + +import coverage + + +def main(argv): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--include", type=str, help="Regex for contexts to keep") + parser.add_argument("--exclude", type=str, help="Regex for contexts to discard") + args = parser.parse_args(argv) + + print("** Note: this is a proof-of-concept. Support is not promised. **") + print("Feedback is appreciated: https://github.com/nedbat/coveragepy/issues/668") + + cov_in = coverage.Coverage() + cov_in.load() + data_in = cov_in.get_data() + print(f"Contexts in {data_in.data_filename()}:") + for ctx in sorted(data_in.measured_contexts()): + print(f" {ctx}") + + if args.include is None and args.exclude is None: + print("Nothing to do, no output written.") + return + + out_file = "output.data" + file_names = data_in.measured_files() + print(f"{len(file_names)} measured files") + print(f"Writing to {out_file}") + cov_out = coverage.Coverage(data_file=out_file) + data_out = cov_out.get_data() + + for ctx in sorted(data_in.measured_contexts()): + if args.include is not None: + if not re.search(args.include, ctx): + print(f"Skipping context {ctx}, not included") + continue + if args.exclude is not None: + if re.search(args.exclude, ctx): + print(f"Skipping context {ctx}, excluded") + continue + print(f"Keeping context {ctx}") + data_in.set_query_context(ctx) + data_out.set_context(ctx) + if data_in.has_arcs(): + data_out.add_arcs({f: data_in.arcs(f) for f in file_names}) + else: + data_out.add_lines({f: data_in.lines(f) for f in file_names}) + + for fname in file_names: + data_out.touch_file(fname, data_in.file_tracer(fname)) + + cov_out.save() + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From eb3536ddff194b126d52b94d72b81d77296fa869 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 28 Jan 2023 15:44:54 -0500 Subject: [PATCH 04/43] build(docs): correct [gh-actions] to [gh] --- .github/workflows/coverage.yml | 2 +- .github/workflows/python-nightly.yml | 2 +- .github/workflows/testsuite.yml | 2 +- tox.ini | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 0721ddc0c..6af6adedc 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -39,7 +39,7 @@ jobs: - macos-latest - windows-latest python-version: - # When changing this list, be sure to check the [gh-actions] list in + # When changing this list, be sure to check the [gh] list in # tox.ini so that tox will run properly. PYVERSIONS # Available versions: # https://github.com/actions/python-versions/blob/main/versions-manifest.json diff --git a/.github/workflows/python-nightly.yml b/.github/workflows/python-nightly.yml index 88b2b3897..967fd0c8c 100644 --- a/.github/workflows/python-nightly.yml +++ b/.github/workflows/python-nightly.yml @@ -42,7 +42,7 @@ jobs: strategy: matrix: python-version: - # When changing this list, be sure to check the [gh-actions] list in + # When changing this list, be sure to check the [gh] list in # tox.ini so that tox will run properly. PYVERSIONS # Available versions: # https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly/+packages diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index e07989630..e560325c8 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -39,7 +39,7 @@ jobs: - macos - windows python-version: - # When changing this list, be sure to check the [gh-actions] list in + # When changing this list, be sure to check the [gh] list in # tox.ini so that tox will run properly. PYVERSIONS # Available versions: # https://github.com/actions/python-versions/blob/main/versions-manifest.json diff --git a/tox.ini b/tox.ini index 3592ec134..9fc3b5f31 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt [tox] -# When changing this list, be sure to check the [gh-actions] list below. +# When changing this list, be sure to check the [gh] list below. # PYVERSIONS envlist = py{37,38,39,310,311,312}, pypy3, doc, lint skip_missing_interpreters = {env:COVERAGE_SKIP_MISSING_INTERPRETERS:True} From dba1bc3a73482a30a71c24788829cb220689848b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 30 Jan 2023 18:17:25 -0500 Subject: [PATCH 05/43] build: no need for check_eol, pylint does most of it --- igor.py | 72 --------------------------------------------------------- tox.ini | 1 - 2 files changed, 73 deletions(-) diff --git a/igor.py b/igor.py index 248b93f5c..ad0dbf8c5 100644 --- a/igor.py +++ b/igor.py @@ -10,7 +10,6 @@ import contextlib import datetime -import fnmatch import glob import inspect import os @@ -277,77 +276,6 @@ def do_zip_mods(): zf.write("coverage/__main__.py", "__main__.py") -def do_check_eol(): - """Check files for incorrect newlines and trailing white space.""" - - ignore_dirs = [ - '.svn', '.hg', '.git', - '.tox*', - '*.egg-info', - '_build', - '_spell', - 'tmp', - 'help', - ] - checked = set() - - def check_file(fname, crlf=True, trail_white=True): - """Check a single file for white space abuse.""" - fname = os.path.relpath(fname) - if fname in checked: - return - checked.add(fname) - - line = None - with open(fname, "rb") as f: - for n, line in enumerate(f, start=1): - if crlf: - if b"\r" in line: - print(f"{fname}@{n}: CR found") - return - if trail_white: - line = line[:-1] - if not crlf: - line = line.rstrip(b'\r') - if line.rstrip() != line: - print(f"{fname}@{n}: trailing white space found") - return - - if line is not None and not line.strip(): - print(f"{fname}: final blank line") - - def check_files(root, patterns, **kwargs): - """Check a number of files for white space abuse.""" - for where, dirs, files in os.walk(root): - for f in files: - fname = os.path.join(where, f) - for p in patterns: - if fnmatch.fnmatch(fname, p): - check_file(fname, **kwargs) - break - for ignore_dir in ignore_dirs: - ignored = [] - for dir_name in dirs: - if fnmatch.fnmatch(dir_name, ignore_dir): - ignored.append(dir_name) - for dir_name in ignored: - dirs.remove(dir_name) - - check_files("coverage", ["*.py"]) - check_files("coverage/ctracer", ["*.c", "*.h"]) - check_files("coverage/htmlfiles", ["*.html", "*.scss", "*.css", "*.js"]) - check_files("tests", ["*.py"]) - check_files("tests", ["*,cover"], trail_white=False) - check_files("tests/js", ["*.js", "*.html"]) - check_file("setup.py") - check_file("igor.py") - check_file("Makefile") - check_files(".", ["*.rst", "*.txt"]) - check_files(".", ["*.pip"]) - check_files(".github", ["*"]) - check_files("ci", ["*"]) - - def print_banner(label): """Print the version of Python.""" try: diff --git a/tox.ini b/tox.ini index 9fc3b5f31..a323d136a 100644 --- a/tox.ini +++ b/tox.ini @@ -77,7 +77,6 @@ setenv = commands = python -m tabnanny {env:LINTABLE} - python igor.py check_eol # If this command fails, see the comment at the top of doc/cmd.rst python -m cogapp -cP --check --verbosity=1 doc/*.rst python -m cogapp -cP --check --verbosity=1 .github/workflows/*.yml From f44415b9dde9ff7b3621714d6986cbca3bf9e60e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 30 Jan 2023 18:21:06 -0500 Subject: [PATCH 06/43] build: some files need to be excused from usual formatting rules --- .editorconfig | 6 ++++++ tests/stress_phystoken.tok | 2 +- tests/stress_phystoken_dos.tok | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index ae430ffd6..679ae499c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -33,6 +33,12 @@ indent_size = 2 [*.rst] max_line_length = 79 +[*.tok] +trim_trailing_whitespace = false + +[*_dos.tok] +end_of_line = crlf + [Makefile] indent_style = tab indent_size = 8 diff --git a/tests/stress_phystoken.tok b/tests/stress_phystoken.tok index 65ba45dbd..934c633df 100644 --- a/tests/stress_phystoken.tok +++ b/tests/stress_phystoken.tok @@ -3,7 +3,7 @@ # Here's some random Python so that test_tokenize_myself will have some # stressful stuff to try. This file is .tok instead of .py so pylint won't -# complain about it, check_eol won't look at it, etc. +# complain about it, editors won't mess with it, etc. # Some lines are here to reproduce fixed bugs in ast_dump also. first_back = """\ diff --git a/tests/stress_phystoken_dos.tok b/tests/stress_phystoken_dos.tok index eb937d95c..2f5c795ad 100644 --- a/tests/stress_phystoken_dos.tok +++ b/tests/stress_phystoken_dos.tok @@ -3,7 +3,7 @@ # Here's some random Python so that test_tokenize_myself will have some # stressful stuff to try. This file is .tok instead of .py so pylint won't -# complain about it, check_eol won't look at it, etc. +# complain about it, editors won't mess with it, etc. first_back = """\ hey there! From a0445abdfb1be47129fff448b7f1a21d40336053 Mon Sep 17 00:00:00 2001 From: KotlinIsland Date: Thu, 2 Feb 2023 13:37:51 +1000 Subject: [PATCH 07/43] add py.typed --- coverage/py.typed | 0 setup.py | 1 + 2 files changed, 1 insertion(+) create mode 100644 coverage/py.typed diff --git a/coverage/py.typed b/coverage/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/setup.py b/setup.py index abd7b2780..bccb88196 100644 --- a/setup.py +++ b/setup.py @@ -89,6 +89,7 @@ 'coverage': [ 'htmlfiles/*.*', 'fullcoverage/*.*', + 'py.typed', ] }, From b0566a785d4d62db379f4e9707b7cd8c648f9df6 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 2 Feb 2023 17:09:01 -0500 Subject: [PATCH 08/43] docs: paperwork for py.typed --- CHANGES.rst | 5 ++++- coverage/py.typed | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ed8e93d5b..627b10dcb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,7 +20,10 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- -Nothing yet. +- Added a ``py.typed`` file to announce our type-hintedness. Thanks, + `KotlinIsland `_. + +.. _pull 1550: https://github.com/nedbat/coveragepy/pull/1550 .. scriv-start-here diff --git a/coverage/py.typed b/coverage/py.typed index e69de29bb..bacd23a18 100644 --- a/coverage/py.typed +++ b/coverage/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561 to indicate that this package has type hints. From 96af3eae92a7b5dc1053be194820adf47c17777a Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 3 Feb 2023 20:42:18 +0800 Subject: [PATCH 09/43] fix: add safety for empty stack on shutdown. (#1543) * Add safety for empty stack on shutdown. * Correct line length linting issue. --------- Co-authored-by: Ned Batchelder --- coverage/pytracer.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/coverage/pytracer.py b/coverage/pytracer.py index 326c50ba8..6723c2a1b 100644 --- a/coverage/pytracer.py +++ b/coverage/pytracer.py @@ -137,9 +137,17 @@ def _trace( self.log(">", f.f_code.co_filename, f.f_lineno, f.f_code.co_name, f.f_trace) f = f.f_back sys.settrace(None) - self.cur_file_data, self.cur_file_name, self.last_line, self.started_context = ( - self.data_stack.pop() - ) + try: + self.cur_file_data, self.cur_file_name, self.last_line, self.started_context = ( + self.data_stack.pop() + ) + except IndexError: + self.log( + "Empty stack!", + frame.f_code.co_filename, + frame.f_lineno, + frame.f_code.co_name + ) return None # if event != 'call' and frame.f_code.co_filename != self.cur_file_name: From 131060464647cd4c96fe8b79936d463847e9c0df Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 26 Jan 2023 07:24:39 -0500 Subject: [PATCH 10/43] docs: paperwork for #1543 This is about the fix in commit 96af3eae92a7b5dc1053be194820adf47c17777a --- CHANGES.rst | 6 ++++++ CONTRIBUTORS.txt | 1 + 2 files changed, 7 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 627b10dcb..0023f31bf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,9 +20,15 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- +- Fix: In some embedded environments, an IndexError could occur on stop() when + the originating thread exits before completion. This is now fixed, thanks to + `Russell Keith-Magee `_, closing `issue 1542`_. + - Added a ``py.typed`` file to announce our type-hintedness. Thanks, `KotlinIsland `_. +.. _issue 1542: https://github.com/nedbat/coveragepy/issues/1542 +.. _pull 1543: https://github.com/nedbat/coveragepy/pull/1543 .. _pull 1550: https://github.com/nedbat/coveragepy/pull/1550 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 012963d16..e06acd076 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -139,6 +139,7 @@ Rodrigue Cloutier Roger Hu Ross Lawley Roy Williams +Russell Keith-Magee Salvatore Zagaria Sandra Martocchia Scott Belden From 441823f18f705b8a79829cca36142a7f1511477b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 4 Feb 2023 12:00:32 -0500 Subject: [PATCH 11/43] fix: two typing tweaks --- coverage/sqldata.py | 2 +- doc/excluding.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 1cb8abe47..77577437e 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -596,7 +596,7 @@ def touch_file(self, filename: str, plugin_name: str = "") -> None: """ self.touch_files([filename], plugin_name) - def touch_files(self, filenames: Iterable[str], plugin_name: Optional[str] = None) -> None: + def touch_files(self, filenames: Collection[str], plugin_name: Optional[str] = None) -> None: """Ensure that `filenames` appear in the data, empty if needed. `plugin_name` is the name of the plugin responsible for these files. diff --git a/doc/excluding.rst b/doc/excluding.rst index aa6c6298a..315d4e290 100644 --- a/doc/excluding.rst +++ b/doc/excluding.rst @@ -95,6 +95,7 @@ For example, here's a list of exclusions I've used:: raise NotImplementedError if 0: if __name__ == .__main__.: + if TYPE_CHECKING: class .*\bProtocol\): @(abc\.)?abstractmethod From a4cd6a01f766359fbe8ff159e0ed87e03e8023ed Mon Sep 17 00:00:00 2001 From: Wingware Development <59840981+wingware-dev@users.noreply.github.com> Date: Sat, 4 Feb 2023 18:20:20 -0500 Subject: [PATCH 12/43] feat: add purge_files method to CoverageData + unit tests for it (#1547) * Add purge_files method to CoverageData, to allow for selective removal and update of coverage data. * Fix assert syntax so it's not true; this code isn't reached in the test unless it fails and then it would have failed to fail. * Remove trailing whitespace; did not expect this would matter on a blank line. * Add type annotations required by mypy --------- Co-authored-by: Stephan Deibel --- coverage/sqldata.py | 36 +++++++++++++++ tests/test_api.py | 106 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 77577437e..12676d0bb 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -615,6 +615,42 @@ def touch_files(self, filenames: Collection[str], plugin_name: Optional[str] = N # Set the tracer for this file self.add_file_tracers({filename: plugin_name}) + def purge_files(self, filenames: Iterable[str], context: Optional[str] = None) -> None: + """Purge any existing coverage data for the given `filenames`. + + If `context` is given, purge only data associated with that measurement context. + """ + + if self._debug.should("dataop"): + self._debug.write(f"Purging {filenames!r} for context {context}") + self._start_using() + with self._connect() as con: + + if context is not None: + context_id = self._context_id(context) + if context_id is None: + raise DataError("Unknown context {context}") + else: + context_id = None + + if self._has_lines: + table = 'line_bits' + elif self._has_arcs: + table = 'arcs' + else: + return + + for filename in filenames: + file_id = self._file_id(filename, add=False) + if file_id is None: + continue + self._file_map.pop(filename, None) + if context_id is None: + q = f'delete from {table} where file_id={file_id}' + else: + q = f'delete from {table} where file_id={file_id} and context_id={context_id}' + con.execute(q) + def update(self, other_data: CoverageData, aliases: Optional[PathAliases] = None) -> None: """Update this data with data from several other :class:`CoverageData` instances. diff --git a/tests/test_api.py b/tests/test_api.py index 1c5654216..885831550 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -754,6 +754,112 @@ def test_run_debug_sys(self) -> None: cov.stop() # pragma: nested assert cast(str, d['data_file']).endswith(".coverage") + def test_purge_filenames(self) -> None: + + fn1 = self.make_file("mymain.py", """\ + import mymod + a = 1 + """) + fn1 = os.path.join(self.temp_dir, fn1) + + fn2 = self.make_file("mymod.py", """\ + fooey = 17 + """) + fn2 = os.path.join(self.temp_dir, fn2) + + cov = coverage.Coverage() + self.start_import_stop(cov, "mymain") + + data = cov.get_data() + + # Initial measurement was for two files + assert len(data.measured_files()) == 2 + assert [1, 2] == sorted_lines(data, fn1) + assert [1,] == sorted_lines(data, fn2) + + # Purge one file's data and one should remain + data.purge_files([fn1]) + assert len(data.measured_files()) == 1 + assert [] == sorted_lines(data, fn1) + assert [1,] == sorted_lines(data, fn2) + + # Purge second file's data and none should remain + data.purge_files([fn2]) + assert len(data.measured_files()) == 0 + assert [] == sorted_lines(data, fn1) + assert [] == sorted_lines(data, fn2) + + def test_purge_filenames_context(self) -> None: + + fn1 = self.make_file("mymain.py", """\ + import mymod + a = 1 + """) + fn1 = os.path.join(self.temp_dir, fn1) + + fn2 = self.make_file("mymod.py", """\ + fooey = 17 + """) + fn2 = os.path.join(self.temp_dir, fn2) + + def dummy_function() -> None: + unused = 42 + + # Start/stop since otherwise cantext + cov = coverage.Coverage() + cov.start() + cov.switch_context('initialcontext') + dummy_function() + cov.switch_context('testcontext') + cov.stop() + self.start_import_stop(cov, "mymain") + + data = cov.get_data() + + # Initial measurement was for three files and two contexts + assert len(data.measured_files()) == 3 + assert [1, 2] == sorted_lines(data, fn1) + assert [1,] == sorted_lines(data, fn2) + assert len(sorted_lines(data, __file__)) == 1 + assert len(data.measured_contexts()) == 2 + + # Remove specifying wrong context should raise exception and not remove anything + try: + data.purge_files([fn1], 'wrongcontext') + except coverage.sqldata.DataError: + pass + else: + assert 0, "exception expected" + assert len(data.measured_files()) == 3 + assert [1, 2] == sorted_lines(data, fn1) + assert [1,] == sorted_lines(data, fn2) + assert len(sorted_lines(data, __file__)) == 1 + assert len(data.measured_contexts()) == 2 + + # Remove one file specifying correct context + data.purge_files([fn1], 'testcontext') + assert len(data.measured_files()) == 2 + assert [] == sorted_lines(data, fn1) + assert [1,] == sorted_lines(data, fn2) + assert len(sorted_lines(data, __file__)) == 1 + assert len(data.measured_contexts()) == 2 + + # Remove second file with other correct context + data.purge_files([__file__], 'initialcontext') + assert len(data.measured_files()) == 1 + assert [] == sorted_lines(data, fn1) + assert [1,] == sorted_lines(data, fn2) + assert len(sorted_lines(data, __file__)) == 0 + assert len(data.measured_contexts()) == 2 + + # Remove last file specifying correct context + data.purge_files([fn2], 'testcontext') + assert len(data.measured_files()) == 0 + assert [] == sorted_lines(data, fn1) + assert [] == sorted_lines(data, fn2) + assert len(sorted_lines(data, __file__)) == 0 + assert len(data.measured_contexts()) == 2 + class CurrentInstanceTest(CoverageTest): """Tests of Coverage.current().""" From c07fee3b9273748f00d238233f7b56a1553a2af3 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 8 Feb 2023 07:10:23 -0700 Subject: [PATCH 13/43] build: an env var to allow no-network tox runs (for airplanes) --- tox.ini | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tox.ini b/tox.ini index a323d136a..70b56a3f3 100644 --- a/tox.ini +++ b/tox.ini @@ -30,13 +30,15 @@ setenv = # so override any local setting. PYTHONPYCACHEPREFIX= +# $set_env.py: COVERAGE_PIP_ARGS - Extra arguments for `pip install` +# `--no-build-isolation` will let tox work with no network. commands = # Create tests/zipmods.zip python igor.py zip_mods # Build the C extension and test with the CTracer python setup.py --quiet build_ext --inplace - python -m pip install -q -e . + python -m pip install {env:COVERAGE_PIP_ARGS} -q -e . python igor.py test_with_tracer c {posargs} # Remove the C extension so that we can test the PyTracer @@ -84,7 +86,7 @@ commands = python -m pylint --notes= {env:LINTABLE} check-manifest --ignore 'doc/sample_html/*,.treerc' # If 'build -q' becomes a thing (https://github.com/pypa/build/issues/188), - # this can be simplifed: + # this can be simplified: python igor.py quietly "python -m build" twine check dist/* From cb7d67962ca8ed9eb176e144b9cfe96373803bf4 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 8 Feb 2023 07:11:05 -0700 Subject: [PATCH 14/43] build: next version will be 7.2.0 --- coverage/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coverage/version.py b/coverage/version.py index 87cb563f9..effb063df 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -8,7 +8,7 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (7, 1, 1, "alpha", 0) +version_info = (7, 2, 0, "alpha", 0) _dev = 1 From 423fa596325acb8f6bcb37a3502cf7853e5d395a Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 8 Feb 2023 07:11:45 -0700 Subject: [PATCH 15/43] feat: simplify purges_files Also, move tests to test_data.py, and finish covering the code. --- CHANGES.rst | 4 ++ CONTRIBUTORS.txt | 1 + coverage/sqldata.py | 43 ++++++++---------- tests/test_api.py | 106 -------------------------------------------- tests/test_data.py | 29 ++++++++++++ 5 files changed, 53 insertions(+), 130 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 0023f31bf..b4883728b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,6 +20,9 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- +- Added a :meth:`.CoverageData.purge_files` method to remove recorded data for + a particular file. Contributed by `Stephan Deibel `_. + - Fix: In some embedded environments, an IndexError could occur on stop() when the originating thread exits before completion. This is now fixed, thanks to `Russell Keith-Magee `_, closing `issue 1542`_. @@ -29,6 +32,7 @@ Unreleased .. _issue 1542: https://github.com/nedbat/coveragepy/issues/1542 .. _pull 1543: https://github.com/nedbat/coveragepy/pull/1543 +.. _pull 1547: https://github.com/nedbat/coveragepy/pull/1547 .. _pull 1550: https://github.com/nedbat/coveragepy/pull/1550 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index e06acd076..8889ed612 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -149,6 +149,7 @@ Sigve Tjora Simon Willison Stan Hu Stefan Behnel +Stephan Deibel Stephan Richter Stephen Finucane Steve Dower diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 12676d0bb..9aa2b1293 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -197,9 +197,11 @@ class CoverageData(AutoReprMixin): Write the data to its file with :meth:`write`. - You can clear the data in memory with :meth:`erase`. Two data collections - can be combined by using :meth:`update` on one :class:`CoverageData`, - passing it the other. + You can clear the data in memory with :meth:`erase`. Data for specific + files can be removed from the database with :meth:`purge_files`. + + Two data collections can be combined by using :meth:`update` on one + :class:`CoverageData`, passing it the other. Data in a :class:`CoverageData` can be serialized and deserialized with :meth:`dumps` and :meth:`loads`. @@ -615,41 +617,29 @@ def touch_files(self, filenames: Collection[str], plugin_name: Optional[str] = N # Set the tracer for this file self.add_file_tracers({filename: plugin_name}) - def purge_files(self, filenames: Iterable[str], context: Optional[str] = None) -> None: + def purge_files(self, filenames: Collection[str]) -> None: """Purge any existing coverage data for the given `filenames`. - If `context` is given, purge only data associated with that measurement context. - """ + .. versionadded:: 7.2 + """ if self._debug.should("dataop"): - self._debug.write(f"Purging {filenames!r} for context {context}") + self._debug.write(f"Purging data for {filenames!r}") self._start_using() with self._connect() as con: - if context is not None: - context_id = self._context_id(context) - if context_id is None: - raise DataError("Unknown context {context}") - else: - context_id = None - if self._has_lines: - table = 'line_bits' + sql = "delete from line_bits where file_id=?" elif self._has_arcs: - table = 'arcs' + sql = "delete from arc where file_id=?" else: - return + raise DataError("Can't purge files in an empty CoverageData") for filename in filenames: file_id = self._file_id(filename, add=False) if file_id is None: continue - self._file_map.pop(filename, None) - if context_id is None: - q = f'delete from {table} where file_id={file_id}' - else: - q = f'delete from {table} where file_id={file_id} and context_id={context_id}' - con.execute(q) + con.execute_void(sql, (file_id,)) def update(self, other_data: CoverageData, aliases: Optional[PathAliases] = None) -> None: """Update this data with data from several other :class:`CoverageData` instances. @@ -868,7 +858,12 @@ def has_arcs(self) -> bool: return bool(self._has_arcs) def measured_files(self) -> Set[str]: - """A set of all files that had been measured.""" + """A set of all files that have been measured. + + Note that a file may be mentioned as measured even though no lines or + arcs for that file are present in the data. + + """ return set(self._file_map) def measured_contexts(self) -> Set[str]: diff --git a/tests/test_api.py b/tests/test_api.py index 885831550..1c5654216 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -754,112 +754,6 @@ def test_run_debug_sys(self) -> None: cov.stop() # pragma: nested assert cast(str, d['data_file']).endswith(".coverage") - def test_purge_filenames(self) -> None: - - fn1 = self.make_file("mymain.py", """\ - import mymod - a = 1 - """) - fn1 = os.path.join(self.temp_dir, fn1) - - fn2 = self.make_file("mymod.py", """\ - fooey = 17 - """) - fn2 = os.path.join(self.temp_dir, fn2) - - cov = coverage.Coverage() - self.start_import_stop(cov, "mymain") - - data = cov.get_data() - - # Initial measurement was for two files - assert len(data.measured_files()) == 2 - assert [1, 2] == sorted_lines(data, fn1) - assert [1,] == sorted_lines(data, fn2) - - # Purge one file's data and one should remain - data.purge_files([fn1]) - assert len(data.measured_files()) == 1 - assert [] == sorted_lines(data, fn1) - assert [1,] == sorted_lines(data, fn2) - - # Purge second file's data and none should remain - data.purge_files([fn2]) - assert len(data.measured_files()) == 0 - assert [] == sorted_lines(data, fn1) - assert [] == sorted_lines(data, fn2) - - def test_purge_filenames_context(self) -> None: - - fn1 = self.make_file("mymain.py", """\ - import mymod - a = 1 - """) - fn1 = os.path.join(self.temp_dir, fn1) - - fn2 = self.make_file("mymod.py", """\ - fooey = 17 - """) - fn2 = os.path.join(self.temp_dir, fn2) - - def dummy_function() -> None: - unused = 42 - - # Start/stop since otherwise cantext - cov = coverage.Coverage() - cov.start() - cov.switch_context('initialcontext') - dummy_function() - cov.switch_context('testcontext') - cov.stop() - self.start_import_stop(cov, "mymain") - - data = cov.get_data() - - # Initial measurement was for three files and two contexts - assert len(data.measured_files()) == 3 - assert [1, 2] == sorted_lines(data, fn1) - assert [1,] == sorted_lines(data, fn2) - assert len(sorted_lines(data, __file__)) == 1 - assert len(data.measured_contexts()) == 2 - - # Remove specifying wrong context should raise exception and not remove anything - try: - data.purge_files([fn1], 'wrongcontext') - except coverage.sqldata.DataError: - pass - else: - assert 0, "exception expected" - assert len(data.measured_files()) == 3 - assert [1, 2] == sorted_lines(data, fn1) - assert [1,] == sorted_lines(data, fn2) - assert len(sorted_lines(data, __file__)) == 1 - assert len(data.measured_contexts()) == 2 - - # Remove one file specifying correct context - data.purge_files([fn1], 'testcontext') - assert len(data.measured_files()) == 2 - assert [] == sorted_lines(data, fn1) - assert [1,] == sorted_lines(data, fn2) - assert len(sorted_lines(data, __file__)) == 1 - assert len(data.measured_contexts()) == 2 - - # Remove second file with other correct context - data.purge_files([__file__], 'initialcontext') - assert len(data.measured_files()) == 1 - assert [] == sorted_lines(data, fn1) - assert [1,] == sorted_lines(data, fn2) - assert len(sorted_lines(data, __file__)) == 0 - assert len(data.measured_contexts()) == 2 - - # Remove last file specifying correct context - data.purge_files([fn2], 'testcontext') - assert len(data.measured_files()) == 0 - assert [] == sorted_lines(data, fn1) - assert [] == sorted_lines(data, fn2) - assert len(sorted_lines(data, __file__)) == 0 - assert len(data.measured_contexts()) == 2 - class CurrentInstanceTest(CoverageTest): """Tests of Coverage.current().""" diff --git a/tests/test_data.py b/tests/test_data.py index 5953ba36e..1cc645720 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -588,6 +588,35 @@ def thread_main() -> None: assert_lines1_data(covdata) assert not exceptions + def test_purge_files_lines(self) -> None: + covdata = DebugCoverageData() + covdata.add_lines(LINES_1) + covdata.add_lines(LINES_2) + assert_line_counts(covdata, SUMMARY_1_2) + covdata.purge_files(["a.py", "b.py"]) + assert_line_counts(covdata, {"a.py": 0, "b.py": 0, "c.py": 1}) + covdata.purge_files(["c.py"]) + assert_line_counts(covdata, {"a.py": 0, "b.py": 0, "c.py": 0}) + # It's OK to "purge" a file that wasn't measured. + covdata.purge_files(["xyz.py"]) + assert_line_counts(covdata, {"a.py": 0, "b.py": 0, "c.py": 0}) + + def test_purge_files_arcs(self) -> None: + covdata = CoverageData() + covdata.add_arcs(ARCS_3) + covdata.add_arcs(ARCS_4) + assert_line_counts(covdata, SUMMARY_3_4) + covdata.purge_files(["x.py", "y.py"]) + assert_line_counts(covdata, {"x.py": 0, "y.py": 0, "z.py": 1}) + covdata.purge_files(["z.py"]) + assert_line_counts(covdata, {"x.py": 0, "y.py": 0, "z.py": 0}) + + def test_cant_purge_in_empty_data(self) -> None: + covdata = DebugCoverageData() + msg = "Can't purge files in an empty CoverageData" + with pytest.raises(DataError, match=msg): + covdata.purge_files(["abc.py"]) + class CoverageDataInTempDirTest(CoverageTest): """Tests of CoverageData that need a temporary directory to make files.""" From 8f3e7b45b3aabf4d7d01dc470010d3d36f30a0ba Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 8 Feb 2023 21:50:20 -0700 Subject: [PATCH 16/43] fix: only write "Wrote report" message if report succeeded. For example, see [issue 1554](https://github.com/nedbat/coveragepy/issues/1554) for the previous misleading behavior when the exception being raised wasn't a CoverageException. --- CHANGES.rst | 4 ++++ coverage/report.py | 23 +++++++++++------------ tests/test_report.py | 13 +++++++------ 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b4883728b..f336cff58 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -23,6 +23,10 @@ Unreleased - Added a :meth:`.CoverageData.purge_files` method to remove recorded data for a particular file. Contributed by `Stephan Deibel `_. +- Fix: when reporting commands fail, they will no longer congratulate + themselves with messages like "Wrote XML report to file.xml" before spewing a + traceback about their failure. + - Fix: In some embedded environments, an IndexError could occur on stop() when the originating thread exits before completion. This is now fixed, thanks to `Russell Keith-Magee `_, closing `issue 1542`_. diff --git a/coverage/report.py b/coverage/report.py index 74ae18175..09eed0a82 100644 --- a/coverage/report.py +++ b/coverage/report.py @@ -9,7 +9,7 @@ from typing import Callable, Iterable, Iterator, IO, Optional, Tuple, TYPE_CHECKING -from coverage.exceptions import CoverageException, NoDataError, NotPython +from coverage.exceptions import NoDataError, NotPython from coverage.files import prep_patterns, GlobMatcher from coverage.misc import ensure_dir_for_file, file_be_gone from coverage.plugin import FileReporter @@ -47,26 +47,25 @@ def render_report( if output_path == "-": outfile = sys.stdout else: - # Ensure that the output directory is created; done here - # because this report pre-opens the output file. - # HTMLReport does this using the Report plumbing because - # its task is more complex, being multiple files. + # Ensure that the output directory is created; done here because this + # report pre-opens the output file. HtmlReporter does this on its own + # because its task is more complex, being multiple files. ensure_dir_for_file(output_path) outfile = open(output_path, "w", encoding="utf-8") file_to_close = outfile + delete_file = True try: - return reporter.report(morfs, outfile=outfile) - except CoverageException: - delete_file = True - raise + ret = reporter.report(morfs, outfile=outfile) + if file_to_close is not None: + msgfn(f"Wrote {reporter.report_type} to {output_path}") + delete_file = False + return ret finally: - if file_to_close: + if file_to_close is not None: file_to_close.close() if delete_file: file_be_gone(output_path) # pragma: part covered (doesn't return) - else: - msgfn(f"Wrote {reporter.report_type} to {output_path}") def get_analysis_to_report( diff --git a/tests/test_report.py b/tests/test_report.py index 3d87b5148..c85c6b473 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -5,7 +5,7 @@ from __future__ import annotations -from typing import IO, Iterable, List, Optional +from typing import IO, Iterable, List, Optional, Type import pytest @@ -21,7 +21,7 @@ class FakeReporter: report_type = "fake report file" - def __init__(self, output: str = "", error: bool = False) -> None: + def __init__(self, output: str = "", error: Optional[Type[Exception]] = None) -> None: self.output = output self.error = error self.morfs: Optional[Iterable[TMorf]] = None @@ -31,7 +31,7 @@ def report(self, morfs: Optional[Iterable[TMorf]], outfile: IO[str]) -> float: self.morfs = morfs outfile.write(self.output) if self.error: - raise CoverageException("You asked for it!") + raise self.error("You asked for it!") return 17.25 @@ -57,10 +57,11 @@ def test_file(self) -> None: assert f.read().rstrip() == b"Gr\xc3\xa9\xc3\xa8tings!" assert msgs == ["Wrote fake report file to output.txt"] - def test_exception(self) -> None: - fake = FakeReporter(error=True) + @pytest.mark.parametrize("error", [CoverageException, ZeroDivisionError]) + def test_exception(self, error: Type[Exception]) -> None: + fake = FakeReporter(error=error) msgs: List[str] = [] - with pytest.raises(CoverageException, match="You asked for it!"): + with pytest.raises(error, match="You asked for it!"): render_report("output.txt", fake, [], msgs.append) assert self.stdout() == "" self.assert_doesnt_exist("output.txt") From 712bd2ba1bbf9e9eb51393539378c80f8272fe3b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 9 Feb 2023 07:51:06 -0700 Subject: [PATCH 17/43] chore: make upgrade --- doc/requirements.pip | 32 +++-- requirements/dev.pip | 225 ++++++++++++++--------------- requirements/kit.pip | 24 ++-- requirements/light-threads.pip | 128 ++++++++--------- requirements/lint.pip | 251 +++++++++++++++++---------------- requirements/mypy.pip | 82 +++++------ requirements/pip-tools.pip | 24 ++-- requirements/pip.pip | 24 ++-- requirements/pytest.pip | 18 +-- requirements/tox.pip | 36 ++--- 10 files changed, 432 insertions(+), 412 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index c084ea8ca..fe681f159 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -128,9 +128,9 @@ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via sphinx-autobuild -docutils==0.17.1 \ - --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ - --hash=sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61 +docutils==0.18.1 \ + --hash=sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c \ + --hash=sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06 # via # sphinx # sphinx-rtd-theme @@ -237,10 +237,14 @@ requests==2.28.2 \ # via # scriv # sphinx -scriv==1.1.0 \ - --hash=sha256:1064101623e318d906d91f7e1405c97af414c67f0c7da8ee4d08eaa523b735eb \ - --hash=sha256:f2670624b2c44cdf34224c8b032b71a00a41b78e9f587140da6dd0b010e66b75 +scriv==1.2.0 \ + --hash=sha256:26b65a903da7d9aefc712a0d4150b8638302b4758bd428bbd773dd918c61c621 \ + --hash=sha256:bb61c30fea73158a4d18c28bbb57821c308245683efb0d897bd45e4a7856b472 # via -r doc/requirements.in +setuptools==67.2.0 \ + --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ + --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 + # via sphinxcontrib-jquery six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -262,9 +266,9 @@ sphinx-autobuild==2021.3.14 \ --hash=sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac \ --hash=sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05 # via -r doc/requirements.in -sphinx-rtd-theme==1.1.1 \ - --hash=sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7 \ - --hash=sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103 +sphinx-rtd-theme==1.2.0 \ + --hash=sha256:a0d8bd1a2ed52e0b338cbe19c4b2eef3c5e7a048769753dac6a9f059c7b641b8 \ + --hash=sha256:f823f7e71890abe0ac6aaa6013361ea2696fc8d3e1fa798f463e82bdb77eeff2 # via -r doc/requirements.in sphinxcontrib-applehelp==1.0.2 \ --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a \ @@ -278,6 +282,10 @@ sphinxcontrib-htmlhelp==2.0.0 \ --hash=sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07 \ --hash=sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2 # via sphinx +sphinxcontrib-jquery==2.0.0 \ + --hash=sha256:8fb65f6dba84bf7bcd1aea1f02ab3955ac34611d838bcc95d4983b805b234daa \ + --hash=sha256:ed47fa425c338ffebe3c37e1cdb56e30eb806116b85f01055b158c7057fdb995 + # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 \ --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 @@ -319,7 +327,7 @@ urllib3==1.26.14 \ --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \ --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1 # via requests -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via importlib-metadata diff --git a/requirements/dev.pip b/requirements/dev.pip index c2f80a446..af6838299 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -4,9 +4,9 @@ # # make upgrade # -astroid==2.13.2 \ - --hash=sha256:3bc7834720e1a24ca797fd785d77efb14f7a28ee8e635ef040b6e2d80ccb3303 \ - --hash=sha256:8f6a8d40c4ad161d6fc419545ae4b2f275ed86d1c989c97825772120842ee0d2 +astroid==2.14.1 \ + --hash=sha256:23c718921acab5f08cbbbe9293967f1f8fec40c336d19cd75dc12a9ea31d2eb2 \ + --hash=sha256:bd1aa4f9915c98e8aaebcd4e71930154d4e8c9aaf05d35ac0a63d1956091ae3f # via pylint attrs==22.2.0 \ --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ @@ -15,17 +15,17 @@ attrs==22.2.0 \ # -r requirements/pytest.pip # hypothesis # pytest -bleach==5.0.1 \ - --hash=sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a \ - --hash=sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c +bleach==6.0.0 \ + --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ + --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 # via readme-renderer build==0.10.0 \ --hash=sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171 \ --hash=sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269 # via check-manifest -cachetools==5.2.1 \ - --hash=sha256:5991bc0e08a1319bb618d3195ca5b6bc76646a49c21d55962977197b301cc1fe \ - --hash=sha256:8462eebf3a6c15d25430a8c27c56ac61340b2ecf60c9ce57afc2b97e450e47da +cachetools==5.3.0 \ + --hash=sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14 \ + --hash=sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4 # via # -r requirements/tox.pip # tox @@ -144,10 +144,6 @@ colorama==0.4.6 \ # -r requirements/pytest.pip # -r requirements/tox.pip # tox -commonmark==0.9.1 \ - --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ - --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 - # via rich dill==0.3.6 \ --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 \ --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373 @@ -188,71 +184,71 @@ flaky==3.7.0 \ --hash=sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d \ --hash=sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c # via -r requirements/pytest.pip -greenlet==2.0.1 \ - --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ - --hash=sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9 \ - --hash=sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581 \ - --hash=sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26 \ - --hash=sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd \ - --hash=sha256:0b493db84d124805865adc587532ebad30efa68f79ad68f11b336e0a51ec86c2 \ - --hash=sha256:13ba6e8e326e2116c954074c994da14954982ba2795aebb881c07ac5d093a58a \ - --hash=sha256:13ebf93c343dd8bd010cd98e617cb4c1c1f352a0cf2524c82d3814154116aa82 \ - --hash=sha256:1407fe45246632d0ffb7a3f4a520ba4e6051fc2cbd61ba1f806900c27f47706a \ - --hash=sha256:1bf633a50cc93ed17e494015897361010fc08700d92676c87931d3ea464123ce \ - --hash=sha256:2d0bac0385d2b43a7bd1d651621a4e0f1380abc63d6fb1012213a401cbd5bf8f \ - --hash=sha256:3001d00eba6bbf084ae60ec7f4bb8ed375748f53aeaefaf2a37d9f0370558524 \ - --hash=sha256:356e4519d4dfa766d50ecc498544b44c0249b6de66426041d7f8b751de4d6b48 \ - --hash=sha256:38255a3f1e8942573b067510f9611fc9e38196077b0c8eb7a8c795e105f9ce77 \ - --hash=sha256:3d75b8d013086b08e801fbbb896f7d5c9e6ccd44f13a9241d2bf7c0df9eda928 \ - --hash=sha256:41b825d65f31e394b523c84db84f9383a2f7eefc13d987f308f4663794d2687e \ - --hash=sha256:42e602564460da0e8ee67cb6d7236363ee5e131aa15943b6670e44e5c2ed0f67 \ - --hash=sha256:4aeaebcd91d9fee9aa768c1b39cb12214b30bf36d2b7370505a9f2165fedd8d9 \ - --hash=sha256:4c8b1c43e75c42a6cafcc71defa9e01ead39ae80bd733a2608b297412beede68 \ - --hash=sha256:4d37990425b4687ade27810e3b1a1c37825d242ebc275066cfee8cb6b8829ccd \ - --hash=sha256:4f09b0010e55bec3239278f642a8a506b91034f03a4fb28289a7d448a67f1515 \ - --hash=sha256:505138d4fa69462447a562a7c2ef723c6025ba12ac04478bc1ce2fcc279a2db5 \ - --hash=sha256:5067920de254f1a2dee8d3d9d7e4e03718e8fd2d2d9db962c8c9fa781ae82a39 \ - --hash=sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94 \ - --hash=sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92 \ - --hash=sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e \ - --hash=sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726 \ - --hash=sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd \ - --hash=sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5 \ - --hash=sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764 \ - --hash=sha256:81b0ea3715bf6a848d6f7149d25bf018fd24554a4be01fcbbe3fdc78e890b955 \ - --hash=sha256:88c8d517e78acdf7df8a2134a3c4b964415b575d2840a2746ddb1cc6175f8608 \ - --hash=sha256:8dca09dedf1bd8684767bc736cc20c97c29bc0c04c413e3276e0962cd7aeb148 \ - --hash=sha256:974a39bdb8c90a85982cdb78a103a32e0b1be986d411303064b28a80611f6e51 \ - --hash=sha256:9e112e03d37987d7b90c1e98ba5e1b59e1645226d78d73282f45b326f7bddcb9 \ - --hash=sha256:9e9744c657d896c7b580455e739899e492a4a452e2dd4d2b3e459f6b244a638d \ - --hash=sha256:9ed358312e63bf683b9ef22c8e442ef6c5c02973f0c2a939ec1d7b50c974015c \ - --hash=sha256:9f2c221eecb7ead00b8e3ddb913c67f75cba078fd1d326053225a3f59d850d72 \ - --hash=sha256:a20d33124935d27b80e6fdacbd34205732660e0a1d35d8b10b3328179a2b51a1 \ - --hash=sha256:a4c0757db9bd08470ff8277791795e70d0bf035a011a528ee9a5ce9454b6cba2 \ - --hash=sha256:afe07421c969e259e9403c3bb658968702bc3b78ec0b6fde3ae1e73440529c23 \ - --hash=sha256:b1992ba9d4780d9af9726bbcef6a1db12d9ab1ccc35e5773685a24b7fb2758eb \ - --hash=sha256:b23d2a46d53210b498e5b701a1913697671988f4bf8e10f935433f6e7c332fb6 \ - --hash=sha256:b5e83e4de81dcc9425598d9469a624826a0b1211380ac444c7c791d4a2137c19 \ - --hash=sha256:be35822f35f99dcc48152c9839d0171a06186f2d71ef76dc57fa556cc9bf6b45 \ - --hash=sha256:be9e0fb2ada7e5124f5282d6381903183ecc73ea019568d6d63d33f25b2a9000 \ - --hash=sha256:c140e7eb5ce47249668056edf3b7e9900c6a2e22fb0eaf0513f18a1b2c14e1da \ - --hash=sha256:c6a08799e9e88052221adca55741bf106ec7ea0710bca635c208b751f0d5b617 \ - --hash=sha256:cb242fc2cda5a307a7698c93173d3627a2a90d00507bccf5bc228851e8304963 \ - --hash=sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7 \ - --hash=sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d \ - --hash=sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d \ - --hash=sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0 \ - --hash=sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ - --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ - --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ - --hash=sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a \ - --hash=sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1 \ - --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ - --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd +greenlet==2.0.2 \ + --hash=sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a \ + --hash=sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a \ + --hash=sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43 \ + --hash=sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33 \ + --hash=sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8 \ + --hash=sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088 \ + --hash=sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca \ + --hash=sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343 \ + --hash=sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645 \ + --hash=sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db \ + --hash=sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df \ + --hash=sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3 \ + --hash=sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86 \ + --hash=sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2 \ + --hash=sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a \ + --hash=sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf \ + --hash=sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7 \ + --hash=sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394 \ + --hash=sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40 \ + --hash=sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3 \ + --hash=sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6 \ + --hash=sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74 \ + --hash=sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0 \ + --hash=sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3 \ + --hash=sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91 \ + --hash=sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5 \ + --hash=sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9 \ + --hash=sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8 \ + --hash=sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b \ + --hash=sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6 \ + --hash=sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb \ + --hash=sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73 \ + --hash=sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b \ + --hash=sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df \ + --hash=sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9 \ + --hash=sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f \ + --hash=sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0 \ + --hash=sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857 \ + --hash=sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a \ + --hash=sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249 \ + --hash=sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30 \ + --hash=sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292 \ + --hash=sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b \ + --hash=sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d \ + --hash=sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b \ + --hash=sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c \ + --hash=sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca \ + --hash=sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7 \ + --hash=sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75 \ + --hash=sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae \ + --hash=sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b \ + --hash=sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470 \ + --hash=sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564 \ + --hash=sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9 \ + --hash=sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099 \ + --hash=sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0 \ + --hash=sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5 \ + --hash=sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19 \ + --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ + --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 # via -r requirements/dev.in -hypothesis==6.62.1 \ - --hash=sha256:7d1e2f9871e6509662da317adf9b4aabd6b38280fb6c7930aa4f574d2ed25150 \ - --hash=sha256:d00a4a9c54b0b8b4570fe1abe42395807a973b4a507e6718309800e6f84e160d +hypothesis==6.68.0 \ + --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ + --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -281,9 +277,9 @@ iniconfig==2.0.0 \ # via # -r requirements/pytest.pip # pytest -isort==5.11.4 \ - --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ - --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b +isort==5.11.5 \ + --hash=sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db \ + --hash=sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746 # via pylint jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ @@ -342,10 +338,18 @@ libsass==0.22.0 \ --hash=sha256:89c5ce497fcf3aba1dd1b19aae93b99f68257e5f2026b731b00a872f13324c7f \ --hash=sha256:f1efc1b612299c88aec9e39d6ca0c266d360daa5b19d9430bdeaffffa86993f9 # via -r requirements/dev.in +markdown-it-py==2.1.0 \ + --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ + --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da + # via rich mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e # via pylint +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py more-itertools==9.0.0 \ --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab @@ -365,17 +369,17 @@ parso==0.8.3 \ --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 # via jedi -pip==22.3.1 \ - --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ - --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c # via -r requirements/pip.pip pkginfo==1.9.6 \ --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 # via twine -platformdirs==2.6.2 \ - --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ - --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 +platformdirs==3.0.0 \ + --hash=sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9 \ + --hash=sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567 # via # -r requirements/pip.pip # -r requirements/tox.pip @@ -400,13 +404,13 @@ pygments==2.14.0 \ # pudb # readme-renderer # rich -pylint==2.15.10 \ - --hash=sha256:9df0d07e8948a1c3ffa3b6e2d7e6e63d9fb457c5da5b961ed63106594780cc7e \ - --hash=sha256:b3dc5ef7d33858f297ac0d06cc73862f01e4f2e74025ec3eff347ce0bc60baf5 +pylint==2.16.1 \ + --hash=sha256:bad9d7c36037f6043a1e848a43004dfd5ea5ceb05815d713ba56ca4503a9fe37 \ + --hash=sha256:ffe7fa536bb38ba35006a7c8a6d2efbfdd3d95bbf21199cad31f76b1c50aaf30 # via -r requirements/dev.in -pyproject-api==1.4.0 \ - --hash=sha256:ac85c1f82e0291dbae5a7739dbb9a990e11ee4034c9b5599ea714f07a24ecd71 \ - --hash=sha256:c34226297781efdd1ba4dfb74ce21076d9a8360e2125ea31803c1a02c76b2460 +pyproject-api==1.5.0 \ + --hash=sha256:0962df21f3e633b8ddb9567c011e6c1b3dcdfc31b7860c0ede7e24c5a1200fbe \ + --hash=sha256:4c111277dfb96bcd562c6245428f27250b794bfe3e210b8714c4f893952f2c17 # via # -r requirements/tox.pip # tox @@ -420,9 +424,9 @@ pytest==7.2.1 \ # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==3.1.0 \ - --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ - --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 +pytest-xdist==3.2.0 \ + --hash=sha256:336098e3bbd8193276867cc87db8b22903c3927665dff9d1ac8684c02f597b68 \ + --hash=sha256:fa10f95a2564cd91652f2d132725183c3b590d9fdcdec09d3677386ecf4c1ce9 # via -r requirements/pytest.pip readme-renderer==37.3 \ --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ @@ -445,13 +449,13 @@ rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==13.1.0 \ - --hash=sha256:81c73a30b144bbcdedc13f4ea0b6ffd7fdc3b0d3cc259a9402309c8e4aee1964 \ - --hash=sha256:f846bff22a43e8508aebf3f0f2410ce1c6f4cde429098bd58d91fde038c57299 +rich==13.3.1 \ + --hash=sha256:125d96d20c92b946b983d0d392b84ff945461e5a06d3867e9f9e575f8697b67f \ + --hash=sha256:8aa57747f3fc3e977684f0176a88e789be314a99f99b43b75d1e9cb5dc6db9e9 # via twine -setuptools==66.0.0 \ - --hash=sha256:a78d01d1e2c175c474884671dde039962c9d74c7223db7369771fcf6e29ceeab \ - --hash=sha256:bd6eb2d6722568de6d14b87c44a96fac54b2a45ff5e940e639979a3d1792adb6 +setuptools==67.2.0 \ + --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ + --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 # via check-manifest six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -480,9 +484,9 @@ tomlkit==0.11.6 \ --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via pylint -tox==4.3.4 \ - --hash=sha256:84ee61b27dc983cb5b5d9ef93af10ce54a0e3992df73335fcdf3e8a3d3453a93 \ - --hash=sha256:f5ac33b55de2f8764cff260661eb1257107a21c4819714b04f14669991aa7772 +tox==4.4.5 \ + --hash=sha256:1081864f1a1393ffa11ebe9beaa280349020579310d217a594a4e7b6124c5425 \ + --hash=sha256:f9bc83c5da8666baa2a4d4e884bbbda124fe646e4b1c0e412949cecc2b6e8f90 # via # -r requirements/tox.pip # tox-gh @@ -528,6 +532,7 @@ typing-extensions==4.4.0 \ # -r requirements/pytest.pip # astroid # importlib-metadata + # markdown-it-py # platformdirs # pylint # rich @@ -546,9 +551,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.17.1 \ - --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ - --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 +virtualenv==20.19.0 \ + --hash=sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590 \ + --hash=sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1 # via # -r requirements/pip.pip # -r requirements/tox.pip @@ -623,9 +628,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via # -r requirements/pip.pip # -r requirements/pytest.pip diff --git a/requirements/kit.pip b/requirements/kit.pip index ae6f4c393..f19412bc7 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -8,9 +8,9 @@ auditwheel==5.3.0 \ --hash=sha256:1da1af54de5badd10149250c257a799be003fd976794716f17914e3d4b4a9fc9 \ --hash=sha256:d0be87b5b6fb767eacf1ea4afa3292574cb0f4473a3c0ba55bc9dff1d0b5a333 # via -r requirements/kit.in -bashlex==0.17 \ - --hash=sha256:0ad04403637f64f7836da46c125f9023a2518be418595322309f20ddc1db6cc0 \ - --hash=sha256:2aed062438e10ee89742bc80969793cd9ee4a3fab6cfb2365e43731aabd21010 +bashlex==0.18 \ + --hash=sha256:5bb03a01c6d5676338c36fd1028009c8ad07e7d61d8a1ce3f513b7fff52796ee \ + --hash=sha256:91d73a23a3e51711919c1c899083890cdecffc91d8c088942725ac13e9dcfffa # via cibuildwheel bracex==2.3.post1 \ --hash=sha256:351b7f20d56fb9ea91f9b9e9e7664db466eb234188c175fd943f8f755c807e73 \ @@ -48,9 +48,9 @@ packaging==23.0 \ # via # build # cibuildwheel -platformdirs==2.6.2 \ - --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ - --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 +platformdirs==3.0.0 \ + --hash=sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9 \ + --hash=sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567 # via cibuildwheel pyelftools==0.29 \ --hash=sha256:519f38cf412f073b2d7393aa4682b0190fa901f7c3fa0bff2b82d537690c7fc1 \ @@ -60,9 +60,9 @@ pyproject-hooks==1.0.0 \ --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 # via build -setuptools==66.0.0 \ - --hash=sha256:a78d01d1e2c175c474884671dde039962c9d74c7223db7369771fcf6e29ceeab \ - --hash=sha256:bd6eb2d6722568de6d14b87c44a96fac54b2a45ff5e940e639979a3d1792adb6 +setuptools==67.2.0 \ + --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ + --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 # via -r requirements/kit.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ @@ -82,7 +82,7 @@ wheel==0.38.4 \ --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via -r requirements/kit.in -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via importlib-metadata diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 65e0b7db5..6beecd327 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -132,67 +132,67 @@ gevent==22.10.2 \ --hash=sha256:f3329bedbba4d3146ae58c667e0f9ac1e6f1e1e6340c7593976cdc60aa7d1a47 \ --hash=sha256:f7ed2346eb9dc4344f9cb0d7963ce5b74fe16fdd031a2809bb6c2b6eba7ebcd5 # via -r requirements/light-threads.in -greenlet==2.0.1 \ - --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ - --hash=sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9 \ - --hash=sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581 \ - --hash=sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26 \ - --hash=sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd \ - --hash=sha256:0b493db84d124805865adc587532ebad30efa68f79ad68f11b336e0a51ec86c2 \ - --hash=sha256:13ba6e8e326e2116c954074c994da14954982ba2795aebb881c07ac5d093a58a \ - --hash=sha256:13ebf93c343dd8bd010cd98e617cb4c1c1f352a0cf2524c82d3814154116aa82 \ - --hash=sha256:1407fe45246632d0ffb7a3f4a520ba4e6051fc2cbd61ba1f806900c27f47706a \ - --hash=sha256:1bf633a50cc93ed17e494015897361010fc08700d92676c87931d3ea464123ce \ - --hash=sha256:2d0bac0385d2b43a7bd1d651621a4e0f1380abc63d6fb1012213a401cbd5bf8f \ - --hash=sha256:3001d00eba6bbf084ae60ec7f4bb8ed375748f53aeaefaf2a37d9f0370558524 \ - --hash=sha256:356e4519d4dfa766d50ecc498544b44c0249b6de66426041d7f8b751de4d6b48 \ - --hash=sha256:38255a3f1e8942573b067510f9611fc9e38196077b0c8eb7a8c795e105f9ce77 \ - --hash=sha256:3d75b8d013086b08e801fbbb896f7d5c9e6ccd44f13a9241d2bf7c0df9eda928 \ - --hash=sha256:41b825d65f31e394b523c84db84f9383a2f7eefc13d987f308f4663794d2687e \ - --hash=sha256:42e602564460da0e8ee67cb6d7236363ee5e131aa15943b6670e44e5c2ed0f67 \ - --hash=sha256:4aeaebcd91d9fee9aa768c1b39cb12214b30bf36d2b7370505a9f2165fedd8d9 \ - --hash=sha256:4c8b1c43e75c42a6cafcc71defa9e01ead39ae80bd733a2608b297412beede68 \ - --hash=sha256:4d37990425b4687ade27810e3b1a1c37825d242ebc275066cfee8cb6b8829ccd \ - --hash=sha256:4f09b0010e55bec3239278f642a8a506b91034f03a4fb28289a7d448a67f1515 \ - --hash=sha256:505138d4fa69462447a562a7c2ef723c6025ba12ac04478bc1ce2fcc279a2db5 \ - --hash=sha256:5067920de254f1a2dee8d3d9d7e4e03718e8fd2d2d9db962c8c9fa781ae82a39 \ - --hash=sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94 \ - --hash=sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92 \ - --hash=sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e \ - --hash=sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726 \ - --hash=sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd \ - --hash=sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5 \ - --hash=sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764 \ - --hash=sha256:81b0ea3715bf6a848d6f7149d25bf018fd24554a4be01fcbbe3fdc78e890b955 \ - --hash=sha256:88c8d517e78acdf7df8a2134a3c4b964415b575d2840a2746ddb1cc6175f8608 \ - --hash=sha256:8dca09dedf1bd8684767bc736cc20c97c29bc0c04c413e3276e0962cd7aeb148 \ - --hash=sha256:974a39bdb8c90a85982cdb78a103a32e0b1be986d411303064b28a80611f6e51 \ - --hash=sha256:9e112e03d37987d7b90c1e98ba5e1b59e1645226d78d73282f45b326f7bddcb9 \ - --hash=sha256:9e9744c657d896c7b580455e739899e492a4a452e2dd4d2b3e459f6b244a638d \ - --hash=sha256:9ed358312e63bf683b9ef22c8e442ef6c5c02973f0c2a939ec1d7b50c974015c \ - --hash=sha256:9f2c221eecb7ead00b8e3ddb913c67f75cba078fd1d326053225a3f59d850d72 \ - --hash=sha256:a20d33124935d27b80e6fdacbd34205732660e0a1d35d8b10b3328179a2b51a1 \ - --hash=sha256:a4c0757db9bd08470ff8277791795e70d0bf035a011a528ee9a5ce9454b6cba2 \ - --hash=sha256:afe07421c969e259e9403c3bb658968702bc3b78ec0b6fde3ae1e73440529c23 \ - --hash=sha256:b1992ba9d4780d9af9726bbcef6a1db12d9ab1ccc35e5773685a24b7fb2758eb \ - --hash=sha256:b23d2a46d53210b498e5b701a1913697671988f4bf8e10f935433f6e7c332fb6 \ - --hash=sha256:b5e83e4de81dcc9425598d9469a624826a0b1211380ac444c7c791d4a2137c19 \ - --hash=sha256:be35822f35f99dcc48152c9839d0171a06186f2d71ef76dc57fa556cc9bf6b45 \ - --hash=sha256:be9e0fb2ada7e5124f5282d6381903183ecc73ea019568d6d63d33f25b2a9000 \ - --hash=sha256:c140e7eb5ce47249668056edf3b7e9900c6a2e22fb0eaf0513f18a1b2c14e1da \ - --hash=sha256:c6a08799e9e88052221adca55741bf106ec7ea0710bca635c208b751f0d5b617 \ - --hash=sha256:cb242fc2cda5a307a7698c93173d3627a2a90d00507bccf5bc228851e8304963 \ - --hash=sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7 \ - --hash=sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d \ - --hash=sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d \ - --hash=sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0 \ - --hash=sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ - --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ - --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ - --hash=sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a \ - --hash=sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1 \ - --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ - --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd +greenlet==2.0.2 \ + --hash=sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a \ + --hash=sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a \ + --hash=sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43 \ + --hash=sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33 \ + --hash=sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8 \ + --hash=sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088 \ + --hash=sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca \ + --hash=sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343 \ + --hash=sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645 \ + --hash=sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db \ + --hash=sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df \ + --hash=sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3 \ + --hash=sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86 \ + --hash=sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2 \ + --hash=sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a \ + --hash=sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf \ + --hash=sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7 \ + --hash=sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394 \ + --hash=sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40 \ + --hash=sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3 \ + --hash=sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6 \ + --hash=sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74 \ + --hash=sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0 \ + --hash=sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3 \ + --hash=sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91 \ + --hash=sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5 \ + --hash=sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9 \ + --hash=sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8 \ + --hash=sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b \ + --hash=sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6 \ + --hash=sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb \ + --hash=sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73 \ + --hash=sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b \ + --hash=sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df \ + --hash=sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9 \ + --hash=sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f \ + --hash=sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0 \ + --hash=sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857 \ + --hash=sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a \ + --hash=sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249 \ + --hash=sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30 \ + --hash=sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292 \ + --hash=sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b \ + --hash=sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d \ + --hash=sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b \ + --hash=sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c \ + --hash=sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca \ + --hash=sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7 \ + --hash=sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75 \ + --hash=sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae \ + --hash=sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b \ + --hash=sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470 \ + --hash=sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564 \ + --hash=sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9 \ + --hash=sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099 \ + --hash=sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0 \ + --hash=sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5 \ + --hash=sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19 \ + --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ + --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 # via # -r requirements/light-threads.in # eventlet @@ -201,9 +201,9 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -setuptools==66.0.0 \ - --hash=sha256:a78d01d1e2c175c474884671dde039962c9d74c7223db7369771fcf6e29ceeab \ - --hash=sha256:bd6eb2d6722568de6d14b87c44a96fac54b2a45ff5e940e639979a3d1792adb6 +setuptools==67.2.0 \ + --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ + --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 # via # gevent # zope-event diff --git a/requirements/lint.pip b/requirements/lint.pip index 5493a9f68..3f4e8ff8f 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -8,9 +8,9 @@ alabaster==0.7.13 \ --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \ --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2 # via sphinx -astroid==2.13.2 \ - --hash=sha256:3bc7834720e1a24ca797fd785d77efb14f7a28ee8e635ef040b6e2d80ccb3303 \ - --hash=sha256:8f6a8d40c4ad161d6fc419545ae4b2f275ed86d1c989c97825772120842ee0d2 +astroid==2.14.1 \ + --hash=sha256:23c718921acab5f08cbbbe9293967f1f8fec40c336d19cd75dc12a9ea31d2eb2 \ + --hash=sha256:bd1aa4f9915c98e8aaebcd4e71930154d4e8c9aaf05d35ac0a63d1956091ae3f # via pylint attrs==22.2.0 \ --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ @@ -24,17 +24,17 @@ babel==2.11.0 \ --hash=sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe \ --hash=sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6 # via sphinx -bleach==5.0.1 \ - --hash=sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a \ - --hash=sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c +bleach==6.0.0 \ + --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ + --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 # via readme-renderer build==0.10.0 \ --hash=sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171 \ --hash=sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269 # via check-manifest -cachetools==5.2.1 \ - --hash=sha256:5991bc0e08a1319bb618d3195ca5b6bc76646a49c21d55962977197b301cc1fe \ - --hash=sha256:8462eebf3a6c15d25430a8c27c56ac61340b2ecf60c9ce57afc2b97e450e47da +cachetools==5.3.0 \ + --hash=sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14 \ + --hash=sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4 # via # -r requirements/tox.pip # tox @@ -166,10 +166,6 @@ colorama==0.4.6 \ # -r requirements/tox.pip # sphinx-autobuild # tox -commonmark==0.9.1 \ - --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ - --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 - # via rich dill==0.3.6 \ --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 \ --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373 @@ -181,9 +177,9 @@ distlib==0.3.6 \ # -r requirements/pip.pip # -r requirements/tox.pip # virtualenv -docutils==0.17.1 \ - --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ - --hash=sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61 +docutils==0.18.1 \ + --hash=sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c \ + --hash=sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06 # via # readme-renderer # sphinx @@ -213,71 +209,71 @@ flaky==3.7.0 \ --hash=sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d \ --hash=sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c # via -r requirements/pytest.pip -greenlet==2.0.1 \ - --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ - --hash=sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9 \ - --hash=sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581 \ - --hash=sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26 \ - --hash=sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd \ - --hash=sha256:0b493db84d124805865adc587532ebad30efa68f79ad68f11b336e0a51ec86c2 \ - --hash=sha256:13ba6e8e326e2116c954074c994da14954982ba2795aebb881c07ac5d093a58a \ - --hash=sha256:13ebf93c343dd8bd010cd98e617cb4c1c1f352a0cf2524c82d3814154116aa82 \ - --hash=sha256:1407fe45246632d0ffb7a3f4a520ba4e6051fc2cbd61ba1f806900c27f47706a \ - --hash=sha256:1bf633a50cc93ed17e494015897361010fc08700d92676c87931d3ea464123ce \ - --hash=sha256:2d0bac0385d2b43a7bd1d651621a4e0f1380abc63d6fb1012213a401cbd5bf8f \ - --hash=sha256:3001d00eba6bbf084ae60ec7f4bb8ed375748f53aeaefaf2a37d9f0370558524 \ - --hash=sha256:356e4519d4dfa766d50ecc498544b44c0249b6de66426041d7f8b751de4d6b48 \ - --hash=sha256:38255a3f1e8942573b067510f9611fc9e38196077b0c8eb7a8c795e105f9ce77 \ - --hash=sha256:3d75b8d013086b08e801fbbb896f7d5c9e6ccd44f13a9241d2bf7c0df9eda928 \ - --hash=sha256:41b825d65f31e394b523c84db84f9383a2f7eefc13d987f308f4663794d2687e \ - --hash=sha256:42e602564460da0e8ee67cb6d7236363ee5e131aa15943b6670e44e5c2ed0f67 \ - --hash=sha256:4aeaebcd91d9fee9aa768c1b39cb12214b30bf36d2b7370505a9f2165fedd8d9 \ - --hash=sha256:4c8b1c43e75c42a6cafcc71defa9e01ead39ae80bd733a2608b297412beede68 \ - --hash=sha256:4d37990425b4687ade27810e3b1a1c37825d242ebc275066cfee8cb6b8829ccd \ - --hash=sha256:4f09b0010e55bec3239278f642a8a506b91034f03a4fb28289a7d448a67f1515 \ - --hash=sha256:505138d4fa69462447a562a7c2ef723c6025ba12ac04478bc1ce2fcc279a2db5 \ - --hash=sha256:5067920de254f1a2dee8d3d9d7e4e03718e8fd2d2d9db962c8c9fa781ae82a39 \ - --hash=sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94 \ - --hash=sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92 \ - --hash=sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e \ - --hash=sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726 \ - --hash=sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd \ - --hash=sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5 \ - --hash=sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764 \ - --hash=sha256:81b0ea3715bf6a848d6f7149d25bf018fd24554a4be01fcbbe3fdc78e890b955 \ - --hash=sha256:88c8d517e78acdf7df8a2134a3c4b964415b575d2840a2746ddb1cc6175f8608 \ - --hash=sha256:8dca09dedf1bd8684767bc736cc20c97c29bc0c04c413e3276e0962cd7aeb148 \ - --hash=sha256:974a39bdb8c90a85982cdb78a103a32e0b1be986d411303064b28a80611f6e51 \ - --hash=sha256:9e112e03d37987d7b90c1e98ba5e1b59e1645226d78d73282f45b326f7bddcb9 \ - --hash=sha256:9e9744c657d896c7b580455e739899e492a4a452e2dd4d2b3e459f6b244a638d \ - --hash=sha256:9ed358312e63bf683b9ef22c8e442ef6c5c02973f0c2a939ec1d7b50c974015c \ - --hash=sha256:9f2c221eecb7ead00b8e3ddb913c67f75cba078fd1d326053225a3f59d850d72 \ - --hash=sha256:a20d33124935d27b80e6fdacbd34205732660e0a1d35d8b10b3328179a2b51a1 \ - --hash=sha256:a4c0757db9bd08470ff8277791795e70d0bf035a011a528ee9a5ce9454b6cba2 \ - --hash=sha256:afe07421c969e259e9403c3bb658968702bc3b78ec0b6fde3ae1e73440529c23 \ - --hash=sha256:b1992ba9d4780d9af9726bbcef6a1db12d9ab1ccc35e5773685a24b7fb2758eb \ - --hash=sha256:b23d2a46d53210b498e5b701a1913697671988f4bf8e10f935433f6e7c332fb6 \ - --hash=sha256:b5e83e4de81dcc9425598d9469a624826a0b1211380ac444c7c791d4a2137c19 \ - --hash=sha256:be35822f35f99dcc48152c9839d0171a06186f2d71ef76dc57fa556cc9bf6b45 \ - --hash=sha256:be9e0fb2ada7e5124f5282d6381903183ecc73ea019568d6d63d33f25b2a9000 \ - --hash=sha256:c140e7eb5ce47249668056edf3b7e9900c6a2e22fb0eaf0513f18a1b2c14e1da \ - --hash=sha256:c6a08799e9e88052221adca55741bf106ec7ea0710bca635c208b751f0d5b617 \ - --hash=sha256:cb242fc2cda5a307a7698c93173d3627a2a90d00507bccf5bc228851e8304963 \ - --hash=sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7 \ - --hash=sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d \ - --hash=sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d \ - --hash=sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0 \ - --hash=sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ - --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ - --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ - --hash=sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a \ - --hash=sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1 \ - --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ - --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd +greenlet==2.0.2 \ + --hash=sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a \ + --hash=sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a \ + --hash=sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43 \ + --hash=sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33 \ + --hash=sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8 \ + --hash=sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088 \ + --hash=sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca \ + --hash=sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343 \ + --hash=sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645 \ + --hash=sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db \ + --hash=sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df \ + --hash=sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3 \ + --hash=sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86 \ + --hash=sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2 \ + --hash=sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a \ + --hash=sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf \ + --hash=sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7 \ + --hash=sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394 \ + --hash=sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40 \ + --hash=sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3 \ + --hash=sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6 \ + --hash=sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74 \ + --hash=sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0 \ + --hash=sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3 \ + --hash=sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91 \ + --hash=sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5 \ + --hash=sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9 \ + --hash=sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8 \ + --hash=sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b \ + --hash=sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6 \ + --hash=sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb \ + --hash=sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73 \ + --hash=sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b \ + --hash=sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df \ + --hash=sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9 \ + --hash=sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f \ + --hash=sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0 \ + --hash=sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857 \ + --hash=sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a \ + --hash=sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249 \ + --hash=sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30 \ + --hash=sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292 \ + --hash=sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b \ + --hash=sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d \ + --hash=sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b \ + --hash=sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c \ + --hash=sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca \ + --hash=sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7 \ + --hash=sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75 \ + --hash=sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae \ + --hash=sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b \ + --hash=sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470 \ + --hash=sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564 \ + --hash=sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9 \ + --hash=sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099 \ + --hash=sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0 \ + --hash=sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5 \ + --hash=sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19 \ + --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ + --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 # via -r requirements/dev.in -hypothesis==6.62.1 \ - --hash=sha256:7d1e2f9871e6509662da317adf9b4aabd6b38280fb6c7930aa4f574d2ed25150 \ - --hash=sha256:d00a4a9c54b0b8b4570fe1abe42395807a973b4a507e6718309800e6f84e160d +hypothesis==6.68.0 \ + --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ + --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -313,9 +309,9 @@ iniconfig==2.0.0 \ # via # -r requirements/pytest.pip # pytest -isort==5.11.4 \ - --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ - --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b +isort==5.11.5 \ + --hash=sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db \ + --hash=sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746 # via pylint jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ @@ -384,6 +380,10 @@ livereload==2.6.3 \ --hash=sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869 \ --hash=sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4 # via sphinx-autobuild +markdown-it-py==2.1.0 \ + --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ + --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da + # via rich markupsafe==2.1.2 \ --hash=sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed \ --hash=sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc \ @@ -440,6 +440,10 @@ mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e # via pylint +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py more-itertools==9.0.0 \ --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab @@ -460,17 +464,17 @@ parso==0.8.3 \ --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 # via jedi -pip==22.3.1 \ - --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ - --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c # via -r requirements/pip.pip pkginfo==1.9.6 \ --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 # via twine -platformdirs==2.6.2 \ - --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ - --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 +platformdirs==3.0.0 \ + --hash=sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9 \ + --hash=sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567 # via # -r requirements/pip.pip # -r requirements/tox.pip @@ -504,13 +508,13 @@ pygments==2.14.0 \ # readme-renderer # rich # sphinx -pylint==2.15.10 \ - --hash=sha256:9df0d07e8948a1c3ffa3b6e2d7e6e63d9fb457c5da5b961ed63106594780cc7e \ - --hash=sha256:b3dc5ef7d33858f297ac0d06cc73862f01e4f2e74025ec3eff347ce0bc60baf5 +pylint==2.16.1 \ + --hash=sha256:bad9d7c36037f6043a1e848a43004dfd5ea5ceb05815d713ba56ca4503a9fe37 \ + --hash=sha256:ffe7fa536bb38ba35006a7c8a6d2efbfdd3d95bbf21199cad31f76b1c50aaf30 # via -r requirements/dev.in -pyproject-api==1.4.0 \ - --hash=sha256:ac85c1f82e0291dbae5a7739dbb9a990e11ee4034c9b5599ea714f07a24ecd71 \ - --hash=sha256:c34226297781efdd1ba4dfb74ce21076d9a8360e2125ea31803c1a02c76b2460 +pyproject-api==1.5.0 \ + --hash=sha256:0962df21f3e633b8ddb9567c011e6c1b3dcdfc31b7860c0ede7e24c5a1200fbe \ + --hash=sha256:4c111277dfb96bcd562c6245428f27250b794bfe3e210b8714c4f893952f2c17 # via # -r requirements/tox.pip # tox @@ -524,9 +528,9 @@ pytest==7.2.1 \ # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==3.1.0 \ - --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ - --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 +pytest-xdist==3.2.0 \ + --hash=sha256:336098e3bbd8193276867cc87db8b22903c3927665dff9d1ac8684c02f597b68 \ + --hash=sha256:fa10f95a2564cd91652f2d132725183c3b590d9fdcdec09d3677386ecf4c1ce9 # via -r requirements/pytest.pip pytz==2022.7.1 \ --hash=sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0 \ @@ -555,18 +559,20 @@ rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==13.1.0 \ - --hash=sha256:81c73a30b144bbcdedc13f4ea0b6ffd7fdc3b0d3cc259a9402309c8e4aee1964 \ - --hash=sha256:f846bff22a43e8508aebf3f0f2410ce1c6f4cde429098bd58d91fde038c57299 +rich==13.3.1 \ + --hash=sha256:125d96d20c92b946b983d0d392b84ff945461e5a06d3867e9f9e575f8697b67f \ + --hash=sha256:8aa57747f3fc3e977684f0176a88e789be314a99f99b43b75d1e9cb5dc6db9e9 # via twine -scriv==1.1.0 \ - --hash=sha256:1064101623e318d906d91f7e1405c97af414c67f0c7da8ee4d08eaa523b735eb \ - --hash=sha256:f2670624b2c44cdf34224c8b032b71a00a41b78e9f587140da6dd0b010e66b75 +scriv==1.2.0 \ + --hash=sha256:26b65a903da7d9aefc712a0d4150b8638302b4758bd428bbd773dd918c61c621 \ + --hash=sha256:bb61c30fea73158a4d18c28bbb57821c308245683efb0d897bd45e4a7856b472 # via -r doc/requirements.in -setuptools==66.0.0 \ - --hash=sha256:a78d01d1e2c175c474884671dde039962c9d74c7223db7369771fcf6e29ceeab \ - --hash=sha256:bd6eb2d6722568de6d14b87c44a96fac54b2a45ff5e940e639979a3d1792adb6 - # via check-manifest +setuptools==67.2.0 \ + --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ + --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 + # via + # check-manifest + # sphinxcontrib-jquery six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -596,9 +602,9 @@ sphinx-autobuild==2021.3.14 \ --hash=sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac \ --hash=sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05 # via -r doc/requirements.in -sphinx-rtd-theme==1.1.1 \ - --hash=sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7 \ - --hash=sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103 +sphinx-rtd-theme==1.2.0 \ + --hash=sha256:a0d8bd1a2ed52e0b338cbe19c4b2eef3c5e7a048769753dac6a9f059c7b641b8 \ + --hash=sha256:f823f7e71890abe0ac6aaa6013361ea2696fc8d3e1fa798f463e82bdb77eeff2 # via -r doc/requirements.in sphinxcontrib-applehelp==1.0.2 \ --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a \ @@ -612,6 +618,10 @@ sphinxcontrib-htmlhelp==2.0.0 \ --hash=sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07 \ --hash=sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2 # via sphinx +sphinxcontrib-jquery==2.0.0 \ + --hash=sha256:8fb65f6dba84bf7bcd1aea1f02ab3955ac34611d838bcc95d4983b805b234daa \ + --hash=sha256:ed47fa425c338ffebe3c37e1cdb56e30eb806116b85f01055b158c7057fdb995 + # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 \ --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 @@ -662,9 +672,9 @@ tornado==6.2 \ --hash=sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e \ --hash=sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b # via livereload -tox==4.3.4 \ - --hash=sha256:84ee61b27dc983cb5b5d9ef93af10ce54a0e3992df73335fcdf3e8a3d3453a93 \ - --hash=sha256:f5ac33b55de2f8764cff260661eb1257107a21c4819714b04f14669991aa7772 +tox==4.4.5 \ + --hash=sha256:1081864f1a1393ffa11ebe9beaa280349020579310d217a594a4e7b6124c5425 \ + --hash=sha256:f9bc83c5da8666baa2a4d4e884bbbda124fe646e4b1c0e412949cecc2b6e8f90 # via # -r requirements/tox.pip # tox-gh @@ -710,6 +720,7 @@ typing-extensions==4.4.0 \ # -r requirements/pytest.pip # astroid # importlib-metadata + # markdown-it-py # platformdirs # pylint # rich @@ -728,9 +739,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.17.1 \ - --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ - --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 +virtualenv==20.19.0 \ + --hash=sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590 \ + --hash=sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1 # via # -r requirements/pip.pip # -r requirements/tox.pip @@ -805,9 +816,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via # -r requirements/pip.pip # -r requirements/pytest.pip diff --git a/requirements/mypy.pip b/requirements/mypy.pip index 16648b773..026821bd8 100644 --- a/requirements/mypy.pip +++ b/requirements/mypy.pip @@ -32,9 +32,9 @@ flaky==3.7.0 \ --hash=sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d \ --hash=sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c # via -r requirements/pytest.pip -hypothesis==6.62.1 \ - --hash=sha256:7d1e2f9871e6509662da317adf9b4aabd6b38280fb6c7930aa4f574d2ed25150 \ - --hash=sha256:d00a4a9c54b0b8b4570fe1abe42395807a973b4a507e6718309800e6f84e160d +hypothesis==6.68.0 \ + --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ + --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 # via -r requirements/pytest.pip importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ @@ -49,41 +49,37 @@ iniconfig==2.0.0 \ # via # -r requirements/pytest.pip # pytest -mypy==0.991 \ - --hash=sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d \ - --hash=sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6 \ - --hash=sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf \ - --hash=sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f \ - --hash=sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813 \ - --hash=sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33 \ - --hash=sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad \ - --hash=sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05 \ - --hash=sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297 \ - --hash=sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06 \ - --hash=sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd \ - --hash=sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243 \ - --hash=sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305 \ - --hash=sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476 \ - --hash=sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711 \ - --hash=sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70 \ - --hash=sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5 \ - --hash=sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461 \ - --hash=sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab \ - --hash=sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c \ - --hash=sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d \ - --hash=sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135 \ - --hash=sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93 \ - --hash=sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648 \ - --hash=sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a \ - --hash=sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb \ - --hash=sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3 \ - --hash=sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372 \ - --hash=sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb \ - --hash=sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef +mypy==1.0.0 \ + --hash=sha256:01b1b9e1ed40544ef486fa8ac022232ccc57109f379611633ede8e71630d07d2 \ + --hash=sha256:0ab090d9240d6b4e99e1fa998c2d0aa5b29fc0fb06bd30e7ad6183c95fa07593 \ + --hash=sha256:14d776869a3e6c89c17eb943100f7868f677703c8a4e00b3803918f86aafbc52 \ + --hash=sha256:1ace23f6bb4aec4604b86c4843276e8fa548d667dbbd0cb83a3ae14b18b2db6c \ + --hash=sha256:2efa963bdddb27cb4a0d42545cd137a8d2b883bd181bbc4525b568ef6eca258f \ + --hash=sha256:2f6ac8c87e046dc18c7d1d7f6653a66787a4555085b056fe2d599f1f1a2a2d21 \ + --hash=sha256:3ae4c7a99e5153496243146a3baf33b9beff714464ca386b5f62daad601d87af \ + --hash=sha256:3cfad08f16a9c6611e6143485a93de0e1e13f48cfb90bcad7d5fde1c0cec3d36 \ + --hash=sha256:4e5175026618c178dfba6188228b845b64131034ab3ba52acaffa8f6c361f805 \ + --hash=sha256:50979d5efff8d4135d9db293c6cb2c42260e70fb010cbc697b1311a4d7a39ddb \ + --hash=sha256:5cd187d92b6939617f1168a4fe68f68add749902c010e66fe574c165c742ed88 \ + --hash=sha256:5cfca124f0ac6707747544c127880893ad72a656e136adc935c8600740b21ff5 \ + --hash=sha256:5e398652d005a198a7f3c132426b33c6b85d98aa7dc852137a2a3be8890c4072 \ + --hash=sha256:67cced7f15654710386e5c10b96608f1ee3d5c94ca1da5a2aad5889793a824c1 \ + --hash=sha256:7306edca1c6f1b5fa0bc9aa645e6ac8393014fa82d0fa180d0ebc990ebe15964 \ + --hash=sha256:7cc2c01dfc5a3cbddfa6c13f530ef3b95292f926329929001d45e124342cd6b7 \ + --hash=sha256:87edfaf344c9401942883fad030909116aa77b0fa7e6e8e1c5407e14549afe9a \ + --hash=sha256:8845125d0b7c57838a10fd8925b0f5f709d0e08568ce587cc862aacce453e3dd \ + --hash=sha256:92024447a339400ea00ac228369cd242e988dd775640755fa4ac0c126e49bb74 \ + --hash=sha256:a86b794e8a56ada65c573183756eac8ac5b8d3d59daf9d5ebd72ecdbb7867a43 \ + --hash=sha256:bb2782a036d9eb6b5a6efcdda0986774bf798beef86a62da86cb73e2a10b423d \ + --hash=sha256:be78077064d016bc1b639c2cbcc5be945b47b4261a4f4b7d8923f6c69c5c9457 \ + --hash=sha256:c7cf862aef988b5fbaa17764ad1d21b4831436701c7d2b653156a9497d92c83c \ + --hash=sha256:e0626db16705ab9f7fa6c249c017c887baf20738ce7f9129da162bb3075fc1af \ + --hash=sha256:f34495079c8d9da05b183f9f7daec2878280c2ad7cc81da686ef0b484cea2ecf \ + --hash=sha256:fe523fcbd52c05040c7bee370d66fee8373c5972171e4fbc323153433198592d # via -r requirements/mypy.in -mypy-extensions==0.4.3 \ - --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ - --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 # via mypy packaging==23.0 \ --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ @@ -103,9 +99,9 @@ pytest==7.2.1 \ # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==3.1.0 \ - --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ - --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 +pytest-xdist==3.2.0 \ + --hash=sha256:336098e3bbd8193276867cc87db8b22903c3927665dff9d1ac8684c02f597b68 \ + --hash=sha256:fa10f95a2564cd91652f2d132725183c3b590d9fdcdec09d3677386ecf4c1ce9 # via -r requirements/pytest.pip sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ @@ -153,9 +149,9 @@ typing-extensions==4.4.0 \ # -r requirements/pytest.pip # importlib-metadata # mypy -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via # -r requirements/pytest.pip # importlib-metadata diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 4884bbf18..2cfa5ca71 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -22,21 +22,21 @@ packaging==23.0 \ --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ --hash=sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97 # via build -pip==22.3.1 \ - --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ - --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c # via pip-tools -pip-tools==6.12.1 \ - --hash=sha256:88efb7b29a923ffeac0713e6f23ef8529cc6175527d42b93f73756cc94387293 \ - --hash=sha256:f0c0c0ec57b58250afce458e2e6058b1f30a4263db895b7d72fd6311bf1dc6f7 +pip-tools==6.12.2 \ + --hash=sha256:6a51f4fd67140d5e83703ebfa9610fb61398727151f56a1be02a972d062e4679 \ + --hash=sha256:8b903696df4598b10d469026ef9995c5f9a874b416e88e7a214884ebe4a70245 # via -r requirements/pip-tools.in pyproject-hooks==1.0.0 \ --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 # via build -setuptools==66.0.0 \ - --hash=sha256:a78d01d1e2c175c474884671dde039962c9d74c7223db7369771fcf6e29ceeab \ - --hash=sha256:bd6eb2d6722568de6d14b87c44a96fac54b2a45ff5e940e639979a3d1792adb6 +setuptools==67.2.0 \ + --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ + --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 # via pip-tools tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ @@ -52,7 +52,7 @@ wheel==0.38.4 \ --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via pip-tools -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via importlib-metadata diff --git a/requirements/pip.pip b/requirements/pip.pip index e48340d14..8b746308d 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -16,13 +16,13 @@ importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d # via virtualenv -pip==22.3.1 \ - --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ - --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c # via -r requirements/pip.in -platformdirs==2.6.2 \ - --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ - --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 +platformdirs==3.0.0 \ + --hash=sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9 \ + --hash=sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567 # via virtualenv typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ @@ -30,11 +30,11 @@ typing-extensions==4.4.0 \ # via # importlib-metadata # platformdirs -virtualenv==20.17.1 \ - --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ - --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 +virtualenv==20.19.0 \ + --hash=sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590 \ + --hash=sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1 # via -r requirements/pip.in -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via importlib-metadata diff --git a/requirements/pytest.pip b/requirements/pytest.pip index a57e8ae61..11e1c3ac7 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -28,9 +28,9 @@ flaky==3.7.0 \ --hash=sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d \ --hash=sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c # via -r requirements/pytest.in -hypothesis==6.62.1 \ - --hash=sha256:7d1e2f9871e6509662da317adf9b4aabd6b38280fb6c7930aa4f574d2ed25150 \ - --hash=sha256:d00a4a9c54b0b8b4570fe1abe42395807a973b4a507e6718309800e6f84e160d +hypothesis==6.68.0 \ + --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ + --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 # via -r requirements/pytest.in importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ @@ -56,9 +56,9 @@ pytest==7.2.1 \ # via # -r requirements/pytest.in # pytest-xdist -pytest-xdist==3.1.0 \ - --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ - --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 +pytest-xdist==3.2.0 \ + --hash=sha256:336098e3bbd8193276867cc87db8b22903c3927665dff9d1ac8684c02f597b68 \ + --hash=sha256:fa10f95a2564cd91652f2d132725183c3b590d9fdcdec09d3677386ecf4c1ce9 # via -r requirements/pytest.in sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ @@ -72,7 +72,7 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via importlib-metadata diff --git a/requirements/tox.pip b/requirements/tox.pip index 202228c76..d52a1b6f5 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -4,9 +4,9 @@ # # make upgrade # -cachetools==5.2.1 \ - --hash=sha256:5991bc0e08a1319bb618d3195ca5b6bc76646a49c21d55962977197b301cc1fe \ - --hash=sha256:8462eebf3a6c15d25430a8c27c56ac61340b2ecf60c9ce57afc2b97e450e47da +cachetools==5.3.0 \ + --hash=sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14 \ + --hash=sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4 # via tox chardet==5.1.0 \ --hash=sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5 \ @@ -41,9 +41,9 @@ packaging==23.0 \ # via # pyproject-api # tox -platformdirs==2.6.2 \ - --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ - --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 +platformdirs==3.0.0 \ + --hash=sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9 \ + --hash=sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567 # via # tox # virtualenv @@ -51,9 +51,9 @@ pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 # via tox -pyproject-api==1.4.0 \ - --hash=sha256:ac85c1f82e0291dbae5a7739dbb9a990e11ee4034c9b5599ea714f07a24ecd71 \ - --hash=sha256:c34226297781efdd1ba4dfb74ce21076d9a8360e2125ea31803c1a02c76b2460 +pyproject-api==1.5.0 \ + --hash=sha256:0962df21f3e633b8ddb9567c011e6c1b3dcdfc31b7860c0ede7e24c5a1200fbe \ + --hash=sha256:4c111277dfb96bcd562c6245428f27250b794bfe3e210b8714c4f893952f2c17 # via tox tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ @@ -61,9 +61,9 @@ tomli==2.0.1 \ # via # pyproject-api # tox -tox==4.3.4 \ - --hash=sha256:84ee61b27dc983cb5b5d9ef93af10ce54a0e3992df73335fcdf3e8a3d3453a93 \ - --hash=sha256:f5ac33b55de2f8764cff260661eb1257107a21c4819714b04f14669991aa7772 +tox==4.4.5 \ + --hash=sha256:1081864f1a1393ffa11ebe9beaa280349020579310d217a594a4e7b6124c5425 \ + --hash=sha256:f9bc83c5da8666baa2a4d4e884bbbda124fe646e4b1c0e412949cecc2b6e8f90 # via # -r requirements/tox.in # tox-gh @@ -78,11 +78,11 @@ typing-extensions==4.4.0 \ # importlib-metadata # platformdirs # tox -virtualenv==20.17.1 \ - --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ - --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 +virtualenv==20.19.0 \ + --hash=sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590 \ + --hash=sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1 # via tox -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.12.1 \ + --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ + --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 # via importlib-metadata From 1c2e2be9fbba200330ec84062eecf6662cbd5ee0 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 9 Feb 2023 08:04:42 -0700 Subject: [PATCH 18/43] test: adapt to latest pylint --- ci/download_gha_artifacts.py | 2 +- ci/parse_relnotes.py | 2 +- coverage/collector.py | 2 +- coverage/control.py | 2 +- coverage/parser.py | 2 +- pylintrc | 1 + tests/test_cmdline.py | 6 +++--- tests/test_concurrency.py | 2 +- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ci/download_gha_artifacts.py b/ci/download_gha_artifacts.py index df22c6881..3d20541ad 100644 --- a/ci/download_gha_artifacts.py +++ b/ci/download_gha_artifacts.py @@ -21,7 +21,7 @@ def download_url(url, filename): for chunk in response.iter_content(16*1024): f.write(chunk) else: - raise Exception(f"Fetching {url} produced: status={response.status_code}") + raise RuntimeError(f"Fetching {url} produced: status={response.status_code}") def unpack_zipfile(filename): """Unpack a zipfile, using the names in the zip.""" diff --git a/ci/parse_relnotes.py b/ci/parse_relnotes.py index deebae5dd..df83818a6 100644 --- a/ci/parse_relnotes.py +++ b/ci/parse_relnotes.py @@ -74,7 +74,7 @@ def sections(parsed_data): elif ttype == "text": text.append(ttext) else: - raise Exception(f"Don't know ttype {ttype!r}") + raise RuntimeError(f"Don't know ttype {ttype!r}") yield (*header, "\n".join(text)) diff --git a/coverage/collector.py b/coverage/collector.py index 22471504f..2f8c17520 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -356,7 +356,7 @@ def start(self) -> None: try: fn(frame, event, arg, lineno=lineno) except TypeError as ex: - raise Exception("fullcoverage must be run with the C trace function.") from ex + raise RuntimeError("fullcoverage must be run with the C trace function.") from ex # Install our installation tracer in threading, to jump-start other # threads. diff --git a/coverage/control.py b/coverage/control.py index 78e0c70e6..730ba554b 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -337,7 +337,7 @@ def _post_init(self) -> None: # '[run] _crash' will raise an exception if the value is close by in # the call stack, for testing error handling. if self.config._crash and self.config._crash in short_stack(limit=4): - raise Exception(f"Crashing because called by {self.config._crash}") + raise RuntimeError(f"Crashing because called by {self.config._crash}") def _write_startup_debug(self) -> None: """Write out debug info at startup if needed.""" diff --git a/coverage/parser.py b/coverage/parser.py index b8ddb5015..ae70b4f0f 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -821,7 +821,7 @@ def add_arcs(self, node: ast.AST) -> Set[ArcStart]: # statement), or it's something we overlooked. if env.TESTING: if node_name not in self.OK_TO_DEFAULT: - raise Exception(f"*** Unhandled: {node}") # pragma: only failure + raise RuntimeError(f"*** Unhandled: {node}") # pragma: only failure # Default for simple statements: one exit from this node. return {ArcStart(self.line_for_node(node))} diff --git a/pylintrc b/pylintrc index cc6936130..5f879056d 100644 --- a/pylintrc +++ b/pylintrc @@ -62,6 +62,7 @@ disable= broad-except, no-else-return, subprocess-run-check, + use-dict-literal, # Messages that may be silly: no-member, using-constant-test, diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index c517d39d3..e94b1080e 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -1081,7 +1081,7 @@ def command_line(self, argv: List[str]) -> int: print("Hello, world!") elif argv[0] == 'raise': try: - raise Exception("oh noes!") + raise RuntimeError("oh noes!") except: raise _ExceptionDuringRun(*sys.exc_info()) from None elif argv[0] == 'internalraise': @@ -1111,8 +1111,8 @@ def test_raise(self) -> None: print(err) err_parts = err.splitlines(keepends=True) assert err_parts[0] == 'Traceback (most recent call last):\n' - assert ' raise Exception("oh noes!")\n' in err_parts - assert err_parts[-1] == 'Exception: oh noes!\n' + assert ' raise RuntimeError("oh noes!")\n' in err_parts + assert err_parts[-1] == 'RuntimeError: oh noes!\n' def test_internalraise(self) -> None: with pytest.raises(ValueError, match="coverage is broken"): diff --git a/tests/test_concurrency.py b/tests/test_concurrency.py index 3360094bf..9f12e77ec 100644 --- a/tests/test_concurrency.py +++ b/tests/test_concurrency.py @@ -584,7 +584,7 @@ def test_multiprocessing_bootstrap_error_handling(self) -> None: """) out = self.run_command("coverage run multi.py") assert "Exception during multiprocessing bootstrap init" in out - assert "Exception: Crashing because called by _bootstrap" in out + assert "RuntimeError: Crashing because called by _bootstrap" in out def test_bug_890(self) -> None: # chdir in multiprocessing shouldn't keep us from finding the From 151d3a74857b174ee4d852b98a0e1a7ef4f73427 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 9 Feb 2023 08:41:20 -0700 Subject: [PATCH 19/43] mypy: typeshed bug got fixed --- coverage/python.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/coverage/python.py b/coverage/python.py index 98b0d6ab9..744ab4cb8 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -9,7 +9,7 @@ import types import zipimport -from typing import cast, Dict, Iterable, Optional, Set, TYPE_CHECKING +from typing import Dict, Iterable, Optional, Set, TYPE_CHECKING from coverage import env from coverage.exceptions import CoverageException, NoSource @@ -89,8 +89,7 @@ def get_zip_bytes(filename: str) -> Optional[bytes]: except zipimport.ZipImportError: return None try: - # typeshed is wrong for get_data: https://github.com/python/typeshed/pull/9428 - data = cast(bytes, zi.get_data(inner)) + data = zi.get_data(inner) except OSError: return None return data From 6bc043981f6548852844ea6b16d5ef7d37c0417d Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 11 Feb 2023 17:59:25 -0500 Subject: [PATCH 20/43] refactor: use placebos instead of non-existent attributes Details of the problem and thought process: https://nedbatchelder.com/blog/202302/late_initialization_with_mypy.html --- coverage/control.py | 99 +++++++++++++++++++++++++++++---------------- coverage/debug.py | 8 +++- coverage/sqldata.py | 2 + 3 files changed, 72 insertions(+), 37 deletions(-) diff --git a/coverage/control.py b/coverage/control.py index 730ba554b..cdea42eed 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -26,10 +26,10 @@ from coverage import env from coverage.annotate import AnnotateReporter from coverage.collector import Collector, HAS_CTRACER -from coverage.config import read_coverage_config +from coverage.config import CoverageConfig, read_coverage_config from coverage.context import should_start_context_test_function, combine_context_switchers from coverage.data import CoverageData, combine_parallel_data -from coverage.debug import DebugControl, short_stack, write_formatted_info +from coverage.debug import DebugControl, NoDebugging, short_stack, write_formatted_info from coverage.disposition import disposition_debug_msg from coverage.exceptions import ConfigError, CoverageException, CoverageWarning, PluginError from coverage.files import PathAliases, abs_file, relative_filename, set_relative_directory @@ -52,7 +52,6 @@ ) from coverage.xmlreport import XmlReporter - os = isolate_module(os) @contextlib.contextmanager @@ -219,6 +218,10 @@ def __init__( # pylint: disable=too-many-arguments The `messages` parameter. """ + # Start self.config as a usable default configuration. It will soon be + # replaced with the real configuration. + self.config = CoverageConfig() + # data_file=None means no disk file at all. data_file missing means # use the value from the config file. self._no_disk = data_file is None @@ -241,14 +244,15 @@ def __init__( # pylint: disable=too-many-arguments # A record of all the warnings that have been issued. self._warnings: List[str] = [] - # Other instance attributes, set later. - self._debug: DebugControl - self._plugins: Plugins - self._inorout: InOrOut - self._data: CoverageData - self._collector: Collector - self._file_mapper: Callable[[str], str] + # Other instance attributes, set with placebos or placeholders. + # More useful objects will be created later. + self._debug: DebugControl = NoDebugging() + self._inorout: InOrOut = InOrOutPlacebo() + self._plugins: Plugins = Plugins() + self._data: CoverageData = CoverageDataPlacebo() + self._collector: Collector = CollectorPlacebo() + self._file_mapper: Callable[[str], str] = abs_file self._data_suffix = self._run_suffix = None self._exclude_re: Dict[str, str] = {} self._old_sigterm: Optional[Callable[[int, Optional[FrameType]], Any]] = None @@ -315,7 +319,8 @@ def _init(self) -> None: self._exclude_re = {} set_relative_directory() - self._file_mapper = relative_filename if self.config.relative_files else abs_file + if self.config.relative_files: + self._file_mapper = relative_filename # Load plugins self._plugins = Plugins.load_plugins(self.config.plugins, self.config, self._debug) @@ -400,9 +405,7 @@ def _warn(self, msg: str, slug: Optional[str] = None, once: bool = False) -> Non """ if not self._no_warn_slugs: - # _warn() can be called before self.config is set in __init__... - if hasattr(self, "config"): - self._no_warn_slugs = list(self.config.disable_warnings) + self._no_warn_slugs = list(self.config.disable_warnings) if slug in self._no_warn_slugs: # Don't issue the warning @@ -411,7 +414,7 @@ def _warn(self, msg: str, slug: Optional[str] = None, once: bool = False) -> Non self._warnings.append(msg) if slug: msg = f"{msg} ({slug})" - if hasattr(self, "_debug") and self._debug.should('pid'): + if self._debug.should('pid'): msg = f"[{os.getpid()}] {msg}" warnings.warn(msg, category=CoverageWarning, stacklevel=2) @@ -477,8 +480,7 @@ def set_option(self, option_name: str, value: Union[TConfigValueIn, TConfigSecti def load(self) -> None: """Load previously-collected coverage data from the data file.""" self._init() - if hasattr(self, "_collector"): - self._collector.reset() + self._collector.reset() should_skip = self.config.parallel and not os.path.exists(self.config.data_file) if not should_skip: self._init_data(suffix=None) @@ -578,7 +580,7 @@ def _init_for_start(self) -> None: def _init_data(self, suffix: Optional[Union[str, bool]]) -> None: """Create a data file if we don't have one yet.""" - if not hasattr(self, "_data"): + if not self._data._real: # Create the data file. We do this at construction time so that the # data file will be written into the directory where the process # started rather than wherever the process eventually chdir'd to. @@ -658,11 +660,10 @@ def erase(self) -> None: """ self._init() self._post_init() - if hasattr(self, "_collector"): - self._collector.reset() + self._collector.reset() self._init_data(suffix=None) self._data.erase(parallel=self.config.parallel) - del self._data + self._data = CoverageDataPlacebo() self._inited_for_start = False def switch_context(self, new_context: str) -> None: @@ -709,7 +710,6 @@ def exclude(self, regex: str, which: str = 'exclude') -> None: """ self._init() excl_list = getattr(self.config, which + "_list") - assert isinstance(regex, str) excl_list.append(regex) self._exclude_regex_stale() @@ -814,7 +814,7 @@ def get_data(self) -> CoverageData: if not plugin._coverage_enabled: self._collector.plugin_was_disabled(plugin) - if hasattr(self, "_collector") and self._collector.flush_data(): + if self._collector.flush_data(): self._post_save_work() return self._data @@ -837,13 +837,12 @@ def _post_save_work(self) -> None: # Touch all the files that could have executed, so that we can # mark completely un-executed files as 0% covered. - if self._data is not None: - file_paths = collections.defaultdict(list) - for file_path, plugin_name in self._inorout.find_possibly_unexecuted_files(): - file_path = self._file_mapper(file_path) - file_paths[plugin_name].append(file_path) - for plugin_name, paths in file_paths.items(): - self._data.touch_files(paths, plugin_name) + file_paths = collections.defaultdict(list) + for file_path, plugin_name in self._inorout.find_possibly_unexecuted_files(): + file_path = self._file_mapper(file_path) + file_paths[plugin_name].append(file_path) + for plugin_name, paths in file_paths.items(): + self._data.touch_files(paths, plugin_name) # Backward compatibility with version 1. def analysis(self, morf: TMorf) -> Tuple[str, List[TLineNo], List[TLineNo], str]: @@ -1253,7 +1252,7 @@ def plugin_info(plugins: List[Any]) -> List[str]: info = [ ('coverage_version', covmod.__version__), ('coverage_module', covmod.__file__), - ('tracer', self._collector.tracer_name() if hasattr(self, "_collector") else "-none-"), + ('tracer', self._collector.tracer_name()), ('CTracer', 'available' if HAS_CTRACER else "unavailable"), ('plugins.file_tracers', plugin_info(self._plugins.file_tracers)), ('plugins.configurers', plugin_info(self._plugins.configurers)), @@ -1264,7 +1263,7 @@ def plugin_info(plugins: List[Any]) -> List[str]: ('config_contents', repr(self.config._config_contents) if self.config._config_contents else '-none-' ), - ('data_file', self._data.data_filename() if hasattr(self, "_data") else "-none-"), + ('data_file', self._data.data_filename()), ('python', sys.version.replace('\n', '')), ('platform', platform.platform()), ('implementation', platform.python_implementation()), @@ -1285,14 +1284,44 @@ def plugin_info(plugins: List[Any]) -> List[str]: ('command_line', " ".join(getattr(sys, 'argv', ['-none-']))), ] - if hasattr(self, "_inorout"): - info.extend(self._inorout.sys_info()) - + info.extend(self._inorout.sys_info()) info.extend(CoverageData.sys_info()) return info +class _Placebo: + """Base class for placebos, to prevent calling the real base class __init__.""" + def __init__(self) -> None: + ... + + +class CoverageDataPlacebo(_Placebo, CoverageData): + """Just enough of a CoverageData to be used when we don't have a real one.""" + _real = False + + def data_filename(self) -> str: + return "-none-" + + +class CollectorPlacebo(_Placebo, Collector): + """Just enough of a Collector to be used when we don't have a real one.""" + def reset(self) -> None: + ... + + def flush_data(self) -> bool: + return False + + def tracer_name(self) -> str: + return "-none-" + + +class InOrOutPlacebo(_Placebo, InOrOut): + """Just enough of an InOrOut to be used when we don't have a real one.""" + def sys_info(self) -> Iterable[Tuple[str, Any]]: + return [] + + # Mega debugging... # $set_env.py: COVERAGE_DEBUG_CALLS - Lots and lots of output about calls to Coverage. if int(os.environ.get("COVERAGE_DEBUG_CALLS", 0)): # pragma: debugging diff --git a/coverage/debug.py b/coverage/debug.py index 122339597..d56a66bb8 100644 --- a/coverage/debug.py +++ b/coverage/debug.py @@ -105,9 +105,13 @@ def get_output(self) -> str: return cast(str, self.raw_output.getvalue()) # type: ignore -class NoDebugging: +class NoDebugging(DebugControl): """A replacement for DebugControl that will never try to do anything.""" - def should(self, option: str) -> bool: # pylint: disable=unused-argument + def __init__(self) -> None: + # pylint: disable=super-init-not-called + ... + + def should(self, option: str) -> bool: """Should we write debug messages? Never.""" return False diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 9aa2b1293..bb26e4d5d 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -212,6 +212,8 @@ class CoverageData(AutoReprMixin): """ + _real = True # to distinguish from a placebo in control.py + def __init__( self, basename: Optional[str] = None, From f77be1770a9d93ed69d6b5a26dcbe5dbfe14e380 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 12 Feb 2023 09:27:25 -0500 Subject: [PATCH 21/43] fix: Path objects are ok for data_file and config_file. #1552 --- CHANGES.rst | 7 ++++++- coverage/control.py | 10 +++++++--- coverage/sqldata.py | 4 ++-- coverage/types.py | 13 ++++++++++++- tests/test_api.py | 12 +++++++----- tests/test_config.py | 8 +++++--- tests/test_data.py | 9 ++++++--- 7 files changed, 45 insertions(+), 18 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index f336cff58..1c27501da 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -27,6 +27,11 @@ Unreleased themselves with messages like "Wrote XML report to file.xml" before spewing a traceback about their failure. +- Fix: arguments in the public API that name file paths now accept pathlib.Path + objects. This includes the ``data_file`` and ``config_file`` arguments to + the Coverage constructor and the ``basename`` argument to CoverageData. + Closes `issue 1552`_. + - Fix: In some embedded environments, an IndexError could occur on stop() when the originating thread exits before completion. This is now fixed, thanks to `Russell Keith-Magee `_, closing `issue 1542`_. @@ -38,7 +43,7 @@ Unreleased .. _pull 1543: https://github.com/nedbat/coveragepy/pull/1543 .. _pull 1547: https://github.com/nedbat/coveragepy/pull/1547 .. _pull 1550: https://github.com/nedbat/coveragepy/pull/1550 - +.. _issue 1552: https://github.com/nedbat/coveragepy/issues/1552 .. scriv-start-here diff --git a/coverage/control.py b/coverage/control.py index cdea42eed..e385f0e2a 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -47,7 +47,7 @@ from coverage.results import Analysis from coverage.summary import SummaryReporter from coverage.types import ( - TConfigurable, TConfigSectionIn, TConfigValueIn, TConfigValueOut, + FilePath, TConfigurable, TConfigSectionIn, TConfigValueIn, TConfigValueOut, TFileDisposition, TLineNo, TMorf, ) from coverage.xmlreport import XmlReporter @@ -113,13 +113,13 @@ def current(cls) -> Optional[Coverage]: def __init__( # pylint: disable=too-many-arguments self, - data_file: Optional[Union[str, DefaultValue]] = DEFAULT_DATAFILE, + data_file: Optional[Union[FilePath, DefaultValue]] = DEFAULT_DATAFILE, data_suffix: Optional[Union[str, bool]] = None, cover_pylib: Optional[bool] = None, auto_data: bool = False, timid: Optional[bool] = None, branch: Optional[bool] = None, - config_file: Union[str, bool] = True, + config_file: Union[FilePath, bool] = True, source: Optional[Iterable[str]] = None, source_pkgs: Optional[Iterable[str]] = None, omit: Optional[Union[str, Iterable[str]]] = None, @@ -227,6 +227,8 @@ def __init__( # pylint: disable=too-many-arguments self._no_disk = data_file is None if isinstance(data_file, DefaultValue): data_file = None + if data_file is not None: + data_file = os.fspath(data_file) # This is injectable by tests. self._debug_file: Optional[IO[str]] = None @@ -267,6 +269,8 @@ def __init__( # pylint: disable=too-many-arguments self._should_write_debug = True # Build our configuration from a number of sources. + if not isinstance(config_file, bool): + config_file = os.fspath(config_file) self.config = read_coverage_config( config_file=config_file, warn=self._warn, diff --git a/coverage/sqldata.py b/coverage/sqldata.py index bb26e4d5d..15b30ae90 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -31,7 +31,7 @@ from coverage.files import PathAliases from coverage.misc import file_be_gone, isolate_module from coverage.numbits import numbits_to_nums, numbits_union, nums_to_numbits -from coverage.types import TArc, TDebugCtl, TLineNo, TWarnFn +from coverage.types import FilePath, TArc, TDebugCtl, TLineNo, TWarnFn from coverage.version import __version__ os = isolate_module(os) @@ -216,7 +216,7 @@ class CoverageData(AutoReprMixin): def __init__( self, - basename: Optional[str] = None, + basename: Optional[FilePath] = None, suffix: Optional[Union[str, bool]] = None, no_disk: bool = False, warn: Optional[TWarnFn] = None, diff --git a/coverage/types.py b/coverage/types.py index b8135d05b..e01f451e6 100644 --- a/coverage/types.py +++ b/coverage/types.py @@ -7,9 +7,12 @@ from __future__ import annotations +import os +import pathlib + from types import FrameType, ModuleType from typing import ( - Any, Callable, Dict, Iterable, List, Mapping, Optional, Set, Tuple, Union, + Any, Callable, Dict, Iterable, List, Mapping, Optional, Set, Tuple, Type, Union, TYPE_CHECKING, ) @@ -23,6 +26,14 @@ class Protocol: # pylint: disable=missing-class-docstring pass +## File paths + +# For arguments that are file paths: +FilePath = Union[str, os.PathLike] +# For testing FilePath arguments +FilePathClasses = [str, pathlib.Path] +FilePathType = Union[Type[str], Type[pathlib.Path]] + ## Python tracing class TTraceFn(Protocol): diff --git a/tests/test_api.py b/tests/test_api.py index 1c5654216..596510ebc 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -25,7 +25,7 @@ from coverage.exceptions import CoverageException, DataError, NoDataError, NoSource from coverage.files import abs_file, relative_filename from coverage.misc import import_local_file -from coverage.types import Protocol, TCovKwargs +from coverage.types import FilePathClasses, FilePathType, Protocol, TCovKwargs from tests.coveragetest import CoverageTest, TESTS_DIR, UsingModulesMixin from tests.goldtest import contains, doesnt_contain @@ -221,26 +221,28 @@ def test_datafile_default(self) -> None: cov.save() self.assertFiles(["datatest1.py", ".coverage"]) - def test_datafile_specified(self) -> None: + @pytest.mark.parametrize("file_class", FilePathClasses) + def test_datafile_specified(self, file_class: FilePathType) -> None: # You can specify the data file name. self.make_file("datatest2.py", """\ fooey = 17 """) self.assertFiles(["datatest2.py"]) - cov = coverage.Coverage(data_file="cov.data") + cov = coverage.Coverage(data_file=file_class("cov.data")) self.start_import_stop(cov, "datatest2") cov.save() self.assertFiles(["datatest2.py", "cov.data"]) - def test_datafile_and_suffix_specified(self) -> None: + @pytest.mark.parametrize("file_class", FilePathClasses) + def test_datafile_and_suffix_specified(self, file_class: FilePathType) -> None: # You can specify the data file name and suffix. self.make_file("datatest3.py", """\ fooey = 17 """) self.assertFiles(["datatest3.py"]) - cov = coverage.Coverage(data_file="cov.data", data_suffix="14") + cov = coverage.Coverage(data_file=file_class("cov.data"), data_suffix="14") self.start_import_stop(cov, "datatest3") cov.save() self.assertFiles(["datatest3.py", "cov.data.14"]) diff --git a/tests/test_config.py b/tests/test_config.py index d60a4eeb0..2ee5eae08 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,8 +6,8 @@ from __future__ import annotations import sys - from unittest import mock + import pytest import coverage @@ -15,6 +15,7 @@ from coverage.config import HandyConfigParser from coverage.exceptions import ConfigError, CoverageWarning from coverage.tomlconfig import TomlConfigParser +from coverage.types import FilePathClasses, FilePathType from tests.coveragetest import CoverageTest, UsingModulesMixin @@ -50,7 +51,8 @@ def test_config_file(self) -> None: assert not cov.config.branch assert cov.config.data_file == ".hello_kitty.data" - def test_named_config_file(self) -> None: + @pytest.mark.parametrize("file_class", FilePathClasses) + def test_named_config_file(self, file_class: FilePathType) -> None: # You can name the config file what you like. self.make_file("my_cov.ini", """\ [run] @@ -58,7 +60,7 @@ def test_named_config_file(self) -> None: ; I wouldn't really use this as a data file... data_file = delete.me """) - cov = coverage.Coverage(config_file="my_cov.ini") + cov = coverage.Coverage(config_file=file_class("my_cov.ini")) assert cov.config.timid assert not cov.config.branch assert cov.config.data_file == "delete.me" diff --git a/tests/test_data.py b/tests/test_data.py index 1cc645720..ab3f5f5ba 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -24,7 +24,7 @@ from coverage.debug import DebugControlString from coverage.exceptions import DataError, NoDataError from coverage.files import PathAliases, canonical_filename -from coverage.types import TArc, TLineNo +from coverage.types import FilePathClasses, FilePathType, TArc, TLineNo from tests.coveragetest import CoverageTest from tests.helpers import assert_count_equal @@ -621,10 +621,13 @@ def test_cant_purge_in_empty_data(self) -> None: class CoverageDataInTempDirTest(CoverageTest): """Tests of CoverageData that need a temporary directory to make files.""" - def test_read_write_lines(self) -> None: - covdata1 = DebugCoverageData("lines.dat") + @pytest.mark.parametrize("file_class", FilePathClasses) + def test_read_write_lines(self, file_class: FilePathType) -> None: + self.assert_doesnt_exist("lines.dat") + covdata1 = DebugCoverageData(file_class("lines.dat")) covdata1.add_lines(LINES_1) covdata1.write() + self.assert_exists("lines.dat") covdata2 = DebugCoverageData("lines.dat") covdata2.read() From 83c038a8aa262a51ecc44eebfc3b19c1fe712222 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 12 Feb 2023 13:54:14 -0500 Subject: [PATCH 22/43] refactor: make placebos private --- coverage/control.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/coverage/control.py b/coverage/control.py index e385f0e2a..d452b8d8b 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -249,10 +249,10 @@ def __init__( # pylint: disable=too-many-arguments # Other instance attributes, set with placebos or placeholders. # More useful objects will be created later. self._debug: DebugControl = NoDebugging() - self._inorout: InOrOut = InOrOutPlacebo() + self._inorout: InOrOut = _InOrOutPlacebo() self._plugins: Plugins = Plugins() - self._data: CoverageData = CoverageDataPlacebo() - self._collector: Collector = CollectorPlacebo() + self._data: CoverageData = _CoverageDataPlacebo() + self._collector: Collector = _CollectorPlacebo() self._file_mapper: Callable[[str], str] = abs_file self._data_suffix = self._run_suffix = None @@ -667,7 +667,7 @@ def erase(self) -> None: self._collector.reset() self._init_data(suffix=None) self._data.erase(parallel=self.config.parallel) - self._data = CoverageDataPlacebo() + self._data = _CoverageDataPlacebo() self._inited_for_start = False def switch_context(self, new_context: str) -> None: @@ -1300,7 +1300,7 @@ def __init__(self) -> None: ... -class CoverageDataPlacebo(_Placebo, CoverageData): +class _CoverageDataPlacebo(_Placebo, CoverageData): """Just enough of a CoverageData to be used when we don't have a real one.""" _real = False @@ -1308,7 +1308,7 @@ def data_filename(self) -> str: return "-none-" -class CollectorPlacebo(_Placebo, Collector): +class _CollectorPlacebo(_Placebo, Collector): """Just enough of a Collector to be used when we don't have a real one.""" def reset(self) -> None: ... @@ -1320,7 +1320,7 @@ def tracer_name(self) -> str: return "-none-" -class InOrOutPlacebo(_Placebo, InOrOut): +class _InOrOutPlacebo(_Placebo, InOrOut): """Just enough of an InOrOut to be used when we don't have a real one.""" def sys_info(self) -> Iterable[Tuple[str, Any]]: return [] From d06ace282bf26c5c7f3becb21db0cdd028ec0d9a Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 10 Feb 2023 12:23:25 -0700 Subject: [PATCH 23/43] docs: don't show type hints in the signature List the parameters separately, with type hints. This leaves a list of params with dashes and no description, but we can get to that later. --- doc/conf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/conf.py b/doc/conf.py index 39601fab2..9be27efd3 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -43,6 +43,8 @@ #'sphinx_tabs.tabs', ] +autodoc_typehints = "description" + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -126,6 +128,10 @@ nitpick_ignore = [ ("py:class", "frame"), ("py:class", "module"), + ("py:class", "DefaultValue"), + ("py:class", "FilePath"), + ("py:class", "TWarnFn"), + ("py:class", "TDebugCtl"), ] nitpick_ignore_regex = [ From 026d924e6d9449c632b1fec0c1f82f4f867e9724 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 13 Feb 2023 18:29:25 -0500 Subject: [PATCH 24/43] refactor: no placebos, use true Optional For objects that truly might not exist, use Optional. Some objects will always exist eventually, and for those we have some null implementation standins to use without making new placebo classes. --- coverage/control.py | 87 +++++++++++++++++++------------------------ coverage/sqldata.py | 2 - tests/test_oddball.py | 1 + 3 files changed, 40 insertions(+), 50 deletions(-) diff --git a/coverage/control.py b/coverage/control.py index d452b8d8b..290da655c 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -249,10 +249,10 @@ def __init__( # pylint: disable=too-many-arguments # Other instance attributes, set with placebos or placeholders. # More useful objects will be created later. self._debug: DebugControl = NoDebugging() - self._inorout: InOrOut = _InOrOutPlacebo() + self._inorout: Optional[InOrOut] = None self._plugins: Plugins = Plugins() - self._data: CoverageData = _CoverageDataPlacebo() - self._collector: Collector = _CollectorPlacebo() + self._data: Optional[CoverageData] = None + self._collector: Optional[Collector] = None self._file_mapper: Callable[[str], str] = abs_file self._data_suffix = self._run_suffix = None @@ -378,6 +378,7 @@ def _should_trace(self, filename: str, frame: FrameType) -> TFileDisposition: Calls `_should_trace_internal`, and returns the FileDisposition. """ + assert self._inorout is not None disp = self._inorout.should_trace(filename, frame) if self._debug.should('trace'): self._debug.write(disposition_debug_msg(disp)) @@ -389,6 +390,7 @@ def _check_include_omit_etc(self, filename: str, frame: FrameType) -> bool: Returns a boolean: True if the file should be traced, False if not. """ + assert self._inorout is not None reason = self._inorout.check_include_omit_etc(filename, frame) if self._debug.should('trace'): if not reason: @@ -484,12 +486,14 @@ def set_option(self, option_name: str, value: Union[TConfigValueIn, TConfigSecti def load(self) -> None: """Load previously-collected coverage data from the data file.""" self._init() - self._collector.reset() + if self._collector is not None: + self._collector.reset() should_skip = self.config.parallel and not os.path.exists(self.config.data_file) if not should_skip: self._init_data(suffix=None) self._post_init() if not should_skip: + assert self._data is not None self._data.read() def _init_for_start(self) -> None: @@ -541,6 +545,7 @@ def _init_for_start(self) -> None: self._init_data(suffix) + assert self._data is not None self._collector.use_data(self._data, self.config.context) # Early warning if we aren't going to be able to support plugins. @@ -584,7 +589,7 @@ def _init_for_start(self) -> None: def _init_data(self, suffix: Optional[Union[str, bool]]) -> None: """Create a data file if we don't have one yet.""" - if not self._data._real: + if self._data is None: # Create the data file. We do this at construction time so that the # data file will be written into the directory where the process # started rather than wherever the process eventually chdir'd to. @@ -614,6 +619,9 @@ def start(self) -> None: self._init_for_start() self._post_init() + assert self._collector is not None + assert self._inorout is not None + # Issue warnings for possible problems. self._inorout.warn_conflicting_settings() @@ -635,6 +643,7 @@ def stop(self) -> None: if self._instances[-1] is self: self._instances.pop() if self._started: + assert self._collector is not None self._collector.stop() self._started = False @@ -664,10 +673,12 @@ def erase(self) -> None: """ self._init() self._post_init() - self._collector.reset() + if self._collector is not None: + self._collector.reset() self._init_data(suffix=None) + assert self._data is not None self._data.erase(parallel=self.config.parallel) - self._data = _CoverageDataPlacebo() + self._data = None self._inited_for_start = False def switch_context(self, new_context: str) -> None: @@ -686,6 +697,7 @@ def switch_context(self, new_context: str) -> None: if not self._started: # pragma: part started raise CoverageException("Cannot switch context, coverage is not started") + assert self._collector is not None if self._collector.should_start_context: self._warn("Conflicting dynamic contexts", slug="dynamic-conflict", once=True) @@ -791,6 +803,7 @@ def combine( self._post_init() self.get_data() + assert self._data is not None combine_parallel_data( self._data, aliases=self._make_aliases(), @@ -814,13 +827,15 @@ def get_data(self) -> CoverageData: self._init_data(suffix=None) self._post_init() - for plugin in self._plugins: - if not plugin._coverage_enabled: - self._collector.plugin_was_disabled(plugin) + if self._collector is not None: + for plugin in self._plugins: + if not plugin._coverage_enabled: + self._collector.plugin_was_disabled(plugin) - if self._collector.flush_data(): - self._post_save_work() + if self._collector.flush_data(): + self._post_save_work() + assert self._data is not None return self._data def _post_save_work(self) -> None: @@ -830,6 +845,9 @@ def _post_save_work(self) -> None: Look for un-executed files. """ + assert self._data is not None + assert self._inorout is not None + # If there are still entries in the source_pkgs_unmatched list, # then we never encountered those packages. if self._warn_unimported_source: @@ -903,6 +921,7 @@ def _analyze(self, it: Union[FileReporter, TMorf]) -> Analysis: def _get_file_reporter(self, morf: TMorf) -> FileReporter: """Get a FileReporter for a module or file name.""" + assert self._data is not None plugin = None file_reporter: Union[str, FileReporter] = "python" @@ -938,6 +957,7 @@ def _get_file_reporters(self, morfs: Optional[Iterable[TMorf]] = None) -> List[F measured is used to find the FileReporters. """ + assert self._data is not None if not morfs: morfs = self._data.measured_files() @@ -952,7 +972,8 @@ def _prepare_data_for_reporting(self) -> None: """Re-map data before reporting, to get implicit 'combine' behavior.""" if self.config.paths: mapped_data = CoverageData(warn=self._warn, debug=self._debug, no_disk=True) - mapped_data.update(self._data, aliases=self._make_aliases()) + if self._data is not None: + mapped_data.update(self._data, aliases=self._make_aliases()) self._data = mapped_data def report( @@ -1256,7 +1277,7 @@ def plugin_info(plugins: List[Any]) -> List[str]: info = [ ('coverage_version', covmod.__version__), ('coverage_module', covmod.__file__), - ('tracer', self._collector.tracer_name()), + ('tracer', self._collector.tracer_name() if self._collector is not None else "-none-"), ('CTracer', 'available' if HAS_CTRACER else "unavailable"), ('plugins.file_tracers', plugin_info(self._plugins.file_tracers)), ('plugins.configurers', plugin_info(self._plugins.configurers)), @@ -1267,7 +1288,7 @@ def plugin_info(plugins: List[Any]) -> List[str]: ('config_contents', repr(self.config._config_contents) if self.config._config_contents else '-none-' ), - ('data_file', self._data.data_filename()), + ('data_file', self._data.data_filename() if self._data is not None else "-none-"), ('python', sys.version.replace('\n', '')), ('platform', platform.platform()), ('implementation', platform.python_implementation()), @@ -1288,44 +1309,14 @@ def plugin_info(plugins: List[Any]) -> List[str]: ('command_line', " ".join(getattr(sys, 'argv', ['-none-']))), ] - info.extend(self._inorout.sys_info()) + if self._inorout is not None: + info.extend(self._inorout.sys_info()) + info.extend(CoverageData.sys_info()) return info -class _Placebo: - """Base class for placebos, to prevent calling the real base class __init__.""" - def __init__(self) -> None: - ... - - -class _CoverageDataPlacebo(_Placebo, CoverageData): - """Just enough of a CoverageData to be used when we don't have a real one.""" - _real = False - - def data_filename(self) -> str: - return "-none-" - - -class _CollectorPlacebo(_Placebo, Collector): - """Just enough of a Collector to be used when we don't have a real one.""" - def reset(self) -> None: - ... - - def flush_data(self) -> bool: - return False - - def tracer_name(self) -> str: - return "-none-" - - -class _InOrOutPlacebo(_Placebo, InOrOut): - """Just enough of an InOrOut to be used when we don't have a real one.""" - def sys_info(self) -> Iterable[Tuple[str, Any]]: - return [] - - # Mega debugging... # $set_env.py: COVERAGE_DEBUG_CALLS - Lots and lots of output about calls to Coverage. if int(os.environ.get("COVERAGE_DEBUG_CALLS", 0)): # pragma: debugging diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 15b30ae90..42cf4501d 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -212,8 +212,6 @@ class CoverageData(AutoReprMixin): """ - _real = True # to distinguish from a placebo in control.py - def __init__( self, basename: Optional[FilePath] = None, diff --git a/tests/test_oddball.py b/tests/test_oddball.py index e4147dc6c..2bcb42766 100644 --- a/tests/test_oddball.py +++ b/tests/test_oddball.py @@ -124,6 +124,7 @@ def recur(n): with swallow_warnings("Trace function changed, data is likely wrong: None"): self.start_import_stop(cov, "recur") + assert cov._collector is not None pytrace = (cov._collector.tracer_name() == "PyTracer") expected_missing = [3] if pytrace: # pragma: no metacov From 7887212bda71bd2e3181bd692d2f521428bbb6c0 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 14 Feb 2023 05:47:43 -0500 Subject: [PATCH 25/43] build: pin setuptools to avoid their version-checking bug https://github.com/pypa/packaging/issues/678 Nightly builds were failing because newer setuptools didn't like the Python version number: ``` % .tox/anypy/bin/python -c "import pkg_resources as p; p.load_entry_point('coverage', 'console_scripts', 'coverage')()" Traceback (most recent call last): File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2711, in _dep_map return self.__dep_map ^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2826, in __getattr__ raise AttributeError(attr) AttributeError: _Distribution__dep_map During handling of the above exception, another exception occurred: Traceback (most recent call last): File "", line 1, in File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 522, in load_entry_point return get_distribution(dist).load_entry_point(group, name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2855, in load_entry_point return ep.load() ^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2467, in load self.require(*args, **kwargs) File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2489, in require reqs = self.dist.requires(self.extras) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2746, in requires dm = self._dep_map ^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2713, in _dep_map self.__dep_map = self._filter_extras(self._build_dep_map()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2728, in _filter_extras invalid_marker(marker) or not evaluate_marker(marker) ^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 1415, in invalid_marker evaluate_marker(text) File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/__init__.py", line 1433, in evaluate_marker return marker.evaluate() ^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/_vendor/packaging/markers.py", line 245, in evaluate return _evaluate_markers(self._markers, current_environment) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/_vendor/packaging/markers.py", line 151, in _evaluate_markers groups[-1].append(_eval_op(lhs_value, op, rhs_value)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/_vendor/packaging/markers.py", line 109, in _eval_op return spec.contains(lhs, prereleases=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/_vendor/packaging/specifiers.py", line 565, in contains normalized_item = _coerce_version(item) ^^^^^^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/_vendor/packaging/specifiers.py", line 36, in _coerce_version version = Version(version) ^^^^^^^^^^^^^^^^ File "/Users/nedbatchelder/coverage/trunk/.tox/anypy/lib/python3.12/site-packages/pkg_resources/_vendor/packaging/version.py", line 197, in __init__ raise InvalidVersion(f"Invalid version: '{version}'") pkg_resources.extern.packaging.version.InvalidVersion: Invalid version: '3.12.0a5+' ``` --- doc/requirements.pip | 18 ++++++++----- requirements/dev.pip | 44 ++++++++++++++++--------------- requirements/kit.pip | 16 +++++++----- requirements/light-threads.pip | 17 +++++++----- requirements/lint.pip | 47 ++++++++++++++++++---------------- requirements/mypy.pip | 12 ++++----- requirements/pins.pip | 5 ++++ requirements/pip-tools.pip | 26 +++++++++++-------- requirements/pip.in | 1 + requirements/pip.pip | 20 ++++++++++----- requirements/pytest.pip | 12 ++++----- requirements/tox.pip | 6 ++--- 12 files changed, 128 insertions(+), 96 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index fe681f159..875333d05 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -241,10 +241,6 @@ scriv==1.2.0 \ --hash=sha256:26b65a903da7d9aefc712a0d4150b8638302b4758bd428bbd773dd918c61c621 \ --hash=sha256:bb61c30fea73158a4d18c28bbb57821c308245683efb0d897bd45e4a7856b472 # via -r doc/requirements.in -setuptools==67.2.0 \ - --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ - --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 - # via sphinxcontrib-jquery six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -327,7 +323,15 @@ urllib3==1.26.14 \ --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \ --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1 # via requests -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via + # -c doc/../requirements/pins.pip + # sphinxcontrib-jquery diff --git a/requirements/dev.pip b/requirements/dev.pip index af6838299..c19b00138 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -4,9 +4,9 @@ # # make upgrade # -astroid==2.14.1 \ - --hash=sha256:23c718921acab5f08cbbbe9293967f1f8fec40c336d19cd75dc12a9ea31d2eb2 \ - --hash=sha256:bd1aa4f9915c98e8aaebcd4e71930154d4e8c9aaf05d35ac0a63d1956091ae3f +astroid==2.14.2 \ + --hash=sha256:0e0e3709d64fbffd3037e4ff403580550f14471fd3eaae9fa11cc9a5c7901153 \ + --hash=sha256:a3cf9f02c53dd259144a7e8f3ccd75d67c9a8c716ef183e0c1f291bc5d7bb3cf # via pylint attrs==22.2.0 \ --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ @@ -246,9 +246,9 @@ greenlet==2.0.2 \ --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 # via -r requirements/dev.in -hypothesis==6.68.0 \ - --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ - --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 +hypothesis==6.68.1 \ + --hash=sha256:3ff6076920e61d4e6362e93edaf09be3034ea7e39e3a75e731d4d1c525dafd84 \ + --hash=sha256:b37bd77b4b7f404a59ff965e24be8aec4209323866e34ececdf416522c6d0854 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -369,10 +369,6 @@ parso==0.8.3 \ --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 # via jedi -pip==23.0 \ - --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ - --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c - # via -r requirements/pip.pip pkginfo==1.9.6 \ --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 @@ -404,9 +400,9 @@ pygments==2.14.0 \ # pudb # readme-renderer # rich -pylint==2.16.1 \ - --hash=sha256:bad9d7c36037f6043a1e848a43004dfd5ea5ceb05815d713ba56ca4503a9fe37 \ - --hash=sha256:ffe7fa536bb38ba35006a7c8a6d2efbfdd3d95bbf21199cad31f76b1c50aaf30 +pylint==2.16.2 \ + --hash=sha256:13b2c805a404a9bf57d002cd5f054ca4d40b0b87542bdaba5e05321ae8262c84 \ + --hash=sha256:ff22dde9c2128cd257c145cfd51adeff0be7df4d80d669055f24a962b351bbe4 # via -r requirements/dev.in pyproject-api==1.5.0 \ --hash=sha256:0962df21f3e633b8ddb9567c011e6c1b3dcdfc31b7860c0ede7e24c5a1200fbe \ @@ -453,10 +449,6 @@ rich==13.3.1 \ --hash=sha256:125d96d20c92b946b983d0d392b84ff945461e5a06d3867e9f9e575f8697b67f \ --hash=sha256:8aa57747f3fc3e977684f0176a88e789be314a99f99b43b75d1e9cb5dc6db9e9 # via twine -setuptools==67.2.0 \ - --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ - --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 - # via check-manifest six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -628,11 +620,23 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via # -r requirements/pip.pip # -r requirements/pytest.pip # importlib-metadata # importlib-resources + +# The following packages are considered to be unsafe in a requirements file: +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c + # via -r requirements/pip.pip +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via + # -r requirements/pip.pip + # check-manifest diff --git a/requirements/kit.pip b/requirements/kit.pip index f19412bc7..25193660d 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -60,10 +60,6 @@ pyproject-hooks==1.0.0 \ --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 # via build -setuptools==67.2.0 \ - --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ - --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 - # via -r requirements/kit.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f @@ -82,7 +78,13 @@ wheel==0.38.4 \ --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via -r requirements/kit.in -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via -r requirements/kit.in diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 6beecd327..7cf23c3dc 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -201,13 +201,6 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -setuptools==67.2.0 \ - --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ - --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 - # via - # gevent - # zope-event - # zope-interface six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -254,3 +247,13 @@ zope-interface==5.5.2 \ --hash=sha256:f98d4bd7bbb15ca701d19b93263cc5edfd480c3475d163f137385f49e5b3a3a7 \ --hash=sha256:fb68d212efd057596dee9e6582daded9f8ef776538afdf5feceb3059df2d2e7b # via gevent + +# The following packages are considered to be unsafe in a requirements file: +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via + # -c requirements/pins.pip + # gevent + # zope-event + # zope-interface diff --git a/requirements/lint.pip b/requirements/lint.pip index 3f4e8ff8f..d5579466f 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -8,9 +8,9 @@ alabaster==0.7.13 \ --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \ --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2 # via sphinx -astroid==2.14.1 \ - --hash=sha256:23c718921acab5f08cbbbe9293967f1f8fec40c336d19cd75dc12a9ea31d2eb2 \ - --hash=sha256:bd1aa4f9915c98e8aaebcd4e71930154d4e8c9aaf05d35ac0a63d1956091ae3f +astroid==2.14.2 \ + --hash=sha256:0e0e3709d64fbffd3037e4ff403580550f14471fd3eaae9fa11cc9a5c7901153 \ + --hash=sha256:a3cf9f02c53dd259144a7e8f3ccd75d67c9a8c716ef183e0c1f291bc5d7bb3cf # via pylint attrs==22.2.0 \ --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ @@ -271,9 +271,9 @@ greenlet==2.0.2 \ --hash=sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1 \ --hash=sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526 # via -r requirements/dev.in -hypothesis==6.68.0 \ - --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ - --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 +hypothesis==6.68.1 \ + --hash=sha256:3ff6076920e61d4e6362e93edaf09be3034ea7e39e3a75e731d4d1c525dafd84 \ + --hash=sha256:b37bd77b4b7f404a59ff965e24be8aec4209323866e34ececdf416522c6d0854 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -464,10 +464,6 @@ parso==0.8.3 \ --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 # via jedi -pip==23.0 \ - --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ - --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c - # via -r requirements/pip.pip pkginfo==1.9.6 \ --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 @@ -508,9 +504,9 @@ pygments==2.14.0 \ # readme-renderer # rich # sphinx -pylint==2.16.1 \ - --hash=sha256:bad9d7c36037f6043a1e848a43004dfd5ea5ceb05815d713ba56ca4503a9fe37 \ - --hash=sha256:ffe7fa536bb38ba35006a7c8a6d2efbfdd3d95bbf21199cad31f76b1c50aaf30 +pylint==2.16.2 \ + --hash=sha256:13b2c805a404a9bf57d002cd5f054ca4d40b0b87542bdaba5e05321ae8262c84 \ + --hash=sha256:ff22dde9c2128cd257c145cfd51adeff0be7df4d80d669055f24a962b351bbe4 # via -r requirements/dev.in pyproject-api==1.5.0 \ --hash=sha256:0962df21f3e633b8ddb9567c011e6c1b3dcdfc31b7860c0ede7e24c5a1200fbe \ @@ -567,12 +563,6 @@ scriv==1.2.0 \ --hash=sha256:26b65a903da7d9aefc712a0d4150b8638302b4758bd428bbd773dd918c61c621 \ --hash=sha256:bb61c30fea73158a4d18c28bbb57821c308245683efb0d897bd45e4a7856b472 # via -r doc/requirements.in -setuptools==67.2.0 \ - --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ - --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 - # via - # check-manifest - # sphinxcontrib-jquery six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -816,11 +806,24 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via # -r requirements/pip.pip # -r requirements/pytest.pip # importlib-metadata # importlib-resources + +# The following packages are considered to be unsafe in a requirements file: +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c + # via -r requirements/pip.pip +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via + # -r requirements/pip.pip + # check-manifest + # sphinxcontrib-jquery diff --git a/requirements/mypy.pip b/requirements/mypy.pip index 026821bd8..3e846de95 100644 --- a/requirements/mypy.pip +++ b/requirements/mypy.pip @@ -32,9 +32,9 @@ flaky==3.7.0 \ --hash=sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d \ --hash=sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c # via -r requirements/pytest.pip -hypothesis==6.68.0 \ - --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ - --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 +hypothesis==6.68.1 \ + --hash=sha256:3ff6076920e61d4e6362e93edaf09be3034ea7e39e3a75e731d4d1c525dafd84 \ + --hash=sha256:b37bd77b4b7f404a59ff965e24be8aec4209323866e34ececdf416522c6d0854 # via -r requirements/pytest.pip importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ @@ -149,9 +149,9 @@ typing-extensions==4.4.0 \ # -r requirements/pytest.pip # importlib-metadata # mypy -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via # -r requirements/pytest.pip # importlib-metadata diff --git a/requirements/pins.pip b/requirements/pins.pip index 4ecea4264..95db58812 100644 --- a/requirements/pins.pip +++ b/requirements/pins.pip @@ -6,3 +6,8 @@ # docutils has been going through some turmoil. Different packages require it, # but have different pins. This seems to satisfy them all: #docutils>=0.17,<0.18 + +# Setuptools became stricter about version number syntax. But it shouldn't be +# checking the Python version like that, should it? +# https://github.com/pypa/packaging/issues/678 +setuptools<66.0.0 diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 2cfa5ca71..a6d9ab148 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -22,10 +22,6 @@ packaging==23.0 \ --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ --hash=sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97 # via build -pip==23.0 \ - --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ - --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c - # via pip-tools pip-tools==6.12.2 \ --hash=sha256:6a51f4fd67140d5e83703ebfa9610fb61398727151f56a1be02a972d062e4679 \ --hash=sha256:8b903696df4598b10d469026ef9995c5f9a874b416e88e7a214884ebe4a70245 @@ -34,10 +30,6 @@ pyproject-hooks==1.0.0 \ --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 # via build -setuptools==67.2.0 \ - --hash=sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c \ - --hash=sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48 - # via pip-tools tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f @@ -52,7 +44,19 @@ wheel==0.38.4 \ --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via pip-tools -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c + # via pip-tools +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via + # -c requirements/pins.pip + # pip-tools diff --git a/requirements/pip.in b/requirements/pip.in index 15f119912..b2adbf5b5 100644 --- a/requirements/pip.in +++ b/requirements/pip.in @@ -6,4 +6,5 @@ # "make upgrade" turns this into requirements/pip.pip. pip +setuptools virtualenv diff --git a/requirements/pip.pip b/requirements/pip.pip index 8b746308d..e41964177 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -16,10 +16,6 @@ importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d # via virtualenv -pip==23.0 \ - --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ - --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c - # via -r requirements/pip.in platformdirs==3.0.0 \ --hash=sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9 \ --hash=sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567 @@ -34,7 +30,17 @@ virtualenv==20.19.0 \ --hash=sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590 \ --hash=sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1 # via -r requirements/pip.in -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +pip==23.0 \ + --hash=sha256:aee438284e82c8def684b0bcc50b1f6ed5e941af97fa940e83e2e8ef1a59da9b \ + --hash=sha256:b5f88adff801f5ef052bcdef3daa31b55eb67b0fccd6d0106c206fa248e0463c + # via -r requirements/pip.in +setuptools==65.7.0 \ + --hash=sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7 \ + --hash=sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd + # via -r requirements/pip.in diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 11e1c3ac7..8bd50f12e 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -28,9 +28,9 @@ flaky==3.7.0 \ --hash=sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d \ --hash=sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c # via -r requirements/pytest.in -hypothesis==6.68.0 \ - --hash=sha256:064a5bf7a98cbdfa3589d8934a2c548524c6d108bfa368ec5ed8b09caa526108 \ - --hash=sha256:8cfa1de15271debb2750545a460e58e3e84527d94157f38ab9309826953572f3 +hypothesis==6.68.1 \ + --hash=sha256:3ff6076920e61d4e6362e93edaf09be3034ea7e39e3a75e731d4d1c525dafd84 \ + --hash=sha256:b37bd77b4b7f404a59ff965e24be8aec4209323866e34ececdf416522c6d0854 # via -r requirements/pytest.in importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ @@ -72,7 +72,7 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via importlib-metadata diff --git a/requirements/tox.pip b/requirements/tox.pip index d52a1b6f5..2e354ffdc 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -82,7 +82,7 @@ virtualenv==20.19.0 \ --hash=sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590 \ --hash=sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1 # via tox -zipp==3.12.1 \ - --hash=sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3 \ - --hash=sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02 +zipp==3.13.0 \ + --hash=sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6 \ + --hash=sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b # via importlib-metadata From 9c40c3e838cb3f0d27aff3d2f5bb7e1a30226f0c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 14 Feb 2023 08:08:52 -0500 Subject: [PATCH 26/43] docs: keep track of an issue I wrote that this pin avoids --- requirements/pins.pip | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/pins.pip b/requirements/pins.pip index 95db58812..b614c3119 100644 --- a/requirements/pins.pip +++ b/requirements/pins.pip @@ -10,4 +10,5 @@ # Setuptools became stricter about version number syntax. But it shouldn't be # checking the Python version like that, should it? # https://github.com/pypa/packaging/issues/678 +# https://github.com/nedbat/coveragepy/issues/1556 setuptools<66.0.0 From 946e0cfc562953a56bb13b144639b8dc194b43f8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 14 Feb 2023 21:11:19 -0500 Subject: [PATCH 27/43] docs: bye twitter, hello mastodon --- README.rst | 11 ++++------- doc/index.rst | 5 ++++- howto.txt | 3 --- setup.py | 4 ++-- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/README.rst b/README.rst index 1ca0210db..960588422 100644 --- a/README.rst +++ b/README.rst @@ -18,7 +18,7 @@ Code coverage testing for Python. | |kit| |downloads| |format| |repos| | |stars| |forks| |contributors| | |core-infrastructure| |open-ssf| |snyk| -| |tidelift| |sponsor| |twitter-coveragepy| |twitter-nedbat| |mastodon-nedbat| +| |tidelift| |sponsor| |mastodon-coveragepy| |mastodon-nedbat| Coverage.py measures code coverage, typically during test execution. It uses the code analysis tools and tracing hooks provided in the Python standard @@ -166,12 +166,9 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_. .. |mastodon-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&link=https%3A%2F%2Fhachyderm.io%2F%40nedbat&url=https%3A%2F%2Fhachyderm.io%2Fusers%2Fnedbat%2Ffollowers.json&query=totalItems&label=Mastodon :target: https://hachyderm.io/@nedbat :alt: nedbat on Mastodon -.. |twitter-coveragepy| image:: https://img.shields.io/twitter/follow/coveragepy.svg?label=coveragepy&style=flat&logo=twitter&logoColor=4FADFF - :target: https://twitter.com/coveragepy - :alt: coverage.py on Twitter -.. |twitter-nedbat| image:: https://img.shields.io/twitter/follow/nedbat.svg?label=nedbat&style=flat&logo=twitter&logoColor=4FADFF - :target: https://twitter.com/nedbat - :alt: nedbat on Twitter +.. |mastodon-coveragepy| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&link=https%3A%2F%2Fhachyderm.io%2F%40coveragepy&url=https%3A%2F%2Fhachyderm.io%2Fusers%2Fcoveragepy%2Ffollowers.json&query=totalItems&label=Mastodon + :target: https://hachyderm.io/@coveragepy + :alt: coveragepy on Mastodon .. |sponsor| image:: https://img.shields.io/badge/%E2%9D%A4-Sponsor%20me-brightgreen?style=flat&logo=GitHub :target: https://github.com/sponsors/nedbat :alt: Sponsor me on GitHub diff --git a/doc/index.rst b/doc/index.rst index 62acaebb9..8646d0958 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -26,9 +26,9 @@ supported on: **This is a pre-release build. The usual warnings about possible bugs apply.** The latest stable version is coverage.py 6.5.0, `described here`_. - .. _described here: http://coverage.readthedocs.io/ + For Enterprise -------------- @@ -207,7 +207,10 @@ using coverage.py. .. _I can be reached: https://nedbatchelder.com/site/aboutned.html +.. raw:: html +

For news and other chatter, follow the project on Mastodon: + @coveragepy@hachyderm.io.

More information ---------------- diff --git a/howto.txt b/howto.txt index 9b5893ecc..105547e86 100644 --- a/howto.txt +++ b/howto.txt @@ -78,9 +78,6 @@ - wait for the new tag build to finish successfully. - @ https://readthedocs.org/dashboard/coverage/advanced/ - change the default version to the new version -- Announce: - - twitter @coveragepy - - nedbatchelder.com blog post? - things to automate: - url to link to latest changes in docs - next version.py line diff --git a/setup.py b/setup.py index bccb88196..2c375522d 100644 --- a/setup.py +++ b/setup.py @@ -127,8 +127,8 @@ '?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi' ), 'Issues': 'https://github.com/nedbat/coveragepy/issues', - 'Mastodon': 'https://hachyderm.io/@nedbat', - 'Twitter': 'https://twitter.com/coveragepy', + 'Mastodon': 'https://hachyderm.io/@coveragepy', + 'Mastodon (nedbat)': 'https://hachyderm.io/@nedbat', }, python_requires=">=3.7", # minimum of PYVERSIONS ) From 545d8bc2ae37cf0d203ea3555547e35a4d34346e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 15 Feb 2023 08:21:06 -0500 Subject: [PATCH 28/43] docs: better mastodon labels, and 3.12a5 --- README.rst | 9 +++++---- doc/index.rst | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 960588422..1f01a62e9 100644 --- a/README.rst +++ b/README.rst @@ -28,7 +28,7 @@ Coverage.py runs on these versions of Python: .. PYVERSIONS -* CPython 3.7 through 3.12.0a3 +* CPython 3.7 through 3.12.0a5 * PyPy3 7.3.11. Documentation is on `Read the Docs`_. Code repository and issue tracker are on @@ -39,7 +39,8 @@ Documentation is on `Read the Docs`_. Code repository and issue tracker are on **New in 7.x:** improved data combining; -``report --format=``. +``report --format=``; +type annotations. **New in 6.x:** dropped support for Python 2.7, 3.5, and 3.6; @@ -163,10 +164,10 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_. .. |contributors| image:: https://img.shields.io/github/contributors/nedbat/coveragepy.svg?logo=github :target: https://github.com/nedbat/coveragepy/graphs/contributors :alt: Contributors -.. |mastodon-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&link=https%3A%2F%2Fhachyderm.io%2F%40nedbat&url=https%3A%2F%2Fhachyderm.io%2Fusers%2Fnedbat%2Ffollowers.json&query=totalItems&label=Mastodon +.. |mastodon-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&link=https%3A%2F%2Fhachyderm.io%2F%40nedbat&url=https%3A%2F%2Fhachyderm.io%2Fusers%2Fnedbat%2Ffollowers.json&query=totalItems&label=@nedbat :target: https://hachyderm.io/@nedbat :alt: nedbat on Mastodon -.. |mastodon-coveragepy| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&link=https%3A%2F%2Fhachyderm.io%2F%40coveragepy&url=https%3A%2F%2Fhachyderm.io%2Fusers%2Fcoveragepy%2Ffollowers.json&query=totalItems&label=Mastodon +.. |mastodon-coveragepy| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&link=https%3A%2F%2Fhachyderm.io%2F%40coveragepy&url=https%3A%2F%2Fhachyderm.io%2Fusers%2Fcoveragepy%2Ffollowers.json&query=totalItems&label=@coveragepy :target: https://hachyderm.io/@coveragepy :alt: coveragepy on Mastodon .. |sponsor| image:: https://img.shields.io/badge/%E2%9D%A4-Sponsor%20me-brightgreen?style=flat&logo=GitHub diff --git a/doc/index.rst b/doc/index.rst index 8646d0958..2b2f45bde 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,7 +18,7 @@ supported on: .. PYVERSIONS -* Python versions 3.7 through 3.12.0a3. +* Python versions 3.7 through 3.12.0a5. * PyPy3 7.3.11. .. ifconfig:: prerelease From 51f395dc29811cd7ab465c527a5a06514b0090b8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 22 Feb 2023 05:55:56 -0500 Subject: [PATCH 29/43] test: stricter regex to avoid false CodeQL alarms Will fix: https://github.com/nedbat/coveragepy/security/code-scanning/3 https://github.com/nedbat/coveragepy/security/code-scanning/4 (though tbh, not sure how to close those as fixed?) --- tests/test_html.py | 4 ++-- tests/test_xml.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_html.py b/tests/test_html.py index 8893993cb..5113cd06e 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -663,8 +663,8 @@ def compare_html( """Specialized compare function for our HTML files.""" __tracebackhide__ = True # pytest, please don't show me this function. scrubs = [ - (r'/coverage.readthedocs.io/?[-.\w/]*', '/coverage.readthedocs.io/VER'), - (r'coverage.py v[\d.abcdev]+', 'coverage.py vVER'), + (r'/coverage\.readthedocs\.io/?[-.\w/]*', '/coverage.readthedocs.io/VER'), + (r'coverage\.py v[\d.abcdev]+', 'coverage.py vVER'), (r'created at \d\d\d\d-\d\d-\d\d \d\d:\d\d [-+]\d\d\d\d', 'created at DATE'), (r'created at \d\d\d\d-\d\d-\d\d \d\d:\d\d', 'created at DATE'), # Occasionally an absolute path is in the HTML report. diff --git a/tests/test_xml.py b/tests/test_xml.py index 005f9d5a0..c21a9dd4a 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -465,7 +465,7 @@ def compare_xml(expected: str, actual: str, actual_extra: bool = False) -> None: (r' timestamp="\d+"', ' timestamp="TIMESTAMP"'), (r' version="[-.\w]+"', ' version="VERSION"'), (r'\s*.*?\s*', '%s' % re.escape(source_path)), - (r'/coverage.readthedocs.io/?[-.\w/]*', '/coverage.readthedocs.io/VER'), + (r'/coverage\.readthedocs\.io/?[-.\w/]*', '/coverage.readthedocs.io/VER'), ] compare(expected, actual, scrubs=scrubs, actual_extra=actual_extra) From 2a0e7bc17f932e33ef9c437760ae2f9f60b46390 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Wed, 15 Feb 2023 21:15:17 -0800 Subject: [PATCH 30/43] feat: add extend_exclude option --- coverage/config.py | 3 +++ doc/config.rst | 14 ++++++++++++-- doc/excluding.rst | 4 +++- tests/test_config.py | 9 +++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/coverage/config.py b/coverage/config.py index e15d2affc..9518e5356 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -215,6 +215,7 @@ def __init__(self) -> None: # Defaults for [report] self.exclude_list = DEFAULT_EXCLUDE[:] + self.exclude_also: List[str] = [] self.fail_under = 0.0 self.format: Optional[str] = None self.ignore_errors = False @@ -392,6 +393,7 @@ def copy(self) -> CoverageConfig: # [report] ('exclude_list', 'report:exclude_lines', 'regexlist'), + ('exclude_also', 'report:exclude_also', 'regexlist'), ('fail_under', 'report:fail_under', 'float'), ('format', 'report:format', 'boolean'), ('ignore_errors', 'report:ignore_errors', 'boolean'), @@ -523,6 +525,7 @@ def post_process(self) -> None: (k, [self.post_process_file(f) for f in v]) for k, v in self.paths.items() ) + self.exclude_list += self.exclude_also def debug_info(self) -> List[Tuple[str, Any]]: """Make a list of (name, value) pairs for writing debug info.""" diff --git a/doc/config.rst b/doc/config.rst index 8e3d885be..5b159d900 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -381,7 +381,7 @@ Settings common to many kinds of reporting. ...................... (multi-string) A list of regular expressions. Any line of your source code -containing a match for one of these regexes is excluded from being reported as +containing a match for one of these regexes is excluded from being reported as missing. More details are in :ref:`excluding`. If you use this option, you are replacing all the exclude regexes, so you'll need to also supply the "pragma: no cover" regex if you still want to use it. @@ -395,12 +395,22 @@ you'll exclude any line with three or more of any character. If you write ``pass``, you'll also exclude the line ``my_pass="foo"``, and so on. +.. _config_report_exclude_also: + +[report] exclude_also +..................... + +(multi-string) A list of regular expressions. This setting will preserve the +default exclude pattern instead of overwriting it. See +:ref:`config_report_exclude_lines` for details on exclusion regexes. + + .. _config_report_fail_under: [report] fail_under ................... -(float) A target coverage percentage. If the total coverage measurement is +(float) A target coverage percentage. If the total coverage measurement is under this value, then exit with a status code of 2. If you specify a non-integral value, you must also set ``[report] precision`` properly to make use of the decimal places. A setting of 100 will fail any value under 100, diff --git a/doc/excluding.rst b/doc/excluding.rst index 315d4e290..4651e6bba 100644 --- a/doc/excluding.rst +++ b/doc/excluding.rst @@ -101,7 +101,9 @@ For example, here's a list of exclusions I've used:: Note that when using the ``exclude_lines`` option in a configuration file, you are taking control of the entire list of regexes, so you need to re-specify the -default "pragma: no cover" match if you still want it to apply. +default "pragma: no cover" match if you still want it to apply. The +``exclude_also`` option can be used instead to preserve the default +exclusions while adding new ones. The regexes only have to match part of a line. Be careful not to over-match. A value of ``...`` will match any line with more than three characters in it. diff --git a/tests/test_config.py b/tests/test_config.py index 2ee5eae08..2befa2e3b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -449,6 +449,15 @@ def test_exceptions_from_missing_things(self) -> None: with pytest.raises(ConfigError, match="No option 'foo' in section: 'xyzzy'"): config.get("xyzzy", "foo") + def test_exclude_also(self) -> None: + self.make_file("pyproject.toml", """\ + [tool.coverage.report] + exclude_also = ["foobar"] + """) + cov = coverage.Coverage() + + assert cov.config.exclude_list == coverage.config.DEFAULT_EXCLUDE + ["foobar"] + class ConfigFileTest(UsingModulesMixin, CoverageTest): """Tests of the config file settings in particular.""" From cc0c0ea4b2af02e8bf4c21f708afa6988e1b4fda Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 22 Feb 2023 17:13:40 -0500 Subject: [PATCH 31/43] docs: final paperwork for exclude_also #1557 --- CHANGES.rst | 7 +++++++ CONTRIBUTORS.txt | 1 + doc/config.rst | 9 ++++++--- tests/test_config.py | 5 +++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1c27501da..d2db59c98 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,6 +20,10 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- +- Added a new setting ``[report] exclude_also`` to let you add more exclusions + without overwriting the defaults. Thanks, `Alpha Chen `_, + closing `issue 1391_`. + - Added a :meth:`.CoverageData.purge_files` method to remove recorded data for a particular file. Contributed by `Stephan Deibel `_. @@ -39,11 +43,14 @@ Unreleased - Added a ``py.typed`` file to announce our type-hintedness. Thanks, `KotlinIsland `_. +.. _issue 1391: https://github.com/nedbat/coveragepy/issues/1391 .. _issue 1542: https://github.com/nedbat/coveragepy/issues/1542 .. _pull 1543: https://github.com/nedbat/coveragepy/pull/1543 .. _pull 1547: https://github.com/nedbat/coveragepy/pull/1547 .. _pull 1550: https://github.com/nedbat/coveragepy/pull/1550 .. _issue 1552: https://github.com/nedbat/coveragepy/issues/1552 +.. _pull 1557: https://github.com/nedbat/coveragepy/pull/1557 + .. scriv-start-here diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 8889ed612..f9f028a4d 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -14,6 +14,7 @@ Alex Groce Alex Sandro Alexander Todorov Alexander Walters +Alpha Chen Ammar Askar Andrew Hoos Anthony Sottile diff --git a/doc/config.rst b/doc/config.rst index 5b159d900..152b3af48 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -400,9 +400,12 @@ you'll exclude any line with three or more of any character. If you write [report] exclude_also ..................... -(multi-string) A list of regular expressions. This setting will preserve the -default exclude pattern instead of overwriting it. See -:ref:`config_report_exclude_lines` for details on exclusion regexes. +(multi-string) A list of regular expressions. This setting is the same as +:ref:`config_report_exclude_lines`: it adds patterns for lines to exclude from +reporting. This setting will preserve the default exclude patterns instead of +overwriting them. + +.. versionadded:: 7.2.0 .. _config_report_fail_under: diff --git a/tests/test_config.py b/tests/test_config.py index 2befa2e3b..6739a426f 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -452,11 +452,12 @@ def test_exceptions_from_missing_things(self) -> None: def test_exclude_also(self) -> None: self.make_file("pyproject.toml", """\ [tool.coverage.report] - exclude_also = ["foobar"] + exclude_also = ["foobar", "raise .*Error"] """) cov = coverage.Coverage() - assert cov.config.exclude_list == coverage.config.DEFAULT_EXCLUDE + ["foobar"] + expected = coverage.config.DEFAULT_EXCLUDE + ["foobar", "raise .*Error"] + assert cov.config.exclude_list == expected class ConfigFileTest(UsingModulesMixin, CoverageTest): From 65dcfc2e86680fd136f826b29f7b777f553755c4 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 22 Feb 2023 18:46:19 -0500 Subject: [PATCH 32/43] docs: prep for 7.2.0 --- CHANGES.rst | 10 ++++++---- coverage/version.py | 4 ++-- doc/conf.py | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index d2db59c98..d62d8f5f6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,8 +17,12 @@ development at the same time, such as 4.5.x and 5.0. .. Version 9.8.1 — 2027-07-27 .. -------------------------- -Unreleased ----------- +.. scriv-start-here + +.. _changes_7-2-0: + +Version 7.2.0 — 2023-02-22 +-------------------------- - Added a new setting ``[report] exclude_also`` to let you add more exclusions without overwriting the defaults. Thanks, `Alpha Chen `_, @@ -52,8 +56,6 @@ Unreleased .. _pull 1557: https://github.com/nedbat/coveragepy/pull/1557 -.. scriv-start-here - .. _changes_7-1-0: Version 7.1.0 — 2023-01-24 diff --git a/coverage/version.py b/coverage/version.py index effb063df..592ae30ba 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -8,8 +8,8 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (7, 2, 0, "alpha", 0) -_dev = 1 +version_info = (7, 2, 0, "final", 0) +_dev = 0 def _make_version( diff --git a/doc/conf.py b/doc/conf.py index 9be27efd3..32caae09d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -67,11 +67,11 @@ # @@@ editable copyright = "2009–2023, Ned Batchelder" # pylint: disable=redefined-builtin # The short X.Y.Z version. -version = "7.1.0" +version = "7.2.0" # The full version, including alpha/beta/rc tags. -release = "7.1.0" +release = "7.2.0" # The date of release, in "monthname day, year" format. -release_date = "January 24, 2023" +release_date = "February 22, 2023" # @@@ end rst_epilog = """ From 152890c710747bada1a146de47af77c1b1ee1b5e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 22 Feb 2023 18:50:06 -0500 Subject: [PATCH 33/43] build: cog moved --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a3028b8bf..7f6959208 100644 --- a/Makefile +++ b/Makefile @@ -131,7 +131,7 @@ prebuild: css workflows cogdoc ## One command for all source prep. _sample_cog_html: clean python -m pip install -e . - cd ~/cog/trunk; \ + cd ~/cog; \ rm -rf htmlcov; \ PYTEST_ADDOPTS= coverage run --branch --source=cogapp -m pytest -k CogTestsInMemory; \ coverage combine; \ @@ -139,12 +139,12 @@ _sample_cog_html: clean sample_html: _sample_cog_html ## Generate sample HTML report. rm -f doc/sample_html/*.* - cp -r ~/cog/trunk/htmlcov/ doc/sample_html/ + cp -r ~/cog/htmlcov/ doc/sample_html/ rm doc/sample_html/.gitignore sample_html_beta: _sample_cog_html ## Generate sample HTML report for a beta release. rm -f doc/sample_html_beta/*.* - cp -r ~/cog/trunk/htmlcov/ doc/sample_html_beta/ + cp -r ~/cog/htmlcov/ doc/sample_html_beta/ rm doc/sample_html_beta/.gitignore From b14e7f44f4107c310a98cf75dc229041549049d4 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 22 Feb 2023 18:51:07 -0500 Subject: [PATCH 34/43] docs: latest sample html report --- .../d_7b071bdc2a35fa80___init___py.html | 18 +- .../d_7b071bdc2a35fa80___main___py.html | 20 +- .../d_7b071bdc2a35fa80_backward_py.html | 141 - .../d_7b071bdc2a35fa80_cogapp_py.html | 1655 +++--- .../d_7b071bdc2a35fa80_makefiles_py.html | 94 +- .../d_7b071bdc2a35fa80_test_cogapp_py.html | 5012 ++++++++--------- .../d_7b071bdc2a35fa80_test_makefiles_py.html | 251 +- ...d_7b071bdc2a35fa80_test_whiteutils_py.html | 206 +- .../d_7b071bdc2a35fa80_whiteutils_py.html | 150 +- doc/sample_html/index.html | 67 +- doc/sample_html/status.json | 2 +- 11 files changed, 3717 insertions(+), 3899 deletions(-) delete mode 100644 doc/sample_html/d_7b071bdc2a35fa80_backward_py.html diff --git a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html index 7d2c3e89e..125251723 100644 --- a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html +++ b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html @@ -55,8 +55,8 @@

- 2 statements   - + 1 statements   + @@ -66,8 +66,8 @@

^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500

-

- « prev     - ^ index     - » next -       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 -

- - - -
-

1"""Compatibility between Py2 and Py3.""" 

-

2 

-

3import sys 

-

4import unittest 

-

5 

-

6PY3 = sys.version_info[0] == 3 

-

7 

-

8if PY3: 8 ↛ 14line 8 didn't jump to line 14, because the condition on line 8 was never false

-

9 string_types = (str,bytes) 

-

10 bytes_types = (bytes,) 

-

11 def to_bytes(s): 

-

12 return s.encode('utf8') 

-

13else: 

-

14 string_types = (basestring,) 

-

15 bytes_types = (str,) 

-

16 def to_bytes(s): 

-

17 return s 

-

18 

-

19# Pythons 2 and 3 differ on where to get StringIO 

-

20try: 

-

21 from cStringIO import StringIO 

-

22except ImportError: 

-

23 from io import StringIO 

-

24 

-

25 

-

26def unittest_has(method): 

-

27 """Does `unittest.TestCase` have `method` defined?""" 

-

28 return hasattr(unittest.TestCase, method) 

-

29 

-

30 

-

31class TestCase(unittest.TestCase): 

-

32 """Just like unittest.TestCase, but with assert methods added. 

-

33 

-

34 Designed to be compatible with 3.1 unittest. Methods are only defined if 

-

35 `unittest` doesn't have them. 

-

36 

-

37 """ 

-

38 # pylint: disable=missing-docstring 

-

39 

-

40 if not unittest_has('assertRaisesRegex'): 40 ↛ 41line 40 didn't jump to line 41, because the condition on line 40 was never true

-

41 def assertRaisesRegex(self, *args, **kwargs): 

-

42 return self.assertRaisesRegexp(*args, **kwargs) 

-
- - - diff --git a/doc/sample_html/d_7b071bdc2a35fa80_cogapp_py.html b/doc/sample_html/d_7b071bdc2a35fa80_cogapp_py.html index 428edad9b..bc4874ad6 100644 --- a/doc/sample_html/d_7b071bdc2a35fa80_cogapp_py.html +++ b/doc/sample_html/d_7b071bdc2a35fa80_cogapp_py.html @@ -2,7 +2,7 @@ - Coverage for cogapp/cogapp.py: 48.48% + Coverage for cogapp/cogapp.py: 49.01% @@ -12,7 +12,7 @@

Coverage for cogapp/cogapp.py: - 48.48% + 49.01%

- 510 statements   - - + 500 statements   + +

- « prev     + « prev     ^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500

- 27 statements   - - + 22 statements   + +

@@ -66,8 +66,8 @@

^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500

- 849 statements   + 845 statements   - +

@@ -66,8 +66,8 @@

^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500

- 71 statements   - + 70 statements   + @@ -66,8 +66,8 @@

^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500

- 69 statements   - + 68 statements   + @@ -66,8 +66,8 @@

^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500

- 45 statements   - + 43 statements   + @@ -66,8 +66,8 @@

^ index     » next       - coverage.py v7.1.0, - created at 2023-01-24 19:37 -0500 + coverage.py v7.2.0, + created at 2023-02-22 18:50 -0500