From 958301f960248805c20937581e70686e3e123eef Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 29 Sep 2022 17:39:48 -0400 Subject: [PATCH 001/200] build: commenting on fixes should happen before bumping the version --- howto.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/howto.txt b/howto.txt index 01440638e..ec0bd9e7d 100644 --- a/howto.txt +++ b/howto.txt @@ -59,6 +59,9 @@ $ make update_stable - Update GitHub releases: $ make clean github_releases +- Visit the fixed issues on GitHub and mention the version it was fixed in. + $ make comment_on_fixes + - "This is now released as part of [coverage 5.2](https://pypi.org/project/coverage/5.2)." - Bump version: - coverage/version.py - increment version number @@ -77,9 +80,6 @@ - wait for the new tag build to finish successfully. - @ https://readthedocs.org/dashboard/coverage/advanced/ - change the default version to the new version -- Visit the fixed issues on GitHub and mention the version it was fixed in. - $ make comment_on_fixes - - "This is now released as part of [coverage 5.2](https://pypi.org/project/coverage/5.2)." - Announce: - twitter @coveragepy - nedbatchelder.com blog post? From 0a885162775d32d6f8932690fdbd167b45618e03 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 29 Sep 2022 17:39:58 -0400 Subject: [PATCH 002/200] build: bump version --- CHANGES.rst | 6 ++++++ coverage/version.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 6e80b1a98..23399dc30 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. + + .. _changes_6-5-0: Version 6.5.0 — 2022-09-29 diff --git a/coverage/version.py b/coverage/version.py index 418407db0..7e861f4bd 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -5,7 +5,7 @@ # This file is exec'ed in setup.py, don't import anything! # Same semantics as sys.version_info. -version_info = (6, 5, 0, "final", 0) +version_info = (6, 5, 1, "alpha", 0) def _make_version(major, minor, micro, releaselevel, serial): From 8bdaafe103e36ec6428a5bf8d1d6a807a1269a1f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 30 Sep 2022 06:12:59 -0400 Subject: [PATCH 003/200] build: gh releases have pypi link and installation instruction --- ci/github_releases.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/ci/github_releases.py b/ci/github_releases.py index 166011fb3..9a36a586c 100644 --- a/ci/github_releases.py +++ b/ci/github_releases.py @@ -74,15 +74,29 @@ def get_releases(session, repo): releases = { r['tag_name']: r for r in github_paginated(session, url) } return releases +RELEASE_BODY_FMT = """ +{relnote_text} + +--- +PyPI page: [coverage {version}](https://pypi.org/project/coverage/{version}) + +To install: +``` +$ python3 -m pip install coverage=={version} +``` +""" + def release_for_relnote(relnote): """ Turn a release note dict into the data needed by GitHub for a release. """ - tag = relnote['version'] + relnote_text = relnote["text"] + tag = version = relnote["version"] + body = RELEASE_BODY_FMT.format(relnote_text=relnote_text, version=version) return { "tag_name": tag, - "name": tag, - "body": relnote["text"], + "name": version, + "body": body, "draft": False, "prerelease": relnote["prerelease"], } From ad1c59c4b238c8695148355bbb677f2d5f4c2f31 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 30 Sep 2022 19:06:56 -0400 Subject: [PATCH 004/200] build: automate release-related edits --- Makefile | 6 +++ doc/conf.py | 12 ++--- howto.txt | 16 ++----- igor.py | 126 ++++++++++++++++++++++++++++++++++------------------ 4 files changed, 100 insertions(+), 60 deletions(-) diff --git a/Makefile b/Makefile index 7778a1447..9184ab772 100644 --- a/Makefile +++ b/Makefile @@ -146,6 +146,9 @@ sample_html_beta: _sample_cog_html ## Generate sample HTML report for a beta rel REPO_OWNER = nedbat/coveragepy +edit_for_release: ## Edit sources to insert release facts. + python igor.py edit_for_release + kit: ## Make the source distribution. python -m build @@ -181,6 +184,9 @@ update_stable: ## Set the stable branch to the latest release. git branch -f stable $$(python setup.py --version) git push origin stable +bump_version: ## Edit sources to bump the version after a release. + python igor.py bump_version + ##@ Documentation diff --git a/doc/conf.py b/doc/conf.py index c9599e0ee..38b8f0fe2 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -57,18 +57,20 @@ # General information about the project. project = 'Coverage.py' -copyright = '2009\N{EN DASH}2022, Ned Batchelder' # CHANGEME # pylint: disable=redefined-builtin # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -# -# The short X.Y.Z version. # CHANGEME + +# @@@ editable +copyright = "2009–2022, Ned Batchelder" # pylint: disable=redefined-builtin +# The short X.Y.Z version. version = "6.5.0" -# The full version, including alpha/beta/rc tags. # CHANGEME +# The full version, including alpha/beta/rc tags. release = "6.5.0" -# The date of release, in "monthname day, year" format. # CHANGEME +# The date of release, in "monthname day, year" format. release_date = "September 29, 2022" +# @@@ end rst_epilog = """ .. |release_date| replace:: {release_date} diff --git a/howto.txt b/howto.txt index ec0bd9e7d..32707eee0 100644 --- a/howto.txt +++ b/howto.txt @@ -7,10 +7,10 @@ version_info = (4, 0, 2, "candidate", 1) version_info = (4, 0, 2, "final", 0) - Supported Python version numbers. Search for "PYVERSIONS". -- Copyright date in NOTICE.txt +- Update source files with release facts: + $ make edit_for_release - run `python igor.py cheats` to get useful snippets for next steps. -- Update CHANGES.rst, including release date. - - don't forget the jump target +- Look over CHANGES.rst - Update README.rst - "New in x.y:" - Python versions supported @@ -18,8 +18,6 @@ - Python versions in doc/index.rst - IF PRE-RELEASE: - Version of latest stable release in doc/index.rst - - Version, release, release_date and copyright date in doc/conf.py - - Look for CHANGEME comments - Make sure the docs are cogged: $ make prebuild - Don't forget the man page: doc/python-coverage.1.txt @@ -61,14 +59,8 @@ $ make clean github_releases - Visit the fixed issues on GitHub and mention the version it was fixed in. $ make comment_on_fixes - - "This is now released as part of [coverage 5.2](https://pypi.org/project/coverage/5.2)." - Bump version: - - coverage/version.py - - increment version number - - IF NOT PRE-RELEASE: - - set to alpha-0 if just released. - - CHANGES.rst - - add an "Unreleased" section to the top. + $ make bump_version $ git push - Update readthedocs - @ https://readthedocs.org/projects/coverage/versions/ diff --git a/igor.py b/igor.py index 10c82cb41..6f1bd9973 100644 --- a/igor.py +++ b/igor.py @@ -15,10 +15,12 @@ import inspect import os import platform +import re import subprocess import sys import sysconfig import textwrap +import types import warnings import zipfile @@ -380,56 +382,94 @@ def do_quietly(command): return proc.returncode +def get_release_facts(): + """Return an object with facts about the current release.""" + import coverage + facts = types.SimpleNamespace() + facts.ver = coverage.__version__ + facts.vi = coverage.version_info + facts.shortver = f"{facts.vi[0]}.{facts.vi[1]}.{facts.vi[2]}" + facts.anchor = facts.shortver.replace(".", "-") + if facts.vi[3] != "final": + facts.anchor += f"{facts.vi[3][0]}{facts.vi[4]}" + facts.next_vi = (facts.vi[0], facts.vi[1], facts.vi[2]+1, "alpha", 0) + facts.now = datetime.datetime.now() + facts.branch = subprocess.getoutput("git rev-parse --abbrev-ref @") + return facts + + +def update_file(fname, pattern, replacement): + """Update the contents of a file, replacing pattern with replacement.""" + with open(fname) as fobj: + old_text = fobj.read() + + new_text = re.sub(pattern, replacement, old_text, count=1) + + if new_text != old_text: + print(f"Updating {fname}") + with open(fname, "w") as fobj: + fobj.write(new_text) + +UNRELEASED = "Unreleased\n----------" + +def do_edit_for_release(): + """Edit a few files in preparation for a release.""" + facts = get_release_facts() + + # NOTICE.txt + update_file("NOTICE.txt", r"Copyright 2004.*? Ned", f"Copyright 2004-{facts.now:%Y} Ned") + + # CHANGES.rst + title = f"Version {facts.ver} — {facts.now:%Y-%m-%d}" + rule = "-" * len(title) + new_head = f".. _changes_{facts.anchor}:\n\n{title}\n{rule}" + + update_file("CHANGES.rst", re.escape(UNRELEASED), new_head) + + # doc/conf.py + new_conf = textwrap.dedent(f"""\ + # @@@ editable + copyright = "2009\N{EN DASH}{facts.now:%Y}, Ned Batchelder" # pylint: disable=redefined-builtin + # The short X.Y.Z version. + version = "{facts.shortver}" + # The full version, including alpha/beta/rc tags. + release = "{facts.ver}" + # The date of release, in "monthname day, year" format. + release_date = "{facts.now:%B %-d, %Y}" + # @@@ end + """) + update_file("doc/conf.py", r"(?s)# @@@ editable\n.*# @@@ end\n", new_conf) + + +def do_bump_version(): + """Edit a few files right after a release to bump the version.""" + facts = get_release_facts() + + # CHANGES.rst + update_file( + "CHANGES.rst", + r"(?m)^\.\. _changes_", + f"{UNRELEASED}\n\nNothing yet.\n\n\n.. _changes_", + ) + + # coverage/version.py + next_version = f"version_info = {facts.next_vi}".replace("'", '"') + update_file("coverage/version.py", r"(?m)^version_info = .*$", next_version) + + def do_cheats(): """Show a cheatsheet of useful things during releasing.""" - import coverage - ver = coverage.__version__ - vi = coverage.version_info - shortver = f"{vi[0]}.{vi[1]}.{vi[2]}" - anchor = shortver.replace(".", "-") - if vi[3] != "final": - anchor += f"{vi[3][0]}{vi[4]}" - now = datetime.datetime.now() - branch = subprocess.getoutput("git rev-parse --abbrev-ref @") - print(f"Coverage version is {ver}") - - print(f"pip install git+https://github.com/nedbat/coveragepy@{branch}") - print(f"https://coverage.readthedocs.io/en/{ver}/changes.html#changes-{anchor}") - - print("\n## for CHANGES.rst before release:") - print(f".. _changes_{anchor}:") - print() - head = f"Version {ver} — {now:%Y-%m-%d}" - print(head) - print("-" * len(head)) - - print("\n## For doc/conf.py before release:") - print("\n".join([ - '# The short X.Y.Z version. # CHANGEME', - f'version = "{shortver}"', - '# The full version, including alpha/beta/rc tags. # CHANGEME', - f'release = "{ver}"', - '# The date of release, in "monthname day, year" format. # CHANGEME', - f'release_date = "{now:%B %-d, %Y}"', - ])) + facts = get_release_facts() + print(f"Coverage version is {facts.ver}") + + print(f"pip install git+https://github.com/nedbat/coveragepy@{facts.branch}") + print(f"https://coverage.readthedocs.io/en/{facts.ver}/changes.html#changes-{facts.anchor}") print( "\n## For GitHub commenting:\n" + "This is now released as part of " + - f"[coverage {ver}](https://pypi.org/project/coverage/{ver})." + f"[coverage {facts.ver}](https://pypi.org/project/coverage/{facts.ver})." ) - print("\n## For version.py next:") - next_vi = (vi[0], vi[1], vi[2]+1, "alpha", 0) - print(f"version_info = {next_vi}".replace("'", '"')) - print("\n## For CHANGES.rst after release:") - print(textwrap.dedent("""\ - Unreleased - ---------- - - Nothing yet. - - - """)) def do_help(): From 08712e99bbfff973cca786aab04875b79c4e0fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sat, 1 Oct 2022 17:01:57 +0200 Subject: [PATCH 005/200] build: remove redundant wheel dep from pyproject.toml Remove the redundant `wheel` dependency, as it is added by the backend automatically. Listing it explicitly in the documentation was a historical mistake and has been fixed since, see: https://github.com/pypa/setuptools/commit/f7d30a9529378cf69054b5176249e5457aaf640a --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fdc329bb2..4b13c41f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,5 +2,5 @@ # For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt [build-system] -requires = ['setuptools', 'wheel'] +requires = ['setuptools'] build-backend = 'setuptools.build_meta' From d9e2e3c7eb62f59109101370fee4e157c8af3052 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 2 Oct 2022 17:42:11 -0400 Subject: [PATCH 006/200] refactor: remove minor pre-3.7 complexity --- coverage/files.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/coverage/files.py b/coverage/files.py index 4d0c1a2b1..4475f2f11 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -296,9 +296,8 @@ def fnmatches_to_regex(patterns, case_insensitive=False, partial=False): """ regexes = (fnmatch.translate(pattern) for pattern in patterns) - # Python3.7 fnmatch translates "/" as "/". Before that, it translates as "\/", - # so we have to deal with maybe a backslash. - regexes = (re.sub(r"\\?/", r"[\\\\/]", regex) for regex in regexes) + # Be agnostic: / can mean backslash or slash. + regexes = (re.sub(r"/", r"[\\\\/]", regex) for regex in regexes) if partial: # fnmatch always adds a \Z to match the whole string, which we don't From fdc40d016acb719be6b96e5cd1ab4a7dd0687548 Mon Sep 17 00:00:00 2001 From: Sviatoslav Sydorenko Date: Tue, 4 Oct 2022 17:22:56 +0200 Subject: [PATCH 007/200] build: fix the branch protection gate check @ GHA This adds a GHA job that reliably determines if all the required dependencies have succeeded or not. It is now in use in aiohttp (and other aio-libs projects), CherryPy, some of the Ansible repositories, all of the jaraco's projects (like `setuptools`, `importlib_metadata`), some of hynek's projects, some PyCQA, PyCA, PyPA and pytest projects, a few AWS Labs projects (to my surprise). The story behind this is explained in more detail at https://github.com/marketplace/actions/alls-green#why. --- .github/workflows/testsuite.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index 81b9e1bb1..feb6676de 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -91,13 +91,18 @@ jobs: exit 1 fi - # A final step to give a simple name for required status checks. + # This job aggregates test results. It's the required check for branch protection. + # https://github.com/marketplace/actions/alls-green#why # https://github.com/orgs/community/discussions/33579 success: - needs: tests - runs-on: ubuntu-latest name: Tests successful + if: always() + needs: + - tests + runs-on: ubuntu-latest steps: - - name: "Success" - run: | - echo Tests successful + - name: Decide whether the needed jobs succeeded or failed + # uses: re-actors/alls-green@v1.2.1 + uses: re-actors/alls-green@13b4244b312e8a314951e03958a2f91519a6a3c9 + with: + jobs: ${{ toJSON(needs) }} From 66be37c2a00ed18f657404adee18d5674ff8cab1 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 4 Oct 2022 20:55:49 -0400 Subject: [PATCH 008/200] =?UTF-8?q?docs:=20thanks=20for=20two=20build=20fi?= =?UTF-8?q?xes,=20Micha=C5=82=20and=20Sviatoslav?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTORS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 8fbd4b176..4bf9a193b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -116,6 +116,7 @@ Matus Valo Max Linke Michael Krebs Michał Bultrowicz +Michał Górny Mickie Betz Mike Fiedler Naveen Yadav @@ -150,6 +151,7 @@ Stephen Finucane Steve Dower Steve Leonard Steve Peak +Sviatoslav Sydorenko S. Y. Lee Teake Nutma Ted Wexler From 236c1e034619bbe896f2df69faf8f93cdda59611 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 10 Oct 2022 07:19:11 -0400 Subject: [PATCH 009/200] build: the /io path was for metalinux, which is gone since 76e80108 --- metacov.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/metacov.ini b/metacov.ini index 8e1324b54..6e4e7d5bc 100644 --- a/metacov.ini +++ b/metacov.ini @@ -93,9 +93,8 @@ source = . *\coverage\trunk */coverage/trunk - *\coveragepy - /io # GitHub Actions on Ubuntu uses /home/runner/work/coveragepy # GitHub Actions on Mac uses /Users/runner/work/coveragepy # GitHub Actions on Window uses D:\a\coveragepy\coveragepy + *\coveragepy */coveragepy From 64130ee5cebd07b1ca4b3acbb0a9b387ebbd7b7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Oct 2022 06:37:53 -0700 Subject: [PATCH 010/200] build(deps): bump schneegans/dynamic-badges-action from 1.4.0 to 1.5.0 (#1465) * build(deps): bump schneegans/dynamic-badges-action from 1.4.0 to 1.5.0 Bumps [schneegans/dynamic-badges-action](https://github.com/schneegans/dynamic-badges-action) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/schneegans/dynamic-badges-action/releases) - [Changelog](https://github.com/Schneegans/dynamic-badges-action/blob/master/changelog.md) - [Commits](https://github.com/schneegans/dynamic-badges-action/compare/54d929a33e7521ab6bf19d323d28fb7b876c53f7...9e75560bc15f4bddbf108466ba42d6922f1fc160) --- updated-dependencies: - dependency-name: schneegans/dynamic-badges-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update .github/workflows/coverage.yml Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ned Batchelder --- .github/workflows/coverage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 5c471c32d..e83879d2f 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -210,8 +210,8 @@ jobs: - name: "Create badge" # https://gist.githubusercontent.com/nedbat/8c6980f77988a327348f9b02bbaf67f5 - # uses: schneegans/dynamic-badges-action@v1.4.0 - uses: schneegans/dynamic-badges-action@54d929a33e7521ab6bf19d323d28fb7b876c53f7 + # uses: schneegans/dynamic-badges-action@v1.5.0 + uses: schneegans/dynamic-badges-action@9e75560bc15f4bddbf108466ba42d6922f1fc160 with: auth: ${{ secrets.METACOV_GIST_SECRET }} gistID: 8c6980f77988a327348f9b02bbaf67f5 From c7f7aaf0b59d01d92866f876f0d37badaff6309a Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 2 Oct 2022 08:08:49 -0400 Subject: [PATCH 011/200] refactor: simplify the arguments to a test helper --- tests/test_files.py | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/tests/test_files.py b/tests/test_files.py index b1e856104..b9561eeb0 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -250,15 +250,18 @@ class PathAliasesTest(CoverageTest): run_in_temp_dir = False - def assert_mapped(self, aliases, inp, out, relative=False): + def assert_mapped(self, aliases, inp, out): """Assert that `inp` mapped through `aliases` produces `out`. - `out` is canonicalized first, since aliases produce canonicalized - paths by default. + If the aliases are not relative, then `out` is canonicalized first, + since aliases produce canonicalized paths by default. """ mapped = aliases.map(inp) - expected = files.canonical_filename(out) if not relative else out + if aliases.relative: + expected = out + else: + expected = files.canonical_filename(out) assert mapped == expected def assert_unchanged(self, aliases, inp): @@ -277,11 +280,11 @@ def test_nomatch(self, rel_yn): def test_wildcard(self, rel_yn): aliases = PathAliases(relative=rel_yn) aliases.add('/ned/home/*/src', './mysrc') - self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py', relative=rel_yn) + self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py') aliases = PathAliases(relative=rel_yn) aliases.add('/ned/home/*/src/', './mysrc') - self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py', relative=rel_yn) + self.assert_mapped(aliases, '/ned/home/foo/src/a.py', './mysrc/a.py') def test_no_accidental_match(self, rel_yn): aliases = PathAliases(relative=rel_yn) @@ -294,8 +297,8 @@ def test_multiple_patterns(self, rel_yn): aliases = PathAliases(debugfn=msgs.append, relative=rel_yn) aliases.add('/home/*/src', './mysrc') aliases.add('/lib/*/libsrc', './mylib') - self.assert_mapped(aliases, '/home/foo/src/a.py', './mysrc/a.py', relative=rel_yn) - self.assert_mapped(aliases, '/lib/foo/libsrc/a.py', './mylib/a.py', relative=rel_yn) + self.assert_mapped(aliases, '/home/foo/src/a.py', './mysrc/a.py') + self.assert_mapped(aliases, '/lib/foo/libsrc/a.py', './mylib/a.py') if rel_yn: assert msgs == [ "Aliases (relative=True):", @@ -343,7 +346,7 @@ def test_paths_are_os_corrected(self, rel_yn): aliases = PathAliases(relative=rel_yn) aliases.add('/home/ned/*/src', './mysrc') aliases.add(r'c:\ned\src', './mysrc') - self.assert_mapped(aliases, r'C:\Ned\src\sub\a.py', './mysrc/sub/a.py', relative=rel_yn) + self.assert_mapped(aliases, r'C:\Ned\src\sub\a.py', './mysrc/sub/a.py') aliases = PathAliases(relative=rel_yn) aliases.add('/home/ned/*/src', r'.\mysrc') @@ -352,7 +355,6 @@ def test_paths_are_os_corrected(self, rel_yn): aliases, r'/home/ned/foo/src/sub/a.py', r'.\mysrc\sub\a.py', - relative=rel_yn, ) def test_windows_on_linux(self, rel_yn): @@ -369,7 +371,6 @@ def test_windows_on_linux(self, rel_yn): aliases, "C:\\a\\path\\somewhere\\coveragepy_test\\project\\module\\tests\\file.py", "project/module/tests/file.py", - relative=rel_yn, ) def test_linux_on_windows(self, rel_yn): @@ -386,7 +387,6 @@ def test_linux_on_windows(self, rel_yn): aliases, "C:/a/path/somewhere/coveragepy_test/project/module/tests/file.py", "project\\module\\tests\\file.py", - relative=rel_yn, ) def test_multiple_wildcard(self, rel_yn): @@ -396,7 +396,6 @@ def test_multiple_wildcard(self, rel_yn): aliases, '/home/jenkins/xx/a/yy/b/zz/django/foo/bar.py', './django/foo/bar.py', - relative=rel_yn, ) def test_windows_root_paths(self, rel_yn): @@ -406,21 +405,19 @@ def test_windows_root_paths(self, rel_yn): aliases, "X:\\a\\file.py", "/tmp/src/a/file.py", - relative=rel_yn, ) self.assert_mapped( aliases, "X:\\file.py", "/tmp/src/file.py", - relative=rel_yn, ) def test_leading_wildcard(self, rel_yn): aliases = PathAliases(relative=rel_yn) aliases.add('*/d1', './mysrc1') aliases.add('*/d2', './mysrc2') - self.assert_mapped(aliases, '/foo/bar/d1/x.py', './mysrc1/x.py', relative=rel_yn) - self.assert_mapped(aliases, '/foo/bar/d2/y.py', './mysrc2/y.py', relative=rel_yn) + self.assert_mapped(aliases, '/foo/bar/d1/x.py', './mysrc1/x.py') + self.assert_mapped(aliases, '/foo/bar/d2/y.py', './mysrc2/y.py') # The root test case was added for the manylinux Docker images, # and I'm not sure how it should work on Windows, so skip it. From 8ba6878461690532b0f0a07e90917be0b65efb8c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 2 Oct 2022 08:09:11 -0400 Subject: [PATCH 012/200] test: uncomment an assert --- tests/test_data.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_data.py b/tests/test_data.py index 8f05ada0d..b1a215e23 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -794,8 +794,7 @@ def test_combining_with_aliases(self): aliases.add(r"c:\ned\test", "./") combine_parallel_data(covdata3, aliases=aliases) self.assert_file_count(".coverage.*", 0) - # covdata3 hasn't been written yet. Should this file exist or not? - #self.assert_exists(".coverage") + self.assert_exists(".coverage") apy = canonical_filename('./a.py') sub_bpy = canonical_filename('./sub/b.py') From 60fa1306d2b02aa718a21c8e9da10fc063063fe7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 2 Oct 2022 21:38:58 -0400 Subject: [PATCH 013/200] refactor(test): use parametrize instead of loops --- tests/test_files.py | 55 +++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/tests/test_files.py b/tests/test_files.py index b9561eeb0..58084f7c7 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -357,37 +357,34 @@ def test_paths_are_os_corrected(self, rel_yn): r'.\mysrc\sub\a.py', ) - def test_windows_on_linux(self, rel_yn): + # Try the paths in both orders. + lin = "*/project/module/" + win = "*\\project\\module\\" + lin_win_paths = [[lin, win], [win, lin]] + + @pytest.mark.parametrize("paths", lin_win_paths) + def test_windows_on_linux(self, paths, rel_yn): # https://github.com/nedbat/coveragepy/issues/618 - lin = "*/project/module/" - win = "*\\project\\module\\" - - # Try the paths in both orders. - for paths in [[lin, win], [win, lin]]: - aliases = PathAliases(relative=rel_yn) - for path in paths: - aliases.add(path, "project/module") - self.assert_mapped( - aliases, - "C:\\a\\path\\somewhere\\coveragepy_test\\project\\module\\tests\\file.py", - "project/module/tests/file.py", - ) - - def test_linux_on_windows(self, rel_yn): + aliases = PathAliases(relative=rel_yn) + for path in paths: + aliases.add(path, "project/module") + self.assert_mapped( + aliases, + "C:\\a\\path\\somewhere\\coveragepy_test\\project\\module\\tests\\file.py", + "project/module/tests/file.py", + ) + + @pytest.mark.parametrize("paths", lin_win_paths) + def test_linux_on_windows(self, paths, rel_yn): # https://github.com/nedbat/coveragepy/issues/618 - lin = "*/project/module/" - win = "*\\project\\module\\" - - # Try the paths in both orders. - for paths in [[lin, win], [win, lin]]: - aliases = PathAliases(relative=rel_yn) - for path in paths: - aliases.add(path, "project\\module") - self.assert_mapped( - aliases, - "C:/a/path/somewhere/coveragepy_test/project/module/tests/file.py", - "project\\module\\tests\\file.py", - ) + aliases = PathAliases(relative=rel_yn) + for path in paths: + aliases.add(path, "project\\module") + self.assert_mapped( + aliases, + "C:/a/path/somewhere/coveragepy_test/project/module/tests/file.py", + "project\\module\\tests\\file.py", + ) def test_multiple_wildcard(self, rel_yn): aliases = PathAliases(relative=rel_yn) From 7836b4faa320cccdeb25966dd8fefcf89107c564 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 2 Oct 2022 21:39:36 -0400 Subject: [PATCH 014/200] fix: */foo matches "foo/x.py", to help with combining relative file names. #991 --- coverage/files.py | 2 ++ coverage/misc.py | 2 +- tests/test_files.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/coverage/files.py b/coverage/files.py index 4475f2f11..87a18bc2a 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -296,6 +296,8 @@ def fnmatches_to_regex(patterns, case_insensitive=False, partial=False): """ regexes = (fnmatch.translate(pattern) for pattern in patterns) + # */ at the start should also match nothing. + regexes = (re.sub(r"^\(\?s:\.\*(\\\\|/)", r"(?s:^(.*\1)?", regex) for regex in regexes) # Be agnostic: / can mean backslash or slash. regexes = (re.sub(r"/", r"[\\\\/]", regex) for regex in regexes) diff --git a/coverage/misc.py b/coverage/misc.py index e9b1b8eba..98a5d139f 100644 --- a/coverage/misc.py +++ b/coverage/misc.py @@ -181,7 +181,7 @@ def bool_or_none(b): def join_regex(regexes): - """Combine a list of regexes into one that matches any of them.""" + """Combine a series of regexes into one that matches any of them.""" return "|".join(f"(?:{r})" for r in regexes) diff --git a/tests/test_files.py b/tests/test_files.py index 58084f7c7..3f3caae6b 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -144,6 +144,12 @@ def test_flat_rootname(original, flat): ["abc/foo/hi.py", "ABC/foo/bar/hi.py", r"ABC\foo/bar/hi.py"], ["abcd/foo.py", "xabc/hi.py"], ), + ( + ["*/foo"], False, True, + ["abc/foo/hi.py", "foo/hi.py"], + ["abc/xfoo/hi.py"], + ), + ]) def test_fnmatches_to_regex(patterns, case_insensitive, partial, matches, nomatches): regex = fnmatches_to_regex(patterns, case_insensitive=case_insensitive, partial=partial) @@ -386,6 +392,30 @@ def test_linux_on_windows(self, paths, rel_yn): "project\\module\\tests\\file.py", ) + @pytest.mark.parametrize("paths", lin_win_paths) + def test_relative_windows_on_linux(self, paths): + # https://github.com/nedbat/coveragepy/issues/991 + aliases = PathAliases(relative=True) + for path in paths: + aliases.add(path, "project/module") + self.assert_mapped( + aliases, + r"project\module\tests\file.py", + r"project/module/tests/file.py", + ) + + @pytest.mark.parametrize("paths", lin_win_paths) + def test_relative_linux_on_windows(self, paths): + # https://github.com/nedbat/coveragepy/issues/991 + aliases = PathAliases(relative=True) + for path in paths: + aliases.add(path, r"project\module") + self.assert_mapped( + aliases, + r"project/module/tests/file.py", + r"project\module\tests\file.py", + ) + def test_multiple_wildcard(self, rel_yn): aliases = PathAliases(relative=rel_yn) aliases.add('/home/jenkins/*/a/*/b/*/django', './django') From c28544cc9a0c5113bd3a9279f47a2b7ea8826980 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 3 Oct 2022 10:08:44 -0400 Subject: [PATCH 015/200] refactor: since we are showing regexes, make them a bit simpler The old code would always wrap the regex in a needless `(?s:...)` parenthesis. Path aliases are always single regexes, so they don't need that extra wrapping. This makes logged path maps easier to understand. --- coverage/misc.py | 6 +++++- tests/test_files.py | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/coverage/misc.py b/coverage/misc.py index 98a5d139f..e3c67bc6d 100644 --- a/coverage/misc.py +++ b/coverage/misc.py @@ -182,7 +182,11 @@ def bool_or_none(b): def join_regex(regexes): """Combine a series of regexes into one that matches any of them.""" - return "|".join(f"(?:{r})" for r in regexes) + regexes = list(regexes) + if len(regexes) == 1: + return regexes[0] + else: + return "|".join(f"(?:{r})" for r in regexes) def file_be_gone(path): diff --git a/tests/test_files.py b/tests/test_files.py index 3f3caae6b..8ce2d5f7f 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -309,9 +309,9 @@ def test_multiple_patterns(self, rel_yn): assert msgs == [ "Aliases (relative=True):", " Rule: '/home/*/src' -> './mysrc/' using regex " + - "'(?:(?s:[\\\\\\\\/]home[\\\\\\\\/].*[\\\\\\\\/]src[\\\\\\\\/]))'", + "'(?s:[\\\\\\\\/]home[\\\\\\\\/].*[\\\\\\\\/]src[\\\\\\\\/])'", " Rule: '/lib/*/libsrc' -> './mylib/' using regex " + - "'(?:(?s:[\\\\\\\\/]lib[\\\\\\\\/].*[\\\\\\\\/]libsrc[\\\\\\\\/]))'", + "'(?s:[\\\\\\\\/]lib[\\\\\\\\/].*[\\\\\\\\/]libsrc[\\\\\\\\/])'", "Matched path '/home/foo/src/a.py' to rule '/home/*/src' -> './mysrc/', " + "producing './mysrc/a.py'", "Matched path '/lib/foo/libsrc/a.py' to rule '/lib/*/libsrc' -> './mylib/', " + @@ -321,9 +321,9 @@ def test_multiple_patterns(self, rel_yn): assert msgs == [ "Aliases (relative=False):", " Rule: '/home/*/src' -> './mysrc/' using regex " + - "'(?:(?s:[\\\\\\\\/]home[\\\\\\\\/].*[\\\\\\\\/]src[\\\\\\\\/]))'", + "'(?s:[\\\\\\\\/]home[\\\\\\\\/].*[\\\\\\\\/]src[\\\\\\\\/])'", " Rule: '/lib/*/libsrc' -> './mylib/' using regex " + - "'(?:(?s:[\\\\\\\\/]lib[\\\\\\\\/].*[\\\\\\\\/]libsrc[\\\\\\\\/]))'", + "'(?s:[\\\\\\\\/]lib[\\\\\\\\/].*[\\\\\\\\/]libsrc[\\\\\\\\/])'", "Matched path '/home/foo/src/a.py' to rule '/home/*/src' -> './mysrc/', " + f"producing {files.canonical_filename('./mysrc/a.py')!r}", "Matched path '/lib/foo/libsrc/a.py' to rule '/lib/*/libsrc' -> './mylib/', " + From cb67b1feb2d68972f0eeb81a0e20b836b64c21dd Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 9 Oct 2022 18:41:24 -0400 Subject: [PATCH 016/200] feat: implicitly combine relative paths --- coverage/control.py | 18 ++++++++---------- coverage/files.py | 14 ++++++++++++++ coverage/sqldata.py | 4 +++- tests/test_files.py | 20 ++++++++++++++++++++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/coverage/control.py b/coverage/control.py index 5e1e54bf3..91e604e00 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -741,16 +741,14 @@ def combine(self, data_paths=None, strict=False, keep=False): self._post_init() self.get_data() - aliases = None - if self.config.paths: - aliases = PathAliases( - debugfn=(self._debug.write if self._debug.should("pathmap") else None), - relative=self.config.relative_files, - ) - for paths in self.config.paths.values(): - result = paths[0] - for pattern in paths[1:]: - aliases.add(pattern, result) + aliases = PathAliases( + debugfn=(self._debug.write if self._debug.should("pathmap") else None), + relative=self.config.relative_files, + ) + for paths in self.config.paths.values(): + result = paths[0] + for pattern in paths[1:]: + aliases.add(pattern, result) combine_parallel_data( self._data, diff --git a/coverage/files.py b/coverage/files.py index 87a18bc2a..2c520b8ab 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -409,6 +409,20 @@ def map(self, path): f"producing {new!r}" ) return new + + # If we get here, no pattern matched. + + if self.relative and not isabs_anywhere(path): + parts = re.split(r"[/\\]", path) + if len(parts) > 1: + dir1 = parts[0] + pattern = f"*/{dir1}" + regex = rf"^(.*[\\/])?{re.escape(dir1)}[\\/]" + result = f"{dir1}{os.sep}" + self.debugfn(f"Generating rule: {pattern!r} -> {result!r} using regex {regex!r}") + self.aliases.append((pattern, re.compile(regex), result)) + return self.map(path) + self.debugfn(f"No rules match, path {path!r} is unchanged") return path diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 5d62b15b1..5d7fbecfc 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -596,7 +596,9 @@ def update(self, other_data, aliases=None): """Update this data with data from several other :class:`CoverageData` instances. If `aliases` is provided, it's a `PathAliases` object that is used to - re-map paths to match the local machine's. + re-map paths to match the local machine's. Note: `aliases` is None + only when called directly from the test suite. + """ if self._debug.should("dataop"): self._debug.write("Updating with data from {!r}".format( diff --git a/tests/test_files.py b/tests/test_files.py index 8ce2d5f7f..8fea61d07 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -416,6 +416,26 @@ def test_relative_linux_on_windows(self, paths): r"project\module\tests\file.py", ) + @pytest.mark.skipif(env.WINDOWS, reason="This test assumes Unix file system") + def test_implicit_relative_windows_on_linux(self): + # https://github.com/nedbat/coveragepy/issues/991 + aliases = PathAliases(relative=True) + self.assert_mapped( + aliases, + r"project\module\tests\file.py", + r"project/module/tests/file.py", + ) + + @pytest.mark.skipif(not env.WINDOWS, reason="This test assumes Windows file system") + def test_implicit_relative_linux_on_windows(self): + # https://github.com/nedbat/coveragepy/issues/991 + aliases = PathAliases(relative=True) + self.assert_mapped( + aliases, + r"project/module/tests/file.py", + r"project\module\tests\file.py", + ) + def test_multiple_wildcard(self, rel_yn): aliases = PathAliases(relative=rel_yn) aliases.add('/home/jenkins/*/a/*/b/*/django', './django') From 7df8609f0462722fea3c0650cd94b76f668e07fe Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 10 Oct 2022 08:53:01 -0400 Subject: [PATCH 017/200] docs: updates for implicit relative path mapping --- CHANGES.rst | 9 ++++++++- coverage/cmdline.py | 4 ++-- doc/cmd.rst | 16 +++++++++------- doc/config.rst | 6 +++--- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 23399dc30..145024b7d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,7 +20,14 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- -Nothing yet. +- Improvements to combining data files when using the + :ref:`config_run_relative_files` setting: + + - During ``coverage combine``, relative file paths are implicitly combined + without needing a ``[paths]`` configuration setting. + + - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that + relative file paths can be combined more easily. .. _changes_6-5-0: diff --git a/coverage/cmdline.py b/coverage/cmdline.py index dbf66e0a8..65ee73f8a 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -379,8 +379,8 @@ def get_prog_name(self): ] + GLOBAL_ARGS, usage="[options] ... ", description=( - "Combine data from multiple coverage files collected " + - "with 'run -p'. The combined results are written to a single " + + "Combine data from multiple coverage files. " + + "The combined results are written to a single " + "file representing the union of the data. The positional " + "arguments are data files or directories containing data files. " + "If no paths are provided, data files in the default data file's " + diff --git a/doc/cmd.rst b/doc/cmd.rst index c05b7bce9..cb9a147ee 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -377,6 +377,9 @@ It might be more convenient to use the ``[run] relative_files`` setting to store relative file paths (see :ref:`relative_files `). +If data isn't combining properly, you can see details about the inner workings +with ``--debug=pathmap``. + If any of the data files can't be read, coverage.py will print a warning indicating the file and the problem. @@ -389,11 +392,10 @@ want to keep those files, use the ``--keep`` command-line option. $ coverage combine --help Usage: coverage combine [options] ... - Combine data from multiple coverage files collected with 'run -p'. The - combined results are written to a single file representing the union of the - data. The positional arguments are data files or directories containing data - files. If no paths are provided, data files in the default data file's - directory are combined. + Combine data from multiple coverage files. The combined results are written to + a single file representing the union of the data. The positional arguments are + data files or directories containing data files. If no paths are provided, + data files in the default data file's directory are combined. Options: -a, --append Append coverage data to .coverage, otherwise it starts @@ -409,7 +411,7 @@ want to keep those files, use the ``--keep`` command-line option. --rcfile=RCFILE Specify configuration file. By default '.coveragerc', 'setup.cfg', 'tox.ini', and 'pyproject.toml' are tried. [env: COVERAGE_RCFILE] -.. [[[end]]] (checksum: 0ac91b0781d7146b87953f09090dab92) +.. [[[end]]] (checksum: 0bdd83f647ee76363c955bedd9ddf749) .. _cmd_erase: @@ -1001,7 +1003,7 @@ of operation to log: * ``multiproc``: log the start and stop of multiprocessing processes. * ``pathmap``: log the remapping of paths that happens during ``coverage - combine`` due to the ``[paths]`` setting. See :ref:`config_paths`. + combine``. See :ref:`config_paths`. * ``pid``: annotate all warnings and debug output with the process and thread ids. diff --git a/doc/config.rst b/doc/config.rst index 66b02eacd..0cb2cfa6c 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -259,9 +259,9 @@ information. [run] relative_files .................... -(*experimental*, boolean, default False) store relative file paths in the data -file. This makes it easier to measure code in one (or multiple) environments, -and then report in another. See :ref:`cmd_combine` for details. +(boolean, default False) store relative file paths in the data file. This +makes it easier to measure code in one (or multiple) environments, and then +report in another. See :ref:`cmd_combine` for details. Note that setting ``source`` has to be done in the configuration file rather than the command line for this option to work, since the reporting commands From f2d9c16df572ea58263444a5591b604271b3105f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 10 Oct 2022 08:59:48 -0400 Subject: [PATCH 018/200] test: simpler metacov.ini because of relative_file fixes --- metacov.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metacov.ini b/metacov.ini index 6e4e7d5bc..a18dff82d 100644 --- a/metacov.ini +++ b/metacov.ini @@ -10,6 +10,7 @@ branch = true data_file = ${COVERAGE_METAFILE?} parallel = true +relative_files = true source = ${COVERAGE_HOME-.}/coverage ${COVERAGE_HOME-.}/tests @@ -91,7 +92,6 @@ title = Coverage.py metacov [paths] source = . - *\coverage\trunk */coverage/trunk # GitHub Actions on Ubuntu uses /home/runner/work/coveragepy # GitHub Actions on Mac uses /Users/runner/work/coveragepy From ac65067ae6f2896638d0bf7bf7e2df6387a8ffc3 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 15 Oct 2022 14:51:38 -0400 Subject: [PATCH 019/200] docs: mention 991 being fixed in CHANGES.rst --- CHANGES.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 145024b7d..19a140f90 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -24,11 +24,14 @@ Unreleased :ref:`config_run_relative_files` setting: - During ``coverage combine``, relative file paths are implicitly combined - without needing a ``[paths]`` configuration setting. + without needing a ``[paths]`` configuration setting. This also fixed + `issue 991`_. - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that relative file paths can be combined more easily. +.. _issue 991: https://github.com/nedbat/coveragepy/issues/991 + .. _changes_6-5-0: From a3c8683f8e46590c145e16c1aebf7a7766513890 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 17 Oct 2022 08:46:53 -0700 Subject: [PATCH 020/200] build: update three actions to latest version (#1473) Also, remove the symbolic references in the comments, since dependabot doesn't update them. --- .github/workflows/coverage.yml | 3 +-- .github/workflows/kit.yml | 3 +-- .github/workflows/testsuite.yml | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index e83879d2f..848573c20 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -210,8 +210,7 @@ jobs: - name: "Create badge" # https://gist.githubusercontent.com/nedbat/8c6980f77988a327348f9b02bbaf67f5 - # uses: schneegans/dynamic-badges-action@v1.5.0 - uses: schneegans/dynamic-badges-action@9e75560bc15f4bddbf108466ba42d6922f1fc160 + uses: schneegans/dynamic-badges-action@5d424ad4060f866e4d1dab8f8da0456e6b1c4f56 with: auth: ${{ secrets.METACOV_GIST_SECRET }} gistID: 8c6980f77988a327348f9b02bbaf67f5 diff --git a/.github/workflows/kit.yml b/.github/workflows/kit.yml index 9ee25fdb4..f3c156706 100644 --- a/.github/workflows/kit.yml +++ b/.github/workflows/kit.yml @@ -136,8 +136,7 @@ jobs: steps: - name: "Setup QEMU" if: matrix.os == 'ubuntu' - # uses: docker/setup-qemu-action@v2 - uses: docker/setup-qemu-action@8b122486cedac8393e77aa9734c3528886e4a1a8 + uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 with: platforms: arm64 diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index feb6676de..e1baaaf32 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -102,7 +102,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed - # uses: re-actors/alls-green@v1.2.1 - uses: re-actors/alls-green@13b4244b312e8a314951e03958a2f91519a6a3c9 + uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe with: jobs: ${{ toJSON(needs) }} From 4668a92c8d8f467fbe6291fa4f56e96e19709e90 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 19 Oct 2022 20:39:44 -0700 Subject: [PATCH 021/200] fix: can't use PYPYVERSION without checking PYPY first --- CHANGES.rst | 4 ++++ coverage/env.py | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 19a140f90..24f50907f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -30,7 +30,11 @@ Unreleased - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that relative file paths can be combined more easily. +- Fix internal logic that prevented coverage.py from running on implementations + other than CPython or PyPy (`issue 1474`_). + .. _issue 991: https://github.com/nedbat/coveragepy/issues/991 +.. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474 .. _changes_6-5-0: diff --git a/coverage/env.py b/coverage/env.py index 13411699a..820016f4e 100644 --- a/coverage/env.py +++ b/coverage/env.py @@ -85,7 +85,10 @@ class PYBEHAVIOR: nix_while_true = (PYVERSION >= (3, 8)) # CPython 3.9a1 made sys.argv[0] and other reported files absolute paths. - report_absolute_files = ((CPYTHON or (PYPYVERSION >= (7, 3, 10))) and PYVERSION >= (3, 9)) + report_absolute_files = ( + (CPYTHON or (PYPY and PYPYVERSION >= (7, 3, 10))) + and PYVERSION >= (3, 9) + ) # Lines after break/continue/return/raise are no longer compiled into the # bytecode. They used to be marked as missing, now they aren't executable. From dc996d32a3631740b0b7ba980d3eee28cd726c9c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 20 Oct 2022 14:17:14 -0700 Subject: [PATCH 022/200] docs: add another FAQ --- doc/faq.rst | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/doc/faq.rst b/doc/faq.rst index e2fc2f282..b8c2758c5 100644 --- a/doc/faq.rst +++ b/doc/faq.rst @@ -23,11 +23,24 @@ If old data is persisting, you can use an explicit ``coverage erase`` command to clean out the old data. +Q: Why are my function definitions marked as run when I haven't tested them? +............................................................................ + +The ``def`` and ``class`` lines in your Python file are executed when the file +is imported. Those are the lines that define your functions and classes. They +run even if you never call the functions. It's the body of the functions that +will be marked as not executed if you don't test them, not the ``def`` lines. + +This can mean that your code has a moderate coverage total even if no tests +have been written or run. This might seem surprising, but it is accurate: the +``def`` lines have actually been run. + + Q: Why do the bodies of functions show as executed, but the def lines do not? ............................................................................. -This happens because coverage.py is started after the functions are defined. -The definition lines are executed without coverage measurement, then +If this happens, it's because coverage.py has started after the functions are +defined. The definition lines are executed without coverage measurement, then coverage.py is started, then the function is called. This means the body is measured, but the definition of the function itself is not. From 4bdae5e2e251915f618e048cec4613168de1f12b Mon Sep 17 00:00:00 2001 From: Frazer McLean Date: Fri, 21 Oct 2022 19:52:46 +0200 Subject: [PATCH 023/200] Use SPDX license expression in project metadata (#1478) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 67aedc1bf..33ddf5606 100644 --- a/setup.py +++ b/setup.py @@ -120,7 +120,7 @@ def better_set_verbosity(v): long_description=long_description, long_description_content_type='text/x-rst', keywords='code coverage testing', - license='Apache 2.0', + license='Apache-2.0', classifiers=classifier_list, url="https://github.com/nedbat/coveragepy", project_urls={ From 57d86492daeca737ce4dfaff648d00dfe070b965 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 23 Oct 2022 14:22:47 -0400 Subject: [PATCH 024/200] chore: make upgrade --- doc/requirements.pip | 36 ++-- requirements/dev.pip | 188 +++++++++++---------- requirements/kit.pip | 36 ++-- requirements/light-threads.pip | 290 +++++++++++++++++---------------- requirements/lint.pip | 206 ++++++++++++----------- requirements/pip-tools.pip | 30 ++-- requirements/pip.pip | 18 +- requirements/pytest.pip | 24 +-- requirements/tox.pip | 24 +-- 9 files changed, 439 insertions(+), 413 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index cd8b722cf..57250ebf8 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -44,9 +44,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # sphinx # sphinxcontrib-spelling @@ -119,9 +119,9 @@ pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc # via packaging -pytz==2022.2.1 \ - --hash=sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197 \ - --hash=sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5 +pytz==2022.5 \ + --hash=sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22 \ + --hash=sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914 # via babel requests==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ @@ -135,9 +135,9 @@ snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a # via sphinx -sphinx==5.2.1 \ - --hash=sha256:3dcf00fcf82cf91118db9b7177edea4fc01998976f893928d0ab0c58c54be2ca \ - --hash=sha256:c009bb2e9ac5db487bcf53f015504005a330ff7c631bb6ab2604e0d65bae8b54 +sphinx==5.3.0 \ + --hash=sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d \ + --hash=sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5 # via # -r doc/requirements.in # sphinx-autobuild @@ -180,9 +180,9 @@ sphinxcontrib-serializinghtml==1.1.5 \ --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 # via sphinx -sphinxcontrib-spelling==7.6.0 \ - --hash=sha256:292cd7e1f73a763451693b4d48c9bded151084f6a91e5337733e9fa8715d20ec \ - --hash=sha256:6c1313618412511109f7b76029fbd60df5aa4acf67a2dc9cd1b1016d15e882ff +sphinxcontrib-spelling==7.6.2 \ + --hash=sha256:a129d5dd0c00c9d414bcdf599afddb55bae01f1d543636e7ebb09491ba2babd4 \ + --hash=sha256:a7ca90eea630c825657e1344000a11d7d7f547a865e0eebbed08d112beb073d1 # via -r doc/requirements.in tornado==6.2 \ --hash=sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca \ @@ -197,15 +197,15 @@ tornado==6.2 \ --hash=sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e \ --hash=sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b # via livereload -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata urllib3==1.26.12 \ --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 # via requests -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via importlib-metadata diff --git a/requirements/dev.pip b/requirements/dev.pip index e038d2066..d7c556b4b 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -4,9 +4,9 @@ # # make upgrade # -astroid==2.12.10 \ - --hash=sha256:81f870105d892e73bf535da77a8261aa5bde838fa4ed12bb2f435291a098c581 \ - --hash=sha256:997e0c735df60d4a4caff27080a3afc51f9bdd693d3572a4a0b7090b645c36c5 +astroid==2.12.12 \ + --hash=sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83 \ + --hash=sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f # via pylint atomicwrites==1.4.1 \ --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 @@ -106,73 +106,85 @@ future==0.18.2 \ # via # -r requirements/pytest.pip # pycontracts -greenlet==1.1.3 \ - --hash=sha256:0118817c9341ef2b0f75f5af79ac377e4da6ff637e5ee4ac91802c0e379dadb4 \ - --hash=sha256:048d2bed76c2aa6de7af500ae0ea51dd2267aec0e0f2a436981159053d0bc7cc \ - --hash=sha256:07c58e169bbe1e87b8bbf15a5c1b779a7616df9fd3e61cadc9d691740015b4f8 \ - --hash=sha256:095a980288fe05adf3d002fbb180c99bdcf0f930e220aa66fcd56e7914a38202 \ - --hash=sha256:0b181e9aa6cb2f5ec0cacc8cee6e5a3093416c841ba32c185c30c160487f0380 \ - --hash=sha256:1626185d938d7381631e48e6f7713e8d4b964be246073e1a1d15c2f061ac9f08 \ - --hash=sha256:184416e481295832350a4bf731ba619a92f5689bf5d0fa4341e98b98b1265bd7 \ - --hash=sha256:1dd51d2650e70c6c4af37f454737bf4a11e568945b27f74b471e8e2a9fd21268 \ - --hash=sha256:1ec2779774d8e42ed0440cf8bc55540175187e8e934f2be25199bf4ed948cd9e \ - --hash=sha256:2cf45e339cabea16c07586306a31cfcc5a3b5e1626d365714d283732afed6809 \ - --hash=sha256:2fb0aa7f6996879551fd67461d5d3ab0c3c0245da98be90c89fcb7a18d437403 \ - --hash=sha256:44b4817c34c9272c65550b788913620f1fdc80362b209bc9d7dd2f40d8793080 \ - --hash=sha256:466ce0928e33421ee84ae04c4ac6f253a3a3e6b8d600a79bd43fd4403e0a7a76 \ - --hash=sha256:4f166b4aca8d7d489e82d74627a7069ab34211ef5ebb57c300ec4b9337b60fc0 \ - --hash=sha256:510c3b15587afce9800198b4b142202b323bf4b4b5f9d6c79cb9a35e5e3c30d2 \ - --hash=sha256:5b756e6730ea59b2745072e28ad27f4c837084688e6a6b3633c8b1e509e6ae0e \ - --hash=sha256:5fbe1ab72b998ca77ceabbae63a9b2e2dc2d963f4299b9b278252ddba142d3f1 \ - --hash=sha256:6200a11f003ec26815f7e3d2ded01b43a3810be3528dd760d2f1fa777490c3cd \ - --hash=sha256:65ad1a7a463a2a6f863661329a944a5802c7129f7ad33583dcc11069c17e622c \ - --hash=sha256:694ffa7144fa5cc526c8f4512665003a39fa09ef00d19bbca5c8d3406db72fbe \ - --hash=sha256:6f5d4b2280ceea76c55c893827961ed0a6eadd5a584a7c4e6e6dd7bc10dfdd96 \ - --hash=sha256:7532a46505470be30cbf1dbadb20379fb481244f1ca54207d7df3bf0bbab6a20 \ - --hash=sha256:76a53bfa10b367ee734b95988bd82a9a5f0038a25030f9f23bbbc005010ca600 \ - --hash=sha256:77e41db75f9958f2083e03e9dd39da12247b3430c92267df3af77c83d8ff9eed \ - --hash=sha256:7a43bbfa9b6cfdfaeefbd91038dde65ea2c421dc387ed171613df340650874f2 \ - --hash=sha256:7b41d19c0cfe5c259fe6c539fd75051cd39a5d33d05482f885faf43f7f5e7d26 \ - --hash=sha256:7c5227963409551ae4a6938beb70d56bf1918c554a287d3da6853526212fbe0a \ - --hash=sha256:870a48007872d12e95a996fca3c03a64290d3ea2e61076aa35d3b253cf34cd32 \ - --hash=sha256:88b04e12c9b041a1e0bcb886fec709c488192638a9a7a3677513ac6ba81d8e79 \ - --hash=sha256:8c287ae7ac921dfde88b1c125bd9590b7ec3c900c2d3db5197f1286e144e712b \ - --hash=sha256:903fa5716b8fbb21019268b44f73f3748c41d1a30d71b4a49c84b642c2fed5fa \ - --hash=sha256:9537e4baf0db67f382eb29255a03154fcd4984638303ff9baaa738b10371fa57 \ - --hash=sha256:9951dcbd37850da32b2cb6e391f621c1ee456191c6ae5528af4a34afe357c30e \ - --hash=sha256:9b2f7d0408ddeb8ea1fd43d3db79a8cefaccadd2a812f021333b338ed6b10aba \ - --hash=sha256:9c88e134d51d5e82315a7c32b914a58751b7353eb5268dbd02eabf020b4c4700 \ - --hash=sha256:9fae214f6c43cd47f7bef98c56919b9222481e833be2915f6857a1e9e8a15318 \ - --hash=sha256:a3a669f11289a8995d24fbfc0e63f8289dd03c9aaa0cc8f1eab31d18ca61a382 \ - --hash=sha256:aa741c1a8a8cc25eb3a3a01a62bdb5095a773d8c6a86470bde7f607a447e7905 \ - --hash=sha256:b0877a9a2129a2c56a2eae2da016743db7d9d6a05d5e1c198f1b7808c602a30e \ - --hash=sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455 \ - --hash=sha256:caff52cb5cd7626872d9696aee5b794abe172804beb7db52eed1fd5824b63910 \ - --hash=sha256:cbc1eb55342cbac8f7ec159088d54e2cfdd5ddf61c87b8bbe682d113789331b2 \ - --hash=sha256:cd16a89efe3a003029c87ff19e9fba635864e064da646bc749fc1908a4af18f3 \ - --hash=sha256:ce5b64dfe8d0cca407d88b0ee619d80d4215a2612c1af8c98a92180e7109f4b5 \ - --hash=sha256:d58a5a71c4c37354f9e0c24c9c8321f0185f6945ef027460b809f4bb474bfe41 \ - --hash=sha256:db41f3845eb579b544c962864cce2c2a0257fe30f0f1e18e51b1e8cbb4e0ac6d \ - --hash=sha256:db5b25265010a1b3dca6a174a443a0ed4c4ab12d5e2883a11c97d6e6d59b12f9 \ - --hash=sha256:dd0404d154084a371e6d2bafc787201612a1359c2dee688ae334f9118aa0bf47 \ - --hash=sha256:de431765bd5fe62119e0bc6bc6e7b17ac53017ae1782acf88fcf6b7eae475a49 \ - --hash=sha256:df02fdec0c533301497acb0bc0f27f479a3a63dcdc3a099ae33a902857f07477 \ - --hash=sha256:e8533f5111704d75de3139bf0b8136d3a6c1642c55c067866fa0a51c2155ee33 \ - --hash=sha256:f2f908239b7098799b8845e5936c2ccb91d8c2323be02e82f8dcb4a80dcf4a25 \ - --hash=sha256:f8bfd36f368efe0ab2a6aa3db7f14598aac454b06849fb633b762ddbede1db90 \ - --hash=sha256:ffe73f9e7aea404722058405ff24041e59d31ca23d1da0895af48050a07b6932 +greenlet==1.1.3.post0 \ + --hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \ + --hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \ + --hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \ + --hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \ + --hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \ + --hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \ + --hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \ + --hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \ + --hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \ + --hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \ + --hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \ + --hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \ + --hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \ + --hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \ + --hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \ + --hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \ + --hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \ + --hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \ + --hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \ + --hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \ + --hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \ + --hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \ + --hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \ + --hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \ + --hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \ + --hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \ + --hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \ + --hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \ + --hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \ + --hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \ + --hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \ + --hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \ + --hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \ + --hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \ + --hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \ + --hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \ + --hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \ + --hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \ + --hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \ + --hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \ + --hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \ + --hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \ + --hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \ + --hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \ + --hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \ + --hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \ + --hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \ + --hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \ + --hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \ + --hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \ + --hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \ + --hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \ + --hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \ + --hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \ + --hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \ + --hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \ + --hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \ + --hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \ + --hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \ + --hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \ + --hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \ + --hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \ + --hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \ + --hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \ + --hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \ + --hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04 # via -r requirements/dev.in -hypothesis==6.54.6 \ - --hash=sha256:2d5e2d5ccd0efce4e0968a6164f4e4853f808e33f4d91490c975c98beec0c7c3 \ - --hash=sha256:e44833325f9a55f795596ceefd7ede7d626cfe45836025d2647cccaff7070e10 +hypothesis==6.56.3 \ + --hash=sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a \ + --hash=sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via requests -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -261,9 +273,9 @@ mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e # via pylint -more-itertools==8.14.0 \ - --hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \ - --hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750 +more-itertools==9.0.0 \ + --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ + --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ @@ -321,9 +333,9 @@ pygments==2.13.0 \ # pudb # readme-renderer # rich -pylint==2.15.3 \ - --hash=sha256:5fdfd44af182866999e6123139d265334267339f29961f00c89783155eacc60b \ - --hash=sha256:7f6aad1d8d50807f7bc64f89ac75256a9baf8e6ed491cc9bc65592bc3f462cf1 +pylint==2.15.5 \ + --hash=sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df \ + --hash=sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004 # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -367,17 +379,17 @@ requests==2.28.1 \ # -r requirements/dev.in # requests-toolbelt # twine -requests-toolbelt==0.9.1 \ - --hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f \ - --hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0 +requests-toolbelt==0.10.0 \ + --hash=sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985 \ + --hash=sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30 # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==12.5.1 \ - --hash=sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb \ - --hash=sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca +rich==12.6.0 \ + --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ + --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 # via twine six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -405,9 +417,9 @@ tomli==2.0.1 \ # pylint # pytest # tox -tomlkit==0.11.4 \ - --hash=sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c \ - --hash=sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83 +tomlkit==0.11.5 \ + --hash=sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c \ + --hash=sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7 # via pylint tox==3.26.0 \ --hash=sha256:44f3c347c68c2c68799d7d44f1808f9d396fc8a1a500cbc624253375c7ae107e \ @@ -443,9 +455,9 @@ typed-ast==1.5.4 \ --hash=sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3 \ --hash=sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66 # via astroid -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -543,9 +555,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -559,7 +571,7 @@ pip==22.0.4 \ # via # -c requirements/pins.pip # -r requirements/pip.pip -setuptools==65.4.0 \ - --hash=sha256:a8f6e213b4b0661f590ccf40de95d28a177cd747d098624ad3f69c40287297e9 \ - --hash=sha256:c2d2709550f15aab6c9110196ea312f468f41cd546bceb24127a1be6fdcaeeb1 +setuptools==65.5.0 \ + --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ + --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 # via check-manifest diff --git a/requirements/kit.pip b/requirements/kit.pip index b3beda50a..fcc047784 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -4,9 +4,9 @@ # # make upgrade # -auditwheel==5.1.2 \ - --hash=sha256:3ee5830014931ea84af5cd065c637b6614efa03d9b88bd8fbfc924e7ed01d6ba \ - --hash=sha256:4d06aea3ab59a2b8aa733798ac221556a3f5c021fddc42e5de5bcef20201c031 +auditwheel==5.2.0 \ + --hash=sha256:32c8e60d48e39e6d66bd3d49e8a30fbe44d686554420274fb2b9fc4720e91e7f \ + --hash=sha256:b79c6007ee5df42c8fa1ab6ca36da72f490819b21f210fb12cb802d3acbe82ee # via -r requirements/kit.in bashlex==0.16 \ --hash=sha256:dc6f017e49ce2d0fe30ad9f5206da9cd13ded073d365688c9fda525354e8c373 \ @@ -26,9 +26,9 @@ certifi==2022.5.18.1 \ # via # -c requirements/pins.pip # cibuildwheel -cibuildwheel==2.10.2 \ - --hash=sha256:63ff185b4bc1ec62a87309411cc4bc297e6cfab051a3953ab1c7f0d6394b8da3 \ - --hash=sha256:d333005672c58f86b54c944983b495a91138f30cdbcaee47699ad9a29abc345d +cibuildwheel==2.11.1 \ + --hash=sha256:a6e78d960c3983424859e9f606cae3ae296f8ab6a3fa5bdeb7343645a00b8068 \ + --hash=sha256:fa8bcbcbe169f62e2adb9104a2efb5807c4be0ec39b4764dcd15185eb44898e6 # via -r requirements/kit.in colorama==0.4.5 \ --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ @@ -38,9 +38,9 @@ filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 # via cibuildwheel -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # auditwheel # build @@ -74,9 +74,9 @@ tomli==2.0.1 \ # build # cibuildwheel # pep517 -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via # cibuildwheel # importlib-metadata @@ -84,15 +84,15 @@ wheel==0.37.1 \ --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 # via -r requirements/kit.in -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via # importlib-metadata # pep517 # The following packages are considered to be unsafe in a requirements file: -setuptools==65.4.0 \ - --hash=sha256:a8f6e213b4b0661f590ccf40de95d28a177cd747d098624ad3f69c40287297e9 \ - --hash=sha256:c2d2709550f15aab6c9110196ea312f468f41cd546bceb24127a1be6fdcaeeb1 +setuptools==65.5.0 \ + --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ + --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 # via -r requirements/kit.in diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index ae160f080..c346b6fb3 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -78,96 +78,112 @@ eventlet==0.33.1 \ --hash=sha256:a085922698e5029f820cf311a648ac324d73cec0e4792877609d978a4b5bbf31 \ --hash=sha256:afbe17f06a58491e9aebd7a4a03e70b0b63fd4cf76d8307bae07f280479b1515 # via -r requirements/light-threads.in -gevent==21.12.0 \ - --hash=sha256:0082d8a5d23c35812ce0e716a91ede597f6dd2c5ff508a02a998f73598c59397 \ - --hash=sha256:01928770972181ad8866ee37ea3504f1824587b188fcab782ef1619ce7538766 \ - --hash=sha256:05c5e8a50cd6868dd36536c92fb4468d18090e801bd63611593c0717bab63692 \ - --hash=sha256:08b4c17064e28f4eb85604486abc89f442c7407d2aed249cf54544ce5c9baee6 \ - --hash=sha256:177f93a3a90f46a5009e0841fef561601e5c637ba4332ab8572edd96af650101 \ - --hash=sha256:22ce1f38fdfe2149ffe8ec2131ca45281791c1e464db34b3b4321ae9d8d2efbb \ - --hash=sha256:24d3550fbaeef5fddd794819c2853bca45a86c3d64a056a2c268d981518220d1 \ - --hash=sha256:2afa3f3ad528155433f6ac8bd64fa5cc303855b97004416ec719a6b1ca179481 \ - --hash=sha256:2bcec9f80196c751fdcf389ca9f7141e7b0db960d8465ed79be5e685bfcad682 \ - --hash=sha256:2cfff82f05f14b7f5d9ed53ccb7a609ae8604df522bb05c971bca78ec9d8b2b9 \ - --hash=sha256:3baeeccc4791ba3f8db27179dff11855a8f9210ddd754f6c9b48e0d2561c2aea \ - --hash=sha256:3c012c73e6c61f13c75e3a4869dbe6a2ffa025f103421a6de9c85e627e7477b1 \ - --hash=sha256:3dad62f55fad839d498c801e139481348991cee6e1c7706041b5fe096cb6a279 \ - --hash=sha256:542ae891e2aa217d2cf6d8446538fcd2f3263a40eec123b970b899bac391c47a \ - --hash=sha256:6a02a88723ed3f0fd92cbf1df3c4cd2fbd87d82b0a4bac3e36a8875923115214 \ - --hash=sha256:74fc1ef16b86616cfddcc74f7292642b0f72dde4dd95aebf4c45bb236744be54 \ - --hash=sha256:7909780f0cf18a1fc32aafd8c8e130cdd93c6e285b11263f7f2d1a0f3678bc50 \ - --hash=sha256:7ccffcf708094564e442ac6fde46f0ae9e40015cb69d995f4b39cc29a7643881 \ - --hash=sha256:8c21cb5c9f4e14d75b3fe0b143ec875d7dbd1495fad6d49704b00e57e781ee0f \ - --hash=sha256:973749bacb7bc4f4181a8fb2a7e0e2ff44038de56d08e856dd54a5ac1d7331b4 \ - --hash=sha256:9d86438ede1cbe0fde6ef4cc3f72bf2f1ecc9630d8b633ff344a3aeeca272cdd \ - --hash=sha256:9f9652d1e4062d4b5b5a0a49ff679fa890430b5f76969d35dccb2df114c55e0f \ - --hash=sha256:a5ad4ed8afa0a71e1927623589f06a9b5e8b5e77810be3125cb4d93050d3fd1f \ - --hash=sha256:b7709c64afa8bb3000c28bb91ec42c79594a7cb0f322e20427d57f9762366a5b \ - --hash=sha256:bb5cb8db753469c7a9a0b8a972d2660fe851aa06eee699a1ca42988afb0aaa02 \ - --hash=sha256:c43f081cbca41d27fd8fef9c6a32cf83cb979345b20abc07bf68df165cdadb24 \ - --hash=sha256:cc2fef0f98ee180704cf95ec84f2bc2d86c6c3711bb6b6740d74e0afe708b62c \ - --hash=sha256:da8d2d51a49b2a5beb02ad619ca9ddbef806ef4870ba04e5ac7b8b41a5b61db3 \ - --hash=sha256:e1899b921219fc8959ff9afb94dae36be82e0769ed13d330a393594d478a0b3a \ - --hash=sha256:eae3c46f9484eaacd67ffcdf4eaf6ca830f587edd543613b0f5c4eb3c11d052d \ - --hash=sha256:ec21f9eaaa6a7b1e62da786132d6788675b314f25f98d9541f1bf00584ed4749 \ - --hash=sha256:f289fae643a3f1c3b909d6b033e6921b05234a4907e9c9c8c3f1fe403e6ac452 \ - --hash=sha256:f48b64578c367b91fa793bf8eaaaf4995cb93c8bc45860e473bf868070ad094e +gevent==22.10.1 \ + --hash=sha256:04a920a812b6c0c36d4613a15c254ca1ce415ee75ade0df3b8941ab61ae7ce3f \ + --hash=sha256:0569e133bb620de1001ac807ad9a8abaadedd25349c6d695f80c9048a3f59d42 \ + --hash=sha256:06ea39c70ce166c4a1d4386c7fae96cb8d84ad799527b3378406051104d15443 \ + --hash=sha256:0cafb8f5399224990a5329bca3606bf399ee3604ae711b2d9238129b44551ad5 \ + --hash=sha256:1ac816f5e8e318c5fa27091ee43fcf4caaa6ae73a487e875a1a296a04c3da5af \ + --hash=sha256:1e1c609f9e4171588006bea7ff41bb830ff27c27d071bbd311f91860fb5ef4cc \ + --hash=sha256:1ec5f77f629d997668983be53bad2a90d1b858a00e43b9e75e1c9a118c3a840b \ + --hash=sha256:21dbeb6d3b47093f40ca97aab493b2fb64b6f22112f88f56d79cf6f52a8c1c16 \ + --hash=sha256:2dcfd8ef9dcca78c51dd266d0f4b48d9b7ea2592ae881bf66d8dbe59bb16631a \ + --hash=sha256:33c4cd095f99768ecc4b3bb75a12f52ea9df5c40a58671c667f86ea087a075e1 \ + --hash=sha256:36e47ca663081a71fca137b7c852e99e7ee3761082070c13aa2ae3b5b6234af6 \ + --hash=sha256:3c1cfd9f9fb6a2a5a9a04132d315db7fb819db019dea260695fe6e4012416f96 \ + --hash=sha256:3e73c9f71aa2a6795ecbec9b57282b002375e863e283558feb87b62840c8c1ac \ + --hash=sha256:3f7d11136b3ae6312effbc2ac0ed902ae718d86e7acb9a51cf927262cfb2931e \ + --hash=sha256:4b0d29fc18ee338a85396facfc508e5f26e2e0e90f4c2889f8a9e74d341ad467 \ + --hash=sha256:4be5859af086de1ed85702c0a84479387087ddf49e38332c41861b0a10e96d8f \ + --hash=sha256:4c06c0f3f4f1b147f51a934fbf541880cee769492b98c4ebd3e930b5ff862646 \ + --hash=sha256:5bc3758f0dc95007c1780d28a9fd2150416a79c50f308f62a674d78a845ea1b9 \ + --hash=sha256:5d64b208bec99adc7e0b6e08a3e2c296065c665ca725ca8da434c4ffc5aa302e \ + --hash=sha256:702a51b8f21bad1976b0893f90ade466e8c27039b846b611ad2beb8c6e6ac701 \ + --hash=sha256:7e8c4ccc544f6e6c26ab10d0d6a7be86bd522222ce40f00bfafa01289f04bffc \ + --hash=sha256:a12443b7326e40d00fb445d37bae154fd1f4693055330c6b4e68670ca3b6e6bf \ + --hash=sha256:a838437b7b629328ad457cd36df454500afe7f3df4b971a6ff85851dfcf8c844 \ + --hash=sha256:acb21bee2e66da45b8916073c8ae54c44629beb94d49120c188d27aff4ebf8dd \ + --hash=sha256:af7baec79a5f8ad1cc132d3b14edd12661c628d8094e501b089b1fe2d3df7f6e \ + --hash=sha256:be43278781d39b4081f7f4d3e8ebb1dac188c9fe98f25da817325cb12c01887a \ + --hash=sha256:cf6dd33052919de8fb56e0bea0e6a7c7d6545281fe280ea78e311621c7adb50e \ + --hash=sha256:d18fcc324f39a3b21795022eb47c7752d6e4f4ed89d8cca41f1cc604553265b3 \ + --hash=sha256:d2ea4ce36c09355379bc038be2bd50118f97d2eb6381b7096de4d05aa4c3e241 \ + --hash=sha256:d701208d4d65dbdf9feb02561a75ecc5bd28300e47b59f74033a07b593887806 \ + --hash=sha256:d8df3f628c8a9fb339b87a849dc2076e56d124e2169261fa58b4a01db3a335b6 \ + --hash=sha256:db592cfe5106730667ac36f43554e7a869d757e411f8a08116c3739cee507145 \ + --hash=sha256:df3042349c9a4460eeaec8d0e56d737cb183eed055e75a6af9dbda94aaddaf4d \ + --hash=sha256:eb0d9d6f869ba7c49d7f9b7d244dd20daec5cc87cd3e2e90209d6ed8172e0cad \ + --hash=sha256:eefcb21fda3055f2e7eaad2e8098885a7bbddd83b174b012e2142db6b2b4c09d \ + --hash=sha256:f16c6937d47593f051fc3ac7996c819919082a1e7e0dec927cdae8771d26ed45 \ + --hash=sha256:fe2c0ff095171c49f78f1d4e6dc89fa58253783c7b6dccab9f1d76e2ee391f10 # via -r requirements/light-threads.in -greenlet==1.1.3 \ - --hash=sha256:0118817c9341ef2b0f75f5af79ac377e4da6ff637e5ee4ac91802c0e379dadb4 \ - --hash=sha256:048d2bed76c2aa6de7af500ae0ea51dd2267aec0e0f2a436981159053d0bc7cc \ - --hash=sha256:07c58e169bbe1e87b8bbf15a5c1b779a7616df9fd3e61cadc9d691740015b4f8 \ - --hash=sha256:095a980288fe05adf3d002fbb180c99bdcf0f930e220aa66fcd56e7914a38202 \ - --hash=sha256:0b181e9aa6cb2f5ec0cacc8cee6e5a3093416c841ba32c185c30c160487f0380 \ - --hash=sha256:1626185d938d7381631e48e6f7713e8d4b964be246073e1a1d15c2f061ac9f08 \ - --hash=sha256:184416e481295832350a4bf731ba619a92f5689bf5d0fa4341e98b98b1265bd7 \ - --hash=sha256:1dd51d2650e70c6c4af37f454737bf4a11e568945b27f74b471e8e2a9fd21268 \ - --hash=sha256:1ec2779774d8e42ed0440cf8bc55540175187e8e934f2be25199bf4ed948cd9e \ - --hash=sha256:2cf45e339cabea16c07586306a31cfcc5a3b5e1626d365714d283732afed6809 \ - --hash=sha256:2fb0aa7f6996879551fd67461d5d3ab0c3c0245da98be90c89fcb7a18d437403 \ - --hash=sha256:44b4817c34c9272c65550b788913620f1fdc80362b209bc9d7dd2f40d8793080 \ - --hash=sha256:466ce0928e33421ee84ae04c4ac6f253a3a3e6b8d600a79bd43fd4403e0a7a76 \ - --hash=sha256:4f166b4aca8d7d489e82d74627a7069ab34211ef5ebb57c300ec4b9337b60fc0 \ - --hash=sha256:510c3b15587afce9800198b4b142202b323bf4b4b5f9d6c79cb9a35e5e3c30d2 \ - --hash=sha256:5b756e6730ea59b2745072e28ad27f4c837084688e6a6b3633c8b1e509e6ae0e \ - --hash=sha256:5fbe1ab72b998ca77ceabbae63a9b2e2dc2d963f4299b9b278252ddba142d3f1 \ - --hash=sha256:6200a11f003ec26815f7e3d2ded01b43a3810be3528dd760d2f1fa777490c3cd \ - --hash=sha256:65ad1a7a463a2a6f863661329a944a5802c7129f7ad33583dcc11069c17e622c \ - --hash=sha256:694ffa7144fa5cc526c8f4512665003a39fa09ef00d19bbca5c8d3406db72fbe \ - --hash=sha256:6f5d4b2280ceea76c55c893827961ed0a6eadd5a584a7c4e6e6dd7bc10dfdd96 \ - --hash=sha256:7532a46505470be30cbf1dbadb20379fb481244f1ca54207d7df3bf0bbab6a20 \ - --hash=sha256:76a53bfa10b367ee734b95988bd82a9a5f0038a25030f9f23bbbc005010ca600 \ - --hash=sha256:77e41db75f9958f2083e03e9dd39da12247b3430c92267df3af77c83d8ff9eed \ - --hash=sha256:7a43bbfa9b6cfdfaeefbd91038dde65ea2c421dc387ed171613df340650874f2 \ - --hash=sha256:7b41d19c0cfe5c259fe6c539fd75051cd39a5d33d05482f885faf43f7f5e7d26 \ - --hash=sha256:7c5227963409551ae4a6938beb70d56bf1918c554a287d3da6853526212fbe0a \ - --hash=sha256:870a48007872d12e95a996fca3c03a64290d3ea2e61076aa35d3b253cf34cd32 \ - --hash=sha256:88b04e12c9b041a1e0bcb886fec709c488192638a9a7a3677513ac6ba81d8e79 \ - --hash=sha256:8c287ae7ac921dfde88b1c125bd9590b7ec3c900c2d3db5197f1286e144e712b \ - --hash=sha256:903fa5716b8fbb21019268b44f73f3748c41d1a30d71b4a49c84b642c2fed5fa \ - --hash=sha256:9537e4baf0db67f382eb29255a03154fcd4984638303ff9baaa738b10371fa57 \ - --hash=sha256:9951dcbd37850da32b2cb6e391f621c1ee456191c6ae5528af4a34afe357c30e \ - --hash=sha256:9b2f7d0408ddeb8ea1fd43d3db79a8cefaccadd2a812f021333b338ed6b10aba \ - --hash=sha256:9c88e134d51d5e82315a7c32b914a58751b7353eb5268dbd02eabf020b4c4700 \ - --hash=sha256:9fae214f6c43cd47f7bef98c56919b9222481e833be2915f6857a1e9e8a15318 \ - --hash=sha256:a3a669f11289a8995d24fbfc0e63f8289dd03c9aaa0cc8f1eab31d18ca61a382 \ - --hash=sha256:aa741c1a8a8cc25eb3a3a01a62bdb5095a773d8c6a86470bde7f607a447e7905 \ - --hash=sha256:b0877a9a2129a2c56a2eae2da016743db7d9d6a05d5e1c198f1b7808c602a30e \ - --hash=sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455 \ - --hash=sha256:caff52cb5cd7626872d9696aee5b794abe172804beb7db52eed1fd5824b63910 \ - --hash=sha256:cbc1eb55342cbac8f7ec159088d54e2cfdd5ddf61c87b8bbe682d113789331b2 \ - --hash=sha256:cd16a89efe3a003029c87ff19e9fba635864e064da646bc749fc1908a4af18f3 \ - --hash=sha256:ce5b64dfe8d0cca407d88b0ee619d80d4215a2612c1af8c98a92180e7109f4b5 \ - --hash=sha256:d58a5a71c4c37354f9e0c24c9c8321f0185f6945ef027460b809f4bb474bfe41 \ - --hash=sha256:db41f3845eb579b544c962864cce2c2a0257fe30f0f1e18e51b1e8cbb4e0ac6d \ - --hash=sha256:db5b25265010a1b3dca6a174a443a0ed4c4ab12d5e2883a11c97d6e6d59b12f9 \ - --hash=sha256:dd0404d154084a371e6d2bafc787201612a1359c2dee688ae334f9118aa0bf47 \ - --hash=sha256:de431765bd5fe62119e0bc6bc6e7b17ac53017ae1782acf88fcf6b7eae475a49 \ - --hash=sha256:df02fdec0c533301497acb0bc0f27f479a3a63dcdc3a099ae33a902857f07477 \ - --hash=sha256:e8533f5111704d75de3139bf0b8136d3a6c1642c55c067866fa0a51c2155ee33 \ - --hash=sha256:f2f908239b7098799b8845e5936c2ccb91d8c2323be02e82f8dcb4a80dcf4a25 \ - --hash=sha256:f8bfd36f368efe0ab2a6aa3db7f14598aac454b06849fb633b762ddbede1db90 \ - --hash=sha256:ffe73f9e7aea404722058405ff24041e59d31ca23d1da0895af48050a07b6932 +greenlet==1.1.3.post0 \ + --hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \ + --hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \ + --hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \ + --hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \ + --hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \ + --hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \ + --hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \ + --hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \ + --hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \ + --hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \ + --hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \ + --hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \ + --hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \ + --hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \ + --hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \ + --hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \ + --hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \ + --hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \ + --hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \ + --hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \ + --hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \ + --hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \ + --hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \ + --hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \ + --hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \ + --hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \ + --hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \ + --hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \ + --hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \ + --hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \ + --hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \ + --hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \ + --hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \ + --hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \ + --hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \ + --hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \ + --hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \ + --hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \ + --hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \ + --hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \ + --hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \ + --hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \ + --hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \ + --hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \ + --hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \ + --hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \ + --hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \ + --hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \ + --hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \ + --hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \ + --hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \ + --hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \ + --hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \ + --hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \ + --hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \ + --hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \ + --hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \ + --hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \ + --hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \ + --hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \ + --hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \ + --hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \ + --hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \ + --hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \ + --hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \ + --hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04 # via # -r requirements/light-threads.in # eventlet @@ -184,62 +200,48 @@ zope-event==4.5.0 \ --hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \ --hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330 # via gevent -zope-interface==5.4.0 \ - --hash=sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192 \ - --hash=sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702 \ - --hash=sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09 \ - --hash=sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4 \ - --hash=sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a \ - --hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \ - --hash=sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf \ - --hash=sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c \ - --hash=sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d \ - --hash=sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78 \ - --hash=sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83 \ - --hash=sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531 \ - --hash=sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46 \ - --hash=sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021 \ - --hash=sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94 \ - --hash=sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc \ - --hash=sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63 \ - --hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \ - --hash=sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117 \ - --hash=sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25 \ - --hash=sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05 \ - --hash=sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e \ - --hash=sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1 \ - --hash=sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004 \ - --hash=sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2 \ - --hash=sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e \ - --hash=sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f \ - --hash=sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f \ - --hash=sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120 \ - --hash=sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f \ - --hash=sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1 \ - --hash=sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9 \ - --hash=sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e \ - --hash=sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7 \ - --hash=sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8 \ - --hash=sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b \ - --hash=sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155 \ - --hash=sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7 \ - --hash=sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c \ - --hash=sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325 \ - --hash=sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d \ - --hash=sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb \ - --hash=sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e \ - --hash=sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959 \ - --hash=sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7 \ - --hash=sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920 \ - --hash=sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e \ - --hash=sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48 \ - --hash=sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8 \ - --hash=sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4 \ - --hash=sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263 +zope-interface==5.5.0 \ + --hash=sha256:006f8dd81fae28027fc28ada214855166712bf4f0bfbc5a8788f9b70982b9437 \ + --hash=sha256:03f5ae315db0d0de668125d983e2a819a554f3fdb2d53b7e934e3eb3c3c7375d \ + --hash=sha256:0eb2b3e84f48dd9cfc8621c80fba905d7e228615c67f76c7df7c716065669bb6 \ + --hash=sha256:1e3495bb0cdcea212154e558082c256f11b18031f05193ae2fb85d048848db14 \ + --hash=sha256:26c1456520fdcafecc5765bec4783eeafd2e893eabc636908f50ee31fe5c738c \ + --hash=sha256:2cb3003941f5f4fa577479ac6d5db2b940acb600096dd9ea9bf07007f5cab46f \ + --hash=sha256:37ec9ade9902f412cc7e7a32d71f79dec3035bad9bd0170226252eed88763c48 \ + --hash=sha256:3eedf3d04179774d750e8bb4463e6da350956a50ed44d7b86098e452d7ec385e \ + --hash=sha256:3f68404edb1a4fb6aa8a94675521ca26c83ebbdbb90e894f749ae0dc4ca98418 \ + --hash=sha256:423c074e404f13e6fa07f4454f47fdbb38d358be22945bc812b94289d9142374 \ + --hash=sha256:43490ad65d4c64e45a30e51a2beb7a6b63e1ff395302ad22392224eb618476d6 \ + --hash=sha256:47ff078734a1030c48103422a99e71a7662d20258c00306546441adf689416f7 \ + --hash=sha256:58a66c2020a347973168a4a9d64317bac52f9fdfd3e6b80b252be30da881a64e \ + --hash=sha256:58a975f89e4584d0223ab813c5ba4787064c68feef4b30d600f5e01de90ae9ce \ + --hash=sha256:5c6023ae7defd052cf76986ce77922177b0c2f3913bea31b5b28fbdf6cb7099e \ + --hash=sha256:6566b3d2657e7609cd8751bcb1eab1202b1692a7af223035a5887d64bb3a2f3b \ + --hash=sha256:687cab7f9ae18d2c146f315d0ca81e5ffe89a139b88277afa70d52f632515854 \ + --hash=sha256:700ebf9662cf8df70e2f0cb4988e078c53f65ee3eefd5c9d80cf988c4175c8e3 \ + --hash=sha256:740f3c1b44380658777669bcc42f650f5348e53797f2cee0d93dc9b0f9d7cc69 \ + --hash=sha256:7bdcec93f152e0e1942102537eed7b166d6661ae57835b20a52a2a3d6a3e1bf3 \ + --hash=sha256:7d9ec1e6694af39b687045712a8ad14ddcb568670d5eb1b66b48b98b9312afba \ + --hash=sha256:85dd6dd9aaae7a176948d8bb62e20e2968588fd787c29c5d0d964ab475168d3d \ + --hash=sha256:8b9f153208d74ccfa25449a0c6cb756ab792ce0dc99d9d771d935f039b38740c \ + --hash=sha256:8c791f4c203ccdbcda588ea4c8a6e4353e10435ea48ddd3d8734a26fe9714cba \ + --hash=sha256:970661ece2029915b8f7f70892e88404340fbdefd64728380cad41c8dce14ff4 \ + --hash=sha256:9cdc4e898d3b1547d018829fd4a9f403e52e51bba24be0fbfa37f3174e1ef797 \ + --hash=sha256:9dc4493aa3d87591e3d2bf1453e25b98038c839ca8e499df3d7106631b66fe83 \ + --hash=sha256:a69c28d85bb7cf557751a5214cb3f657b2b035c8c96d71080c1253b75b79b69b \ + --hash=sha256:aeac590cce44e68ee8ad0b8ecf4d7bf15801f102d564ca1b0eb1f12f584ee656 \ + --hash=sha256:be11fce0e6af6c0e8d93c10ef17b25aa7c4acb7ec644bff2596c0d639c49e20f \ + --hash=sha256:cbbf83914b9a883ab324f728de869f4e406e0cbcd92df7e0a88decf6f9ab7d5a \ + --hash=sha256:cfa614d049667bed1c737435c609c0956c5dc0dbafdc1145ee7935e4658582cb \ + --hash=sha256:d18fb0f6c8169d26044128a2e7d3c39377a8a151c564e87b875d379dbafd3930 \ + --hash=sha256:d80f6236b57a95eb19d5e47eb68d0296119e1eff6deaa2971ab8abe3af918420 \ + --hash=sha256:da7912ae76e1df6a1fb841b619110b1be4c86dfb36699d7fd2f177105cdea885 \ + --hash=sha256:df6593e150d13cfcce69b0aec5df7bc248cb91e4258a7374c129bb6d56b4e5ca \ + --hash=sha256:f70726b60009433111fe9928f5d89cbb18962411d33c45fb19eb81b9bbd26fcd # via gevent # The following packages are considered to be unsafe in a requirements file: -setuptools==65.4.0 \ - --hash=sha256:a8f6e213b4b0661f590ccf40de95d28a177cd747d098624ad3f69c40287297e9 \ - --hash=sha256:c2d2709550f15aab6c9110196ea312f468f41cd546bceb24127a1be6fdcaeeb1 +setuptools==65.5.0 \ + --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ + --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 # via gevent diff --git a/requirements/lint.pip b/requirements/lint.pip index b571bd031..75e117c50 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -8,9 +8,9 @@ alabaster==0.7.12 \ --hash=sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359 \ --hash=sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02 # via sphinx -astroid==2.12.10 \ - --hash=sha256:81f870105d892e73bf535da77a8261aa5bde838fa4ed12bb2f435291a098c581 \ - --hash=sha256:997e0c735df60d4a4caff27080a3afc51f9bdd693d3572a4a0b7090b645c36c5 +astroid==2.12.12 \ + --hash=sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83 \ + --hash=sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f # via pylint atomicwrites==1.4.1 \ --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 @@ -122,65 +122,77 @@ future==0.18.2 \ # via # -r requirements/pytest.pip # pycontracts -greenlet==1.1.3 \ - --hash=sha256:0118817c9341ef2b0f75f5af79ac377e4da6ff637e5ee4ac91802c0e379dadb4 \ - --hash=sha256:048d2bed76c2aa6de7af500ae0ea51dd2267aec0e0f2a436981159053d0bc7cc \ - --hash=sha256:07c58e169bbe1e87b8bbf15a5c1b779a7616df9fd3e61cadc9d691740015b4f8 \ - --hash=sha256:095a980288fe05adf3d002fbb180c99bdcf0f930e220aa66fcd56e7914a38202 \ - --hash=sha256:0b181e9aa6cb2f5ec0cacc8cee6e5a3093416c841ba32c185c30c160487f0380 \ - --hash=sha256:1626185d938d7381631e48e6f7713e8d4b964be246073e1a1d15c2f061ac9f08 \ - --hash=sha256:184416e481295832350a4bf731ba619a92f5689bf5d0fa4341e98b98b1265bd7 \ - --hash=sha256:1dd51d2650e70c6c4af37f454737bf4a11e568945b27f74b471e8e2a9fd21268 \ - --hash=sha256:1ec2779774d8e42ed0440cf8bc55540175187e8e934f2be25199bf4ed948cd9e \ - --hash=sha256:2cf45e339cabea16c07586306a31cfcc5a3b5e1626d365714d283732afed6809 \ - --hash=sha256:2fb0aa7f6996879551fd67461d5d3ab0c3c0245da98be90c89fcb7a18d437403 \ - --hash=sha256:44b4817c34c9272c65550b788913620f1fdc80362b209bc9d7dd2f40d8793080 \ - --hash=sha256:466ce0928e33421ee84ae04c4ac6f253a3a3e6b8d600a79bd43fd4403e0a7a76 \ - --hash=sha256:4f166b4aca8d7d489e82d74627a7069ab34211ef5ebb57c300ec4b9337b60fc0 \ - --hash=sha256:510c3b15587afce9800198b4b142202b323bf4b4b5f9d6c79cb9a35e5e3c30d2 \ - --hash=sha256:5b756e6730ea59b2745072e28ad27f4c837084688e6a6b3633c8b1e509e6ae0e \ - --hash=sha256:5fbe1ab72b998ca77ceabbae63a9b2e2dc2d963f4299b9b278252ddba142d3f1 \ - --hash=sha256:6200a11f003ec26815f7e3d2ded01b43a3810be3528dd760d2f1fa777490c3cd \ - --hash=sha256:65ad1a7a463a2a6f863661329a944a5802c7129f7ad33583dcc11069c17e622c \ - --hash=sha256:694ffa7144fa5cc526c8f4512665003a39fa09ef00d19bbca5c8d3406db72fbe \ - --hash=sha256:6f5d4b2280ceea76c55c893827961ed0a6eadd5a584a7c4e6e6dd7bc10dfdd96 \ - --hash=sha256:7532a46505470be30cbf1dbadb20379fb481244f1ca54207d7df3bf0bbab6a20 \ - --hash=sha256:76a53bfa10b367ee734b95988bd82a9a5f0038a25030f9f23bbbc005010ca600 \ - --hash=sha256:77e41db75f9958f2083e03e9dd39da12247b3430c92267df3af77c83d8ff9eed \ - --hash=sha256:7a43bbfa9b6cfdfaeefbd91038dde65ea2c421dc387ed171613df340650874f2 \ - --hash=sha256:7b41d19c0cfe5c259fe6c539fd75051cd39a5d33d05482f885faf43f7f5e7d26 \ - --hash=sha256:7c5227963409551ae4a6938beb70d56bf1918c554a287d3da6853526212fbe0a \ - --hash=sha256:870a48007872d12e95a996fca3c03a64290d3ea2e61076aa35d3b253cf34cd32 \ - --hash=sha256:88b04e12c9b041a1e0bcb886fec709c488192638a9a7a3677513ac6ba81d8e79 \ - --hash=sha256:8c287ae7ac921dfde88b1c125bd9590b7ec3c900c2d3db5197f1286e144e712b \ - --hash=sha256:903fa5716b8fbb21019268b44f73f3748c41d1a30d71b4a49c84b642c2fed5fa \ - --hash=sha256:9537e4baf0db67f382eb29255a03154fcd4984638303ff9baaa738b10371fa57 \ - --hash=sha256:9951dcbd37850da32b2cb6e391f621c1ee456191c6ae5528af4a34afe357c30e \ - --hash=sha256:9b2f7d0408ddeb8ea1fd43d3db79a8cefaccadd2a812f021333b338ed6b10aba \ - --hash=sha256:9c88e134d51d5e82315a7c32b914a58751b7353eb5268dbd02eabf020b4c4700 \ - --hash=sha256:9fae214f6c43cd47f7bef98c56919b9222481e833be2915f6857a1e9e8a15318 \ - --hash=sha256:a3a669f11289a8995d24fbfc0e63f8289dd03c9aaa0cc8f1eab31d18ca61a382 \ - --hash=sha256:aa741c1a8a8cc25eb3a3a01a62bdb5095a773d8c6a86470bde7f607a447e7905 \ - --hash=sha256:b0877a9a2129a2c56a2eae2da016743db7d9d6a05d5e1c198f1b7808c602a30e \ - --hash=sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455 \ - --hash=sha256:caff52cb5cd7626872d9696aee5b794abe172804beb7db52eed1fd5824b63910 \ - --hash=sha256:cbc1eb55342cbac8f7ec159088d54e2cfdd5ddf61c87b8bbe682d113789331b2 \ - --hash=sha256:cd16a89efe3a003029c87ff19e9fba635864e064da646bc749fc1908a4af18f3 \ - --hash=sha256:ce5b64dfe8d0cca407d88b0ee619d80d4215a2612c1af8c98a92180e7109f4b5 \ - --hash=sha256:d58a5a71c4c37354f9e0c24c9c8321f0185f6945ef027460b809f4bb474bfe41 \ - --hash=sha256:db41f3845eb579b544c962864cce2c2a0257fe30f0f1e18e51b1e8cbb4e0ac6d \ - --hash=sha256:db5b25265010a1b3dca6a174a443a0ed4c4ab12d5e2883a11c97d6e6d59b12f9 \ - --hash=sha256:dd0404d154084a371e6d2bafc787201612a1359c2dee688ae334f9118aa0bf47 \ - --hash=sha256:de431765bd5fe62119e0bc6bc6e7b17ac53017ae1782acf88fcf6b7eae475a49 \ - --hash=sha256:df02fdec0c533301497acb0bc0f27f479a3a63dcdc3a099ae33a902857f07477 \ - --hash=sha256:e8533f5111704d75de3139bf0b8136d3a6c1642c55c067866fa0a51c2155ee33 \ - --hash=sha256:f2f908239b7098799b8845e5936c2ccb91d8c2323be02e82f8dcb4a80dcf4a25 \ - --hash=sha256:f8bfd36f368efe0ab2a6aa3db7f14598aac454b06849fb633b762ddbede1db90 \ - --hash=sha256:ffe73f9e7aea404722058405ff24041e59d31ca23d1da0895af48050a07b6932 +greenlet==1.1.3.post0 \ + --hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \ + --hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \ + --hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \ + --hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \ + --hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \ + --hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \ + --hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \ + --hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \ + --hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \ + --hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \ + --hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \ + --hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \ + --hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \ + --hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \ + --hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \ + --hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \ + --hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \ + --hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \ + --hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \ + --hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \ + --hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \ + --hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \ + --hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \ + --hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \ + --hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \ + --hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \ + --hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \ + --hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \ + --hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \ + --hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \ + --hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \ + --hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \ + --hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \ + --hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \ + --hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \ + --hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \ + --hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \ + --hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \ + --hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \ + --hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \ + --hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \ + --hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \ + --hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \ + --hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \ + --hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \ + --hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \ + --hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \ + --hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \ + --hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \ + --hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \ + --hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \ + --hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \ + --hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \ + --hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \ + --hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \ + --hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \ + --hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \ + --hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \ + --hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \ + --hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \ + --hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \ + --hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \ + --hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \ + --hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \ + --hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \ + --hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04 # via -r requirements/dev.in -hypothesis==6.54.6 \ - --hash=sha256:2d5e2d5ccd0efce4e0968a6164f4e4853f808e33f4d91490c975c98beec0c7c3 \ - --hash=sha256:e44833325f9a55f795596ceefd7ede7d626cfe45836025d2647cccaff7070e10 +hypothesis==6.56.3 \ + --hash=sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a \ + --hash=sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -190,9 +202,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -332,9 +344,9 @@ mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e # via pylint -more-itertools==8.14.0 \ - --hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \ - --hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750 +more-itertools==9.0.0 \ + --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ + --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ @@ -402,9 +414,9 @@ pygments==2.13.0 \ # readme-renderer # rich # sphinx -pylint==2.15.3 \ - --hash=sha256:5fdfd44af182866999e6123139d265334267339f29961f00c89783155eacc60b \ - --hash=sha256:7f6aad1d8d50807f7bc64f89ac75256a9baf8e6ed491cc9bc65592bc3f462cf1 +pylint==2.15.5 \ + --hash=sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df \ + --hash=sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004 # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -430,9 +442,9 @@ pytest-xdist==2.5.0 \ --hash=sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf \ --hash=sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65 # via -r requirements/pytest.pip -pytz==2022.2.1 \ - --hash=sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197 \ - --hash=sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5 +pytz==2022.5 \ + --hash=sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22 \ + --hash=sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914 # via babel qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 @@ -453,17 +465,17 @@ requests==2.28.1 \ # requests-toolbelt # sphinx # twine -requests-toolbelt==0.9.1 \ - --hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f \ - --hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0 +requests-toolbelt==0.10.0 \ + --hash=sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985 \ + --hash=sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30 # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==12.5.1 \ - --hash=sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb \ - --hash=sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca +rich==12.6.0 \ + --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ + --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 # via twine six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -485,9 +497,9 @@ sortedcontainers==2.4.0 \ # via # -r requirements/pytest.pip # hypothesis -sphinx==5.2.1 \ - --hash=sha256:3dcf00fcf82cf91118db9b7177edea4fc01998976f893928d0ab0c58c54be2ca \ - --hash=sha256:c009bb2e9ac5db487bcf53f015504005a330ff7c631bb6ab2604e0d65bae8b54 +sphinx==5.3.0 \ + --hash=sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d \ + --hash=sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5 # via # -r doc/requirements.in # sphinx-autobuild @@ -530,9 +542,9 @@ sphinxcontrib-serializinghtml==1.1.5 \ --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 # via sphinx -sphinxcontrib-spelling==7.6.0 \ - --hash=sha256:292cd7e1f73a763451693b4d48c9bded151084f6a91e5337733e9fa8715d20ec \ - --hash=sha256:6c1313618412511109f7b76029fbd60df5aa4acf67a2dc9cd1b1016d15e882ff +sphinxcontrib-spelling==7.6.2 \ + --hash=sha256:a129d5dd0c00c9d414bcdf599afddb55bae01f1d543636e7ebb09491ba2babd4 \ + --hash=sha256:a7ca90eea630c825657e1344000a11d7d7f547a865e0eebbed08d112beb073d1 # via -r doc/requirements.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ @@ -545,9 +557,9 @@ tomli==2.0.1 \ # pylint # pytest # tox -tomlkit==0.11.4 \ - --hash=sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c \ - --hash=sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83 +tomlkit==0.11.5 \ + --hash=sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c \ + --hash=sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7 # via pylint tornado==6.2 \ --hash=sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca \ @@ -596,9 +608,9 @@ typed-ast==1.5.4 \ --hash=sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3 \ --hash=sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66 # via astroid -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -696,9 +708,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -713,7 +725,7 @@ pip==22.0.4 \ # -c doc/../requirements/pins.pip # -c requirements/pins.pip # -r requirements/pip.pip -setuptools==65.4.0 \ - --hash=sha256:a8f6e213b4b0661f590ccf40de95d28a177cd747d098624ad3f69c40287297e9 \ - --hash=sha256:c2d2709550f15aab6c9110196ea312f468f41cd546bceb24127a1be6fdcaeeb1 +setuptools==65.5.0 \ + --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ + --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 # via check-manifest diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 3b3d561f4..3e8ac111c 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -12,9 +12,9 @@ click==8.1.3 \ --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 # via pip-tools -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # build # click @@ -27,9 +27,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -pip-tools==6.8.0 \ - --hash=sha256:39e8aee465446e02278d80dbebd4325d1dd8633248f43213c73a25f58e7d8a55 \ - --hash=sha256:3e5cd4acbf383d19bdfdeab04738b6313ebf4ad22ce49bf529c729061eabfab8 +pip-tools==6.9.0 \ + --hash=sha256:16ea0ced6a1d8a7dfbd5e14d5bf659acffa63f3efd0702233dc685f066c00a6b \ + --hash=sha256:b4762359978fd81a2b4b666e6dca15266bdc65680d06900c4da34243f35e4b5d # via -r requirements/pip-tools.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -41,17 +41,17 @@ tomli==2.0.1 \ # via # build # pep517 -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata wheel==0.37.1 \ --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 # via pip-tools -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via # importlib-metadata # pep517 @@ -63,7 +63,7 @@ pip==22.0.4 \ # via # -c requirements/pins.pip # pip-tools -setuptools==65.4.0 \ - --hash=sha256:a8f6e213b4b0661f590ccf40de95d28a177cd747d098624ad3f69c40287297e9 \ - --hash=sha256:c2d2709550f15aab6c9110196ea312f468f41cd546bceb24127a1be6fdcaeeb1 +setuptools==65.5.0 \ + --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ + --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 # via pip-tools diff --git a/requirements/pip.pip b/requirements/pip.pip index e30d85826..ac917279f 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -12,25 +12,25 @@ filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 # via virtualenv -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via virtualenv platformdirs==2.5.2 \ --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 # via virtualenv -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata virtualenv==20.16.5 \ --hash=sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da \ --hash=sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27 # via -r requirements/pip.in -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 67a507f71..6bb164ff8 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -40,13 +40,13 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.54.6 \ - --hash=sha256:2d5e2d5ccd0efce4e0968a6164f4e4853f808e33f4d91490c975c98beec0c7c3 \ - --hash=sha256:e44833325f9a55f795596ceefd7ede7d626cfe45836025d2647cccaff7070e10 +hypothesis==6.56.3 \ + --hash=sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a \ + --hash=sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789 # via -r requirements/pytest.in -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # pluggy # pytest @@ -107,11 +107,11 @@ tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via pytest -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via importlib-metadata diff --git a/requirements/tox.pip b/requirements/tox.pip index e8b20ebcb..8f03c6c3a 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -18,16 +18,16 @@ filelock==3.8.0 \ # via # tox # virtualenv -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # pluggy # tox # virtualenv -importlib-resources==5.9.0 \ - --hash=sha256:5481e97fb45af8dcf2f798952625591c58fe599d0735d86b10f54de086a61681 \ - --hash=sha256:f78a8df21a79bcc30cfd400bdc38f314333de7c0fb619763f6b9dabab8268bb7 +importlib-resources==5.10.0 \ + --hash=sha256:c01b1b94210d9849f286b86bb51bcea7cd56dde0600d8db721d7b81330711668 \ + --hash=sha256:ee17ec648f85480d523596ce49eae8ead87d5631ae1551f913c0100b5edd3437 # via tox-gh-actions packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ @@ -67,17 +67,17 @@ tox-gh-actions==2.10.0 \ --hash=sha256:4a21e70d799736016cf75c3415f5991008cf81fa6ee1c047d1be24900cec31bb \ --hash=sha256:acb64641f09022581040d92c28d6c06d261a829c008575892fd458e23e638971 # via -r requirements/tox.in -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata virtualenv==20.16.5 \ --hash=sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da \ --hash=sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27 # via tox -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.9.0 \ + --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ + --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 # via # importlib-metadata # importlib-resources From dcf532b8f9881d36f731939dc1f0deca01e311d7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 26 Oct 2022 18:38:18 -0400 Subject: [PATCH 025/200] chore: make upgrade --- doc/requirements.pip | 12 ++-- requirements/dev.pip | 120 ++++++++++++++----------------------- requirements/kit.pip | 18 +++--- requirements/lint.pip | 120 ++++++++++++++----------------------- requirements/pip-tools.pip | 6 +- requirements/pip.pip | 12 ++-- requirements/pytest.pip | 39 +++++------- requirements/tox.pip | 24 ++++---- 8 files changed, 143 insertions(+), 208 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 57250ebf8..87f45ffdc 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -26,9 +26,9 @@ cogapp==3.3.0 \ --hash=sha256:1be95183f70282422d594fa42426be6923070a4bd8335621f6347f3aeee81db0 \ --hash=sha256:8b5b5f6063d8ee231961c05da010cb27c30876b2279e23ad0eae5f8f09460d50 # via -r doc/requirements.in -colorama==0.4.5 \ - --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ - --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via sphinx-autobuild docutils==0.17.1 \ --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ @@ -205,7 +205,7 @@ urllib3==1.26.12 \ --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 # via requests -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via importlib-metadata diff --git a/requirements/dev.pip b/requirements/dev.pip index d7c556b4b..d70dd3892 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -50,9 +50,9 @@ cogapp==3.3.0 \ --hash=sha256:1be95183f70282422d594fa42426be6923070a4bd8335621f6347f3aeee81db0 \ --hash=sha256:8b5b5f6063d8ee231961c05da010cb27c30876b2279e23ad0eae5f8f09460d50 # via -r requirements/dev.in -colorama==0.4.5 \ - --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ - --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via -r requirements/pytest.pip commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ @@ -64,9 +64,9 @@ decorator==5.1.1 \ # via # -r requirements/pytest.pip # pycontracts -dill==0.3.5.1 \ - --hash=sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302 \ - --hash=sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86 +dill==0.3.6 \ + --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 \ + --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373 # via pylint distlib==0.3.6 \ --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ @@ -84,6 +84,7 @@ exceptiongroup==1.0.0rc9 \ # via # -r requirements/pytest.pip # hypothesis + # pytest execnet==1.9.0 \ --hash=sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5 \ --hash=sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142 @@ -218,44 +219,26 @@ keyring==23.9.3 \ --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 # via twine -lazy-object-proxy==1.7.1 \ - --hash=sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7 \ - --hash=sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a \ - --hash=sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c \ - --hash=sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc \ - --hash=sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f \ - --hash=sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09 \ - --hash=sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442 \ - --hash=sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e \ - --hash=sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029 \ - --hash=sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61 \ - --hash=sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb \ - --hash=sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0 \ - --hash=sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35 \ - --hash=sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42 \ - --hash=sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1 \ - --hash=sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad \ - --hash=sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443 \ - --hash=sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd \ - --hash=sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9 \ - --hash=sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148 \ - --hash=sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38 \ - --hash=sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55 \ - --hash=sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36 \ - --hash=sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a \ - --hash=sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b \ - --hash=sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44 \ - --hash=sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6 \ - --hash=sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69 \ - --hash=sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4 \ - --hash=sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84 \ - --hash=sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de \ - --hash=sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28 \ - --hash=sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c \ - --hash=sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1 \ - --hash=sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8 \ - --hash=sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b \ - --hash=sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb +lazy-object-proxy==1.8.0 \ + --hash=sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada \ + --hash=sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d \ + --hash=sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7 \ + --hash=sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe \ + --hash=sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd \ + --hash=sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c \ + --hash=sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858 \ + --hash=sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288 \ + --hash=sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec \ + --hash=sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f \ + --hash=sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891 \ + --hash=sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c \ + --hash=sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25 \ + --hash=sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156 \ + --hash=sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8 \ + --hash=sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f \ + --hash=sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e \ + --hash=sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0 \ + --hash=sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b # via astroid libsass==0.21.0 \ --hash=sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb \ @@ -318,11 +301,7 @@ pudb==2022.1.2 \ py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 - # via - # -r requirements/pytest.pip - # pytest - # pytest-forked - # tox + # via tox pycontracts @ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e574d20d86000880919c3.zip \ --hash=sha256:2b889cbfb03b43dc811b5879248ac5c7e209ece78f03be9633de76a6b21a5a89 # via -r requirements/pytest.pip @@ -344,22 +323,15 @@ pyparsing==3.0.9 \ # -r requirements/pytest.pip # packaging # pycontracts -pytest==7.1.3 \ - --hash=sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7 \ - --hash=sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39 - # via - # -r requirements/pytest.pip - # pytest-forked - # pytest-xdist -pytest-forked==1.4.0 \ - --hash=sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e \ - --hash=sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8 +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==2.5.0 \ - --hash=sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf \ - --hash=sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65 +pytest-xdist==3.0.2 \ + --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ + --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b # via -r requirements/pytest.pip qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 @@ -379,9 +351,9 @@ requests==2.28.1 \ # -r requirements/dev.in # requests-toolbelt # twine -requests-toolbelt==0.10.0 \ - --hash=sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985 \ - --hash=sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30 +requests-toolbelt==0.10.1 \ + --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ + --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ @@ -421,9 +393,9 @@ tomlkit==0.11.5 \ --hash=sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c \ --hash=sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7 # via pylint -tox==3.26.0 \ - --hash=sha256:44f3c347c68c2c68799d7d44f1808f9d396fc8a1a500cbc624253375c7ae107e \ - --hash=sha256:bf037662d7c740d15c9924ba23bb3e587df20598697bb985ac2b49bdc2d847f6 +tox==3.27.0 \ + --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ + --hash=sha256:d2c945f02a03d4501374a3d5430877380deb69b218b1df9b7f1d2f2a10befaf9 # via -r requirements/dev.in twine==4.0.1 \ --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ @@ -479,9 +451,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.16.5 \ - --hash=sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da \ - --hash=sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27 +virtualenv==20.16.6 \ + --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ + --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e # via # -r requirements/pip.pip # tox @@ -555,9 +527,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via # -r requirements/pip.pip # -r requirements/pytest.pip diff --git a/requirements/kit.pip b/requirements/kit.pip index fcc047784..96609b8cf 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -26,13 +26,13 @@ certifi==2022.5.18.1 \ # via # -c requirements/pins.pip # cibuildwheel -cibuildwheel==2.11.1 \ - --hash=sha256:a6e78d960c3983424859e9f606cae3ae296f8ab6a3fa5bdeb7343645a00b8068 \ - --hash=sha256:fa8bcbcbe169f62e2adb9104a2efb5807c4be0ec39b4764dcd15185eb44898e6 +cibuildwheel==2.11.2 \ + --hash=sha256:392a39c7022da9ac016362b727c3ae39b304742adfcc36dab7ab0a47b90cc461 \ + --hash=sha256:e8dab8e6cf77ff0002f65873bba36b3969b23f522cc014538abcda2cbd24329f # via -r requirements/kit.in -colorama==0.4.5 \ - --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ - --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via -r requirements/kit.in filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ @@ -84,9 +84,9 @@ wheel==0.37.1 \ --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 # via -r requirements/kit.in -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via # importlib-metadata # pep517 diff --git a/requirements/lint.pip b/requirements/lint.pip index 75e117c50..7b90c2a60 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -61,9 +61,9 @@ cogapp==3.3.0 \ # via # -r doc/requirements.in # -r requirements/dev.in -colorama==0.4.5 \ - --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ - --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via # -r requirements/pytest.pip # sphinx-autobuild @@ -77,9 +77,9 @@ decorator==5.1.1 \ # via # -r requirements/pytest.pip # pycontracts -dill==0.3.5.1 \ - --hash=sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302 \ - --hash=sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86 +dill==0.3.6 \ + --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 \ + --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373 # via pylint distlib==0.3.6 \ --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ @@ -100,6 +100,7 @@ exceptiongroup==1.0.0rc9 \ # via # -r requirements/pytest.pip # hypothesis + # pytest execnet==1.9.0 \ --hash=sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5 \ --hash=sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142 @@ -244,44 +245,26 @@ keyring==23.9.3 \ --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 # via twine -lazy-object-proxy==1.7.1 \ - --hash=sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7 \ - --hash=sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a \ - --hash=sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c \ - --hash=sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc \ - --hash=sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f \ - --hash=sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09 \ - --hash=sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442 \ - --hash=sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e \ - --hash=sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029 \ - --hash=sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61 \ - --hash=sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb \ - --hash=sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0 \ - --hash=sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35 \ - --hash=sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42 \ - --hash=sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1 \ - --hash=sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad \ - --hash=sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443 \ - --hash=sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd \ - --hash=sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9 \ - --hash=sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148 \ - --hash=sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38 \ - --hash=sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55 \ - --hash=sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36 \ - --hash=sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a \ - --hash=sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b \ - --hash=sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44 \ - --hash=sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6 \ - --hash=sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69 \ - --hash=sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4 \ - --hash=sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84 \ - --hash=sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de \ - --hash=sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28 \ - --hash=sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c \ - --hash=sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1 \ - --hash=sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8 \ - --hash=sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b \ - --hash=sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb +lazy-object-proxy==1.8.0 \ + --hash=sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada \ + --hash=sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d \ + --hash=sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7 \ + --hash=sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe \ + --hash=sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd \ + --hash=sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c \ + --hash=sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858 \ + --hash=sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288 \ + --hash=sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec \ + --hash=sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f \ + --hash=sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891 \ + --hash=sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c \ + --hash=sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25 \ + --hash=sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156 \ + --hash=sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8 \ + --hash=sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f \ + --hash=sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e \ + --hash=sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0 \ + --hash=sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b # via astroid libsass==0.21.0 \ --hash=sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb \ @@ -390,11 +373,7 @@ pudb==2022.1.2 \ py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 - # via - # -r requirements/pytest.pip - # pytest - # pytest-forked - # tox + # via tox pycontracts @ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e574d20d86000880919c3.zip \ --hash=sha256:2b889cbfb03b43dc811b5879248ac5c7e209ece78f03be9633de76a6b21a5a89 # via -r requirements/pytest.pip @@ -425,22 +404,15 @@ pyparsing==3.0.9 \ # -r requirements/pytest.pip # packaging # pycontracts -pytest==7.1.3 \ - --hash=sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7 \ - --hash=sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39 - # via - # -r requirements/pytest.pip - # pytest-forked - # pytest-xdist -pytest-forked==1.4.0 \ - --hash=sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e \ - --hash=sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8 +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==2.5.0 \ - --hash=sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf \ - --hash=sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65 +pytest-xdist==3.0.2 \ + --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ + --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b # via -r requirements/pytest.pip pytz==2022.5 \ --hash=sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22 \ @@ -465,9 +437,9 @@ requests==2.28.1 \ # requests-toolbelt # sphinx # twine -requests-toolbelt==0.10.0 \ - --hash=sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985 \ - --hash=sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30 +requests-toolbelt==0.10.1 \ + --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ + --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ @@ -574,9 +546,9 @@ tornado==6.2 \ --hash=sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e \ --hash=sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b # via livereload -tox==3.26.0 \ - --hash=sha256:44f3c347c68c2c68799d7d44f1808f9d396fc8a1a500cbc624253375c7ae107e \ - --hash=sha256:bf037662d7c740d15c9924ba23bb3e587df20598697bb985ac2b49bdc2d847f6 +tox==3.27.0 \ + --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ + --hash=sha256:d2c945f02a03d4501374a3d5430877380deb69b218b1df9b7f1d2f2a10befaf9 # via -r requirements/dev.in twine==4.0.1 \ --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ @@ -632,9 +604,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.16.5 \ - --hash=sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da \ - --hash=sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27 +virtualenv==20.16.6 \ + --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ + --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e # via # -r requirements/pip.pip # tox @@ -708,9 +680,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via # -r requirements/pip.pip # -r requirements/pytest.pip diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 3e8ac111c..ad34607d0 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -49,9 +49,9 @@ wheel==0.37.1 \ --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 # via pip-tools -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via # importlib-metadata # pep517 diff --git a/requirements/pip.pip b/requirements/pip.pip index ac917279f..1e9e72fdc 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -24,13 +24,13 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.16.5 \ - --hash=sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da \ - --hash=sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27 +virtualenv==20.16.6 \ + --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ + --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e # via -r requirements/pip.in -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 6bb164ff8..68f411cea 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -17,9 +17,9 @@ backports-functools-lru-cache==1.6.4 \ --hash=sha256:d5ed2169378b67d3c545e5600d363a923b09c456dab1593914935a68ad478271 \ --hash=sha256:dbead04b9daa817909ec64e8d2855fb78feafe0b901d4568758e3a60559d8978 # via pycontracts -colorama==0.4.5 \ - --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ - --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via -r requirements/pytest.in decorator==5.1.1 \ --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ @@ -28,7 +28,9 @@ decorator==5.1.1 \ exceptiongroup==1.0.0rc9 \ --hash=sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337 \ --hash=sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96 - # via hypothesis + # via + # hypothesis + # pytest execnet==1.9.0 \ --hash=sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5 \ --hash=sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142 @@ -62,12 +64,6 @@ pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 # via pytest -py==1.11.0 \ - --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ - --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 - # via - # pytest - # pytest-forked pycontracts @ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e574d20d86000880919c3.zip \ --hash=sha256:2b889cbfb03b43dc811b5879248ac5c7e209ece78f03be9633de76a6b21a5a89 # via -r requirements/pytest.in @@ -77,20 +73,15 @@ pyparsing==3.0.9 \ # via # packaging # pycontracts -pytest==7.1.3 \ - --hash=sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7 \ - --hash=sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39 +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 # via # -r requirements/pytest.in - # pytest-forked # pytest-xdist -pytest-forked==1.4.0 \ - --hash=sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e \ - --hash=sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8 - # via pytest-xdist -pytest-xdist==2.5.0 \ - --hash=sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf \ - --hash=sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65 +pytest-xdist==3.0.2 \ + --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ + --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b # via -r requirements/pytest.in qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 @@ -111,7 +102,7 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via importlib-metadata diff --git a/requirements/tox.pip b/requirements/tox.pip index 8f03c6c3a..bdcfd3efd 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -4,9 +4,9 @@ # # make upgrade # -colorama==0.4.5 \ - --hash=sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da \ - --hash=sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4 +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via -r requirements/tox.in distlib==0.3.6 \ --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ @@ -57,9 +57,9 @@ tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via tox -tox==3.26.0 \ - --hash=sha256:44f3c347c68c2c68799d7d44f1808f9d396fc8a1a500cbc624253375c7ae107e \ - --hash=sha256:bf037662d7c740d15c9924ba23bb3e587df20598697bb985ac2b49bdc2d847f6 +tox==3.27.0 \ + --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ + --hash=sha256:d2c945f02a03d4501374a3d5430877380deb69b218b1df9b7f1d2f2a10befaf9 # via # -r requirements/tox.in # tox-gh-actions @@ -71,13 +71,13 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.16.5 \ - --hash=sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da \ - --hash=sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27 +virtualenv==20.16.6 \ + --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ + --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e # via tox -zipp==3.9.0 \ - --hash=sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb \ - --hash=sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via # importlib-metadata # importlib-resources From 5fc20859ff816fc9af56a50bf0690eac87b52d16 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 26 Oct 2022 19:54:10 -0400 Subject: [PATCH 026/200] test: use modern pytest hook syntax --- tests/balance_xdist_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/balance_xdist_plugin.py b/tests/balance_xdist_plugin.py index e4db6f637..170037e6b 100644 --- a/tests/balance_xdist_plugin.py +++ b/tests/balance_xdist_plugin.py @@ -104,7 +104,7 @@ def pytest_runtest_teardown(self, item): yield self.write_duration_row(item, "teardown", time.time() - start) - @pytest.mark.trylast + @pytest.hookimpl(trylast=True) def pytest_xdist_make_scheduler(self, config, log): """Create our BalancedScheduler using time data from the last run.""" # Assign tests to chunks From 263582fb688d0fb94465da21cc80c87a046d95b1 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 25 Oct 2022 07:34:52 -0400 Subject: [PATCH 027/200] build: 3.11.0 and 3.12.0a1 are available --- .github/workflows/coverage.yml | 2 +- .github/workflows/python-nightly.yml | 1 + .github/workflows/testsuite.yml | 2 +- README.rst | 4 ++-- coverage/sqldata.py | 1 - doc/index.rst | 5 ++--- setup.py | 1 + tests/test_execfile.py | 2 +- tox.ini | 3 ++- 9 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 848573c20..578c909a0 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -46,7 +46,7 @@ jobs: - "3.8" - "3.9" - "3.10" - - "3.11.0-rc.2" + - "3.11" - "pypy-3.7" exclude: # Windows PyPy doesn't seem to work? diff --git a/.github/workflows/python-nightly.yml b/.github/workflows/python-nightly.yml index 5743dfbb6..726fb2bd0 100644 --- a/.github/workflows/python-nightly.yml +++ b/.github/workflows/python-nightly.yml @@ -44,6 +44,7 @@ jobs: - "3.9-dev" - "3.10-dev" - "3.11-dev" + - "3.12-dev" # https://github.com/actions/setup-python#available-versions-of-pypy - "pypy-3.7-nightly" - "pypy-3.8-nightly" diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index e1baaaf32..dbc90be33 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -47,7 +47,7 @@ jobs: - "3.8" - "3.9" - "3.10" - - "3.11.0-rc.2" + - "3.11" - "pypy-3.7" - "pypy-3.9" fail-fast: false diff --git a/README.rst b/README.rst index 16b8b849a..adadd28cd 100644 --- a/README.rst +++ b/README.rst @@ -28,8 +28,8 @@ Coverage.py runs on these versions of Python: .. PYVERSIONS -* CPython 3.7 through 3.11.0 rc2. -* PyPy3 7.3.8. +* CPython 3.7 through 3.12.0a1 +* PyPy3 7.3.9. Documentation is on `Read the Docs`_. Code repository and issue tracker are on `GitHub`_. diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 5d7fbecfc..2b7730537 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -1005,7 +1005,6 @@ def sys_info(cls): copts = textwrap.wrap(", ".join(copts), width=75) return [ - ("sqlite3_version", sqlite3.version), ("sqlite3_sqlite_version", sqlite3.sqlite_version), ("sqlite3_temp_store", temp_store), ("sqlite3_compile_options", copts), diff --git a/doc/index.rst b/doc/index.rst index da1562a99..3191c5482 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,9 +18,8 @@ supported on: .. PYVERSIONS -* Python versions 3.7 through 3.11.0 rc2. - -* PyPy3 7.3.8. +* Python versions 3.7 through 3.12.0a1. +* PyPy3 7.3.9. .. ifconfig:: prerelease diff --git a/setup.py b/setup.py index 33ddf5606..2d678c74d 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ def better_set_verbosity(v): Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 +Programming Language :: Python :: 3.12 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy Topic :: Software Development :: Quality Assurance diff --git a/tests/test_execfile.py b/tests/test_execfile.py index 83db52738..329ec5284 100644 --- a/tests/test_execfile.py +++ b/tests/test_execfile.py @@ -259,7 +259,7 @@ def test_running_py_from_binary(self): path = python_reported_file('binary') msg = ( re.escape(f"Couldn't run '{path}' as Python code: ") + - r"(TypeError|ValueError): source code string cannot contain null bytes" + r"(ValueError|SyntaxError): source code string cannot contain null bytes" ) with pytest.raises(Exception, match=msg): run_python_file([bf]) diff --git a/tox.ini b/tox.ini index d016bc7d5..9a6b6498c 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ [tox] # When changing this list, be sure to check the [gh-actions] list below. # PYVERSIONS -envlist = py{37,38,39,310,311}, pypy3, doc, lint +envlist = py{37,38,39,310,311,312}, pypy3, doc, lint skip_missing_interpreters = {env:COVERAGE_SKIP_MISSING_INTERPRETERS:True} toxworkdir = {env:TOXWORKDIR:.tox} @@ -97,4 +97,5 @@ python = 3.9: py39 3.10: py310 3.11: py311 + 3.12: py312 pypy-3: pypy3 From 06ef6f09e95fa16cb35cfcf685b6aa0b06091450 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 25 Oct 2022 07:42:04 -0400 Subject: [PATCH 028/200] build: install light threads on newer pythons --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 9a6b6498c..011184512 100644 --- a/tox.ini +++ b/tox.ini @@ -13,10 +13,11 @@ usedevelop = True extras = toml +# PYVERSIONS deps = -r requirements/pip.pip -r requirements/pytest.pip - py{37,38,39,310}: -r requirements/light-threads.pip + py{37,38,39,310,311}: -r requirements/light-threads.pip # Windows can't update the pip version with pip running, so use Python # to install things. From b6e16f8a3bc9fc07142e1da8f313f06a31757826 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 27 Oct 2022 05:54:30 -0400 Subject: [PATCH 029/200] build: build a 3.11 Mac arm64 kit --- .github/workflows/kit.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/kit.yml b/.github/workflows/kit.yml index f3c156706..f835786eb 100644 --- a/.github/workflows/kit.yml +++ b/.github/workflows/kit.yml @@ -77,11 +77,12 @@ jobs: # } # # PYVERSIONS. Available versions: # # https://github.com/actions/python-versions/blob/main/versions-manifest.json + # # Include prereleases if they are at rc stage. # pys = ["cp37", "cp38", "cp39", "cp310", "cp311"] # # # Some OS/arch combinations need overrides for the Python versions: # os_arch_pys = { - # ("macos", "arm64"): ["cp38", "cp39", "cp310"], + # ("macos", "arm64"): ["cp38", "cp39", "cp310", "cp311"], # } # # #----- ^^^ ---------------------- ^^^ ----- @@ -115,6 +116,7 @@ jobs: - {"os": "macos", "py": "cp38", "arch": "arm64"} - {"os": "macos", "py": "cp39", "arch": "arm64"} - {"os": "macos", "py": "cp310", "arch": "arm64"} + - {"os": "macos", "py": "cp311", "arch": "arm64"} - {"os": "macos", "py": "cp37", "arch": "x86_64"} - {"os": "macos", "py": "cp38", "arch": "x86_64"} - {"os": "macos", "py": "cp39", "arch": "x86_64"} @@ -130,7 +132,7 @@ jobs: - {"os": "windows", "py": "cp39", "arch": "AMD64"} - {"os": "windows", "py": "cp310", "arch": "AMD64"} - {"os": "windows", "py": "cp311", "arch": "AMD64"} - # [[[end]]] (checksum: 428e5138336453464dde968cc3149f4f) + # [[[end]]] (checksum: ded8a9f214bf59776562d91ae6828863) fail-fast: false steps: From b53db01273ca811bd6faa50559f331b3dbeec471 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 27 Oct 2022 12:25:43 -0400 Subject: [PATCH 030/200] chore: make upgrade (3.11 ubuntu gevent changed hash?) --- requirements/dev.pip | 18 +++++++++--------- requirements/kit.pip | 6 +++--- requirements/light-threads.pip | 1 + requirements/lint.pip | 18 +++++++++--------- requirements/pip-tools.pip | 6 +++--- requirements/pytest.pip | 6 +++--- 6 files changed, 28 insertions(+), 27 deletions(-) diff --git a/requirements/dev.pip b/requirements/dev.pip index d70dd3892..2b12b2e42 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -28,9 +28,9 @@ bleach==5.0.1 \ --hash=sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a \ --hash=sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c # via readme-renderer -build==0.8.0 \ - --hash=sha256:19b0ed489f92ace6947698c3ca8436cb0556a66e2aa2d34cd70e2a5d27cd0437 \ - --hash=sha256:887a6d471c901b1a6e6574ebaeeebb45e5269a79d095fe9a8f88d6614ed2e5f0 +build==0.9.0 \ + --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ + --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via check-manifest certifi==2022.5.18.1 \ --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ @@ -78,9 +78,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -exceptiongroup==1.0.0rc9 \ - --hash=sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337 \ - --hash=sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96 +exceptiongroup==1.0.0 \ + --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ + --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad # via # -r requirements/pytest.pip # hypothesis @@ -389,9 +389,9 @@ tomli==2.0.1 \ # pylint # pytest # tox -tomlkit==0.11.5 \ - --hash=sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c \ - --hash=sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7 +tomlkit==0.11.6 \ + --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ + --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via pylint tox==3.27.0 \ --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ diff --git a/requirements/kit.pip b/requirements/kit.pip index 96609b8cf..09f0a914f 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -16,9 +16,9 @@ bracex==2.3.post1 \ --hash=sha256:351b7f20d56fb9ea91f9b9e9e7664db466eb234188c175fd943f8f755c807e73 \ --hash=sha256:e7b23fc8b2cd06d3dec0692baabecb249dda94e06a617901ff03a6c56fd71693 # via cibuildwheel -build==0.8.0 \ - --hash=sha256:19b0ed489f92ace6947698c3ca8436cb0556a66e2aa2d34cd70e2a5d27cd0437 \ - --hash=sha256:887a6d471c901b1a6e6574ebaeeebb45e5269a79d095fe9a8f88d6614ed2e5f0 +build==0.9.0 \ + --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ + --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via -r requirements/kit.in certifi==2022.5.18.1 \ --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index c346b6fb3..7609b1fb7 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -79,6 +79,7 @@ eventlet==0.33.1 \ --hash=sha256:afbe17f06a58491e9aebd7a4a03e70b0b63fd4cf76d8307bae07f280479b1515 # via -r requirements/light-threads.in gevent==22.10.1 \ + --hash=sha256:03c10ca0beeab0c6be516030471ea630447ddd1f649d3335e5b162097cd4130a \ --hash=sha256:04a920a812b6c0c36d4613a15c254ca1ce415ee75ade0df3b8941ab61ae7ce3f \ --hash=sha256:0569e133bb620de1001ac807ad9a8abaadedd25349c6d695f80c9048a3f59d42 \ --hash=sha256:06ea39c70ce166c4a1d4386c7fae96cb8d84ad799527b3378406051104d15443 \ diff --git a/requirements/lint.pip b/requirements/lint.pip index 7b90c2a60..37e271b12 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -36,9 +36,9 @@ bleach==5.0.1 \ --hash=sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a \ --hash=sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c # via readme-renderer -build==0.8.0 \ - --hash=sha256:19b0ed489f92ace6947698c3ca8436cb0556a66e2aa2d34cd70e2a5d27cd0437 \ - --hash=sha256:887a6d471c901b1a6e6574ebaeeebb45e5269a79d095fe9a8f88d6614ed2e5f0 +build==0.9.0 \ + --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ + --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via check-manifest certifi==2022.5.18.1 \ --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ @@ -94,9 +94,9 @@ docutils==0.17.1 \ # readme-renderer # sphinx # sphinx-rtd-theme -exceptiongroup==1.0.0rc9 \ - --hash=sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337 \ - --hash=sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96 +exceptiongroup==1.0.0 \ + --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ + --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad # via # -r requirements/pytest.pip # hypothesis @@ -529,9 +529,9 @@ tomli==2.0.1 \ # pylint # pytest # tox -tomlkit==0.11.5 \ - --hash=sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c \ - --hash=sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7 +tomlkit==0.11.6 \ + --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ + --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via pylint tornado==6.2 \ --hash=sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca \ diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index ad34607d0..d0f64a798 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -4,9 +4,9 @@ # # make upgrade # -build==0.8.0 \ - --hash=sha256:19b0ed489f92ace6947698c3ca8436cb0556a66e2aa2d34cd70e2a5d27cd0437 \ - --hash=sha256:887a6d471c901b1a6e6574ebaeeebb45e5269a79d095fe9a8f88d6614ed2e5f0 +build==0.9.0 \ + --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ + --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via pip-tools click==8.1.3 \ --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 68f411cea..0e4b15bf7 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -25,9 +25,9 @@ decorator==5.1.1 \ --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 # via pycontracts -exceptiongroup==1.0.0rc9 \ - --hash=sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337 \ - --hash=sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96 +exceptiongroup==1.0.0 \ + --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ + --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad # via # hypothesis # pytest From 89aabf3e008082d1ace0efafda2bdb1c0b93a78b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 27 Oct 2022 06:36:11 -0400 Subject: [PATCH 031/200] test: simulate the failure from issue #1481 --- tests/test_config.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_config.py b/tests/test_config.py index 6aa435112..8db781b03 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -230,6 +230,7 @@ def test_environment_vars_in_config(self): assert cov.config.branch is True assert cov.config.exclude_list == ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"] + @pytest.mark.xfail(reason="updated to demonstrate bug #1481") def test_environment_vars_in_toml_config(self): # Config files can have $envvars in them. self.make_file("pyproject.toml", """\ @@ -244,10 +245,13 @@ def test_environment_vars_in_toml_config(self): "x${NOTHING}y", "huh$${X}what", ] + [othersection] + something = "if [ $OTHER ]; then printf '%s\\n' 'Hi'; fi" """) self.set_environ("BRANCH", "true") self.set_environ("DATA_FILE", "hello-world") self.set_environ("THING", "ZZZ") + self.set_environ("OTHER", "hi\\zebra") cov = coverage.Coverage() assert cov.config.data_file == "hello-world.fooey" assert cov.config.branch is True From 44fbd3b02ad22326767dc37fe3b94aa93b36e8a3 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 27 Oct 2022 11:48:07 -0400 Subject: [PATCH 032/200] fix: in toml config, only apply environment substitution to coverage settings. #1481 --- CHANGES.rst | 10 ++++-- coverage/tomlconfig.py | 69 ++++++++++++++++++++++++++++-------------- doc/config.rst | 12 +++++--- tests/test_config.py | 19 +++++++----- 4 files changed, 75 insertions(+), 35 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 24f50907f..372c639dd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -30,11 +30,17 @@ Unreleased - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that relative file paths can be combined more easily. -- Fix internal logic that prevented coverage.py from running on implementations - other than CPython or PyPy (`issue 1474`_). +- Fixed environment variable expansion in pyproject.toml files. It was overly + broad, causing errors outside of coverage.py settings, as described in `issue + 1481`_. This is now fixed, but in rare cases will require changing your + pyproject.toml to quote non-string values using environment substitution. + +- Fixed internal logic that prevented coverage.py from running on + implementations other than CPython or PyPy (`issue 1474`_). .. _issue 991: https://github.com/nedbat/coveragepy/issues/991 .. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474 +.. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481 .. _changes_6-5-0: diff --git a/coverage/tomlconfig.py b/coverage/tomlconfig.py index 148c34f89..0b5052b4c 100644 --- a/coverage/tomlconfig.py +++ b/coverage/tomlconfig.py @@ -52,7 +52,6 @@ def read(self, filenames): except OSError: return [] if tomllib is not None: - toml_text = substitute_variables(toml_text, os.environ) try: self.data = tomllib.loads(toml_text) except tomllib.TOMLDecodeError as err: @@ -101,9 +100,21 @@ def _get(self, section, option): if data is None: raise configparser.NoSectionError(section) try: - return name, data[option] + value = data[option] except KeyError as exc: raise configparser.NoOptionError(option, name) from exc + return name, value + + def _get_single(self, section, option): + """Get a single-valued option. + + Performs environment substitution if the value is a string. Other types + will be converted later as needed. + """ + name, value = self._get(section, option) + if isinstance(value, str): + value = substitute_variables(value, os.environ) + return name, value def has_option(self, section, option): _, data = self._get_section(section) @@ -126,29 +137,45 @@ def get_section(self, section): return data def get(self, section, option): - _, value = self._get(section, option) + _, value = self._get_single(section, option) return value - def _check_type(self, section, option, value, type_, type_desc): - if not isinstance(value, type_): - raise ValueError( - 'Option {!r} in section {!r} is not {}: {!r}' - .format(option, section, type_desc, value) - ) + def _check_type(self, section, option, value, type_, converter, type_desc): + """Check that `value` has the type we want, converting if needed. + + Returns the resulting value of the desired type. + """ + if isinstance(value, type_): + return value + if isinstance(value, str) and converter is not None: + try: + return converter(value) + except Exception as e: + raise ValueError( + f"Option [{section}]{option} couldn't convert to {type_desc}: {value!r}" + ) from e + raise ValueError( + f"Option [{section}]{option} is not {type_desc}: {value!r}" + ) def getboolean(self, section, option): - name, value = self._get(section, option) - self._check_type(name, option, value, bool, "a boolean") - return value + name, value = self._get_single(section, option) + bool_strings = {"true": True, "false": False} + return self._check_type(name, option, value, bool, bool_strings.__getitem__, "a boolean") - def getlist(self, section, option): + def _get_list(self, section, option): + """Get a list of strings, substituting environment variables in the elements.""" name, values = self._get(section, option) - self._check_type(name, option, values, list, "a list") + values = self._check_type(name, option, values, list, None, "a list") + values = [substitute_variables(value, os.environ) for value in values] + return name, values + + def getlist(self, section, option): + _, values = self._get_list(section, option) return values def getregexlist(self, section, option): - name, values = self._get(section, option) - self._check_type(name, option, values, list, "a list") + name, values = self._get_list(section, option) for value in values: value = value.strip() try: @@ -158,13 +185,11 @@ def getregexlist(self, section, option): return values def getint(self, section, option): - name, value = self._get(section, option) - self._check_type(name, option, value, int, "an integer") - return value + name, value = self._get_single(section, option) + return self._check_type(name, option, value, int, int, "an integer") def getfloat(self, section, option): - name, value = self._get(section, option) + name, value = self._get_single(section, option) if isinstance(value, int): value = float(value) - self._check_type(name, option, value, float, "a float") - return value + return self._check_type(name, option, value, float, float, "a float") diff --git a/doc/config.rst b/doc/config.rst index 0cb2cfa6c..6b7535795 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -31,10 +31,14 @@ Coverage.py will read settings from other usual configuration files if no other configuration file is used. It will automatically read from "setup.cfg" or "tox.ini" if they exist. In this case, the section names have "coverage:" prefixed, so the ``[run]`` options described below will be found in the -``[coverage:run]`` section of the file. If coverage.py is installed with the -``toml`` extra (``pip install coverage[toml]``), it will automatically read -from "pyproject.toml". Configuration must be within the ``[tool.coverage]`` -section, for example, ``[tool.coverage.run]``. +``[coverage:run]`` section of the file. + +Coverage.py will read from "pyproject.toml" if TOML support is available, +either because you are running on Python 3.11 or later, or because you +installed with the ``toml`` extra (``pip install coverage[toml]``). +Configuration must be within the ``[tool.coverage]`` section, for example, +``[tool.coverage.run]``. Environment variable expansion in values is +available, but only within quoted strings, even for non-string values. Syntax diff --git a/tests/test_config.py b/tests/test_config.py index 8db781b03..cb3edadb4 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -3,7 +3,6 @@ """Test the config file handling for coverage.py""" -import math import sys from collections import OrderedDict @@ -89,7 +88,7 @@ def test_toml_config_file(self): assert cov.config.plugins == ["plugins.a_plugin"] assert cov.config.precision == 3 assert cov.config.html_title == "tabblo & «ταБЬℓσ»" - assert math.isclose(cov.config.fail_under, 90.5) + assert cov.config.fail_under == 90.5 assert cov.config.get_plugin_options("plugins.a_plugin") == {"hello": "world"} # Test that our class doesn't reject integers when loading floats @@ -99,7 +98,7 @@ def test_toml_config_file(self): fail_under = 90 """) cov = coverage.Coverage(config_file="pyproject.toml") - assert math.isclose(cov.config.fail_under, 90) + assert cov.config.fail_under == 90 assert isinstance(cov.config.fail_under, float) def test_ignored_config_file(self): @@ -200,7 +199,7 @@ def test_parse_errors(self, bad_config, msg): r"multiple repeat"), ('[tool.coverage.run]\nconcurrency="foo"', "not a list"), ("[tool.coverage.report]\nprecision=1.23", "not an integer"), - ('[tool.coverage.report]\nfail_under="s"', "not a float"), + ('[tool.coverage.report]\nfail_under="s"', "couldn't convert to a float"), ]) def test_toml_parse_errors(self, bad_config, msg): # Im-parsable values raise ConfigError, with details. @@ -230,14 +229,15 @@ def test_environment_vars_in_config(self): assert cov.config.branch is True assert cov.config.exclude_list == ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"] - @pytest.mark.xfail(reason="updated to demonstrate bug #1481") def test_environment_vars_in_toml_config(self): # Config files can have $envvars in them. self.make_file("pyproject.toml", """\ [tool.coverage.run] data_file = "$DATA_FILE.fooey" - branch = $BRANCH + branch = "$BRANCH" [tool.coverage.report] + precision = "$DIGITS" + fail_under = "$FAIL_UNDER" exclude_lines = [ "the_$$one", "another${THING}", @@ -246,15 +246,20 @@ def test_environment_vars_in_toml_config(self): "huh$${X}what", ] [othersection] + # This reproduces the failure from https://github.com/nedbat/coveragepy/issues/1481 + # When OTHER has a backslash that isn't a valid escape, like \\z (see below). something = "if [ $OTHER ]; then printf '%s\\n' 'Hi'; fi" """) self.set_environ("BRANCH", "true") + self.set_environ("DIGITS", "3") + self.set_environ("FAIL_UNDER", "90.5") self.set_environ("DATA_FILE", "hello-world") self.set_environ("THING", "ZZZ") self.set_environ("OTHER", "hi\\zebra") cov = coverage.Coverage() - assert cov.config.data_file == "hello-world.fooey" assert cov.config.branch is True + assert cov.config.precision == 3 + assert cov.config.data_file == "hello-world.fooey" assert cov.config.exclude_list == ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"] def test_tilde_in_config(self): From b3a1d979f8625e4974eaa7211cdecb211ba90b50 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 28 Oct 2022 07:45:29 -0400 Subject: [PATCH 033/200] test: correct some config tests, and fully cover tomlconfig.py --- coverage/tomlconfig.py | 11 ++++------- tests/test_config.py | 25 +++++++++++++++++++++---- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/coverage/tomlconfig.py b/coverage/tomlconfig.py index 0b5052b4c..49282e925 100644 --- a/coverage/tomlconfig.py +++ b/coverage/tomlconfig.py @@ -3,7 +3,6 @@ """TOML configuration support for coverage.py""" -import configparser import os import re @@ -78,8 +77,6 @@ def _get_section(self, section): """ prefixes = ["tool.coverage."] - if self.our_file: - prefixes.append("") for prefix in prefixes: real_section = prefix + section parts = real_section.split(".") @@ -98,11 +95,11 @@ def _get(self, section, option): """Like .get, but returns the real section name and the value.""" name, data = self._get_section(section) if data is None: - raise configparser.NoSectionError(section) + raise ConfigError(f"No section: {section!r}") try: value = data[option] - except KeyError as exc: - raise configparser.NoOptionError(option, name) from exc + except KeyError: + raise ConfigError(f"No option {option!r} in section: {name!r}") from None return name, value def _get_single(self, section, option): @@ -129,7 +126,7 @@ def has_section(self, section): def options(self, section): _, data = self._get_section(section) if data is None: - raise configparser.NoSectionError(section) + raise ConfigError(f"No section: {section!r}") return list(data.keys()) def get_section(self, section): diff --git a/tests/test_config.py b/tests/test_config.py index cb3edadb4..4afdd1e39 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -12,6 +12,7 @@ import coverage from coverage.config import HandyConfigParser from coverage.exceptions import ConfigError, CoverageWarning +from coverage.tomlconfig import TomlConfigParser from tests.coveragetest import CoverageTest, UsingModulesMixin from tests.helpers import without_module @@ -62,7 +63,7 @@ def test_named_config_file(self): assert cov.config.data_file == "delete.me" def test_toml_config_file(self): - # A .coveragerc file will be read into the configuration. + # A pyproject.toml file will be read into the configuration. self.make_file("pyproject.toml", """\ # This is just a bogus toml file for testing. [tool.somethingelse] @@ -80,7 +81,7 @@ def test_toml_config_file(self): [tool.coverage.plugins.a_plugin] hello = "world" """) - cov = coverage.Coverage(config_file="pyproject.toml") + cov = coverage.Coverage() assert cov.config.timid assert not cov.config.branch assert cov.config.concurrency == ["a", "b"] @@ -91,13 +92,14 @@ def test_toml_config_file(self): assert cov.config.fail_under == 90.5 assert cov.config.get_plugin_options("plugins.a_plugin") == {"hello": "world"} + def test_toml_ints_can_be_floats(self): # Test that our class doesn't reject integers when loading floats self.make_file("pyproject.toml", """\ # This is just a bogus toml file for testing. [tool.coverage.report] fail_under = 90 """) - cov = coverage.Coverage(config_file="pyproject.toml") + cov = coverage.Coverage() assert cov.config.fail_under == 90 assert isinstance(cov.config.fail_under, float) @@ -435,7 +437,8 @@ def test_exceptions_from_missing_things(self): [run] branch = True """) - config = HandyConfigParser("config.ini") + config = HandyConfigParser(True) + config.read(["config.ini"]) with pytest.raises(ConfigError, match="No section: 'xyzzy'"): config.options("xyzzy") with pytest.raises(ConfigError, match="No option 'foo' in section: 'xyzzy'"): @@ -756,3 +759,17 @@ def test_no_toml_installed_pyproject_no_coverage(self): assert not cov.config.timid assert not cov.config.branch assert cov.config.data_file == ".coverage" + + def test_exceptions_from_missing_toml_things(self): + self.make_file("pyproject.toml", """\ + [tool.coverage.run] + branch = true + """) + config = TomlConfigParser(False) + config.read("pyproject.toml") + with pytest.raises(ConfigError, match="No section: 'xyzzy'"): + config.options("xyzzy") + with pytest.raises(ConfigError, match="No section: 'xyzzy'"): + config.get("xyzzy", "foo") + with pytest.raises(ConfigError, match="No option 'foo' in section: 'tool.coverage.run'"): + config.get("run", "foo") From ec6205a8de972af6a09453235d02a7ebea6aea8e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 23 Oct 2022 14:03:17 -0400 Subject: [PATCH 034/200] fix: use glob matching instead of fnmatch. #1407 I didn't understand that fnmatch considers the entire string to be a filename, even if it has slashes in it. This led to incorrect matching. Now we use our own implementation of glob matching to get the correct behavior. --- CHANGES.rst | 5 + coverage/files.py | 79 +++++++++++----- coverage/inorout.py | 6 +- coverage/report.py | 6 +- doc/cmd.rst | 40 ++++---- doc/config.rst | 2 +- doc/source.rst | 29 +++++- tests/test_api.py | 1 - tests/test_files.py | 209 +++++++++++++++++++++++++++++------------- tests/test_summary.py | 24 +++++ 10 files changed, 284 insertions(+), 117 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 372c639dd..b0ea7bb6f 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 ---------- +- Fixes to file pattern matching, fixing `issue 1407`_. Previously, `*` would + incorrectly match directory separators, making precise matching difficult. + This is now fixed. + - Improvements to combining data files when using the :ref:`config_run_relative_files` setting: @@ -39,6 +43,7 @@ Unreleased implementations other than CPython or PyPy (`issue 1474`_). .. _issue 991: https://github.com/nedbat/coveragepy/issues/991 +.. _issue 1407: https://github.com/nedbat/coveragepy/issues/1407 .. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474 .. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481 diff --git a/coverage/files.py b/coverage/files.py index 2c520b8ab..76ecbef9d 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -3,7 +3,6 @@ """File wrangling.""" -import fnmatch import hashlib import ntpath import os @@ -172,7 +171,7 @@ def isabs_anywhere(filename): def prep_patterns(patterns): - """Prepare the file patterns for use in a `FnmatchMatcher`. + """Prepare the file patterns for use in a `GlobMatcher`. If a pattern starts with a wildcard, it is used as a pattern as-is. If it does not start with a wildcard, then it is made @@ -253,15 +252,15 @@ def match(self, module_name): return False -class FnmatchMatcher: +class GlobMatcher: """A matcher for files by file name pattern.""" def __init__(self, pats, name="unknown"): self.pats = list(pats) - self.re = fnmatches_to_regex(self.pats, case_insensitive=env.WINDOWS) + self.re = globs_to_regex(self.pats, case_insensitive=env.WINDOWS) self.name = name def __repr__(self): - return f"" + return f"" def info(self): """A list of strings for displaying when dumping state.""" @@ -282,12 +281,55 @@ def sep(s): return the_sep -def fnmatches_to_regex(patterns, case_insensitive=False, partial=False): - """Convert fnmatch patterns to a compiled regex that matches any of them. +# Tokenizer for _glob_to_regex. +# None as a sub means disallowed. +G2RX_TOKENS = [(re.compile(rx), sub) for rx, sub in [ + (r"\*\*\*+", None), # Can't have *** + (r"[^/]+\*\*+", None), # Can't have x** + (r"\*\*+[^/]+", None), # Can't have **x + (r"\*\*/\*\*", None), # Can't have **/** + (r"^\*+/", r"(.*[/\\\\])?"), # ^*/ matches any prefix-slash, or nothing. + (r"/\*+$", r"[/\\\\].*"), # /*$ matches any slash-suffix. + (r"\*\*/", r"(.*[/\\\\])?"), # **/ matches any subdirs, including none + (r"/", r"[/\\\\]"), # / matches either slash or backslash + (r"\*", r"[^/\\\\]*"), # * matches any number of non slash-likes + (r"\?", r"[^/\\\\]"), # ? matches one non slash-like + (r"\[.*?\]", r"\g<0>"), # [a-f] matches [a-f] + (r"[a-zA-Z0-9_-]+", r"\g<0>"), # word chars match themselves + (r"[\[\]+{}]", None), # Can't have regex special chars + (r".", r"\\\g<0>"), # Anything else is escaped to be safe +]] + +def _glob_to_regex(pattern): + """Convert a file-path glob pattern into a regex.""" + # Turn all backslashes into slashes to simplify the tokenizer. + pattern = pattern.replace("\\", "/") + if "/" not in pattern: + pattern = "**/" + pattern + path_rx = [] + pos = 0 + while pos < len(pattern): + for rx, sub in G2RX_TOKENS: + m = rx.match(pattern, pos=pos) + if m: + if sub is None: + raise ConfigError(f"File pattern can't include {m[0]!r}") + path_rx.append(m.expand(sub)) + pos = m.end() + break + return "".join(path_rx) + + +def globs_to_regex(patterns, case_insensitive=False, partial=False): + """Convert glob patterns to a compiled regex that matches any of them. Slashes are always converted to match either slash or backslash, for Windows support, even when running elsewhere. + If the pattern has no slash or backslash, then it is interpreted as + matching a file name anywhere it appears in the tree. Otherwise, the glob + pattern must match the whole file path. + If `partial` is true, then the pattern will match if the target string starts with the pattern. Otherwise, it must match the entire string. @@ -295,24 +337,13 @@ def fnmatches_to_regex(patterns, case_insensitive=False, partial=False): strings. """ - regexes = (fnmatch.translate(pattern) for pattern in patterns) - # */ at the start should also match nothing. - regexes = (re.sub(r"^\(\?s:\.\*(\\\\|/)", r"(?s:^(.*\1)?", regex) for regex in regexes) - # Be agnostic: / can mean backslash or slash. - regexes = (re.sub(r"/", r"[\\\\/]", regex) for regex in regexes) - - if partial: - # fnmatch always adds a \Z to match the whole string, which we don't - # want, so we remove the \Z. While removing it, we only replace \Z if - # followed by paren (introducing flags), or at end, to keep from - # destroying a literal \Z in the pattern. - regexes = (re.sub(r'\\Z(\(\?|$)', r'\1', regex) for regex in regexes) - flags = 0 if case_insensitive: flags |= re.IGNORECASE - compiled = re.compile(join_regex(regexes), flags=flags) - + rx = join_regex(map(_glob_to_regex, patterns)) + if not partial: + rx = rf"(?:{rx})\Z" + compiled = re.compile(rx, flags=flags) return compiled @@ -342,7 +373,7 @@ def pprint(self): def add(self, pattern, result): """Add the `pattern`/`result` pair to the list of aliases. - `pattern` is an `fnmatch`-style pattern. `result` is a simple + `pattern` is an `glob`-style pattern. `result` is a simple string. When mapping paths, if a path starts with a match against `pattern`, then that match is replaced with `result`. This models isomorphic source trees being rooted at different places on two @@ -370,7 +401,7 @@ def add(self, pattern, result): pattern += pattern_sep # Make a regex from the pattern. - regex = fnmatches_to_regex([pattern], case_insensitive=True, partial=True) + regex = globs_to_regex([pattern], case_insensitive=True, partial=True) # Normalize the result: it must end with a path separator. result_sep = sep(result) diff --git a/coverage/inorout.py b/coverage/inorout.py index ec89d1b49..2e534c853 100644 --- a/coverage/inorout.py +++ b/coverage/inorout.py @@ -16,7 +16,7 @@ from coverage import env from coverage.disposition import FileDisposition, disposition_init from coverage.exceptions import CoverageException, PluginError -from coverage.files import TreeMatcher, FnmatchMatcher, ModuleMatcher +from coverage.files import TreeMatcher, GlobMatcher, ModuleMatcher from coverage.files import prep_patterns, find_python_files, canonical_filename from coverage.misc import sys_modules_saved from coverage.python import source_for_file, source_for_morf @@ -260,10 +260,10 @@ def debug(msg): self.pylib_match = TreeMatcher(self.pylib_paths, "pylib") debug(f"Python stdlib matching: {self.pylib_match!r}") if self.include: - self.include_match = FnmatchMatcher(self.include, "include") + self.include_match = GlobMatcher(self.include, "include") debug(f"Include matching: {self.include_match!r}") if self.omit: - self.omit_match = FnmatchMatcher(self.omit, "omit") + self.omit_match = GlobMatcher(self.omit, "omit") debug(f"Omit matching: {self.omit_match!r}") self.cover_match = TreeMatcher(self.cover_paths, "coverage") diff --git a/coverage/report.py b/coverage/report.py index 6382eb515..0c05b0446 100644 --- a/coverage/report.py +++ b/coverage/report.py @@ -6,7 +6,7 @@ import sys from coverage.exceptions import CoverageException, NoDataError, NotPython -from coverage.files import prep_patterns, FnmatchMatcher +from coverage.files import prep_patterns, GlobMatcher from coverage.misc import ensure_dir_for_file, file_be_gone @@ -57,11 +57,11 @@ def get_analysis_to_report(coverage, morfs): config = coverage.config if config.report_include: - matcher = FnmatchMatcher(prep_patterns(config.report_include), "report_include") + matcher = GlobMatcher(prep_patterns(config.report_include), "report_include") file_reporters = [fr for fr in file_reporters if matcher.match(fr.filename)] if config.report_omit: - matcher = FnmatchMatcher(prep_patterns(config.report_omit), "report_omit") + matcher = GlobMatcher(prep_patterns(config.report_omit), "report_omit") file_reporters = [fr for fr in file_reporters if not matcher.match(fr.filename)] if not file_reporters: diff --git a/doc/cmd.rst b/doc/cmd.rst index cb9a147ee..f8de0cb30 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -342,7 +342,7 @@ single directory, and use the **combine** command to combine them into one $ coverage combine -You can also name directories or files on the command line:: +You can also name directories or files to be combined on the command line:: $ coverage combine data1.dat windows_data_files/ @@ -364,22 +364,6 @@ An existing combined data file is ignored and re-written. If you want to use runs, use the ``--append`` switch on the **combine** command. This behavior was the default before version 4.2. -To combine data for a source file, coverage has to find its data in each of the -data files. Different test runs may run the same source file from different -locations. For example, different operating systems will use different paths -for the same file, or perhaps each Python version is run from a different -subdirectory. Coverage needs to know that different file paths are actually -the same source file for reporting purposes. - -You can tell coverage.py how different source locations relate with a -``[paths]`` section in your configuration file (see :ref:`config_paths`). -It might be more convenient to use the ``[run] relative_files`` -setting to store relative file paths (see :ref:`relative_files -`). - -If data isn't combining properly, you can see details about the inner workings -with ``--debug=pathmap``. - If any of the data files can't be read, coverage.py will print a warning indicating the file and the problem. @@ -414,6 +398,28 @@ want to keep those files, use the ``--keep`` command-line option. .. [[[end]]] (checksum: 0bdd83f647ee76363c955bedd9ddf749) +.. _cmd_combine_remapping: + +Re-mapping paths +................ + +To combine data for a source file, coverage has to find its data in each of the +data files. Different test runs may run the same source file from different +locations. For example, different operating systems will use different paths +for the same file, or perhaps each Python version is run from a different +subdirectory. Coverage needs to know that different file paths are actually +the same source file for reporting purposes. + +You can tell coverage.py how different source locations relate with a +``[paths]`` section in your configuration file (see :ref:`config_paths`). +It might be more convenient to use the ``[run] relative_files`` +setting to store relative file paths (see :ref:`relative_files +`). + +If data isn't combining properly, you can see details about the inner workings +with ``--debug=pathmap``. + + .. _cmd_erase: Erase data: ``coverage erase`` diff --git a/doc/config.rst b/doc/config.rst index 6b7535795..c6f6442a5 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -357,7 +357,7 @@ The first list that has a match will be used. The ``--debug=pathmap`` option can be used to log details of the re-mapping of paths. See :ref:`the --debug option `. -See :ref:`cmd_combine` for more information. +See :ref:`cmd_combine_remapping` and :ref:`source_glob` for more information. .. _config_report: diff --git a/doc/source.rst b/doc/source.rst index cfd0e6fc5..64ebd1320 100644 --- a/doc/source.rst +++ b/doc/source.rst @@ -59,10 +59,10 @@ removed from the set. .. highlight:: ini -The ``include`` and ``omit`` file name patterns follow typical shell syntax: -``*`` matches any number of characters and ``?`` matches a single character. -Patterns that start with a wildcard character are used as-is, other patterns -are interpreted relative to the current directory:: +The ``include`` and ``omit`` file name patterns follow common shell syntax, +described below in :ref:`source_glob`. Patterns that start with a wildcard +character are used as-is, other patterns are interpreted relative to the +current directory:: [run] omit = @@ -77,7 +77,7 @@ The ``source``, ``include``, and ``omit`` values all work together to determine the source that will be measured. If both ``source`` and ``include`` are set, the ``include`` value is ignored -and a warning is printed on the standard output. +and a warning is issued. .. _source_reporting: @@ -103,3 +103,22 @@ reporting. Note that these are ways of specifying files to measure. You can also exclude individual source lines. See :ref:`excluding` for details. + + +.. _source_glob: + +File patterns +------------- + +File path patterns are used for include and omit, and for combining path +remapping. They follow common shell syntax: + +- ``*`` matches any number of file name characters, not including the directory + separator. + +- ``?`` matches a single file name character. + +- ``**`` matches any number of nested directory names, including none. + +- Both ``/`` and ``\`` will match either a slash or a backslash, to make + cross-platform matching easier. diff --git a/tests/test_api.py b/tests/test_api.py index 375edcec1..07bd07f33 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -71,7 +71,6 @@ def test_unexecuted_file(self): assert missing == [1] def test_filenames(self): - self.make_file("mymain.py", """\ import mymod a = 1 diff --git a/tests/test_files.py b/tests/test_files.py index 8fea61d07..9a4cea7f8 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -3,8 +3,10 @@ """Tests for files.py""" +import itertools import os import os.path +import re from unittest import mock import pytest @@ -12,8 +14,8 @@ from coverage import env, files from coverage.exceptions import ConfigError from coverage.files import ( - FnmatchMatcher, ModuleMatcher, PathAliases, TreeMatcher, abs_file, - actual_path, find_python_files, flat_rootname, fnmatches_to_regex, + GlobMatcher, ModuleMatcher, PathAliases, TreeMatcher, abs_file, + actual_path, find_python_files, flat_rootname, globs_to_regex, ) from tests.coveragetest import CoverageTest @@ -104,59 +106,138 @@ def test_flat_rootname(original, flat): assert flat_rootname(original) == flat +def globs_to_regex_params( + patterns, case_insensitive=False, partial=False, matches=(), nomatches=(), +): + """Generate parameters for `test_globs_to_regex`. + + `patterns`, `case_insensitive`, and `partial` are arguments for + `globs_to_regex`. `matches` is a list of strings that should match, and + `nomatches` is a list of strings that should not match. + + Everything is yielded so that `test_globs_to_regex` can call + `globs_to_regex` once and check one result. + """ + pat_id = "|".join(patterns) + for text in matches: + yield pytest.param( + patterns, case_insensitive, partial, text, True, + id=f"{pat_id}:ci{case_insensitive}:par{partial}:{text}:match", + ) + for text in nomatches: + yield pytest.param( + patterns, case_insensitive, partial, text, False, + id=f"{pat_id}:ci{case_insensitive}:par{partial}:{text}:nomatch", + ) + @pytest.mark.parametrize( - "patterns, case_insensitive, partial," + - "matches," + - "nomatches", -[ - ( - ["abc", "xyz"], False, False, + "patterns, case_insensitive, partial, text, result", + list(itertools.chain.from_iterable([ + globs_to_regex_params( ["abc", "xyz"], - ["ABC", "xYz", "abcx", "xabc", "axyz", "xyza"], - ), - ( - ["abc", "xyz"], True, False, - ["abc", "xyz", "Abc", "XYZ", "AbC"], - ["abcx", "xabc", "axyz", "xyza"], - ), - ( - ["abc/hi.py"], True, False, - ["abc/hi.py", "ABC/hi.py", r"ABC\hi.py"], - ["abc_hi.py", "abc/hi.pyc"], - ), - ( - [r"abc\hi.py"], True, False, - [r"abc\hi.py", r"ABC\hi.py"], - ["abc/hi.py", "ABC/hi.py", "abc_hi.py", "abc/hi.pyc"], - ), - ( - ["abc/*/hi.py"], True, False, - ["abc/foo/hi.py", "ABC/foo/bar/hi.py", r"ABC\foo/bar/hi.py"], - ["abc/hi.py", "abc/hi.pyc"], - ), - ( - ["abc/[a-f]*/hi.py"], True, False, - ["abc/foo/hi.py", "ABC/foo/bar/hi.py", r"ABC\foo/bar/hi.py"], - ["abc/zoo/hi.py", "abc/hi.py", "abc/hi.pyc"], - ), - ( - ["abc/"], True, True, - ["abc/foo/hi.py", "ABC/foo/bar/hi.py", r"ABC\foo/bar/hi.py"], - ["abcd/foo.py", "xabc/hi.py"], - ), - ( - ["*/foo"], False, True, - ["abc/foo/hi.py", "foo/hi.py"], - ["abc/xfoo/hi.py"], - ), - + matches=["abc", "xyz", "sub/mod/abc"], + nomatches=[ + "ABC", "xYz", "abcx", "xabc", "axyz", "xyza", "sub/mod/abcd", "sub/abc/more", + ], + ), + globs_to_regex_params( + ["abc", "xyz"], case_insensitive=True, + matches=["abc", "xyz", "Abc", "XYZ", "AbC"], + nomatches=["abcx", "xabc", "axyz", "xyza"], + ), + globs_to_regex_params( + ["a*c", "x*z"], + matches=["abc", "xyz", "xYz", "azc", "xaz", "axyzc"], + nomatches=["ABC", "abcx", "xabc", "axyz", "xyza", "a/c"], + ), + globs_to_regex_params( + ["a?c", "x?z"], + matches=["abc", "xyz", "xYz", "azc", "xaz"], + nomatches=["ABC", "abcx", "xabc", "axyz", "xyza", "a/c"], + ), + globs_to_regex_params( + ["a??d"], + matches=["abcd", "azcd", "a12d"], + nomatches=["ABCD", "abcx", "axyz", "abcde"], + ), + globs_to_regex_params( + ["abc/hi.py"], case_insensitive=True, + matches=["abc/hi.py", "ABC/hi.py", r"ABC\hi.py"], + nomatches=["abc_hi.py", "abc/hi.pyc"], + ), + globs_to_regex_params( + [r"abc\hi.py"], case_insensitive=True, + matches=[r"abc\hi.py", r"ABC\hi.py", "abc/hi.py", "ABC/hi.py"], + nomatches=["abc_hi.py", "abc/hi.pyc"], + ), + globs_to_regex_params( + ["abc/*/hi.py"], case_insensitive=True, + matches=["abc/foo/hi.py", r"ABC\foo/hi.py"], + nomatches=["abc/hi.py", "abc/hi.pyc", "ABC/foo/bar/hi.py", r"ABC\foo/bar/hi.py"], + ), + globs_to_regex_params( + ["abc/**/hi.py"], case_insensitive=True, + matches=[ + "abc/foo/hi.py", r"ABC\foo/hi.py", "abc/hi.py", "ABC/foo/bar/hi.py", + r"ABC\foo/bar/hi.py", + ], + nomatches=["abc/hi.pyc"], + ), + globs_to_regex_params( + ["abc/[a-f]*/hi.py"], case_insensitive=True, + matches=["abc/foo/hi.py", r"ABC\boo/hi.py"], + nomatches=[ + "abc/zoo/hi.py", "abc/hi.py", "abc/hi.pyc", "abc/foo/bar/hi.py", + r"abc\foo/bar/hi.py", + ], + ), + globs_to_regex_params( + ["abc/[a-f]/hi.py"], case_insensitive=True, + matches=["abc/f/hi.py", r"ABC\b/hi.py"], + nomatches=[ + "abc/foo/hi.py", "abc/zoo/hi.py", "abc/hi.py", "abc/hi.pyc", "abc/foo/bar/hi.py", + r"abc\foo/bar/hi.py", + ], + ), + globs_to_regex_params( + ["abc/"], case_insensitive=True, partial=True, + matches=["abc/foo/hi.py", "ABC/foo/bar/hi.py", r"ABC\foo/bar/hi.py"], + nomatches=["abcd/foo.py", "xabc/hi.py"], + ), + globs_to_regex_params( + ["*/foo"], case_insensitive=False, partial=True, + matches=["abc/foo/hi.py", "foo/hi.py"], + nomatches=["abc/xfoo/hi.py"], + ), + globs_to_regex_params( + ["**/foo"], + matches=["foo", "hello/foo", "hi/there/foo"], + nomatches=["foob", "hello/foob", "hello/Foo"], + ), + ])) +) +def test_globs_to_regex(patterns, case_insensitive, partial, text, result): + regex = globs_to_regex(patterns, case_insensitive=case_insensitive, partial=partial) + assert bool(regex.match(text)) == result + + +@pytest.mark.parametrize("pattern, bad_word", [ + ("***/foo.py", "***"), + ("bar/***/foo.py", "***"), + ("*****/foo.py", "*****"), + ("Hello]there", "]"), + ("Hello[there", "["), + ("Hello+there", "+"), + ("{a,b}c", "{"), + ("x/a**/b.py", "a**"), + ("x/abcd**/b.py", "abcd**"), + ("x/**a/b.py", "**a"), + ("x/**/**/b.py", "**/**"), ]) -def test_fnmatches_to_regex(patterns, case_insensitive, partial, matches, nomatches): - regex = fnmatches_to_regex(patterns, case_insensitive=case_insensitive, partial=partial) - for s in matches: - assert regex.match(s) - for s in nomatches: - assert not regex.match(s) +def test_invalid_globs(pattern, bad_word): + msg = f"File pattern can't include {bad_word!r}" + with pytest.raises(ConfigError, match=re.escape(msg)): + globs_to_regex([pattern]) class MatcherTest(CoverageTest): @@ -217,7 +298,7 @@ def test_module_matcher(self): for modulename, matches in matches_to_try: assert mm.match(modulename) == matches, modulename - def test_fnmatch_matcher(self): + def test_glob_matcher(self): matches_to_try = [ (self.make_file("sub/file1.py"), True), (self.make_file("sub/file2.c"), False), @@ -225,23 +306,25 @@ def test_fnmatch_matcher(self): (self.make_file("sub3/file4.py"), True), (self.make_file("sub3/file5.c"), False), ] - fnm = FnmatchMatcher(["*.py", "*/sub2/*"]) + fnm = GlobMatcher(["*.py", "*/sub2/*"]) assert fnm.info() == ["*.py", "*/sub2/*"] for filepath, matches in matches_to_try: self.assertMatches(fnm, filepath, matches) - def test_fnmatch_matcher_overload(self): - fnm = FnmatchMatcher(["*x%03d*.txt" % i for i in range(500)]) + def test_glob_matcher_overload(self): + fnm = GlobMatcher(["*x%03d*.txt" % i for i in range(500)]) self.assertMatches(fnm, "x007foo.txt", True) self.assertMatches(fnm, "x123foo.txt", True) self.assertMatches(fnm, "x798bar.txt", False) + self.assertMatches(fnm, "x499.txt", True) + self.assertMatches(fnm, "x500.txt", False) - def test_fnmatch_windows_paths(self): + def test_glob_windows_paths(self): # We should be able to match Windows paths even if we are running on # a non-Windows OS. - fnm = FnmatchMatcher(["*/foo.py"]) + fnm = GlobMatcher(["*/foo.py"]) self.assertMatches(fnm, r"dir\foo.py", True) - fnm = FnmatchMatcher([r"*\foo.py"]) + fnm = GlobMatcher([r"*\foo.py"]) self.assertMatches(fnm, r"dir\foo.py", True) @@ -309,9 +392,9 @@ def test_multiple_patterns(self, rel_yn): assert msgs == [ "Aliases (relative=True):", " Rule: '/home/*/src' -> './mysrc/' using regex " + - "'(?s:[\\\\\\\\/]home[\\\\\\\\/].*[\\\\\\\\/]src[\\\\\\\\/])'", + "'[/\\\\\\\\]home[/\\\\\\\\][^/\\\\\\\\]*[/\\\\\\\\]src[/\\\\\\\\]'", " Rule: '/lib/*/libsrc' -> './mylib/' using regex " + - "'(?s:[\\\\\\\\/]lib[\\\\\\\\/].*[\\\\\\\\/]libsrc[\\\\\\\\/])'", + "'[/\\\\\\\\]lib[/\\\\\\\\][^/\\\\\\\\]*[/\\\\\\\\]libsrc[/\\\\\\\\]'", "Matched path '/home/foo/src/a.py' to rule '/home/*/src' -> './mysrc/', " + "producing './mysrc/a.py'", "Matched path '/lib/foo/libsrc/a.py' to rule '/lib/*/libsrc' -> './mylib/', " + @@ -321,9 +404,9 @@ def test_multiple_patterns(self, rel_yn): assert msgs == [ "Aliases (relative=False):", " Rule: '/home/*/src' -> './mysrc/' using regex " + - "'(?s:[\\\\\\\\/]home[\\\\\\\\/].*[\\\\\\\\/]src[\\\\\\\\/])'", + "'[/\\\\\\\\]home[/\\\\\\\\][^/\\\\\\\\]*[/\\\\\\\\]src[/\\\\\\\\]'", " Rule: '/lib/*/libsrc' -> './mylib/' using regex " + - "'(?s:[\\\\\\\\/]lib[\\\\\\\\/].*[\\\\\\\\/]libsrc[\\\\\\\\/])'", + "'[/\\\\\\\\]lib[/\\\\\\\\][^/\\\\\\\\]*[/\\\\\\\\]libsrc[/\\\\\\\\]'", "Matched path '/home/foo/src/a.py' to rule '/home/*/src' -> './mysrc/', " + f"producing {files.canonical_filename('./mysrc/a.py')!r}", "Matched path '/lib/foo/libsrc/a.py' to rule '/lib/*/libsrc' -> './mylib/', " + diff --git a/tests/test_summary.py b/tests/test_summary.py index d603062be..ac29f5175 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -138,6 +138,30 @@ def test_report_including(self): assert "mycode.py " in report assert self.last_line_squeezed(report) == "TOTAL 4 0 100%" + def test_omit_files_here(self): + # https://github.com/nedbat/coveragepy/issues/1407 + self.make_file("foo.py", "") + self.make_file("bar/bar.py", "") + self.make_file("tests/test_baz.py", """\ + def test_foo(): + assert True + test_foo() + """) + self.run_command("coverage run --source=. --omit='./*.py' -m tests.test_baz") + report = self.report_from_command("coverage report") + + # Name Stmts Miss Cover + # --------------------------------------- + # tests/test_baz.py 3 0 100% + # --------------------------------------- + # TOTAL 3 0 100% + + assert self.line_count(report) == 5 + assert "foo" not in report + assert "bar" not in report + assert "tests/test_baz.py" in report + assert self.last_line_squeezed(report) == "TOTAL 3 0 100%" + def test_run_source_vs_report_include(self): # https://github.com/nedbat/coveragepy/issues/621 self.make_file(".coveragerc", """\ From 45cf7936ee605cfe06f7f5967a72a73198960120 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 24 Oct 2022 06:57:36 -0400 Subject: [PATCH 035/200] fix: more relative_files=true fixes. #1280 --- CHANGES.rst | 3 +++ coverage/python.py | 9 ++++++++- coverage/xmlreport.py | 3 ++- tests/test_api.py | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b0ea7bb6f..dd2c90144 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -34,6 +34,8 @@ Unreleased - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that relative file paths can be combined more easily. + - The setting is properly interpreted in more places, fixing `issue 1280`_. + - Fixed environment variable expansion in pyproject.toml files. It was overly broad, causing errors outside of coverage.py settings, as described in `issue 1481`_. This is now fixed, but in rare cases will require changing your @@ -43,6 +45,7 @@ Unreleased implementations other than CPython or PyPy (`issue 1474`_). .. _issue 991: https://github.com/nedbat/coveragepy/issues/991 +.. _issue 1280: https://github.com/nedbat/coveragepy/issues/1280 .. _issue 1407: https://github.com/nedbat/coveragepy/issues/1407 .. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474 .. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481 diff --git a/coverage/python.py b/coverage/python.py index da43e6e8b..c8b8e774b 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -151,7 +151,14 @@ def __init__(self, morf, coverage=None): filename = source_for_morf(morf) - super().__init__(canonical_filename(filename)) + fname = filename + canonicalize = True + if self.coverage is not None: + if self.coverage.config.relative_files: + canonicalize = False + if canonicalize: + fname = canonical_filename(filename) + super().__init__(fname) if hasattr(morf, '__name__'): name = morf.__name__.replace(".", os.sep) diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 2c34cb546..5eb940bf6 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -149,7 +149,8 @@ def xml_file(self, fr, analysis, has_arcs): # are populated later. Note that a package == a directory. filename = fr.filename.replace("\\", "/") for source_path in self.source_paths: - source_path = files.canonical_filename(source_path) + if not self.config.relative_files: + source_path = files.canonical_filename(source_path) if filename.startswith(source_path.replace("\\", "/") + "/"): rel_name = filename[len(source_path)+1:] break diff --git a/tests/test_api.py b/tests/test_api.py index 07bd07f33..ce44b9b1c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1239,6 +1239,38 @@ def test_combine_no_suffix_multiprocessing(self): self.assert_file_count(".coverage.*", 0) self.assert_exists(".coverage") + def test_files_up_one_level(self): + # https://github.com/nedbat/coveragepy/issues/1280 + self.make_file("src/mycode.py", """\ + def foo(): + return 17 + """) + self.make_file("test/test_it.py", """\ + from src.mycode import foo + assert foo() == 17 + """) + self.make_file("test/.coveragerc", """\ + [run] + parallel = True + relative_files = True + + [paths] + source = + ../src/ + */src + """) + os.chdir("test") + sys.path.insert(0, "..") + cov1 = coverage.Coverage() + self.start_import_stop(cov1, "test_it") + cov1.save() + cov2 = coverage.Coverage() + cov2.combine() + cov3 = coverage.Coverage() + cov3.load() + report = self.get_report(cov3) + assert self.last_line_squeezed(report) == "TOTAL 4 0 100%" + class CombiningTest(CoverageTest): """More tests of combining data.""" From 1291388bfe5e9639ebb05dce0b76e45a0b2e623a Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 30 Oct 2022 21:17:58 -0400 Subject: [PATCH 036/200] doc: the toml fix also fixed #1345 --- CHANGES.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index dd2c90144..ea5e0acf5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -38,14 +38,16 @@ Unreleased - Fixed environment variable expansion in pyproject.toml files. It was overly broad, causing errors outside of coverage.py settings, as described in `issue - 1481`_. This is now fixed, but in rare cases will require changing your - pyproject.toml to quote non-string values using environment substitution. + 1481`_ and `issue 1345`_. This is now fixed, but in rare cases will require + changing your pyproject.toml to quote non-string values that use environment + substitution. - Fixed internal logic that prevented coverage.py from running on implementations other than CPython or PyPy (`issue 1474`_). .. _issue 991: https://github.com/nedbat/coveragepy/issues/991 .. _issue 1280: https://github.com/nedbat/coveragepy/issues/1280 +.. _issue 1345: https://github.com/nedbat/coveragepy/issues/1345 .. _issue 1407: https://github.com/nedbat/coveragepy/issues/1407 .. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474 .. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481 From 64559a06b39f6f13380edc1efb001216e187a6e6 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 31 Oct 2022 05:47:37 -0400 Subject: [PATCH 037/200] docs: prep for 6.6.0b1 --- CHANGES.rst | 16 +++++++++++----- coverage/version.py | 2 +- doc/conf.py | 6 +++--- doc/index.rst | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index ea5e0acf5..ffac98d44 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,12 +17,18 @@ development at the same time, such as 4.5.x and 5.0. .. Version 9.8.1 — 2027-07-27 .. -------------------------- -Unreleased ----------- +.. _changes_6-6-0b1: -- Fixes to file pattern matching, fixing `issue 1407`_. Previously, `*` would - incorrectly match directory separators, making precise matching difficult. - This is now fixed. +Version 6.6.0b1 — 2022-10-31 +---------------------------- + +- Changes to file pattern matching, which might require updating your + configuration: + + - Previously, ``*`` would incorrectly match directory separators, making + precise matching difficult. This is now fixed, closing `issue 1407`_. + + - Now ``**`` matches any number of nested directories, including none. - Improvements to combining data files when using the :ref:`config_run_relative_files` setting: diff --git a/coverage/version.py b/coverage/version.py index 7e861f4bd..b060cd934 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -5,7 +5,7 @@ # This file is exec'ed in setup.py, don't import anything! # Same semantics as sys.version_info. -version_info = (6, 5, 1, "alpha", 0) +version_info = (6, 6, 0, "beta", 1) def _make_version(major, minor, micro, releaselevel, serial): diff --git a/doc/conf.py b/doc/conf.py index 38b8f0fe2..3dd12db23 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -65,11 +65,11 @@ # @@@ editable copyright = "2009–2022, Ned Batchelder" # pylint: disable=redefined-builtin # The short X.Y.Z version. -version = "6.5.0" +version = "6.6.0" # The full version, including alpha/beta/rc tags. -release = "6.5.0" +release = "6.6.0b1" # The date of release, in "monthname day, year" format. -release_date = "September 29, 2022" +release_date = "October 31, 2022" # @@@ end rst_epilog = """ diff --git a/doc/index.rst b/doc/index.rst index 3191c5482..fc0dbdc91 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -24,7 +24,7 @@ supported on: .. ifconfig:: prerelease **This is a pre-release build. The usual warnings about possible bugs - apply.** The latest stable version is coverage.py 6.4, `described here`_. + apply.** The latest stable version is coverage.py 6.5.0, `described here`_. .. _described here: http://coverage.readthedocs.io/ From 5e8d0c9180bbb490cb287d45e806a21fbdf70886 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 31 Oct 2022 07:13:41 -0400 Subject: [PATCH 038/200] build: bump version --- CHANGES.rst | 6 ++++++ coverage/version.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index ffac98d44..f3be6387f 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. + + .. _changes_6-6-0b1: Version 6.6.0b1 — 2022-10-31 diff --git a/coverage/version.py b/coverage/version.py index b060cd934..8ebeee406 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -5,7 +5,7 @@ # This file is exec'ed in setup.py, don't import anything! # Same semantics as sys.version_info. -version_info = (6, 6, 0, "beta", 1) +version_info = (6, 6, 0, "beta", 2) def _make_version(major, minor, micro, releaselevel, serial): From 89528f36c4b833048a92d6134008f1a801b7dd50 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 1 Nov 2022 17:15:33 -0400 Subject: [PATCH 039/200] build: releases get a nicer pypi/install footer --- ci/github_releases.py | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/ci/github_releases.py b/ci/github_releases.py index 9a36a586c..5ba3d5229 100644 --- a/ci/github_releases.py +++ b/ci/github_releases.py @@ -74,16 +74,11 @@ def get_releases(session, repo): releases = { r['tag_name']: r for r in github_paginated(session, url) } return releases -RELEASE_BODY_FMT = """ +RELEASE_BODY_FMT = """\ {relnote_text} ---- -PyPI page: [coverage {version}](https://pypi.org/project/coverage/{version}) - -To install: -``` -$ python3 -m pip install coverage=={version} -``` +:arrow_right:\xa0 PyPI page: [coverage {version}](https://pypi.org/project/coverage/{version}). +:arrow_right:\xa0 To install: `python3 -m pip install coverage=={version}` """ def release_for_relnote(relnote): @@ -101,22 +96,20 @@ def release_for_relnote(relnote): "prerelease": relnote["prerelease"], } -def create_release(session, repo, relnote): +def create_release(session, repo, release_data): """ Create a new GitHub release. """ - print(f"Creating {relnote['version']}") - data = release_for_relnote(relnote) - resp = session.post(RELEASES_URL.format(repo=repo), json=data) + print(f"Creating {release_data['name']}") + resp = session.post(RELEASES_URL.format(repo=repo), json=release_data) check_ok(resp) -def update_release(session, url, relnote): +def update_release(session, url, release_data): """ Update an existing GitHub release. """ - print(f"Updating {relnote['version']}") - data = release_for_relnote(relnote) - resp = session.patch(url, json=data) + print(f"Updating {release_data['name']}") + resp = session.patch(url, json=release_data) check_ok(resp) def update_github_releases(json_filename, repo): @@ -139,14 +132,15 @@ def update_github_releases(json_filename, repo): tag = relnote["version"] if not does_tag_exist(tag): continue + release_data = release_for_relnote(relnote) exists = tag in releases if not exists: - create_release(gh_session, repo, relnote) + create_release(gh_session, repo, release_data) else: release = releases[tag] - if release["body"] != relnote["text"]: + if release["body"] != release_data["body"]: url = release["url"] - update_release(gh_session, url, relnote) + update_release(gh_session, url, release_data) if __name__ == "__main__": update_github_releases(*sys.argv[1:3]) From ea242122f2bdd315009b3d0f49541542dfa0da06 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 2 Nov 2022 07:00:53 -0400 Subject: [PATCH 040/200] test: a utility print for when reporting tests fail --- tests/coveragetest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/coveragetest.py b/tests/coveragetest.py index 78254156b..54ae4eb42 100644 --- a/tests/coveragetest.py +++ b/tests/coveragetest.py @@ -89,6 +89,7 @@ def get_report(self, cov, squeeze=True, **kwargs): kwargs.setdefault("show_missing", False) cov.report(file=repout, **kwargs) report = repout.getvalue().replace('\\', '/') + print(report) # When tests fail, it's helpful to see the output if squeeze: report = re.sub(r" +", " ", report) return report From b34bd149f2fe86a38e7f8117f8604aa5fab3dedc Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 3 Nov 2022 18:56:23 -0400 Subject: [PATCH 041/200] fix: properly measure strange use of wildcard alternatives in match/case. #1421 --- CHANGES.rst | 5 ++++- coverage/parser.py | 5 ++++- tests/test_arcs.py | 13 +++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index f3be6387f..9453f1ae3 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. +- Fixed a mis-measurement of a strange use of wildcard alternatives in + match/case statements, closing `issue 1421`_. + +.. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 .. _changes_6-6-0b1: diff --git a/coverage/parser.py b/coverage/parser.py index 8b2a9ac54..c4fef9ceb 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -1041,7 +1041,10 @@ def _handle__Match(self, node): had_wildcard = False for case in node.cases: case_start = self.line_for_node(case.pattern) - if isinstance(case.pattern, ast.MatchAs): + pattern = case.pattern + while isinstance(pattern, ast.MatchOr): + pattern = pattern.patterns[-1] + if isinstance(pattern, ast.MatchAs): had_wildcard = True self.add_arc(last_start, case_start, "the pattern on line {lineno} always matched") from_start = ArcStart(case_start, cause="the pattern on line {lineno} never matched") diff --git a/tests/test_arcs.py b/tests/test_arcs.py index d907e8c7b..1f2e50d71 100644 --- a/tests/test_arcs.py +++ b/tests/test_arcs.py @@ -1362,6 +1362,19 @@ def test_match_case_without_wildcard(self): ) assert self.stdout() == "None\nno go\ngo: n\n" + def test_absurd_wildcard(self): + # https://github.com/nedbat/coveragepy/issues/1421 + self.check_coverage("""\ + def absurd(x): + match x: + case (3 | 99 | (999 | _)): + print("default") + absurd(5) + """, + arcz=".1 15 5. .2 23 34 4.", + ) + assert self.stdout() == "default\n" + class OptimizedIfTest(CoverageTest): """Tests of if statements being optimized away.""" From f0f4761a459e1601c5b0c1043db5895e31c66e80 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 3 Nov 2022 20:59:43 -0400 Subject: [PATCH 042/200] refactor: avoid RawConfigParser, and use super() --- coverage/config.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/coverage/config.py b/coverage/config.py index 1ad46597c..c2375d036 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -18,7 +18,7 @@ os = isolate_module(os) -class HandyConfigParser(configparser.RawConfigParser): +class HandyConfigParser(configparser.ConfigParser): """Our specialization of ConfigParser.""" def __init__(self, our_file): @@ -29,19 +29,19 @@ def __init__(self, our_file): for possible settings. """ - configparser.RawConfigParser.__init__(self) + super().__init__(interpolation=None) self.section_prefixes = ["coverage:"] if our_file: self.section_prefixes.append("") def read(self, filenames, encoding_unused=None): """Read a file name as UTF-8 configuration data.""" - return configparser.RawConfigParser.read(self, filenames, encoding="utf-8") + return super().read(filenames, encoding="utf-8") def has_option(self, section, option): for section_prefix in self.section_prefixes: real_section = section_prefix + section - has = configparser.RawConfigParser.has_option(self, real_section, option) + has = super().has_option(real_section, option) if has: return has return False @@ -49,7 +49,7 @@ def has_option(self, section, option): def has_section(self, section): for section_prefix in self.section_prefixes: real_section = section_prefix + section - has = configparser.RawConfigParser.has_section(self, real_section) + has = super().has_section(real_section) if has: return real_section return False @@ -57,8 +57,8 @@ def has_section(self, section): def options(self, section): for section_prefix in self.section_prefixes: real_section = section_prefix + section - if configparser.RawConfigParser.has_section(self, real_section): - return configparser.RawConfigParser.options(self, real_section) + if super().has_section(real_section): + return super().options(real_section) raise ConfigError(f"No section: {section!r}") def get_section(self, section): @@ -71,7 +71,7 @@ def get_section(self, section): def get(self, section, option, *args, **kwargs): """Get a value, replacing environment variables also. - The arguments are the same as `RawConfigParser.get`, but in the found + The arguments are the same as `ConfigParser.get`, but in the found value, ``$WORD`` or ``${WORD}`` are replaced by the value of the environment variable ``WORD``. @@ -80,12 +80,12 @@ def get(self, section, option, *args, **kwargs): """ for section_prefix in self.section_prefixes: real_section = section_prefix + section - if configparser.RawConfigParser.has_option(self, real_section, option): + if super().has_option(real_section, option): break else: raise ConfigError(f"No option {option!r} in section: {section!r}") - v = configparser.RawConfigParser.get(self, real_section, option, *args, **kwargs) + v = super().get(real_section, option, *args, **kwargs) v = substitute_variables(v, os.environ) return v From 35145829753d8f99f94630012d45e825528d6596 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 07:21:19 -0400 Subject: [PATCH 043/200] build: remove pip pin https://github.com/jazzband/pip-tools/issues/1617 was fixed in pip-tools==6.6.1 --- requirements/pins.pip | 3 --- 1 file changed, 3 deletions(-) diff --git a/requirements/pins.pip b/requirements/pins.pip index ae7062cf4..06b85a316 100644 --- a/requirements/pins.pip +++ b/requirements/pins.pip @@ -7,9 +7,6 @@ # but have different pins. This seems to satisfy them all: #docutils>=0.17,<0.18 -# https://github.com/jazzband/pip-tools/issues/1617 -pip<22.1 - # requests gets different versions in dev.pip and doc/requirements.pip, not # sure why, and they then ask for different versions of certifi, and we can't # install, so pin certifi. From 413219b348306eab8d03e75f0f7d7785eb37fa5d Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 07:21:55 -0400 Subject: [PATCH 044/200] chore: make upgrade --- doc/requirements.pip | 18 +- requirements/dev.pip | 172 +++++++++---------- requirements/kit.pip | 18 +- requirements/light-threads.pip | 301 +++++++++++++++++---------------- requirements/lint.pip | 191 ++++++++++----------- requirements/pip-tools.pip | 22 ++- requirements/pip.pip | 10 +- requirements/pytest.pip | 12 +- 8 files changed, 365 insertions(+), 379 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 87f45ffdc..35e63c515 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -8,9 +8,9 @@ alabaster==0.7.12 \ --hash=sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359 \ --hash=sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02 # via sphinx -babel==2.10.3 \ - --hash=sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51 \ - --hash=sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb +babel==2.11.0 \ + --hash=sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe \ + --hash=sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6 # via sphinx certifi==2022.5.18.1 \ --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ @@ -119,9 +119,9 @@ pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc # via packaging -pytz==2022.5 \ - --hash=sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22 \ - --hash=sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914 +pytz==2022.6 \ + --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ + --hash=sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2 # via babel requests==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ @@ -148,9 +148,9 @@ sphinx-autobuild==2021.3.14 \ --hash=sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac \ --hash=sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05 # via -r doc/requirements.in -sphinx-rtd-theme==1.0.0 \ - --hash=sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8 \ - --hash=sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c +sphinx-rtd-theme==1.1.1 \ + --hash=sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7 \ + --hash=sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103 # via -r doc/requirements.in sphinxcontrib-applehelp==1.0.2 \ --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a \ diff --git a/requirements/dev.pip b/requirements/dev.pip index 2b12b2e42..086362e36 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -78,9 +78,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -exceptiongroup==1.0.0 \ - --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ - --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad +exceptiongroup==1.0.1 \ + --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ + --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 # via # -r requirements/pytest.pip # hypothesis @@ -107,77 +107,71 @@ future==0.18.2 \ # via # -r requirements/pytest.pip # pycontracts -greenlet==1.1.3.post0 \ - --hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \ - --hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \ - --hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \ - --hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \ - --hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \ - --hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \ - --hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \ - --hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \ - --hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \ - --hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \ - --hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \ - --hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \ - --hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \ - --hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \ - --hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \ - --hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \ - --hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \ - --hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \ - --hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \ - --hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \ - --hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \ - --hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \ - --hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \ - --hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \ - --hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \ - --hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \ - --hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \ - --hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \ - --hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \ - --hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \ - --hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \ - --hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \ - --hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \ - --hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \ - --hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \ - --hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \ - --hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \ - --hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \ - --hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \ - --hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \ - --hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \ - --hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \ - --hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \ - --hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \ - --hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \ - --hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \ - --hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \ - --hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \ - --hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \ - --hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \ - --hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \ - --hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \ - --hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \ - --hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \ - --hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \ - --hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \ - --hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \ - --hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \ - --hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \ - --hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \ - --hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \ - --hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \ - --hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \ - --hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \ - --hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \ - --hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04 +greenlet==2.0.0.post0 \ + --hash=sha256:00ebdaf0fa51c284fd2172837d751731a15971e0c20d1a9163cfbdf620ce8b49 \ + --hash=sha256:029ca674b3a7e8427db8f5c65d5ed4e24a7417af2a415a5958598aefd71980c4 \ + --hash=sha256:02bdb1e373b275bd705c43b249426e776c4f8a8ff2afaf8ec5ea0dde487d8a14 \ + --hash=sha256:08dc04f49ed1ea5e6772bb5e8cf2a77d1b1744566f4eca471a55b35af1278b31 \ + --hash=sha256:08f44e938d142271b954405afb6570e0be48a9f556b6bf4d42d2e3ae6a251fad \ + --hash=sha256:0a5c03e2a68ec2ff1cba74ceaed899ec8cd353285f4f985c30c8cfbef9d3a3be \ + --hash=sha256:0fee3240093b745efc857392f09379514ad84db4ca324514594bbdf6380016c8 \ + --hash=sha256:118e708dd7bc88beaeeaa5a8601a7743b8835b7bbaf7c8f23ffa78f8bc8faf28 \ + --hash=sha256:13d492a807a5c7334b5931e9b6d9b181991ccc6a40555a7b177f189feff59b4b \ + --hash=sha256:1cac9e9895aeff26434325404558783ee54f4ff3aec8daa56b8706796f7b01a0 \ + --hash=sha256:2146d15429b4eeb412428737594acb5660a5bc0fdd1488d8a2a74a5ee32391fa \ + --hash=sha256:21ee1ae26d072b195edea764218623f6c15eba4ae06816908f33c82e0af018d3 \ + --hash=sha256:22eca421e3f2f3c18f4f54c0ff525aa9d397c6f116fce9ebd37b420174dbc027 \ + --hash=sha256:2bab49783858cf724fff6868395cbeb81d1188cba23616b53e79de0beda29f42 \ + --hash=sha256:2fbdec204ca40b3d0c0992a19c1ba627441c17983ac4ffc45baec7f5f53e20ca \ + --hash=sha256:30ce47525f9a1515566429ac7de6b1ae76d32c3ccede256e3517a1a6419cf659 \ + --hash=sha256:335dcf676d5e4122e4006c16ae11eda2467af5461b949c265ce120b6b959ffe2 \ + --hash=sha256:3407b843b05da71fef0f1dd666059c08ad0e0f4afc3b9c93c998a2e53fac95e5 \ + --hash=sha256:35827f98fd0d768862b8f15777e6dbb03fe6ac6e7bd1bee3f3ded4536f350347 \ + --hash=sha256:3a22e5988f9d66b3e9ae9583bf9d8ef792b09f23afeb78707e6a4f47ab57cc5e \ + --hash=sha256:3c3327da2bdab61078e42e695307465c425671a5a9251e6c29ee130d51943f28 \ + --hash=sha256:3ca723dfc2789c1fb991809822811896b198ecf0909dbccea4a07170d18c3e1b \ + --hash=sha256:46156ae88ee71c37b6c4f7af63fff5d3ab8f45ef72e1a660bcf6386c1647f106 \ + --hash=sha256:4bbe2d074292e3646704371eb640ee52c386d633ed72ff223dadcd3fe8ecd8f9 \ + --hash=sha256:4c4310f0e42154995d92810f27b44ab7116a4a696feb0ff141ae2de59196efd7 \ + --hash=sha256:4cfa629de5b2dea27c81b334c4536463e9a49ac0877e2008a276d58d4c72868a \ + --hash=sha256:4e144ab0de56b4d2a2cf0d2fb9d568b59fce49aab3e129badf17c12b0252047d \ + --hash=sha256:4ea67f303cec384b148774667c7e3cf02311e7026fc02bdcdcd206dfe4ea4fc9 \ + --hash=sha256:538c9e8f65a32413ace426f8117ef019021adf8175f7c491fed65f5fe2083e0c \ + --hash=sha256:56565ac9ab4ff3dd473bfe959e0bf2a5062aabb89b7c94cabb417beb162c9fff \ + --hash=sha256:5e22485256bb1c60bbcc6f8509b1a11042358a2462d5ecdb9a82dc472d2fdd60 \ + --hash=sha256:602a69c24f1a9755dd1760b3b31bdfc495c4613260c876a01b7e6d5eb9bcae1b \ + --hash=sha256:6393ec3cecda53b20241e88bc33d87cbd8126cc10870fc69fa16ca2e20a5ac1b \ + --hash=sha256:6442bbfb047dc1e47658954b72e1589f2bc4e12e67d51bbad0059a626180daa1 \ + --hash=sha256:666d2a0b269a68cd4fe0976544ab97970c5334d35d0e47ae9be1723f734d8204 \ + --hash=sha256:697cfbfc19815c40213badcfe5f076418e0f9100cd25a66f513f32c1026b8bf4 \ + --hash=sha256:6a1a6745c5dce202aa3f29a1736c53cf2179e9c3b280dc62cea9cb8c69977c83 \ + --hash=sha256:6fc73fc8dd81d9efa842a55033b6b4cb233b134a0270e127c6874d053ef2049b \ + --hash=sha256:7e9e0d4c5c618b0442396715ffe6c2f84a60d593dad7e0184388aed36d568a65 \ + --hash=sha256:81fdcf7c0c2df46a99ca421a552c4370117851c5e4dbd6cb53d569b896d62322 \ + --hash=sha256:8b26932be686f3582df039d79fe96f7ca13d63b39468162f816f9ff29584b9a4 \ + --hash=sha256:8b7e5191b974fb66fcbac1818ba494d3512da9cf6eaef7acd952f9862eaaa20c \ + --hash=sha256:8c80e9c41a83d8c90399af8c7dcdeae0c03c48b40b9d0ab84457533d5d7882bf \ + --hash=sha256:9f2f110b9cc325f6543e0e3f4ab8008c272a59052f9464047c29d4be4511ce05 \ + --hash=sha256:a339e510a079dc8372e39ce1c7629414db51966235c9670c58d529def79243a2 \ + --hash=sha256:ad9abc3e4d2370cecb524421cc5c8a664006aa11d5c1cb3c9250e3bf65ab546e \ + --hash=sha256:b043782c8f6cccc8fae3a16db397eca1d36a41b0706cbf6f514aea1e1a260bab \ + --hash=sha256:b31de27313abbb567c528ed123380fcf18a5dfd03134570dfd12227e21ac1184 \ + --hash=sha256:b75e5644cc353328cd57ec8dafaaf5f81b2c3ecf7c4b278b907e99ad53ba7839 \ + --hash=sha256:b8cfc8fc944bd7b704691bc28225a2635e377e92dc413459845868d3f7724982 \ + --hash=sha256:c2055c52260808d87622293b57df1c68aeb12ddd8a0cfc0223fb57a5f629e202 \ + --hash=sha256:c416106b3b8e905b6ab0e84ec90047a6401021aa023f9aa93978e57cd8f8189f \ + --hash=sha256:d0e210e17a6181a3fd3f8dce957043a4e74177ffa9f295514984b2b633940dce \ + --hash=sha256:d9453135e48cd631e3e9f06d9da9100d17c9f662e4a6d8b552c29be6c834a6b9 \ + --hash=sha256:dd0198006278291d9469309d655093df1f5e5107c0261e242b5f390baee32199 \ + --hash=sha256:e1781bda1e787d3ad33788cc3be47f6e47a9581676d02670c15ee36c9460adfe \ + --hash=sha256:e56a5a9f303e3ac011ba445a6d84f05d08666bf8db094afafcec5228622c30f5 \ + --hash=sha256:e93ae35f0fd3caf75e58c76a1cab71e6ece169aaa1b281782ef9efde0a6b83f2 \ + --hash=sha256:eb36b6570646227a63eda03916f1cc6f3744ee96d28f7a0a5629c59267a8055f \ + --hash=sha256:f8c425a130e04d5404edaf6f5906e5ab12f3aa1168a1828aba6dfadac5910469 # via -r requirements/dev.in -hypothesis==6.56.3 \ - --hash=sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a \ - --hash=sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789 +hypothesis==6.56.4 \ + --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ + --hash=sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -215,9 +209,9 @@ jedi==0.18.1 \ --hash=sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d \ --hash=sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab # via pudb -keyring==23.9.3 \ - --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ - --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 +keyring==23.10.0 \ + --hash=sha256:373e29a1bda7f42247c0db0fa13026c770fa8ff995a7475769357e48743761df \ + --hash=sha256:6f457494bb207053c97443656e92ebcc4e2957c5c529028d9eaf4daf40a94483 # via twine lazy-object-proxy==1.8.0 \ --hash=sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada \ @@ -295,8 +289,8 @@ pluggy==1.0.0 \ # -r requirements/pytest.pip # pytest # tox -pudb==2022.1.2 \ - --hash=sha256:6b83ab805bddb53710109690a2237e98bf83c0b3a00033c517cdf5f6a8fa470d +pudb==2022.1.3 \ + --hash=sha256:58e83ada9e19ffe92c1fdc78ae5458ef91aeb892a5b8f0e7379e6fa61e0e664a # via -r requirements/dev.in py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ @@ -338,9 +332,9 @@ qualname==0.1.0 \ # via # -r requirements/pytest.pip # pycontracts -readme-renderer==37.2 \ - --hash=sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106 \ - --hash=sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923 +readme-renderer==37.3 \ + --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ + --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 # via # -r requirements/dev.in # twine @@ -537,13 +531,11 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -pip==22.0.4 \ - --hash=sha256:b3a9de2c6ef801e9247d1527a4b16f92f2cc141cd1489f3fffaf6a9e96729764 \ - --hash=sha256:c6aca0f2f081363f689f041d90dab2a07a9a07fb840284db2218117a52da800b - # via - # -c requirements/pins.pip - # -r requirements/pip.pip -setuptools==65.5.0 \ - --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ - --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 +pip==22.3 \ + --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ + --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 + # via -r requirements/pip.pip +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via check-manifest diff --git a/requirements/kit.pip b/requirements/kit.pip index 09f0a914f..c85338f3f 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -4,9 +4,9 @@ # # make upgrade # -auditwheel==5.2.0 \ - --hash=sha256:32c8e60d48e39e6d66bd3d49e8a30fbe44d686554420274fb2b9fc4720e91e7f \ - --hash=sha256:b79c6007ee5df42c8fa1ab6ca36da72f490819b21f210fb12cb802d3acbe82ee +auditwheel==5.2.1 \ + --hash=sha256:504f9ca38bd884ce75f59e066ec80373abfc94ee65d0f807fe99f2b1d9ba774a \ + --hash=sha256:587f4c7a56483349e3de3833d7d881bf325b82f47340e429ce38a259a1c810d8 # via -r requirements/kit.in bashlex==0.16 \ --hash=sha256:dc6f017e49ce2d0fe30ad9f5206da9cd13ded073d365688c9fda525354e8c373 \ @@ -80,9 +80,9 @@ typing-extensions==4.4.0 \ # via # cibuildwheel # importlib-metadata -wheel==0.37.1 \ - --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ - --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 +wheel==0.38.1 \ + --hash=sha256:7a95f9a8dc0924ef318bd55b616112c70903192f524d120acc614f59547a9e1f \ + --hash=sha256:ea041edf63f4ccba53ad6e035427997b3bb10ee88a4cd014ae82aeb9eea77bb9 # via -r requirements/kit.in zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ @@ -92,7 +92,7 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.0 \ - --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ - --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via -r requirements/kit.in diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 7609b1fb7..af1c67d15 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -78,113 +78,117 @@ eventlet==0.33.1 \ --hash=sha256:a085922698e5029f820cf311a648ac324d73cec0e4792877609d978a4b5bbf31 \ --hash=sha256:afbe17f06a58491e9aebd7a4a03e70b0b63fd4cf76d8307bae07f280479b1515 # via -r requirements/light-threads.in -gevent==22.10.1 \ - --hash=sha256:03c10ca0beeab0c6be516030471ea630447ddd1f649d3335e5b162097cd4130a \ - --hash=sha256:04a920a812b6c0c36d4613a15c254ca1ce415ee75ade0df3b8941ab61ae7ce3f \ - --hash=sha256:0569e133bb620de1001ac807ad9a8abaadedd25349c6d695f80c9048a3f59d42 \ - --hash=sha256:06ea39c70ce166c4a1d4386c7fae96cb8d84ad799527b3378406051104d15443 \ - --hash=sha256:0cafb8f5399224990a5329bca3606bf399ee3604ae711b2d9238129b44551ad5 \ - --hash=sha256:1ac816f5e8e318c5fa27091ee43fcf4caaa6ae73a487e875a1a296a04c3da5af \ - --hash=sha256:1e1c609f9e4171588006bea7ff41bb830ff27c27d071bbd311f91860fb5ef4cc \ - --hash=sha256:1ec5f77f629d997668983be53bad2a90d1b858a00e43b9e75e1c9a118c3a840b \ - --hash=sha256:21dbeb6d3b47093f40ca97aab493b2fb64b6f22112f88f56d79cf6f52a8c1c16 \ - --hash=sha256:2dcfd8ef9dcca78c51dd266d0f4b48d9b7ea2592ae881bf66d8dbe59bb16631a \ - --hash=sha256:33c4cd095f99768ecc4b3bb75a12f52ea9df5c40a58671c667f86ea087a075e1 \ - --hash=sha256:36e47ca663081a71fca137b7c852e99e7ee3761082070c13aa2ae3b5b6234af6 \ - --hash=sha256:3c1cfd9f9fb6a2a5a9a04132d315db7fb819db019dea260695fe6e4012416f96 \ - --hash=sha256:3e73c9f71aa2a6795ecbec9b57282b002375e863e283558feb87b62840c8c1ac \ - --hash=sha256:3f7d11136b3ae6312effbc2ac0ed902ae718d86e7acb9a51cf927262cfb2931e \ - --hash=sha256:4b0d29fc18ee338a85396facfc508e5f26e2e0e90f4c2889f8a9e74d341ad467 \ - --hash=sha256:4be5859af086de1ed85702c0a84479387087ddf49e38332c41861b0a10e96d8f \ - --hash=sha256:4c06c0f3f4f1b147f51a934fbf541880cee769492b98c4ebd3e930b5ff862646 \ - --hash=sha256:5bc3758f0dc95007c1780d28a9fd2150416a79c50f308f62a674d78a845ea1b9 \ - --hash=sha256:5d64b208bec99adc7e0b6e08a3e2c296065c665ca725ca8da434c4ffc5aa302e \ - --hash=sha256:702a51b8f21bad1976b0893f90ade466e8c27039b846b611ad2beb8c6e6ac701 \ - --hash=sha256:7e8c4ccc544f6e6c26ab10d0d6a7be86bd522222ce40f00bfafa01289f04bffc \ - --hash=sha256:a12443b7326e40d00fb445d37bae154fd1f4693055330c6b4e68670ca3b6e6bf \ - --hash=sha256:a838437b7b629328ad457cd36df454500afe7f3df4b971a6ff85851dfcf8c844 \ - --hash=sha256:acb21bee2e66da45b8916073c8ae54c44629beb94d49120c188d27aff4ebf8dd \ - --hash=sha256:af7baec79a5f8ad1cc132d3b14edd12661c628d8094e501b089b1fe2d3df7f6e \ - --hash=sha256:be43278781d39b4081f7f4d3e8ebb1dac188c9fe98f25da817325cb12c01887a \ - --hash=sha256:cf6dd33052919de8fb56e0bea0e6a7c7d6545281fe280ea78e311621c7adb50e \ - --hash=sha256:d18fcc324f39a3b21795022eb47c7752d6e4f4ed89d8cca41f1cc604553265b3 \ - --hash=sha256:d2ea4ce36c09355379bc038be2bd50118f97d2eb6381b7096de4d05aa4c3e241 \ - --hash=sha256:d701208d4d65dbdf9feb02561a75ecc5bd28300e47b59f74033a07b593887806 \ - --hash=sha256:d8df3f628c8a9fb339b87a849dc2076e56d124e2169261fa58b4a01db3a335b6 \ - --hash=sha256:db592cfe5106730667ac36f43554e7a869d757e411f8a08116c3739cee507145 \ - --hash=sha256:df3042349c9a4460eeaec8d0e56d737cb183eed055e75a6af9dbda94aaddaf4d \ - --hash=sha256:eb0d9d6f869ba7c49d7f9b7d244dd20daec5cc87cd3e2e90209d6ed8172e0cad \ - --hash=sha256:eefcb21fda3055f2e7eaad2e8098885a7bbddd83b174b012e2142db6b2b4c09d \ - --hash=sha256:f16c6937d47593f051fc3ac7996c819919082a1e7e0dec927cdae8771d26ed45 \ - --hash=sha256:fe2c0ff095171c49f78f1d4e6dc89fa58253783c7b6dccab9f1d76e2ee391f10 +gevent==22.10.2 \ + --hash=sha256:018f93de7d5318d2fb440f846839a4464738468c3476d5c9cf7da45bb71c18bd \ + --hash=sha256:0d581f22a5be6281b11ad6309b38b18f0638cf896931223cbaa5adb904826ef6 \ + --hash=sha256:1472012493ca1fac103f700d309cb6ef7964dcdb9c788d1768266e77712f5e49 \ + --hash=sha256:172caa66273315f283e90a315921902cb6549762bdcb0587fd60cb712a9d6263 \ + --hash=sha256:17b68f4c9e20e47ad49fe797f37f91d5bbeace8765ce2707f979a8d4ec197e4d \ + --hash=sha256:1ca01da176ee37b3527a2702f7d40dbc9ffb8cfc7be5a03bfa4f9eec45e55c46 \ + --hash=sha256:1d543c9407a1e4bca11a8932916988cfb16de00366de5bf7bc9e7a3f61e60b18 \ + --hash=sha256:1e1286a76f15b5e15f1e898731d50529e249529095a032453f2c101af3fde71c \ + --hash=sha256:1e955238f59b2947631c9782a713280dd75884e40e455313b5b6bbc20b92ff73 \ + --hash=sha256:1f001cac0ba8da76abfeb392a3057f81fab3d67cc916c7df8ea977a44a2cc989 \ + --hash=sha256:1ff3796692dff50fec2f381b9152438b221335f557c4f9b811f7ded51b7a25a1 \ + --hash=sha256:319d8b1699b7b8134de66d656cd739b308ab9c45ace14d60ae44de7775b456c9 \ + --hash=sha256:323b207b281ba0405fea042067fa1a61662e5ac0d574ede4ebbda03efd20c350 \ + --hash=sha256:3b7eae8a0653ba95a224faaddf629a913ace408edb67384d3117acf42d7dcf89 \ + --hash=sha256:4114f0f439f0b547bb6f1d474fee99ddb46736944ad2207cef3771828f6aa358 \ + --hash=sha256:4197d423e198265eef39a0dea286ef389da9148e070310f34455ecee8172c391 \ + --hash=sha256:494c7f29e94df9a1c3157d67bb7edfa32a46eed786e04d9ee68d39f375e30001 \ + --hash=sha256:4e2f008c82dc54ec94f4de12ca6feea60e419babb48ec145456907ae61625aa4 \ + --hash=sha256:54f4bfd74c178351a4a05c5c7df6f8a0a279ff6f392b57608ce0e83c768207f9 \ + --hash=sha256:59b47e81b399d49a5622f0f503c59f1ce57b7705306ea0196818951dfc2f36c8 \ + --hash=sha256:6c04ee32c11e9fcee47c1b431834878dc987a7a2cc4fe126ddcae3bad723ce89 \ + --hash=sha256:84c517e33ed604fa06b7d756dc0171169cc12f7fdd68eb7b17708a62eebf4516 \ + --hash=sha256:8729129edef2637a8084258cb9ec4e4d5ca45d97ac77aa7a6ff19ccb530ab731 \ + --hash=sha256:877abdb3a669576b1d51ce6a49b7260b2a96f6b2424eb93287e779a3219d20ba \ + --hash=sha256:8c192d2073e558e241f0b592c1e2b34127a4481a5be240cad4796533b88b1a98 \ + --hash=sha256:8f2477e7b0a903a01485c55bacf2089110e5f767014967ba4b287ff390ae2638 \ + --hash=sha256:96c56c280e3c43cfd075efd10b250350ed5ffd3c1514ec99a080b1b92d7c8374 \ + --hash=sha256:97cd42382421779f5d82ec5007199e8a84aa288114975429e4fd0a98f2290f10 \ + --hash=sha256:98bc510e80f45486ef5b806a1c305e0e89f0430688c14984b0dbdec03331f48b \ + --hash=sha256:990d7069f14dc40674e0d5cb43c68fd3bad8337048613b9bb94a0c4180ffc176 \ + --hash=sha256:9d85574eb729f981fea9a78998725a06292d90a3ed50ddca74530c3148c0be41 \ + --hash=sha256:a2237451c721a0f874ef89dbb4af4fdc172b76a964befaa69deb15b8fff10f49 \ + --hash=sha256:a47a4e77e2bc668856aad92a0b8de7ee10768258d93cd03968e6c7ba2e832f76 \ + --hash=sha256:a5488eba6a568b4d23c072113da4fc0feb1b5f5ede7381656dc913e0d82204e2 \ + --hash=sha256:ae90226074a6089371a95f20288431cd4b3f6b0b096856afd862e4ac9510cddd \ + --hash=sha256:b43d500d7d3c0e03070dee813335bb5315215aa1cf6a04c61093dfdd718640b3 \ + --hash=sha256:b6c144e08dfad4106effc043a026e5d0c0eff6ad031904c70bf5090c63f3a6a7 \ + --hash=sha256:d21ad79cca234cdbfa249e727500b0ddcbc7adfff6614a96e6eaa49faca3e4f2 \ + --hash=sha256:d82081656a5b9a94d37c718c8646c757e1617e389cdc533ea5e6a6f0b8b78545 \ + --hash=sha256:da4183f0b9d9a1e25e1758099220d32c51cc2c6340ee0dea3fd236b2b37598e4 \ + --hash=sha256:db562a8519838bddad0c439a2b12246bab539dd50e299ea7ff3644274a33b6a5 \ + --hash=sha256:ddaa3e310a8f1a45b5c42cf50b54c31003a3028e7d4e085059090ea0e7a5fddd \ + --hash=sha256:ed7f16613eebf892a6a744d7a4a8f345bc6f066a0ff3b413e2479f9c0a180193 \ + --hash=sha256:efc003b6c1481165af61f0aeac248e0a9ac8d880bb3acbe469b448674b2d5281 \ + --hash=sha256:f01c9adbcb605364694b11dcd0542ec468a29ac7aba2fb5665dc6caf17ba4d7e \ + --hash=sha256:f23d0997149a816a2a9045af29c66f67f405a221745b34cefeac5769ed451db8 \ + --hash=sha256:f3329bedbba4d3146ae58c667e0f9ac1e6f1e1e6340c7593976cdc60aa7d1a47 \ + --hash=sha256:f7ed2346eb9dc4344f9cb0d7963ce5b74fe16fdd031a2809bb6c2b6eba7ebcd5 # via -r requirements/light-threads.in -greenlet==1.1.3.post0 \ - --hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \ - --hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \ - --hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \ - --hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \ - --hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \ - --hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \ - --hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \ - --hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \ - --hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \ - --hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \ - --hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \ - --hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \ - --hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \ - --hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \ - --hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \ - --hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \ - --hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \ - --hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \ - --hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \ - --hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \ - --hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \ - --hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \ - --hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \ - --hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \ - --hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \ - --hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \ - --hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \ - --hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \ - --hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \ - --hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \ - --hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \ - --hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \ - --hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \ - --hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \ - --hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \ - --hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \ - --hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \ - --hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \ - --hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \ - --hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \ - --hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \ - --hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \ - --hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \ - --hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \ - --hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \ - --hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \ - --hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \ - --hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \ - --hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \ - --hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \ - --hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \ - --hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \ - --hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \ - --hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \ - --hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \ - --hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \ - --hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \ - --hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \ - --hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \ - --hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \ - --hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \ - --hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \ - --hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \ - --hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \ - --hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \ - --hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04 +greenlet==2.0.0.post0 \ + --hash=sha256:00ebdaf0fa51c284fd2172837d751731a15971e0c20d1a9163cfbdf620ce8b49 \ + --hash=sha256:029ca674b3a7e8427db8f5c65d5ed4e24a7417af2a415a5958598aefd71980c4 \ + --hash=sha256:02bdb1e373b275bd705c43b249426e776c4f8a8ff2afaf8ec5ea0dde487d8a14 \ + --hash=sha256:08dc04f49ed1ea5e6772bb5e8cf2a77d1b1744566f4eca471a55b35af1278b31 \ + --hash=sha256:08f44e938d142271b954405afb6570e0be48a9f556b6bf4d42d2e3ae6a251fad \ + --hash=sha256:0a5c03e2a68ec2ff1cba74ceaed899ec8cd353285f4f985c30c8cfbef9d3a3be \ + --hash=sha256:0fee3240093b745efc857392f09379514ad84db4ca324514594bbdf6380016c8 \ + --hash=sha256:118e708dd7bc88beaeeaa5a8601a7743b8835b7bbaf7c8f23ffa78f8bc8faf28 \ + --hash=sha256:13d492a807a5c7334b5931e9b6d9b181991ccc6a40555a7b177f189feff59b4b \ + --hash=sha256:1cac9e9895aeff26434325404558783ee54f4ff3aec8daa56b8706796f7b01a0 \ + --hash=sha256:2146d15429b4eeb412428737594acb5660a5bc0fdd1488d8a2a74a5ee32391fa \ + --hash=sha256:21ee1ae26d072b195edea764218623f6c15eba4ae06816908f33c82e0af018d3 \ + --hash=sha256:22eca421e3f2f3c18f4f54c0ff525aa9d397c6f116fce9ebd37b420174dbc027 \ + --hash=sha256:2bab49783858cf724fff6868395cbeb81d1188cba23616b53e79de0beda29f42 \ + --hash=sha256:2fbdec204ca40b3d0c0992a19c1ba627441c17983ac4ffc45baec7f5f53e20ca \ + --hash=sha256:30ce47525f9a1515566429ac7de6b1ae76d32c3ccede256e3517a1a6419cf659 \ + --hash=sha256:335dcf676d5e4122e4006c16ae11eda2467af5461b949c265ce120b6b959ffe2 \ + --hash=sha256:3407b843b05da71fef0f1dd666059c08ad0e0f4afc3b9c93c998a2e53fac95e5 \ + --hash=sha256:35827f98fd0d768862b8f15777e6dbb03fe6ac6e7bd1bee3f3ded4536f350347 \ + --hash=sha256:3a22e5988f9d66b3e9ae9583bf9d8ef792b09f23afeb78707e6a4f47ab57cc5e \ + --hash=sha256:3c3327da2bdab61078e42e695307465c425671a5a9251e6c29ee130d51943f28 \ + --hash=sha256:3ca723dfc2789c1fb991809822811896b198ecf0909dbccea4a07170d18c3e1b \ + --hash=sha256:46156ae88ee71c37b6c4f7af63fff5d3ab8f45ef72e1a660bcf6386c1647f106 \ + --hash=sha256:4bbe2d074292e3646704371eb640ee52c386d633ed72ff223dadcd3fe8ecd8f9 \ + --hash=sha256:4c4310f0e42154995d92810f27b44ab7116a4a696feb0ff141ae2de59196efd7 \ + --hash=sha256:4cfa629de5b2dea27c81b334c4536463e9a49ac0877e2008a276d58d4c72868a \ + --hash=sha256:4e144ab0de56b4d2a2cf0d2fb9d568b59fce49aab3e129badf17c12b0252047d \ + --hash=sha256:4ea67f303cec384b148774667c7e3cf02311e7026fc02bdcdcd206dfe4ea4fc9 \ + --hash=sha256:538c9e8f65a32413ace426f8117ef019021adf8175f7c491fed65f5fe2083e0c \ + --hash=sha256:56565ac9ab4ff3dd473bfe959e0bf2a5062aabb89b7c94cabb417beb162c9fff \ + --hash=sha256:5e22485256bb1c60bbcc6f8509b1a11042358a2462d5ecdb9a82dc472d2fdd60 \ + --hash=sha256:602a69c24f1a9755dd1760b3b31bdfc495c4613260c876a01b7e6d5eb9bcae1b \ + --hash=sha256:6393ec3cecda53b20241e88bc33d87cbd8126cc10870fc69fa16ca2e20a5ac1b \ + --hash=sha256:6442bbfb047dc1e47658954b72e1589f2bc4e12e67d51bbad0059a626180daa1 \ + --hash=sha256:666d2a0b269a68cd4fe0976544ab97970c5334d35d0e47ae9be1723f734d8204 \ + --hash=sha256:697cfbfc19815c40213badcfe5f076418e0f9100cd25a66f513f32c1026b8bf4 \ + --hash=sha256:6a1a6745c5dce202aa3f29a1736c53cf2179e9c3b280dc62cea9cb8c69977c83 \ + --hash=sha256:6fc73fc8dd81d9efa842a55033b6b4cb233b134a0270e127c6874d053ef2049b \ + --hash=sha256:7e9e0d4c5c618b0442396715ffe6c2f84a60d593dad7e0184388aed36d568a65 \ + --hash=sha256:81fdcf7c0c2df46a99ca421a552c4370117851c5e4dbd6cb53d569b896d62322 \ + --hash=sha256:8b26932be686f3582df039d79fe96f7ca13d63b39468162f816f9ff29584b9a4 \ + --hash=sha256:8b7e5191b974fb66fcbac1818ba494d3512da9cf6eaef7acd952f9862eaaa20c \ + --hash=sha256:8c80e9c41a83d8c90399af8c7dcdeae0c03c48b40b9d0ab84457533d5d7882bf \ + --hash=sha256:9f2f110b9cc325f6543e0e3f4ab8008c272a59052f9464047c29d4be4511ce05 \ + --hash=sha256:a339e510a079dc8372e39ce1c7629414db51966235c9670c58d529def79243a2 \ + --hash=sha256:ad9abc3e4d2370cecb524421cc5c8a664006aa11d5c1cb3c9250e3bf65ab546e \ + --hash=sha256:b043782c8f6cccc8fae3a16db397eca1d36a41b0706cbf6f514aea1e1a260bab \ + --hash=sha256:b31de27313abbb567c528ed123380fcf18a5dfd03134570dfd12227e21ac1184 \ + --hash=sha256:b75e5644cc353328cd57ec8dafaaf5f81b2c3ecf7c4b278b907e99ad53ba7839 \ + --hash=sha256:b8cfc8fc944bd7b704691bc28225a2635e377e92dc413459845868d3f7724982 \ + --hash=sha256:c2055c52260808d87622293b57df1c68aeb12ddd8a0cfc0223fb57a5f629e202 \ + --hash=sha256:c416106b3b8e905b6ab0e84ec90047a6401021aa023f9aa93978e57cd8f8189f \ + --hash=sha256:d0e210e17a6181a3fd3f8dce957043a4e74177ffa9f295514984b2b633940dce \ + --hash=sha256:d9453135e48cd631e3e9f06d9da9100d17c9f662e4a6d8b552c29be6c834a6b9 \ + --hash=sha256:dd0198006278291d9469309d655093df1f5e5107c0261e242b5f390baee32199 \ + --hash=sha256:e1781bda1e787d3ad33788cc3be47f6e47a9581676d02670c15ee36c9460adfe \ + --hash=sha256:e56a5a9f303e3ac011ba445a6d84f05d08666bf8db094afafcec5228622c30f5 \ + --hash=sha256:e93ae35f0fd3caf75e58c76a1cab71e6ece169aaa1b281782ef9efde0a6b83f2 \ + --hash=sha256:eb36b6570646227a63eda03916f1cc6f3744ee96d28f7a0a5629c59267a8055f \ + --hash=sha256:f8c425a130e04d5404edaf6f5906e5ab12f3aa1168a1828aba6dfadac5910469 # via # -r requirements/light-threads.in # eventlet @@ -201,48 +205,51 @@ zope-event==4.5.0 \ --hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \ --hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330 # via gevent -zope-interface==5.5.0 \ - --hash=sha256:006f8dd81fae28027fc28ada214855166712bf4f0bfbc5a8788f9b70982b9437 \ - --hash=sha256:03f5ae315db0d0de668125d983e2a819a554f3fdb2d53b7e934e3eb3c3c7375d \ - --hash=sha256:0eb2b3e84f48dd9cfc8621c80fba905d7e228615c67f76c7df7c716065669bb6 \ - --hash=sha256:1e3495bb0cdcea212154e558082c256f11b18031f05193ae2fb85d048848db14 \ - --hash=sha256:26c1456520fdcafecc5765bec4783eeafd2e893eabc636908f50ee31fe5c738c \ - --hash=sha256:2cb3003941f5f4fa577479ac6d5db2b940acb600096dd9ea9bf07007f5cab46f \ - --hash=sha256:37ec9ade9902f412cc7e7a32d71f79dec3035bad9bd0170226252eed88763c48 \ - --hash=sha256:3eedf3d04179774d750e8bb4463e6da350956a50ed44d7b86098e452d7ec385e \ - --hash=sha256:3f68404edb1a4fb6aa8a94675521ca26c83ebbdbb90e894f749ae0dc4ca98418 \ - --hash=sha256:423c074e404f13e6fa07f4454f47fdbb38d358be22945bc812b94289d9142374 \ - --hash=sha256:43490ad65d4c64e45a30e51a2beb7a6b63e1ff395302ad22392224eb618476d6 \ - --hash=sha256:47ff078734a1030c48103422a99e71a7662d20258c00306546441adf689416f7 \ - --hash=sha256:58a66c2020a347973168a4a9d64317bac52f9fdfd3e6b80b252be30da881a64e \ - --hash=sha256:58a975f89e4584d0223ab813c5ba4787064c68feef4b30d600f5e01de90ae9ce \ - --hash=sha256:5c6023ae7defd052cf76986ce77922177b0c2f3913bea31b5b28fbdf6cb7099e \ - --hash=sha256:6566b3d2657e7609cd8751bcb1eab1202b1692a7af223035a5887d64bb3a2f3b \ - --hash=sha256:687cab7f9ae18d2c146f315d0ca81e5ffe89a139b88277afa70d52f632515854 \ - --hash=sha256:700ebf9662cf8df70e2f0cb4988e078c53f65ee3eefd5c9d80cf988c4175c8e3 \ - --hash=sha256:740f3c1b44380658777669bcc42f650f5348e53797f2cee0d93dc9b0f9d7cc69 \ - --hash=sha256:7bdcec93f152e0e1942102537eed7b166d6661ae57835b20a52a2a3d6a3e1bf3 \ - --hash=sha256:7d9ec1e6694af39b687045712a8ad14ddcb568670d5eb1b66b48b98b9312afba \ - --hash=sha256:85dd6dd9aaae7a176948d8bb62e20e2968588fd787c29c5d0d964ab475168d3d \ - --hash=sha256:8b9f153208d74ccfa25449a0c6cb756ab792ce0dc99d9d771d935f039b38740c \ - --hash=sha256:8c791f4c203ccdbcda588ea4c8a6e4353e10435ea48ddd3d8734a26fe9714cba \ - --hash=sha256:970661ece2029915b8f7f70892e88404340fbdefd64728380cad41c8dce14ff4 \ - --hash=sha256:9cdc4e898d3b1547d018829fd4a9f403e52e51bba24be0fbfa37f3174e1ef797 \ - --hash=sha256:9dc4493aa3d87591e3d2bf1453e25b98038c839ca8e499df3d7106631b66fe83 \ - --hash=sha256:a69c28d85bb7cf557751a5214cb3f657b2b035c8c96d71080c1253b75b79b69b \ - --hash=sha256:aeac590cce44e68ee8ad0b8ecf4d7bf15801f102d564ca1b0eb1f12f584ee656 \ - --hash=sha256:be11fce0e6af6c0e8d93c10ef17b25aa7c4acb7ec644bff2596c0d639c49e20f \ - --hash=sha256:cbbf83914b9a883ab324f728de869f4e406e0cbcd92df7e0a88decf6f9ab7d5a \ - --hash=sha256:cfa614d049667bed1c737435c609c0956c5dc0dbafdc1145ee7935e4658582cb \ - --hash=sha256:d18fb0f6c8169d26044128a2e7d3c39377a8a151c564e87b875d379dbafd3930 \ - --hash=sha256:d80f6236b57a95eb19d5e47eb68d0296119e1eff6deaa2971ab8abe3af918420 \ - --hash=sha256:da7912ae76e1df6a1fb841b619110b1be4c86dfb36699d7fd2f177105cdea885 \ - --hash=sha256:df6593e150d13cfcce69b0aec5df7bc248cb91e4258a7374c129bb6d56b4e5ca \ - --hash=sha256:f70726b60009433111fe9928f5d89cbb18962411d33c45fb19eb81b9bbd26fcd +zope-interface==5.5.1 \ + --hash=sha256:026e7da51147910435950a46c55159d68af319f6e909f14873d35d411f4961db \ + --hash=sha256:061a41a3f96f076686d7f1cb87f3deec6f0c9f0325dcc054ac7b504ae9bb0d82 \ + --hash=sha256:0eda7f61da6606a28b5efa5d8ad79b4b5bb242488e53a58993b2ec46c924ffee \ + --hash=sha256:13a7c6e3df8aa453583412de5725bf761217d06f66ff4ed776d44fbcd13ec4e4 \ + --hash=sha256:185f0faf6c3d8f2203e8755f7ca16b8964d97da0abde89c367177a04e36f2568 \ + --hash=sha256:2204a9d545fdbe0d9b0bf4d5e2fc67e7977de59666f7131c1433fde292fc3b41 \ + --hash=sha256:27c53aa2f46d42940ccdcb015fd525a42bf73f94acd886296794a41f229d5946 \ + --hash=sha256:3c293c5c0e1cabe59c33e0d02fcee5c3eb365f79a20b8199a26ca784e406bd0d \ + --hash=sha256:3e42b1c3f4fd863323a8275c52c78681281a8f2e1790f0e869d911c1c7b25c46 \ + --hash=sha256:3e5540b7d703774fd171b7a7dc2a3cb70e98fc273b8b260b1bf2f7d3928f125b \ + --hash=sha256:4477930451521ac7da97cc31d49f7b83086d5ae76e52baf16aac659053119f6d \ + --hash=sha256:475b6e371cdbeb024f2302e826222bdc202186531f6dc095e8986c034e4b7961 \ + --hash=sha256:489c4c46fcbd9364f60ff0dcb93ec9026eca64b2f43dc3b05d0724092f205e27 \ + --hash=sha256:509a8d39b64a5e8d473f3f3db981f3ca603d27d2bc023c482605c1b52ec15662 \ + --hash=sha256:58331d2766e8e409360154d3178449d116220348d46386430097e63d02a1b6d2 \ + --hash=sha256:59a96d499ff6faa9b85b1309f50bf3744eb786e24833f7b500cbb7052dc4ae29 \ + --hash=sha256:6cb8f9a1db47017929634264b3fc7ea4c1a42a3e28d67a14f14aa7b71deaa0d2 \ + --hash=sha256:6d678475fdeb11394dc9aaa5c564213a1567cc663082e0ee85d52f78d1fbaab2 \ + --hash=sha256:72a93445937cc71f0b8372b0c9e7c185328e0db5e94d06383a1cb56705df1df4 \ + --hash=sha256:76cf472c79d15dce5f438a4905a1309be57d2d01bc1de2de30bda61972a79ab4 \ + --hash=sha256:7b4547a2f624a537e90fb99cec4d8b3b6be4af3f449c3477155aae65396724ad \ + --hash=sha256:7f2e4ebe0a000c5727ee04227cf0ff5ae612fe599f88d494216e695b1dac744d \ + --hash=sha256:8343536ea4ee15d6525e3e726bb49ffc3f2034f828a49237a36be96842c06e7c \ + --hash=sha256:8de7bde839d72d96e0c92e8d1fdb4862e89b8fc52514d14b101ca317d9bcf87c \ + --hash=sha256:90f611d4cdf82fb28837fe15c3940255755572a4edf4c72e2306dbce7dcb3092 \ + --hash=sha256:9ad58724fabb429d1ebb6f334361f0a3b35f96be0e74bfca6f7de8530688b2df \ + --hash=sha256:a1393229c9c126dd1b4356338421e8882347347ab6fe3230cb7044edc813e424 \ + --hash=sha256:a20fc9cccbda2a28e8db8cabf2f47fead7e9e49d317547af6bf86a7269e4b9a1 \ + --hash=sha256:a69f6d8b639f2317ba54278b64fef51d8250ad2c87acac1408b9cc461e4d6bb6 \ + --hash=sha256:a6f51ffbdcf865f140f55c484001415505f5e68eb0a9eab1d37d0743b503b423 \ + --hash=sha256:c9552ee9e123b7997c7630fb95c466ee816d19e721c67e4da35351c5f4032726 \ + --hash=sha256:cd423d49abcf0ebf02c29c3daffe246ff756addb891f8aab717b3a4e2e1fd675 \ + --hash=sha256:d0587d238b7867544134f4dcca19328371b8fd03fc2c56d15786f410792d0a68 \ + --hash=sha256:d1f2d91c9c6cd54d750fa34f18bd73c71b372d0e6d06843bc7a5f21f5fd66fe0 \ + --hash=sha256:d2f2ec42fbc21e1af5f129ec295e29fee6f93563e6388656975caebc5f851561 \ + --hash=sha256:d743b03a72fefed807a4512c079fb1aa5e7777036cc7a4b6ff79ae4650a14f73 \ + --hash=sha256:dd4b9251e95020c3d5d104b528dbf53629d09c146ce9c8dfaaf8f619ae1cce35 \ + --hash=sha256:e4988d94962f517f6da2d52337170b84856905b31b7dc504ed9c7b7e4bab2fc3 \ + --hash=sha256:e6a923d2dec50f2b4d41ce198af3516517f2e458220942cf393839d2f9e22000 \ + --hash=sha256:e8c8764226daad39004b7873c3880eb4860c594ff549ea47c045cdf313e1bad5 # via gevent # The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.0 \ - --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ - --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via gevent diff --git a/requirements/lint.pip b/requirements/lint.pip index 37e271b12..7b1cd0330 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -22,9 +22,9 @@ attrs==22.1.0 \ # -r requirements/pytest.pip # hypothesis # pytest -babel==2.10.3 \ - --hash=sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51 \ - --hash=sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb +babel==2.11.0 \ + --hash=sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe \ + --hash=sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6 # via sphinx backports-functools-lru-cache==1.6.4 \ --hash=sha256:d5ed2169378b67d3c545e5600d363a923b09c456dab1593914935a68ad478271 \ @@ -94,9 +94,9 @@ docutils==0.17.1 \ # readme-renderer # sphinx # sphinx-rtd-theme -exceptiongroup==1.0.0 \ - --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ - --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad +exceptiongroup==1.0.1 \ + --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ + --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 # via # -r requirements/pytest.pip # hypothesis @@ -123,77 +123,71 @@ future==0.18.2 \ # via # -r requirements/pytest.pip # pycontracts -greenlet==1.1.3.post0 \ - --hash=sha256:0120a879aa2b1ac5118bce959ea2492ba18783f65ea15821680a256dfad04754 \ - --hash=sha256:025b8de2273d2809f027d347aa2541651d2e15d593bbce0d5f502ca438c54136 \ - --hash=sha256:05ae7383f968bba4211b1fbfc90158f8e3da86804878442b4fb6c16ccbcaa519 \ - --hash=sha256:0914f02fcaa8f84f13b2df4a81645d9e82de21ed95633765dd5cc4d3af9d7403 \ - --hash=sha256:0971d37ae0eaf42344e8610d340aa0ad3d06cd2eee381891a10fe771879791f9 \ - --hash=sha256:0a954002064ee919b444b19c1185e8cce307a1f20600f47d6f4b6d336972c809 \ - --hash=sha256:0aa1845944e62f358d63fcc911ad3b415f585612946b8edc824825929b40e59e \ - --hash=sha256:104f29dd822be678ef6b16bf0035dcd43206a8a48668a6cae4d2fe9c7a7abdeb \ - --hash=sha256:11fc7692d95cc7a6a8447bb160d98671ab291e0a8ea90572d582d57361360f05 \ - --hash=sha256:17a69967561269b691747e7f436d75a4def47e5efcbc3c573180fc828e176d80 \ - --hash=sha256:2794eef1b04b5ba8948c72cc606aab62ac4b0c538b14806d9c0d88afd0576d6b \ - --hash=sha256:2c6e942ca9835c0b97814d14f78da453241837419e0d26f7403058e8db3e38f8 \ - --hash=sha256:2ccdc818cc106cc238ff7eba0d71b9c77be868fdca31d6c3b1347a54c9b187b2 \ - --hash=sha256:325f272eb997916b4a3fc1fea7313a8adb760934c2140ce13a2117e1b0a8095d \ - --hash=sha256:39464518a2abe9c505a727af7c0b4efff2cf242aa168be5f0daa47649f4d7ca8 \ - --hash=sha256:3a24f3213579dc8459e485e333330a921f579543a5214dbc935bc0763474ece3 \ - --hash=sha256:3aeac044c324c1a4027dca0cde550bd83a0c0fbff7ef2c98df9e718a5086c194 \ - --hash=sha256:3c22998bfef3fcc1b15694818fc9b1b87c6cc8398198b96b6d355a7bcb8c934e \ - --hash=sha256:467b73ce5dcd89e381292fb4314aede9b12906c18fab903f995b86034d96d5c8 \ - --hash=sha256:4a8b58232f5b72973350c2b917ea3df0bebd07c3c82a0a0e34775fc2c1f857e9 \ - --hash=sha256:4f74aa0092602da2069df0bc6553919a15169d77bcdab52a21f8c5242898f519 \ - --hash=sha256:5662492df0588a51d5690f6578f3bbbd803e7f8d99a99f3bf6128a401be9c269 \ - --hash=sha256:5c2d21c2b768d8c86ad935e404cc78c30d53dea009609c3ef3a9d49970c864b5 \ - --hash=sha256:5edf75e7fcfa9725064ae0d8407c849456553a181ebefedb7606bac19aa1478b \ - --hash=sha256:60839ab4ea7de6139a3be35b77e22e0398c270020050458b3d25db4c7c394df5 \ - --hash=sha256:62723e7eb85fa52e536e516ee2ac91433c7bb60d51099293671815ff49ed1c21 \ - --hash=sha256:64e10f303ea354500c927da5b59c3802196a07468332d292aef9ddaca08d03dd \ - --hash=sha256:66aa4e9a726b70bcbfcc446b7ba89c8cec40f405e51422c39f42dfa206a96a05 \ - --hash=sha256:695d0d8b5ae42c800f1763c9fce9d7b94ae3b878919379150ee5ba458a460d57 \ - --hash=sha256:70048d7b2c07c5eadf8393e6398595591df5f59a2f26abc2f81abca09610492f \ - --hash=sha256:7afa706510ab079fd6d039cc6e369d4535a48e202d042c32e2097f030a16450f \ - --hash=sha256:7cf37343e43404699d58808e51f347f57efd3010cc7cee134cdb9141bd1ad9ea \ - --hash=sha256:8149a6865b14c33be7ae760bcdb73548bb01e8e47ae15e013bf7ef9290ca309a \ - --hash=sha256:814f26b864ed2230d3a7efe0336f5766ad012f94aad6ba43a7c54ca88dd77cba \ - --hash=sha256:82a38d7d2077128a017094aff334e67e26194f46bd709f9dcdacbf3835d47ef5 \ - --hash=sha256:83a7a6560df073ec9de2b7cb685b199dfd12519bc0020c62db9d1bb522f989fa \ - --hash=sha256:8415239c68b2ec9de10a5adf1130ee9cb0ebd3e19573c55ba160ff0ca809e012 \ - --hash=sha256:88720794390002b0c8fa29e9602b395093a9a766b229a847e8d88349e418b28a \ - --hash=sha256:890f633dc8cb307761ec566bc0b4e350a93ddd77dc172839be122be12bae3e10 \ - --hash=sha256:8926a78192b8b73c936f3e87929931455a6a6c6c385448a07b9f7d1072c19ff3 \ - --hash=sha256:8c0581077cf2734569f3e500fab09c0ff6a2ab99b1afcacbad09b3c2843ae743 \ - --hash=sha256:8fda1139d87ce5f7bd80e80e54f9f2c6fe2f47983f1a6f128c47bf310197deb6 \ - --hash=sha256:91a84faf718e6f8b888ca63d0b2d6d185c8e2a198d2a7322d75c303e7097c8b7 \ - --hash=sha256:924df1e7e5db27d19b1359dc7d052a917529c95ba5b8b62f4af611176da7c8ad \ - --hash=sha256:949c9061b8c6d3e6e439466a9be1e787208dec6246f4ec5fffe9677b4c19fcc3 \ - --hash=sha256:9649891ab4153f217f319914455ccf0b86986b55fc0573ce803eb998ad7d6854 \ - --hash=sha256:96656c5f7c95fc02c36d4f6ef32f4e94bb0b6b36e6a002c21c39785a4eec5f5d \ - --hash=sha256:a812df7282a8fc717eafd487fccc5ba40ea83bb5b13eb3c90c446d88dbdfd2be \ - --hash=sha256:a8d24eb5cb67996fb84633fdc96dbc04f2d8b12bfcb20ab3222d6be271616b67 \ - --hash=sha256:bef49c07fcb411c942da6ee7d7ea37430f830c482bf6e4b72d92fd506dd3a427 \ - --hash=sha256:bffba15cff4802ff493d6edcf20d7f94ab1c2aee7cfc1e1c7627c05f1102eee8 \ - --hash=sha256:c0643250dd0756f4960633f5359884f609a234d4066686754e834073d84e9b51 \ - --hash=sha256:c6f90234e4438062d6d09f7d667f79edcc7c5e354ba3a145ff98176f974b8132 \ - --hash=sha256:c8c9301e3274276d3d20ab6335aa7c5d9e5da2009cccb01127bddb5c951f8870 \ - --hash=sha256:c8ece5d1a99a2adcb38f69af2f07d96fb615415d32820108cd340361f590d128 \ - --hash=sha256:cb863057bed786f6622982fb8b2c122c68e6e9eddccaa9fa98fd937e45ee6c4f \ - --hash=sha256:ccbe7129a282ec5797df0451ca1802f11578be018a32979131065565da89b392 \ - --hash=sha256:d25cdedd72aa2271b984af54294e9527306966ec18963fd032cc851a725ddc1b \ - --hash=sha256:d75afcbb214d429dacdf75e03a1d6d6c5bd1fa9c35e360df8ea5b6270fb2211c \ - --hash=sha256:d7815e1519a8361c5ea2a7a5864945906f8e386fa1bc26797b4d443ab11a4589 \ - --hash=sha256:eb6ac495dccb1520667cfea50d89e26f9ffb49fa28496dea2b95720d8b45eb54 \ - --hash=sha256:ec615d2912b9ad807afd3be80bf32711c0ff9c2b00aa004a45fd5d5dde7853d9 \ - --hash=sha256:f5e09dc5c6e1796969fd4b775ea1417d70e49a5df29aaa8e5d10675d9e11872c \ - --hash=sha256:f6661b58412879a2aa099abb26d3c93e91dedaba55a6394d1fb1512a77e85de9 \ - --hash=sha256:f7d20c3267385236b4ce54575cc8e9f43e7673fc761b069c820097092e318e3b \ - --hash=sha256:fe7c51f8a2ab616cb34bc33d810c887e89117771028e1e3d3b77ca25ddeace04 +greenlet==2.0.0.post0 \ + --hash=sha256:00ebdaf0fa51c284fd2172837d751731a15971e0c20d1a9163cfbdf620ce8b49 \ + --hash=sha256:029ca674b3a7e8427db8f5c65d5ed4e24a7417af2a415a5958598aefd71980c4 \ + --hash=sha256:02bdb1e373b275bd705c43b249426e776c4f8a8ff2afaf8ec5ea0dde487d8a14 \ + --hash=sha256:08dc04f49ed1ea5e6772bb5e8cf2a77d1b1744566f4eca471a55b35af1278b31 \ + --hash=sha256:08f44e938d142271b954405afb6570e0be48a9f556b6bf4d42d2e3ae6a251fad \ + --hash=sha256:0a5c03e2a68ec2ff1cba74ceaed899ec8cd353285f4f985c30c8cfbef9d3a3be \ + --hash=sha256:0fee3240093b745efc857392f09379514ad84db4ca324514594bbdf6380016c8 \ + --hash=sha256:118e708dd7bc88beaeeaa5a8601a7743b8835b7bbaf7c8f23ffa78f8bc8faf28 \ + --hash=sha256:13d492a807a5c7334b5931e9b6d9b181991ccc6a40555a7b177f189feff59b4b \ + --hash=sha256:1cac9e9895aeff26434325404558783ee54f4ff3aec8daa56b8706796f7b01a0 \ + --hash=sha256:2146d15429b4eeb412428737594acb5660a5bc0fdd1488d8a2a74a5ee32391fa \ + --hash=sha256:21ee1ae26d072b195edea764218623f6c15eba4ae06816908f33c82e0af018d3 \ + --hash=sha256:22eca421e3f2f3c18f4f54c0ff525aa9d397c6f116fce9ebd37b420174dbc027 \ + --hash=sha256:2bab49783858cf724fff6868395cbeb81d1188cba23616b53e79de0beda29f42 \ + --hash=sha256:2fbdec204ca40b3d0c0992a19c1ba627441c17983ac4ffc45baec7f5f53e20ca \ + --hash=sha256:30ce47525f9a1515566429ac7de6b1ae76d32c3ccede256e3517a1a6419cf659 \ + --hash=sha256:335dcf676d5e4122e4006c16ae11eda2467af5461b949c265ce120b6b959ffe2 \ + --hash=sha256:3407b843b05da71fef0f1dd666059c08ad0e0f4afc3b9c93c998a2e53fac95e5 \ + --hash=sha256:35827f98fd0d768862b8f15777e6dbb03fe6ac6e7bd1bee3f3ded4536f350347 \ + --hash=sha256:3a22e5988f9d66b3e9ae9583bf9d8ef792b09f23afeb78707e6a4f47ab57cc5e \ + --hash=sha256:3c3327da2bdab61078e42e695307465c425671a5a9251e6c29ee130d51943f28 \ + --hash=sha256:3ca723dfc2789c1fb991809822811896b198ecf0909dbccea4a07170d18c3e1b \ + --hash=sha256:46156ae88ee71c37b6c4f7af63fff5d3ab8f45ef72e1a660bcf6386c1647f106 \ + --hash=sha256:4bbe2d074292e3646704371eb640ee52c386d633ed72ff223dadcd3fe8ecd8f9 \ + --hash=sha256:4c4310f0e42154995d92810f27b44ab7116a4a696feb0ff141ae2de59196efd7 \ + --hash=sha256:4cfa629de5b2dea27c81b334c4536463e9a49ac0877e2008a276d58d4c72868a \ + --hash=sha256:4e144ab0de56b4d2a2cf0d2fb9d568b59fce49aab3e129badf17c12b0252047d \ + --hash=sha256:4ea67f303cec384b148774667c7e3cf02311e7026fc02bdcdcd206dfe4ea4fc9 \ + --hash=sha256:538c9e8f65a32413ace426f8117ef019021adf8175f7c491fed65f5fe2083e0c \ + --hash=sha256:56565ac9ab4ff3dd473bfe959e0bf2a5062aabb89b7c94cabb417beb162c9fff \ + --hash=sha256:5e22485256bb1c60bbcc6f8509b1a11042358a2462d5ecdb9a82dc472d2fdd60 \ + --hash=sha256:602a69c24f1a9755dd1760b3b31bdfc495c4613260c876a01b7e6d5eb9bcae1b \ + --hash=sha256:6393ec3cecda53b20241e88bc33d87cbd8126cc10870fc69fa16ca2e20a5ac1b \ + --hash=sha256:6442bbfb047dc1e47658954b72e1589f2bc4e12e67d51bbad0059a626180daa1 \ + --hash=sha256:666d2a0b269a68cd4fe0976544ab97970c5334d35d0e47ae9be1723f734d8204 \ + --hash=sha256:697cfbfc19815c40213badcfe5f076418e0f9100cd25a66f513f32c1026b8bf4 \ + --hash=sha256:6a1a6745c5dce202aa3f29a1736c53cf2179e9c3b280dc62cea9cb8c69977c83 \ + --hash=sha256:6fc73fc8dd81d9efa842a55033b6b4cb233b134a0270e127c6874d053ef2049b \ + --hash=sha256:7e9e0d4c5c618b0442396715ffe6c2f84a60d593dad7e0184388aed36d568a65 \ + --hash=sha256:81fdcf7c0c2df46a99ca421a552c4370117851c5e4dbd6cb53d569b896d62322 \ + --hash=sha256:8b26932be686f3582df039d79fe96f7ca13d63b39468162f816f9ff29584b9a4 \ + --hash=sha256:8b7e5191b974fb66fcbac1818ba494d3512da9cf6eaef7acd952f9862eaaa20c \ + --hash=sha256:8c80e9c41a83d8c90399af8c7dcdeae0c03c48b40b9d0ab84457533d5d7882bf \ + --hash=sha256:9f2f110b9cc325f6543e0e3f4ab8008c272a59052f9464047c29d4be4511ce05 \ + --hash=sha256:a339e510a079dc8372e39ce1c7629414db51966235c9670c58d529def79243a2 \ + --hash=sha256:ad9abc3e4d2370cecb524421cc5c8a664006aa11d5c1cb3c9250e3bf65ab546e \ + --hash=sha256:b043782c8f6cccc8fae3a16db397eca1d36a41b0706cbf6f514aea1e1a260bab \ + --hash=sha256:b31de27313abbb567c528ed123380fcf18a5dfd03134570dfd12227e21ac1184 \ + --hash=sha256:b75e5644cc353328cd57ec8dafaaf5f81b2c3ecf7c4b278b907e99ad53ba7839 \ + --hash=sha256:b8cfc8fc944bd7b704691bc28225a2635e377e92dc413459845868d3f7724982 \ + --hash=sha256:c2055c52260808d87622293b57df1c68aeb12ddd8a0cfc0223fb57a5f629e202 \ + --hash=sha256:c416106b3b8e905b6ab0e84ec90047a6401021aa023f9aa93978e57cd8f8189f \ + --hash=sha256:d0e210e17a6181a3fd3f8dce957043a4e74177ffa9f295514984b2b633940dce \ + --hash=sha256:d9453135e48cd631e3e9f06d9da9100d17c9f662e4a6d8b552c29be6c834a6b9 \ + --hash=sha256:dd0198006278291d9469309d655093df1f5e5107c0261e242b5f390baee32199 \ + --hash=sha256:e1781bda1e787d3ad33788cc3be47f6e47a9581676d02670c15ee36c9460adfe \ + --hash=sha256:e56a5a9f303e3ac011ba445a6d84f05d08666bf8db094afafcec5228622c30f5 \ + --hash=sha256:e93ae35f0fd3caf75e58c76a1cab71e6ece169aaa1b281782ef9efde0a6b83f2 \ + --hash=sha256:eb36b6570646227a63eda03916f1cc6f3744ee96d28f7a0a5629c59267a8055f \ + --hash=sha256:f8c425a130e04d5404edaf6f5906e5ab12f3aa1168a1828aba6dfadac5910469 # via -r requirements/dev.in -hypothesis==6.56.3 \ - --hash=sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a \ - --hash=sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789 +hypothesis==6.56.4 \ + --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ + --hash=sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -241,9 +235,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via sphinx -keyring==23.9.3 \ - --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ - --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 +keyring==23.10.0 \ + --hash=sha256:373e29a1bda7f42247c0db0fa13026c770fa8ff995a7475769357e48743761df \ + --hash=sha256:6f457494bb207053c97443656e92ebcc4e2957c5c529028d9eaf4daf40a94483 # via twine lazy-object-proxy==1.8.0 \ --hash=sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada \ @@ -367,8 +361,8 @@ pluggy==1.0.0 \ # -r requirements/pytest.pip # pytest # tox -pudb==2022.1.2 \ - --hash=sha256:6b83ab805bddb53710109690a2237e98bf83c0b3a00033c517cdf5f6a8fa470d +pudb==2022.1.3 \ + --hash=sha256:58e83ada9e19ffe92c1fdc78ae5458ef91aeb892a5b8f0e7379e6fa61e0e664a # via -r requirements/dev.in py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ @@ -414,18 +408,18 @@ pytest-xdist==3.0.2 \ --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b # via -r requirements/pytest.pip -pytz==2022.5 \ - --hash=sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22 \ - --hash=sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914 +pytz==2022.6 \ + --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ + --hash=sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2 # via babel qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 # via # -r requirements/pytest.pip # pycontracts -readme-renderer==37.2 \ - --hash=sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106 \ - --hash=sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923 +readme-renderer==37.3 \ + --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ + --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 # via # -r requirements/dev.in # twine @@ -482,9 +476,9 @@ sphinx-autobuild==2021.3.14 \ --hash=sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac \ --hash=sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05 # via -r doc/requirements.in -sphinx-rtd-theme==1.0.0 \ - --hash=sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8 \ - --hash=sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c +sphinx-rtd-theme==1.1.1 \ + --hash=sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7 \ + --hash=sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103 # via -r doc/requirements.in sphinxcontrib-applehelp==1.0.2 \ --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a \ @@ -690,14 +684,11 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -pip==22.0.4 \ - --hash=sha256:b3a9de2c6ef801e9247d1527a4b16f92f2cc141cd1489f3fffaf6a9e96729764 \ - --hash=sha256:c6aca0f2f081363f689f041d90dab2a07a9a07fb840284db2218117a52da800b - # via - # -c doc/../requirements/pins.pip - # -c requirements/pins.pip - # -r requirements/pip.pip -setuptools==65.5.0 \ - --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ - --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 +pip==22.3 \ + --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ + --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 + # via -r requirements/pip.pip +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via check-manifest diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index d0f64a798..7c45dcaa0 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -45,9 +45,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -wheel==0.37.1 \ - --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ - --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 +wheel==0.38.1 \ + --hash=sha256:7a95f9a8dc0924ef318bd55b616112c70903192f524d120acc614f59547a9e1f \ + --hash=sha256:ea041edf63f4ccba53ad6e035427997b3bb10ee88a4cd014ae82aeb9eea77bb9 # via pip-tools zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ @@ -57,13 +57,11 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -pip==22.0.4 \ - --hash=sha256:b3a9de2c6ef801e9247d1527a4b16f92f2cc141cd1489f3fffaf6a9e96729764 \ - --hash=sha256:c6aca0f2f081363f689f041d90dab2a07a9a07fb840284db2218117a52da800b - # via - # -c requirements/pins.pip - # pip-tools -setuptools==65.5.0 \ - --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ - --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 +pip==22.3 \ + --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ + --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 + # via pip-tools +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via pip-tools diff --git a/requirements/pip.pip b/requirements/pip.pip index 1e9e72fdc..8b8f35118 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -34,9 +34,7 @@ zipp==3.10.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -pip==22.0.4 \ - --hash=sha256:b3a9de2c6ef801e9247d1527a4b16f92f2cc141cd1489f3fffaf6a9e96729764 \ - --hash=sha256:c6aca0f2f081363f689f041d90dab2a07a9a07fb840284db2218117a52da800b - # via - # -c requirements/pins.pip - # -r requirements/pip.in +pip==22.3 \ + --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ + --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 + # via -r requirements/pip.in diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 0e4b15bf7..d73044fc3 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -25,9 +25,9 @@ decorator==5.1.1 \ --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 # via pycontracts -exceptiongroup==1.0.0 \ - --hash=sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41 \ - --hash=sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad +exceptiongroup==1.0.1 \ + --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ + --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 # via # hypothesis # pytest @@ -42,9 +42,9 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.56.3 \ - --hash=sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a \ - --hash=sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789 +hypothesis==6.56.4 \ + --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ + --hash=sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d # via -r requirements/pytest.in importlib-metadata==5.0.0 \ --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ From 2f3bae3d211a250afef0ffd5ba88c776cb154840 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 07:22:23 -0400 Subject: [PATCH 045/200] build: try removing a certifi pin --- requirements/pins.pip | 5 ----- 1 file changed, 5 deletions(-) diff --git a/requirements/pins.pip b/requirements/pins.pip index 06b85a316..4ecea4264 100644 --- a/requirements/pins.pip +++ b/requirements/pins.pip @@ -6,8 +6,3 @@ # 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 - -# requests gets different versions in dev.pip and doc/requirements.pip, not -# sure why, and they then ask for different versions of certifi, and we can't -# install, so pin certifi. -certifi==2022.5.18.1 From 27fd4a9b8999dba408d1bc5a5df675d7caaa85b8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 07:24:11 -0400 Subject: [PATCH 046/200] chore: make upgrade --- doc/requirements.pip | 10 ++++------ requirements/dev.pip | 10 ++++------ requirements/kit.pip | 10 ++++------ requirements/lint.pip | 11 ++++------- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 35e63c515..95baac170 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -12,12 +12,10 @@ babel==2.11.0 \ --hash=sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe \ --hash=sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6 # via sphinx -certifi==2022.5.18.1 \ - --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ - --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a - # via - # -c doc/../requirements/pins.pip - # requests +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 + # via requests charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f diff --git a/requirements/dev.pip b/requirements/dev.pip index 086362e36..96c2829ba 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -32,12 +32,10 @@ build==0.9.0 \ --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via check-manifest -certifi==2022.5.18.1 \ - --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ - --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a - # via - # -c requirements/pins.pip - # requests +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 + # via requests charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f diff --git a/requirements/kit.pip b/requirements/kit.pip index c85338f3f..4454edc53 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -20,12 +20,10 @@ build==0.9.0 \ --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via -r requirements/kit.in -certifi==2022.5.18.1 \ - --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ - --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a - # via - # -c requirements/pins.pip - # cibuildwheel +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 + # via cibuildwheel cibuildwheel==2.11.2 \ --hash=sha256:392a39c7022da9ac016362b727c3ae39b304742adfcc36dab7ab0a47b90cc461 \ --hash=sha256:e8dab8e6cf77ff0002f65873bba36b3969b23f522cc014538abcda2cbd24329f diff --git a/requirements/lint.pip b/requirements/lint.pip index 7b1cd0330..0275d8e67 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -40,13 +40,10 @@ build==0.9.0 \ --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via check-manifest -certifi==2022.5.18.1 \ - --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \ - --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a - # via - # -c doc/../requirements/pins.pip - # -c requirements/pins.pip - # requests +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 + # via requests charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f From cf1efa814e905ab1e2bc17795b1dbe6d437b39e5 Mon Sep 17 00:00:00 2001 From: stepeos <82703776+stepeos@users.noreply.github.com> Date: Sat, 5 Nov 2022 17:29:04 +0100 Subject: [PATCH 047/200] feat: report terminal output in Markdown Table format #1418 (#1479) * refactoring normal reporting text output * implemented markdown feature from #1418 * minor changes * fixed text output * fixed precision for text and markdown report format * minor changes * finished testing for markdown format feature * fixed testing outside test_summary.py * removed fixed-length widespace padding for tests * removed whitespaces * refactoring, fixing docs, rewriting cmd args * fixing code quality * implementing requested changes * doc fix * test: add another test of correct report formatting * fixed precision printing test * style: adjust the formatting Co-authored-by: Ned Batchelder --- coverage/cmdline.py | 7 ++ coverage/config.py | 2 + coverage/control.py | 11 ++- coverage/summary.py | 205 +++++++++++++++++++++++++++++++----------- doc/cmd.rst | 3 +- tests/test_cmdline.py | 2 +- tests/test_summary.py | 125 +++++++++++++++++++------- 7 files changed, 263 insertions(+), 92 deletions(-) diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 65ee73f8a..89b0807d8 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -96,6 +96,10 @@ class Opts: '', '--fail-under', action='store', metavar="MIN", type="float", help="Exit with a status of 2 if the total coverage is less than MIN.", ) + output_format = optparse.make_option( + '', '--format', action='store', metavar="FORMAT", dest="output_format", + help="Output format, either text (default) or markdown", + ) help = optparse.make_option( '-h', '--help', action='store_true', help="Get help on this command.", @@ -245,6 +249,7 @@ def __init__(self, *args, **kwargs): debug=None, directory=None, fail_under=None, + output_format=None, help=None, ignore_errors=None, include=None, @@ -482,6 +487,7 @@ def get_prog_name(self): Opts.contexts, Opts.input_datafile, Opts.fail_under, + Opts.output_format, Opts.ignore_errors, Opts.include, Opts.omit, @@ -689,6 +695,7 @@ def command_line(self, argv): skip_covered=options.skip_covered, skip_empty=options.skip_empty, sort=options.sort, + output_format=options.output_format, **report_args ) elif options.action == "annotate": diff --git a/coverage/config.py b/coverage/config.py index c2375d036..1f239ea36 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -199,6 +199,7 @@ def __init__(self): # Defaults for [report] self.exclude_list = DEFAULT_EXCLUDE[:] self.fail_under = 0.0 + self.output_format = None self.ignore_errors = False self.report_include = None self.report_omit = None @@ -374,6 +375,7 @@ def copy(self): # [report] ('exclude_list', 'report:exclude_lines', 'regexlist'), ('fail_under', 'report:fail_under', 'float'), + ('output_format', 'report:output_format', 'boolean'), ('ignore_errors', 'report:ignore_errors', 'boolean'), ('partial_always_list', 'report:partial_branches_always', 'regexlist'), ('partial_list', 'report:partial_branches', 'regexlist'), diff --git a/coverage/control.py b/coverage/control.py index 91e604e00..a8cf1649c 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -908,7 +908,8 @@ def _get_file_reporters(self, morfs=None): def report( self, morfs=None, show_missing=None, ignore_errors=None, file=None, omit=None, include=None, skip_covered=None, - contexts=None, skip_empty=None, precision=None, sort=None + contexts=None, skip_empty=None, precision=None, sort=None, + output_format=None, ): """Write a textual summary report to `file`. @@ -922,6 +923,9 @@ def report( `file` is a file-like object, suitable for writing. + `output_format` provides options, to print eitehr as plain text, or as + markdown code + `include` is a list of file name patterns. Files that match will be included in the report. Files matching `omit` will not be included in the report. @@ -953,13 +957,16 @@ def report( .. versionadded:: 5.2 The `precision` parameter. + .. versionadded:: 6.6 + The `format` parameter. + """ with override_config( self, ignore_errors=ignore_errors, report_omit=omit, report_include=include, show_missing=show_missing, skip_covered=skip_covered, report_contexts=contexts, skip_empty=skip_empty, precision=precision, - sort=sort + sort=sort, output_format=output_format, ): reporter = SummaryReporter(self) return reporter.report(morfs, outfile=file) diff --git a/coverage/summary.py b/coverage/summary.py index 861fbc536..94be1a087 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -6,7 +6,7 @@ import sys from coverage.exceptions import ConfigError, NoDataError -from coverage.misc import human_sorted_items +from coverage.misc import human_key from coverage.report import get_analysis_to_report from coverage.results import Numbers @@ -30,6 +30,119 @@ def writeout(self, line): self.outfile.write(line.rstrip()) self.outfile.write("\n") + def _report_text(self, header, lines_values, total_line, end_lines): + """Internal method that prints report data in text format. + + `header` is a tuple with captions. + `lines_values` is list of tuples of sortable values. + `total_line` is a tuple with values of the total line. + `end_lines` is a tuple of ending lines with information about skipped files. + + """ + # Prepare the formatting strings, header, and column sorting. + max_name = max([len(line[0]) for line in lines_values] + [5]) + 1 + max_n = max(len(total_line[header.index("Cover")]) + 2, len(" Cover")) + 1 + max_n = max([max_n] + [len(line[header.index("Cover")]) + 2 for line in lines_values]) + h_form = dict( + Name="{:{name_len}}", + Stmts="{:>7}", + Miss="{:>7}", + Branch="{:>7}", + BrPart="{:>7}", + Cover="{:>{n}}", + Missing="{:>10}", + ) + header_items = [ + h_form[item].format(item, name_len=max_name, n=max_n) + for item in header + ] + header_str = "".join(header_items) + rule = "-" * len(header_str) + + # Write the header + self.writeout(header_str) + self.writeout(rule) + + h_form.update(dict(Cover="{:>{n}}%"), Missing=" {:9}") + for values in lines_values: + # build string with line values + line_items = [ + h_form[item].format(str(value), + name_len=max_name, n=max_n-1) for item, value in zip(header, values) + ] + text = "".join(line_items) + self.writeout(text) + + # Write a TOTAL line + self.writeout(rule) + line_items = [ + h_form[item].format(str(value), + name_len=max_name, n=max_n-1) for item, value in zip(header, total_line) + ] + text = "".join(line_items) + self.writeout(text) + + for end_line in end_lines: + self.writeout(end_line) + + def _report_markdown(self, header, lines_values, total_line, end_lines): + """Internal method that prints report data in markdown format. + + `header` is a tuple with captions. + `lines_values` is a sorted list of tuples containing coverage information. + `total_line` is a tuple with values of the total line. + `end_lines` is a tuple of ending lines with information about skipped files. + + """ + # Prepare the formatting strings, header, and column sorting. + max_name = max([len(line[0].replace("_", "\\_")) for line in lines_values] + [9]) + max_name += 1 + h_form = dict( + Name="| {:{name_len}}|", + Stmts="{:>9} |", + Miss="{:>9} |", + Branch="{:>9} |", + BrPart="{:>9} |", + Cover="{:>{n}} |", + Missing="{:>10} |", + ) + max_n = max(len(total_line[header.index("Cover")]) + 6, len(" Cover ")) + header_items = [h_form[item].format(item, name_len=max_name, n=max_n) for item in header] + header_str = "".join(header_items) + rule_str = "|" + " ".join(["- |".rjust(len(header_items[0])-1, '-')] + + ["-: |".rjust(len(item)-1, '-') for item in header_items[1:]] + ) + + # Write the header + self.writeout(header_str) + self.writeout(rule_str) + + for values in lines_values: + # build string with line values + h_form.update(dict(Cover="{:>{n}}% |")) + line_items = [ + h_form[item].format(str(value).replace("_", "\\_"), + name_len=max_name, n=max_n-1) for item, value in zip(header, values) + ] + text = "".join(line_items) + self.writeout(text) + + # Write the TOTAL line + h_form.update(dict(Name="|{:>{name_len}} |", Cover="{:>{n}} |")) + total_line_items = [] + for item, value in zip(header, total_line): + if value == '': + insert = value + elif item == "Cover": + insert = f" **{value}%**" + else: + insert = f" **{value}**" + total_line_items += h_form[item].format(insert, name_len=max_name, n=max_n) + total_row_str = "".join(total_line_items) + self.writeout(total_row_str) + for end_line in end_lines: + self.writeout(end_line) + def report(self, morfs, outfile=None): """Writes a report summarizing coverage statistics per module. @@ -44,36 +157,19 @@ def report(self, morfs, outfile=None): self.report_one_file(fr, analysis) # Prepare the formatting strings, header, and column sorting. - max_name = max([len(fr.relative_filename()) for (fr, analysis) in self.fr_analysis] + [5]) - fmt_name = "%%- %ds " % max_name - fmt_skip_covered = "\n%s file%s skipped due to complete coverage." - fmt_skip_empty = "\n%s empty file%s skipped." - - header = (fmt_name % "Name") + " Stmts Miss" - fmt_coverage = fmt_name + "%6d %6d" + header = ("Name", "Stmts", "Miss",) if self.branches: - header += " Branch BrPart" - fmt_coverage += " %6d %6d" - width100 = Numbers(precision=self.config.precision).pc_str_width() - header += "%*s" % (width100+4, "Cover") - fmt_coverage += "%%%ds%%%%" % (width100+3,) + header += ("Branch", "BrPart",) + header += ("Cover",) if self.config.show_missing: - header += " Missing" - fmt_coverage += " %s" - rule = "-" * len(header) + header += ("Missing",) column_order = dict(name=0, stmts=1, miss=2, cover=-1) if self.branches: column_order.update(dict(branch=3, brpart=4)) - # Write the header - self.writeout(header) - self.writeout(rule) - - # `lines` is a list of pairs, (line text, line values). The line text - # is a string that will be printed, and line values is a tuple of - # sortable values. - lines = [] + # `lines_values` is list of tuples of sortable values. + lines_values = [] for (fr, analysis) in self.fr_analysis: nums = analysis.numbers @@ -84,12 +180,10 @@ def report(self, morfs, outfile=None): args += (nums.pc_covered_str,) if self.config.show_missing: args += (analysis.missing_formatted(branches=True),) - text = fmt_coverage % args - # Add numeric percent coverage so that sorting makes sense. args += (nums.pc_covered,) - lines.append((text, args)) + lines_values.append(args) - # Sort the lines and write them out. + # line-sorting. sort_option = (self.config.sort or "name").lower() reverse = False if sort_option[0] == '-': @@ -97,41 +191,44 @@ def report(self, morfs, outfile=None): sort_option = sort_option[1:] elif sort_option[0] == '+': sort_option = sort_option[1:] - + sort_idx = column_order.get(sort_option) + if sort_idx is None: + raise ConfigError(f"Invalid sorting option: {self.config.sort!r}") if sort_option == "name": - lines = human_sorted_items(lines, reverse=reverse) + lines_values.sort(key=lambda tup: (human_key(tup[0]), tup[1]), reverse=reverse) else: - position = column_order.get(sort_option) - if position is None: - raise ConfigError(f"Invalid sorting option: {self.config.sort!r}") - lines.sort(key=lambda l: (l[1][position], l[0]), reverse=reverse) - - for line in lines: - self.writeout(line[0]) - - # Write a TOTAL line if we had at least one file. - if self.total.n_files > 0: - self.writeout(rule) - args = ("TOTAL", self.total.n_statements, self.total.n_missing) - if self.branches: - args += (self.total.n_branches, self.total.n_partial_branches) - args += (self.total.pc_covered_str,) - if self.config.show_missing: - args += ("",) - self.writeout(fmt_coverage % args) + lines_values.sort(key=lambda tup: (tup[sort_idx], tup[0]), reverse=reverse) + + # calculate total if we had at least one file. + total_line = ("TOTAL", self.total.n_statements, self.total.n_missing) + if self.branches: + total_line += (self.total.n_branches, self.total.n_partial_branches) + total_line += (self.total.pc_covered_str,) + if self.config.show_missing: + total_line += ("",) - # Write other final lines. + # create other final lines + end_lines = [] if not self.total.n_files and not self.skipped_count: raise NoDataError("No data to report.") if self.config.skip_covered and self.skipped_count: - self.writeout( - fmt_skip_covered % (self.skipped_count, 's' if self.skipped_count > 1 else '') + file_suffix = 's' if self.skipped_count>1 else '' + fmt_skip_covered = ( + f"\n{self.skipped_count} file{file_suffix} skipped due to complete coverage." ) + end_lines.append(fmt_skip_covered) if self.config.skip_empty and self.empty_count: - self.writeout( - fmt_skip_empty % (self.empty_count, 's' if self.empty_count > 1 else '') - ) + file_suffix = 's' if self.empty_count>1 else '' + fmt_skip_empty = f"\n{self.empty_count} empty file{file_suffix} skipped." + end_lines.append(fmt_skip_empty) + + text_format = self.config.output_format or "text" + if text_format == "markdown": + formatter = self._report_markdown + else: + formatter = self._report_text + formatter(header, lines_values, total_line, end_lines) return self.total.n_statements and self.total.pc_covered diff --git a/doc/cmd.rst b/doc/cmd.rst index f8de0cb30..fd1f7d1a6 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -518,6 +518,7 @@ as a percentage. file. Defaults to '.coverage'. [env: COVERAGE_FILE] --fail-under=MIN Exit with a status of 2 if the total coverage is less than MIN. + --format=FORMAT Output format, either text (default) or markdown -i, --ignore-errors Ignore errors while reading source files. --include=PAT1,PAT2,... Include only files whose paths match one of these @@ -540,7 +541,7 @@ as a percentage. --rcfile=RCFILE Specify configuration file. By default '.coveragerc', 'setup.cfg', 'tox.ini', and 'pyproject.toml' are tried. [env: COVERAGE_RCFILE] -.. [[[end]]] (checksum: 2f8dde61bab2f44fbfe837aeae87dfd2) +.. [[[end]]] (checksum: 8c671de502a388159689082d906f786a) The ``-m`` flag also shows the line numbers of missing statements:: diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index 305fbdbff..1b9a1ef09 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -44,7 +44,7 @@ class BaseCmdLineTest(CoverageTest): _defaults.Coverage().report( ignore_errors=None, include=None, omit=None, morfs=[], show_missing=None, skip_covered=None, contexts=None, skip_empty=None, precision=None, - sort=None, + sort=None, output_format=None, ) _defaults.Coverage().xml_report( ignore_errors=None, include=None, omit=None, morfs=[], outfile=None, diff --git a/tests/test_summary.py b/tests/test_summary.py index ac29f5175..3e77285a7 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -70,7 +70,6 @@ def test_report_just_one(self): # mycode.py 4 0 100% # ------------------------------- # TOTAL 4 0 100% - assert self.line_count(report) == 5 assert "/coverage/" not in report assert "/tests/modules/covmod1.py " not in report @@ -215,7 +214,6 @@ def branch(x): # mybranch.py 5 0 2 1 86% # ----------------------------------------------- # TOTAL 5 0 2 1 86% - assert self.line_count(report) == 5 assert "mybranch.py " in report assert self.last_line_squeezed(report) == "TOTAL 5 0 2 1 86%" @@ -246,7 +244,7 @@ def missing(x, y): # -------------------------------------------- # mymissing.py 14 3 79% 3-4, 10 # -------------------------------------------- - # TOTAL 14 3 79% 3-4, 10 + # TOTAL 14 3 79% assert self.line_count(report) == 5 squeezed = self.squeezed_lines(report) @@ -265,18 +263,6 @@ def branch(x, y): cov = coverage.Coverage(branch=True) self.start_import_stop(cov, "mybranch") assert self.stdout() == 'x\ny\n' - report = self.get_report(cov, show_missing=True) - - # Name Stmts Miss Branch BrPart Cover Missing - # ---------------------------------------------------------- - # mybranch.py 6 0 4 2 80% 2->4, 4->exit - # ---------------------------------------------------------- - # TOTAL 6 0 4 2 80% - - assert self.line_count(report) == 5 - squeezed = self.squeezed_lines(report) - assert squeezed[2] == "mybranch.py 6 0 4 2 80% 2->4, 4->exit" - assert squeezed[4] == "TOTAL 6 0 4 2 80%" def test_report_show_missing_branches_and_lines(self): self.make_file("main.py", """\ @@ -297,17 +283,6 @@ def branch(x, y, z): cov = coverage.Coverage(branch=True) self.start_import_stop(cov, "main") assert self.stdout() == 'x\ny\n' - report_lines = self.get_report(cov, squeeze=False, show_missing=True).splitlines() - - expected = [ - 'Name Stmts Miss Branch BrPart Cover Missing', - '---------------------------------------------------------', - 'main.py 1 0 0 0 100%', - 'mybranch.py 10 2 8 3 61% 2->4, 4->6, 7-8', - '---------------------------------------------------------', - 'TOTAL 11 2 8 3 63%', - ] - assert expected == report_lines def test_report_skip_covered_no_branches(self): self.make_file("main.py", """ @@ -444,6 +419,26 @@ def foo(): assert self.line_count(report) == 6, report squeezed = self.squeezed_lines(report) assert squeezed[5] == "1 file skipped due to complete coverage." + report = self.get_report(cov, squeeze=False, skip_covered=True, + output_format="markdown") + # | Name | Stmts | Miss | Branch | BrPart | Cover | + # |---------- | -------: | -------: | -------: | -------: | -------: | + # | **TOTAL** | **3** | **0** | **0** | **0** | **100%** | + # + # 1 file skipped due to complete coverage. + + assert self.line_count(report) == 5, report + assert report.split("\n")[0] == ( + '| Name | Stmts | Miss | Branch | BrPart | Cover |' + ) + assert report.split("\n")[1] == ( + '|---------- | -------: | -------: | -------: | -------: | -------: |' + ) + assert report.split("\n")[2] == ( + '| **TOTAL** | **3** | **0** | **0** | **0** | **100%** |' + ) + squeezed = self.squeezed_lines(report) + assert squeezed[4] == "1 file skipped due to complete coverage." def test_report_skip_covered_longfilename(self): self.make_file("long_______________filename.py", """ @@ -513,13 +508,14 @@ def test_report_skip_empty_no_data(self): # Name Stmts Miss Cover # ------------------------------------ + # ------------------------------------ + # TOTAL 0 0 100% # # 1 empty file skipped. assert self.line_count(report) == 6, report - squeezed = self.squeezed_lines(report) - assert squeezed[3] == "TOTAL 0 0 100%" - assert squeezed[5] == "1 empty file skipped." + assert report.split("\n")[3] == "TOTAL 0 0 100%" + assert report.split("\n")[5] == "1 empty file skipped." def test_report_precision(self): self.make_file(".coveragerc", """\ @@ -550,7 +546,7 @@ def foo(): cov = coverage.Coverage(branch=True) self.start_import_stop(cov, "main") assert self.stdout() == "n\nz\n" - report = self.get_report(cov) + report = self.get_report(cov, squeeze=False) # Name Stmts Miss Branch BrPart Cover # ------------------------------------------------------ @@ -566,6 +562,29 @@ def foo(): assert squeezed[4] == "not_covered.py 4 0 2 1 83.333%" assert squeezed[6] == "TOTAL 13 0 4 1 94.118%" + def test_report_precision_all_zero(self): + self.make_file("not_covered.py", """ + def not_covered(n): + if n: + print("n") + """) + self.make_file("empty.py", "") + cov = coverage.Coverage(source=["."]) + self.start_import_stop(cov, "empty") + report = self.get_report(cov, precision=6, squeeze=False) + + # Name Stmts Miss Cover + # ----------------------------------------- + # empty.py 0 0 100.000000% + # not_covered.py 3 3 0.000000% + # ----------------------------------------- + # TOTAL 3 3 0.000000% + + assert self.line_count(report) == 6, report + assert "empty.py 0 0 100.000000%" in report + assert "not_covered.py 3 3 0.000000%" in report + assert "TOTAL 3 3 0.000000%" in report + def test_dotpy_not_python(self): # We run a .py file, and when reporting, we can't parse it as Python. # We should get an error message in the report. @@ -589,7 +608,6 @@ def test_accented_directory(self): "-----------------------------------\n" + "TOTAL 1 0 100%\n" ) - cov = coverage.Coverage() cov.load() output = self.get_report(cov, squeeze=False) @@ -666,6 +684,8 @@ def test_report_with_chdir(self): assert out == "Line One\nLine Two\nhello\n" report = self.report_from_command("coverage report") assert self.last_line_squeezed(report) == "TOTAL 5 0 100%" + report = self.report_from_command("coverage report --format=markdown") + assert self.last_line_squeezed(report) == "| **TOTAL** | **5** | **0** | **100%** |" def test_bug_156_file_not_run_should_be_zero(self): # https://github.com/nedbat/coveragepy/issues/156 @@ -695,7 +715,6 @@ def test_bug_203_mixed_case_listed_twice_with_rc(self): self.make_file(".coveragerc", "[run]\nsource = .\n") report = self.run_TheCode_and_report_it() - assert "TheCode" in report assert "thecode" not in report @@ -743,6 +762,9 @@ def test_tracing_pyc_file(self): report = self.get_report(cov).splitlines() assert "mod.py 1 0 100%" in report + report = self.get_report(cov, squeeze=False, output_format="markdown") + assert report.split("\n")[3] == "| mod.py | 1 | 0 | 100% |" + assert report.split("\n")[4] == "| **TOTAL** | **2** | **0** | **100%** |" def test_missing_py_file_during_run(self): # Create two Python files. @@ -780,7 +802,44 @@ def test_empty_files(self): report = self.get_report(cov) assert "tests/modules/pkg1/__init__.py 1 0 0 0 100%" in report assert "tests/modules/pkg2/__init__.py 0 0 0 0 100%" in report + report = self.get_report(cov, squeeze=False, output_format="markdown") + # get_report() escapes backslash so we expect forward slash escaped + # underscore + assert "tests/modules/pkg1//_/_init/_/_.py " in report + assert "| 1 | 0 | 0 | 0 | 100% |" in report + assert "tests/modules/pkg2//_/_init/_/_.py " in report + assert "| 0 | 0 | 0 | 0 | 100% |" in report + + def test_markdown_with_missing(self): + self.make_file("mymissing.py", """\ + def missing(x, y): + if x: + print("x") + return x + if y: + print("y") + try: + print("z") + 1/0 + print("Never!") + except ZeroDivisionError: + pass + return x + missing(0, 1) + """) + cov = coverage.Coverage(source=["."]) + self.start_import_stop(cov, "mymissing") + assert self.stdout() == 'y\nz\n' + report = self.get_report(cov,squeeze=False, output_format="markdown", show_missing=True) + # | Name | Stmts | Miss | Cover | Missing | + # |------------- | -------: | -------: | ------: | --------: | + # | mymissing.py | 14 | 3 | 79% | 3-4, 10 | + # | **TOTAL** | **14** | **3** | **79%** | | + assert self.line_count(report) == 4 + report_lines = report.split("\n") + assert report_lines[2] == "| mymissing.py | 14 | 3 | 79% | 3-4, 10 |" + assert report_lines[3] == "| **TOTAL** | **14** | **3** | **79%** | |" class ReportingReturnValueTest(CoverageTest): """Tests of reporting functions returning values.""" @@ -858,7 +917,6 @@ def test_test_data(self): # about them are still valid. We want the three columns of numbers to # sort in three different orders. report = self.get_summary_text() - print(report) # Name Stmts Miss Cover # ------------------------------ # file1.py 339 155 54% @@ -866,7 +924,6 @@ def test_test_data(self): # file10.py 234 228 3% # ------------------------------ # TOTAL 586 386 34% - lines = report.splitlines()[2:-2] assert len(lines) == 3 nums = [list(map(int, l.replace('%', '').split()[1:])) for l in lines] From 5a3e1e85c9e614b792cdaa5fad6f863e998295be Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 12:50:56 -0400 Subject: [PATCH 048/200] refactor: clean up of markdown table support --- coverage/summary.py | 53 +++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/coverage/summary.py b/coverage/summary.py index 94be1a087..77b368280 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -25,11 +25,15 @@ def __init__(self, coverage): self.total = Numbers(precision=self.config.precision) self.fmt_err = "%s %s: %s" - def writeout(self, line): + def write(self, line): """Write a line to the output, adding a newline.""" self.outfile.write(line.rstrip()) self.outfile.write("\n") + def write_items(self, items): + """Write a list of strings, joined together.""" + self.write("".join(items)) + def _report_text(self, header, lines_values, total_line, end_lines): """Internal method that prints report data in text format. @@ -43,7 +47,7 @@ def _report_text(self, header, lines_values, total_line, end_lines): max_name = max([len(line[0]) for line in lines_values] + [5]) + 1 max_n = max(len(total_line[header.index("Cover")]) + 2, len(" Cover")) + 1 max_n = max([max_n] + [len(line[header.index("Cover")]) + 2 for line in lines_values]) - h_form = dict( + formats = dict( Name="{:{name_len}}", Stmts="{:>7}", Miss="{:>7}", @@ -53,37 +57,35 @@ def _report_text(self, header, lines_values, total_line, end_lines): Missing="{:>10}", ) header_items = [ - h_form[item].format(item, name_len=max_name, n=max_n) + formats[item].format(item, name_len=max_name, n=max_n) for item in header ] header_str = "".join(header_items) rule = "-" * len(header_str) # Write the header - self.writeout(header_str) - self.writeout(rule) + self.write(header_str) + self.write(rule) - h_form.update(dict(Cover="{:>{n}}%"), Missing=" {:9}") + formats.update(dict(Cover="{:>{n}}%"), Missing=" {:9}") for values in lines_values: # build string with line values line_items = [ - h_form[item].format(str(value), + formats[item].format(str(value), name_len=max_name, n=max_n-1) for item, value in zip(header, values) ] - text = "".join(line_items) - self.writeout(text) + self.write_items(line_items) # Write a TOTAL line - self.writeout(rule) + self.write(rule) line_items = [ - h_form[item].format(str(value), + formats[item].format(str(value), name_len=max_name, n=max_n-1) for item, value in zip(header, total_line) ] - text = "".join(line_items) - self.writeout(text) + self.write_items(line_items) for end_line in end_lines: - self.writeout(end_line) + self.write(end_line) def _report_markdown(self, header, lines_values, total_line, end_lines): """Internal method that prints report data in markdown format. @@ -97,7 +99,7 @@ def _report_markdown(self, header, lines_values, total_line, end_lines): # Prepare the formatting strings, header, and column sorting. max_name = max([len(line[0].replace("_", "\\_")) for line in lines_values] + [9]) max_name += 1 - h_form = dict( + formats = dict( Name="| {:{name_len}}|", Stmts="{:>9} |", Miss="{:>9} |", @@ -107,28 +109,27 @@ def _report_markdown(self, header, lines_values, total_line, end_lines): Missing="{:>10} |", ) max_n = max(len(total_line[header.index("Cover")]) + 6, len(" Cover ")) - header_items = [h_form[item].format(item, name_len=max_name, n=max_n) for item in header] + header_items = [formats[item].format(item, name_len=max_name, n=max_n) for item in header] header_str = "".join(header_items) rule_str = "|" + " ".join(["- |".rjust(len(header_items[0])-1, '-')] + ["-: |".rjust(len(item)-1, '-') for item in header_items[1:]] ) # Write the header - self.writeout(header_str) - self.writeout(rule_str) + self.write(header_str) + self.write(rule_str) for values in lines_values: # build string with line values - h_form.update(dict(Cover="{:>{n}}% |")) + formats.update(dict(Cover="{:>{n}}% |")) line_items = [ - h_form[item].format(str(value).replace("_", "\\_"), + formats[item].format(str(value).replace("_", "\\_"), name_len=max_name, n=max_n-1) for item, value in zip(header, values) ] - text = "".join(line_items) - self.writeout(text) + self.write_items(line_items) # Write the TOTAL line - h_form.update(dict(Name="|{:>{name_len}} |", Cover="{:>{n}} |")) + formats.update(dict(Name="|{:>{name_len}} |", Cover="{:>{n}} |")) total_line_items = [] for item, value in zip(header, total_line): if value == '': @@ -137,11 +138,11 @@ def _report_markdown(self, header, lines_values, total_line, end_lines): insert = f" **{value}%**" else: insert = f" **{value}**" - total_line_items += h_form[item].format(insert, name_len=max_name, n=max_n) + total_line_items += formats[item].format(insert, name_len=max_name, n=max_n) total_row_str = "".join(total_line_items) - self.writeout(total_row_str) + self.write(total_row_str) for end_line in end_lines: - self.writeout(end_line) + self.write(end_line) def report(self, morfs, outfile=None): """Writes a report summarizing coverage statistics per module. From 01d86775522ed67a246f2b17657e7a119cb6b8a1 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 12:51:13 -0400 Subject: [PATCH 049/200] docs: changelog and docs for `coverage report --format=markdown` --- CHANGES.rst | 7 +++++++ CONTRIBUTORS.txt | 1 + doc/cmd.rst | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 9453f1ae3..ce4b4926c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,9 +20,16 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- +- Text reporting with ``coverage report`` now has a ``--format=`` option. + The original style (``--format=text``) is the default. Now you can also + use ``--format=markdown`` to get the table in Markdown format, thanks to + Steve Oswald in `pull 1479`_, closing `issue 1418`_. + - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. +.. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 +.. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 4bf9a193b..b57c35d5c 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -150,6 +150,7 @@ Stephan Richter Stephen Finucane Steve Dower Steve Leonard +Steve Oswald Steve Peak Sviatoslav Sydorenko S. Y. Lee diff --git a/doc/cmd.rst b/doc/cmd.rst index fd1f7d1a6..7b49ec147 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -592,6 +592,10 @@ decimal point in coverage percentages, defaulting to none. The ``--sort`` option is the name of a column to sort the report by. +The ``--format`` option controls the style of the table. ``--format=text`` +creates plain text tables as shown above. ``--format=markdown`` creates +Markdown tables. + Other common reporting options are described above in :ref:`cmd_reporting`. These options can also be set in your .coveragerc file. See :ref:`Configuration: [report] `. From 3b3cc6959b3aa515915816c2159806fab570ceb9 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 15:35:22 -0400 Subject: [PATCH 050/200] refactor: use `format` wherever we can --- coverage/cmdline.py | 10 +++++----- coverage/config.py | 4 ++-- coverage/control.py | 6 +++--- coverage/summary.py | 2 +- tests/test_cmdline.py | 4 ++-- tests/test_summary.py | 3 +-- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/coverage/cmdline.py b/coverage/cmdline.py index 89b0807d8..bea959932 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -96,8 +96,8 @@ class Opts: '', '--fail-under', action='store', metavar="MIN", type="float", help="Exit with a status of 2 if the total coverage is less than MIN.", ) - output_format = optparse.make_option( - '', '--format', action='store', metavar="FORMAT", dest="output_format", + format = optparse.make_option( + '', '--format', action='store', metavar="FORMAT", help="Output format, either text (default) or markdown", ) help = optparse.make_option( @@ -249,7 +249,7 @@ def __init__(self, *args, **kwargs): debug=None, directory=None, fail_under=None, - output_format=None, + format=None, help=None, ignore_errors=None, include=None, @@ -487,7 +487,7 @@ def get_prog_name(self): Opts.contexts, Opts.input_datafile, Opts.fail_under, - Opts.output_format, + Opts.format, Opts.ignore_errors, Opts.include, Opts.omit, @@ -695,7 +695,7 @@ def command_line(self, argv): skip_covered=options.skip_covered, skip_empty=options.skip_empty, sort=options.sort, - output_format=options.output_format, + output_format=options.format, **report_args ) elif options.action == "annotate": diff --git a/coverage/config.py b/coverage/config.py index 1f239ea36..309f65e81 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -199,7 +199,7 @@ def __init__(self): # Defaults for [report] self.exclude_list = DEFAULT_EXCLUDE[:] self.fail_under = 0.0 - self.output_format = None + self.format = None self.ignore_errors = False self.report_include = None self.report_omit = None @@ -375,7 +375,7 @@ def copy(self): # [report] ('exclude_list', 'report:exclude_lines', 'regexlist'), ('fail_under', 'report:fail_under', 'float'), - ('output_format', 'report:output_format', 'boolean'), + ('format', 'report:format', 'boolean'), ('ignore_errors', 'report:ignore_errors', 'boolean'), ('partial_always_list', 'report:partial_branches_always', 'regexlist'), ('partial_list', 'report:partial_branches', 'regexlist'), diff --git a/coverage/control.py b/coverage/control.py index a8cf1649c..d260eeaba 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -923,8 +923,8 @@ def report( `file` is a file-like object, suitable for writing. - `output_format` provides options, to print eitehr as plain text, or as - markdown code + `output_format` determines the format, either "text" (the default), + or "markdown". `include` is a list of file name patterns. Files that match will be included in the report. Files matching `omit` will not be included in @@ -966,7 +966,7 @@ def report( ignore_errors=ignore_errors, report_omit=omit, report_include=include, show_missing=show_missing, skip_covered=skip_covered, report_contexts=contexts, skip_empty=skip_empty, precision=precision, - sort=sort, output_format=output_format, + sort=sort, format=output_format, ): reporter = SummaryReporter(self) return reporter.report(morfs, outfile=file) diff --git a/coverage/summary.py b/coverage/summary.py index 77b368280..7709e4e78 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -224,7 +224,7 @@ def report(self, morfs, outfile=None): fmt_skip_empty = f"\n{self.empty_count} empty file{file_suffix} skipped." end_lines.append(fmt_skip_empty) - text_format = self.config.output_format or "text" + text_format = self.config.format or "text" if text_format == "markdown": formatter = self._report_markdown else: diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index 1b9a1ef09..378c901d7 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -43,8 +43,8 @@ class BaseCmdLineTest(CoverageTest): ) _defaults.Coverage().report( ignore_errors=None, include=None, omit=None, morfs=[], - show_missing=None, skip_covered=None, contexts=None, skip_empty=None, precision=None, - sort=None, output_format=None, + show_missing=None, skip_covered=None, contexts=None, skip_empty=None, + precision=None, sort=None, output_format=None, ) _defaults.Coverage().xml_report( ignore_errors=None, include=None, omit=None, morfs=[], outfile=None, diff --git a/tests/test_summary.py b/tests/test_summary.py index 3e77285a7..3a14ee3c6 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -419,8 +419,7 @@ def foo(): assert self.line_count(report) == 6, report squeezed = self.squeezed_lines(report) assert squeezed[5] == "1 file skipped due to complete coverage." - report = self.get_report(cov, squeeze=False, skip_covered=True, - output_format="markdown") + report = self.get_report(cov, squeeze=False, skip_covered=True, output_format="markdown") # | Name | Stmts | Miss | Branch | BrPart | Cover | # |---------- | -------: | -------: | -------: | -------: | -------: | # | **TOTAL** | **3** | **0** | **0** | **0** | **100%** | From a4da2c62c45132e1a7d1e1f78e32522be5ad405f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 5 Nov 2022 21:02:16 -0400 Subject: [PATCH 051/200] refactor: more clean up of report table code --- coverage/summary.py | 79 ++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/coverage/summary.py b/coverage/summary.py index 7709e4e78..b27b8a1cd 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -37,10 +37,10 @@ def write_items(self, items): def _report_text(self, header, lines_values, total_line, end_lines): """Internal method that prints report data in text format. - `header` is a tuple with captions. - `lines_values` is list of tuples of sortable values. - `total_line` is a tuple with values of the total line. - `end_lines` is a tuple of ending lines with information about skipped files. + `header` is a list with captions. + `lines_values` is list of lists of sortable values. + `total_line` is a list with values of the total line. + `end_lines` is a list of ending lines with information about skipped files. """ # Prepare the formatting strings, header, and column sorting. @@ -90,15 +90,15 @@ def _report_text(self, header, lines_values, total_line, end_lines): def _report_markdown(self, header, lines_values, total_line, end_lines): """Internal method that prints report data in markdown format. - `header` is a tuple with captions. - `lines_values` is a sorted list of tuples containing coverage information. - `total_line` is a tuple with values of the total line. - `end_lines` is a tuple of ending lines with information about skipped files. + `header` is a list with captions. + `lines_values` is a sorted list of lists containing coverage information. + `total_line` is a list with values of the total line. + `end_lines` is a list of ending lines with information about skipped files. """ # Prepare the formatting strings, header, and column sorting. - max_name = max([len(line[0].replace("_", "\\_")) for line in lines_values] + [9]) - max_name += 1 + max_name = max((len(line[0].replace("_", "\\_")) for line in lines_values), default=0) + max_name = max(max_name, len("**TOTAL**")) + 1 formats = dict( Name="| {:{name_len}}|", Stmts="{:>9} |", @@ -123,8 +123,8 @@ def _report_markdown(self, header, lines_values, total_line, end_lines): # build string with line values formats.update(dict(Cover="{:>{n}}% |")) line_items = [ - formats[item].format(str(value).replace("_", "\\_"), - name_len=max_name, n=max_n-1) for item, value in zip(header, values) + formats[item].format(str(value).replace("_", "\\_"), name_len=max_name, n=max_n-1) + for item, value in zip(header, values) ] self.write_items(line_items) @@ -132,15 +132,14 @@ def _report_markdown(self, header, lines_values, total_line, end_lines): formats.update(dict(Name="|{:>{name_len}} |", Cover="{:>{n}} |")) total_line_items = [] for item, value in zip(header, total_line): - if value == '': + if value == "": insert = value elif item == "Cover": insert = f" **{value}%**" else: insert = f" **{value}**" total_line_items += formats[item].format(insert, name_len=max_name, n=max_n) - total_row_str = "".join(total_line_items) - self.write(total_row_str) + self.write_items(total_line_items) for end_line in end_lines: self.write(end_line) @@ -157,34 +156,37 @@ def report(self, morfs, outfile=None): for fr, analysis in get_analysis_to_report(self.coverage, morfs): self.report_one_file(fr, analysis) - # Prepare the formatting strings, header, and column sorting. - header = ("Name", "Stmts", "Miss",) + if not self.total.n_files and not self.skipped_count: + raise NoDataError("No data to report.") + + # Prepare the header line and column sorting. + header = ["Name", "Stmts", "Miss"] if self.branches: - header += ("Branch", "BrPart",) - header += ("Cover",) + header += ["Branch", "BrPart"] + header += ["Cover"] if self.config.show_missing: - header += ("Missing",) + header += ["Missing"] column_order = dict(name=0, stmts=1, miss=2, cover=-1) if self.branches: column_order.update(dict(branch=3, brpart=4)) - # `lines_values` is list of tuples of sortable values. + # `lines_values` is list of lists of sortable values. lines_values = [] for (fr, analysis) in self.fr_analysis: nums = analysis.numbers - args = (fr.relative_filename(), nums.n_statements, nums.n_missing) + args = [fr.relative_filename(), nums.n_statements, nums.n_missing] if self.branches: - args += (nums.n_branches, nums.n_partial_branches) - args += (nums.pc_covered_str,) + args += [nums.n_branches, nums.n_partial_branches] + args += [nums.pc_covered_str] if self.config.show_missing: - args += (analysis.missing_formatted(branches=True),) - args += (nums.pc_covered,) + args += [analysis.missing_formatted(branches=True)] + args += [nums.pc_covered] lines_values.append(args) - # line-sorting. + # Line sorting. sort_option = (self.config.sort or "name").lower() reverse = False if sort_option[0] == '-': @@ -200,29 +202,24 @@ def report(self, morfs, outfile=None): else: lines_values.sort(key=lambda tup: (tup[sort_idx], tup[0]), reverse=reverse) - # calculate total if we had at least one file. - total_line = ("TOTAL", self.total.n_statements, self.total.n_missing) + # Calculate total if we had at least one file. + total_line = ["TOTAL", self.total.n_statements, self.total.n_missing] if self.branches: - total_line += (self.total.n_branches, self.total.n_partial_branches) - total_line += (self.total.pc_covered_str,) + total_line += [self.total.n_branches, self.total.n_partial_branches] + total_line += [self.total.pc_covered_str] if self.config.show_missing: - total_line += ("",) + total_line += [""] - # create other final lines + # Create other final lines. end_lines = [] - if not self.total.n_files and not self.skipped_count: - raise NoDataError("No data to report.") - if self.config.skip_covered and self.skipped_count: file_suffix = 's' if self.skipped_count>1 else '' - fmt_skip_covered = ( + end_lines.append( f"\n{self.skipped_count} file{file_suffix} skipped due to complete coverage." ) - end_lines.append(fmt_skip_covered) if self.config.skip_empty and self.empty_count: - file_suffix = 's' if self.empty_count>1 else '' - fmt_skip_empty = f"\n{self.empty_count} empty file{file_suffix} skipped." - end_lines.append(fmt_skip_empty) + file_suffix = 's' if self.empty_count > 1 else '' + end_lines.append(f"\n{self.empty_count} empty file{file_suffix} skipped.") text_format = self.config.format or "text" if text_format == "markdown": From 30f1ecf0657fa89b56eab300f10c58852edbbcdd Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 10:59:13 -0500 Subject: [PATCH 052/200] refactor: human sorting --- coverage/collector.py | 6 +++--- coverage/misc.py | 11 +++++++---- coverage/summary.py | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/coverage/collector.py b/coverage/collector.py index 241de05ea..ef1d9b419 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -11,7 +11,7 @@ from coverage.debug import short_stack from coverage.disposition import FileDisposition from coverage.exceptions import ConfigError -from coverage.misc import human_sorted, isolate_module +from coverage.misc import human_sorted_items, isolate_module from coverage.pytracer import PyTracer os = isolate_module(os) @@ -367,8 +367,8 @@ def pause(self): stats = tracer.get_stats() if stats: print("\nCoverage.py tracer stats:") - for k in human_sorted(stats.keys()): - print(f"{k:>20}: {stats[k]}") + for k, v in human_sorted_items(stats.items()): + print(f"{k:>20}: {v}") if self.threading: self.threading.settrace(None) diff --git a/coverage/misc.py b/coverage/misc.py index e3c67bc6d..212790a10 100644 --- a/coverage/misc.py +++ b/coverage/misc.py @@ -368,7 +368,7 @@ def import_local_file(modname, modfile=None): return mod -def human_key(s): +def _human_key(s): """Turn a string into a list of string and number chunks. "z23a" -> ["z", 23, "a"] """ @@ -389,14 +389,17 @@ def human_sorted(strings): Returns the sorted list. """ - return sorted(strings, key=human_key) + return sorted(strings, key=_human_key) def human_sorted_items(items, reverse=False): - """Sort the (string, value) items the way humans expect. + """Sort (string, ...) items the way humans expect. + + The elements of `items` can be any tuple/list. They'll be sorted by the + first element (a string), with ties broken by the remaining elements. Returns the sorted list of items. """ - return sorted(items, key=lambda pair: (human_key(pair[0]), pair[1]), reverse=reverse) + return sorted(items, key=lambda item: (_human_key(item[0]), *item[1:]), reverse=reverse) def plural(n, thing="", things=""): diff --git a/coverage/summary.py b/coverage/summary.py index b27b8a1cd..1aa802af8 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -6,7 +6,7 @@ import sys from coverage.exceptions import ConfigError, NoDataError -from coverage.misc import human_key +from coverage.misc import human_sorted_items from coverage.report import get_analysis_to_report from coverage.results import Numbers @@ -198,9 +198,9 @@ def report(self, morfs, outfile=None): if sort_idx is None: raise ConfigError(f"Invalid sorting option: {self.config.sort!r}") if sort_option == "name": - lines_values.sort(key=lambda tup: (human_key(tup[0]), tup[1]), reverse=reverse) + lines_values = human_sorted_items(lines_values, reverse=reverse) else: - lines_values.sort(key=lambda tup: (tup[sort_idx], tup[0]), reverse=reverse) + lines_values.sort(key=lambda line: (line[sort_idx], line[0]), reverse=reverse) # Calculate total if we had at least one file. total_line = ["TOTAL", self.total.n_statements, self.total.n_missing] From e5a15c1d5652574ba85673f814b09f5da333fca8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 12:17:11 -0500 Subject: [PATCH 053/200] feat: --format=total writes just the total number --- CHANGES.rst | 10 +++++++--- coverage/cmdline.py | 2 +- coverage/control.py | 2 +- coverage/summary.py | 15 +++++++++++---- doc/cmd.rst | 11 +++++++---- tests/test_summary.py | 10 +++++++++- 6 files changed, 36 insertions(+), 14 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index ce4b4926c..a03c052c9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -21,9 +21,13 @@ Unreleased ---------- - Text reporting with ``coverage report`` now has a ``--format=`` option. - The original style (``--format=text``) is the default. Now you can also - use ``--format=markdown`` to get the table in Markdown format, thanks to - Steve Oswald in `pull 1479`_, closing `issue 1418`_. + The original style (``--format=text``) is the default. + + - Using ``--format=markdown`` will write the table in Markdown format, thanks + to Steve Oswald in `pull 1479`_, closing `issue 1418`_. + + - Using ``--format=total`` will write a single total number to the + output. This can be useful for making badges or writing status updates. - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. diff --git a/coverage/cmdline.py b/coverage/cmdline.py index bea959932..b15a66f72 100644 --- a/coverage/cmdline.py +++ b/coverage/cmdline.py @@ -98,7 +98,7 @@ class Opts: ) format = optparse.make_option( '', '--format', action='store', metavar="FORMAT", - help="Output format, either text (default) or markdown", + help="Output format, either text (default), markdown, or total.", ) help = optparse.make_option( '-h', '--help', action='store_true', diff --git a/coverage/control.py b/coverage/control.py index d260eeaba..9a55acb1d 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -924,7 +924,7 @@ def report( `file` is a file-like object, suitable for writing. `output_format` determines the format, either "text" (the default), - or "markdown". + "markdown", or "total". `include` is a list of file name patterns. Files that match will be included in the report. Files matching `omit` will not be included in diff --git a/coverage/summary.py b/coverage/summary.py index 1aa802af8..d1919e714 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -19,6 +19,7 @@ def __init__(self, coverage): self.config = self.coverage.config self.branches = coverage.get_data().has_arcs() self.outfile = None + self.output_format = self.config.format or "text" self.fr_analysis = [] self.skipped_count = 0 self.empty_count = 0 @@ -159,6 +160,15 @@ def report(self, morfs, outfile=None): if not self.total.n_files and not self.skipped_count: raise NoDataError("No data to report.") + if self.output_format == "total": + self.write(self.total.pc_covered_str) + else: + self.tabular_report() + + return self.total.n_statements and self.total.pc_covered + + def tabular_report(self): + """Writes tabular report formats.""" # Prepare the header line and column sorting. header = ["Name", "Stmts", "Miss"] if self.branches: @@ -221,15 +231,12 @@ def report(self, morfs, outfile=None): file_suffix = 's' if self.empty_count > 1 else '' end_lines.append(f"\n{self.empty_count} empty file{file_suffix} skipped.") - text_format = self.config.format or "text" - if text_format == "markdown": + if self.output_format == "markdown": formatter = self._report_markdown else: formatter = self._report_text formatter(header, lines_values, total_line, end_lines) - return self.total.n_statements and self.total.pc_covered - def report_one_file(self, fr, analysis): """Report on just one file, the callback from report().""" nums = analysis.numbers diff --git a/doc/cmd.rst b/doc/cmd.rst index 7b49ec147..be323c0cd 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -518,7 +518,8 @@ as a percentage. file. Defaults to '.coverage'. [env: COVERAGE_FILE] --fail-under=MIN Exit with a status of 2 if the total coverage is less than MIN. - --format=FORMAT Output format, either text (default) or markdown + --format=FORMAT Output format, either text (default), markdown, or + total. -i, --ignore-errors Ignore errors while reading source files. --include=PAT1,PAT2,... Include only files whose paths match one of these @@ -541,7 +542,7 @@ as a percentage. --rcfile=RCFILE Specify configuration file. By default '.coveragerc', 'setup.cfg', 'tox.ini', and 'pyproject.toml' are tried. [env: COVERAGE_RCFILE] -.. [[[end]]] (checksum: 8c671de502a388159689082d906f786a) +.. [[[end]]] (checksum: 167272a29d9e7eb017a592a0e0747a06) The ``-m`` flag also shows the line numbers of missing statements:: @@ -592,9 +593,11 @@ decimal point in coverage percentages, defaulting to none. The ``--sort`` option is the name of a column to sort the report by. -The ``--format`` option controls the style of the table. ``--format=text`` +The ``--format`` option controls the style of the report. ``--format=text`` creates plain text tables as shown above. ``--format=markdown`` creates -Markdown tables. +Markdown tables. ``--format=total`` writes out a single number, the total +coverage percentage as shown at the end of the tables, but without a percent +sign. Other common reporting options are described above in :ref:`cmd_reporting`. These options can also be set in your .coveragerc file. See diff --git a/tests/test_summary.py b/tests/test_summary.py index 3a14ee3c6..e32a1d2e6 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -439,6 +439,9 @@ def foo(): squeezed = self.squeezed_lines(report) assert squeezed[4] == "1 file skipped due to complete coverage." + total = self.get_report(cov, output_format="total", skip_covered=True) + assert total == "100\n" + def test_report_skip_covered_longfilename(self): self.make_file("long_______________filename.py", """ def foo(): @@ -829,7 +832,7 @@ def missing(x, y): cov = coverage.Coverage(source=["."]) self.start_import_stop(cov, "mymissing") assert self.stdout() == 'y\nz\n' - report = self.get_report(cov,squeeze=False, output_format="markdown", show_missing=True) + report = self.get_report(cov, squeeze=False, output_format="markdown", show_missing=True) # | Name | Stmts | Miss | Cover | Missing | # |------------- | -------: | -------: | ------: | --------: | @@ -840,6 +843,11 @@ def missing(x, y): assert report_lines[2] == "| mymissing.py | 14 | 3 | 79% | 3-4, 10 |" assert report_lines[3] == "| **TOTAL** | **14** | **3** | **79%** | |" + assert self.get_report(cov, output_format="total") == "79\n" + assert self.get_report(cov, output_format="total", precision=2) == "78.57\n" + assert self.get_report(cov, output_format="total", precision=4) == "78.5714\n" + + class ReportingReturnValueTest(CoverageTest): """Tests of reporting functions returning values.""" From d5c3daa5b6f15f968e663f1a0459ddad48479e67 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 12:31:35 -0500 Subject: [PATCH 054/200] fix: an empty file shouldn't fail with --fail-under=99. #1470 --- CHANGES.rst | 4 ++++ coverage/summary.py | 2 +- tests/test_process.py | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index a03c052c9..960cb9c61 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -29,12 +29,16 @@ Unreleased - Using ``--format=total`` will write a single total number to the output. This can be useful for making badges or writing status updates. +- An empty file has a coverage total of 100%, but used to fail with + ``--fail-under``. This has been fixed, closing `issue 1470`_. + - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. .. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 +.. _issue 1470: https://github.com/nedbat/coveragepy/issues/1470 .. _changes_6-6-0b1: diff --git a/coverage/summary.py b/coverage/summary.py index d1919e714..194dc1afa 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -165,7 +165,7 @@ def report(self, morfs, outfile=None): else: self.tabular_report() - return self.total.n_statements and self.total.pc_covered + return self.total.pc_covered def tabular_report(self): """Writes tabular report formats.""" diff --git a/tests/test_process.py b/tests/test_process.py index b76846e51..1f134a6da 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -1093,7 +1093,8 @@ def test_report(self): st, _ = self.run_command_status("coverage run empty.py") assert st == 0 st, _ = self.run_command_status("coverage report") - assert st == 2 + # An empty file is marked as 100% covered, so this is ok. + assert st == 0 @pytest.mark.skipif(env.WINDOWS, reason="Windows can't delete the directory in use.") From 8389674d5d0f15dcb84896439f74ada0bc2150da Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 12:44:36 -0500 Subject: [PATCH 055/200] fix: don't write two rules for an empty table. --- CHANGES.rst | 3 +++ coverage/summary.py | 4 +++- tests/test_summary.py | 21 ++++++++++----------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 960cb9c61..1f622b72f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -32,6 +32,9 @@ Unreleased - An empty file has a coverage total of 100%, but used to fail with ``--fail-under``. This has been fixed, closing `issue 1470`_. +- The text report table no longer writes out two separator lines if there are + no files listed in the table. One is plenty. + - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. diff --git a/coverage/summary.py b/coverage/summary.py index 194dc1afa..fe73c678a 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -78,7 +78,9 @@ def _report_text(self, header, lines_values, total_line, end_lines): self.write_items(line_items) # Write a TOTAL line - self.write(rule) + if lines_values: + self.write(rule) + line_items = [ formats[item].format(str(value), name_len=max_name, n=max_n-1) for item, value in zip(header, total_line) diff --git a/tests/test_summary.py b/tests/test_summary.py index e32a1d2e6..82508de8e 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -409,17 +409,18 @@ def foo(): assert self.stdout() == "" report = self.get_report(cov, skip_covered=True) - # Name Stmts Miss Branch BrPart Cover - # ------------------------------------------- + # Name Stmts Miss Branch BrPart Cover # ----------------------------------------- # TOTAL 3 0 0 0 100% # # 1 file skipped due to complete coverage. - assert self.line_count(report) == 6, report + assert self.line_count(report) == 5, report squeezed = self.squeezed_lines(report) - assert squeezed[5] == "1 file skipped due to complete coverage." + assert squeezed[4] == "1 file skipped due to complete coverage." + report = self.get_report(cov, squeeze=False, skip_covered=True, output_format="markdown") + # | Name | Stmts | Miss | Branch | BrPart | Cover | # |---------- | -------: | -------: | -------: | -------: | -------: | # | **TOTAL** | **3** | **0** | **0** | **0** | **100%** | @@ -455,16 +456,15 @@ def foo(): # Name Stmts Miss Branch BrPart Cover # ----------------------------------------- - # ----------------------------------------- # TOTAL 3 0 0 0 100% # # 1 file skipped due to complete coverage. - assert self.line_count(report) == 6, report + assert self.line_count(report) == 5, report lines = self.report_lines(report) assert lines[0] == "Name Stmts Miss Branch BrPart Cover" squeezed = self.squeezed_lines(report) - assert squeezed[5] == "1 file skipped due to complete coverage." + assert squeezed[4] == "1 file skipped due to complete coverage." def test_report_skip_covered_no_data(self): cov = coverage.Coverage() @@ -510,14 +510,13 @@ def test_report_skip_empty_no_data(self): # Name Stmts Miss Cover # ------------------------------------ - # ------------------------------------ # TOTAL 0 0 100% # # 1 empty file skipped. - assert self.line_count(report) == 6, report - assert report.split("\n")[3] == "TOTAL 0 0 100%" - assert report.split("\n")[5] == "1 empty file skipped." + assert self.line_count(report) == 5, report + assert report.split("\n")[2] == "TOTAL 0 0 100%" + assert report.split("\n")[4] == "1 empty file skipped." def test_report_precision(self): self.make_file(".coveragerc", """\ From faaf0d45abcf0a11c9e5db144c5b79f581dd92eb Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 13:28:32 -0500 Subject: [PATCH 056/200] fix: only accept known values for --format --- coverage/summary.py | 3 ++- tests/test_cmdline.py | 5 +++++ tests/test_summary.py | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/coverage/summary.py b/coverage/summary.py index fe73c678a..24aa30f2d 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -20,11 +20,12 @@ def __init__(self, coverage): self.branches = coverage.get_data().has_arcs() self.outfile = None self.output_format = self.config.format or "text" + if self.output_format not in {"text", "markdown", "total"}: + raise ConfigError(f"Unknown report format choice: {self.output_format!r}") self.fr_analysis = [] self.skipped_count = 0 self.empty_count = 0 self.total = Numbers(precision=self.config.precision) - self.fmt_err = "%s %s: %s" def write(self, line): """Write a line to the output, adding a newline.""" diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py index 378c901d7..96e7ffb9c 100644 --- a/tests/test_cmdline.py +++ b/tests/test_cmdline.py @@ -585,6 +585,11 @@ def test_report(self): cov.load() cov.report(show_missing=None) """) + self.cmd_executes("report --format=markdown", """\ + cov = Coverage() + cov.load() + cov.report(output_format="markdown") + """) def test_run(self): # coverage run [-p] [-L] [--timid] MODULE.py [ARG1 ARG2 ...] diff --git a/tests/test_summary.py b/tests/test_summary.py index 82508de8e..f0f16aa2b 100644 --- a/tests/test_summary.py +++ b/tests/test_summary.py @@ -1001,3 +1001,9 @@ def test_sort_report_by_invalid_option(self): msg = "Invalid sorting option: 'Xyzzy'" with pytest.raises(ConfigError, match=msg): self.get_summary_text(('report:sort', 'Xyzzy')) + + def test_report_with_invalid_format(self): + # Ask for an invalid format. + msg = "Unknown report format choice: 'xyzzy'" + with pytest.raises(ConfigError, match=msg): + self.get_summary_text(('report:format', 'xyzzy')) From 556344babd5210c093eba547d1b15489843f4359 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 15:51:44 -0500 Subject: [PATCH 057/200] refactor: no need for special handling of compiling unicode source This was a holdover from Python 2 days. --- coverage/execfile.py | 4 +- coverage/parser.py | 10 +--- coverage/phystokens.py | 30 ---------- tests/test_parser.py | 5 +- tests/test_phystokens.py | 115 +-------------------------------------- 5 files changed, 8 insertions(+), 156 deletions(-) diff --git a/coverage/execfile.py b/coverage/execfile.py index b5d3a65fd..93dffcd11 100644 --- a/coverage/execfile.py +++ b/coverage/execfile.py @@ -16,7 +16,6 @@ from coverage.exceptions import CoverageException, _ExceptionDuringRun, NoCode, NoSource from coverage.files import canonical_filename, python_reported_file from coverage.misc import isolate_module -from coverage.phystokens import compile_unicode from coverage.python import get_python_source os = isolate_module(os) @@ -274,8 +273,7 @@ def make_code_from_py(filename): except (OSError, NoSource) as exc: raise NoSource(f"No file to run: '{filename}'") from exc - code = compile_unicode(source, filename, "exec") - return code + return compile(source, filename, "exec") def make_code_from_pyc(filename): diff --git a/coverage/parser.py b/coverage/parser.py index c4fef9ceb..135a3b183 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -15,7 +15,7 @@ from coverage.debug import short_stack from coverage.exceptions import NoSource, NotPython, _StopEverything from coverage.misc import contract, join_regex, new_contract, nice_pair, one_of -from coverage.phystokens import compile_unicode, generate_tokens, neuter_encoding_declaration +from coverage.phystokens import generate_tokens class PythonParser: @@ -359,7 +359,7 @@ def __init__(self, text, code=None, filename=None): self.code = code else: try: - self.code = compile_unicode(text, filename, "exec") + self.code = compile(text, filename, "exec") except SyntaxError as synerr: raise NotPython( "Couldn't parse '%s' as Python source: '%s' at line %d" % ( @@ -624,17 +624,13 @@ def __init__(self, body): # TODO: the cause messages have too many commas. # TODO: Shouldn't the cause messages join with "and" instead of "or"? -def ast_parse(text): - """How we create an AST parse.""" - return ast.parse(neuter_encoding_declaration(text)) - class AstArcAnalyzer: """Analyze source text with an AST to find executable code paths.""" @contract(text='unicode', statements=set) def __init__(self, text, statements, multiline): - self.root_node = ast_parse(text) + self.root_node = ast.parse(text) # TODO: I think this is happening in too many places. self.statements = {multiline.get(l, l) for l in statements} self.multiline = multiline diff --git a/coverage/phystokens.py b/coverage/phystokens.py index c6dc1e0a9..07ad53497 100644 --- a/coverage/phystokens.py +++ b/coverage/phystokens.py @@ -184,8 +184,6 @@ def generate_tokens(self, text): generate_tokens = CachedTokenizer().generate_tokens -COOKIE_RE = re.compile(r"^[ \t]*#.*coding[:=][ \t]*([-\w.]+)", flags=re.MULTILINE) - @contract(source='bytes') def source_encoding(source): """Determine the encoding for `source`, according to PEP 263. @@ -197,31 +195,3 @@ def source_encoding(source): """ readline = iter(source.splitlines(True)).__next__ return tokenize.detect_encoding(readline)[0] - - -@contract(source='unicode') -def compile_unicode(source, filename, mode): - """Just like the `compile` builtin, but works on any Unicode string. - - Python 2's compile() builtin has a stupid restriction: if the source string - is Unicode, then it may not have a encoding declaration in it. Why not? - Who knows! It also decodes to utf-8, and then tries to interpret those - utf-8 bytes according to the encoding declaration. Why? Who knows! - - This function neuters the coding declaration, and compiles it. - - """ - source = neuter_encoding_declaration(source) - code = compile(source, filename, mode) - return code - - -@contract(source='unicode', returns='unicode') -def neuter_encoding_declaration(source): - """Return `source`, with any encoding declaration neutered.""" - if COOKIE_RE.search(source): - source_lines = source.splitlines(True) - for lineno in range(min(2, len(source_lines))): - source_lines[lineno] = COOKIE_RE.sub("# (deleted declaration)", source_lines[lineno]) - source = "".join(source_lines) - return source diff --git a/tests/test_parser.py b/tests/test_parser.py index 6d181c9eb..b13c32fef 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -3,6 +3,7 @@ """Tests for coverage.py's code parsing.""" +import ast import os.path import textwrap import warnings @@ -11,7 +12,7 @@ from coverage import env from coverage.exceptions import NotPython -from coverage.parser import ast_dump, ast_parse, PythonParser +from coverage.parser import ast_dump, PythonParser from tests.coveragetest import CoverageTest, TESTS_DIR from tests.helpers import arcz_to_arcs, re_lines, xfail_pypy_3749 @@ -530,7 +531,7 @@ def test_ast_dump(): with warnings.catch_warnings(): # stress_phystoken.tok has deprecation warnings, suppress them. warnings.filterwarnings("ignore", message=r".*invalid escape sequence",) - ast_root = ast_parse(source) + ast_root = ast.parse(source) result = [] ast_dump(ast_root, print=result.append) if num_lines < 100: diff --git a/tests/test_phystokens.py b/tests/test_phystokens.py index 8a8b85067..da37cead5 100644 --- a/tests/test_phystokens.py +++ b/tests/test_phystokens.py @@ -12,7 +12,6 @@ from coverage import env from coverage.phystokens import source_token_lines, source_encoding -from coverage.phystokens import neuter_encoding_declaration, compile_unicode from coverage.python import get_python_source from tests.coveragetest import CoverageTest, TESTS_DIR @@ -147,7 +146,7 @@ def match(): assert tokens[11][3] == ("nam", "case") -# The default encoding is different in Python 2 and Python 3. +# The default source file encoding. DEF_ENCODING = "utf-8" @@ -206,115 +205,3 @@ def test_unknown_encoding(self): source = b"# coding: klingon\n" with pytest.raises(SyntaxError, match="unknown encoding: klingon"): source_encoding(source) - - -class NeuterEncodingDeclarationTest(CoverageTest): - """Tests of phystokens.neuter_encoding_declaration().""" - - run_in_temp_dir = False - - def test_neuter_encoding_declaration(self): - for lines_diff_expected, source, _ in ENCODING_DECLARATION_SOURCES: - neutered = neuter_encoding_declaration(source.decode("ascii")) - neutered = neutered.encode("ascii") - - # The neutered source should have the same number of lines. - source_lines = source.splitlines() - neutered_lines = neutered.splitlines() - assert len(source_lines) == len(neutered_lines) - - # Only one of the lines should be different. - lines_different = sum( - int(nline != sline) for nline, sline in zip(neutered_lines, source_lines) - ) - assert lines_diff_expected == lines_different - - # The neutered source will be detected as having no encoding - # declaration. - assert source_encoding(neutered) == DEF_ENCODING, f"Wrong encoding in {neutered!r}" - - def test_two_encoding_declarations(self): - input_src = textwrap.dedent("""\ - # -*- coding: ascii -*- - # -*- coding: utf-8 -*- - # -*- coding: utf-16 -*- - """) - expected_src = textwrap.dedent("""\ - # (deleted declaration) -*- - # (deleted declaration) -*- - # -*- coding: utf-16 -*- - """) - output_src = neuter_encoding_declaration(input_src) - assert expected_src == output_src - - def test_one_encoding_declaration(self): - input_src = textwrap.dedent("""\ - # -*- coding: utf-16 -*- - # Just a comment. - # -*- coding: ascii -*- - """) - expected_src = textwrap.dedent("""\ - # (deleted declaration) -*- - # Just a comment. - # -*- coding: ascii -*- - """) - output_src = neuter_encoding_declaration(input_src) - assert expected_src == output_src - - -class Bug529Test(CoverageTest): - """Test of bug 529""" - - def test_bug_529(self): - # Don't over-neuter coding declarations. This happened with a test - # file which contained code in multi-line strings, all with coding - # declarations. The neutering of the file also changed the multi-line - # strings, which it shouldn't have. - self.make_file("the_test.py", '''\ - # -*- coding: utf-8 -*- - import unittest - class Bug529Test(unittest.TestCase): - def test_two_strings_are_equal(self): - src1 = u"""\\ - # -*- coding: utf-8 -*- - # Just a comment. - """ - src2 = u"""\\ - # -*- coding: utf-8 -*- - # Just a comment. - """ - self.assertEqual(src1, src2) - - if __name__ == "__main__": - unittest.main() - ''') - status, out = self.run_command_status("coverage run the_test.py") - assert status == 0 - assert "OK" in out - # If this test fails, the output will be super-confusing, because it - # has a failing unit test contained within the failing unit test. - - -class CompileUnicodeTest(CoverageTest): - """Tests of compiling Unicode strings.""" - - run_in_temp_dir = False - - def assert_compile_unicode(self, source): - """Assert that `source` will compile properly with `compile_unicode`.""" - source += "a = 42\n" - # This doesn't raise an exception: - code = compile_unicode(source, "", "exec") - globs = {} - exec(code, globs) - assert globs['a'] == 42 - - def test_cp1252(self): - uni = """# coding: cp1252\n# \u201C curly \u201D\n""" - self.assert_compile_unicode(uni) - - def test_double_coding_declaration(self): - # Build this string in a weird way so that actual vim's won't try to - # interpret it... - uni = "# -*- coding:utf-8 -*-\n# v" + "im: fileencoding=utf-8\n" - self.assert_compile_unicode(uni) From 9c26c9580b95c782614397a218f8730169fffc12 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Nov 2022 15:52:15 -0500 Subject: [PATCH 058/200] refactor: remove mention of Python 2 unicode --- coverage/summary.py | 3 +-- tests/helpers.py | 4 ++-- tests/test_plugins.py | 8 -------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/coverage/summary.py b/coverage/summary.py index 24aa30f2d..464445ef1 100644 --- a/coverage/summary.py +++ b/coverage/summary.py @@ -150,8 +150,7 @@ def _report_markdown(self, header, lines_values, total_line, end_lines): def report(self, morfs, outfile=None): """Writes a report summarizing coverage statistics per module. - `outfile` is a file object to write the summary to. It must be opened - for native strings (bytes on Python 2, Unicode on Python 3). + `outfile` is a text-mode file object to write the summary to. """ self.outfile = outfile or sys.stdout diff --git a/tests/helpers.py b/tests/helpers.py index 446edce03..fbdf13978 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -62,8 +62,8 @@ def make_file(filename, text="", bytes=b"", newline=None): `filename` is the relative path to the file, including directories if desired, which will be created if need be. - `text` is the content to create in the file, a native string (bytes in - Python 2, unicode in Python 3), or `bytes` are the bytes to write. + `text` is the text content to create in the file, or `bytes` are the + bytes to write. If `newline` is provided, it is a string that will be used as the line endings in the created file, otherwise the line endings are as provided diff --git a/tests/test_plugins.py b/tests/test_plugins.py index b4239700d..cd4464415 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -343,9 +343,6 @@ def helper(x): # quux_5.html will be omitted from the results. assert render("quux_5.html", 3) == "[quux_5.html @ 3]" - - # For Python 2, make sure unicode is working. - assert render(u"uni_3.html", 2) == "[uni_3.html @ 2]" """) # will try to read the actual source files, so make some @@ -382,11 +379,6 @@ def test_plugin2(self): assert "quux_5.html" not in line_counts(cov.get_data()) - _, statements, missing, _ = cov.analysis("uni_3.html") - assert statements == [1, 2, 3] - assert missing == [1] - assert "uni_3.html" in line_counts(cov.get_data()) - def test_plugin2_with_branch(self): self.make_render_and_caller() From 8e850ca49ebf6b746d0a9cf790f1028bed5e21f8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 7 Nov 2022 16:23:33 -0500 Subject: [PATCH 059/200] chore: make upgrade --- requirements/dev.pip | 137 ++++++++++++++++----------------- requirements/kit.pip | 12 +-- requirements/light-threads.pip | 120 ++++++++++++++--------------- requirements/lint.pip | 137 ++++++++++++++++----------------- requirements/pip-tools.pip | 12 +-- requirements/pip.pip | 12 +-- requirements/tox.pip | 6 +- 7 files changed, 214 insertions(+), 222 deletions(-) diff --git a/requirements/dev.pip b/requirements/dev.pip index 96c2829ba..89de6a989 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -105,67 +105,64 @@ future==0.18.2 \ # via # -r requirements/pytest.pip # pycontracts -greenlet==2.0.0.post0 \ - --hash=sha256:00ebdaf0fa51c284fd2172837d751731a15971e0c20d1a9163cfbdf620ce8b49 \ - --hash=sha256:029ca674b3a7e8427db8f5c65d5ed4e24a7417af2a415a5958598aefd71980c4 \ - --hash=sha256:02bdb1e373b275bd705c43b249426e776c4f8a8ff2afaf8ec5ea0dde487d8a14 \ - --hash=sha256:08dc04f49ed1ea5e6772bb5e8cf2a77d1b1744566f4eca471a55b35af1278b31 \ - --hash=sha256:08f44e938d142271b954405afb6570e0be48a9f556b6bf4d42d2e3ae6a251fad \ - --hash=sha256:0a5c03e2a68ec2ff1cba74ceaed899ec8cd353285f4f985c30c8cfbef9d3a3be \ - --hash=sha256:0fee3240093b745efc857392f09379514ad84db4ca324514594bbdf6380016c8 \ - --hash=sha256:118e708dd7bc88beaeeaa5a8601a7743b8835b7bbaf7c8f23ffa78f8bc8faf28 \ - --hash=sha256:13d492a807a5c7334b5931e9b6d9b181991ccc6a40555a7b177f189feff59b4b \ - --hash=sha256:1cac9e9895aeff26434325404558783ee54f4ff3aec8daa56b8706796f7b01a0 \ - --hash=sha256:2146d15429b4eeb412428737594acb5660a5bc0fdd1488d8a2a74a5ee32391fa \ - --hash=sha256:21ee1ae26d072b195edea764218623f6c15eba4ae06816908f33c82e0af018d3 \ - --hash=sha256:22eca421e3f2f3c18f4f54c0ff525aa9d397c6f116fce9ebd37b420174dbc027 \ - --hash=sha256:2bab49783858cf724fff6868395cbeb81d1188cba23616b53e79de0beda29f42 \ - --hash=sha256:2fbdec204ca40b3d0c0992a19c1ba627441c17983ac4ffc45baec7f5f53e20ca \ - --hash=sha256:30ce47525f9a1515566429ac7de6b1ae76d32c3ccede256e3517a1a6419cf659 \ - --hash=sha256:335dcf676d5e4122e4006c16ae11eda2467af5461b949c265ce120b6b959ffe2 \ - --hash=sha256:3407b843b05da71fef0f1dd666059c08ad0e0f4afc3b9c93c998a2e53fac95e5 \ - --hash=sha256:35827f98fd0d768862b8f15777e6dbb03fe6ac6e7bd1bee3f3ded4536f350347 \ - --hash=sha256:3a22e5988f9d66b3e9ae9583bf9d8ef792b09f23afeb78707e6a4f47ab57cc5e \ - --hash=sha256:3c3327da2bdab61078e42e695307465c425671a5a9251e6c29ee130d51943f28 \ - --hash=sha256:3ca723dfc2789c1fb991809822811896b198ecf0909dbccea4a07170d18c3e1b \ - --hash=sha256:46156ae88ee71c37b6c4f7af63fff5d3ab8f45ef72e1a660bcf6386c1647f106 \ - --hash=sha256:4bbe2d074292e3646704371eb640ee52c386d633ed72ff223dadcd3fe8ecd8f9 \ - --hash=sha256:4c4310f0e42154995d92810f27b44ab7116a4a696feb0ff141ae2de59196efd7 \ - --hash=sha256:4cfa629de5b2dea27c81b334c4536463e9a49ac0877e2008a276d58d4c72868a \ - --hash=sha256:4e144ab0de56b4d2a2cf0d2fb9d568b59fce49aab3e129badf17c12b0252047d \ - --hash=sha256:4ea67f303cec384b148774667c7e3cf02311e7026fc02bdcdcd206dfe4ea4fc9 \ - --hash=sha256:538c9e8f65a32413ace426f8117ef019021adf8175f7c491fed65f5fe2083e0c \ - --hash=sha256:56565ac9ab4ff3dd473bfe959e0bf2a5062aabb89b7c94cabb417beb162c9fff \ - --hash=sha256:5e22485256bb1c60bbcc6f8509b1a11042358a2462d5ecdb9a82dc472d2fdd60 \ - --hash=sha256:602a69c24f1a9755dd1760b3b31bdfc495c4613260c876a01b7e6d5eb9bcae1b \ - --hash=sha256:6393ec3cecda53b20241e88bc33d87cbd8126cc10870fc69fa16ca2e20a5ac1b \ - --hash=sha256:6442bbfb047dc1e47658954b72e1589f2bc4e12e67d51bbad0059a626180daa1 \ - --hash=sha256:666d2a0b269a68cd4fe0976544ab97970c5334d35d0e47ae9be1723f734d8204 \ - --hash=sha256:697cfbfc19815c40213badcfe5f076418e0f9100cd25a66f513f32c1026b8bf4 \ - --hash=sha256:6a1a6745c5dce202aa3f29a1736c53cf2179e9c3b280dc62cea9cb8c69977c83 \ - --hash=sha256:6fc73fc8dd81d9efa842a55033b6b4cb233b134a0270e127c6874d053ef2049b \ - --hash=sha256:7e9e0d4c5c618b0442396715ffe6c2f84a60d593dad7e0184388aed36d568a65 \ - --hash=sha256:81fdcf7c0c2df46a99ca421a552c4370117851c5e4dbd6cb53d569b896d62322 \ - --hash=sha256:8b26932be686f3582df039d79fe96f7ca13d63b39468162f816f9ff29584b9a4 \ - --hash=sha256:8b7e5191b974fb66fcbac1818ba494d3512da9cf6eaef7acd952f9862eaaa20c \ - --hash=sha256:8c80e9c41a83d8c90399af8c7dcdeae0c03c48b40b9d0ab84457533d5d7882bf \ - --hash=sha256:9f2f110b9cc325f6543e0e3f4ab8008c272a59052f9464047c29d4be4511ce05 \ - --hash=sha256:a339e510a079dc8372e39ce1c7629414db51966235c9670c58d529def79243a2 \ - --hash=sha256:ad9abc3e4d2370cecb524421cc5c8a664006aa11d5c1cb3c9250e3bf65ab546e \ - --hash=sha256:b043782c8f6cccc8fae3a16db397eca1d36a41b0706cbf6f514aea1e1a260bab \ - --hash=sha256:b31de27313abbb567c528ed123380fcf18a5dfd03134570dfd12227e21ac1184 \ - --hash=sha256:b75e5644cc353328cd57ec8dafaaf5f81b2c3ecf7c4b278b907e99ad53ba7839 \ - --hash=sha256:b8cfc8fc944bd7b704691bc28225a2635e377e92dc413459845868d3f7724982 \ - --hash=sha256:c2055c52260808d87622293b57df1c68aeb12ddd8a0cfc0223fb57a5f629e202 \ - --hash=sha256:c416106b3b8e905b6ab0e84ec90047a6401021aa023f9aa93978e57cd8f8189f \ - --hash=sha256:d0e210e17a6181a3fd3f8dce957043a4e74177ffa9f295514984b2b633940dce \ - --hash=sha256:d9453135e48cd631e3e9f06d9da9100d17c9f662e4a6d8b552c29be6c834a6b9 \ - --hash=sha256:dd0198006278291d9469309d655093df1f5e5107c0261e242b5f390baee32199 \ - --hash=sha256:e1781bda1e787d3ad33788cc3be47f6e47a9581676d02670c15ee36c9460adfe \ - --hash=sha256:e56a5a9f303e3ac011ba445a6d84f05d08666bf8db094afafcec5228622c30f5 \ - --hash=sha256:e93ae35f0fd3caf75e58c76a1cab71e6ece169aaa1b281782ef9efde0a6b83f2 \ - --hash=sha256:eb36b6570646227a63eda03916f1cc6f3744ee96d28f7a0a5629c59267a8055f \ - --hash=sha256:f8c425a130e04d5404edaf6f5906e5ab12f3aa1168a1828aba6dfadac5910469 +greenlet==2.0.1 \ + --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ + --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: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:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ + --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ + --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ + --hash=sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a \ + --hash=sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1 \ + --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ + --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in hypothesis==6.56.4 \ --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ @@ -207,9 +204,9 @@ jedi==0.18.1 \ --hash=sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d \ --hash=sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab # via pudb -keyring==23.10.0 \ - --hash=sha256:373e29a1bda7f42247c0db0fa13026c770fa8ff995a7475769357e48743761df \ - --hash=sha256:6f457494bb207053c97443656e92ebcc4e2957c5c529028d9eaf4daf40a94483 +keyring==23.11.0 \ + --hash=sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e \ + --hash=sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361 # via twine lazy-object-proxy==1.8.0 \ --hash=sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada \ @@ -273,9 +270,9 @@ pkginfo==1.8.3 \ --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c # via twine -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.3 \ + --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ + --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 # via # -r requirements/pip.pip # pylint @@ -529,9 +526,9 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -pip==22.3 \ - --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ - --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 +pip==22.3.1 \ + --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ + --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via -r requirements/pip.pip setuptools==65.5.1 \ --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ diff --git a/requirements/kit.pip b/requirements/kit.pip index 4454edc53..a9850ca32 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -53,9 +53,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.3 \ + --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ + --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 # via cibuildwheel pyelftools==0.29 \ --hash=sha256:519f38cf412f073b2d7393aa4682b0190fa901f7c3fa0bff2b82d537690c7fc1 \ @@ -78,9 +78,9 @@ typing-extensions==4.4.0 \ # via # cibuildwheel # importlib-metadata -wheel==0.38.1 \ - --hash=sha256:7a95f9a8dc0924ef318bd55b616112c70903192f524d120acc614f59547a9e1f \ - --hash=sha256:ea041edf63f4ccba53ad6e035427997b3bb10ee88a4cd014ae82aeb9eea77bb9 +wheel==0.38.2 \ + --hash=sha256:3d492ef22379a156ec923d2a77051cedfd4df4b667864e9e41ba83f0b70b7149 \ + --hash=sha256:7a5a3095dceca97a3cac869b8fef4e89b83fafde21b6688f47b6fda7600eb441 # via -r requirements/kit.in zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index af1c67d15..3e11fc550 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -98,6 +98,7 @@ gevent==22.10.2 \ --hash=sha256:494c7f29e94df9a1c3157d67bb7edfa32a46eed786e04d9ee68d39f375e30001 \ --hash=sha256:4e2f008c82dc54ec94f4de12ca6feea60e419babb48ec145456907ae61625aa4 \ --hash=sha256:54f4bfd74c178351a4a05c5c7df6f8a0a279ff6f392b57608ce0e83c768207f9 \ + --hash=sha256:58898dbabb5b11e4d0192aae165ad286dc6742c543e1be9d30dc82753547c508 \ --hash=sha256:59b47e81b399d49a5622f0f503c59f1ce57b7705306ea0196818951dfc2f36c8 \ --hash=sha256:6c04ee32c11e9fcee47c1b431834878dc987a7a2cc4fe126ddcae3bad723ce89 \ --hash=sha256:84c517e33ed604fa06b7d756dc0171169cc12f7fdd68eb7b17708a62eebf4516 \ @@ -128,67 +129,64 @@ gevent==22.10.2 \ --hash=sha256:f3329bedbba4d3146ae58c667e0f9ac1e6f1e1e6340c7593976cdc60aa7d1a47 \ --hash=sha256:f7ed2346eb9dc4344f9cb0d7963ce5b74fe16fdd031a2809bb6c2b6eba7ebcd5 # via -r requirements/light-threads.in -greenlet==2.0.0.post0 \ - --hash=sha256:00ebdaf0fa51c284fd2172837d751731a15971e0c20d1a9163cfbdf620ce8b49 \ - --hash=sha256:029ca674b3a7e8427db8f5c65d5ed4e24a7417af2a415a5958598aefd71980c4 \ - --hash=sha256:02bdb1e373b275bd705c43b249426e776c4f8a8ff2afaf8ec5ea0dde487d8a14 \ - --hash=sha256:08dc04f49ed1ea5e6772bb5e8cf2a77d1b1744566f4eca471a55b35af1278b31 \ - --hash=sha256:08f44e938d142271b954405afb6570e0be48a9f556b6bf4d42d2e3ae6a251fad \ - --hash=sha256:0a5c03e2a68ec2ff1cba74ceaed899ec8cd353285f4f985c30c8cfbef9d3a3be \ - --hash=sha256:0fee3240093b745efc857392f09379514ad84db4ca324514594bbdf6380016c8 \ - --hash=sha256:118e708dd7bc88beaeeaa5a8601a7743b8835b7bbaf7c8f23ffa78f8bc8faf28 \ - --hash=sha256:13d492a807a5c7334b5931e9b6d9b181991ccc6a40555a7b177f189feff59b4b \ - --hash=sha256:1cac9e9895aeff26434325404558783ee54f4ff3aec8daa56b8706796f7b01a0 \ - --hash=sha256:2146d15429b4eeb412428737594acb5660a5bc0fdd1488d8a2a74a5ee32391fa \ - --hash=sha256:21ee1ae26d072b195edea764218623f6c15eba4ae06816908f33c82e0af018d3 \ - --hash=sha256:22eca421e3f2f3c18f4f54c0ff525aa9d397c6f116fce9ebd37b420174dbc027 \ - --hash=sha256:2bab49783858cf724fff6868395cbeb81d1188cba23616b53e79de0beda29f42 \ - --hash=sha256:2fbdec204ca40b3d0c0992a19c1ba627441c17983ac4ffc45baec7f5f53e20ca \ - --hash=sha256:30ce47525f9a1515566429ac7de6b1ae76d32c3ccede256e3517a1a6419cf659 \ - --hash=sha256:335dcf676d5e4122e4006c16ae11eda2467af5461b949c265ce120b6b959ffe2 \ - --hash=sha256:3407b843b05da71fef0f1dd666059c08ad0e0f4afc3b9c93c998a2e53fac95e5 \ - --hash=sha256:35827f98fd0d768862b8f15777e6dbb03fe6ac6e7bd1bee3f3ded4536f350347 \ - --hash=sha256:3a22e5988f9d66b3e9ae9583bf9d8ef792b09f23afeb78707e6a4f47ab57cc5e \ - --hash=sha256:3c3327da2bdab61078e42e695307465c425671a5a9251e6c29ee130d51943f28 \ - --hash=sha256:3ca723dfc2789c1fb991809822811896b198ecf0909dbccea4a07170d18c3e1b \ - --hash=sha256:46156ae88ee71c37b6c4f7af63fff5d3ab8f45ef72e1a660bcf6386c1647f106 \ - --hash=sha256:4bbe2d074292e3646704371eb640ee52c386d633ed72ff223dadcd3fe8ecd8f9 \ - --hash=sha256:4c4310f0e42154995d92810f27b44ab7116a4a696feb0ff141ae2de59196efd7 \ - --hash=sha256:4cfa629de5b2dea27c81b334c4536463e9a49ac0877e2008a276d58d4c72868a \ - --hash=sha256:4e144ab0de56b4d2a2cf0d2fb9d568b59fce49aab3e129badf17c12b0252047d \ - --hash=sha256:4ea67f303cec384b148774667c7e3cf02311e7026fc02bdcdcd206dfe4ea4fc9 \ - --hash=sha256:538c9e8f65a32413ace426f8117ef019021adf8175f7c491fed65f5fe2083e0c \ - --hash=sha256:56565ac9ab4ff3dd473bfe959e0bf2a5062aabb89b7c94cabb417beb162c9fff \ - --hash=sha256:5e22485256bb1c60bbcc6f8509b1a11042358a2462d5ecdb9a82dc472d2fdd60 \ - --hash=sha256:602a69c24f1a9755dd1760b3b31bdfc495c4613260c876a01b7e6d5eb9bcae1b \ - --hash=sha256:6393ec3cecda53b20241e88bc33d87cbd8126cc10870fc69fa16ca2e20a5ac1b \ - --hash=sha256:6442bbfb047dc1e47658954b72e1589f2bc4e12e67d51bbad0059a626180daa1 \ - --hash=sha256:666d2a0b269a68cd4fe0976544ab97970c5334d35d0e47ae9be1723f734d8204 \ - --hash=sha256:697cfbfc19815c40213badcfe5f076418e0f9100cd25a66f513f32c1026b8bf4 \ - --hash=sha256:6a1a6745c5dce202aa3f29a1736c53cf2179e9c3b280dc62cea9cb8c69977c83 \ - --hash=sha256:6fc73fc8dd81d9efa842a55033b6b4cb233b134a0270e127c6874d053ef2049b \ - --hash=sha256:7e9e0d4c5c618b0442396715ffe6c2f84a60d593dad7e0184388aed36d568a65 \ - --hash=sha256:81fdcf7c0c2df46a99ca421a552c4370117851c5e4dbd6cb53d569b896d62322 \ - --hash=sha256:8b26932be686f3582df039d79fe96f7ca13d63b39468162f816f9ff29584b9a4 \ - --hash=sha256:8b7e5191b974fb66fcbac1818ba494d3512da9cf6eaef7acd952f9862eaaa20c \ - --hash=sha256:8c80e9c41a83d8c90399af8c7dcdeae0c03c48b40b9d0ab84457533d5d7882bf \ - --hash=sha256:9f2f110b9cc325f6543e0e3f4ab8008c272a59052f9464047c29d4be4511ce05 \ - --hash=sha256:a339e510a079dc8372e39ce1c7629414db51966235c9670c58d529def79243a2 \ - --hash=sha256:ad9abc3e4d2370cecb524421cc5c8a664006aa11d5c1cb3c9250e3bf65ab546e \ - --hash=sha256:b043782c8f6cccc8fae3a16db397eca1d36a41b0706cbf6f514aea1e1a260bab \ - --hash=sha256:b31de27313abbb567c528ed123380fcf18a5dfd03134570dfd12227e21ac1184 \ - --hash=sha256:b75e5644cc353328cd57ec8dafaaf5f81b2c3ecf7c4b278b907e99ad53ba7839 \ - --hash=sha256:b8cfc8fc944bd7b704691bc28225a2635e377e92dc413459845868d3f7724982 \ - --hash=sha256:c2055c52260808d87622293b57df1c68aeb12ddd8a0cfc0223fb57a5f629e202 \ - --hash=sha256:c416106b3b8e905b6ab0e84ec90047a6401021aa023f9aa93978e57cd8f8189f \ - --hash=sha256:d0e210e17a6181a3fd3f8dce957043a4e74177ffa9f295514984b2b633940dce \ - --hash=sha256:d9453135e48cd631e3e9f06d9da9100d17c9f662e4a6d8b552c29be6c834a6b9 \ - --hash=sha256:dd0198006278291d9469309d655093df1f5e5107c0261e242b5f390baee32199 \ - --hash=sha256:e1781bda1e787d3ad33788cc3be47f6e47a9581676d02670c15ee36c9460adfe \ - --hash=sha256:e56a5a9f303e3ac011ba445a6d84f05d08666bf8db094afafcec5228622c30f5 \ - --hash=sha256:e93ae35f0fd3caf75e58c76a1cab71e6ece169aaa1b281782ef9efde0a6b83f2 \ - --hash=sha256:eb36b6570646227a63eda03916f1cc6f3744ee96d28f7a0a5629c59267a8055f \ - --hash=sha256:f8c425a130e04d5404edaf6f5906e5ab12f3aa1168a1828aba6dfadac5910469 +greenlet==2.0.1 \ + --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ + --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: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:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ + --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ + --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ + --hash=sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a \ + --hash=sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1 \ + --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ + --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via # -r requirements/light-threads.in # eventlet diff --git a/requirements/lint.pip b/requirements/lint.pip index 0275d8e67..500abb1e5 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -120,67 +120,64 @@ future==0.18.2 \ # via # -r requirements/pytest.pip # pycontracts -greenlet==2.0.0.post0 \ - --hash=sha256:00ebdaf0fa51c284fd2172837d751731a15971e0c20d1a9163cfbdf620ce8b49 \ - --hash=sha256:029ca674b3a7e8427db8f5c65d5ed4e24a7417af2a415a5958598aefd71980c4 \ - --hash=sha256:02bdb1e373b275bd705c43b249426e776c4f8a8ff2afaf8ec5ea0dde487d8a14 \ - --hash=sha256:08dc04f49ed1ea5e6772bb5e8cf2a77d1b1744566f4eca471a55b35af1278b31 \ - --hash=sha256:08f44e938d142271b954405afb6570e0be48a9f556b6bf4d42d2e3ae6a251fad \ - --hash=sha256:0a5c03e2a68ec2ff1cba74ceaed899ec8cd353285f4f985c30c8cfbef9d3a3be \ - --hash=sha256:0fee3240093b745efc857392f09379514ad84db4ca324514594bbdf6380016c8 \ - --hash=sha256:118e708dd7bc88beaeeaa5a8601a7743b8835b7bbaf7c8f23ffa78f8bc8faf28 \ - --hash=sha256:13d492a807a5c7334b5931e9b6d9b181991ccc6a40555a7b177f189feff59b4b \ - --hash=sha256:1cac9e9895aeff26434325404558783ee54f4ff3aec8daa56b8706796f7b01a0 \ - --hash=sha256:2146d15429b4eeb412428737594acb5660a5bc0fdd1488d8a2a74a5ee32391fa \ - --hash=sha256:21ee1ae26d072b195edea764218623f6c15eba4ae06816908f33c82e0af018d3 \ - --hash=sha256:22eca421e3f2f3c18f4f54c0ff525aa9d397c6f116fce9ebd37b420174dbc027 \ - --hash=sha256:2bab49783858cf724fff6868395cbeb81d1188cba23616b53e79de0beda29f42 \ - --hash=sha256:2fbdec204ca40b3d0c0992a19c1ba627441c17983ac4ffc45baec7f5f53e20ca \ - --hash=sha256:30ce47525f9a1515566429ac7de6b1ae76d32c3ccede256e3517a1a6419cf659 \ - --hash=sha256:335dcf676d5e4122e4006c16ae11eda2467af5461b949c265ce120b6b959ffe2 \ - --hash=sha256:3407b843b05da71fef0f1dd666059c08ad0e0f4afc3b9c93c998a2e53fac95e5 \ - --hash=sha256:35827f98fd0d768862b8f15777e6dbb03fe6ac6e7bd1bee3f3ded4536f350347 \ - --hash=sha256:3a22e5988f9d66b3e9ae9583bf9d8ef792b09f23afeb78707e6a4f47ab57cc5e \ - --hash=sha256:3c3327da2bdab61078e42e695307465c425671a5a9251e6c29ee130d51943f28 \ - --hash=sha256:3ca723dfc2789c1fb991809822811896b198ecf0909dbccea4a07170d18c3e1b \ - --hash=sha256:46156ae88ee71c37b6c4f7af63fff5d3ab8f45ef72e1a660bcf6386c1647f106 \ - --hash=sha256:4bbe2d074292e3646704371eb640ee52c386d633ed72ff223dadcd3fe8ecd8f9 \ - --hash=sha256:4c4310f0e42154995d92810f27b44ab7116a4a696feb0ff141ae2de59196efd7 \ - --hash=sha256:4cfa629de5b2dea27c81b334c4536463e9a49ac0877e2008a276d58d4c72868a \ - --hash=sha256:4e144ab0de56b4d2a2cf0d2fb9d568b59fce49aab3e129badf17c12b0252047d \ - --hash=sha256:4ea67f303cec384b148774667c7e3cf02311e7026fc02bdcdcd206dfe4ea4fc9 \ - --hash=sha256:538c9e8f65a32413ace426f8117ef019021adf8175f7c491fed65f5fe2083e0c \ - --hash=sha256:56565ac9ab4ff3dd473bfe959e0bf2a5062aabb89b7c94cabb417beb162c9fff \ - --hash=sha256:5e22485256bb1c60bbcc6f8509b1a11042358a2462d5ecdb9a82dc472d2fdd60 \ - --hash=sha256:602a69c24f1a9755dd1760b3b31bdfc495c4613260c876a01b7e6d5eb9bcae1b \ - --hash=sha256:6393ec3cecda53b20241e88bc33d87cbd8126cc10870fc69fa16ca2e20a5ac1b \ - --hash=sha256:6442bbfb047dc1e47658954b72e1589f2bc4e12e67d51bbad0059a626180daa1 \ - --hash=sha256:666d2a0b269a68cd4fe0976544ab97970c5334d35d0e47ae9be1723f734d8204 \ - --hash=sha256:697cfbfc19815c40213badcfe5f076418e0f9100cd25a66f513f32c1026b8bf4 \ - --hash=sha256:6a1a6745c5dce202aa3f29a1736c53cf2179e9c3b280dc62cea9cb8c69977c83 \ - --hash=sha256:6fc73fc8dd81d9efa842a55033b6b4cb233b134a0270e127c6874d053ef2049b \ - --hash=sha256:7e9e0d4c5c618b0442396715ffe6c2f84a60d593dad7e0184388aed36d568a65 \ - --hash=sha256:81fdcf7c0c2df46a99ca421a552c4370117851c5e4dbd6cb53d569b896d62322 \ - --hash=sha256:8b26932be686f3582df039d79fe96f7ca13d63b39468162f816f9ff29584b9a4 \ - --hash=sha256:8b7e5191b974fb66fcbac1818ba494d3512da9cf6eaef7acd952f9862eaaa20c \ - --hash=sha256:8c80e9c41a83d8c90399af8c7dcdeae0c03c48b40b9d0ab84457533d5d7882bf \ - --hash=sha256:9f2f110b9cc325f6543e0e3f4ab8008c272a59052f9464047c29d4be4511ce05 \ - --hash=sha256:a339e510a079dc8372e39ce1c7629414db51966235c9670c58d529def79243a2 \ - --hash=sha256:ad9abc3e4d2370cecb524421cc5c8a664006aa11d5c1cb3c9250e3bf65ab546e \ - --hash=sha256:b043782c8f6cccc8fae3a16db397eca1d36a41b0706cbf6f514aea1e1a260bab \ - --hash=sha256:b31de27313abbb567c528ed123380fcf18a5dfd03134570dfd12227e21ac1184 \ - --hash=sha256:b75e5644cc353328cd57ec8dafaaf5f81b2c3ecf7c4b278b907e99ad53ba7839 \ - --hash=sha256:b8cfc8fc944bd7b704691bc28225a2635e377e92dc413459845868d3f7724982 \ - --hash=sha256:c2055c52260808d87622293b57df1c68aeb12ddd8a0cfc0223fb57a5f629e202 \ - --hash=sha256:c416106b3b8e905b6ab0e84ec90047a6401021aa023f9aa93978e57cd8f8189f \ - --hash=sha256:d0e210e17a6181a3fd3f8dce957043a4e74177ffa9f295514984b2b633940dce \ - --hash=sha256:d9453135e48cd631e3e9f06d9da9100d17c9f662e4a6d8b552c29be6c834a6b9 \ - --hash=sha256:dd0198006278291d9469309d655093df1f5e5107c0261e242b5f390baee32199 \ - --hash=sha256:e1781bda1e787d3ad33788cc3be47f6e47a9581676d02670c15ee36c9460adfe \ - --hash=sha256:e56a5a9f303e3ac011ba445a6d84f05d08666bf8db094afafcec5228622c30f5 \ - --hash=sha256:e93ae35f0fd3caf75e58c76a1cab71e6ece169aaa1b281782ef9efde0a6b83f2 \ - --hash=sha256:eb36b6570646227a63eda03916f1cc6f3744ee96d28f7a0a5629c59267a8055f \ - --hash=sha256:f8c425a130e04d5404edaf6f5906e5ab12f3aa1168a1828aba6dfadac5910469 +greenlet==2.0.1 \ + --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ + --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: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:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ + --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ + --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ + --hash=sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a \ + --hash=sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1 \ + --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ + --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in hypothesis==6.56.4 \ --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ @@ -232,9 +229,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via sphinx -keyring==23.10.0 \ - --hash=sha256:373e29a1bda7f42247c0db0fa13026c770fa8ff995a7475769357e48743761df \ - --hash=sha256:6f457494bb207053c97443656e92ebcc4e2957c5c529028d9eaf4daf40a94483 +keyring==23.11.0 \ + --hash=sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e \ + --hash=sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361 # via twine lazy-object-proxy==1.8.0 \ --hash=sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada \ @@ -344,9 +341,9 @@ pkginfo==1.8.3 \ --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c # via twine -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.3 \ + --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ + --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 # via # -r requirements/pip.pip # pylint @@ -681,9 +678,9 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -pip==22.3 \ - --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ - --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 +pip==22.3.1 \ + --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ + --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via -r requirements/pip.pip setuptools==65.5.1 \ --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 7c45dcaa0..51e5b814e 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -45,9 +45,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -wheel==0.38.1 \ - --hash=sha256:7a95f9a8dc0924ef318bd55b616112c70903192f524d120acc614f59547a9e1f \ - --hash=sha256:ea041edf63f4ccba53ad6e035427997b3bb10ee88a4cd014ae82aeb9eea77bb9 +wheel==0.38.2 \ + --hash=sha256:3d492ef22379a156ec923d2a77051cedfd4df4b667864e9e41ba83f0b70b7149 \ + --hash=sha256:7a5a3095dceca97a3cac869b8fef4e89b83fafde21b6688f47b6fda7600eb441 # via pip-tools zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ @@ -57,9 +57,9 @@ zipp==3.10.0 \ # pep517 # The following packages are considered to be unsafe in a requirements file: -pip==22.3 \ - --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ - --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 +pip==22.3.1 \ + --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ + --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via pip-tools setuptools==65.5.1 \ --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ diff --git a/requirements/pip.pip b/requirements/pip.pip index 8b8f35118..ed536dc06 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -16,9 +16,9 @@ importlib-metadata==5.0.0 \ --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via virtualenv -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.3 \ + --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ + --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 # via virtualenv typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ @@ -34,7 +34,7 @@ zipp==3.10.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -pip==22.3 \ - --hash=sha256:1daab4b8d3b97d1d763caeb01a4640a2250a0ea899e257b1e44b9eded91e15ab \ - --hash=sha256:8182aec21dad6c0a49a2a3d121a87cd524b950e0b6092b181625f07ebdde7530 +pip==22.3.1 \ + --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ + --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via -r requirements/pip.in diff --git a/requirements/tox.pip b/requirements/tox.pip index bdcfd3efd..811991bdf 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -33,9 +33,9 @@ packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 # via tox -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.3 \ + --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ + --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 # via virtualenv pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ From bc630b58b5d1c58cc8108e584a480f3a1cd5ab70 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 7 Nov 2022 13:52:08 -0500 Subject: [PATCH 060/200] docs: add the snyk package health badge --- README.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index adadd28cd..c049aeab6 100644 --- a/README.rst +++ b/README.rst @@ -17,8 +17,8 @@ Code coverage testing for Python. | |test-status| |quality-status| |docs| |metacov| | |kit| |downloads| |format| |repos| | |stars| |forks| |contributors| -| |tidelift| |core-infrastructure| |open-ssf| -| |sponsor| |twitter-coveragepy| |twitter-nedbat| +| |core-infrastructure| |open-ssf| |snyk| +| |tidelift| |sponsor| |twitter-coveragepy| |twitter-nedbat| Coverage.py measures code coverage, typically during test execution. It uses the code analysis tools and tracing hooks provided in the Python standard @@ -174,3 +174,6 @@ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_. .. |open-ssf| image:: https://api.securityscorecards.dev/projects/github.com/nedbat/coveragepy/badge :target: https://deps.dev/pypi/coverage :alt: OpenSSF Scorecard +.. |snyk| image:: https://snyk.io/advisor/python/coverage/badge.svg + :target: https://snyk.io/advisor/python/coverage + :alt: Snyk package health From 09bc2d6ab0f951c58546dab234edeaa9de7d4c44 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 7 Nov 2022 16:11:26 -0500 Subject: [PATCH 061/200] perf: hash data files during combining to avoid unneeded work. #1483 When generating many parallel data files, often some data files will be exact copies of each other. Checking the hashes, we can avoid combining the duplicates, speeding the process. On a coverage.py metacov, we had 651 duplicates out of 2189 files (29%). The time to combine was reduced by 17%. --- CHANGES.rst | 5 +++ coverage/data.py | 71 +++++++++++++++++++++++++-------------- coverage/sqldata.py | 3 -- doc/dbschema.rst | 3 +- tests/test_api.py | 2 +- tests/test_concurrency.py | 6 +++- 6 files changed, 57 insertions(+), 33 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1f622b72f..969260218 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -29,6 +29,11 @@ Unreleased - Using ``--format=total`` will write a single total number to the output. This can be useful for making badges or writing status updates. +- Combining data files with ``coverage combine`` now quickly hashes the data + files to skip files that provide no new information. This can reduce the + time needed. For coverage.py's own test suite, combining was about 17% + faster. + - An empty file has a coverage total of 100%, but used to fail with ``--fail-under``. This has been fixed, closing `issue 1470`_. diff --git a/coverage/data.py b/coverage/data.py index 4bdfe3010..798d167f9 100644 --- a/coverage/data.py +++ b/coverage/data.py @@ -11,6 +11,7 @@ """ import glob +import hashlib import os.path from coverage.exceptions import CoverageException, NoDataError @@ -110,7 +111,9 @@ def combine_parallel_data( if strict and not files_to_combine: raise NoDataError("No data to combine") - files_combined = 0 + file_hashes = set() + combined_any = False + for f in files_to_combine: if f == data.data_filename(): # Sometimes we are combining into a file which is one of the @@ -118,34 +121,50 @@ def combine_parallel_data( if data._debug.should('dataio'): data._debug.write(f"Skipping combining ourself: {f!r}") continue - if data._debug.should('dataio'): - data._debug.write(f"Combining data file {f!r}") + try: - new_data = CoverageData(f, debug=data._debug) - new_data.read() - except CoverageException as exc: - if data._warn: - # The CoverageException has the file name in it, so just - # use the message as the warning. - data._warn(str(exc)) + rel_file_name = os.path.relpath(f) + except ValueError: + # ValueError can be raised under Windows when os.getcwd() returns a + # folder from a different drive than the drive of f, in which case + # we print the original value of f instead of its relative path + rel_file_name = f + + with open(f, "rb") as fobj: + hasher = hashlib.new("sha3_256") + hasher.update(fobj.read()) + sha = hasher.digest() + combine_this_one = sha not in file_hashes + + delete_this_one = not keep + if combine_this_one: + if data._debug.should('dataio'): + data._debug.write(f"Combining data file {f!r}") + file_hashes.add(sha) + try: + new_data = CoverageData(f, debug=data._debug) + new_data.read() + except CoverageException as exc: + if data._warn: + # The CoverageException has the file name in it, so just + # use the message as the warning. + data._warn(str(exc)) + delete_this_one = False + else: + data.update(new_data, aliases=aliases) + combined_any = True + if message: + message(f"Combined data file {rel_file_name}") else: - data.update(new_data, aliases=aliases) - files_combined += 1 if message: - try: - file_name = os.path.relpath(f) - except ValueError: - # ValueError can be raised under Windows when os.getcwd() returns a - # folder from a different drive than the drive of f, in which case - # we print the original value of f instead of its relative path - file_name = f - message(f"Combined data file {file_name}") - if not keep: - if data._debug.should('dataio'): - data._debug.write(f"Deleting combined data file {f!r}") - file_be_gone(f) - - if strict and not files_combined: + message(f"Skipping duplicate data {rel_file_name}") + + if delete_this_one: + if data._debug.should('dataio'): + data._debug.write(f"Deleting data file {f!r}") + file_be_gone(f) + + if strict and not combined_any: raise NoDataError("No usable data files") diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 2b7730537..2fbc53f5c 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -4,7 +4,6 @@ """SQLite coverage data.""" import collections -import datetime import functools import glob import itertools @@ -56,7 +55,6 @@ -- 'has_arcs' boolean -- Is this data recording branches? -- 'sys_argv' text -- The coverage command line that recorded the data. -- 'version' text -- The version of coverage.py that made the file. - -- 'when' text -- Datetime when the file was created. ); CREATE TABLE file ( @@ -305,7 +303,6 @@ def _init_db(self, db): [ ("sys_argv", str(getattr(sys, "argv", None))), ("version", __version__), - ("when", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), ] ) diff --git a/doc/dbschema.rst b/doc/dbschema.rst index 34e0a55da..42e616d98 100644 --- a/doc/dbschema.rst +++ b/doc/dbschema.rst @@ -70,7 +70,6 @@ This is the database schema: -- 'has_arcs' boolean -- Is this data recording branches? -- 'sys_argv' text -- The coverage command line that recorded the data. -- 'version' text -- The version of coverage.py that made the file. - -- 'when' text -- Datetime when the file was created. ); CREATE TABLE file ( @@ -116,7 +115,7 @@ This is the database schema: foreign key (file_id) references file (id) ); -.. [[[end]]] (checksum: cfce1df016afbb43a5ff94306db56657) +.. [[[end]]] (checksum: 9d87794485a9aa6d9064b735972a3447) .. _numbits: diff --git a/tests/test_api.py b/tests/test_api.py index ce44b9b1c..195452323 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1362,7 +1362,7 @@ def test_combine_no_usable_files(self): # Make bogus data files. self.make_file(".coverage.bad1", "This isn't a coverage data file.") - self.make_file(".coverage.bad2", "This isn't a coverage data file.") + self.make_file(".coverage.bad2", "This isn't a coverage data file either.") # Combine the parallel coverage data files into .coverage, but nothing is readable. cov = coverage.Coverage() diff --git a/tests/test_concurrency.py b/tests/test_concurrency.py index 0a51d4d96..2c8277606 100644 --- a/tests/test_concurrency.py +++ b/tests/test_concurrency.py @@ -484,9 +484,13 @@ def try_multiprocessing_code( out_lines = out.splitlines() assert len(out_lines) == nprocs + 1 assert all( - re.fullmatch(r"Combined data file \.coverage\..*\.\d+\.\d+", line) + re.fullmatch( + r"(Combined data file|Skipping duplicate data) \.coverage\..*\.\d+\.\d+", + line + ) for line in out_lines ) + assert len(glob.glob(".coverage.*")) == 0 out = self.run_command("coverage report -m") last_line = self.squeezed_lines(out)[-1] From b40e3c89d264c021a29db90dcfd3ab58f3f8ab0e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 7 Nov 2022 16:20:38 -0500 Subject: [PATCH 062/200] test: no need to combine during each test run, do it at the end --- igor.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/igor.py b/igor.py index 6f1bd9973..a21fb39b6 100644 --- a/igor.py +++ b/igor.py @@ -205,9 +205,7 @@ def run_tests_with_coverage(tracer, *runner_args): cov.stop() os.remove(pth_path) - cov.combine() cov.save() - return status From 886292408b1363fdf62bd473ec45f9596aae8a67 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 7 Nov 2022 18:13:52 -0500 Subject: [PATCH 063/200] test: simplify the metacov flow a bit - default COVERAGE_METAFILE=.metacov for convenience - don't make json and xml reports, if we need them we'll do it explicitly. --- .github/workflows/coverage.yml | 1 - igor.py | 5 +---- metacov.ini | 4 ++-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 578c909a0..fadad42ae 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -123,7 +123,6 @@ jobs: id: combine env: COVERAGE_RCFILE: "metacov.ini" - COVERAGE_METAFILE: ".metacov" COVERAGE_CONTEXT: "yes" run: | set -xe diff --git a/igor.py b/igor.py index a21fb39b6..d78dff98a 100644 --- a/igor.py +++ b/igor.py @@ -210,18 +210,15 @@ def run_tests_with_coverage(tracer, *runner_args): def do_combine_html(): - """Combine data from a meta-coverage run, and make the HTML and XML reports.""" + """Combine data from a meta-coverage run, and make the HTML report.""" import coverage os.environ['COVERAGE_HOME'] = os.getcwd() - os.environ['COVERAGE_METAFILE'] = os.path.abspath(".metacov") cov = coverage.Coverage(config_file="metacov.ini") cov.load() cov.combine() cov.save() show_contexts = bool(os.environ.get('COVERAGE_DYNCTX') or os.environ.get('COVERAGE_CONTEXT')) cov.html_report(show_contexts=show_contexts) - cov.xml_report() - cov.json_report(pretty_print=True) def do_test_with_tracer(tracer, *runner_args): diff --git a/metacov.ini b/metacov.ini index a18dff82d..29251f368 100644 --- a/metacov.ini +++ b/metacov.ini @@ -8,7 +8,7 @@ [run] branch = true -data_file = ${COVERAGE_METAFILE?} +data_file = ${COVERAGE_METAFILE-.metacov} parallel = true relative_files = true source = @@ -20,7 +20,7 @@ dynamic_context = ${COVERAGE_DYNCTX-none} context = ${COVERAGE_CONTEXT-none} [report] -# We set a different pragmas so our code won't be confused with test code, and +# We set different pragmas so our code won't be confused with test code, and # we use different pragmas for different reasons that the lines won't be # measured. exclude_lines = From bb27eb6c844204b979fe76f0f47c7869ef1c2362 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 8 Nov 2022 06:22:30 -0500 Subject: [PATCH 064/200] test: this loop never finishes, and that's fine Because the last pattern in G2RX_TOKENS is ".", so it always matches. --- coverage/files.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coverage/files.py b/coverage/files.py index 76ecbef9d..82f4df310 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -309,7 +309,7 @@ def _glob_to_regex(pattern): path_rx = [] pos = 0 while pos < len(pattern): - for rx, sub in G2RX_TOKENS: + for rx, sub in G2RX_TOKENS: # pragma: always breaks m = rx.match(pattern, pos=pos) if m: if sub is None: From 66657c17d33ccdffa8ca95c8efa9bd4d64bddf5e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 8 Nov 2022 05:30:29 -0500 Subject: [PATCH 065/200] fix: path-mapped results shouldn't start with ./ Unless the actual result in the config starts with ./ --- coverage/files.py | 3 +++ tests/test_files.py | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/coverage/files.py b/coverage/files.py index 82f4df310..bfd808ffd 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -435,6 +435,9 @@ def map(self, path): new = new.replace(sep(path), sep(result)) if not self.relative: new = canonical_filename(new) + dot_start = result.startswith(("./", ".\\")) and len(result) > 2 + if new.startswith(("./", ".\\")) and not dot_start: + new = new[2:] self.debugfn( f"Matched path {path!r} to rule {original_pattern!r} -> {result!r}, " + f"producing {new!r}" diff --git a/tests/test_files.py b/tests/test_files.py index 9a4cea7f8..561b961d3 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -380,6 +380,13 @@ def test_no_accidental_match(self, rel_yn): aliases.add('/home/*/src', './mysrc') self.assert_unchanged(aliases, '/home/foo/srcetc') + def test_no_dotslash(self, rel_yn): + # The result shouldn't start with "./" if the map result didn't. + aliases = PathAliases(relative=rel_yn) + aliases.add('*/project', '.') + # Because the map result has no slash, the actual result is os-dependent. + self.assert_mapped(aliases, '/ned/home/project/src/a.py', f'src{os.sep}a.py') + def test_multiple_patterns(self, rel_yn): # also test the debugfn... msgs = [] From 77ebee15ef829d4700755eacb374ad8403e4046c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 8 Nov 2022 17:30:11 -0500 Subject: [PATCH 066/200] build: use the new --format=total for badge total --- .github/workflows/coverage.yml | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index fadad42ae..5130e3fff 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -94,6 +94,10 @@ jobs: name: "Combine coverage data" needs: coverage runs-on: ubuntu-latest + outputs: + total: ${{ steps.total.outputs.total }} + env: + COVERAGE_RCFILE: "metacov.ini" steps: - name: "Check out the repo" @@ -102,7 +106,7 @@ jobs: - name: "Set up Python" uses: "actions/setup-python@v4" with: - python-version: "3.8" + python-version: "3.7" # Minimum of PYVERSIONS cache: pip cache-dependency-path: 'requirements/*.pip' @@ -122,12 +126,10 @@ jobs: - name: "Combine and report" id: combine env: - COVERAGE_RCFILE: "metacov.ini" COVERAGE_CONTEXT: "yes" run: | set -xe - python -m igor combine_html - python -m coverage json + python igor.py combine_html - name: "Upload HTML report" uses: actions/upload-artifact@v3 @@ -135,11 +137,10 @@ jobs: name: html_report path: htmlcov - - name: "Upload JSON report" - uses: actions/upload-artifact@v3 - with: - name: json_report - path: coverage.json + - name: "Get total" + id: total + run: | + echo "total=$(python -m coverage report --format=total)" >> $GITHUB_OUTPUT publish: name: "Publish coverage report" @@ -158,21 +159,15 @@ jobs: git config user.email ned@nedbatchelder.com git checkout main - - name: "Download coverage JSON report" - uses: actions/download-artifact@v3 - with: - name: json_report - - name: "Compute info for later steps" id: info run: | set -xe - export TOTAL=$(python -c "import json;print(json.load(open('coverage.json'))['totals']['percent_covered_display'])") export SHA10=$(echo ${{ github.sha }} | cut -c 1-10) export SLUG=$(date +'%Y%m%d')_$SHA10 export REPORT_DIR=reports/$SLUG/htmlcov export REF="${{ github.ref }}" - echo "total=$TOTAL" >> $GITHUB_ENV + echo "total=${{ needs.combine.outputs.total }}" >> $GITHUB_ENV echo "sha10=$SHA10" >> $GITHUB_ENV echo "slug=$SLUG" >> $GITHUB_ENV echo "report_dir=$REPORT_DIR" >> $GITHUB_ENV From 2f0d4845ef39c17389aacc014693727265057817 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 8 Nov 2022 18:00:33 -0500 Subject: [PATCH 067/200] chore: make upgrade --- requirements/kit.pip | 6 +++--- requirements/light-threads.pip | 4 ++++ requirements/pip-tools.pip | 6 +++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/requirements/kit.pip b/requirements/kit.pip index a9850ca32..7b4f15ae4 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -78,9 +78,9 @@ typing-extensions==4.4.0 \ # via # cibuildwheel # importlib-metadata -wheel==0.38.2 \ - --hash=sha256:3d492ef22379a156ec923d2a77051cedfd4df4b667864e9e41ba83f0b70b7149 \ - --hash=sha256:7a5a3095dceca97a3cac869b8fef4e89b83fafde21b6688f47b6fda7600eb441 +wheel==0.38.3 \ + --hash=sha256:4066646ef77d0e56cc44004c100381ee1957955cfc3151345dda96886f9896a5 \ + --hash=sha256:f3c99240da8d26989dca2d67a7a431015eb91fb301eecacc6e452133689d9d59 # via -r requirements/kit.in zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 3e11fc550..41535f73b 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -90,6 +90,7 @@ gevent==22.10.2 \ --hash=sha256:1e955238f59b2947631c9782a713280dd75884e40e455313b5b6bbc20b92ff73 \ --hash=sha256:1f001cac0ba8da76abfeb392a3057f81fab3d67cc916c7df8ea977a44a2cc989 \ --hash=sha256:1ff3796692dff50fec2f381b9152438b221335f557c4f9b811f7ded51b7a25a1 \ + --hash=sha256:2929377c8ebfb6f4d868d161cd8de2ea6b9f6c7a5fcd4f78bcd537319c16190b \ --hash=sha256:319d8b1699b7b8134de66d656cd739b308ab9c45ace14d60ae44de7775b456c9 \ --hash=sha256:323b207b281ba0405fea042067fa1a61662e5ac0d574ede4ebbda03efd20c350 \ --hash=sha256:3b7eae8a0653ba95a224faaddf629a913ace408edb67384d3117acf42d7dcf89 \ @@ -97,9 +98,12 @@ gevent==22.10.2 \ --hash=sha256:4197d423e198265eef39a0dea286ef389da9148e070310f34455ecee8172c391 \ --hash=sha256:494c7f29e94df9a1c3157d67bb7edfa32a46eed786e04d9ee68d39f375e30001 \ --hash=sha256:4e2f008c82dc54ec94f4de12ca6feea60e419babb48ec145456907ae61625aa4 \ + --hash=sha256:526ff5b6fc7e9de686859ae1b0f0ddf60a65cead2241ddc9c9b074185f0e2e9c \ + --hash=sha256:53ee7f170ed42c7561fe8aff5d381dc9a4124694e70580d0c02fba6aafc0ea37 \ --hash=sha256:54f4bfd74c178351a4a05c5c7df6f8a0a279ff6f392b57608ce0e83c768207f9 \ --hash=sha256:58898dbabb5b11e4d0192aae165ad286dc6742c543e1be9d30dc82753547c508 \ --hash=sha256:59b47e81b399d49a5622f0f503c59f1ce57b7705306ea0196818951dfc2f36c8 \ + --hash=sha256:5aa99e4882a9e909b4756ee799c6fa0f79eb0542779fad4cc60efa23ec1b2aa8 \ --hash=sha256:6c04ee32c11e9fcee47c1b431834878dc987a7a2cc4fe126ddcae3bad723ce89 \ --hash=sha256:84c517e33ed604fa06b7d756dc0171169cc12f7fdd68eb7b17708a62eebf4516 \ --hash=sha256:8729129edef2637a8084258cb9ec4e4d5ca45d97ac77aa7a6ff19ccb530ab731 \ diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 51e5b814e..adfc881d8 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -45,9 +45,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -wheel==0.38.2 \ - --hash=sha256:3d492ef22379a156ec923d2a77051cedfd4df4b667864e9e41ba83f0b70b7149 \ - --hash=sha256:7a5a3095dceca97a3cac869b8fef4e89b83fafde21b6688f47b6fda7600eb441 +wheel==0.38.3 \ + --hash=sha256:4066646ef77d0e56cc44004c100381ee1957955cfc3151345dda96886f9896a5 \ + --hash=sha256:f3c99240da8d26989dca2d67a7a431015eb91fb301eecacc6e452133689d9d59 # via pip-tools zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ From 1ac1846fdf837fac1c958dfde0ebce3e9531bf87 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 11 Nov 2022 05:39:41 -0500 Subject: [PATCH 068/200] feat: complete removal of `[run] note` --- CHANGES.rst | 2 ++ coverage/config.py | 2 -- coverage/control.py | 3 --- doc/config.rst | 8 -------- tests/test_config.py | 11 ----------- 5 files changed, 2 insertions(+), 24 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 969260218..51eb949d8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -43,6 +43,8 @@ Unreleased - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. +- The ``[run] note`` setting has been completely removed. + .. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 diff --git a/coverage/config.py b/coverage/config.py index 309f65e81..7b765edfe 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -184,7 +184,6 @@ def __init__(self): self.debug = [] self.disable_warnings = [] self.dynamic_context = None - self.note = None self.parallel = False self.plugins = [] self.relative_files = False @@ -360,7 +359,6 @@ def copy(self): ('debug', 'run:debug', 'list'), ('disable_warnings', 'run:disable_warnings', 'list'), ('dynamic_context', 'run:dynamic_context'), - ('note', 'run:note'), ('parallel', 'run:parallel', 'boolean'), ('plugins', 'run:plugins', 'list'), ('relative_files', 'run:relative_files', 'boolean'), diff --git a/coverage/control.py b/coverage/control.py index 9a55acb1d..91ad5a78a 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -808,9 +808,6 @@ def _post_save_work(self): for plugin_name, paths in file_paths.items(): self._data.touch_files(paths, plugin_name) - if self.config.note: - self._warn("The '[run] note' setting is no longer supported.") - # Backward compatibility with version 1. def analysis(self, morf): """Like `analysis2` but doesn't return excluded line numbers.""" diff --git a/doc/config.rst b/doc/config.rst index c6f6442a5..83f64a4dc 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -222,14 +222,6 @@ measurement or reporting. Ignored if ``source`` is set. See :ref:`source` for details. -.. _config_run_note: - -[run] note -.......... - -(string) This is now obsolete. - - .. _config_run_omit: [run] omit diff --git a/tests/test_config.py b/tests/test_config.py index 4afdd1e39..444719fdc 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -706,17 +706,6 @@ def test_nocoveragerc_file_when_specified(self): assert not cov.config.branch assert cov.config.data_file == ".coverage" - def test_note_is_obsolete(self): - self.make_file("main.py", "a = 1") - self.make_file(".coveragerc", """\ - [run] - note = I am here I am here I am here! - """) - cov = coverage.Coverage() - with self.assert_warnings(cov, [r"The '\[run] note' setting is no longer supported."]): - self.start_import_stop(cov, "main") - cov.report() - def test_no_toml_installed_no_toml(self): # Can't read a toml file that doesn't exist. with without_module(coverage.tomlconfig, 'tomllib'): From bb5935b2845d80d26b62eaa0dc6eed4f0470ba22 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 11 Nov 2022 06:55:44 -0500 Subject: [PATCH 069/200] docs: more uniform pr references --- CHANGES.rst | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 51eb949d8..b38d0fb00 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -24,7 +24,7 @@ Unreleased The original style (``--format=text``) is the default. - Using ``--format=markdown`` will write the table in Markdown format, thanks - to Steve Oswald in `pull 1479`_, closing `issue 1418`_. + to `Steve Oswald `_, closing `issue 1418`_. - Using ``--format=total`` will write a single total number to the output. This can be useful for making badges or writing status updates. @@ -45,10 +45,10 @@ Unreleased - The ``[run] note`` setting has been completely removed. -.. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 .. _issue 1470: https://github.com/nedbat/coveragepy/issues/1470 +.. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 .. _changes_6-6-0b1: @@ -99,7 +99,7 @@ Version 6.5.0 — 2022-09-29 -------------------------- - The JSON report now includes details of which branches were taken, and which - are missing for each file. Thanks, Christoph Blessing (`pull 1438`_). Closes + are missing for each file. Thanks, `Christoph Blessing `_. Closes `issue 1425`_. - Starting with coverage.py 6.2, ``class`` statements were marked as a branch. @@ -119,8 +119,8 @@ Version 6.5.0 — 2022-09-29 .. _PEP 517: https://peps.python.org/pep-0517/ .. _issue 1395: https://github.com/nedbat/coveragepy/issues/1395 .. _issue 1425: https://github.com/nedbat/coveragepy/issues/1425 -.. _pull 1438: https://github.com/nedbat/coveragepy/pull/1438 .. _issue 1449: https://github.com/nedbat/coveragepy/issues/1449 +.. _pull 1438: https://github.com/nedbat/coveragepy/pull/1438 .. _changes_6-4-4: @@ -136,29 +136,28 @@ Version 6.4.4 — 2022-08-16 Version 6.4.3 — 2022-08-06 -------------------------- -- Fix a failure when combining data files if the file names contained - glob-like patterns (`pull 1405`_). Thanks, Michael Krebs and Benjamin - Schubert. +- Fix a failure when combining data files if the file names contained glob-like + patterns. Thanks, `Michael Krebs and Benjamin Schubert `_. - Fix a messaging failure when combining Windows data files on a different - drive than the current directory. (`pull 1430`_, fixing `issue 1428`_). - Thanks, Lorenzo Micò. + drive than the current directory, closing `issue 1428`_. Thanks, `Lorenzo + Micò `_. - Fix path calculations when running in the root directory, as you might do in - a Docker container: `pull 1403`_, thanks Arthur Rio. + a Docker container. Thanks `Arthur Rio `_. - Filtering in the HTML report wouldn't work when reloading the index page. - This is now fixed (`pull 1413`_). Thanks, Marc Legendre. + This is now fixed. Thanks, `Marc Legendre `_. -- Fix a problem with Cython code measurement (`pull 1347`_, fixing `issue - 972`_). Thanks, Matus Valo. +- Fix a problem with Cython code measurement, closing `issue 972`_. Thanks, + `Matus Valo `_. .. _issue 972: https://github.com/nedbat/coveragepy/issues/972 +.. _issue 1428: https://github.com/nedbat/coveragepy/issues/1428 .. _pull 1347: https://github.com/nedbat/coveragepy/pull/1347 .. _pull 1403: https://github.com/nedbat/coveragepy/issues/1403 .. _pull 1405: https://github.com/nedbat/coveragepy/issues/1405 .. _pull 1413: https://github.com/nedbat/coveragepy/issues/1413 -.. _issue 1428: https://github.com/nedbat/coveragepy/issues/1428 .. _pull 1430: https://github.com/nedbat/coveragepy/pull/1430 @@ -175,10 +174,10 @@ Version 6.4.2 — 2022-07-12 - Internal debugging data added to sys.modules is now an actual module, to avoid confusing code that examines everything in sys.modules. Thanks, - Yilei Yang (`pull 1399`_). + `Yilei Yang `_. -.. _pull 1399: https://github.com/nedbat/coveragepy/pull/1399 .. _issue 1419: https://github.com/nedbat/coveragepy/issues/1419 +.. _pull 1399: https://github.com/nedbat/coveragepy/pull/1399 .. _changes_6-4-1: From 5fca0c6eb07bd3dd9c6f872d1775055a43f77622 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 07:52:56 -0800 Subject: [PATCH 070/200] build(deps): bump actions/dependency-review-action from 2 to 3 (#1487) Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 2 to 3. - [Release notes](https://github.com/actions/dependency-review-action/releases) - [Commits](https://github.com/actions/dependency-review-action/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/dependency-review-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependency-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 845c763e8..34b14c395 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,4 +17,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@v3 - name: 'Dependency Review' - uses: actions/dependency-review-action@v2 + uses: actions/dependency-review-action@v3 From e76b5c7e0117f885f89190de9e07c1d2410ba58b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 14 Nov 2022 05:13:56 -0500 Subject: [PATCH 071/200] chore: make upgrade --- doc/requirements.pip | 6 ++--- requirements/dev.pip | 39 ++++++++++++++--------------- requirements/kit.pip | 12 ++++----- requirements/light-threads.pip | 4 ++- requirements/lint.pip | 45 ++++++++++++++++------------------ requirements/pip-tools.pip | 6 ++--- requirements/pip.pip | 12 ++++----- requirements/pytest.pip | 6 ++--- requirements/tox.pip | 18 +++++++------- 9 files changed, 72 insertions(+), 76 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 95baac170..83d3eb41b 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -178,9 +178,9 @@ sphinxcontrib-serializinghtml==1.1.5 \ --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 # via sphinx -sphinxcontrib-spelling==7.6.2 \ - --hash=sha256:a129d5dd0c00c9d414bcdf599afddb55bae01f1d543636e7ebb09491ba2babd4 \ - --hash=sha256:a7ca90eea630c825657e1344000a11d7d7f547a865e0eebbed08d112beb073d1 +sphinxcontrib-spelling==7.7.0 \ + --hash=sha256:56561c3f6a155b0946914e4de988729859315729dc181b5e4dc8a68fe78de35a \ + --hash=sha256:95a0defef8ffec6526f9e83b20cc24b08c9179298729d87976891840e3aa3064 # via -r doc/requirements.in tornado==6.2 \ --hash=sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca \ diff --git a/requirements/dev.pip b/requirements/dev.pip index 89de6a989..65bdc5ae3 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -76,9 +76,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -exceptiongroup==1.0.1 \ - --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ - --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 +exceptiongroup==1.0.2 \ + --hash=sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695 \ + --hash=sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27 # via # -r requirements/pytest.pip # hypothesis @@ -107,6 +107,7 @@ future==0.18.2 \ # pycontracts greenlet==2.0.1 \ --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ + --hash=sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9 \ --hash=sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581 \ --hash=sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26 \ --hash=sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd \ @@ -131,6 +132,7 @@ greenlet==2.0.1 \ --hash=sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94 \ --hash=sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92 \ --hash=sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e \ + --hash=sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726 \ --hash=sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd \ --hash=sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5 \ --hash=sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764 \ @@ -156,6 +158,7 @@ greenlet==2.0.1 \ --hash=sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7 \ --hash=sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d \ --hash=sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d \ + --hash=sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0 \ --hash=sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ @@ -229,17 +232,12 @@ lazy-object-proxy==1.8.0 \ --hash=sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0 \ --hash=sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b # via astroid -libsass==0.21.0 \ - --hash=sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb \ - --hash=sha256:12f39712de38689a8b785b7db41d3ba2ea1d46f9379d81ea4595802d91fa6529 \ - --hash=sha256:1e25dd9047a9392d3c59a0b869e0404f2b325a03871ee45285ee33b3664f5613 \ - --hash=sha256:659ae41af8708681fa3ec73f47b9735a6725e71c3b66ff570bfce78952f2314e \ - --hash=sha256:6b984510ed94993708c0d697b4fef2d118929bbfffc3b90037be0f5ccadf55e7 \ - --hash=sha256:a005f298f64624f313a3ac618ab03f844c71d84ae4f4a4aec4b68d2a4ffe75eb \ - --hash=sha256:abc29357ee540849faf1383e1746d40d69ed5cb6d4c346df276b258f5aa8977a \ - --hash=sha256:c9ec490609752c1d81ff6290da33485aa7cb6d7365ac665b74464c1b7d97f7da \ - --hash=sha256:d5ba529d9ce668be9380563279f3ffe988f27bc5b299c5a28453df2e0b0fbaf2 \ - --hash=sha256:e2b1a7d093f2e76dc694c17c0c285e846d0b0deb0e8b21dc852ba1a3a4e2f1d6 +libsass==0.22.0 \ + --hash=sha256:081e256ab3c5f3f09c7b8dea3bf3bf5e64a97c6995fd9eea880639b3f93a9f9a \ + --hash=sha256:3ab5ad18e47db560f4f0c09e3d28cf3bb1a44711257488ac2adad69f4f7f8425 \ + --hash=sha256:65455a2728b696b62100eb5932604aa13a29f4ac9a305d95773c14aaa7200aaf \ + --hash=sha256:89c5ce497fcf3aba1dd1b19aae93b99f68257e5f2026b731b00a872f13324c7f \ + --hash=sha256:f1efc1b612299c88aec9e39d6ca0c266d360daa5b19d9430bdeaffffa86993f9 # via -r requirements/dev.in mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ @@ -270,9 +268,9 @@ pkginfo==1.8.3 \ --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c # via twine -platformdirs==2.5.3 \ - --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ - --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via # -r requirements/pip.pip # pylint @@ -358,7 +356,6 @@ six==1.16.0 \ # via # -r requirements/pytest.pip # bleach - # libsass # pycontracts # tox sortedcontainers==2.4.0 \ @@ -440,9 +437,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.16.6 \ - --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ - --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e +virtualenv==20.16.7 \ + --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ + --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via # -r requirements/pip.pip # tox diff --git a/requirements/kit.pip b/requirements/kit.pip index 7b4f15ae4..57a94b9b0 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -53,9 +53,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -platformdirs==2.5.3 \ - --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ - --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via cibuildwheel pyelftools==0.29 \ --hash=sha256:519f38cf412f073b2d7393aa4682b0190fa901f7c3fa0bff2b82d537690c7fc1 \ @@ -78,9 +78,9 @@ typing-extensions==4.4.0 \ # via # cibuildwheel # importlib-metadata -wheel==0.38.3 \ - --hash=sha256:4066646ef77d0e56cc44004c100381ee1957955cfc3151345dda96886f9896a5 \ - --hash=sha256:f3c99240da8d26989dca2d67a7a431015eb91fb301eecacc6e452133689d9d59 +wheel==0.38.4 \ + --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ + --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via -r requirements/kit.in zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 41535f73b..89dc140c7 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -135,6 +135,7 @@ gevent==22.10.2 \ # 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 \ @@ -159,6 +160,7 @@ greenlet==2.0.1 \ --hash=sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94 \ --hash=sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92 \ --hash=sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e \ + --hash=sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726 \ --hash=sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd \ --hash=sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5 \ --hash=sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764 \ @@ -184,6 +186,7 @@ greenlet==2.0.1 \ --hash=sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7 \ --hash=sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d \ --hash=sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d \ + --hash=sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0 \ --hash=sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ @@ -242,7 +245,6 @@ zope-interface==5.5.1 \ --hash=sha256:cd423d49abcf0ebf02c29c3daffe246ff756addb891f8aab717b3a4e2e1fd675 \ --hash=sha256:d0587d238b7867544134f4dcca19328371b8fd03fc2c56d15786f410792d0a68 \ --hash=sha256:d1f2d91c9c6cd54d750fa34f18bd73c71b372d0e6d06843bc7a5f21f5fd66fe0 \ - --hash=sha256:d2f2ec42fbc21e1af5f129ec295e29fee6f93563e6388656975caebc5f851561 \ --hash=sha256:d743b03a72fefed807a4512c079fb1aa5e7777036cc7a4b6ff79ae4650a14f73 \ --hash=sha256:dd4b9251e95020c3d5d104b528dbf53629d09c146ce9c8dfaaf8f619ae1cce35 \ --hash=sha256:e4988d94962f517f6da2d52337170b84856905b31b7dc504ed9c7b7e4bab2fc3 \ diff --git a/requirements/lint.pip b/requirements/lint.pip index 500abb1e5..8eadf426a 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -91,9 +91,9 @@ docutils==0.17.1 \ # readme-renderer # sphinx # sphinx-rtd-theme -exceptiongroup==1.0.1 \ - --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ - --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 +exceptiongroup==1.0.2 \ + --hash=sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695 \ + --hash=sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27 # via # -r requirements/pytest.pip # hypothesis @@ -122,6 +122,7 @@ future==0.18.2 \ # pycontracts greenlet==2.0.1 \ --hash=sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9 \ + --hash=sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9 \ --hash=sha256:04957dc96669be041e0c260964cfef4c77287f07c40452e61abe19d647505581 \ --hash=sha256:0722c9be0797f544a3ed212569ca3fe3d9d1a1b13942d10dd6f0e8601e484d26 \ --hash=sha256:097e3dae69321e9100202fc62977f687454cd0ea147d0fd5a766e57450c569fd \ @@ -146,6 +147,7 @@ greenlet==2.0.1 \ --hash=sha256:56961cfca7da2fdd178f95ca407fa330c64f33289e1804b592a77d5593d9bd94 \ --hash=sha256:5a8e05057fab2a365c81abc696cb753da7549d20266e8511eb6c9d9f72fe3e92 \ --hash=sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e \ + --hash=sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726 \ --hash=sha256:6f61d71bbc9b4a3de768371b210d906726535d6ca43506737682caa754b956cd \ --hash=sha256:72b00a8e7c25dcea5946692a2485b1a0c0661ed93ecfedfa9b6687bd89a24ef5 \ --hash=sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764 \ @@ -171,6 +173,7 @@ greenlet==2.0.1 \ --hash=sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7 \ --hash=sha256:cd4ccc364cf75d1422e66e247e52a93da6a9b73cefa8cad696f3cbbb75af179d \ --hash=sha256:d21681f09e297a5adaa73060737e3aa1279a13ecdcfcc6ef66c292cb25125b2d \ + --hash=sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0 \ --hash=sha256:d566b82e92ff2e09dd6342df7e0eb4ff6275a3f08db284888dcd98134dbd4243 \ --hash=sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce \ --hash=sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6 \ @@ -254,17 +257,12 @@ lazy-object-proxy==1.8.0 \ --hash=sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0 \ --hash=sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b # via astroid -libsass==0.21.0 \ - --hash=sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb \ - --hash=sha256:12f39712de38689a8b785b7db41d3ba2ea1d46f9379d81ea4595802d91fa6529 \ - --hash=sha256:1e25dd9047a9392d3c59a0b869e0404f2b325a03871ee45285ee33b3664f5613 \ - --hash=sha256:659ae41af8708681fa3ec73f47b9735a6725e71c3b66ff570bfce78952f2314e \ - --hash=sha256:6b984510ed94993708c0d697b4fef2d118929bbfffc3b90037be0f5ccadf55e7 \ - --hash=sha256:a005f298f64624f313a3ac618ab03f844c71d84ae4f4a4aec4b68d2a4ffe75eb \ - --hash=sha256:abc29357ee540849faf1383e1746d40d69ed5cb6d4c346df276b258f5aa8977a \ - --hash=sha256:c9ec490609752c1d81ff6290da33485aa7cb6d7365ac665b74464c1b7d97f7da \ - --hash=sha256:d5ba529d9ce668be9380563279f3ffe988f27bc5b299c5a28453df2e0b0fbaf2 \ - --hash=sha256:e2b1a7d093f2e76dc694c17c0c285e846d0b0deb0e8b21dc852ba1a3a4e2f1d6 +libsass==0.22.0 \ + --hash=sha256:081e256ab3c5f3f09c7b8dea3bf3bf5e64a97c6995fd9eea880639b3f93a9f9a \ + --hash=sha256:3ab5ad18e47db560f4f0c09e3d28cf3bb1a44711257488ac2adad69f4f7f8425 \ + --hash=sha256:65455a2728b696b62100eb5932604aa13a29f4ac9a305d95773c14aaa7200aaf \ + --hash=sha256:89c5ce497fcf3aba1dd1b19aae93b99f68257e5f2026b731b00a872f13324c7f \ + --hash=sha256:f1efc1b612299c88aec9e39d6ca0c266d360daa5b19d9430bdeaffffa86993f9 # via -r requirements/dev.in livereload==2.6.3 \ --hash=sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869 @@ -341,9 +339,9 @@ pkginfo==1.8.3 \ --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c # via twine -platformdirs==2.5.3 \ - --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ - --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via # -r requirements/pip.pip # pylint @@ -443,7 +441,6 @@ six==1.16.0 \ # via # -r requirements/pytest.pip # bleach - # libsass # livereload # pycontracts # tox @@ -502,9 +499,9 @@ sphinxcontrib-serializinghtml==1.1.5 \ --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 # via sphinx -sphinxcontrib-spelling==7.6.2 \ - --hash=sha256:a129d5dd0c00c9d414bcdf599afddb55bae01f1d543636e7ebb09491ba2babd4 \ - --hash=sha256:a7ca90eea630c825657e1344000a11d7d7f547a865e0eebbed08d112beb073d1 +sphinxcontrib-spelling==7.7.0 \ + --hash=sha256:56561c3f6a155b0946914e4de988729859315729dc181b5e4dc8a68fe78de35a \ + --hash=sha256:95a0defef8ffec6526f9e83b20cc24b08c9179298729d87976891840e3aa3064 # via -r doc/requirements.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ @@ -592,9 +589,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.16.6 \ - --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ - --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e +virtualenv==20.16.7 \ + --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ + --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via # -r requirements/pip.pip # tox diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index adfc881d8..e264d9fd9 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -45,9 +45,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -wheel==0.38.3 \ - --hash=sha256:4066646ef77d0e56cc44004c100381ee1957955cfc3151345dda96886f9896a5 \ - --hash=sha256:f3c99240da8d26989dca2d67a7a431015eb91fb301eecacc6e452133689d9d59 +wheel==0.38.4 \ + --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ + --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via pip-tools zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ diff --git a/requirements/pip.pip b/requirements/pip.pip index ed536dc06..ede9c4eac 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -16,17 +16,17 @@ importlib-metadata==5.0.0 \ --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via virtualenv -platformdirs==2.5.3 \ - --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ - --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via virtualenv typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.16.6 \ - --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ - --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e +virtualenv==20.16.7 \ + --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ + --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via -r requirements/pip.in zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ diff --git a/requirements/pytest.pip b/requirements/pytest.pip index d73044fc3..01eb46e48 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -25,9 +25,9 @@ decorator==5.1.1 \ --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 # via pycontracts -exceptiongroup==1.0.1 \ - --hash=sha256:4d6c0aa6dd825810941c792f53d7b8d71da26f5e5f84f20f9508e8f2d33b140a \ - --hash=sha256:73866f7f842ede6cb1daa42c4af078e2035e5f7607f0e2c762cc51bb31bbe7b2 +exceptiongroup==1.0.2 \ + --hash=sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695 \ + --hash=sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27 # via # hypothesis # pytest diff --git a/requirements/tox.pip b/requirements/tox.pip index 811991bdf..e8b545db4 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -33,9 +33,9 @@ packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 # via tox -platformdirs==2.5.3 \ - --hash=sha256:0cb405749187a194f444c25c82ef7225232f11564721eabffc6ec70df83b11cb \ - --hash=sha256:6e52c21afff35cb659c6e52d8b4d61b9bd544557180440538f255d9382c8cbe0 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via virtualenv pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ @@ -63,17 +63,17 @@ tox==3.27.0 \ # via # -r requirements/tox.in # tox-gh-actions -tox-gh-actions==2.10.0 \ - --hash=sha256:4a21e70d799736016cf75c3415f5991008cf81fa6ee1c047d1be24900cec31bb \ - --hash=sha256:acb64641f09022581040d92c28d6c06d261a829c008575892fd458e23e638971 +tox-gh-actions==2.11.0 \ + --hash=sha256:07779eedc7ba4a1749f9fad23fdc7e4760a9663c4a80c9e1adffc54858917f60 \ + --hash=sha256:1aff5a36549c383adf133f4d1432c2f5206c7665f7756d6397704aa4c8880c6b # via -r requirements/tox.in typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.16.6 \ - --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ - --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e +virtualenv==20.16.7 \ + --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ + --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via tox zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ From 26445508a2eb1c7ef459a33ec058eb3f3c5b41dd Mon Sep 17 00:00:00 2001 From: Felix Horvat Date: Thu, 17 Nov 2022 12:34:22 +0100 Subject: [PATCH 072/200] feat: added support for finding unexecuted namespace packages (#1387) * add support for namespace packages * fixed typo * update documentation * fixed lint issues * changed versionadded * convert to config setting * removed pure formatting changes * code review changes Co-authored-by: Ned Batchelder --- coverage/config.py | 2 ++ coverage/control.py | 1 + coverage/files.py | 5 +++-- coverage/inorout.py | 8 ++++++-- doc/config.rst | 8 ++++++++ tests/test_config.py | 3 +++ tests/test_files.py | 19 ++++++++++++++++++- 7 files changed, 41 insertions(+), 5 deletions(-) diff --git a/coverage/config.py b/coverage/config.py index 7b765edfe..994154f6d 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -200,6 +200,7 @@ def __init__(self): self.fail_under = 0.0 self.format = None self.ignore_errors = False + self.include_namespace_packages = False self.report_include = None self.report_omit = None self.partial_always_list = DEFAULT_PARTIAL_ALWAYS[:] @@ -375,6 +376,7 @@ def copy(self): ('fail_under', 'report:fail_under', 'float'), ('format', 'report:format', 'boolean'), ('ignore_errors', 'report:ignore_errors', 'boolean'), + ('include_namespace_packages', 'report:include_namespace_packages', 'boolean'), ('partial_always_list', 'report:partial_branches_always', 'regexlist'), ('partial_list', 'report:partial_branches', 'regexlist'), ('precision', 'report:precision', 'int'), diff --git a/coverage/control.py b/coverage/control.py index 91ad5a78a..a955c283e 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -530,6 +530,7 @@ def _init_for_start(self): self._inorout = InOrOut( warn=self._warn, debug=(self._debug if self._debug.should('trace') else None), + include_namespace_packages=self.config.include_namespace_packages ) self._inorout.configure(self.config) self._inorout.plugins = self._plugins diff --git a/coverage/files.py b/coverage/files.py index bfd808ffd..8be292f3d 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -461,7 +461,7 @@ def map(self, path): return path -def find_python_files(dirname): +def find_python_files(dirname, include_namespace_packages): """Yield all of the importable Python files in `dirname`, recursively. To be importable, the files have to be in a directory with a __init__.py, @@ -472,7 +472,8 @@ def find_python_files(dirname): """ for i, (dirpath, dirnames, filenames) in enumerate(os.walk(dirname)): - if i > 0 and '__init__.py' not in filenames: + if (i > 0 and '__init__.py' not in filenames + and not include_namespace_packages): # If a directory doesn't have __init__.py, then it isn't # importable and neither are its files del dirnames[:] diff --git a/coverage/inorout.py b/coverage/inorout.py index 2e534c853..0d3f6d670 100644 --- a/coverage/inorout.py +++ b/coverage/inorout.py @@ -189,9 +189,10 @@ def add_coverage_paths(paths): class InOrOut: """Machinery for determining what files to measure.""" - def __init__(self, warn, debug): + def __init__(self, warn, debug, include_namespace_packages): self.warn = warn self.debug = debug + self.include_namespace_packages = include_namespace_packages # The matchers for should_trace. self.source_match = None @@ -565,7 +566,10 @@ def _find_executable_files(self, src_dir): Yield the file path, and the plugin name that handles the file. """ - py_files = ((py_file, None) for py_file in find_python_files(src_dir)) + py_files = ( + (py_file, None) for py_file in + find_python_files(src_dir, self.include_namespace_packages) + ) plugin_files = self._find_plugin_files(src_dir) for file_path, plugin_name in itertools.chain(py_files, plugin_files): diff --git a/doc/config.rst b/doc/config.rst index 83f64a4dc..b51129826 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -410,6 +410,14 @@ warning instead of an exception. See :ref:`source` for details. +.. _config_include_namespace_packages: + +[report] include_namespace_packages +................................... + +(boolean, default False) Include folders without an ``__init__.py`` in the +coverage. + .. _config_report_omit: [report] omit diff --git a/tests/test_config.py b/tests/test_config.py index 444719fdc..5f8a05476 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -494,6 +494,8 @@ class ConfigFileTest(UsingModulesMixin, CoverageTest): skip_covered = TruE skip_empty =TruE + include_namespace_packages = TRUE + [{section}html] directory = c:\\tricky\\dir.somewhere @@ -589,6 +591,7 @@ def assert_config_settings_are_correct(self, cov): assert cov.config.get_plugin_options("plugins.another") == {} assert cov.config.json_show_contexts is True assert cov.config.json_pretty_print is True + assert cov.config.include_namespace_packages is True def test_config_file_settings(self): self.make_file(".coveragerc", self.LOTSA_SETTINGS.format(section="")) diff --git a/tests/test_files.py b/tests/test_files.py index 561b961d3..a69d1a4b0 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -585,13 +585,30 @@ def test_find_python_files(self): self.make_file("sub/ssub/~s.py") # nope: editor effluvia self.make_file("sub/lab/exp.py") # nope: no __init__.py self.make_file("sub/windows.pyw") - py_files = set(find_python_files("sub")) + py_files = set(find_python_files("sub", include_namespace_packages=False)) self.assert_same_files(py_files, [ "sub/a.py", "sub/b.py", "sub/ssub/__init__.py", "sub/ssub/s.py", "sub/windows.pyw", ]) + def test_find_python_files_include_namespace_packages(self): + self.make_file("sub/a.py") + self.make_file("sub/b.py") + self.make_file("sub/x.c") # nope: not .py + self.make_file("sub/ssub/__init__.py") + self.make_file("sub/ssub/s.py") + self.make_file("sub/ssub/~s.py") # nope: editor effluvia + self.make_file("sub/lab/exp.py") + self.make_file("sub/windows.pyw") + py_files = set(find_python_files("sub", include_namespace_packages=True)) + self.assert_same_files(py_files, [ + "sub/a.py", "sub/b.py", + "sub/ssub/__init__.py", "sub/ssub/s.py", + "sub/lab/exp.py", + "sub/windows.pyw", + ]) + @pytest.mark.skipif(not env.WINDOWS, reason="Only need to run Windows tests on Windows.") class WindowsFileTest(CoverageTest): From 709c7443e30b20226c4fb61acaf47de529a7688c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 17 Nov 2022 06:59:15 -0500 Subject: [PATCH 073/200] refactor, docs: clean-up for #1387 --- CHANGES.rst | 11 +++++++++++ CONTRIBUTORS.txt | 1 + coverage/control.py | 2 +- coverage/files.py | 18 ++++++++++++------ doc/config.rst | 10 ++++++++-- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b38d0fb00..5e3fb44c6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -34,6 +34,14 @@ Unreleased time needed. For coverage.py's own test suite, combining was about 17% faster. +- When searching for completely unexecuted files, coverage.py uses the presence + of ``__init__.py`` files to determine which directories have source that + could have been imported. However, `implicit namespace packages`_ don't + require ``__init__.py``. A new setting ``[report] + include_namespace_packages`` tells coverage.py to consider these directories + during reporting. Thanks to `Felix Horvat `_ for the + contribution. Closes `issue 1383`_. + - An empty file has a coverage total of 100%, but used to fail with ``--fail-under``. This has been fixed, closing `issue 1470`_. @@ -45,9 +53,12 @@ Unreleased - The ``[run] note`` setting has been completely removed. +.. _implicit namespace packages: https://peps.python.org/pep-0420/ +.. _issue 1383: https://github.com/nedbat/coveragepy/issues/1383 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 .. _issue 1470: https://github.com/nedbat/coveragepy/issues/1470 +.. _pull 1387: https://github.com/nedbat/coveragepy/pull/1387 .. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index b57c35d5c..af6c4c26a 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -68,6 +68,7 @@ Eli Skeggs Emil Madsen Éric Larivière Federico Bond +Felix Horvat Frazer McLean Geoff Bache George Paci diff --git a/coverage/control.py b/coverage/control.py index a955c283e..7315fb397 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -530,7 +530,7 @@ def _init_for_start(self): self._inorout = InOrOut( warn=self._warn, debug=(self._debug if self._debug.should('trace') else None), - include_namespace_packages=self.config.include_namespace_packages + include_namespace_packages=self.config.include_namespace_packages, ) self._inorout.configure(self.config) self._inorout.plugins = self._plugins diff --git a/coverage/files.py b/coverage/files.py index 8be292f3d..f016a32ef 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -470,14 +470,20 @@ def find_python_files(dirname, include_namespace_packages): best, but sub-directories are checked for a __init__.py to be sure we only find the importable files. + If `include_namespace_packages` is True, then the check for __init__.py + files is skipped. + + Files with strange characters are skipped, since they couldn't have been + imported, and are probably editor side-files. + """ for i, (dirpath, dirnames, filenames) in enumerate(os.walk(dirname)): - if (i > 0 and '__init__.py' not in filenames - and not include_namespace_packages): - # If a directory doesn't have __init__.py, then it isn't - # importable and neither are its files - del dirnames[:] - continue + if not include_namespace_packages: + if i > 0 and "__init__.py" not in filenames: + # If a directory doesn't have __init__.py, then it isn't + # importable and neither are its files + del dirnames[:] + continue for filename in filenames: # We're only interested in files that look like reasonable Python # files: Must end with .py or .pyw, and must not have certain funny diff --git a/doc/config.rst b/doc/config.rst index b51129826..ba3243a77 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -415,8 +415,14 @@ See :ref:`source` for details. [report] include_namespace_packages ................................... -(boolean, default False) Include folders without an ``__init__.py`` in the -coverage. +(boolean, default False) When searching for completely unexecuted files, +include directories without ``__init__.py`` files. These are `implicit +namespace packages`_, and are ususally skipped. + +.. _implicit namespace packages: https://peps.python.org/pep-0420/ + +.. versionadded:: 6.6 + .. _config_report_omit: From 66c45143008366726293a341405d45a3a8e9ed87 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 17 Nov 2022 05:44:49 -0500 Subject: [PATCH 074/200] build: allow for .devN version numbers --- coverage/version.py | 18 +++++++++++------- igor.py | 13 +++++++++++-- tests/test_html.py | 2 +- tests/test_version.py | 17 +++++++++++------ 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/coverage/version.py b/coverage/version.py index 8ebeee406..2c051f84e 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -4,28 +4,32 @@ """The version and URL for coverage.py""" # This file is exec'ed in setup.py, don't import anything! -# Same semantics as sys.version_info. +# version_info: same semantics as sys.version_info. +# _dev: the .devN suffix if any. version_info = (6, 6, 0, "beta", 2) +_dev = 0 -def _make_version(major, minor, micro, releaselevel, serial): +def _make_version(major, minor, micro, releaselevel="final", serial=0, dev=0): """Create a readable version string from version_info tuple components.""" assert releaselevel in ['alpha', 'beta', 'candidate', 'final'] version = "%d.%d.%d" % (major, minor, micro) if releaselevel != 'final': short = {'alpha': 'a', 'beta': 'b', 'candidate': 'rc'}[releaselevel] version += f"{short}{serial}" + if dev != 0: + version += f".dev{dev}" return version -def _make_url(major, minor, micro, releaselevel, serial): +def _make_url(major, minor, micro, releaselevel, serial=0, dev=0): """Make the URL people should start at for this version of coverage.py.""" url = "https://coverage.readthedocs.io" - if releaselevel != 'final': + if releaselevel != "final" or dev != 0: # For pre-releases, use a version-specific URL. - url += "/en/" + _make_version(major, minor, micro, releaselevel, serial) + url += "/en/" + _make_version(major, minor, micro, releaselevel, serial, dev) return url -__version__ = _make_version(*version_info) -__url__ = _make_url(*version_info) +__version__ = _make_version(*version_info, _dev) +__url__ = _make_url(*version_info, _dev) diff --git a/igor.py b/igor.py index d78dff98a..510d6adfe 100644 --- a/igor.py +++ b/igor.py @@ -15,6 +15,7 @@ import inspect import os import platform +import pprint import re import subprocess import sys @@ -380,9 +381,11 @@ def do_quietly(command): def get_release_facts(): """Return an object with facts about the current release.""" import coverage + import coverage.version facts = types.SimpleNamespace() facts.ver = coverage.__version__ facts.vi = coverage.version_info + facts.dev = coverage.version._dev facts.shortver = f"{facts.vi[0]}.{facts.vi[1]}.{facts.vi[2]}" facts.anchor = facts.shortver.replace(".", "-") if facts.vi[3] != "final": @@ -411,6 +414,10 @@ def do_edit_for_release(): """Edit a few files in preparation for a release.""" facts = get_release_facts() + if facts.dev: + print(f"**\n** This is a dev release: {facts.ver}\n**\n\nNo edits") + return + # NOTICE.txt update_file("NOTICE.txt", r"Copyright 2004.*? Ned", f"Copyright 2004-{facts.now:%Y} Ned") @@ -448,13 +455,15 @@ def do_bump_version(): ) # coverage/version.py - next_version = f"version_info = {facts.next_vi}".replace("'", '"') - update_file("coverage/version.py", r"(?m)^version_info = .*$", next_version) + next_version = f"version_info = {facts.next_vi}\n_dev = 1".replace("'", '"') + update_file("coverage/version.py", r"(?m)^version_info = .*\n_dev = \d+$", next_version) def do_cheats(): """Show a cheatsheet of useful things during releasing.""" facts = get_release_facts() + pprint.pprint(facts.__dict__) + print() print(f"Coverage version is {facts.ver}") print(f"pip install git+https://github.com/nedbat/coveragepy@{facts.branch}") diff --git a/tests/test_html.py b/tests/test_html.py index d649c67f7..6aea06264 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -615,7 +615,7 @@ def compare_html(expected, actual, extra_scrubs=None): __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.abc]+', 'coverage.py vVER'), + (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_version.py b/tests/test_version.py index c45716686..ce6c705ac 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -18,18 +18,23 @@ def test_version_info(self): # Make sure we didn't screw up the version_info tuple. assert isinstance(coverage.version_info, tuple) assert [type(d) for d in coverage.version_info] == [int, int, int, str, int] - assert coverage.version_info[3] in ['alpha', 'beta', 'candidate', 'final'] + assert coverage.version_info[3] in {'alpha', 'beta', 'candidate', 'final'} def test_make_version(self): - assert _make_version(4, 0, 0, 'alpha', 0) == "4.0.0a0" + assert _make_version(4, 0, 0, 'alpha') == "4.0.0a0" assert _make_version(4, 0, 0, 'alpha', 1) == "4.0.0a1" - assert _make_version(4, 0, 0, 'final', 0) == "4.0.0" - assert _make_version(4, 1, 0, 'final', 0) == "4.1.0" + assert _make_version(4, 0, 0, 'final') == "4.0.0" + assert _make_version(4, 1, 0) == "4.1.0" assert _make_version(4, 1, 2, 'beta', 3) == "4.1.2b3" - assert _make_version(4, 1, 2, 'final', 0) == "4.1.2" + assert _make_version(4, 1, 2) == "4.1.2" assert _make_version(5, 10, 2, 'candidate', 7) == "5.10.2rc7" + assert _make_version(5, 10, 2, 'candidate', 7, 3) == "5.10.2rc7.dev3" def test_make_url(self): - assert _make_url(4, 0, 0, 'final', 0) == "https://coverage.readthedocs.io" + assert _make_url(4, 0, 0, 'final') == "https://coverage.readthedocs.io" expected = "https://coverage.readthedocs.io/en/4.1.2b3" assert _make_url(4, 1, 2, 'beta', 3) == expected + expected = "https://coverage.readthedocs.io/en/4.1.2b3.dev17" + assert _make_url(4, 1, 2, 'beta', 3, 17) == expected + expected = "https://coverage.readthedocs.io/en/4.1.2.dev17" + assert _make_url(4, 1, 2, 'final', 0, 17) == expected From 1cd6c9bba0b4ba3018bf1b28fee645a7dd98fe68 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 20 Nov 2022 09:45:01 -0500 Subject: [PATCH 075/200] perf: more combine speed-ups By avoiding writing metadata that differs but doesn't change the data, we get a higher hitrate on the hash-checking when combining. Use --debug=process to include these details for debugging. --- CHANGES.rst | 6 +++--- coverage/sqldata.py | 21 ++++++++++++++------- doc/cmd.rst | 3 ++- doc/dbschema.rst | 5 +++-- tests/test_data.py | 20 ++++++++++++++++++++ 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 5e3fb44c6..00aa97f01 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -31,8 +31,8 @@ Unreleased - Combining data files with ``coverage combine`` now quickly hashes the data files to skip files that provide no new information. This can reduce the - time needed. For coverage.py's own test suite, combining was about 17% - faster. + time needed. Many details affect the results, but for coverage.py's own test + suite, combining was about 40% faster. - When searching for completely unexecuted files, coverage.py uses the presence of ``__init__.py`` files to determine which directories have source that @@ -51,7 +51,7 @@ Unreleased - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. -- The ``[run] note`` setting has been completely removed. +- The deprecated ``[run] note`` setting has been completely removed. .. _implicit namespace packages: https://peps.python.org/pep-0420/ .. _issue 1383: https://github.com/nedbat/coveragepy/issues/1383 diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 2fbc53f5c..ea6b1199f 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -4,6 +4,7 @@ """SQLite coverage data.""" import collections +import datetime import functools import glob import itertools @@ -51,10 +52,11 @@ key text, value text, unique (key) - -- Keys: + -- Possible keys: -- 'has_arcs' boolean -- Is this data recording branches? -- 'sys_argv' text -- The coverage command line that recorded the data. -- 'version' text -- The version of coverage.py that made the file. + -- 'when' text -- Datetime when the file was created. ); CREATE TABLE file ( @@ -298,13 +300,18 @@ def _init_db(self, db): self._debug.write(f"Initing data file {self._filename!r}") db.executescript(SCHEMA) db.execute("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) - db.executemany( - "insert or ignore into meta (key, value) values (?, ?)", - [ + + # When writing metadata, avoid information that will needlessly change + # the hash of the data file, unless we're debugging processes. + meta_data = [ + ("version", __version__), + ] + if self._debug.should("process"): + meta_data.extend([ ("sys_argv", str(getattr(sys, "argv", None))), - ("version", __version__), - ] - ) + ("when", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), + ]) + db.executemany("insert or ignore into meta (key, value) values (?, ?)", meta_data) def _connect(self): """Get the SqliteDb object to use.""" diff --git a/doc/cmd.rst b/doc/cmd.rst index be323c0cd..919b6d88e 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -1025,7 +1025,8 @@ of operation to log: * ``plugin``: print information about plugin operations. * ``process``: show process creation information, and changes in the current - directory. + directory. This also writes a timestamp and command arguments into the data + file. * ``pybehave``: show the values of `internal flags `_ describing the behavior of the current version of Python. diff --git a/doc/dbschema.rst b/doc/dbschema.rst index 42e616d98..b576acaaf 100644 --- a/doc/dbschema.rst +++ b/doc/dbschema.rst @@ -66,10 +66,11 @@ This is the database schema: key text, value text, unique (key) - -- Keys: + -- Possible keys: -- 'has_arcs' boolean -- Is this data recording branches? -- 'sys_argv' text -- The coverage command line that recorded the data. -- 'version' text -- The version of coverage.py that made the file. + -- 'when' text -- Datetime when the file was created. ); CREATE TABLE file ( @@ -115,7 +116,7 @@ This is the database schema: foreign key (file_id) references file (id) ); -.. [[[end]]] (checksum: 9d87794485a9aa6d9064b735972a3447) +.. [[[end]]] (checksum: 6a04d14b07f08f86cccf43056328dcb7) .. _numbits: diff --git a/tests/test_data.py b/tests/test_data.py index b1a215e23..79c90420b 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -904,6 +904,26 @@ def test_combining_with_crazy_filename(self, dpart, fpart): assert_measured_files(covdata3, MEASURED_FILES_1_2) self.assert_file_count(glob.escape(basename) + ".*", 0) + def test_meta_data(self): + # The metadata written to the data file shouldn't interfere with + # hashing to remove duplicates, except for debug=process, which + # writes debugging info as metadata. + debug = DebugControlString(options=[]) + covdata1 = CoverageData(basename="meta.1", debug=debug) + covdata1.add_lines(LINES_1) + covdata1.write() + with sqlite3.connect("meta.1") as con: + data = sorted(k for (k,) in con.execute("select key from meta")) + assert data == ["has_arcs", "version"] + + debug = DebugControlString(options=["process"]) + covdata2 = CoverageData(basename="meta.2", debug=debug) + covdata2.add_lines(LINES_1) + covdata2.write() + with sqlite3.connect("meta.2") as con: + data = sorted(k for (k,) in con.execute("select key from meta")) + assert data == ["has_arcs", "sys_argv", "version", "when"] + class DumpsLoadsTest(CoverageTest): """Tests of CoverageData.dumps and loads.""" From a4e538452ced8db9b1bcd592ba83f2ddd60afe82 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 20 Nov 2022 11:32:30 -0500 Subject: [PATCH 076/200] build: cheats for commit-specific installs --- igor.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/igor.py b/igor.py index 510d6adfe..40fc94b86 100644 --- a/igor.py +++ b/igor.py @@ -393,6 +393,7 @@ def get_release_facts(): facts.next_vi = (facts.vi[0], facts.vi[1], facts.vi[2]+1, "alpha", 0) facts.now = datetime.datetime.now() facts.branch = subprocess.getoutput("git rev-parse --abbrev-ref @") + facts.sha = subprocess.getoutput("git rev-parse @") return facts @@ -466,7 +467,12 @@ def do_cheats(): print() print(f"Coverage version is {facts.ver}") - print(f"pip install git+https://github.com/nedbat/coveragepy@{facts.branch}") + egg = "egg=coverage==0.0" # to force a re-install + if facts.branch == "master": + print(f"pip install git+https://github.com/nedbat/coveragepy#{egg}") + else: + print(f"pip install git+https://github.com/nedbat/coveragepy@{facts.branch}#{egg}") + print(f"pip install git+https://github.com/nedbat/coveragepy@{facts.sha}#{egg}") print(f"https://coverage.readthedocs.io/en/{facts.ver}/changes.html#changes-{facts.anchor}") print( From 783129cf04363a3fcce427c3715d5d38885f4f41 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 25 Nov 2022 14:10:41 -0500 Subject: [PATCH 077/200] docs: add issue 1483 to the changelog --- CHANGES.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 00aa97f01..2fd7447c7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -32,7 +32,7 @@ Unreleased - Combining data files with ``coverage combine`` now quickly hashes the data files to skip files that provide no new information. This can reduce the time needed. Many details affect the results, but for coverage.py's own test - suite, combining was about 40% faster. + suite, combining was about 40% faster. Closes `issue 1483`_. - When searching for completely unexecuted files, coverage.py uses the presence of ``__init__.py`` files to determine which directories have source that @@ -58,6 +58,7 @@ Unreleased .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 .. _issue 1470: https://github.com/nedbat/coveragepy/issues/1470 +.. _issue 1483: https://github.com/nedbat/coveragepy/issues/1483 .. _pull 1387: https://github.com/nedbat/coveragepy/pull/1387 .. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 From 92248667ff232f925bb63b7ed7522259ba9114d7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 26 Nov 2022 08:36:58 -0500 Subject: [PATCH 078/200] style: long arg lists should be one per line --- coverage/control.py | 193 ++++++++++++++++++++++++++++++++------------ 1 file changed, 142 insertions(+), 51 deletions(-) diff --git a/coverage/control.py b/coverage/control.py index 7315fb397..2e58ad85c 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -105,10 +105,22 @@ def current(cls): return None def __init__( - self, data_file=DEFAULT_DATAFILE, data_suffix=None, cover_pylib=None, - auto_data=False, timid=None, branch=None, config_file=True, - source=None, source_pkgs=None, omit=None, include=None, debug=None, - concurrency=None, check_preimported=False, context=None, + self, + data_file=DEFAULT_DATAFILE, + data_suffix=None, + cover_pylib=None, + auto_data=False, + timid=None, + branch=None, + config_file=True, + source=None, + source_pkgs=None, + omit=None, + include=None, + debug=None, + concurrency=None, + check_preimported=False, + context=None, messages=False, ): # pylint: disable=too-many-arguments """ @@ -244,12 +256,22 @@ def __init__( # Build our configuration from a number of sources. self.config = read_coverage_config( - config_file=config_file, warn=self._warn, - data_file=data_file, cover_pylib=cover_pylib, timid=timid, - branch=branch, parallel=bool_or_none(data_suffix), - source=source, source_pkgs=source_pkgs, run_omit=omit, run_include=include, debug=debug, - report_omit=omit, report_include=include, - concurrency=concurrency, context=context, + config_file=config_file, + warn=self._warn, + data_file=data_file, + cover_pylib=cover_pylib, + timid=timid, + branch=branch, + parallel=bool_or_none(data_suffix), + source=source, + source_pkgs=source_pkgs, + run_omit=omit, + run_include=include, + debug=debug, + report_omit=omit, + report_include=include, + concurrency=concurrency, + context=context, ) # If we have sub-process measurement happening automatically, then we @@ -904,9 +926,18 @@ def _get_file_reporters(self, morfs=None): return file_reporters def report( - self, morfs=None, show_missing=None, ignore_errors=None, - file=None, omit=None, include=None, skip_covered=None, - contexts=None, skip_empty=None, precision=None, sort=None, + self, + morfs=None, + show_missing=None, + ignore_errors=None, + file=None, + omit=None, + include=None, + skip_covered=None, + contexts=None, + skip_empty=None, + precision=None, + sort=None, output_format=None, ): """Write a textual summary report to `file`. @@ -961,17 +992,28 @@ def report( """ with override_config( self, - ignore_errors=ignore_errors, report_omit=omit, report_include=include, - show_missing=show_missing, skip_covered=skip_covered, - report_contexts=contexts, skip_empty=skip_empty, precision=precision, - sort=sort, format=output_format, + ignore_errors=ignore_errors, + report_omit=omit, + report_include=include, + show_missing=show_missing, + skip_covered=skip_covered, + report_contexts=contexts, + skip_empty=skip_empty, + precision=precision, + sort=sort, + format=output_format, ): reporter = SummaryReporter(self) return reporter.report(morfs, outfile=file) def annotate( - self, morfs=None, directory=None, ignore_errors=None, - omit=None, include=None, contexts=None, + self, + morfs=None, + directory=None, + ignore_errors=None, + omit=None, + include=None, + contexts=None, ): """Annotate a list of modules. @@ -992,18 +1034,30 @@ def annotate( print("The annotate command will be removed in a future version.") print("Get in touch if you still use it: ned@nedbatchelder.com") - with override_config(self, - ignore_errors=ignore_errors, report_omit=omit, - report_include=include, report_contexts=contexts, + with override_config( + self, + ignore_errors=ignore_errors, + report_omit=omit, + report_include=include, + report_contexts=contexts, ): reporter = AnnotateReporter(self) reporter.report(morfs, directory=directory) def html_report( - self, morfs=None, directory=None, ignore_errors=None, - omit=None, include=None, extra_css=None, title=None, - skip_covered=None, show_contexts=None, contexts=None, - skip_empty=None, precision=None, + self, + morfs=None, + directory=None, + ignore_errors=None, + omit=None, + include=None, + extra_css=None, + title=None, + skip_covered=None, + show_contexts=None, + contexts=None, + skip_empty=None, + precision=None, ): """Generate an HTML report. @@ -1029,19 +1083,33 @@ def html_report( changing the files in the report folder. """ - with override_config(self, - ignore_errors=ignore_errors, report_omit=omit, report_include=include, - html_dir=directory, extra_css=extra_css, html_title=title, - html_skip_covered=skip_covered, show_contexts=show_contexts, report_contexts=contexts, - html_skip_empty=skip_empty, precision=precision, + with override_config( + self, + ignore_errors=ignore_errors, + report_omit=omit, + report_include=include, + html_dir=directory, + extra_css=extra_css, + html_title=title, + html_skip_covered=skip_covered, + show_contexts=show_contexts, + report_contexts=contexts, + html_skip_empty=skip_empty, + precision=precision, ): reporter = HtmlReporter(self) ret = reporter.report(morfs) return ret def xml_report( - self, morfs=None, outfile=None, ignore_errors=None, - omit=None, include=None, contexts=None, skip_empty=None, + self, + morfs=None, + outfile=None, + ignore_errors=None, + omit=None, + include=None, + contexts=None, + skip_empty=None, ): """Generate an XML report of coverage results. @@ -1055,16 +1123,27 @@ def xml_report( Returns a float, the total percentage covered. """ - with override_config(self, - ignore_errors=ignore_errors, report_omit=omit, report_include=include, - xml_output=outfile, report_contexts=contexts, skip_empty=skip_empty, + with override_config( + self, + ignore_errors=ignore_errors, + report_omit=omit, + report_include=include, + xml_output=outfile, + report_contexts=contexts, + skip_empty=skip_empty, ): return render_report(self.config.xml_output, XmlReporter(self), morfs, self._message) def json_report( - self, morfs=None, outfile=None, ignore_errors=None, - omit=None, include=None, contexts=None, pretty_print=None, - show_contexts=None + self, + morfs=None, + outfile=None, + ignore_errors=None, + omit=None, + include=None, + contexts=None, + pretty_print=None, + show_contexts=None, ): """Generate a JSON report of coverage results. @@ -1078,16 +1157,26 @@ def json_report( .. versionadded:: 5.0 """ - with override_config(self, - ignore_errors=ignore_errors, report_omit=omit, report_include=include, - json_output=outfile, report_contexts=contexts, json_pretty_print=pretty_print, - json_show_contexts=show_contexts + with override_config( + self, + ignore_errors=ignore_errors, + report_omit=omit, + report_include=include, + json_output=outfile, + report_contexts=contexts, + json_pretty_print=pretty_print, + json_show_contexts=show_contexts, ): return render_report(self.config.json_output, JsonReporter(self), morfs, self._message) def lcov_report( - self, morfs=None, outfile=None, ignore_errors=None, - omit=None, include=None, contexts=None, + self, + morfs=None, + outfile=None, + ignore_errors=None, + omit=None, + include=None, + contexts=None, ): """Generate an LCOV report of coverage results. @@ -1098,9 +1187,13 @@ def lcov_report( .. versionadded:: 6.3 """ - with override_config(self, - ignore_errors=ignore_errors, report_omit=omit, report_include=include, - lcov_output=outfile, report_contexts=contexts, + with override_config( + self, + ignore_errors=ignore_errors, + report_omit=omit, + report_include=include, + lcov_output=outfile, + report_contexts=contexts, ): return render_report(self.config.lcov_output, LcovReporter(self), morfs, self._message) @@ -1134,9 +1227,7 @@ def plugin_info(plugins): ('configs_read', self.config.config_files_read), ('config_file', self.config.config_file), ('config_contents', - repr(self.config._config_contents) - if self.config._config_contents - else '-none-' + repr(self.config._config_contents) if self.config._config_contents else '-none-' ), ('data_file', self._data.data_filename() if self._data is not None else "-none-"), ('python', sys.version.replace('\n', '')), From ff9839f5e2511f0c19332648e4dc61677a702ee6 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 26 Nov 2022 09:07:41 -0500 Subject: [PATCH 079/200] chore: make upgrade --- doc/requirements.pip | 18 +++---- requirements/dev.pip | 60 +++++++++++------------ requirements/kit.pip | 24 ++++----- requirements/light-threads.pip | 90 ++++++++++++++++------------------ requirements/lint.pip | 60 +++++++++++------------ requirements/pip-tools.pip | 24 ++++----- requirements/pip.pip | 12 ++--- requirements/pytest.pip | 24 ++++----- requirements/tox.pip | 18 +++---- 9 files changed, 163 insertions(+), 167 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 83d3eb41b..2c8066ec7 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -42,9 +42,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # sphinx # sphinxcontrib-spelling @@ -199,11 +199,11 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -urllib3==1.26.12 \ - --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ - --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 # via requests -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via importlib-metadata diff --git a/requirements/dev.pip b/requirements/dev.pip index 65bdc5ae3..db47acf25 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -4,9 +4,9 @@ # # make upgrade # -astroid==2.12.12 \ - --hash=sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83 \ - --hash=sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f +astroid==2.12.13 \ + --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ + --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 # via pylint atomicwrites==1.4.1 \ --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 @@ -76,9 +76,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -exceptiongroup==1.0.2 \ - --hash=sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695 \ - --hash=sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27 +exceptiongroup==1.0.4 \ + --hash=sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828 \ + --hash=sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec # via # -r requirements/pytest.pip # hypothesis @@ -167,17 +167,17 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.56.4 \ - --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ - --hash=sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d +hypothesis==6.58.1 \ + --hash=sha256:8738b9b38c2b2c214d965b07f29312047b970541d848cb97d2a58f79fd61fbe6 \ + --hash=sha256:b5747497b2b352335e4dc51f1b113cfc90c49ffd174f2036f173edf8799e123a # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via requests -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -203,9 +203,9 @@ jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a # via keyring -jedi==0.18.1 \ - --hash=sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d \ - --hash=sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab +jedi==0.18.2 \ + --hash=sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e \ + --hash=sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612 # via pudb keyring==23.11.0 \ --hash=sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e \ @@ -299,9 +299,9 @@ pygments==2.13.0 \ # pudb # readme-renderer # rich -pylint==2.15.5 \ - --hash=sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df \ - --hash=sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004 +pylint==2.15.6 \ + --hash=sha256:15060cc22ed6830a4049cf40bc24977744df2e554d38da1b2657591de5bcd052 \ + --hash=sha256:25b13ddcf5af7d112cf96935e21806c1da60e676f952efb650130f2a4483421c # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -379,9 +379,9 @@ tomlkit==0.11.6 \ --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via pylint -tox==3.27.0 \ - --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ - --hash=sha256:d2c945f02a03d4501374a3d5430877380deb69b218b1df9b7f1d2f2a10befaf9 +tox==3.27.1 \ + --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ + --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 # via -r requirements/dev.in twine==4.0.1 \ --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ @@ -423,9 +423,9 @@ typing-extensions==4.4.0 \ # importlib-metadata # pylint # rich -urllib3==1.26.12 \ - --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ - --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 # via # requests # twine @@ -513,9 +513,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -527,7 +527,7 @@ pip==22.3.1 \ --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via -r requirements/pip.pip -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 # via check-manifest diff --git a/requirements/kit.pip b/requirements/kit.pip index 57a94b9b0..80a43432a 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -4,9 +4,9 @@ # # make upgrade # -auditwheel==5.2.1 \ - --hash=sha256:504f9ca38bd884ce75f59e066ec80373abfc94ee65d0f807fe99f2b1d9ba774a \ - --hash=sha256:587f4c7a56483349e3de3833d7d881bf325b82f47340e429ce38a259a1c810d8 +auditwheel==5.3.0 \ + --hash=sha256:1da1af54de5badd10149250c257a799be003fd976794716f17914e3d4b4a9fc9 \ + --hash=sha256:d0be87b5b6fb767eacf1ea4afa3292574cb0f4473a3c0ba55bc9dff1d0b5a333 # via -r requirements/kit.in bashlex==0.16 \ --hash=sha256:dc6f017e49ce2d0fe30ad9f5206da9cd13ded073d365688c9fda525354e8c373 \ @@ -36,9 +36,9 @@ filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 # via cibuildwheel -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # auditwheel # build @@ -82,15 +82,15 @@ wheel==0.38.4 \ --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via -r requirements/kit.in -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via # importlib-metadata # pep517 # The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 # via -r requirements/kit.in diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 89dc140c7..a97ec9ebc 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -74,9 +74,9 @@ dnspython==2.2.1 \ --hash=sha256:0f7569a4a6ff151958b64304071d370daa3243d15941a7beedf0c9fe5105603e \ --hash=sha256:a851e51367fb93e9e1361732c1d60dab63eff98712e503ea7d92e6eccb109b4f # via eventlet -eventlet==0.33.1 \ - --hash=sha256:a085922698e5029f820cf311a648ac324d73cec0e4792877609d978a4b5bbf31 \ - --hash=sha256:afbe17f06a58491e9aebd7a4a03e70b0b63fd4cf76d8307bae07f280479b1515 +eventlet==0.33.2 \ + --hash=sha256:82c382c2a2c712f1a8320378a9120ac9589d9f1131c36a63780f0b8504afa5bc \ + --hash=sha256:96039b9389dbb4431b1c0a6e42ea1326628cc7ad63a6280b02947f111d3d8e04 # via -r requirements/light-threads.in gevent==22.10.2 \ --hash=sha256:018f93de7d5318d2fb440f846839a4464738468c3476d5c9cf7da45bb71c18bd \ @@ -98,7 +98,6 @@ gevent==22.10.2 \ --hash=sha256:4197d423e198265eef39a0dea286ef389da9148e070310f34455ecee8172c391 \ --hash=sha256:494c7f29e94df9a1c3157d67bb7edfa32a46eed786e04d9ee68d39f375e30001 \ --hash=sha256:4e2f008c82dc54ec94f4de12ca6feea60e419babb48ec145456907ae61625aa4 \ - --hash=sha256:526ff5b6fc7e9de686859ae1b0f0ddf60a65cead2241ddc9c9b074185f0e2e9c \ --hash=sha256:53ee7f170ed42c7561fe8aff5d381dc9a4124694e70580d0c02fba6aafc0ea37 \ --hash=sha256:54f4bfd74c178351a4a05c5c7df6f8a0a279ff6f392b57608ce0e83c768207f9 \ --hash=sha256:58898dbabb5b11e4d0192aae165ad286dc6742c543e1be9d30dc82753547c508 \ @@ -210,50 +209,47 @@ zope-event==4.5.0 \ --hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \ --hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330 # via gevent -zope-interface==5.5.1 \ - --hash=sha256:026e7da51147910435950a46c55159d68af319f6e909f14873d35d411f4961db \ - --hash=sha256:061a41a3f96f076686d7f1cb87f3deec6f0c9f0325dcc054ac7b504ae9bb0d82 \ - --hash=sha256:0eda7f61da6606a28b5efa5d8ad79b4b5bb242488e53a58993b2ec46c924ffee \ - --hash=sha256:13a7c6e3df8aa453583412de5725bf761217d06f66ff4ed776d44fbcd13ec4e4 \ - --hash=sha256:185f0faf6c3d8f2203e8755f7ca16b8964d97da0abde89c367177a04e36f2568 \ - --hash=sha256:2204a9d545fdbe0d9b0bf4d5e2fc67e7977de59666f7131c1433fde292fc3b41 \ - --hash=sha256:27c53aa2f46d42940ccdcb015fd525a42bf73f94acd886296794a41f229d5946 \ - --hash=sha256:3c293c5c0e1cabe59c33e0d02fcee5c3eb365f79a20b8199a26ca784e406bd0d \ - --hash=sha256:3e42b1c3f4fd863323a8275c52c78681281a8f2e1790f0e869d911c1c7b25c46 \ - --hash=sha256:3e5540b7d703774fd171b7a7dc2a3cb70e98fc273b8b260b1bf2f7d3928f125b \ - --hash=sha256:4477930451521ac7da97cc31d49f7b83086d5ae76e52baf16aac659053119f6d \ - --hash=sha256:475b6e371cdbeb024f2302e826222bdc202186531f6dc095e8986c034e4b7961 \ - --hash=sha256:489c4c46fcbd9364f60ff0dcb93ec9026eca64b2f43dc3b05d0724092f205e27 \ - --hash=sha256:509a8d39b64a5e8d473f3f3db981f3ca603d27d2bc023c482605c1b52ec15662 \ - --hash=sha256:58331d2766e8e409360154d3178449d116220348d46386430097e63d02a1b6d2 \ - --hash=sha256:59a96d499ff6faa9b85b1309f50bf3744eb786e24833f7b500cbb7052dc4ae29 \ - --hash=sha256:6cb8f9a1db47017929634264b3fc7ea4c1a42a3e28d67a14f14aa7b71deaa0d2 \ - --hash=sha256:6d678475fdeb11394dc9aaa5c564213a1567cc663082e0ee85d52f78d1fbaab2 \ - --hash=sha256:72a93445937cc71f0b8372b0c9e7c185328e0db5e94d06383a1cb56705df1df4 \ - --hash=sha256:76cf472c79d15dce5f438a4905a1309be57d2d01bc1de2de30bda61972a79ab4 \ - --hash=sha256:7b4547a2f624a537e90fb99cec4d8b3b6be4af3f449c3477155aae65396724ad \ - --hash=sha256:7f2e4ebe0a000c5727ee04227cf0ff5ae612fe599f88d494216e695b1dac744d \ - --hash=sha256:8343536ea4ee15d6525e3e726bb49ffc3f2034f828a49237a36be96842c06e7c \ - --hash=sha256:8de7bde839d72d96e0c92e8d1fdb4862e89b8fc52514d14b101ca317d9bcf87c \ - --hash=sha256:90f611d4cdf82fb28837fe15c3940255755572a4edf4c72e2306dbce7dcb3092 \ - --hash=sha256:9ad58724fabb429d1ebb6f334361f0a3b35f96be0e74bfca6f7de8530688b2df \ - --hash=sha256:a1393229c9c126dd1b4356338421e8882347347ab6fe3230cb7044edc813e424 \ - --hash=sha256:a20fc9cccbda2a28e8db8cabf2f47fead7e9e49d317547af6bf86a7269e4b9a1 \ - --hash=sha256:a69f6d8b639f2317ba54278b64fef51d8250ad2c87acac1408b9cc461e4d6bb6 \ - --hash=sha256:a6f51ffbdcf865f140f55c484001415505f5e68eb0a9eab1d37d0743b503b423 \ - --hash=sha256:c9552ee9e123b7997c7630fb95c466ee816d19e721c67e4da35351c5f4032726 \ - --hash=sha256:cd423d49abcf0ebf02c29c3daffe246ff756addb891f8aab717b3a4e2e1fd675 \ - --hash=sha256:d0587d238b7867544134f4dcca19328371b8fd03fc2c56d15786f410792d0a68 \ - --hash=sha256:d1f2d91c9c6cd54d750fa34f18bd73c71b372d0e6d06843bc7a5f21f5fd66fe0 \ - --hash=sha256:d743b03a72fefed807a4512c079fb1aa5e7777036cc7a4b6ff79ae4650a14f73 \ - --hash=sha256:dd4b9251e95020c3d5d104b528dbf53629d09c146ce9c8dfaaf8f619ae1cce35 \ - --hash=sha256:e4988d94962f517f6da2d52337170b84856905b31b7dc504ed9c7b7e4bab2fc3 \ - --hash=sha256:e6a923d2dec50f2b4d41ce198af3516517f2e458220942cf393839d2f9e22000 \ - --hash=sha256:e8c8764226daad39004b7873c3880eb4860c594ff549ea47c045cdf313e1bad5 +zope-interface==5.5.2 \ + --hash=sha256:008b0b65c05993bb08912f644d140530e775cf1c62a072bf9340c2249e613c32 \ + --hash=sha256:0217a9615531c83aeedb12e126611b1b1a3175013bbafe57c702ce40000eb9a0 \ + --hash=sha256:0fb497c6b088818e3395e302e426850f8236d8d9f4ef5b2836feae812a8f699c \ + --hash=sha256:17ebf6e0b1d07ed009738016abf0d0a0f80388e009d0ac6e0ead26fc162b3b9c \ + --hash=sha256:311196634bb9333aa06f00fc94f59d3a9fddd2305c2c425d86e406ddc6f2260d \ + --hash=sha256:3218ab1a7748327e08ef83cca63eea7cf20ea7e2ebcb2522072896e5e2fceedf \ + --hash=sha256:404d1e284eda9e233c90128697c71acffd55e183d70628aa0bbb0e7a3084ed8b \ + --hash=sha256:4087e253bd3bbbc3e615ecd0b6dd03c4e6a1e46d152d3be6d2ad08fbad742dcc \ + --hash=sha256:40f4065745e2c2fa0dff0e7ccd7c166a8ac9748974f960cd39f63d2c19f9231f \ + --hash=sha256:5334e2ef60d3d9439c08baedaf8b84dc9bb9522d0dacbc10572ef5609ef8db6d \ + --hash=sha256:604cdba8f1983d0ab78edc29aa71c8df0ada06fb147cea436dc37093a0100a4e \ + --hash=sha256:6373d7eb813a143cb7795d3e42bd8ed857c82a90571567e681e1b3841a390d16 \ + --hash=sha256:655796a906fa3ca67273011c9805c1e1baa047781fca80feeb710328cdbed87f \ + --hash=sha256:65c3c06afee96c654e590e046c4a24559e65b0a87dbff256cd4bd6f77e1a33f9 \ + --hash=sha256:696f3d5493eae7359887da55c2afa05acc3db5fc625c49529e84bd9992313296 \ + --hash=sha256:6e972493cdfe4ad0411fd9abfab7d4d800a7317a93928217f1a5de2bb0f0d87a \ + --hash=sha256:7579960be23d1fddecb53898035a0d112ac858c3554018ce615cefc03024e46d \ + --hash=sha256:765d703096ca47aa5d93044bf701b00bbce4d903a95b41fff7c3796e747b1f1d \ + --hash=sha256:7e66f60b0067a10dd289b29dceabd3d0e6d68be1504fc9d0bc209cf07f56d189 \ + --hash=sha256:8a2ffadefd0e7206adc86e492ccc60395f7edb5680adedf17a7ee4205c530df4 \ + --hash=sha256:959697ef2757406bff71467a09d940ca364e724c534efbf3786e86eee8591452 \ + --hash=sha256:9d783213fab61832dbb10d385a319cb0e45451088abd45f95b5bb88ed0acca1a \ + --hash=sha256:a16025df73d24795a0bde05504911d306307c24a64187752685ff6ea23897cb0 \ + --hash=sha256:a2ad597c8c9e038a5912ac3cf166f82926feff2f6e0dabdab956768de0a258f5 \ + --hash=sha256:bfee1f3ff62143819499e348f5b8a7f3aa0259f9aca5e0ddae7391d059dce671 \ + --hash=sha256:d169ccd0756c15bbb2f1acc012f5aab279dffc334d733ca0d9362c5beaebe88e \ + --hash=sha256:d514c269d1f9f5cd05ddfed15298d6c418129f3f064765295659798349c43e6f \ + --hash=sha256:d692374b578360d36568dd05efb8a5a67ab6d1878c29c582e37ddba80e66c396 \ + --hash=sha256:dbaeb9cf0ea0b3bc4b36fae54a016933d64c6d52a94810a63c00f440ecb37dd7 \ + --hash=sha256:dc26c8d44472e035d59d6f1177eb712888447f5799743da9c398b0339ed90b1b \ + --hash=sha256:e1574980b48c8c74f83578d1e77e701f8439a5d93f36a5a0af31337467c08fcf \ + --hash=sha256:e74a578172525c20d7223eac5f8ad187f10940dac06e40113d62f14f3adb1e8f \ + --hash=sha256:e945de62917acbf853ab968d8916290548df18dd62c739d862f359ecd25842a6 \ + --hash=sha256:f0980d44b8aded808bec5059018d64692f0127f10510eca71f2f0ace8fb11188 \ + --hash=sha256:f98d4bd7bbb15ca701d19b93263cc5edfd480c3475d163f137385f49e5b3a3a7 \ + --hash=sha256:fb68d212efd057596dee9e6582daded9f8ef776538afdf5feceb3059df2d2e7b # via gevent # The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 # via gevent diff --git a/requirements/lint.pip b/requirements/lint.pip index 8eadf426a..7c74a68ea 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -8,9 +8,9 @@ alabaster==0.7.12 \ --hash=sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359 \ --hash=sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02 # via sphinx -astroid==2.12.12 \ - --hash=sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83 \ - --hash=sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f +astroid==2.12.13 \ + --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ + --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 # via pylint atomicwrites==1.4.1 \ --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 @@ -91,9 +91,9 @@ docutils==0.17.1 \ # readme-renderer # sphinx # sphinx-rtd-theme -exceptiongroup==1.0.2 \ - --hash=sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695 \ - --hash=sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27 +exceptiongroup==1.0.4 \ + --hash=sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828 \ + --hash=sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec # via # -r requirements/pytest.pip # hypothesis @@ -182,9 +182,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.56.4 \ - --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ - --hash=sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d +hypothesis==6.58.1 \ + --hash=sha256:8738b9b38c2b2c214d965b07f29312047b970541d848cb97d2a58f79fd61fbe6 \ + --hash=sha256:b5747497b2b352335e4dc51f1b113cfc90c49ffd174f2036f173edf8799e123a # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -194,9 +194,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -224,9 +224,9 @@ jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a # via keyring -jedi==0.18.1 \ - --hash=sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d \ - --hash=sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab +jedi==0.18.2 \ + --hash=sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e \ + --hash=sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612 # via pudb jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ @@ -379,9 +379,9 @@ pygments==2.13.0 \ # readme-renderer # rich # sphinx -pylint==2.15.5 \ - --hash=sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df \ - --hash=sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004 +pylint==2.15.6 \ + --hash=sha256:15060cc22ed6830a4049cf40bc24977744df2e554d38da1b2657591de5bcd052 \ + --hash=sha256:25b13ddcf5af7d112cf96935e21806c1da60e676f952efb650130f2a4483421c # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -531,9 +531,9 @@ tornado==6.2 \ --hash=sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e \ --hash=sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b # via livereload -tox==3.27.0 \ - --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ - --hash=sha256:d2c945f02a03d4501374a3d5430877380deb69b218b1df9b7f1d2f2a10befaf9 +tox==3.27.1 \ + --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ + --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 # via -r requirements/dev.in twine==4.0.1 \ --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ @@ -575,9 +575,9 @@ typing-extensions==4.4.0 \ # importlib-metadata # pylint # rich -urllib3==1.26.12 \ - --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ - --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 # via # requests # twine @@ -665,9 +665,9 @@ wrapt==1.14.1 \ --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af # via astroid -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via # -r requirements/pip.pip # -r requirements/pytest.pip @@ -679,7 +679,7 @@ pip==22.3.1 \ --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via -r requirements/pip.pip -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 # via check-manifest diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index e264d9fd9..96e16c7e3 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -12,9 +12,9 @@ click==8.1.3 \ --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 # via pip-tools -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # build # click @@ -27,9 +27,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -pip-tools==6.9.0 \ - --hash=sha256:16ea0ced6a1d8a7dfbd5e14d5bf659acffa63f3efd0702233dc685f066c00a6b \ - --hash=sha256:b4762359978fd81a2b4b666e6dca15266bdc65680d06900c4da34243f35e4b5d +pip-tools==6.10.0 \ + --hash=sha256:57ac98392548f5ca96c2831927deec3035efe81ff476e3c744bd474ca9c6a1f2 \ + --hash=sha256:7f9f7356052db6942b5aaabc8eba29983591ca0ad75affbf2f0a25d9361be624 # via -r requirements/pip-tools.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -49,9 +49,9 @@ wheel==0.38.4 \ --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via pip-tools -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via # importlib-metadata # pep517 @@ -61,7 +61,7 @@ pip==22.3.1 \ --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 # via pip-tools -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 # via pip-tools diff --git a/requirements/pip.pip b/requirements/pip.pip index ede9c4eac..d4f8cc870 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -12,9 +12,9 @@ filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 # via virtualenv -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via virtualenv platformdirs==2.5.4 \ --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ @@ -28,9 +28,9 @@ virtualenv==20.16.7 \ --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via -r requirements/pip.in -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 01eb46e48..270232e6c 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -25,9 +25,9 @@ decorator==5.1.1 \ --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 # via pycontracts -exceptiongroup==1.0.2 \ - --hash=sha256:a31cd183c3dea02e617aab5153588d5f7258a77b51f0ef41b3815ae8a0d0f695 \ - --hash=sha256:c22f11ec6a10d2b453871c5c5fe887436c4d1961324ce9090f2ca6ddc4180c27 +exceptiongroup==1.0.4 \ + --hash=sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828 \ + --hash=sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec # via # hypothesis # pytest @@ -42,13 +42,13 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.56.4 \ - --hash=sha256:313bc1c0f377ec6c98815d3237a69add7558eadee4effe4ed613d0ba36513a52 \ - --hash=sha256:67950103ee930c66673494b3671474a083ea71f1ebe8f0ff849ba8ad5317772d +hypothesis==6.58.1 \ + --hash=sha256:8738b9b38c2b2c214d965b07f29312047b970541d848cb97d2a58f79fd61fbe6 \ + --hash=sha256:b5747497b2b352335e4dc51f1b113cfc90c49ffd174f2036f173edf8799e123a # via -r requirements/pytest.in -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # pluggy # pytest @@ -102,7 +102,7 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via importlib-metadata diff --git a/requirements/tox.pip b/requirements/tox.pip index e8b545db4..890f88899 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -18,9 +18,9 @@ filelock==3.8.0 \ # via # tox # virtualenv -importlib-metadata==5.0.0 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 +importlib-metadata==5.1.0 \ + --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ + --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via # pluggy # tox @@ -57,9 +57,9 @@ tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via tox -tox==3.27.0 \ - --hash=sha256:89e4bc6df3854e9fc5582462e328dd3660d7d865ba625ae5881bbc63836a6324 \ - --hash=sha256:d2c945f02a03d4501374a3d5430877380deb69b218b1df9b7f1d2f2a10befaf9 +tox==3.27.1 \ + --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ + --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 # via # -r requirements/tox.in # tox-gh-actions @@ -75,9 +75,9 @@ virtualenv==20.16.7 \ --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via tox -zipp==3.10.0 \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 # via # importlib-metadata # importlib-resources From 0818611c63a243e35a710d325bc63ffa93ef3cd7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 26 Nov 2022 14:09:29 -0500 Subject: [PATCH 080/200] feat: implicit path mapping during reporting. #1212 --- CHANGES.rst | 7 ++ coverage/control.py | 36 ++++++++--- coverage/sqldata.py | 7 +- doc/config.rst | 4 ++ tests/coveragetest.py | 5 +- tests/test_api.py | 146 +++++++++++++++++++++++++++++++++++++++++- 6 files changed, 192 insertions(+), 13 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2fd7447c7..b1d94dbdc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -29,6 +29,11 @@ Unreleased - Using ``--format=total`` will write a single total number to the output. This can be useful for making badges or writing status updates. +- Reporting operations now use the ``[paths]`` setting to remap file paths + within a single data file. Combining multiple files still requires the + ``coverage combine`` step, but this simplifies some situations. Closes + `issue 1212`_ and `issue 713`_. + - Combining data files with ``coverage combine`` now quickly hashes the data files to skip files that provide no new information. This can reduce the time needed. Many details affect the results, but for coverage.py's own test @@ -54,6 +59,8 @@ Unreleased - The deprecated ``[run] note`` setting has been completely removed. .. _implicit namespace packages: https://peps.python.org/pep-0420/ +.. _issue 713: https://github.com/nedbat/coveragepy/issues/713 +.. _issue 1212: https://github.com/nedbat/coveragepy/issues/1212 .. _issue 1383: https://github.com/nedbat/coveragepy/issues/1383 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 diff --git a/coverage/control.py b/coverage/control.py index 2e58ad85c..c0497478b 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -733,6 +733,18 @@ def save(self): data = self.get_data() data.write() + def _make_aliases(self): + """Create a PathAliases from our configuration.""" + aliases = PathAliases( + debugfn=(self._debug.write if self._debug.should("pathmap") else None), + relative=self.config.relative_files, + ) + for paths in self.config.paths.values(): + result = paths[0] + for pattern in paths[1:]: + aliases.add(pattern, result) + return aliases + def combine(self, data_paths=None, strict=False, keep=False): """Combine together a number of similarly-named coverage data files. @@ -764,18 +776,9 @@ def combine(self, data_paths=None, strict=False, keep=False): self._post_init() self.get_data() - aliases = PathAliases( - debugfn=(self._debug.write if self._debug.should("pathmap") else None), - relative=self.config.relative_files, - ) - for paths in self.config.paths.values(): - result = paths[0] - for pattern in paths[1:]: - aliases.add(pattern, result) - combine_parallel_data( self._data, - aliases=aliases, + aliases=self._make_aliases(), data_paths=data_paths, strict=strict, keep=keep, @@ -925,6 +928,13 @@ def _get_file_reporters(self, morfs=None): file_reporters = [self._get_file_reporter(morf) for morf in morfs] return file_reporters + def _prepare_data_for_reporting(self): + """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()) + self._data = mapped_data + def report( self, morfs=None, @@ -990,6 +1000,7 @@ def report( The `format` parameter. """ + self._prepare_data_for_reporting() with override_config( self, ignore_errors=ignore_errors, @@ -1034,6 +1045,7 @@ def annotate( print("The annotate command will be removed in a future version.") print("Get in touch if you still use it: ned@nedbatchelder.com") + self._prepare_data_for_reporting() with override_config( self, ignore_errors=ignore_errors, @@ -1083,6 +1095,7 @@ def html_report( changing the files in the report folder. """ + self._prepare_data_for_reporting() with override_config( self, ignore_errors=ignore_errors, @@ -1123,6 +1136,7 @@ def xml_report( Returns a float, the total percentage covered. """ + self._prepare_data_for_reporting() with override_config( self, ignore_errors=ignore_errors, @@ -1157,6 +1171,7 @@ def json_report( .. versionadded:: 5.0 """ + self._prepare_data_for_reporting() with override_config( self, ignore_errors=ignore_errors, @@ -1187,6 +1202,7 @@ def lcov_report( .. versionadded:: 6.3 """ + self._prepare_data_for_reporting() with override_config( self, ignore_errors=ignore_errors, diff --git a/coverage/sqldata.py b/coverage/sqldata.py index ea6b1199f..68663715c 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -648,7 +648,12 @@ def update(self, other_data, aliases=None): "inner join file on file.id = line_bits.file_id " + "inner join context on context.id = line_bits.context_id" ) - lines = {(files[path], context): numbits for (path, context, numbits) in cur} + lines = {} + for path, context, numbits in cur: + key = (files[path], context) + if key in lines: + numbits = numbits_union(lines[key], numbits) + lines[key] = numbits cur.close() # Get tracer data. diff --git a/doc/config.rst b/doc/config.rst index ba3243a77..1c7e9ea21 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -346,6 +346,10 @@ against the source file found at "src/module.py". If you specify more than one list of paths, they will be considered in order. The first list that has a match will be used. +Remapping will also be done during reporting, but only within the single data +file being reported. Combining multiple files requires the ``combine`` +command. + The ``--debug=pathmap`` option can be used to log details of the re-mapping of paths. See :ref:`the --debug option `. diff --git a/tests/coveragetest.py b/tests/coveragetest.py index 54ae4eb42..56e788533 100644 --- a/tests/coveragetest.py +++ b/tests/coveragetest.py @@ -219,11 +219,14 @@ def check_coverage( return cov - def make_data_file(self, basename=None, suffix=None, lines=None, file_tracers=None): + def make_data_file(self, basename=None, suffix=None, lines=None, arcs=None, file_tracers=None): """Write some data into a coverage data file.""" data = coverage.CoverageData(basename=basename, suffix=suffix) + assert lines is None or arcs is None if lines: data.add_lines(lines) + if arcs: + data.add_arcs(arcs) if file_tracers: data.add_file_tracers(file_tracers) data.write() diff --git a/tests/test_api.py b/tests/test_api.py index 195452323..c2dbefa81 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -23,7 +23,8 @@ from coverage.misc import import_local_file from tests.coveragetest import CoverageTest, TESTS_DIR, UsingModulesMixin -from tests.helpers import assert_count_equal, assert_coverage_warnings +from tests.goldtest import contains, doesnt_contain +from tests.helpers import arcz_to_arcs, assert_count_equal, assert_coverage_warnings from tests.helpers import change_dir, nice_file, os_sep BAD_SQLITE_REGEX = r"file( is encrypted or)? is not a database" @@ -1456,3 +1457,146 @@ def test_combine_parallel_data_keep(self): # After combining, the .coverage file & the original combined file should still be there. self.assert_exists(".coverage") self.assert_file_count(".coverage.*", 2) + + +class ReportMapsPathsTest(CoverageTest): + """Check that reporting implicitly maps paths.""" + + def make_files(self, data, settings=False): + """Create the test files we need for line coverage.""" + src = """\ + if VER == 1: + print("line 2") + if VER == 2: + print("line 4") + if VER == 3: + print("line 6") + """ + self.make_file("src/program.py", src) + self.make_file("ver1/program.py", src) + self.make_file("ver2/program.py", src) + + if data == "line": + self.make_data_file( + lines={ + abs_file("ver1/program.py"): [1, 2, 3, 5], + abs_file("ver2/program.py"): [1, 3, 4, 5], + } + ) + else: + self.make_data_file( + arcs={ + abs_file("ver1/program.py"): arcz_to_arcs(".1 12 23 35 5."), + abs_file("ver2/program.py"): arcz_to_arcs(".1 13 34 45 5."), + } + ) + + if settings: + self.make_file(".coveragerc", """\ + [paths] + source = + src + ver1 + ver2 + """) + + def test_map_paths_during_line_report_without_setting(self): + self.make_files(data="line") + cov = coverage.Coverage() + cov.load() + cov.report(show_missing=True) + expected = textwrap.dedent(os_sep("""\ + Name Stmts Miss Cover Missing + ----------------------------------------------- + ver1/program.py 6 2 67% 4, 6 + ver2/program.py 6 2 67% 2, 6 + ----------------------------------------------- + TOTAL 12 4 67% + """)) + assert expected == self.stdout() + + def test_map_paths_during_line_report(self): + self.make_files(data="line", settings=True) + cov = coverage.Coverage() + cov.load() + cov.report(show_missing=True) + expected = textwrap.dedent(os_sep("""\ + Name Stmts Miss Cover Missing + ---------------------------------------------- + src/program.py 6 1 83% 6 + ---------------------------------------------- + TOTAL 6 1 83% + """)) + assert expected == self.stdout() + + def test_map_paths_during_branch_report_without_setting(self): + self.make_files(data="arcs") + cov = coverage.Coverage(branch=True) + cov.load() + cov.report(show_missing=True) + expected = textwrap.dedent(os_sep("""\ + Name Stmts Miss Branch BrPart Cover Missing + ------------------------------------------------------------- + ver1/program.py 6 2 6 3 58% 1->3, 4, 6 + ver2/program.py 6 2 6 3 58% 2, 3->5, 6 + ------------------------------------------------------------- + TOTAL 12 4 12 6 58% + """)) + assert expected == self.stdout() + + def test_map_paths_during_branch_report(self): + self.make_files(data="arcs", settings=True) + cov = coverage.Coverage(branch=True) + cov.load() + cov.report(show_missing=True) + expected = textwrap.dedent(os_sep("""\ + Name Stmts Miss Branch BrPart Cover Missing + ------------------------------------------------------------ + src/program.py 6 1 6 1 83% 6 + ------------------------------------------------------------ + TOTAL 6 1 6 1 83% + """)) + assert expected == self.stdout() + + def test_map_paths_during_annotate(self): + self.make_files(data="line", settings=True) + cov = coverage.Coverage() + cov.load() + cov.annotate() + self.assert_exists(os_sep("src/program.py,cover")) + self.assert_doesnt_exist(os_sep("ver1/program.py,cover")) + self.assert_doesnt_exist(os_sep("ver2/program.py,cover")) + + def test_map_paths_during_html_report(self): + self.make_files(data="line", settings=True) + cov = coverage.Coverage() + cov.load() + cov.html_report() + contains("htmlcov/index.html", os_sep("src/program.py")) + doesnt_contain("htmlcov/index.html", os_sep("ver1/program.py"), os_sep("ver2/program.py")) + + def test_map_paths_during_xml_report(self): + self.make_files(data="line", settings=True) + cov = coverage.Coverage() + cov.load() + cov.xml_report() + contains("coverage.xml", "src/program.py") + doesnt_contain("coverage.xml", "ver1/program.py", "ver2/program.py") + + def test_map_paths_during_json_report(self): + self.make_files(data="line", settings=True) + cov = coverage.Coverage() + cov.load() + cov.json_report() + def os_sepj(s): + return os_sep(s).replace("\\", r"\\") + contains("coverage.json", os_sepj("src/program.py")) + doesnt_contain("coverage.json", os_sepj("ver1/program.py"), os_sepj("ver2/program.py")) + + def test_map_paths_during_lcov_report(self): + self.make_files(data="line", settings=True) + cov = coverage.Coverage() + cov.load() + cov.lcov_report() + contains("coverage.lcov", os_sep("src/program.py")) + doesnt_contain("coverage.lcov", os_sep("ver1/program.py"), os_sep("ver2/program.py")) From 771e299c153ee20181cbb286a30dfa1450ed9e99 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 27 Nov 2022 09:33:37 -0500 Subject: [PATCH 081/200] refactor: SimpleReprMixing wasn't simple, it was auto Also, I'm not sure I like it as a mixin... --- coverage/debug.py | 10 +++++----- coverage/results.py | 4 ++-- coverage/sqldata.py | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/coverage/debug.py b/coverage/debug.py index 4286bc501..eca1a5a43 100644 --- a/coverage/debug.py +++ b/coverage/debug.py @@ -30,7 +30,7 @@ class DebugControl: """Control and output for debugging.""" - show_repr_attr = False # For SimpleReprMixin + show_repr_attr = False # For AutoReprMixin def __init__(self, options, output): """Configure the options and output file for debugging.""" @@ -197,16 +197,16 @@ def add_pid_and_tid(text): return text -class SimpleReprMixin: - """A mixin implementing a simple __repr__.""" - simple_repr_ignore = ['simple_repr_ignore', '$coverage.object_id'] +class AutoReprMixin: + """A mixin implementing an automatic __repr__ for debugging.""" + auto_repr_ignore = ['auto_repr_ignore', '$coverage.object_id'] def __repr__(self): show_attrs = ( (k, v) for k, v in self.__dict__.items() if getattr(v, "show_repr_attr", True) and not callable(v) - and k not in self.simple_repr_ignore + and k not in self.auto_repr_ignore ) return "<{klass} @0x{id:x} {attrs}>".format( klass=self.__class__.__name__, diff --git a/coverage/results.py b/coverage/results.py index 79439fd9b..493d2fc8c 100644 --- a/coverage/results.py +++ b/coverage/results.py @@ -5,7 +5,7 @@ import collections -from coverage.debug import SimpleReprMixin +from coverage.debug import AutoReprMixin from coverage.exceptions import ConfigError from coverage.misc import contract, nice_pair @@ -168,7 +168,7 @@ def branch_stats(self): return stats -class Numbers(SimpleReprMixin): +class Numbers(AutoReprMixin): """The numerical results of measuring coverage. This holds the basic statistics from `Analysis`, and is used to roll diff --git a/coverage/sqldata.py b/coverage/sqldata.py index 68663715c..f1b192d1d 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -18,7 +18,7 @@ import threading import zlib -from coverage.debug import NoDebugging, SimpleReprMixin, clipped_repr +from coverage.debug import NoDebugging, AutoReprMixin, clipped_repr from coverage.exceptions import CoverageException, DataError from coverage.files import PathAliases from coverage.misc import contract, file_be_gone, isolate_module @@ -103,7 +103,7 @@ ); """ -class CoverageData(SimpleReprMixin): +class CoverageData(AutoReprMixin): """Manages collected coverage data, including file storage. This class is the public supported API to the data that coverage.py @@ -1040,7 +1040,7 @@ def filename_suffix(suffix): return suffix -class SqliteDb(SimpleReprMixin): +class SqliteDb(AutoReprMixin): """A simple abstraction over a SQLite database. Use as a context manager, then you can use it like a From 9fa587276840246f20622debcbf9b8a7cd0e7960 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 27 Nov 2022 13:38:08 -0500 Subject: [PATCH 082/200] refactor: ensure all sqlite cursors are closed --- coverage/sqldata.py | 224 ++++++++++++++++++++++++++------------------ 1 file changed, 131 insertions(+), 93 deletions(-) diff --git a/coverage/sqldata.py b/coverage/sqldata.py index f1b192d1d..4caa13d2c 100644 --- a/coverage/sqldata.py +++ b/coverage/sqldata.py @@ -4,6 +4,7 @@ """SQLite coverage data.""" import collections +import contextlib import datetime import functools import glob @@ -287,19 +288,21 @@ def _read_db(self): ) ) - for row in db.execute("select value from meta where key = 'has_arcs'"): - self._has_arcs = bool(int(row[0])) - self._has_lines = not self._has_arcs + with db.execute("select value from meta where key = 'has_arcs'") as cur: + for row in cur: + self._has_arcs = bool(int(row[0])) + self._has_lines = not self._has_arcs - for file_id, path in db.execute("select id, path from file"): - self._file_map[path] = file_id + with db.execute("select id, path from file") as cur: + for file_id, path in cur: + self._file_map[path] = file_id def _init_db(self, db): """Write the initial contents of the database.""" if self._debug.should("dataio"): self._debug.write(f"Initing data file {self._filename!r}") db.executescript(SCHEMA) - db.execute("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) + db.execute_void("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) # When writing metadata, avoid information that will needlessly change # the hash of the data file, unless we're debugging processes. @@ -311,7 +314,7 @@ def _init_db(self, db): ("sys_argv", str(getattr(sys, "argv", None))), ("when", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), ]) - db.executemany("insert or ignore into meta (key, value) values (?, ?)", meta_data) + db.executemany_void("insert or ignore into meta (key, value) values (?, ?)", meta_data) def _connect(self): """Get the SqliteDb object to use.""" @@ -324,8 +327,8 @@ def __bool__(self): return False try: with self._connect() as con: - rows = con.execute("select * from file limit 1") - return bool(list(rows)) + with con.execute("select * from file limit 1") as cur: + return bool(list(cur)) except CoverageException: return False @@ -475,11 +478,12 @@ def add_lines(self, line_data): linemap = nums_to_numbits(linenos) file_id = self._file_id(filename, add=True) query = "select numbits from line_bits where file_id = ? and context_id = ?" - existing = list(con.execute(query, (file_id, self._current_context_id))) + with con.execute(query, (file_id, self._current_context_id)) as cur: + existing = list(cur) if existing: linemap = numbits_union(linemap, existing[0][0]) - con.execute( + con.execute_void( "insert or replace into line_bits " + " (file_id, context_id, numbits) values (?, ?, ?)", (file_id, self._current_context_id, linemap), @@ -508,7 +512,7 @@ def add_arcs(self, arc_data): for filename, arcs in arc_data.items(): file_id = self._file_id(filename, add=True) data = [(file_id, self._current_context_id, fromno, tono) for fromno, tono in arcs] - con.executemany( + con.executemany_void( "insert or ignore into arc " + "(file_id, context_id, fromno, tono) values (?, ?, ?, ?)", data, @@ -530,7 +534,7 @@ def _choose_lines_or_arcs(self, lines=False, arcs=False): self._has_lines = lines self._has_arcs = arcs with self._connect() as con: - con.execute( + con.execute_void( "insert or ignore into meta (key, value) values (?, ?)", ("has_arcs", str(int(arcs))) ) @@ -564,7 +568,7 @@ def add_file_tracers(self, file_tracers): ) ) elif plugin_name: - con.execute( + con.execute_void( "insert into tracer (file_id, tracer) values (?, ?)", (file_id, plugin_name) ) @@ -622,48 +626,46 @@ def update(self, other_data, aliases=None): other_data.read() with other_data._connect() as con: # Get files data. - cur = con.execute("select path from file") - files = {path: aliases.map(path) for (path,) in cur} - cur.close() + with con.execute("select path from file") as cur: + files = {path: aliases.map(path) for (path,) in cur} # Get contexts data. - cur = con.execute("select context from context") - contexts = [context for (context,) in cur] - cur.close() + with con.execute("select context from context") as cur: + contexts = [context for (context,) in cur] # Get arc data. - cur = con.execute( + with con.execute( "select file.path, context.context, arc.fromno, arc.tono " + "from arc " + "inner join file on file.id = arc.file_id " + "inner join context on context.id = arc.context_id" - ) - arcs = [(files[path], context, fromno, tono) for (path, context, fromno, tono) in cur] - cur.close() + ) as cur: + arcs = [ + (files[path], context, fromno, tono) + for (path, context, fromno, tono) in cur + ] # Get line data. - cur = con.execute( + with con.execute( "select file.path, context.context, line_bits.numbits " + "from line_bits " + "inner join file on file.id = line_bits.file_id " + "inner join context on context.id = line_bits.context_id" - ) - lines = {} - for path, context, numbits in cur: - key = (files[path], context) - if key in lines: - numbits = numbits_union(lines[key], numbits) - lines[key] = numbits - cur.close() + ) as cur: + lines = {} + for path, context, numbits in cur: + key = (files[path], context) + if key in lines: + numbits = numbits_union(lines[key], numbits) + lines[key] = numbits # Get tracer data. - cur = con.execute( + with con.execute( "select file.path, tracer " + "from tracer " + "inner join file on file.id = tracer.file_id" - ) - tracers = {files[path]: tracer for (path, tracer) in cur} - cur.close() + ) as cur: + tracers = {files[path]: tracer for (path, tracer) in cur} with self._connect() as con: con.con.isolation_level = "IMMEDIATE" @@ -672,33 +674,31 @@ def update(self, other_data, aliases=None): # to have an empty string tracer. Since Sqlite does not support # full outer joins, we have to make two queries to fill the # dictionary. - this_tracers = {path: "" for path, in con.execute("select path from file")} - this_tracers.update({ - aliases.map(path): tracer - for path, tracer in con.execute( - "select file.path, tracer from tracer " + - "inner join file on file.id = tracer.file_id" - ) - }) + with con.execute("select path from file") as cur: + this_tracers = {path: "" for path, in cur} + with con.execute( + "select file.path, tracer from tracer " + + "inner join file on file.id = tracer.file_id" + ) as cur: + this_tracers.update({ + aliases.map(path): tracer + for path, tracer in cur + }) # Create all file and context rows in the DB. - con.executemany( + con.executemany_void( "insert or ignore into file (path) values (?)", ((file,) for file in files.values()) ) - file_ids = { - path: id - for id, path in con.execute("select id, path from file") - } + with con.execute("select id, path from file") as cur: + file_ids = {path: id for id, path in cur} self._file_map.update(file_ids) - con.executemany( + con.executemany_void( "insert or ignore into context (context) values (?)", ((context,) for context in contexts) ) - context_ids = { - context: id - for id, context in con.execute("select id, context from context") - } + with con.execute("select id, context from context") as cur: + context_ids = {context: id for id, context in cur} # Prepare tracers and fail, if a conflict is found. # tracer_paths is used to ensure consistency over the tracer data @@ -725,24 +725,23 @@ def update(self, other_data, aliases=None): ) # Get line data. - cur = con.execute( + with con.execute( "select file.path, context.context, line_bits.numbits " + "from line_bits " + "inner join file on file.id = line_bits.file_id " + "inner join context on context.id = line_bits.context_id" - ) - for path, context, numbits in cur: - key = (aliases.map(path), context) - if key in lines: - numbits = numbits_union(lines[key], numbits) - lines[key] = numbits - cur.close() + ) as cur: + for path, context, numbits in cur: + key = (aliases.map(path), context) + if key in lines: + numbits = numbits_union(lines[key], numbits) + lines[key] = numbits if arcs: self._choose_lines_or_arcs(arcs=True) # Write the combined data. - con.executemany( + con.executemany_void( "insert or ignore into arc " + "(file_id, context_id, fromno, tono) values (?, ?, ?, ?)", arc_rows @@ -750,8 +749,8 @@ def update(self, other_data, aliases=None): if lines: self._choose_lines_or_arcs(lines=True) - con.execute("delete from line_bits") - con.executemany( + con.execute_void("delete from line_bits") + con.executemany_void( "insert into line_bits " + "(file_id, context_id, numbits) values (?, ?, ?)", [ @@ -759,7 +758,7 @@ def update(self, other_data, aliases=None): for (file, context), numbits in lines.items() ] ) - con.executemany( + con.executemany_void( "insert or ignore into tracer (file_id, tracer) values (?, ?)", ((file_ids[filename], tracer) for filename, tracer in tracer_map.items()) ) @@ -828,7 +827,8 @@ def measured_contexts(self): """ self._start_using() with self._connect() as con: - contexts = {row[0] for row in con.execute("select distinct(context) from context")} + with con.execute("select distinct(context) from context") as cur: + contexts = {row[0] for row in cur} return contexts def file_tracer(self, filename): @@ -862,8 +862,8 @@ def set_query_context(self, context): """ self._start_using() with self._connect() as con: - cur = con.execute("select id from context where context = ?", (context,)) - self._query_context_ids = [row[0] for row in cur.fetchall()] + with con.execute("select id from context where context = ?", (context,)) as cur: + self._query_context_ids = [row[0] for row in cur.fetchall()] def set_query_contexts(self, contexts): """Set a number of contexts for subsequent querying. @@ -881,8 +881,8 @@ def set_query_contexts(self, contexts): if contexts: with self._connect() as con: context_clause = " or ".join(["context regexp ?"] * len(contexts)) - cur = con.execute("select id from context where " + context_clause, contexts) - self._query_context_ids = [row[0] for row in cur.fetchall()] + with con.execute("select id from context where " + context_clause, contexts) as cur: + self._query_context_ids = [row[0] for row in cur.fetchall()] else: self._query_context_ids = None @@ -914,7 +914,8 @@ def lines(self, filename): ids_array = ", ".join("?" * len(self._query_context_ids)) query += " and context_id in (" + ids_array + ")" data += self._query_context_ids - bitmaps = list(con.execute(query, data)) + with con.execute(query, data) as cur: + bitmaps = list(cur) nums = set() for row in bitmaps: nums.update(numbits_to_nums(row[0])) @@ -949,8 +950,8 @@ def arcs(self, filename): ids_array = ", ".join("?" * len(self._query_context_ids)) query += " and context_id in (" + ids_array + ")" data += self._query_context_ids - arcs = con.execute(query, data) - return list(arcs) + with con.execute(query, data) as cur: + return list(cur) def contexts_by_lineno(self, filename): """Get the contexts for each line in a file. @@ -979,11 +980,12 @@ def contexts_by_lineno(self, filename): ids_array = ", ".join("?" * len(self._query_context_ids)) query += " and arc.context_id in (" + ids_array + ")" data += self._query_context_ids - for fromno, tono, context in con.execute(query, data): - if fromno > 0: - lineno_contexts_map[fromno].add(context) - if tono > 0: - lineno_contexts_map[tono].add(context) + with con.execute(query, data) as cur: + for fromno, tono, context in cur: + if fromno > 0: + lineno_contexts_map[fromno].add(context) + if tono > 0: + lineno_contexts_map[tono].add(context) else: query = ( "select l.numbits, c.context from line_bits l, context c " + @@ -995,9 +997,10 @@ def contexts_by_lineno(self, filename): ids_array = ", ".join("?" * len(self._query_context_ids)) query += " and l.context_id in (" + ids_array + ")" data += self._query_context_ids - for numbits, context in con.execute(query, data): - for lineno in numbits_to_nums(numbits): - lineno_contexts_map[lineno].add(context) + with con.execute(query, data) as cur: + for numbits, context in cur: + for lineno in numbits_to_nums(numbits): + lineno_contexts_map[lineno].add(context) return {lineno: list(contexts) for lineno, contexts in lineno_contexts_map.items()} @@ -1009,8 +1012,10 @@ def sys_info(cls): """ with SqliteDb(":memory:", debug=NoDebugging()) as db: - temp_store = [row[0] for row in db.execute("pragma temp_store")] - copts = [row[0] for row in db.execute("pragma compile_options")] + with db.execute("pragma temp_store") as cur: + temp_store = [row[0] for row in cur] + with db.execute("pragma compile_options") as cur: + copts = [row[0] for row in cur] copts = textwrap.wrap(", ".join(copts), width=75) return [ @@ -1078,9 +1083,9 @@ def _connect(self): # This pragma makes writing faster. It disables rollbacks, but we never need them. # PyPy needs the .close() calls here, or sqlite gets twisted up: # https://bitbucket.org/pypy/pypy/issues/2872/default-isolation-mode-is-different-on - self.execute("pragma journal_mode=off").close() + self.execute_void("pragma journal_mode=off") # This pragma makes writing faster. - self.execute("pragma synchronous=off").close() + self.execute_void("pragma synchronous=off") def close(self): """If needed, close the connection.""" @@ -1106,7 +1111,7 @@ def __exit__(self, exc_type, exc_value, traceback): self.debug.write(f"EXCEPTION from __exit__: {exc}") raise DataError(f"Couldn't end data file {self.filename!r}: {exc}") from exc - def execute(self, sql, parameters=()): + def _execute(self, sql, parameters): """Same as :meth:`python:sqlite3.Connection.execute`.""" if self.debug.should("sql"): tail = f" with {parameters!r}" if parameters else "" @@ -1137,10 +1142,26 @@ def execute(self, sql, parameters=()): self.debug.write(f"EXCEPTION from execute: {msg}") raise DataError(f"Couldn't use data file {self.filename!r}: {msg}") from exc + @contextlib.contextmanager + def execute(self, sql, parameters=()): + """Context managed :meth:`python:sqlite3.Connection.execute`. + + Use with a ``with`` statement to auto-close the returned cursor. + """ + cur = self._execute(sql, parameters) + try: + yield cur + finally: + cur.close() + + def execute_void(self, sql, parameters=()): + """Same as :meth:`python:sqlite3.Connection.execute` when you don't need the cursor.""" + self._execute(sql, parameters).close() + def execute_for_rowid(self, sql, parameters=()): """Like execute, but returns the lastrowid.""" - con = self.execute(sql, parameters) - rowid = con.lastrowid + with self.execute(sql, parameters) as cur: + rowid = cur.lastrowid if self.debug.should("sqldata"): self.debug.write(f"Row id result: {rowid!r}") return rowid @@ -1154,7 +1175,8 @@ def execute_one(self, sql, parameters=()): Returns a row, or None if there were no rows. """ - rows = list(self.execute(sql, parameters)) + with self.execute(sql, parameters) as cur: + rows = list(cur) if len(rows) == 0: return None elif len(rows) == 1: @@ -1162,7 +1184,7 @@ def execute_one(self, sql, parameters=()): else: raise AssertionError(f"SQL {sql!r} shouldn't return {len(rows)} rows") - def executemany(self, sql, data): + def _executemany(self, sql, data): """Same as :meth:`python:sqlite3.Connection.executemany`.""" if self.debug.should("sql"): data = list(data) @@ -1179,13 +1201,29 @@ def executemany(self, sql, data): # https://github.com/nedbat/coveragepy/issues/1010 return self.con.executemany(sql, data) + @contextlib.contextmanager + def executemany(self, sql, data): + """Context managed :meth:`python:sqlite3.Connection.executemany`. + + Use with a ``with`` statement to auto-close the returned cursor. + """ + cur = self._executemany(sql, data) + try: + yield cur + finally: + cur.close() + + def executemany_void(self, sql, data): + """Same as :meth:`python:sqlite3.Connection.executemany` when you don't need the cursor.""" + self._executemany(sql, data).close() + def executescript(self, script): """Same as :meth:`python:sqlite3.Connection.executescript`.""" if self.debug.should("sql"): self.debug.write("Executing script with {} chars: {}".format( len(script), clipped_repr(script, 100), )) - self.con.executescript(script) + self.con.executescript(script).close() def dump(self): """Return a multi-line string, the SQL dump of the database.""" From 79c66c00cfc98f04b676e8fb32dc5f089a5eff3c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 28 Nov 2022 05:44:09 -0500 Subject: [PATCH 083/200] build: next version will be 7.0 --- CHANGES.rst | 5 +++++ coverage/control.py | 2 +- coverage/version.py | 2 +- doc/config.rst | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b1d94dbdc..eae8d6c9f 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 ---------- +(Also see the changes for `6.6.0b1 `_, since 6.6.0 was never +released.) + - Text reporting with ``coverage report`` now has a ``--format=`` option. The original style (``--format=text``) is the default. @@ -75,6 +78,8 @@ Unreleased Version 6.6.0b1 — 2022-10-31 ---------------------------- +(Note: 6.6.0 final was never released. These changes are part of 7.0.0.) + - Changes to file pattern matching, which might require updating your configuration: diff --git a/coverage/control.py b/coverage/control.py index c0497478b..bbb263555 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -996,7 +996,7 @@ def report( .. versionadded:: 5.2 The `precision` parameter. - .. versionadded:: 6.6 + .. versionadded:: 7.0 The `format` parameter. """ diff --git a/coverage/version.py b/coverage/version.py index 2c051f84e..b1f6f6d64 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -6,7 +6,7 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (6, 6, 0, "beta", 2) +version_info = (7, 0, 0, "alpha", 0) _dev = 0 diff --git a/doc/config.rst b/doc/config.rst index 1c7e9ea21..ea16d9f21 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -425,7 +425,7 @@ namespace packages`_, and are ususally skipped. .. _implicit namespace packages: https://peps.python.org/pep-0420/ -.. versionadded:: 6.6 +.. versionadded:: 7.0 .. _config_report_omit: From aa62abd5ff33926f44fe4ec9e985ed3d72ea1f9d Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 28 Nov 2022 05:45:33 -0500 Subject: [PATCH 084/200] style: fix spelling un-executed, white space, time stamp. --- CHANGES.rst | 16 ++++++++-------- coverage/config.py | 4 ++-- coverage/control.py | 4 ++-- coverage/inorout.py | 2 +- coverage/parser.py | 5 ++--- coverage/phystokens.py | 2 +- coverage/results.py | 2 +- coverage/templite.py | 2 +- doc/changes.rst | 26 +++++++++++++------------- doc/cmd.rst | 2 +- doc/config.rst | 6 +++--- doc/dict.txt | 3 --- doc/source.rst | 2 +- igor.py | 8 ++++---- tests/mixins.py | 2 +- tests/test_api.py | 12 ++++++------ tests/test_html.py | 10 +++++----- tests/test_phystokens.py | 2 +- 18 files changed, 53 insertions(+), 57 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index eae8d6c9f..63114d2a0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -39,12 +39,12 @@ released.) - Combining data files with ``coverage combine`` now quickly hashes the data files to skip files that provide no new information. This can reduce the - time needed. Many details affect the results, but for coverage.py's own test - suite, combining was about 40% faster. Closes `issue 1483`_. + time needed. Many details affect the speed-up, but for coverage.py's own + test suite, combining was about 40% faster. Closes `issue 1483`_. -- When searching for completely unexecuted files, coverage.py uses the presence - of ``__init__.py`` files to determine which directories have source that - could have been imported. However, `implicit namespace packages`_ don't +- When searching for completely un-executed files, coverage.py uses the + presence of ``__init__.py`` files to determine which directories have source + that could have been imported. However, `implicit namespace packages`_ don't require ``__init__.py``. A new setting ``[report] include_namespace_packages`` tells coverage.py to consider these directories during reporting. Thanks to `Felix Horvat `_ for the @@ -191,7 +191,7 @@ Version 6.4.2 — 2022-07-12 -------------------------- - Updated for a small change in Python 3.11.0 beta 4: modules now start with a - line with line number 0, which is ignored. This line cannnot be executed, so + line with line number 0, which is ignored. This line cannot be executed, so coverage totals were thrown off. This line is now ignored by coverage.py, but this also means that truly empty modules (like ``__init__.py``) have no lines in them, rather than one phantom line. Fixes `issue 1419`_. @@ -242,7 +242,7 @@ Version 6.4 — 2022-05-22 ``?`` to open/close the help panel. Thanks, `J. M. F. Tsang `_. - - The timestamp and version are displayed at the top of the report. Thanks, + - The time stamp and version are displayed at the top of the report. Thanks, `Ammar Askar `_. Closes `issue 1351`_. - A new debug option ``debug=sqldata`` adds more detail to ``debug=sql``, @@ -531,7 +531,7 @@ Version 6.0.2 — 2021-10-11 - Packages named as "source packages" (with ``source``, or ``source_pkgs``, or pytest-cov's ``--cov``) might have been only partially measured. Their - top-level statements could be marked as unexecuted, because they were + top-level statements could be marked as un-executed, because they were imported by coverage.py before measurement began (`issue 1232`_). This is now fixed, but the package will be imported twice, once by coverage.py, then again by your test suite. This could cause problems if importing the package diff --git a/coverage/config.py b/coverage/config.py index 994154f6d..b964ba89d 100644 --- a/coverage/config.py +++ b/coverage/config.py @@ -93,7 +93,7 @@ def getlist(self, section, option): """Read a list of strings. The value of `section` and `option` is treated as a comma- and newline- - separated list of strings. Each value is stripped of whitespace. + separated list of strings. Each value is stripped of white space. Returns the list of strings. @@ -111,7 +111,7 @@ def getregexlist(self, section, option): """Read a list of full-line regexes. The value of `section` and `option` is treated as a newline-separated - list of regexes. Each value is stripped of whitespace. + list of regexes. Each value is stripped of white space. Returns the list of strings. diff --git a/coverage/control.py b/coverage/control.py index bbb263555..37e61cfbc 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -812,7 +812,7 @@ def _post_save_work(self): """After saving data, look for warnings, post-work, etc. Warn about things that should have happened but didn't. - Look for unexecuted files. + Look for un-executed files. """ # If there are still entries in the source_pkgs_unmatched list, @@ -825,7 +825,7 @@ def _post_save_work(self): self._warn("No data was collected.", slug="no-data-collected") # Touch all the files that could have executed, so that we can - # mark completely unexecuted files as 0% covered. + # 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(): diff --git a/coverage/inorout.py b/coverage/inorout.py index 0d3f6d670..d69837f9a 100644 --- a/coverage/inorout.py +++ b/coverage/inorout.py @@ -576,7 +576,7 @@ def _find_executable_files(self, src_dir): file_path = canonical_filename(file_path) if self.omit_match and self.omit_match.match(file_path): # Turns out this file was omitted, so don't pull it back - # in as unexecuted. + # in as un-executed. continue yield file_path, plugin_name diff --git a/coverage/parser.py b/coverage/parser.py index 135a3b183..1bf1951a2 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -177,11 +177,10 @@ def _raw_parse(self): first_on_line = True if ttext.strip() and toktype != tokenize.COMMENT: - # A non-whitespace token. + # A non-white-space token. empty = False if first_line is None: - # The token is not whitespace, and is the first in a - # statement. + # The token is not white space, and is the first in a statement. first_line = slineno # Check whether to end an excluded suite. if excluding and indent <= exclude_indent: diff --git a/coverage/phystokens.py b/coverage/phystokens.py index 07ad53497..d11819393 100644 --- a/coverage/phystokens.py +++ b/coverage/phystokens.py @@ -95,7 +95,7 @@ def source_token_lines(source): If you concatenate all the token texts, and then join them with newlines, you should have your original `source` back, with two differences: - trailing whitespace is not preserved, and a final line with no newline + trailing white space is not preserved, and a final line with no newline is indistinguishable from a final line with a newline. """ diff --git a/coverage/results.py b/coverage/results.py index 493d2fc8c..2c97a18f9 100644 --- a/coverage/results.py +++ b/coverage/results.py @@ -84,7 +84,7 @@ def arcs_executed(self): @contract(returns='list(tuple(int, int))') def arcs_missing(self): - """Returns a sorted list of the unexecuted arcs in the code.""" + """Returns a sorted list of the un-executed arcs in the code.""" possible = self.arc_possibilities() executed = self.arcs_executed() missing = ( diff --git a/coverage/templite.py b/coverage/templite.py index ab3cf1cf4..29596d770 100644 --- a/coverage/templite.py +++ b/coverage/templite.py @@ -92,7 +92,7 @@ class Templite: and joined. Be careful, this could join words together! Any of these constructs can have a hyphen at the end (`-}}`, `-%}`, `-#}`), - which will collapse the whitespace following the tag. + which will collapse the white space following the tag. Construct a Templite with the template text, then use `render` against a dictionary context to create a finished string:: diff --git a/doc/changes.rst b/doc/changes.rst index 42af57c74..da0f45aef 100644 --- a/doc/changes.rst +++ b/doc/changes.rst @@ -383,7 +383,7 @@ Version 5.0a6 — 2019-07-16 argument, `no_disk` (default: False). Setting it to True prevents writing any data to the disk. This is useful for transient data objects. -- Added the classmethod :meth:`.Coverage.current` to get the latest started +- Added the class method :meth:`.Coverage.current` to get the latest started Coverage instance. - Multiprocessing support in Python 3.8 was broken, but is now fixed. Closes @@ -556,7 +556,7 @@ Version 5.0a2 — 2018-09-03 - Development moved from `Bitbucket`_ to `GitHub`_. -- HTML files no longer have trailing and extra whitespace. +- HTML files no longer have trailing and extra white space. - The sort order in the HTML report is stored in local storage rather than cookies, closing `issue 611`_. Thanks, Federico Bond. @@ -794,7 +794,7 @@ Version 4.4b1 — 2017-04-04 also continue measurement. Both `issue 79`_ and `issue 448`_ described this problem, and have been fixed. -- Plugins can now find unexecuted files if they choose, by implementing the +- Plugins can now find un-executed files if they choose, by implementing the `find_executable_files` method. Thanks, Emil Madsen. - Minimal IronPython support. You should be able to run IronPython programs @@ -1202,7 +1202,7 @@ Version 4.1b2 — 2016-01-23 - The XML report now produces correct package names for modules found in directories specified with ``source=``. Fixes `issue 465`_. -- ``coverage report`` won't produce trailing whitespace. +- ``coverage report`` won't produce trailing white space. .. _issue 465: https://github.com/nedbat/coveragepy/issues/465 .. _issue 466: https://github.com/nedbat/coveragepy/issues/466 @@ -1532,7 +1532,7 @@ Version 4.0a6 — 2015-06-21 - Files with incorrect encoding declaration comments are no longer ignored by the reporting commands, fixing `issue 351`_. -- HTML reports now include a timestamp in the footer, closing `issue 299`_. +- HTML reports now include a time stamp in the footer, closing `issue 299`_. Thanks, Conrad Ho. - HTML reports now begrudgingly use double-quotes rather than single quotes, @@ -1685,7 +1685,7 @@ Version 4.0a2 — 2015-01-14 `issue 328`_. Thanks, Buck Evan. - The regex for matching exclusion pragmas has been fixed to allow more kinds - of whitespace, fixing `issue 334`_. + of white space, fixing `issue 334`_. - Made some PyPy-specific tweaks to improve speed under PyPy. Thanks, Alex Gaynor. @@ -1739,7 +1739,7 @@ Version 4.0a1 — 2014-09-27 `issue 285`_. Thanks, Chris Rose. - HTML reports no longer raise UnicodeDecodeError if a Python file has - undecodable characters, fixing `issue 303`_ and `issue 331`_. + un-decodable characters, fixing `issue 303`_ and `issue 331`_. - The annotate command will now annotate all files, not just ones relative to the current directory, fixing `issue 57`_. @@ -1791,7 +1791,7 @@ Version 3.7 — 2013-10-06 - Coverage.py properly supports .pyw files, fixing `issue 261`_. - Omitting files within a tree specified with the ``source`` option would - cause them to be incorrectly marked as unexecuted, as described in + cause them to be incorrectly marked as un-executed, as described in `issue 218`_. This is now fixed. - When specifying paths to alias together during data combining, you can now @@ -1802,7 +1802,7 @@ Version 3.7 — 2013-10-06 (``build/$BUILDNUM/src``). - Trying to create an XML report with no files to report on, would cause a - ZeroDivideError, but no longer does, fixing `issue 250`_. + ZeroDivisionError, but no longer does, fixing `issue 250`_. - When running a threaded program under the Python tracer, coverage.py no longer issues a spurious warning about the trace function changing: "Trace @@ -1905,7 +1905,7 @@ Version 3.6b1 — 2012-11-28 Thanks, Marcus Cobden. - Coverage percentage metrics are now computed slightly differently under - branch coverage. This means that completely unexecuted files will now + branch coverage. This means that completely un-executed files will now correctly have 0% coverage, fixing `issue 156`_. This also means that your total coverage numbers will generally now be lower if you are measuring branch coverage. @@ -2068,7 +2068,7 @@ Version 3.5.2b1 — 2012-04-29 - Now the exit status of your product code is properly used as the process status when running ``python -m coverage run ...``. Thanks, JT Olds. -- When installing into pypy, we no longer attempt (and fail) to compile +- When installing into PyPy, we no longer attempt (and fail) to compile the C tracer function, closing `issue 166`_. .. _issue 142: https://github.com/nedbat/coveragepy/issues/142 @@ -2234,7 +2234,7 @@ Version 3.4 — 2010-09-19 Version 3.4b2 — 2010-09-06 -------------------------- -- Completely unexecuted files can now be included in coverage results, reported +- Completely un-executed files can now be included in coverage results, reported as 0% covered. This only happens if the --source option is specified, since coverage.py needs guidance about where to look for source files. @@ -2374,7 +2374,7 @@ Version 3.3 — 2010-02-24 `config_file=False`. - Fixed a problem with nested loops having their branch possibilities - mischaracterized: `issue 39`_. + mis-characterized: `issue 39`_. - Added coverage.process_start to enable coverage measurement when Python starts. diff --git a/doc/cmd.rst b/doc/cmd.rst index 919b6d88e..663ca7080 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -1025,7 +1025,7 @@ of operation to log: * ``plugin``: print information about plugin operations. * ``process``: show process creation information, and changes in the current - directory. This also writes a timestamp and command arguments into the data + directory. This also writes a time stamp and command arguments into the data file. * ``pybehave``: show the values of `internal flags `_ describing the diff --git a/doc/config.rst b/doc/config.rst index ea16d9f21..b387deb5a 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -419,9 +419,9 @@ See :ref:`source` for details. [report] include_namespace_packages ................................... -(boolean, default False) When searching for completely unexecuted files, +(boolean, default False) When searching for completely un-executed files, include directories without ``__init__.py`` files. These are `implicit -namespace packages`_, and are ususally skipped. +namespace packages`_, and are usually skipped. .. _implicit namespace packages: https://peps.python.org/pep-0420/ @@ -617,7 +617,7 @@ section also apply to JSON output, where appropriate. [json] pretty_print ................... -(boolean, default false) Controls if the JSON is outputted with whitespace +(boolean, default false) Controls if the JSON is outputted with white space formatted for human consumption (True) or for minimum file size (False). diff --git a/doc/dict.txt b/doc/dict.txt index 2c713fe70..63544dcde 100644 --- a/doc/dict.txt +++ b/doc/dict.txt @@ -221,7 +221,6 @@ templite templating testability Tidelift -timestamp todo TODO tokenization @@ -241,7 +240,6 @@ txt ubuntu undecodable unexecutable -unexecuted unicode uninstall unittest @@ -256,7 +254,6 @@ utf vendored versionadded virtualenv -whitespace wikipedia wildcard wildcards diff --git a/doc/source.rst b/doc/source.rst index 64ebd1320..41f6fc937 100644 --- a/doc/source.rst +++ b/doc/source.rst @@ -32,7 +32,7 @@ modules). If the source option is specified, only code in those locations will be measured. Specifying the source option also enables coverage.py to report on -unexecuted files, since it can search the source tree for files that haven't +un-executed files, since it can search the source tree for files that haven't been measured at all. Only importable files (ones at the root of the tree, or in directories with a ``__init__.py`` file) will be considered. Files with unusual punctuation in their names will be skipped (they are assumed to be diff --git a/igor.py b/igor.py index 40fc94b86..e23a2f68e 100644 --- a/igor.py +++ b/igor.py @@ -276,7 +276,7 @@ def do_zip_mods(): def do_check_eol(): - """Check files for incorrect newlines and trailing whitespace.""" + """Check files for incorrect newlines and trailing white space.""" ignore_dirs = [ '.svn', '.hg', '.git', @@ -290,7 +290,7 @@ def do_check_eol(): checked = set() def check_file(fname, crlf=True, trail_white=True): - """Check a single file for whitespace abuse.""" + """Check a single file for white space abuse.""" fname = os.path.relpath(fname) if fname in checked: return @@ -308,14 +308,14 @@ def check_file(fname, crlf=True, trail_white=True): if not crlf: line = line.rstrip(b'\r') if line.rstrip() != line: - print(f"{fname}@{n}: trailing whitespace found") + 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 whitespace abuse.""" + """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) diff --git a/tests/mixins.py b/tests/mixins.py index 3d623fb38..9be6d21c6 100644 --- a/tests/mixins.py +++ b/tests/mixins.py @@ -99,7 +99,7 @@ def clean_local_file_imports(self): # So that we can re-import files, clean them out first. self._sys_module_saver.restore() - # Also have to clean out the .pyc files, since the timestamp + # Also have to clean out the .pyc files, since the time stamp # resolution is only one second, a changed file might not be # picked up. remove_tree("__pycache__") diff --git a/tests/test_api.py b/tests/test_api.py index c2dbefa81..84457d884 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -817,7 +817,7 @@ def test_nothing_specified(self): self.filenames_in(result, "p1a p1b p2a p2b othera otherb osa osb") self.filenames_not_in(result, "p1c") # Because there was no source= specified, we don't search for - # unexecuted files. + # un-executed files. def test_include(self): result = self.coverage_usepkgs(include=["*/p1a.py"]) @@ -902,7 +902,7 @@ def test_source_package_as_package(self): lines = self.coverage_usepkgs(source=["pkg1"]) self.filenames_in(lines, "p1a p1b") self.filenames_not_in(lines, "p2a p2b othera otherb osa osb") - # Because source= was specified, we do search for unexecuted files. + # Because source= was specified, we do search for un-executed files. assert lines['p1c'] == 0 def test_source_package_as_dir(self): @@ -911,13 +911,13 @@ def test_source_package_as_dir(self): lines = self.coverage_usepkgs(source=["pkg1"]) self.filenames_in(lines, "p1a p1b") self.filenames_not_in(lines, "p2a p2b othera otherb osa osb") - # Because source= was specified, we do search for unexecuted files. + # Because source= was specified, we do search for un-executed files. assert lines['p1c'] == 0 def test_source_package_dotted_sub(self): lines = self.coverage_usepkgs(source=["pkg1.sub"]) self.filenames_not_in(lines, "p2a p2b othera otherb osa osb") - # Because source= was specified, we do search for unexecuted files. + # Because source= was specified, we do search for un-executed files. assert lines['runmod3'] == 0 def test_source_package_dotted_p1b(self): @@ -929,7 +929,7 @@ def test_source_package_part_omitted(self): # https://github.com/nedbat/coveragepy/issues/218 # Used to be if you omitted something executed and inside the source, # then after it was executed but not recorded, it would be found in - # the search for unexecuted files, and given a score of 0%. + # the search for un-executed files, and given a score of 0%. # The omit arg is by path, so need to be in the modules directory. os.chdir("tests_dir_modules") @@ -959,7 +959,7 @@ def test_ambiguous_source_package_as_package(self): lines = self.coverage_usepkgs(source_pkgs=["pkg1"]) self.filenames_in(lines, "p1a p1b") self.filenames_not_in(lines, "p2a p2b othera otherb osa osb ambiguous") - # Because source= was specified, we do search for unexecuted files. + # Because source= was specified, we do search for un-executed files. assert lines['p1c'] == 0 diff --git a/tests/test_html.py b/tests/test_html.py index 6aea06264..b49cdabb3 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -67,7 +67,7 @@ def get_html_report_content(self, module): def get_html_index_content(self): """Return the content of index.html. - Timestamps are replaced with a placeholder so that clocks don't matter. + Time stamps are replaced with a placeholder so that clocks don't matter. """ with open("htmlcov/index.html") as f: @@ -85,17 +85,17 @@ def get_html_index_content(self): return index def assert_correct_timestamp(self, html): - """Extract the timestamp from `html`, and assert it is recent.""" + """Extract the time stamp from `html`, and assert it is recent.""" timestamp_pat = r"created at (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})" m = re.search(timestamp_pat, html) - assert m, "Didn't find a timestamp!" + assert m, "Didn't find a time stamp!" timestamp = datetime.datetime(*map(int, m.groups())) - # The timestamp only records the minute, so the delta could be from + # The time stamp only records the minute, so the delta could be from # 12:00 to 12:01:59, or two minutes. self.assert_recent_datetime( timestamp, seconds=120, - msg=f"Timestamp is wrong: {timestamp}", + msg=f"Time stamp is wrong: {timestamp}", ) def assert_valid_hrefs(self): diff --git a/tests/test_phystokens.py b/tests/test_phystokens.py index da37cead5..dae1a0ed1 100644 --- a/tests/test_phystokens.py +++ b/tests/test_phystokens.py @@ -32,7 +32,7 @@ def foo(): ('ws', ' '), ('num', '2'), ('op', ')')], ] -# Mixed-whitespace program, and its token stream. +# Mixed-white-space program, and its token stream. MIXED_WS = """\ def hello(): a="Hello world!" From e955f106134029e2b8991a3ad1299377b73a0e55 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 29 Nov 2022 06:56:56 -0500 Subject: [PATCH 085/200] test: colored pytest output in GitHub Actions --- .github/workflows/coverage.yml | 1 + .github/workflows/testsuite.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 5130e3fff..aa740fa52 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -18,6 +18,7 @@ defaults: env: PIP_DISABLE_PIP_VERSION_CHECK: 1 + FORCE_COLOR: 1 # Get colored pytest output permissions: contents: read diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index dbc90be33..f343d3839 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -18,6 +18,7 @@ defaults: env: PIP_DISABLE_PIP_VERSION_CHECK: 1 COVERAGE_IGOR_VERBOSE: 1 + FORCE_COLOR: 1 # Get colored pytest output permissions: contents: read From 7e7c44b4f5c484105559690b1efccd84839bc640 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 28 Nov 2022 10:12:56 -0500 Subject: [PATCH 086/200] feat: file paths are only remapped if the result exists --- CHANGES.rst | 8 ++++++++ coverage/files.py | 9 +++++++-- doc/config.rst | 4 +++- tests/test_api.py | 23 +++++++++++++---------- tests/test_data.py | 3 +++ tests/test_files.py | 11 ++++++++--- tests/test_process.py | 2 ++ 7 files changed, 44 insertions(+), 16 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 63114d2a0..e20d55620 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -32,6 +32,11 @@ released.) - Using ``--format=total`` will write a single total number to the output. This can be useful for making badges or writing status updates. +- When remapping file paths with the ``[paths]`` setting, a path will be + remapped only if the resulting path exists. The documentation has long said + this was the case, but it was not enforced. This fixes `issue 608`_, + improves `issue 649`_, and closes `issue 757`_. + - Reporting operations now use the ``[paths]`` setting to remap file paths within a single data file. Combining multiple files still requires the ``coverage combine`` step, but this simplifies some situations. Closes @@ -62,7 +67,10 @@ released.) - The deprecated ``[run] note`` setting has been completely removed. .. _implicit namespace packages: https://peps.python.org/pep-0420/ +.. _issue 608: https://github.com/nedbat/coveragepy/issues/608 +.. _issue 649: https://github.com/nedbat/coveragepy/issues/649 .. _issue 713: https://github.com/nedbat/coveragepy/issues/713 +.. _issue 757: https://github.com/nedbat/coveragepy/issues/757 .. _issue 1212: https://github.com/nedbat/coveragepy/issues/1212 .. _issue 1383: https://github.com/nedbat/coveragepy/issues/1383 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 diff --git a/coverage/files.py b/coverage/files.py index f016a32ef..14d696b6b 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -408,7 +408,7 @@ def add(self, pattern, result): result = result.rstrip(r"\/") + result_sep self.aliases.append((original_pattern, regex, result)) - def map(self, path): + def map(self, path, exists=os.path.exists): """Map `path` through the aliases. `path` is checked against all of the patterns. The first pattern to @@ -419,6 +419,9 @@ def map(self, path): The separator style in the result is made to match that of the result in the alias. + `exists` is a function to determine if the resulting path actually + exists. + Returns the mapped path. If a mapping has happened, this is a canonical path. If no mapping has happened, it is the original value of `path` unchanged. @@ -438,6 +441,8 @@ def map(self, path): dot_start = result.startswith(("./", ".\\")) and len(result) > 2 if new.startswith(("./", ".\\")) and not dot_start: new = new[2:] + if not exists(new): + continue self.debugfn( f"Matched path {path!r} to rule {original_pattern!r} -> {result!r}, " + f"producing {new!r}" @@ -455,7 +460,7 @@ def map(self, path): result = f"{dir1}{os.sep}" self.debugfn(f"Generating rule: {pattern!r} -> {result!r} using regex {regex!r}") self.aliases.append((pattern, re.compile(regex), result)) - return self.map(path) + return self.map(path, exists=exists) self.debugfn(f"No rules match, path {path!r} is unchanged") return path diff --git a/doc/config.rst b/doc/config.rst index b387deb5a..90949506a 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -344,7 +344,9 @@ combined with data for "c:\\myproj\\src\\module.py", and will be reported against the source file found at "src/module.py". If you specify more than one list of paths, they will be considered in order. -The first list that has a match will be used. +A file path will only be remapped if the result exists. If a path matches a +list, but the result doesn't exist, the next list will be tried. The first +list that has an existing result will be used. Remapping will also be done during reporting, but only within the single data file being reported. Combining multiple files requires the ``combine`` diff --git a/tests/test_api.py b/tests/test_api.py index 84457d884..ee24aa8fd 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -478,8 +478,11 @@ def test_combining_with_a_used_coverage(self): def test_ordered_combine(self): # https://github.com/nedbat/coveragepy/issues/649 - # The order of the [paths] setting matters - def make_data_file(): + # The order of the [paths] setting used to matter. Now the + # resulting path must exist, so the order doesn't matter. + def make_files(): + self.make_file("plugins/p1.py", "") + self.make_file("girder/g1.py", "") self.make_data_file( basename=".coverage.1", lines={ @@ -498,7 +501,7 @@ def get_combined_filenames(): return filenames # Case 1: get the order right. - make_data_file() + make_files() self.make_file(".coveragerc", """\ [paths] plugins = @@ -510,8 +513,8 @@ def get_combined_filenames(): """) assert get_combined_filenames() == {'girder/g1.py', 'plugins/p1.py'} - # Case 2: get the order wrong. - make_data_file() + # Case 2: get the order "wrong". + make_files() self.make_file(".coveragerc", """\ [paths] girder = @@ -521,7 +524,7 @@ def get_combined_filenames(): plugins/ ci/girder/plugins/ """) - assert get_combined_filenames() == {'girder/g1.py', 'girder/plugins/p1.py'} + assert get_combined_filenames() == {'girder/g1.py', 'plugins/p1.py'} def test_warnings(self): self.make_file("hello.py", """\ @@ -1197,6 +1200,10 @@ def test_combine_relative(self): cov.save() shutil.move(glob.glob(".coverage.*")[0], "..") + self.make_file("foo.py", "a = 1") + self.make_file("bar.py", "a = 1") + self.make_file("modsrc/__init__.py", "x = 1") + self.make_file(".coveragerc", """\ [run] relative_files = true @@ -1209,10 +1216,6 @@ def test_combine_relative(self): cov.combine() cov.save() - self.make_file("foo.py", "a = 1") - self.make_file("bar.py", "a = 1") - self.make_file("modsrc/__init__.py", "x = 1") - cov = coverage.Coverage() cov.load() files = cov.get_data().measured_files() diff --git a/tests/test_data.py b/tests/test_data.py index 79c90420b..6a6228d80 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -788,6 +788,9 @@ def test_combining_with_aliases(self): self.assert_file_count(".coverage.*", 2) + self.make_file("a.py", "") + self.make_file("sub/b.py", "") + self.make_file("template.html", "") covdata3 = DebugCoverageData() aliases = PathAliases() aliases.add("/home/ned/proj/src/", "./") diff --git a/tests/test_files.py b/tests/test_files.py index a69d1a4b0..85fb6dbb7 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -346,16 +346,16 @@ def assert_mapped(self, aliases, inp, out): since aliases produce canonicalized paths by default. """ - mapped = aliases.map(inp) + mapped = aliases.map(inp, exists=lambda p: True) if aliases.relative: expected = out else: expected = files.canonical_filename(out) assert mapped == expected - def assert_unchanged(self, aliases, inp): + def assert_unchanged(self, aliases, inp, exists=True): """Assert that `inp` mapped through `aliases` is unchanged.""" - assert aliases.map(inp) == inp + assert aliases.map(inp, exists=lambda p: exists) == inp def test_noop(self, rel_yn): aliases = PathAliases(relative=rel_yn) @@ -380,6 +380,11 @@ def test_no_accidental_match(self, rel_yn): aliases.add('/home/*/src', './mysrc') self.assert_unchanged(aliases, '/home/foo/srcetc') + def test_no_map_if_not_exist(self, rel_yn): + aliases = PathAliases(relative=rel_yn) + aliases.add('/ned/home/*/src', './mysrc') + self.assert_unchanged(aliases, '/ned/home/foo/src/a.py', exists=False) + def test_no_dotslash(self, rel_yn): # The result shouldn't start with "./" if the map result didn't. aliases = PathAliases(relative=rel_yn) diff --git a/tests/test_process.py b/tests/test_process.py index 1f134a6da..3324497d9 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -217,6 +217,8 @@ def test_combine_with_aliases(self): self.assert_file_count(".coverage.*", 2) + self.make_file("src/x.py", "") + self.run_command("coverage combine") self.assert_exists(".coverage") From b87f145aad6984a0d06599f7836aad969df23d5e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 1 Dec 2022 07:13:19 -0500 Subject: [PATCH 087/200] chore: make upgrade --- requirements/dev.pip | 30 +++++++++++++++--------------- requirements/lint.pip | 30 +++++++++++++++--------------- requirements/pip-tools.pip | 6 +++--- requirements/pip.pip | 6 +++--- requirements/pytest.pip | 6 +++--- requirements/tox.pip | 6 +++--- 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/requirements/dev.pip b/requirements/dev.pip index db47acf25..9e86c464f 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -167,9 +167,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.58.1 \ - --hash=sha256:8738b9b38c2b2c214d965b07f29312047b970541d848cb97d2a58f79fd61fbe6 \ - --hash=sha256:b5747497b2b352335e4dc51f1b113cfc90c49ffd174f2036f173edf8799e123a +hypothesis==6.58.2 \ + --hash=sha256:6108f8f692fa6554c8cb10b3516d97d2609fa063745ecaf36f1878d007c51d8f \ + --hash=sha256:6e235b71455ef7e329b8214e75bad3f5195caf4ee708c571f20a76c6f5c18814 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -264,9 +264,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -pkginfo==1.8.3 \ - --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ - --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c +pkginfo==1.9.2 \ + --hash=sha256:ac03e37e4d601aaee40f8087f63fc4a2a6c9814dda2c8fa6aab1b1829653bdfa \ + --hash=sha256:d580059503f2f4549ad6e4c106d7437356dbd430e2c7df99ee1efe03d75f691e # via twine platformdirs==2.5.4 \ --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ @@ -299,9 +299,9 @@ pygments==2.13.0 \ # pudb # readme-renderer # rich -pylint==2.15.6 \ - --hash=sha256:15060cc22ed6830a4049cf40bc24977744df2e554d38da1b2657591de5bcd052 \ - --hash=sha256:25b13ddcf5af7d112cf96935e21806c1da60e676f952efb650130f2a4483421c +pylint==2.15.7 \ + --hash=sha256:1d561d1d3e8be9dd880edc685162fbdaa0409c88b9b7400873c0cf345602e326 \ + --hash=sha256:91e4776dbcb4b4d921a3e4b6fec669551107ba11f29d9199154a01622e460a57 # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -383,9 +383,9 @@ tox==3.27.1 \ --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 # via -r requirements/dev.in -twine==4.0.1 \ - --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ - --hash=sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0 +twine==4.0.2 \ + --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ + --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 # via -r requirements/dev.in typed-ast==1.5.4 \ --hash=sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2 \ @@ -437,9 +437,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.16.7 \ - --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ - --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 +virtualenv==20.17.0 \ + --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ + --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 # via # -r requirements/pip.pip # tox diff --git a/requirements/lint.pip b/requirements/lint.pip index 7c74a68ea..d38f60fe7 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -182,9 +182,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.58.1 \ - --hash=sha256:8738b9b38c2b2c214d965b07f29312047b970541d848cb97d2a58f79fd61fbe6 \ - --hash=sha256:b5747497b2b352335e4dc51f1b113cfc90c49ffd174f2036f173edf8799e123a +hypothesis==6.58.2 \ + --hash=sha256:6108f8f692fa6554c8cb10b3516d97d2609fa063745ecaf36f1878d007c51d8f \ + --hash=sha256:6e235b71455ef7e329b8214e75bad3f5195caf4ee708c571f20a76c6f5c18814 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -335,9 +335,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -pkginfo==1.8.3 \ - --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ - --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c +pkginfo==1.9.2 \ + --hash=sha256:ac03e37e4d601aaee40f8087f63fc4a2a6c9814dda2c8fa6aab1b1829653bdfa \ + --hash=sha256:d580059503f2f4549ad6e4c106d7437356dbd430e2c7df99ee1efe03d75f691e # via twine platformdirs==2.5.4 \ --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ @@ -379,9 +379,9 @@ pygments==2.13.0 \ # readme-renderer # rich # sphinx -pylint==2.15.6 \ - --hash=sha256:15060cc22ed6830a4049cf40bc24977744df2e554d38da1b2657591de5bcd052 \ - --hash=sha256:25b13ddcf5af7d112cf96935e21806c1da60e676f952efb650130f2a4483421c +pylint==2.15.7 \ + --hash=sha256:1d561d1d3e8be9dd880edc685162fbdaa0409c88b9b7400873c0cf345602e326 \ + --hash=sha256:91e4776dbcb4b4d921a3e4b6fec669551107ba11f29d9199154a01622e460a57 # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -535,9 +535,9 @@ tox==3.27.1 \ --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 # via -r requirements/dev.in -twine==4.0.1 \ - --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ - --hash=sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0 +twine==4.0.2 \ + --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ + --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 # via -r requirements/dev.in typed-ast==1.5.4 \ --hash=sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2 \ @@ -589,9 +589,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.16.7 \ - --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ - --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 +virtualenv==20.17.0 \ + --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ + --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 # via # -r requirements/pip.pip # tox diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 96e16c7e3..038773d77 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -27,9 +27,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -pip-tools==6.10.0 \ - --hash=sha256:57ac98392548f5ca96c2831927deec3035efe81ff476e3c744bd474ca9c6a1f2 \ - --hash=sha256:7f9f7356052db6942b5aaabc8eba29983591ca0ad75affbf2f0a25d9361be624 +pip-tools==6.11.0 \ + --hash=sha256:64a6b66887c270705a9006a10023eb4c893e9bf66c306bdcb4440541b367c057 \ + --hash=sha256:90c5dc150e3856e4463b81ccc99307ccf9554e5db8393eb273705cb0b8f71c60 # via -r requirements/pip-tools.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ diff --git a/requirements/pip.pip b/requirements/pip.pip index d4f8cc870..6d6245498 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -24,9 +24,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.16.7 \ - --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ - --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 +virtualenv==20.17.0 \ + --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ + --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 # via -r requirements/pip.in zipp==3.11.0 \ --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 270232e6c..cea25a6fc 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -42,9 +42,9 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.58.1 \ - --hash=sha256:8738b9b38c2b2c214d965b07f29312047b970541d848cb97d2a58f79fd61fbe6 \ - --hash=sha256:b5747497b2b352335e4dc51f1b113cfc90c49ffd174f2036f173edf8799e123a +hypothesis==6.58.2 \ + --hash=sha256:6108f8f692fa6554c8cb10b3516d97d2609fa063745ecaf36f1878d007c51d8f \ + --hash=sha256:6e235b71455ef7e329b8214e75bad3f5195caf4ee708c571f20a76c6f5c18814 # via -r requirements/pytest.in importlib-metadata==5.1.0 \ --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ diff --git a/requirements/tox.pip b/requirements/tox.pip index 890f88899..86bfb3c3f 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -71,9 +71,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.16.7 \ - --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ - --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 +virtualenv==20.17.0 \ + --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ + --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 # via tox zipp==3.11.0 \ --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ From 54eb890e24713c5375cce7005f78bf2863f7f901 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 1 Dec 2022 07:51:46 -0500 Subject: [PATCH 088/200] test: don't add tests conditionally, skip them instead This keeps the total number of tests the same in all situations. --- tests/test_files.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/test_files.py b/tests/test_files.py index 85fb6dbb7..5d00bca88 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -561,13 +561,12 @@ def test_leading_wildcard(self, rel_yn): self.assert_mapped(aliases, '/foo/bar/d1/x.py', './mysrc1/x.py') self.assert_mapped(aliases, '/foo/bar/d2/y.py', './mysrc2/y.py') - # The root test case was added for the manylinux Docker images, - # and I'm not sure how it should work on Windows, so skip it. - cases = [".", "..", "../other"] - if not env.WINDOWS: - cases += ["/"] - @pytest.mark.parametrize("dirname", cases) + @pytest.mark.parametrize("dirname", [".", "..", "../other", "/"]) def test_dot(self, dirname): + if env.WINDOWS and dirname == "/": + # The root test case was added for the manylinux Docker images, + # and I'm not sure how it should work on Windows, so skip it. + pytest.skip("Don't know how to handle root on Windows") aliases = PathAliases() aliases.add(dirname, '/the/source') the_file = os.path.join(dirname, 'a.py') From c2e35658d8311fd2b5d1460c2cb56762d5fe0ec7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 30 Nov 2022 05:12:41 -0500 Subject: [PATCH 089/200] fix: prevent infinite recursion If using relative file paths, and a file remapping failed, we'd get an infinite recursion. --- coverage/files.py | 11 ++++++++--- tests/test_files.py | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/coverage/files.py b/coverage/files.py index 14d696b6b..63e9afb29 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -452,15 +452,20 @@ def map(self, path, exists=os.path.exists): # If we get here, no pattern matched. if self.relative and not isabs_anywhere(path): + # Auto-generate a pattern to implicitly match relative files parts = re.split(r"[/\\]", path) if len(parts) > 1: dir1 = parts[0] pattern = f"*/{dir1}" regex = rf"^(.*[\\/])?{re.escape(dir1)}[\\/]" result = f"{dir1}{os.sep}" - self.debugfn(f"Generating rule: {pattern!r} -> {result!r} using regex {regex!r}") - self.aliases.append((pattern, re.compile(regex), result)) - return self.map(path, exists=exists) + # Only add a new pattern if we don't already have this pattern. + if not any(p == pattern for p, _, _ in self.aliases): + self.debugfn( + f"Generating rule: {pattern!r} -> {result!r} using regex {regex!r}" + ) + self.aliases.append((pattern, re.compile(regex), result)) + return self.map(path, exists=exists) self.debugfn(f"No rules match, path {path!r} is unchanged") return path diff --git a/tests/test_files.py b/tests/test_files.py index 5d00bca88..4baac072e 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -384,6 +384,7 @@ def test_no_map_if_not_exist(self, rel_yn): aliases = PathAliases(relative=rel_yn) aliases.add('/ned/home/*/src', './mysrc') self.assert_unchanged(aliases, '/ned/home/foo/src/a.py', exists=False) + self.assert_unchanged(aliases, 'foo/src/a.py', exists=False) def test_no_dotslash(self, rel_yn): # The result shouldn't start with "./" if the map result didn't. From 2adeb8bb5c2a12a080d7a528e35e5df9ffe7785f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 30 Nov 2022 18:44:40 -0500 Subject: [PATCH 090/200] fix: when checking source existence for remapping, zipfiles are ok --- coverage/files.py | 31 ++++++++++++++++++++++++++++++- coverage/python.py | 27 +++++++++++++-------------- tests/test_files.py | 31 ++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/coverage/files.py b/coverage/files.py index 63e9afb29..5f2224195 100644 --- a/coverage/files.py +++ b/coverage/files.py @@ -153,6 +153,35 @@ def abs_file(path): return actual_path(os.path.abspath(os.path.realpath(path))) +def zip_location(filename): + """Split a filename into a zipfile / inner name pair. + + Only return a pair if the zipfile exists. No check is made if the inner + name is in the zipfile. + + """ + for ext in ['.zip', '.egg', '.pex']: + zipbase, extension, inner = filename.partition(ext + sep(filename)) + if extension: + zipfile = zipbase + ext + if os.path.exists(zipfile): + return zipfile, inner + return None + + +def source_exists(path): + """Determine if a source file path exists.""" + if os.path.exists(path): + return True + + if zip_location(path): + # If zip_location returns anything, then it's a zipfile that + # exists. That's good enough for us. + return True + + return False + + def python_reported_file(filename): """Return the string as Python would describe this file name.""" if env.PYBEHAVIOR.report_absolute_files: @@ -408,7 +437,7 @@ def add(self, pattern, result): result = result.rstrip(r"\/") + result_sep self.aliases.append((original_pattern, regex, result)) - def map(self, path, exists=os.path.exists): + def map(self, path, exists=source_exists): """Map `path` through the aliases. `path` is checked against all of the patterns. The first pattern to diff --git a/coverage/python.py b/coverage/python.py index c8b8e774b..b32320853 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -9,7 +9,7 @@ from coverage import env from coverage.exceptions import CoverageException, NoSource -from coverage.files import canonical_filename, relative_filename +from coverage.files import canonical_filename, relative_filename, zip_location from coverage.misc import contract, expensive, isolate_module, join_regex from coverage.parser import PythonParser from coverage.phystokens import source_token_lines, source_encoding @@ -79,19 +79,18 @@ def get_zip_bytes(filename): an empty string if the file is empty. """ - markers = ['.zip'+os.sep, '.egg'+os.sep, '.pex'+os.sep] - for marker in markers: - if marker in filename: - parts = filename.split(marker) - try: - zi = zipimport.zipimporter(parts[0]+marker[:-1]) - except zipimport.ZipImportError: - continue - try: - data = zi.get_data(parts[1]) - except OSError: - continue - return data + zipfile_inner = zip_location(filename) + if zipfile_inner is not None: + zipfile, inner = zipfile_inner + try: + zi = zipimport.zipimporter(zipfile) + except zipimport.ZipImportError: + return None + try: + data = zi.get_data(inner) + except OSError: + return None + return data return None diff --git a/tests/test_files.py b/tests/test_files.py index 4baac072e..9e49628d5 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -69,7 +69,7 @@ def test_canonical_filename_ensure_cache_hit(self): assert files.canonical_filename('sub/proj1/file1.py') == self.abs_path('file1.py') @pytest.mark.parametrize( - ["curdir", "sep"], [ + "curdir, sep", [ ("/", "/"), ("X:\\", "\\"), ] @@ -81,6 +81,21 @@ def test_relative_dir_for_root(self, curdir, sep): files.set_relative_directory() assert files.relative_directory() == curdir + @pytest.mark.parametrize( + "to_make, to_check, answer", [ + ("a/b/c/foo.py", "a/b/c/foo.py", True), + ("a/b/c/foo.py", "a/b/c/bar.py", False), + ("src/files.zip", "src/files.zip/foo.py", True), + ("src/files.egg", "src/files.egg/foo.py", True), + ("src/files.pex", "src/files.pex/foo.py", True), + ("src/files.zip", "src/morefiles.zip/foo.py", False), + ("src/files.pex", "src/files.pex/zipfiles/files.zip/foo.py", True), + ] + ) + def test_source_exists(self, to_make, to_check, answer): + self.make_file(to_make, "") + assert files.source_exists(to_check) == answer + @pytest.mark.parametrize("original, flat", [ ("abc.py", "abc_py"), @@ -117,6 +132,7 @@ def globs_to_regex_params( Everything is yielded so that `test_globs_to_regex` can call `globs_to_regex` once and check one result. + """ pat_id = "|".join(patterns) for text in matches: @@ -578,6 +594,19 @@ def test_dot(self, dirname): self.assert_mapped(aliases, the_file, '/the/source/a.py') +class PathAliasesRealFilesTest(CoverageTest): + """Tests for coverage/files.py:PathAliases using real files.""" + + def test_aliasing_zip_files(self): + self.make_file("src/zipfiles/code.zip", "fake zip, doesn't matter") + aliases = PathAliases() + aliases.add("*/d1", "./src") + aliases.add("*/d2", "./src") + + expected = files.canonical_filename("src/zipfiles/code.zip/p1.py") + assert aliases.map("tox/d1/zipfiles/code.zip/p1.py") == expected + + class FindPythonFilesTest(CoverageTest): """Tests of `find_python_files`.""" From e1ff601489c7f3af90299ff3a5541b83151c323c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 2 Dec 2022 06:54:59 -0500 Subject: [PATCH 091/200] build: use --resolver=backtracking as advised --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9184ab772..c4415e614 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ metasmoke: .PHONY: upgrade -PIP_COMPILE = pip-compile --upgrade --allow-unsafe --generate-hashes +PIP_COMPILE = pip-compile --upgrade --allow-unsafe --generate-hashes --resolver=backtracking upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade upgrade: ## Update the *.pip files with the latest packages satisfying *.in files. pip install -q -r requirements/pip-tools.pip From 518cdff5bf3467702fa691f833be3b37eef326a0 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 2 Dec 2022 07:10:31 -0500 Subject: [PATCH 092/200] chore: make upgrade --- doc/requirements.pip | 4 ++-- requirements/dev.pip | 10 +++++----- requirements/kit.pip | 4 ++-- requirements/light-threads.pip | 9 ++++++--- requirements/lint.pip | 10 +++++----- requirements/pip-tools.pip | 4 ++-- requirements/pip.pip | 4 ++-- requirements/pytest.pip | 10 +++++----- requirements/tox.pip | 4 ++-- 9 files changed, 31 insertions(+), 28 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 2c8066ec7..5c03e49b8 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # diff --git a/requirements/dev.pip b/requirements/dev.pip index 9e86c464f..616525232 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # @@ -167,9 +167,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.58.2 \ - --hash=sha256:6108f8f692fa6554c8cb10b3516d97d2609fa063745ecaf36f1878d007c51d8f \ - --hash=sha256:6e235b71455ef7e329b8214e75bad3f5195caf4ee708c571f20a76c6f5c18814 +hypothesis==6.59.0 \ + --hash=sha256:4eb2875097a07553a1006cb2b96fab21682e4359b138b2ae3c5f5d8b3f5a8bf1 \ + --hash=sha256:af05e24b123c9413b8752bbf822105dbb112f56456fb240723d7f410eebf78bb # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ diff --git a/requirements/kit.pip b/requirements/kit.pip index 80a43432a..c96ea8d19 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index a97ec9ebc..9245dbc47 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # @@ -252,4 +252,7 @@ zope-interface==5.5.2 \ setuptools==65.6.3 \ --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 - # via gevent + # via + # gevent + # zope-event + # zope-interface diff --git a/requirements/lint.pip b/requirements/lint.pip index d38f60fe7..5697b19ee 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # @@ -182,9 +182,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.58.2 \ - --hash=sha256:6108f8f692fa6554c8cb10b3516d97d2609fa063745ecaf36f1878d007c51d8f \ - --hash=sha256:6e235b71455ef7e329b8214e75bad3f5195caf4ee708c571f20a76c6f5c18814 +hypothesis==6.59.0 \ + --hash=sha256:4eb2875097a07553a1006cb2b96fab21682e4359b138b2ae3c5f5d8b3f5a8bf1 \ + --hash=sha256:af05e24b123c9413b8752bbf822105dbb112f56456fb240723d7f410eebf78bb # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 038773d77..746fd431c 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # diff --git a/requirements/pip.pip b/requirements/pip.pip index 6d6245498..a3e3a7c1f 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # diff --git a/requirements/pytest.pip b/requirements/pytest.pip index cea25a6fc..f4f2a6213 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # @@ -42,9 +42,9 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.58.2 \ - --hash=sha256:6108f8f692fa6554c8cb10b3516d97d2609fa063745ecaf36f1878d007c51d8f \ - --hash=sha256:6e235b71455ef7e329b8214e75bad3f5195caf4ee708c571f20a76c6f5c18814 +hypothesis==6.59.0 \ + --hash=sha256:4eb2875097a07553a1006cb2b96fab21682e4359b138b2ae3c5f5d8b3f5a8bf1 \ + --hash=sha256:af05e24b123c9413b8752bbf822105dbb112f56456fb240723d7f410eebf78bb # via -r requirements/pytest.in importlib-metadata==5.1.0 \ --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ diff --git a/requirements/tox.pip b/requirements/tox.pip index 86bfb3c3f..55cd7aefe 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -1,6 +1,6 @@ # -# This file is autogenerated by pip-compile with python 3.7 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.7 +# by the following command: # # make upgrade # From 535060c95b606f0c043e02a4688b4bda6f162996 Mon Sep 17 00:00:00 2001 From: Sviatoslav Sydorenko Date: Thu, 1 Dec 2022 17:47:14 +0100 Subject: [PATCH 093/200] test: only rerun the failed tests in CI This patch simplifies attempting to execute the tests again on failures in CI. It also limits the scope of the tests being rerun to include only those that failed on the first try. Additionally, it enables the maximum verbosity so that the retry is more useful for troubleshooting. --- .github/workflows/testsuite.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/testsuite.yml b/.github/workflows/testsuite.yml index f343d3839..30b838566 100644 --- a/.github/workflows/testsuite.yml +++ b/.github/workflows/testsuite.yml @@ -74,23 +74,14 @@ jobs: # python -c "import urllib.request as r; exec(r.urlopen('https://bit.ly/pydoctor').read())" - name: "Run tox for ${{ matrix.python-version }}" - continue-on-error: true - id: tox1 run: | python -m tox -- -rfsEX - name: "Retry tox for ${{ matrix.python-version }}" - id: tox2 - if: steps.tox1.outcome == 'failure' + if: failure() run: | - python -m tox -- -rfsEX - - - name: "Set status" - if: always() - run: | - if ${{ steps.tox1.outcome != 'success' && steps.tox2.outcome != 'success' }}; then - exit 1 - fi + # `exit 1` makes sure that the job remains red with flaky runs + python -m tox -- -rfsEX --lf -vvvvv && exit 1 # This job aggregates test results. It's the required check for branch protection. # https://github.com/marketplace/actions/alls-green#why From 5f1067e4ee15b31e65fd0207d6efc00cce1e5608 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 06:04:53 -0500 Subject: [PATCH 094/200] test: ensure columns=80 for cogging --- tox.ini | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 011184512..97aa021ff 100644 --- a/tox.ini +++ b/tox.ini @@ -31,6 +31,9 @@ setenv = # For some tests, we need .pyc files written in the current directory, # so override any local setting. PYTHONPYCACHEPREFIX= + # Cog'ing the --help output depends on the width of the terminal, + # so set it explicitly to avoid environmental interference + COLUMNS=80 commands = # Create tests/zipmods.zip @@ -74,7 +77,8 @@ deps = -r requirements/lint.pip setenv = - LINTABLE = coverage tests doc ci igor.py setup.py __main__.py + {[testenv]setenv} + LINTABLE=coverage tests doc ci igor.py setup.py __main__.py commands = python -m tabnanny {env:LINTABLE} From 69f75141a5cb2cc2b5590dc3fa03139c42804669 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 08:34:49 -0500 Subject: [PATCH 095/200] docs: edit the changelog for 7.0.0 --- CHANGES.rst | 79 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index e20d55620..5eb99c709 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,11 +20,48 @@ development at the same time, such as 4.5.x and 5.0. Unreleased ---------- -(Also see the changes for `6.6.0b1 `_, since 6.6.0 was never -released.) +A number of changes have been made to file path handling, including pattern +matching and path remapping with the ``[paths]`` setting (see +:ref:`config_paths`). These changes might affect you, and require you to +update your settings. -- Text reporting with ``coverage report`` now has a ``--format=`` option. - The original style (``--format=text``) is the default. +(This release includes the changes from `6.6.0b1 `_, since +6.6.0 was never released.) + +- Changes to file pattern matching, which might require updating your + configuration: + + - Previously, ``*`` would incorrectly match directory separators, making + precise matching difficult. This is now fixed, closing `issue 1407`_. + + - Now ``**`` matches any number of nested directories, including none. + +- Improvements to combining data files when using the + :ref:`config_run_relative_files` setting, which might require updating your + configuration: + + - During ``coverage combine``, relative file paths are implicitly combined + without needing a ``[paths]`` configuration setting. This also fixed + `issue 991`_. + + - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that + relative file paths can be combined more easily. + + - The :ref:`config_run_relative_files` setting is properly interpreted in + more places, fixing `issue 1280`_. + +- When remapping file paths with ``[paths]``, a path will be remapped only if + the resulting path exists. The documentation has long said the prefix had to + exist, but it was never enforced. This fixes `issue 608`_, improves `issue + 649`_, and closes `issue 757`_. + +- Reporting operations now implicitly use the ``[paths]`` setting to remap file + paths within a single data file. Combining multiple files still requires the + ``coverage combine`` step, but this simplifies some single-file situations. + Closes `issue 1212`_ and `issue 713`_. + +- The ``coverage report`` command now has a ``--format=`` option. The original + style is now ``--format=text``, and is the default. - Using ``--format=markdown`` will write the table in Markdown format, thanks to `Steve Oswald `_, closing `issue 1418`_. @@ -32,20 +69,10 @@ released.) - Using ``--format=total`` will write a single total number to the output. This can be useful for making badges or writing status updates. -- When remapping file paths with the ``[paths]`` setting, a path will be - remapped only if the resulting path exists. The documentation has long said - this was the case, but it was not enforced. This fixes `issue 608`_, - improves `issue 649`_, and closes `issue 757`_. - -- Reporting operations now use the ``[paths]`` setting to remap file paths - within a single data file. Combining multiple files still requires the - ``coverage combine`` step, but this simplifies some situations. Closes - `issue 1212`_ and `issue 713`_. - -- Combining data files with ``coverage combine`` now quickly hashes the data - files to skip files that provide no new information. This can reduce the - time needed. Many details affect the speed-up, but for coverage.py's own - test suite, combining was about 40% faster. Closes `issue 1483`_. +- Combining data files with ``coverage combine`` now hashes the data files to + skip files that add no new information. This can reduce the time needed. + Many details affect the speed-up, but for coverage.py's own test suite, + combining is about 40% faster. Closes `issue 1483`_. - When searching for completely un-executed files, coverage.py uses the presence of ``__init__.py`` files to determine which directories have source @@ -55,6 +82,12 @@ released.) during reporting. Thanks to `Felix Horvat `_ for the contribution. Closes `issue 1383`_. +- Fixed environment variable expansion in pyproject.toml files. It was overly + broad, causing errors outside of coverage.py settings, as described in `issue + 1481`_ and `issue 1345`_. This is now fixed, but in rare cases will require + changing your pyproject.toml to quote non-string values that use environment + substitution. + - An empty file has a coverage total of 100%, but used to fail with ``--fail-under``. This has been fixed, closing `issue 1470`_. @@ -64,6 +97,9 @@ released.) - Fixed a mis-measurement of a strange use of wildcard alternatives in match/case statements, closing `issue 1421`_. +- Fixed internal logic that prevented coverage.py from running on + implementations other than CPython or PyPy (`issue 1474`_). + - The deprecated ``[run] note`` setting has been completely removed. .. _implicit namespace packages: https://peps.python.org/pep-0420/ @@ -71,16 +107,23 @@ released.) .. _issue 649: https://github.com/nedbat/coveragepy/issues/649 .. _issue 713: https://github.com/nedbat/coveragepy/issues/713 .. _issue 757: https://github.com/nedbat/coveragepy/issues/757 +.. _issue 991: https://github.com/nedbat/coveragepy/issues/991 .. _issue 1212: https://github.com/nedbat/coveragepy/issues/1212 +.. _issue 1280: https://github.com/nedbat/coveragepy/issues/1280 +.. _issue 1345: https://github.com/nedbat/coveragepy/issues/1345 .. _issue 1383: https://github.com/nedbat/coveragepy/issues/1383 +.. _issue 1407: https://github.com/nedbat/coveragepy/issues/1407 .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418 .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421 .. _issue 1470: https://github.com/nedbat/coveragepy/issues/1470 +.. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474 +.. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481 .. _issue 1483: https://github.com/nedbat/coveragepy/issues/1483 .. _pull 1387: https://github.com/nedbat/coveragepy/pull/1387 .. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479 + .. _changes_6-6-0b1: Version 6.6.0b1 — 2022-10-31 From f308588ceff7741ee29db3acad7b1033e32ca429 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 08:47:55 -0500 Subject: [PATCH 096/200] docs: prep for 7.0.0b1 --- CHANGES.rst | 9 ++++++--- coverage/version.py | 2 +- doc/conf.py | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 5eb99c709..93c5ff622 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,8 +17,10 @@ development at the same time, such as 4.5.x and 5.0. .. Version 9.8.1 — 2027-07-27 .. -------------------------- -Unreleased ----------- +.. _changes_7-0-0b1: + +Version 7.0.0b1 — 2022-12-03 +---------------------------- A number of changes have been made to file path handling, including pattern matching and path remapping with the ``[paths]`` setting (see @@ -129,7 +131,8 @@ update your settings. Version 6.6.0b1 — 2022-10-31 ---------------------------- -(Note: 6.6.0 final was never released. These changes are part of 7.0.0.) +(Note: 6.6.0 final was never released. These changes are part of `7.0.0b1 +`_.) - Changes to file pattern matching, which might require updating your configuration: diff --git a/coverage/version.py b/coverage/version.py index b1f6f6d64..c7fe2003a 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -6,7 +6,7 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (7, 0, 0, "alpha", 0) +version_info = (7, 0, 0, "beta", 1) _dev = 0 diff --git a/doc/conf.py b/doc/conf.py index 3dd12db23..3e949059c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -65,11 +65,11 @@ # @@@ editable copyright = "2009–2022, Ned Batchelder" # pylint: disable=redefined-builtin # The short X.Y.Z version. -version = "6.6.0" +version = "7.0.0" # The full version, including alpha/beta/rc tags. -release = "6.6.0b1" +release = "7.0.0b1" # The date of release, in "monthname day, year" format. -release_date = "October 31, 2022" +release_date = "December 3, 2022" # @@@ end rst_epilog = """ From 43d100a6515bc760b10ea596474264f9ea11a975 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 09:41:36 -0500 Subject: [PATCH 097/200] build: do we still need this pin? --- requirements/pytest.in | 6 ------ 1 file changed, 6 deletions(-) diff --git a/requirements/pytest.in b/requirements/pytest.in index 7e5c6603a..855ac3e14 100644 --- a/requirements/pytest.in +++ b/requirements/pytest.in @@ -20,9 +20,3 @@ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e574d20d860008809 # colorama;sys_platform=="win32" # We copy it here so it can get pinned. colorama - -# Pytest has a windows-only dependency on atomicwrites: -# https://github.com/pytest-dev/pytest/blob/7.1.2/setup.cfg#L50 -# atomicwrites>=1.0;sys_platform=="win32" -# though it's been removed on main. -atomicwrites>=1.0 From fc56f070e72fb1a64b9ee0a2132342c7eb4e2b05 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 09:43:38 -0500 Subject: [PATCH 098/200] chore: make upgrade --- requirements/dev.pip | 9 +++------ requirements/lint.pip | 9 +++------ requirements/pytest.pip | 9 +++------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/requirements/dev.pip b/requirements/dev.pip index 616525232..aa5cf096e 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -8,9 +8,6 @@ astroid==2.12.13 \ --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 # via pylint -atomicwrites==1.4.1 \ - --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 - # via -r requirements/pytest.pip attrs==22.1.0 \ --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c @@ -316,9 +313,9 @@ pytest==7.2.0 \ # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==3.0.2 \ - --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ - --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b +pytest-xdist==3.1.0 \ + --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ + --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 # via -r requirements/pytest.pip qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 diff --git a/requirements/lint.pip b/requirements/lint.pip index 5697b19ee..e2a7c0e8d 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -12,9 +12,6 @@ astroid==2.12.13 \ --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 # via pylint -atomicwrites==1.4.1 \ - --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 - # via -r requirements/pytest.pip attrs==22.1.0 \ --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c @@ -396,9 +393,9 @@ pytest==7.2.0 \ # via # -r requirements/pytest.pip # pytest-xdist -pytest-xdist==3.0.2 \ - --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ - --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b +pytest-xdist==3.1.0 \ + --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ + --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 # via -r requirements/pytest.pip pytz==2022.6 \ --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ diff --git a/requirements/pytest.pip b/requirements/pytest.pip index f4f2a6213..c1943e433 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -4,9 +4,6 @@ # # make upgrade # -atomicwrites==1.4.1 \ - --hash=sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 - # via -r requirements/pytest.in attrs==22.1.0 \ --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c @@ -79,9 +76,9 @@ pytest==7.2.0 \ # via # -r requirements/pytest.in # pytest-xdist -pytest-xdist==3.0.2 \ - --hash=sha256:688da9b814370e891ba5de650c9327d1a9d861721a524eb917e620eec3e90291 \ - --hash=sha256:9feb9a18e1790696ea23e1434fa73b325ed4998b0e9fcb221f16fd1945e6df1b +pytest-xdist==3.1.0 \ + --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ + --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 # via -r requirements/pytest.in qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 From 3fb7adf7f8a7a33e0680ce6df6d1944d77639ddd Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 10:26:19 -0500 Subject: [PATCH 099/200] docs: mastodon links --- README.rst | 5 ++++- setup.py | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index c049aeab6..e70879d3a 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| +| |tidelift| |sponsor| |twitter-coveragepy| |twitter-nedbat| |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 @@ -159,6 +159,9 @@ 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 + :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 diff --git a/setup.py b/setup.py index 2d678c74d..deef6f55c 100644 --- a/setup.py +++ b/setup.py @@ -131,6 +131,7 @@ def better_set_verbosity(v): '?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', }, python_requires=">=3.7", # minimum of PYVERSIONS From 75a789fad14770382448c24b479bc484a8c058b8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 06:43:53 -0500 Subject: [PATCH 100/200] test: deadsnakes dropped 3.9, so don't test it nightly --- .github/workflows/python-nightly.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/python-nightly.yml b/.github/workflows/python-nightly.yml index 726fb2bd0..9c1f0f1f6 100644 --- a/.github/workflows/python-nightly.yml +++ b/.github/workflows/python-nightly.yml @@ -41,7 +41,6 @@ jobs: # tox.ini so that tox will run properly. PYVERSIONS # Available versions: # https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly/+packages - - "3.9-dev" - "3.10-dev" - "3.11-dev" - "3.12-dev" From 97adfe828dc3952c1bc3f2010c541b59eace1df4 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 12:12:49 -0500 Subject: [PATCH 101/200] test: setting COLUMNS=80 broadly makes pytest too narrow Better to set it precisely where it is needed. This also ensures that running cog from the Makefile will get the right results. --- doc/cmd.rst | 6 ++++++ tox.ini | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/cmd.rst b/doc/cmd.rst index 663ca7080..c1f52ee74 100644 --- a/doc/cmd.rst +++ b/doc/cmd.rst @@ -6,6 +6,12 @@ Running "make prebuild" will bring it up to date. .. [[[cog + # optparse wraps help to the COLUMNS value. Set it here to be sure it's + # consistent regardless of the environment. Has to be set before we + # import cmdline.py, which creates the optparse objects. + import os + os.environ["COLUMNS"] = "80" + import contextlib import io import re diff --git a/tox.ini b/tox.ini index 97aa021ff..4a410aa7c 100644 --- a/tox.ini +++ b/tox.ini @@ -31,9 +31,6 @@ setenv = # For some tests, we need .pyc files written in the current directory, # so override any local setting. PYTHONPYCACHEPREFIX= - # Cog'ing the --help output depends on the width of the terminal, - # so set it explicitly to avoid environmental interference - COLUMNS=80 commands = # Create tests/zipmods.zip From 90468421abe178fb7d8505a8d5ca0c7875aadc3f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 12:25:30 -0500 Subject: [PATCH 102/200] docs: update man page for `report --format` --- doc/python-coverage.1.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/python-coverage.1.txt b/doc/python-coverage.1.txt index 47d447304..9d38f4f73 100644 --- a/doc/python-coverage.1.txt +++ b/doc/python-coverage.1.txt @@ -8,7 +8,7 @@ Measure Python code coverage :Author: Ned Batchelder :Author: |author| -:Date: 2022-01-25 +:Date: 2022-12-03 :Copyright: Apache 2.0 license, attribution and disclaimer required. :Manual section: 1 :Manual group: Coverage.py @@ -299,6 +299,9 @@ COMMAND REFERENCE \--fail-under `MIN` Exit with a status of 2 if the total coverage is less than `MIN`. + \--format `FORMAT` + Output format, either text (default), markdown, or total. + \-i, --ignore-errors Ignore errors while reading source files. From f09e3896e8b0d041754687e2858a899378738bbe Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 12:29:39 -0500 Subject: [PATCH 103/200] docs: prep for 7.0.0b1 --- README.rst | 8 ++++++-- doc/index.rst | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index e70879d3a..a5d11aa82 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.0a1 +* CPython 3.7 through 3.12.0a2 * PyPy3 7.3.9. Documentation is on `Read the Docs`_. Code repository and issue tracker are on @@ -37,8 +37,12 @@ Documentation is on `Read the Docs`_. Code repository and issue tracker are on .. _Read the Docs: https://coverage.readthedocs.io/ .. _GitHub: https://github.com/nedbat/coveragepy +**New in 7.x:** +improved data combining; +``report --format=``. -**New in 6.x:** dropped support for Python 2.7, 3.5, and 3.6; +**New in 6.x:** +dropped support for Python 2.7, 3.5, and 3.6; write data on SIGTERM; added support for 3.10 match/case statements. diff --git a/doc/index.rst b/doc/index.rst index fc0dbdc91..8498cb892 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,7 +18,7 @@ supported on: .. PYVERSIONS -* Python versions 3.7 through 3.12.0a1. +* Python versions 3.7 through 3.12.0a2. * PyPy3 7.3.9. .. ifconfig:: prerelease From 3f0baed3c4d7b8f762a96373adc610ceb260937e Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 13:30:43 -0500 Subject: [PATCH 104/200] build: more-correct version bumping --- igor.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/igor.py b/igor.py index e23a2f68e..70ec3529c 100644 --- a/igor.py +++ b/igor.py @@ -384,13 +384,16 @@ def get_release_facts(): import coverage.version facts = types.SimpleNamespace() facts.ver = coverage.__version__ - facts.vi = coverage.version_info + mjr, mnr, mcr, rel, ser = facts.vi = coverage.version_info facts.dev = coverage.version._dev - facts.shortver = f"{facts.vi[0]}.{facts.vi[1]}.{facts.vi[2]}" + facts.shortver = f"{mjr}.{mnr}.{mcr}" facts.anchor = facts.shortver.replace(".", "-") - if facts.vi[3] != "final": - facts.anchor += f"{facts.vi[3][0]}{facts.vi[4]}" - facts.next_vi = (facts.vi[0], facts.vi[1], facts.vi[2]+1, "alpha", 0) + if rel == "final": + facts.next_vi = (mjr, mnr, mcr+1, "alpha", 0) + else: + facts.anchor += f"{rel[0]}{ser}" + facts.next_vi = (mjr, mnr, mcr, rel, ser + 1) + facts.now = datetime.datetime.now() facts.branch = subprocess.getoutput("git rev-parse --abbrev-ref @") facts.sha = subprocess.getoutput("git rev-parse @") From bc6f82c1aa9da28d504b5c4663258336d44b205d Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 13:33:29 -0500 Subject: [PATCH 105/200] chore: 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 93c5ff622..bc2ace7f4 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. + + .. _changes_7-0-0b1: Version 7.0.0b1 — 2022-12-03 diff --git a/coverage/version.py b/coverage/version.py index c7fe2003a..5546d03d6 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -6,8 +6,8 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (7, 0, 0, "beta", 1) -_dev = 0 +version_info = (7, 0, 0, "beta", 2) +_dev = 1 def _make_version(major, minor, micro, releaselevel="final", serial=0, dev=0): From 22241988c2b3879730893e3c787f77cd542603bc Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 13:35:27 -0500 Subject: [PATCH 106/200] docs: opvars / unopvars --- howto.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/howto.txt b/howto.txt index 32707eee0..07a85619f 100644 --- a/howto.txt +++ b/howto.txt @@ -45,9 +45,9 @@ - Download and check built kits from GitHub Actions: $ make clean download_kits check_kits - examine the dist directory, and remove anything that looks malformed. + - opvars - test the pypi upload: $ make test_upload -- Update PyPI: - upload kits: $ make kit_upload - Tag the tree @@ -59,6 +59,7 @@ $ make clean github_releases - Visit the fixed issues on GitHub and mention the version it was fixed in. $ make comment_on_fixes +- unopvars - Bump version: $ make bump_version $ git push @@ -67,6 +68,7 @@ - find the latest tag in the inactive list, edit it, make it active. - readthedocs won't find the tag until a commit is made on master. - keep just the latest version of each x.y release, make the rest active but hidden. + - pre-releases should be hidden - IF NOT PRE-RELEASE: - @ https://readthedocs.org/projects/coverage/builds/ - wait for the new tag build to finish successfully. From e45309911bac7917ad70ce8d97f0b56afba55359 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 3 Dec 2022 21:34:50 -0500 Subject: [PATCH 107/200] fix(docs): pre-release urls were wrong in the package description --- setup.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index deef6f55c..fe01b7d07 100644 --- a/setup.py +++ b/setup.py @@ -62,7 +62,16 @@ def better_set_verbosity(v): exec(compile(version_file.read(), cov_ver_py, 'exec')) with open("README.rst") as readme: - long_description = readme.read().replace("https://coverage.readthedocs.io", __url__) + readme_text = readme.read() + +temp_url = __url__.replace("readthedocs", "@@") +assert "@@" not in readme_text +long_description = ( + readme_text + .replace("https://coverage.readthedocs.io/en/latest", temp_url) + .replace("https://coverage.readthedocs.io", temp_url) + .replace("@@", "readthedocs") +) with open("CONTRIBUTORS.txt", "rb") as contributors: paras = contributors.read().split(b"\n\n") From db8484dda55fa169ff6ff728b85a18a73a2848fc Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 5 Dec 2022 07:46:20 -0500 Subject: [PATCH 108/200] test: use deadsnakes v3.0.0 --- .github/workflows/python-nightly.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/python-nightly.yml b/.github/workflows/python-nightly.yml index 9c1f0f1f6..9eed8c684 100644 --- a/.github/workflows/python-nightly.yml +++ b/.github/workflows/python-nightly.yml @@ -55,8 +55,7 @@ jobs: uses: "actions/checkout@v3" - name: "Install ${{ matrix.python-version }} with deadsnakes" - # uses: deadsnakes/action@v2.1.1 - uses: deadsnakes/action@7ab8819e223c70d2bdedd692dfcea75824e0a617 + uses: deadsnakes/action@e3117c2981fd8afe4af79f3e1be80066c82b70f5 if: "!startsWith(matrix.python-version, 'pypy-')" with: python-version: "${{ matrix.python-version }}" From 05cc4758dc429858cbbb68ad3b9041a9795042da Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 6 Dec 2022 13:31:05 -0500 Subject: [PATCH 109/200] test: use an ubuntu that has all the deadsnakes nightlies. --- .github/workflows/python-nightly.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-nightly.yml b/.github/workflows/python-nightly.yml index 9eed8c684..f2e81e9af 100644 --- a/.github/workflows/python-nightly.yml +++ b/.github/workflows/python-nightly.yml @@ -32,7 +32,11 @@ concurrency: jobs: tests: name: "Python ${{ matrix.python-version }}" - runs-on: ubuntu-latest + # Choose a recent Ubuntu that deadsnakes still builds all the versions for. + # For example, deadsnakes doesn't provide 3.10 nightly for 22.04 (jammy) + # because jammy ships 3.10, and deadsnakes doesn't want to clobber it. + # https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly/+packages + runs-on: ubuntu-20.04 strategy: matrix: From 18681c4b4cc745e1b149f3b33ede36362c9296e8 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 6 Dec 2022 14:33:17 -0500 Subject: [PATCH 110/200] build: this link could be useful in the future --- .github/workflows/python-nightly.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-nightly.yml b/.github/workflows/python-nightly.yml index f2e81e9af..88b2b3897 100644 --- a/.github/workflows/python-nightly.yml +++ b/.github/workflows/python-nightly.yml @@ -36,6 +36,7 @@ jobs: # For example, deadsnakes doesn't provide 3.10 nightly for 22.04 (jammy) # because jammy ships 3.10, and deadsnakes doesn't want to clobber it. # https://launchpad.net/~deadsnakes/+archive/ubuntu/nightly/+packages + # https://github.com/deadsnakes/issues/issues/234 runs-on: ubuntu-20.04 strategy: From 7e0e072f47c57371a5ac33c76da9dab32747d3ee Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 7 Dec 2022 08:14:37 -0500 Subject: [PATCH 111/200] build: a target to summarize `make upgrade` --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index c4415e614..b439dd22f 100644 --- a/Makefile +++ b/Makefile @@ -97,6 +97,8 @@ upgrade: ## Update the *.pip files with the latest packages satisfying *.in $(PIP_COMPILE) -o doc/requirements.pip doc/requirements.in $(PIP_COMPILE) -o requirements/lint.pip doc/requirements.in requirements/dev.in +diff_upgrade: ## Summarize the last `make upgrade` + @git diff -U0 | grep -v '^@' | grep == | sort -k1.2,1.99 -k1.1,1.1r -u ##@ Pre-builds for prepping the code From c053b7fe0ffcf12cc21f9abfaea12ffe849b2bc4 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 7 Dec 2022 08:17:20 -0500 Subject: [PATCH 112/200] chore: make upgrade -check-manifest==0.48 \ +check-manifest==0.49 \ -cibuildwheel==2.11.2 \ +cibuildwheel==2.11.3 \ -filelock==3.8.0 \ +filelock==3.8.2 \ -hypothesis==6.59.0 \ +hypothesis==6.60.0 \ -importlib-resources==5.10.0 \ +importlib-resources==5.10.1 \ -platformdirs==2.5.4 \ +platformdirs==2.6.0 \ -pylint==2.15.7 \ +pylint==2.15.8 \ -virtualenv==20.17.0 \ +virtualenv==20.17.1 \ --- requirements/dev.pip | 36 ++++++++++++++++++------------------ requirements/kit.pip | 18 +++++++++--------- requirements/lint.pip | 36 ++++++++++++++++++------------------ requirements/pip.pip | 18 +++++++++--------- requirements/pytest.pip | 6 +++--- requirements/tox.pip | 24 ++++++++++++------------ 6 files changed, 69 insertions(+), 69 deletions(-) diff --git a/requirements/dev.pip b/requirements/dev.pip index aa5cf096e..375a2cdd1 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -37,9 +37,9 @@ charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f # via requests -check-manifest==0.48 \ - --hash=sha256:3b575f1dade7beb3078ef4bf33a94519834457c7281dbc726b15c5466b55c657 \ - --hash=sha256:b1923685f98c1c2468601a1a7bed655db549a25d43c583caded3860ad8308f8c +check-manifest==0.49 \ + --hash=sha256:058cd30057714c39b96ce4d83f254fc770e3145c7b1932b5940b4e3efb5521ef \ + --hash=sha256:64a640445542cf226919657c7b78d02d9c1ca5b1c25d7e66e0e1ff325060f416 # via -r requirements/dev.in cogapp==3.3.0 \ --hash=sha256:1be95183f70282422d594fa42426be6923070a4bd8335621f6347f3aeee81db0 \ @@ -86,9 +86,9 @@ execnet==1.9.0 \ # via # -r requirements/pytest.pip # pytest-xdist -filelock==3.8.0 \ - --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ - --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 +filelock==3.8.2 \ + --hash=sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2 \ + --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via # -r requirements/pip.pip # tox @@ -164,9 +164,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.59.0 \ - --hash=sha256:4eb2875097a07553a1006cb2b96fab21682e4359b138b2ae3c5f5d8b3f5a8bf1 \ - --hash=sha256:af05e24b123c9413b8752bbf822105dbb112f56456fb240723d7f410eebf78bb +hypothesis==6.60.0 \ + --hash=sha256:39c06cd49f491204380d7c7aa45389d3fb84ee80ea1e3f10afc744044aceb751 \ + --hash=sha256:3e8a1e061a6bfa3d8c282dafec100f2c8c527ea50b6560e9a33adf0e2e5fef8f # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -265,9 +265,9 @@ pkginfo==1.9.2 \ --hash=sha256:ac03e37e4d601aaee40f8087f63fc4a2a6c9814dda2c8fa6aab1b1829653bdfa \ --hash=sha256:d580059503f2f4549ad6e4c106d7437356dbd430e2c7df99ee1efe03d75f691e # via twine -platformdirs==2.5.4 \ - --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ - --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 +platformdirs==2.6.0 \ + --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ + --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via # -r requirements/pip.pip # pylint @@ -296,9 +296,9 @@ pygments==2.13.0 \ # pudb # readme-renderer # rich -pylint==2.15.7 \ - --hash=sha256:1d561d1d3e8be9dd880edc685162fbdaa0409c88b9b7400873c0cf345602e326 \ - --hash=sha256:91e4776dbcb4b4d921a3e4b6fec669551107ba11f29d9199154a01622e460a57 +pylint==2.15.8 \ + --hash=sha256:ea82cd6a1e11062dc86d555d07c021b0fb65afe39becbe6fe692efd6c4a67443 \ + --hash=sha256:ec4a87c33da054ab86a6c79afa6771dc8765cb5631620053e727fcf3ef8cbed7 # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -434,9 +434,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.17.0 \ - --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ - --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 +virtualenv==20.17.1 \ + --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ + --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 # via # -r requirements/pip.pip # tox diff --git a/requirements/kit.pip b/requirements/kit.pip index c96ea8d19..674e218f8 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -24,17 +24,17 @@ certifi==2022.9.24 \ --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 # via cibuildwheel -cibuildwheel==2.11.2 \ - --hash=sha256:392a39c7022da9ac016362b727c3ae39b304742adfcc36dab7ab0a47b90cc461 \ - --hash=sha256:e8dab8e6cf77ff0002f65873bba36b3969b23f522cc014538abcda2cbd24329f +cibuildwheel==2.11.3 \ + --hash=sha256:88adad6b83c8dbc29523f790b6a12e81db56cf997c29ff5b57ec3f6fa98710c6 \ + --hash=sha256:bed12201632936db4bd3ac865730e6ebf0480b887b25bfa2c8f7e3485f7ee1df # via -r requirements/kit.in colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via -r requirements/kit.in -filelock==3.8.0 \ - --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ - --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 +filelock==3.8.2 \ + --hash=sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2 \ + --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via cibuildwheel importlib-metadata==5.1.0 \ --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ @@ -53,9 +53,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -platformdirs==2.5.4 \ - --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ - --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 +platformdirs==2.6.0 \ + --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ + --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via cibuildwheel pyelftools==0.29 \ --hash=sha256:519f38cf412f073b2d7393aa4682b0190fa901f7c3fa0bff2b82d537690c7fc1 \ diff --git a/requirements/lint.pip b/requirements/lint.pip index e2a7c0e8d..b4d666220 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -45,9 +45,9 @@ charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f # via requests -check-manifest==0.48 \ - --hash=sha256:3b575f1dade7beb3078ef4bf33a94519834457c7281dbc726b15c5466b55c657 \ - --hash=sha256:b1923685f98c1c2468601a1a7bed655db549a25d43c583caded3860ad8308f8c +check-manifest==0.49 \ + --hash=sha256:058cd30057714c39b96ce4d83f254fc770e3145c7b1932b5940b4e3efb5521ef \ + --hash=sha256:64a640445542cf226919657c7b78d02d9c1ca5b1c25d7e66e0e1ff325060f416 # via -r requirements/dev.in cogapp==3.3.0 \ --hash=sha256:1be95183f70282422d594fa42426be6923070a4bd8335621f6347f3aeee81db0 \ @@ -101,9 +101,9 @@ execnet==1.9.0 \ # via # -r requirements/pytest.pip # pytest-xdist -filelock==3.8.0 \ - --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ - --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 +filelock==3.8.2 \ + --hash=sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2 \ + --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via # -r requirements/pip.pip # tox @@ -179,9 +179,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.59.0 \ - --hash=sha256:4eb2875097a07553a1006cb2b96fab21682e4359b138b2ae3c5f5d8b3f5a8bf1 \ - --hash=sha256:af05e24b123c9413b8752bbf822105dbb112f56456fb240723d7f410eebf78bb +hypothesis==6.60.0 \ + --hash=sha256:39c06cd49f491204380d7c7aa45389d3fb84ee80ea1e3f10afc744044aceb751 \ + --hash=sha256:3e8a1e061a6bfa3d8c282dafec100f2c8c527ea50b6560e9a33adf0e2e5fef8f # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -336,9 +336,9 @@ pkginfo==1.9.2 \ --hash=sha256:ac03e37e4d601aaee40f8087f63fc4a2a6c9814dda2c8fa6aab1b1829653bdfa \ --hash=sha256:d580059503f2f4549ad6e4c106d7437356dbd430e2c7df99ee1efe03d75f691e # via twine -platformdirs==2.5.4 \ - --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ - --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 +platformdirs==2.6.0 \ + --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ + --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via # -r requirements/pip.pip # pylint @@ -376,9 +376,9 @@ pygments==2.13.0 \ # readme-renderer # rich # sphinx -pylint==2.15.7 \ - --hash=sha256:1d561d1d3e8be9dd880edc685162fbdaa0409c88b9b7400873c0cf345602e326 \ - --hash=sha256:91e4776dbcb4b4d921a3e4b6fec669551107ba11f29d9199154a01622e460a57 +pylint==2.15.8 \ + --hash=sha256:ea82cd6a1e11062dc86d555d07c021b0fb65afe39becbe6fe692efd6c4a67443 \ + --hash=sha256:ec4a87c33da054ab86a6c79afa6771dc8765cb5631620053e727fcf3ef8cbed7 # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -586,9 +586,9 @@ urwid==2.1.2 \ urwid-readline==0.13 \ --hash=sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4 # via pudb -virtualenv==20.17.0 \ - --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ - --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 +virtualenv==20.17.1 \ + --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ + --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 # via # -r requirements/pip.pip # tox diff --git a/requirements/pip.pip b/requirements/pip.pip index a3e3a7c1f..102b296d5 100644 --- a/requirements/pip.pip +++ b/requirements/pip.pip @@ -8,25 +8,25 @@ distlib==0.3.6 \ --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e # via virtualenv -filelock==3.8.0 \ - --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ - --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 +filelock==3.8.2 \ + --hash=sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2 \ + --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via virtualenv importlib-metadata==5.1.0 \ --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ --hash=sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313 # via virtualenv -platformdirs==2.5.4 \ - --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ - --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 +platformdirs==2.6.0 \ + --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ + --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via virtualenv typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.17.0 \ - --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ - --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 +virtualenv==20.17.1 \ + --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ + --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 # via -r requirements/pip.in zipp==3.11.0 \ --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ diff --git a/requirements/pytest.pip b/requirements/pytest.pip index c1943e433..fba0a2cca 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -39,9 +39,9 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.59.0 \ - --hash=sha256:4eb2875097a07553a1006cb2b96fab21682e4359b138b2ae3c5f5d8b3f5a8bf1 \ - --hash=sha256:af05e24b123c9413b8752bbf822105dbb112f56456fb240723d7f410eebf78bb +hypothesis==6.60.0 \ + --hash=sha256:39c06cd49f491204380d7c7aa45389d3fb84ee80ea1e3f10afc744044aceb751 \ + --hash=sha256:3e8a1e061a6bfa3d8c282dafec100f2c8c527ea50b6560e9a33adf0e2e5fef8f # via -r requirements/pytest.in importlib-metadata==5.1.0 \ --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ diff --git a/requirements/tox.pip b/requirements/tox.pip index 55cd7aefe..032fc8e2b 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -12,9 +12,9 @@ distlib==0.3.6 \ --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e # via virtualenv -filelock==3.8.0 \ - --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ - --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 +filelock==3.8.2 \ + --hash=sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2 \ + --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via # tox # virtualenv @@ -25,17 +25,17 @@ importlib-metadata==5.1.0 \ # pluggy # tox # virtualenv -importlib-resources==5.10.0 \ - --hash=sha256:c01b1b94210d9849f286b86bb51bcea7cd56dde0600d8db721d7b81330711668 \ - --hash=sha256:ee17ec648f85480d523596ce49eae8ead87d5631ae1551f913c0100b5edd3437 +importlib-resources==5.10.1 \ + --hash=sha256:32bb095bda29741f6ef0e5278c42df98d135391bee5f932841efc0041f748dc3 \ + --hash=sha256:c09b067d82e72c66f4f8eb12332f5efbebc9b007c0b6c40818108c9870adc363 # via tox-gh-actions packaging==21.3 \ --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 # via tox -platformdirs==2.5.4 \ - --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ - --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 +platformdirs==2.6.0 \ + --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ + --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via virtualenv pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ @@ -71,9 +71,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via importlib-metadata -virtualenv==20.17.0 \ - --hash=sha256:40a7e06a98728fd5769e1af6fd1a706005b4bb7e16176a272ed4292473180389 \ - --hash=sha256:7d6a8d55b2f73b617f684ee40fd85740f062e1f2e379412cb1879c7136f05902 +virtualenv==20.17.1 \ + --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ + --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 # via tox zipp==3.11.0 \ --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ From 3cd0bc624437710b7bc95938c161c50cc6f8f9c3 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 7 Dec 2022 18:08:02 -0500 Subject: [PATCH 113/200] test: this was wrong? --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 4a410aa7c..cf2631f96 100644 --- a/tox.ini +++ b/tox.ini @@ -100,4 +100,4 @@ python = 3.10: py310 3.11: py311 3.12: py312 - pypy-3: pypy3 + pypy3: pypy3 From 84749fdf2ba5f0434576ddd9b478c02308230d3c Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 7 Dec 2022 19:15:08 -0500 Subject: [PATCH 114/200] build: use tox.pip to ensure all tox pins are the same --- requirements/dev.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.in b/requirements/dev.in index 44c2c39f3..c9bf8bcad 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -8,7 +8,7 @@ -r pip.pip # PyPI requirements for running tests. -tox +-r tox.pip -r pytest.pip # for linting. From 5feb4518748f55a3a2c5caaec231ea52d9fb8929 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 7 Dec 2022 19:25:10 -0500 Subject: [PATCH 115/200] chore: make upgrade --- doc/requirements.pip | 16 ++++++-------- requirements/dev.pip | 44 +++++++++++++++++++++++++++++--------- requirements/kit.pip | 16 ++++++-------- requirements/lint.pip | 41 +++++++++++++++++++++++++++-------- requirements/pip-tools.pip | 10 +++------ requirements/pytest.pip | 10 ++++----- requirements/tox.pip | 26 ++++++++++++---------- 7 files changed, 100 insertions(+), 63 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index 5c03e49b8..fa37d653f 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -12,9 +12,9 @@ babel==2.11.0 \ --hash=sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe \ --hash=sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6 # via sphinx -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via requests charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ @@ -97,9 +97,9 @@ markupsafe==2.1.1 \ --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 # via jinja2 -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 # via sphinx pyenchant==3.2.2 \ --hash=sha256:1cf830c6614362a78aab78d50eaf7c6c93831369c52e1bb64ffae1df0341e637 \ @@ -113,10 +113,6 @@ pygments==2.13.0 \ --hash=sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1 \ --hash=sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42 # via sphinx -pyparsing==3.0.9 \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via packaging pytz==2022.6 \ --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ --hash=sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2 diff --git a/requirements/dev.pip b/requirements/dev.pip index 375a2cdd1..33a43e32b 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -29,9 +29,9 @@ build==0.9.0 \ --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via check-manifest -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via requests charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ @@ -48,7 +48,9 @@ cogapp==3.3.0 \ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - # via -r requirements/pytest.pip + # via + # -r requirements/pytest.pip + # -r requirements/tox.pip commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 @@ -68,6 +70,7 @@ distlib==0.3.6 \ --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e # via # -r requirements/pip.pip + # -r requirements/tox.pip # virtualenv docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ @@ -91,6 +94,7 @@ filelock==3.8.2 \ --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via # -r requirements/pip.pip + # -r requirements/tox.pip # tox # virtualenv flaky==3.7.0 \ @@ -186,6 +190,12 @@ importlib-metadata==5.1.0 \ # tox # twine # virtualenv +importlib-resources==5.10.1 \ + --hash=sha256:32bb095bda29741f6ef0e5278c42df98d135391bee5f932841efc0041f748dc3 \ + --hash=sha256:c09b067d82e72c66f4f8eb12332f5efbebc9b007c0b6c40818108c9870adc363 + # via + # -r requirements/tox.pip + # tox-gh-actions iniconfig==1.1.1 \ --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32 @@ -244,11 +254,12 @@ more-itertools==9.0.0 \ --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # build # pudb # pytest @@ -270,6 +281,7 @@ platformdirs==2.6.0 \ --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via # -r requirements/pip.pip + # -r requirements/tox.pip # pylint # virtualenv pluggy==1.0.0 \ @@ -277,6 +289,7 @@ pluggy==1.0.0 \ --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # pytest # tox pudb==2022.1.3 \ @@ -285,7 +298,9 @@ pudb==2022.1.3 \ py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 - # via tox + # via + # -r requirements/tox.pip + # tox pycontracts @ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e574d20d86000880919c3.zip \ --hash=sha256:2b889cbfb03b43dc811b5879248ac5c7e209ece78f03be9633de76a6b21a5a89 # via -r requirements/pytest.pip @@ -305,7 +320,6 @@ pyparsing==3.0.9 \ --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc # via # -r requirements/pytest.pip - # packaging # pycontracts pytest==7.2.0 \ --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ @@ -352,6 +366,7 @@ six==1.16.0 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # bleach # pycontracts # tox @@ -366,6 +381,7 @@ tomli==2.0.1 \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via # -r requirements/pytest.pip + # -r requirements/tox.pip # build # check-manifest # pep517 @@ -379,7 +395,13 @@ tomlkit==0.11.6 \ tox==3.27.1 \ --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 - # via -r requirements/dev.in + # via + # -r requirements/tox.pip + # tox-gh-actions +tox-gh-actions==2.11.0 \ + --hash=sha256:07779eedc7ba4a1749f9fad23fdc7e4760a9663c4a80c9e1adffc54858917f60 \ + --hash=sha256:1aff5a36549c383adf133f4d1432c2f5206c7665f7756d6397704aa4c8880c6b + # via -r requirements/tox.pip twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 @@ -439,6 +461,7 @@ virtualenv==20.17.1 \ --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 # via # -r requirements/pip.pip + # -r requirements/tox.pip # tox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ @@ -517,6 +540,7 @@ zipp==3.11.0 \ # -r requirements/pip.pip # -r requirements/pytest.pip # importlib-metadata + # importlib-resources # pep517 # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/kit.pip b/requirements/kit.pip index 674e218f8..e93f6892e 100644 --- a/requirements/kit.pip +++ b/requirements/kit.pip @@ -20,9 +20,9 @@ build==0.9.0 \ --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via -r requirements/kit.in -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via cibuildwheel cibuildwheel==2.11.3 \ --hash=sha256:88adad6b83c8dbc29523f790b6a12e81db56cf997c29ff5b57ec3f6fa98710c6 \ @@ -43,9 +43,9 @@ importlib-metadata==5.1.0 \ # auditwheel # build # pep517 -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 # via # build # cibuildwheel @@ -61,10 +61,6 @@ pyelftools==0.29 \ --hash=sha256:519f38cf412f073b2d7393aa4682b0190fa901f7c3fa0bff2b82d537690c7fc1 \ --hash=sha256:ec761596aafa16e282a31de188737e5485552469ac63b60cfcccf22263fd24ff # via auditwheel -pyparsing==3.0.9 \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via packaging tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f diff --git a/requirements/lint.pip b/requirements/lint.pip index b4d666220..3e5f2ef3e 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -37,9 +37,9 @@ build==0.9.0 \ --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 # via check-manifest -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via requests charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ @@ -60,6 +60,7 @@ colorama==0.4.6 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # sphinx-autobuild commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ @@ -80,6 +81,7 @@ distlib==0.3.6 \ --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e # via # -r requirements/pip.pip + # -r requirements/tox.pip # virtualenv docutils==0.17.1 \ --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ @@ -106,6 +108,7 @@ filelock==3.8.2 \ --hash=sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c # via # -r requirements/pip.pip + # -r requirements/tox.pip # tox # virtualenv flaky==3.7.0 \ @@ -207,6 +210,12 @@ importlib-metadata==5.1.0 \ # tox # twine # virtualenv +importlib-resources==5.10.1 \ + --hash=sha256:32bb095bda29741f6ef0e5278c42df98d135391bee5f932841efc0041f748dc3 \ + --hash=sha256:c09b067d82e72c66f4f8eb12332f5efbebc9b007c0b6c40818108c9870adc363 + # via + # -r requirements/tox.pip + # tox-gh-actions iniconfig==1.1.1 \ --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32 @@ -314,11 +323,12 @@ more-itertools==9.0.0 \ --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # build # pudb # pytest @@ -341,6 +351,7 @@ platformdirs==2.6.0 \ --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e # via # -r requirements/pip.pip + # -r requirements/tox.pip # pylint # virtualenv pluggy==1.0.0 \ @@ -348,6 +359,7 @@ pluggy==1.0.0 \ --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # pytest # tox pudb==2022.1.3 \ @@ -356,7 +368,9 @@ pudb==2022.1.3 \ py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 - # via tox + # via + # -r requirements/tox.pip + # tox pycontracts @ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e574d20d86000880919c3.zip \ --hash=sha256:2b889cbfb03b43dc811b5879248ac5c7e209ece78f03be9633de76a6b21a5a89 # via -r requirements/pytest.pip @@ -385,7 +399,6 @@ pyparsing==3.0.9 \ --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc # via # -r requirements/pytest.pip - # packaging # pycontracts pytest==7.2.0 \ --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ @@ -437,6 +450,7 @@ six==1.16.0 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via # -r requirements/pytest.pip + # -r requirements/tox.pip # bleach # livereload # pycontracts @@ -505,6 +519,7 @@ tomli==2.0.1 \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via # -r requirements/pytest.pip + # -r requirements/tox.pip # build # check-manifest # pep517 @@ -531,7 +546,13 @@ tornado==6.2 \ tox==3.27.1 \ --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 - # via -r requirements/dev.in + # via + # -r requirements/tox.pip + # tox-gh-actions +tox-gh-actions==2.11.0 \ + --hash=sha256:07779eedc7ba4a1749f9fad23fdc7e4760a9663c4a80c9e1adffc54858917f60 \ + --hash=sha256:1aff5a36549c383adf133f4d1432c2f5206c7665f7756d6397704aa4c8880c6b + # via -r requirements/tox.pip twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 @@ -591,6 +612,7 @@ virtualenv==20.17.1 \ --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 # via # -r requirements/pip.pip + # -r requirements/tox.pip # tox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ @@ -669,6 +691,7 @@ zipp==3.11.0 \ # -r requirements/pip.pip # -r requirements/pytest.pip # importlib-metadata + # importlib-resources # pep517 # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 746fd431c..46fab8a9b 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -19,9 +19,9 @@ importlib-metadata==5.1.0 \ # build # click # pep517 -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 # via build pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ @@ -31,10 +31,6 @@ pip-tools==6.11.0 \ --hash=sha256:64a6b66887c270705a9006a10023eb4c893e9bf66c306bdcb4440541b367c057 \ --hash=sha256:90c5dc150e3856e4463b81ccc99307ccf9554e5db8393eb273705cb0b8f71c60 # via -r requirements/pip-tools.in -pyparsing==3.0.9 \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via packaging tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f diff --git a/requirements/pytest.pip b/requirements/pytest.pip index fba0a2cca..2a58659e6 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -53,9 +53,9 @@ iniconfig==1.1.1 \ --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \ --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32 # via pytest -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 # via pytest pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ @@ -67,9 +67,7 @@ pycontracts @ https://github.com/slorg1/contracts/archive/c5a6da27d4dc9985f68e57 pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via - # packaging - # pycontracts + # via pycontracts pytest==7.2.0 \ --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 diff --git a/requirements/tox.pip b/requirements/tox.pip index 032fc8e2b..4d58dbe44 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -29,14 +29,18 @@ importlib-resources==5.10.1 \ --hash=sha256:32bb095bda29741f6ef0e5278c42df98d135391bee5f932841efc0041f748dc3 \ --hash=sha256:c09b067d82e72c66f4f8eb12332f5efbebc9b007c0b6c40818108c9870adc363 # via tox-gh-actions -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 - # via tox +packaging==22.0 \ + --hash=sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3 \ + --hash=sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3 + # via + # pyproject-api + # tox platformdirs==2.6.0 \ --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e - # via virtualenv + # via + # tox + # virtualenv pluggy==1.0.0 \ --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 @@ -45,10 +49,6 @@ py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 # via tox -pyparsing==3.0.9 \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc - # via packaging six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -56,7 +56,9 @@ six==1.16.0 \ tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - # via tox + # via + # pyproject-api + # tox tox==3.27.1 \ --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 @@ -70,7 +72,9 @@ tox-gh-actions==2.11.0 \ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e - # via importlib-metadata + # via + # importlib-metadata + # tox virtualenv==20.17.1 \ --hash=sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4 \ --hash=sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058 From d20c1d0329b585920cf8b1a36af5d2d9c4bba155 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 11 Dec 2022 18:23:51 -0500 Subject: [PATCH 116/200] docs: #1024 was also fixed --- CHANGES.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index bc2ace7f4..2afa3bf35 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -88,7 +88,7 @@ update your settings. require ``__init__.py``. A new setting ``[report] include_namespace_packages`` tells coverage.py to consider these directories during reporting. Thanks to `Felix Horvat `_ for the - contribution. Closes `issue 1383`_. + contribution. Closes `issue 1383`_ and `issue 1024`_. - Fixed environment variable expansion in pyproject.toml files. It was overly broad, causing errors outside of coverage.py settings, as described in `issue @@ -116,6 +116,7 @@ update your settings. .. _issue 713: https://github.com/nedbat/coveragepy/issues/713 .. _issue 757: https://github.com/nedbat/coveragepy/issues/757 .. _issue 991: https://github.com/nedbat/coveragepy/issues/991 +.. _issue 1024: https://github.com/nedbat/coveragepy/issues/1024 .. _issue 1212: https://github.com/nedbat/coveragepy/issues/1212 .. _issue 1280: https://github.com/nedbat/coveragepy/issues/1280 .. _issue 1345: https://github.com/nedbat/coveragepy/issues/1345 From be5f556a2fef3921b9173d3ccf1b3f3220c795ec Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 18 Dec 2022 10:20:39 -0500 Subject: [PATCH 117/200] chore: make upgrade --- doc/requirements.pip | 6 +++--- requirements/dev.pip | 30 ++++++++++++++-------------- requirements/light-threads.pip | 6 +++--- requirements/lint.pip | 36 +++++++++++++++++----------------- requirements/pip-tools.pip | 6 +++--- requirements/pytest.pip | 6 +++--- requirements/tox.pip | 12 ++++++------ 7 files changed, 51 insertions(+), 51 deletions(-) diff --git a/doc/requirements.pip b/doc/requirements.pip index fa37d653f..e775df6f2 100644 --- a/doc/requirements.pip +++ b/doc/requirements.pip @@ -113,9 +113,9 @@ pygments==2.13.0 \ --hash=sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1 \ --hash=sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42 # via sphinx -pytz==2022.6 \ - --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ - --hash=sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2 +pytz==2022.7 \ + --hash=sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a \ + --hash=sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd # via babel requests==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ diff --git a/requirements/dev.pip b/requirements/dev.pip index 33a43e32b..7443cc8ea 100644 --- a/requirements/dev.pip +++ b/requirements/dev.pip @@ -168,9 +168,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.60.0 \ - --hash=sha256:39c06cd49f491204380d7c7aa45389d3fb84ee80ea1e3f10afc744044aceb751 \ - --hash=sha256:3e8a1e061a6bfa3d8c282dafec100f2c8c527ea50b6560e9a33adf0e2e5fef8f +hypothesis==6.61.0 \ + --hash=sha256:7bb22d22e35db99d5724bbf5bdc686b46add94a0f228bf1be249c47ec46b9c7f \ + --hash=sha256:fbf7da30aea839d88898f74bcc027f0f997060498a8a7605880688c8a2166215 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -202,9 +202,9 @@ iniconfig==1.1.1 \ # via # -r requirements/pytest.pip # pytest -isort==5.10.1 \ - --hash=sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7 \ - --hash=sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951 +isort==5.11.3 \ + --hash=sha256:83155ffa936239d986b0f190347a3f2285f42a9b9e1725c89d865b27dd0627e5 \ + --hash=sha256:a8ca25fbfad0f7d5d8447a4314837298d9f6b23aed8618584c894574f626b64b # via pylint jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ @@ -311,9 +311,9 @@ pygments==2.13.0 \ # pudb # readme-renderer # rich -pylint==2.15.8 \ - --hash=sha256:ea82cd6a1e11062dc86d555d07c021b0fb65afe39becbe6fe692efd6c4a67443 \ - --hash=sha256:ec4a87c33da054ab86a6c79afa6771dc8765cb5631620053e727fcf3ef8cbed7 +pylint==2.15.9 \ + --hash=sha256:18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4 \ + --hash=sha256:349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -392,15 +392,15 @@ tomlkit==0.11.6 \ --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via pylint -tox==3.27.1 \ - --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ - --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 +tox==3.28.0 \ + --hash=sha256:57b5ab7e8bb3074edc3c0c0b4b192a4f3799d3723b2c5b76f1fa9f2d40316eea \ + --hash=sha256:d0d28f3fe6d6d7195c27f8b054c3e99d5451952b54abdae673b71609a581f640 # via # -r requirements/tox.pip # tox-gh-actions -tox-gh-actions==2.11.0 \ - --hash=sha256:07779eedc7ba4a1749f9fad23fdc7e4760a9663c4a80c9e1adffc54858917f60 \ - --hash=sha256:1aff5a36549c383adf133f4d1432c2f5206c7665f7756d6397704aa4c8880c6b +tox-gh-actions==2.12.0 \ + --hash=sha256:5214db422a3297854db14fe814d59bd95674b7c577793bf406e7832dabeca03d \ + --hash=sha256:7a8aa62cd616b0e74c7db204bc44bbd603574f468f00c4ba3a2a3c87de8cf514 # via -r requirements/tox.pip twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ diff --git a/requirements/light-threads.pip b/requirements/light-threads.pip index 9245dbc47..b5fb97d03 100644 --- a/requirements/light-threads.pip +++ b/requirements/light-threads.pip @@ -205,9 +205,9 @@ six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via eventlet -zope-event==4.5.0 \ - --hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \ - --hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330 +zope-event==4.6 \ + --hash=sha256:73d9e3ef750cca14816a9c322c7250b0d7c9dbc337df5d1b807ff8d3d0b9e97c \ + --hash=sha256:81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80 # via gevent zope-interface==5.5.2 \ --hash=sha256:008b0b65c05993bb08912f644d140530e775cf1c62a072bf9340c2249e613c32 \ diff --git a/requirements/lint.pip b/requirements/lint.pip index 3e5f2ef3e..134c894c9 100644 --- a/requirements/lint.pip +++ b/requirements/lint.pip @@ -182,9 +182,9 @@ greenlet==2.0.1 \ --hash=sha256:f6327b6907b4cb72f650a5b7b1be23a2aab395017aa6f1adb13069d66360eb3f \ --hash=sha256:fb412b7db83fe56847df9c47b6fe3f13911b06339c2aa02dcc09dce8bbf582cd # via -r requirements/dev.in -hypothesis==6.60.0 \ - --hash=sha256:39c06cd49f491204380d7c7aa45389d3fb84ee80ea1e3f10afc744044aceb751 \ - --hash=sha256:3e8a1e061a6bfa3d8c282dafec100f2c8c527ea50b6560e9a33adf0e2e5fef8f +hypothesis==6.61.0 \ + --hash=sha256:7bb22d22e35db99d5724bbf5bdc686b46add94a0f228bf1be249c47ec46b9c7f \ + --hash=sha256:fbf7da30aea839d88898f74bcc027f0f997060498a8a7605880688c8a2166215 # via -r requirements/pytest.pip idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -222,9 +222,9 @@ iniconfig==1.1.1 \ # via # -r requirements/pytest.pip # pytest -isort==5.10.1 \ - --hash=sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7 \ - --hash=sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951 +isort==5.11.3 \ + --hash=sha256:83155ffa936239d986b0f190347a3f2285f42a9b9e1725c89d865b27dd0627e5 \ + --hash=sha256:a8ca25fbfad0f7d5d8447a4314837298d9f6b23aed8618584c894574f626b64b # via pylint jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ @@ -390,9 +390,9 @@ pygments==2.13.0 \ # readme-renderer # rich # sphinx -pylint==2.15.8 \ - --hash=sha256:ea82cd6a1e11062dc86d555d07c021b0fb65afe39becbe6fe692efd6c4a67443 \ - --hash=sha256:ec4a87c33da054ab86a6c79afa6771dc8765cb5631620053e727fcf3ef8cbed7 +pylint==2.15.9 \ + --hash=sha256:18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4 \ + --hash=sha256:349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb # via -r requirements/dev.in pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -410,9 +410,9 @@ pytest-xdist==3.1.0 \ --hash=sha256:40fdb8f3544921c5dfcd486ac080ce22870e71d82ced6d2e78fa97c2addd480c \ --hash=sha256:70a76f191d8a1d2d6be69fc440cdf85f3e4c03c08b520fd5dc5d338d6cf07d89 # via -r requirements/pytest.pip -pytz==2022.6 \ - --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ - --hash=sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2 +pytz==2022.7 \ + --hash=sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a \ + --hash=sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd # via babel qualname==0.1.0 \ --hash=sha256:277cf6aa4b2ad36beed1153cfa7bf521b210d54fbecb3d8eea0c5679cecc9ed8 @@ -543,15 +543,15 @@ tornado==6.2 \ --hash=sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e \ --hash=sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b # via livereload -tox==3.27.1 \ - --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ - --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 +tox==3.28.0 \ + --hash=sha256:57b5ab7e8bb3074edc3c0c0b4b192a4f3799d3723b2c5b76f1fa9f2d40316eea \ + --hash=sha256:d0d28f3fe6d6d7195c27f8b054c3e99d5451952b54abdae673b71609a581f640 # via # -r requirements/tox.pip # tox-gh-actions -tox-gh-actions==2.11.0 \ - --hash=sha256:07779eedc7ba4a1749f9fad23fdc7e4760a9663c4a80c9e1adffc54858917f60 \ - --hash=sha256:1aff5a36549c383adf133f4d1432c2f5206c7665f7756d6397704aa4c8880c6b +tox-gh-actions==2.12.0 \ + --hash=sha256:5214db422a3297854db14fe814d59bd95674b7c577793bf406e7832dabeca03d \ + --hash=sha256:7a8aa62cd616b0e74c7db204bc44bbd603574f468f00c4ba3a2a3c87de8cf514 # via -r requirements/tox.pip twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ diff --git a/requirements/pip-tools.pip b/requirements/pip-tools.pip index 46fab8a9b..6c2e7951b 100644 --- a/requirements/pip-tools.pip +++ b/requirements/pip-tools.pip @@ -27,9 +27,9 @@ pep517==0.13.0 \ --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 # via build -pip-tools==6.11.0 \ - --hash=sha256:64a6b66887c270705a9006a10023eb4c893e9bf66c306bdcb4440541b367c057 \ - --hash=sha256:90c5dc150e3856e4463b81ccc99307ccf9554e5db8393eb273705cb0b8f71c60 +pip-tools==6.12.1 \ + --hash=sha256:88efb7b29a923ffeac0713e6f23ef8529cc6175527d42b93f73756cc94387293 \ + --hash=sha256:f0c0c0ec57b58250afce458e2e6058b1f30a4263db895b7d72fd6311bf1dc6f7 # via -r requirements/pip-tools.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ diff --git a/requirements/pytest.pip b/requirements/pytest.pip index 2a58659e6..42678c7f6 100644 --- a/requirements/pytest.pip +++ b/requirements/pytest.pip @@ -39,9 +39,9 @@ flaky==3.7.0 \ future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via pycontracts -hypothesis==6.60.0 \ - --hash=sha256:39c06cd49f491204380d7c7aa45389d3fb84ee80ea1e3f10afc744044aceb751 \ - --hash=sha256:3e8a1e061a6bfa3d8c282dafec100f2c8c527ea50b6560e9a33adf0e2e5fef8f +hypothesis==6.61.0 \ + --hash=sha256:7bb22d22e35db99d5724bbf5bdc686b46add94a0f228bf1be249c47ec46b9c7f \ + --hash=sha256:fbf7da30aea839d88898f74bcc027f0f997060498a8a7605880688c8a2166215 # via -r requirements/pytest.in importlib-metadata==5.1.0 \ --hash=sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b \ diff --git a/requirements/tox.pip b/requirements/tox.pip index 4d58dbe44..0f70196ff 100644 --- a/requirements/tox.pip +++ b/requirements/tox.pip @@ -59,15 +59,15 @@ tomli==2.0.1 \ # via # pyproject-api # tox -tox==3.27.1 \ - --hash=sha256:b2a920e35a668cc06942ffd1cf3a4fb221a4d909ca72191fb6d84b0b18a7be04 \ - --hash=sha256:f52ca66eae115fcfef0e77ef81fd107133d295c97c52df337adedb8dfac6ab84 +tox==3.28.0 \ + --hash=sha256:57b5ab7e8bb3074edc3c0c0b4b192a4f3799d3723b2c5b76f1fa9f2d40316eea \ + --hash=sha256:d0d28f3fe6d6d7195c27f8b054c3e99d5451952b54abdae673b71609a581f640 # via # -r requirements/tox.in # tox-gh-actions -tox-gh-actions==2.11.0 \ - --hash=sha256:07779eedc7ba4a1749f9fad23fdc7e4760a9663c4a80c9e1adffc54858917f60 \ - --hash=sha256:1aff5a36549c383adf133f4d1432c2f5206c7665f7756d6397704aa4c8880c6b +tox-gh-actions==2.12.0 \ + --hash=sha256:5214db422a3297854db14fe814d59bd95674b7c577793bf406e7832dabeca03d \ + --hash=sha256:7a8aa62cd616b0e74c7db204bc44bbd603574f468f00c4ba3a2a3c87de8cf514 # via -r requirements/tox.in typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ From 52b5680543d5da45b1bb0356d7538724acebd237 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 18 Dec 2022 15:27:17 -0500 Subject: [PATCH 118/200] docs: prep for 7.0.0 --- CHANGES.rst | 6 ++++-- README.rst | 2 +- coverage/version.py | 4 ++-- doc/conf.py | 4 ++-- doc/index.rst | 2 +- howto.txt | 1 + 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2afa3bf35..b2bcca081 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,8 +17,10 @@ development at the same time, such as 4.5.x and 5.0. .. Version 9.8.1 — 2027-07-27 .. -------------------------- -Unreleased ----------- +.. _changes_7-0-0: + +Version 7.0.0 — 2022-12-18 +-------------------------- Nothing yet. diff --git a/README.rst b/README.rst index a5d11aa82..8a99b01a9 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.0a2 +* CPython 3.7 through 3.12.0a3 * PyPy3 7.3.9. Documentation is on `Read the Docs`_. Code repository and issue tracker are on diff --git a/coverage/version.py b/coverage/version.py index 5546d03d6..11b27d3bd 100644 --- a/coverage/version.py +++ b/coverage/version.py @@ -6,8 +6,8 @@ # version_info: same semantics as sys.version_info. # _dev: the .devN suffix if any. -version_info = (7, 0, 0, "beta", 2) -_dev = 1 +version_info = (7, 0, 0, "final", 0) +_dev = 0 def _make_version(major, minor, micro, releaselevel="final", serial=0, dev=0): diff --git a/doc/conf.py b/doc/conf.py index 3e949059c..9947759d8 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -67,9 +67,9 @@ # The short X.Y.Z version. version = "7.0.0" # The full version, including alpha/beta/rc tags. -release = "7.0.0b1" +release = "7.0.0" # The date of release, in "monthname day, year" format. -release_date = "December 3, 2022" +release_date = "December 18, 2022" # @@@ end rst_epilog = """ diff --git a/doc/index.rst b/doc/index.rst index 8498cb892..4de746375 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,7 +18,7 @@ supported on: .. PYVERSIONS -* Python versions 3.7 through 3.12.0a2. +* Python versions 3.7 through 3.12.0a3. * PyPy3 7.3.9. .. ifconfig:: prerelease diff --git a/howto.txt b/howto.txt index 07a85619f..aded722fc 100644 --- a/howto.txt +++ b/howto.txt @@ -6,6 +6,7 @@ version_info = (4, 0, 2, "beta", 1) version_info = (4, 0, 2, "candidate", 1) version_info = (4, 0, 2, "final", 0) + - make sure: _dev = 0 - Supported Python version numbers. Search for "PYVERSIONS". - Update source files with release facts: $ make edit_for_release From df3f2bf0dacded1406e2008394925fbb90f54ce5 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 18 Dec 2022 15:31:12 -0500 Subject: [PATCH 119/200] docs: latest sample HTML report --- doc/sample_html/d_7b071bdc2a35fa80___init___py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80___main___py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80_backward_py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80_cogapp_py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80_makefiles_py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80_test_cogapp_py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80_test_makefiles_py.html | 8 ++++---- .../d_7b071bdc2a35fa80_test_whiteutils_py.html | 8 ++++---- doc/sample_html/d_7b071bdc2a35fa80_whiteutils_py.html | 8 ++++---- doc/sample_html/index.html | 8 ++++---- doc/sample_html/status.json | 2 +- 11 files changed, 41 insertions(+), 41 deletions(-) diff --git a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html index 43bcb6674..2a808d40a 100644 --- a/doc/sample_html/d_7b071bdc2a35fa80___init___py.html +++ b/doc/sample_html/d_7b071bdc2a35fa80___init___py.html @@ -66,8 +66,8 @@

^ index     » next       - coverage.py v6.5.0, - created at 2022-09-29 12:29 -0400 + coverage.py v7.0.0, + created at 2022-12-18 15:30 -0500