From 4504e73ee115abf72b79732a2cd9871ca4151caa Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Sun, 8 Dec 2024 20:49:55 +0100 Subject: [PATCH 01/21] chore: remove click echo from check.py --- pipenv/routines/check.py | 86 +++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/pipenv/routines/check.py b/pipenv/routines/check.py index c6da10b1e..24f597c80 100644 --- a/pipenv/routines/check.py +++ b/pipenv/routines/check.py @@ -9,10 +9,11 @@ from pipenv import pep508checker from pipenv.patched.safety.cli import cli +from pipenv.utils import console, err from pipenv.utils.processes import run_command from pipenv.utils.project import ensure_project from pipenv.utils.shell import project_python -from pipenv.vendor import click, plette +from pipenv.vendor import plette def build_safety_options( @@ -58,9 +59,8 @@ def run_pep508_check(project, system, python): try: return json.loads(c.stdout.strip()) except json.JSONDecodeError: - click.echo( + err.print( f"Failed parsing pep508 results:\n{c.stdout.strip()}\n{c.stderr.strip()}", - err=True, ) sys.exit(1) return {} @@ -75,21 +75,16 @@ def check_pep508_requirements(project, results, quiet): if marker in results: if results[marker] != specifier: failed = True - click.echo( - "Specifier {} does not match {} ({})." - "".format( - click.style(marker, fg="green"), - click.style(specifier, fg="cyan"), - click.style(results[marker], fg="yellow"), - ), - err=True, + err.print( + f"Specifier [green]{marker}[/green]does not match " + f"[cyan]{specifier}[/cyan] [yellow]({marker}[/yello])." ) if failed: - click.secho("Failed!", fg="red", err=True) + err.print("[red]Failed![/red]") sys.exit(1) elif not quiet and not project.s.is_quiet(): - click.secho("Passed!", fg="green") + console.print("Passed!", fg="green") def get_requirements(project, use_installed, categories): @@ -143,37 +138,32 @@ def parse_safety_output(output, quiet): meta = json_report.get("report_meta", {}) vulnerabilities_found = meta.get("vulnerabilities_found", 0) db_type = "commercial" if meta.get("api_key", False) else "free" - + style = "red" if vulnerabilities_found else "green" if quiet: - click.secho( - f"{vulnerabilities_found} vulnerabilities found.", - fg="red" if vulnerabilities_found else "green", + console.print( + f"[{style}]{vulnerabilities_found} vulnerabilities found[/{style}]." ) else: - fg = "red" if vulnerabilities_found else "green" message = f"Scan complete using Safety's {db_type} vulnerability database." - click.echo() - click.secho(f"{vulnerabilities_found} vulnerabilities found.", fg=fg) - click.echo() - + console.print( + f"[{style}]{vulnerabilities_found} vulnerabilities found[/{style}]." + ) for vuln in json_report.get("vulnerabilities", []): - click.echo( - "{}: {} {} open to vulnerability {} ({}). More info: {}".format( - click.style(vuln["vulnerability_id"], bold=True, fg="red"), - click.style(vuln["package_name"], fg="green"), - click.style(vuln["analyzed_version"], fg="yellow", bold=True), - click.style(vuln["vulnerability_id"], bold=True), - click.style(vuln["vulnerable_spec"], fg="yellow", bold=False), - click.style(vuln["more_info_url"], bold=True), - ) + console.print( + f"\n[red]{vuln['vulnerability_id']}[/red]: " + f"[green]{vuln['package_name']}[/green] " + f"[yellow]{vuln['analyzed_version']}[/yellow] " + f"open to vulnerability [red]{vuln['vulnerability_id']}[/red] " + f"([yellow]{vuln['vulnerable_spec']}[/yellow]). " + f"More info: {vuln['more_info_url']}" + f"{vuln['advisory']}" + f"\n" ) - click.echo(f"{vuln['advisory']}") - click.echo() - click.secho(message, fg="white", bold=True) + console.print(f"[bold][white]{message}[/white][/bold]") except json.JSONDecodeError: - click.echo("Failed to parse Safety output.") + err.print("Failed to parse Safety output.") def do_check( @@ -208,7 +198,7 @@ def do_check( ) if not quiet and not project.s.is_quiet(): - click.secho("Checking PEP 508 requirements...", bold=True) + console.print("[bold]Checking PEP 508 requirements...[/bold]") results = run_pep508_check(project, system, python) check_pep508_requirements(project, results, quiet) @@ -218,25 +208,23 @@ def do_check( if not quiet and not project.s.is_quiet(): if use_installed: - click.secho( - "Checking installed packages for vulnerabilities...", - bold=True, + console.print( + "[bold]Checking installed packages for vulnerabilities...[/bold]", ) else: - click.secho( - "Checking Pipfile.lock packages for vulnerabilities...", - bold=True, + console.print( + "[bold]Checking Pipfile.lock packages for vulnerabilities...", + "[/bold]", ) if ignore: ignore = [ignore] if not isinstance(ignore, (tuple, list)) else ignore if not quiet and not project.s.is_quiet(): - click.echo( - "Notice: Ignoring Vulnerabilit{} {}".format( - "ies" if len(ignore) > 1 else "y", - click.style(", ".join(ignore), fg="yellow"), - ), - err=True, + suffix = "ies" if len(ignore) > 1 else "y" + err.print( + "[yellow]" + f"Notice: Ignoring Vulnerabilit{suffix} {', '.join(ignore)}" + "[/yellow]" ) requirements = get_requirements(project, use_installed, categories) @@ -259,7 +247,7 @@ def do_check( if db: if not quiet and not project.s.is_quiet(): - click.echo(f"Using {db} database") + console.print(f"Using {db} database") cmd.append(f"--db={db}") elif key or project.s.PIPENV_PYUP_API_KEY: cmd.append(f"--key={key or project.s.PIPENV_PYUP_API_KEY}") From badd27dab1f9c2061d5631f1e22f705df3074661 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Sun, 8 Dec 2024 20:52:47 +0100 Subject: [PATCH 02/21] chore: remove click echo from clean --- pipenv/routines/clean.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pipenv/routines/clean.py b/pipenv/routines/clean.py index 5c64b0094..45d063c8f 100644 --- a/pipenv/routines/clean.py +++ b/pipenv/routines/clean.py @@ -7,7 +7,6 @@ from pipenv.utils.project import ensure_project from pipenv.utils.requirements import BAD_PACKAGES from pipenv.utils.shell import project_python -from pipenv.vendor import click def do_clean( @@ -30,7 +29,7 @@ def do_clean( for bad_package in BAD_PACKAGES: if canonicalize_name(bad_package) in installed_package_names: if project.s.is_verbose(): - click.echo(f"Ignoring {bad_package}.", err=True) + err.print(f"Ignoring {bad_package}.", err=True) installed_package_names.remove(canonicalize_name(bad_package)) # Intelligently detect if --dev should be used or not. locked_packages = { @@ -42,7 +41,7 @@ def do_clean( failure = False for apparent_bad_package in installed_package_names: if dry_run and not bare: - click.echo(apparent_bad_package) + console.print(apparent_bad_package) else: if not bare: console.print( From 3867ded57c18907107507e85c0b62afe6b314e34 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Sun, 8 Dec 2024 20:54:31 +0100 Subject: [PATCH 03/21] chore: remove click echo from clear.py Signed-off-by: Oz Tiram --- pipenv/routines/clear.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipenv/routines/clear.py b/pipenv/routines/clear.py index acc421e97..cd97da92b 100644 --- a/pipenv/routines/clear.py +++ b/pipenv/routines/clear.py @@ -1,14 +1,14 @@ import shutil from pipenv import environments +from pipenv.utils import console from pipenv.utils.funktools import handle_remove_readonly -from pipenv.vendor import click def do_clear(project): from pipenv.patched.pip._internal import locations - click.secho("Clearing caches...", bold=True) + console.print("[bold]Clearing caches...[/bold]") try: shutil.rmtree(project.s.PIPENV_CACHE_DIR, onerror=handle_remove_readonly) # Other processes may be writing into this directory simultaneously. From 2a2a89df5e02d8ccd64e3090386002f7f053d330 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Sun, 8 Dec 2024 20:56:10 +0100 Subject: [PATCH 04/21] fix: replace echo method with print Signed-off-by: Oz Tiram --- pipenv/routines/graph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipenv/routines/graph.py b/pipenv/routines/graph.py index 4657b587f..6f291813f 100644 --- a/pipenv/routines/graph.py +++ b/pipenv/routines/graph.py @@ -45,7 +45,7 @@ def do_graph(project, bare=False, json=False, json_tree=False, reverse=False): cmd_args.append("--reverse") if not project.virtualenv_exists: - err.echo( + err.print( "[bold][red]Warning: No virtualenv has been created for this project yet! Consider " "running `pipenv install` first to automatically generate one for you or see " "`pipenv install --help` for further instructions.[/red][/bold]", From 613d26669c538e38afcd0e1ede73c99af99d19d5 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Sun, 8 Dec 2024 20:57:40 +0100 Subject: [PATCH 05/21] chore: replace wording echo with write Signed-off-by: Oz Tiram --- pipenv/routines/install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipenv/routines/install.py b/pipenv/routines/install.py index 27d42c06d..6dee6cb17 100644 --- a/pipenv/routines/install.py +++ b/pipenv/routines/install.py @@ -664,7 +664,7 @@ def _cleanup_procs(project, procs): # The Installation failed... if failed: # The Installation failed... - # We echo both c.stdout and c.stderr because pip returns error details on out. + # We write both c.stdout and c.stderr because pip returns error details on out. err = err.strip().splitlines() if err else [] out = out.strip().splitlines() if out else [] err_lines = [line for message in [out, err] for line in message] From fb6826e11b8f1cf3e888744b221fb518dc20cb43 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Mon, 9 Dec 2024 22:41:05 +0100 Subject: [PATCH 06/21] chore: remove click.echo from pipenv/utils/project.py Signed-off-by: Oz Tiram --- pipenv/utils/project.py | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/pipenv/utils/project.py b/pipenv/utils/project.py index b6e58119f..9bec20a98 100644 --- a/pipenv/utils/project.py +++ b/pipenv/utils/project.py @@ -5,11 +5,11 @@ from pipenv import exceptions from pipenv.patched.pip._vendor.packaging.version import parse as parse_version from pipenv.patched.pip._vendor.typing_extensions import TYPE_CHECKING +from pipenv.utils import err from pipenv.utils.dependencies import python_version from pipenv.utils.pipfile import ensure_pipfile from pipenv.utils.shell import shorten_path from pipenv.utils.virtualenv import ensure_virtualenv -from pipenv.vendor import click if TYPE_CHECKING: from pipenv.patched.pip._vendor.typing_extensions import STRING_TYPE @@ -57,32 +57,18 @@ def ensure_project( if path_to_python and project.required_python_version not in ( python_version(path_to_python) or "" ): - click.echo( - "{}: Your Pipfile requires {} {}, " - "but you are using {} ({}).".format( - click.style("Warning", fg="red", bold=True), - click.style("python_version", bold=True), - click.style(project.required_python_version, fg="cyan"), - click.style( - python_version(path_to_python) or "unknown", fg="cyan" - ), - click.style(shorten_path(path_to_python), fg="green"), - ), - err=True, + err.print( + f"[red][bold]Warning[/bold][/red]: Your Pipfile requires" + f"[bold]{python_version}[/bold] [cyan]{python.required_python_version}[/cyan]," + f"but you are using [cyan]{python_version(path_to_python)}[/cyan]" + f"from [green]{shorten_path(path_to_python)}[/green]." ) - click.echo( - " {} and rebuilding the virtual environment " - "may resolve the issue.".format( - click.style("$ pipenv --rm", fg="green") - ), - err=True, + err.print( + "[green]$ pipenv --rm[/green] and rebuilding the virtual environment " + "may resolve the issue." ) if not deploy: - click.echo( - " {} will surely fail." - "".format(click.style("$ pipenv check", fg="yellow")), - err=True, - ) + err.print("[yellow]$ pipenv check[/yellow] will surely fail.") else: raise exceptions.DeployException # Ensure the Pipfile exists. From e7f65da7fcea0dad03bb855ca1b4b2b7819dbf94 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Mon, 9 Dec 2024 22:47:24 +0100 Subject: [PATCH 07/21] chore: remove click.echo from pipenv/routines/lock.py Signed-off-by: Oz Tiram --- pipenv/routines/lock.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/pipenv/routines/lock.py b/pipenv/routines/lock.py index b29a73bbf..68a52265e 100644 --- a/pipenv/routines/lock.py +++ b/pipenv/routines/lock.py @@ -1,9 +1,9 @@ import contextlib +from pipenv.utils import err from pipenv.utils.dependencies import ( get_pipfile_category_using_lockfile_section, ) -from pipenv.vendor import click def do_lock( @@ -48,14 +48,7 @@ def do_lock( if write: if not quiet: # Alert the user of progress. - click.echo( - "{} {} {}".format( - click.style("Locking"), - click.style(f"[{pipfile_category}]", fg="yellow"), - click.style("dependencies..."), - ), - err=True, - ) + err.print(f"Locking [yellow]{pipfile_category}[/yellow] dependencies...") # Prune old lockfile category as new one will be created. with contextlib.suppress(KeyError): @@ -91,14 +84,8 @@ def do_lock( lockfile.update({"_meta": project.get_lockfile_meta()}) project.write_lockfile(lockfile) if not quiet: - click.echo( - "{}".format( - click.style( - f"Updated Pipfile.lock ({project.get_lockfile_hash()})!", - bold=True, - ) - ), - err=True, + err.print( + f"[bold]Updated Pipfile.lock ({project.get_lockfile_hash()})![/bold]", ) else: return lockfile From 09fea2d4375a19bebd00662cc5f254cafd98d592 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Mon, 9 Dec 2024 22:56:59 +0100 Subject: [PATCH 08/21] chore: remove click from pipenv/utils/processes.py Signed-off-by: Oz Tiram --- pipenv/utils/processes.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pipenv/utils/processes.py b/pipenv/utils/processes.py index 9c0ea8376..aaf7326e1 100644 --- a/pipenv/utils/processes.py +++ b/pipenv/utils/processes.py @@ -2,8 +2,8 @@ import subprocess from pipenv.exceptions import PipenvCmdError +from pipenv.utils import console, err from pipenv.utils.constants import MYPY_RUNNING -from pipenv.vendor import click if MYPY_RUNNING: from typing import Tuple # noqa @@ -33,13 +33,10 @@ def run_command(cmd, *args, is_verbose=False, **kwargs): kwargs["env"]["PYTHONIOENCODING"] = "UTF-8" command = [cmd.command, *cmd.args] if is_verbose: - click.echo(f"Running command: $ {cmd.cmdify()}") + console.print(f"Running command: $ {cmd.cmdify()}") c = subprocess_run(command, *args, **kwargs) if is_verbose: - click.echo( - "Command output: {}".format(click.style(c.stdout, fg="cyan")), - err=True, - ) + err.print(f"[cyan]Command output: {c.stdout}[/cyan]") if c.returncode and catch_exceptions: raise PipenvCmdError(cmd.cmdify(), c.stdout, c.stderr, c.returncode) return c From 8b1c8e0594565f0e5527a389a91d36d03ab0f921 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Tue, 10 Dec 2024 22:13:21 +0100 Subject: [PATCH 09/21] chore: remove click.echo from pipenv/utils/environment.py Signed-off-by: Oz Tiram --- pipenv/utils/environment.py | 40 +++++++++++++------------------------ 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/pipenv/utils/environment.py b/pipenv/utils/environment.py index 89bba8eab..4b3e8a85a 100644 --- a/pipenv/utils/environment.py +++ b/pipenv/utils/environment.py @@ -1,7 +1,8 @@ import os from pipenv import environments -from pipenv.vendor import click, dotenv +from pipenv.utils import err +from pipenv.vendor import dotenv def load_dot_env(project, as_dict=False, quiet=False): @@ -14,41 +15,28 @@ def load_dot_env(project, as_dict=False, quiet=False): ) if not os.path.isfile(dotenv_file) and project.s.PIPENV_DOTENV_LOCATION: - click.echo( - "{}: file {}={} does not exist!!\n{}".format( - click.style("Warning", fg="red", bold=True), - click.style("PIPENV_DOTENV_LOCATION", bold=True), - click.style(project.s.PIPENV_DOTENV_LOCATION, bold=True), - click.style( - "Not loading environment variables.", fg="red", bold=True - ), - ), - err=True, + err.print( + f"[bold][red]WARNING[/red]:" + f"file PIPENV_DOTENV_LOCATION={project.s.PIPENV_DOTENV_LOCATION}" + "does not exist!" + "[red]Not loading environment variables.[/red][/bold]" ) if as_dict: return dotenv.dotenv_values(dotenv_file) elif os.path.isfile(dotenv_file): if not quiet: - click.secho( - "Loading .env environment variables...", - bold=True, - err=True, - ) - dotenv.load_dotenv(dotenv_file, override=True) + err.print("[bold]Loading .env environment variables...[/bold]") + dotenv.load_dotenv(dotenv_file, override=True) project.s = environments.Setting() def ensure_environment(): # Skip this on Windows... if os.name != "nt" and "LANG" not in os.environ: - click.echo( - "{}: the environment variable {} is not set!" - "\nWe recommend setting this in {} (or equivalent) for " - "proper expected behavior.".format( - click.style("Warning", fg="red", bold=True), - click.style("LANG", bold=True), - click.style("~/.profile", fg="green"), - ), - err=True, + err.print( + "[red]Warning[/red]: the environment variable [bold]LANG[/bold]" + "is not set!\nWe recommend setting this in" + "[green]~/.profile[/green] (or equivalent) for " + "proper expected behavior." ) From d17fe2a01fbd67207d8fda2e36b2c93c439ad6f8 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Tue, 10 Dec 2024 22:56:59 +0100 Subject: [PATCH 10/21] chore: remove click.echo from pipenv/routines/requirements.py Signed-off-by: Oz Tiram --- pipenv/routines/requirements.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipenv/routines/requirements.py b/pipenv/routines/requirements.py index e25c8d0ad..0b97c044a 100644 --- a/pipenv/routines/requirements.py +++ b/pipenv/routines/requirements.py @@ -1,9 +1,9 @@ import re import sys +from pipenv.utils import console from pipenv.utils.dependencies import get_lockfile_section_using_pipfile_category from pipenv.utils.requirements import requirements_from_lockfile -from pipenv.vendor import click def generate_requirements( @@ -20,7 +20,7 @@ def generate_requirements( for i, package_index in enumerate(lockfile["_meta"]["sources"]): prefix = "-i" if i == 0 else "--extra-index-url" - click.echo(" ".join([prefix, package_index["url"]])) + console.print(" ".join([prefix, package_index["url"]])) deps = {} categories_list = re.split(r", *| ", categories) if categories else [] @@ -59,6 +59,6 @@ def generate_requirements( ) for line in pip_installable_lines: - click.echo(line) + console.print(line) sys.exit(0) From efc1b797682ed3f55e3f6b550183324097329413 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Tue, 10 Dec 2024 23:28:06 +0100 Subject: [PATCH 11/21] chore: bump pypi-server version to 2.3.2 This version supports modern python versions Signed-off-by: Oz Tiram --- Pipfile | 4 +- Pipfile.lock | 951 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 587 insertions(+), 368 deletions(-) diff --git a/Pipfile b/Pipfile index f5155f8e6..9900fa512 100644 --- a/Pipfile +++ b/Pipfile @@ -28,10 +28,10 @@ pyyaml = "==6.0.1" build = "*" twine = "*" semver = "*" -pypiserver = {ref = "pipenv-313", git = "https://github.com/matteius/pypiserver.git"} - +pypiserver = "2.3.2" [packages] pytz = "*" +pipenv = {file = "."} [scripts] tests = "bash ./run-tests.sh" diff --git a/Pipfile.lock b/Pipfile.lock index 8b14e8926..16d461753 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2ec5439e5085c244b5ba09d4b14499978736d6631395ebbceb4ee026c1aa4223" + "sha256": "78fd75c2acb4c4752b555194ac30e0d4c114e648133fe57990fdd58138ded117" }, "pipfile-spec": 6, "requires": {}, @@ -14,6 +14,49 @@ ] }, "default": { + "certifi": { + "hashes": [ + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.8.30" + }, + "distlib": { + "hashes": [ + "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", + "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403" + ], + "version": "==0.3.9" + }, + "filelock": { + "hashes": [ + "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", + "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435" + ], + "markers": "python_version >= '3.8'", + "version": "==3.16.1" + }, + "packaging": { + "hashes": [ + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + ], + "markers": "python_version >= '3.8'", + "version": "==24.2" + }, + "pipenv": { + "file": ".", + "markers": "python_version >= '3.8'" + }, + "platformdirs": { + "hashes": [ + "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", + "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb" + ], + "markers": "python_version >= '3.8'", + "version": "==4.3.6" + }, "pytz": { "hashes": [ "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", @@ -21,6 +64,22 @@ ], "index": "pypi", "version": "==2024.2" + }, + "setuptools": { + "hashes": [ + "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", + "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" + ], + "markers": "python_version >= '3.9'", + "version": "==75.6.0" + }, + "virtualenv": { + "hashes": [ + "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0", + "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa" + ], + "markers": "python_version >= '3.8'", + "version": "==20.28.0" } }, "develop": { @@ -43,6 +102,7 @@ "hashes": [ "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11" ], + "markers": "sys_platform == 'win32'", "version": "==1.4.1" }, "attrs": { @@ -61,59 +121,50 @@ "markers": "python_version >= '3.8'", "version": "==2.16.0" }, - "backports.tarfile": { - "hashes": [ - "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", - "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991" - ], - "markers": "python_version < '3.12'", - "version": "==1.2.0" - }, "beautifulsoup4": { "hashes": [ "sha256:7e05ad0b6c26108d9990e2235e8a9b4e2c03ead6f391ceb60347f8ebea6b80ba", "sha256:c684ddec071aa120819889aa9e8940f85c3f3cdaa08e23b9fa26510387897bd5" ], + "markers": "python_full_version >= '3.6.0'", "version": "==4.13.0b2" }, "black": { "hashes": [ - "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", - "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", - "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", - "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", - "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", - "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", - "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", - "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", - "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", - "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", - "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", - "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", - "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", - "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", - "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", - "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", - "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", - "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", - "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", - "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", - "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", - "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", - "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", - "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", - "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3" - ], - "version": "==23.3.0" + "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f", + "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93", + "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11", + "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0", + "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9", + "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5", + "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213", + "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d", + "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7", + "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837", + "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f", + "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395", + "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995", + "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", + "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597", + "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959", + "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5", + "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb", + "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4", + "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7", + "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd", + "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" + ], + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "build": { "hashes": [ - "sha256:119b2fb462adef986483438377a13b2f42064a2a3a4161f24a0cca698a07ac8c", - "sha256:277ccc71619d98afdd841a0e96ac9fe1593b823af481d3b0cea748e8894e0613" + "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5", + "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.2.2" + "version": "==1.2.2.post1" }, "certifi": { "hashes": [ @@ -123,6 +174,79 @@ "markers": "python_version >= '3.6'", "version": "==2024.8.30" }, + "cffi": { + "hashes": [ + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" + ], + "markers": "python_version >= '3.8'", + "version": "==1.17.1" + }, "cfgv": { "hashes": [ "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", @@ -133,99 +257,114 @@ }, "charset-normalizer": { "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", + "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", + "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", + "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", + "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", + "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", + "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", + "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", + "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", + "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", + "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", + "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", + "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", + "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", + "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", + "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", + "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", + "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", + "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", + "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", + "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", + "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", + "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", + "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", + "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", + "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", + "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", + "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", + "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", + "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", + "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", + "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", + "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", + "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", + "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", + "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", + "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", + "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", + "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", + "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", + "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", + "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", + "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", + "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", + "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", + "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", + "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", + "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", + "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", + "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", + "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", + "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", + "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", + "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", + "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", + "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", + "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", + "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", + "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", + "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", + "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", + "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", + "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", + "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", + "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", + "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", + "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", + "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", + "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", + "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", + "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", + "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", + "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", + "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", + "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", + "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", + "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", + "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", + "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", + "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", + "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", + "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", + "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", + "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", + "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", + "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", + "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", + "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", + "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", + "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", + "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" + "version": "==3.4.0" }, "click": { "hashes": [ @@ -241,7 +380,7 @@ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6' and sys_platform == 'win32'", + "markers": "sys_platform == 'win32'", "version": "==0.4.6" }, "coverage": { @@ -249,88 +388,113 @@ "toml" ], "hashes": [ - "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", - "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", - "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", - "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", - "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", - "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", - "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", - "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", - "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", - "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", - "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", - "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", - "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", - "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", - "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", - "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", - "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", - "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", - "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", - "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", - "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", - "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", - "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", - "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", - "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", - "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", - "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", - "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", - "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", - "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", - "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", - "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", - "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", - "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", - "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", - "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", - "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", - "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", - "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", - "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", - "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", - "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", - "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", - "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", - "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", - "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", - "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", - "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", - "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", - "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", - "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", - "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", - "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", - "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", - "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", - "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", - "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", - "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", - "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", - "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", - "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", - "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", - "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", - "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", - "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", - "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", - "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", - "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", - "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", - "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", - "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", - "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], - "markers": "python_version >= '3.8'", - "version": "==7.6.1" + "markers": "python_version >= '3.9'", + "version": "==7.6.9" + }, + "cryptography": { + "hashes": [ + "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", + "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731", + "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", + "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", + "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", + "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385", + "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", + "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", + "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", + "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", + "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", + "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", + "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", + "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba", + "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", + "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", + "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", + "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", + "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", + "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", + "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", + "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", + "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", + "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", + "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", + "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", + "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", + "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", + "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4" + ], + "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", + "version": "==44.0.0" }, "distlib": { "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" + "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", + "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403" ], - "version": "==0.3.8" + "version": "==0.3.9" }, "docutils": { "hashes": [ @@ -370,6 +534,7 @@ "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==3.9.2" }, "flaky": { @@ -377,6 +542,7 @@ "sha256:194ccf4f0d3a22b2de7130f4b62e45e977ac1b5ccad74d4d48f3005dcc38815e", "sha256:47204a81ec905f3d5acfbd61daeabcada8f9d4031616d9bcb0618461729699f5" ], + "markers": "python_version >= '3.5'", "version": "==3.8.1" }, "gunicorn": { @@ -384,16 +550,16 @@ "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], - "markers": "python_version >= '3.7' and sys_platform == 'linux'", + "markers": "sys_platform == 'linux'", "version": "==23.0.0" }, "identify": { "hashes": [ - "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0", - "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98" + "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02", + "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd" ], - "markers": "python_version >= '3.8'", - "version": "==2.6.1" + "markers": "python_version >= '3.9'", + "version": "==2.6.3" }, "idna": { "hashes": [ @@ -420,14 +586,6 @@ "markers": "python_version >= '3.8'", "version": "==8.5.0" }, - "importlib-resources": { - "hashes": [ - "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065", - "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717" - ], - "markers": "python_version > '3.8' and python_version < '3.12'", - "version": "==6.4.5" - }, "iniconfig": { "hashes": [ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", @@ -463,11 +621,19 @@ }, "jaraco.functools": { "hashes": [ - "sha256:3460c74cd0d32bf82b9576bbb3527c4364d5b27a21f5158a62aed6c4b42e23f5", - "sha256:c9d16a3ed4ccb5a889ad8e0b7a343401ee5b2a71cee6ed192d3f68bc351e94e3" + "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", + "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649" ], "markers": "python_version >= '3.8'", - "version": "==4.0.2" + "version": "==4.1.0" + }, + "jeepney": { + "hashes": [ + "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", + "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" + ], + "markers": "python_version >= '3.7'", + "version": "==0.8.0" }, "jinja2": { "hashes": [ @@ -479,17 +645,18 @@ }, "keyring": { "hashes": [ - "sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", - "sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b" + "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6", + "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741" ], "markers": "python_version >= '3.8'", - "version": "==25.4.1" + "version": "==25.5.0" }, "linkify-it-py": { "hashes": [ "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79" ], + "markers": "python_version >= '3.7'", "version": "==2.0.3" }, "markdown-it-py": { @@ -502,69 +669,70 @@ }, "markupsafe": { "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.2" }, "mccabe": { "hashes": [ @@ -594,6 +762,7 @@ "sha256:18c694e5ae8a208cdb3d2c20a993ca1a7b0efa258c247a1e565150f477f83744", "sha256:5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d" ], + "markers": "python_version >= '3.6'", "version": "==5.1.0" }, "more-itertools": { @@ -625,24 +794,32 @@ }, "nh3": { "hashes": [ - "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", - "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", - "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", - "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", - "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", - "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", - "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", - "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", - "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f", - "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", - "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", - "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", - "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be", - "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50", - "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", - "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe" - ], - "version": "==0.2.18" + "sha256:00810cd5275f5c3f44b9eb0e521d1a841ee2f8023622de39ffc7d88bd533d8e0", + "sha256:0b6820fc64f2ff7ef3e7253a093c946a87865c877b3889149a6d21d322ed8dbd", + "sha256:11270b16c1b012677e3e2dd166c1aa273388776bf99a3e3677179db5097ee16a", + "sha256:2b926f179eb4bce72b651bfdf76f8aa05d167b2b72bc2f3657fd319f40232adc", + "sha256:2eb021804e9df1761abeb844bb86648d77aa118a663c82f50ea04110d87ed707", + "sha256:3805161c4e12088bd74752ba69630e915bc30fe666034f47217a2f16b16efc37", + "sha256:5d4f5e2189861b352b73acb803b5f4bb409c2f36275d22717e27d4e0c217ae55", + "sha256:75c7cafb840f24430b009f7368945cb5ca88b2b54bb384ebfba495f16bc9c121", + "sha256:790056b54c068ff8dceb443eaefb696b84beff58cca6c07afd754d17692a4804", + "sha256:7e98621856b0a911c21faa5eef8f8ea3e691526c2433f9afc2be713cb6fbdb48", + "sha256:833b3b5f1783ce95834a13030300cea00cbdfd64ea29260d01af9c4821da0aa9", + "sha256:a7b928862daddb29805a1010a0282f77f4b8b238a37b5f76bc6c0d16d930fd22", + "sha256:ac536a4b5c073fdadd8f5f4889adabe1cbdae55305366fb870723c96ca7f49c3", + "sha256:b8eb7affc590e542fa7981ef508cd1644f62176bcd10d4429890fc629b47f0bc", + "sha256:c2e3f0d18cc101132fe10ab7ef5c4f41411297e639e23b64b5e888ccaad63f41", + "sha256:d0adf00e2b2026fa10a42537b60d161e516f206781c7515e4e97e09f72a8c5d0", + "sha256:d53a4577b6123ca1d7e8483fad3e13cb7eda28913d516bd0a648c1a473aa21a9", + "sha256:d8325d51e47cb5b11f649d55e626d56c76041ba508cd59e0cb1cf687cc7612f1", + "sha256:df8eac98fec80bd6f5fd0ae27a65de14f1e1a65a76d8e2237eb695f9cd1121d9", + "sha256:e3dedd7858a21312f7675841529941035a2ac91057db13402c8fe907aa19205a", + "sha256:ec9c8bf86e397cb88c560361f60fdce478b5edb8b93f04ead419b72fbe937ea6", + "sha256:ed06ed78f6b69d57463b46a04f68f270605301e69d80756a8adf7519002de57d", + "sha256:fc483dd8d20f8f8c010783a25a84db3bebeadced92d24d34b40d687f8043ac69", + "sha256:fdb20740d24ab9f2a1341458a00a11205294e97e905de060eeab1ceca020c09c" + ], + "version": "==0.2.19" }, "nodeenv": { "hashes": [ @@ -654,11 +831,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "parse": { "hashes": [ @@ -673,6 +850,7 @@ "sha256:2281b187276c8e8e3c15634f62287b2fb6fe0efe3010f739a6bd1e45fa2bf2b2", "sha256:b9fde1e6bb9ce9f07e08e9c4bea8d8825c5e78e18a0052d02e02bf9517eb4777" ], + "markers": "python_version >= '3.8'", "version": "==0.5" }, "pathspec": { @@ -685,28 +863,23 @@ }, "pip": { "hashes": [ - "sha256:2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2", - "sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8" + "sha256:3790624780082365f47549d032f3770eeb2b1e8bd1f7b2e02dace1afa361b4ed", + "sha256:ebcb60557f2aefabc2e0f918751cd24ea0d56d8ec5445fe1807f1d2109660b99" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==24.3.1" }, "pipenv": { - "editable": true, - "extras": [ - "dev", - "tests" - ], - "markers": "python_version >= '3.8'", - "path": "." + "file": ".", + "markers": "python_version >= '3.8'" }, "pkginfo": { "hashes": [ - "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097" + "sha256:8ad91a0445a036782b9366ef8b8c2c50291f83a553478ba8580c73d3215700cf", + "sha256:dcd589c9be4da8973eceffa247733c144812759aa67eaf4bbf97016a02f39088" ], - "markers": "python_version >= '3.6'", - "version": "==1.10.0" + "markers": "python_version >= '3.8'", + "version": "==1.12.0" }, "platformdirs": { "hashes": [ @@ -741,6 +914,14 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.7.0" }, + "pycparser": { + "hashes": [ + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + ], + "markers": "python_version >= '3.8'", + "version": "==2.22" + }, "pyenchant": { "hashes": [ "sha256:0314d162b7af83adc500f5aff850c91466129363ca8c4d79a8b8d99253346204", @@ -768,25 +949,29 @@ "version": "==2.18.0" }, "pypiserver": { - "git": "https://github.com/matteius/pypiserver.git", + "hashes": [ + "sha256:67c30d2a1a2cea1c4cf6785ddfbce958dc8ee7978e56a54b5f4ebc0c5cb89079", + "sha256:d2b16b12a667a9f356f1b022e039d5ad2c33a76986bb2fdb3f18633dbb1afca3" + ], + "index": "pypi", "markers": "python_version >= '3.6'", - "ref": "02f1ef9383f6e91d51a0f011c34a5df4816897a0" + "version": "==2.3.2" }, "pyproject-hooks": { "hashes": [ - "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965", - "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2" + "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", + "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" ], "markers": "python_version >= '3.7'", - "version": "==1.1.0" + "version": "==1.2.0" }, "pytest": { "hashes": [ - "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", - "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2" + "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", + "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761" ], "markers": "python_version >= '3.8'", - "version": "==8.3.3" + "version": "==8.3.4" }, "pytest-cov": { "hashes": [ @@ -802,6 +987,7 @@ "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e" ], + "markers": "python_version >= '3.7'", "version": "==2.3.1" }, "pytest-xdist": { @@ -809,16 +995,9 @@ "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" ], + "markers": "python_version >= '3.8'", "version": "==3.6.1" }, - "pywin32-ctypes": { - "hashes": [ - "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", - "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.2.3" - }, "pyyaml": { "hashes": [ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", @@ -911,11 +1090,19 @@ }, "rich": { "hashes": [ - "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06", - "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a" + "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", + "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==13.8.1" + "markers": "python_full_version >= '3.8.0'", + "version": "==13.9.4" + }, + "secretstorage": { + "hashes": [ + "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", + "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" + ], + "markers": "python_version >= '3.6'", + "version": "==3.3.3" }, "semver": { "hashes": [ @@ -928,11 +1115,11 @@ }, "setuptools": { "hashes": [ - "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2", - "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538" + "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", + "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d" ], - "markers": "python_version >= '3.8'", - "version": "==75.1.0" + "markers": "python_version >= '3.9'", + "version": "==75.6.0" }, "snowballstemmer": { "hashes": [ @@ -951,12 +1138,12 @@ }, "sphinx": { "hashes": [ - "sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b", - "sha256:56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d" + "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", + "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==8.0.2" + "version": "==8.1.3" }, "sphinx-click": { "hashes": [ @@ -1028,32 +1215,64 @@ "hashes": [ "sha256:08c22c9c03b28a140fe3ec5064b53a5288279f22e596ca06b0be698d50c93cf2" ], + "markers": "sys_platform == 'linux'", "version": "==0.10.0" }, "tomli": { "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", + "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", + "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", + "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", + "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", + "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", + "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", + "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", + "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", + "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", + "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", + "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", + "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", + "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", + "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", + "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", + "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", + "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", + "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", + "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", + "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", + "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", + "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", + "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", + "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", + "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", + "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", + "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", + "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", + "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", + "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", + "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.2.1" }, "towncrier": { "hashes": [ "sha256:013423ee7eed102b2f393c287d22d95f66f1a3ea10a4baa82d298001a7f18af3", "sha256:9343209592b839209cdf28c339ba45792fbfe9775b5f9c177462fd693e127d8d" ], + "markers": "python_version >= '3.8'", "version": "==24.8.0" }, "twine": { "hashes": [ - "sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", - "sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db" + "sha256:36158b09df5406e1c9c1fb8edb24fc2be387709443e7376689b938531582ee27", + "sha256:9c6025b203b51521d53e200f4a08b116dee7500a38591668c6a6033117bdc218" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.1.1" + "version": "==6.0.1" }, "typing-extensions": { "hashes": [ @@ -1082,19 +1301,19 @@ }, "virtualenv": { "hashes": [ - "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6", - "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4" + "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0", + "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa" ], - "markers": "python_version >= '3.7'", - "version": "==20.26.5" + "markers": "python_version >= '3.8'", + "version": "==20.28.0" }, "waitress": { "hashes": [ - "sha256:005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1", - "sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669" + "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f", + "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e" ], - "markers": "python_full_version >= '3.8.0' and sys_platform == 'win32'", - "version": "==3.0.0" + "markers": "sys_platform == 'win32'", + "version": "==3.0.2" }, "zipp": { "hashes": [ From e94084b6f793257c6e19b2cbf2b157fb74e0055d Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Tue, 10 Dec 2024 23:38:12 +0100 Subject: [PATCH 12/21] chore: remove click.echo from pipenv/routines/outdated.py Signed-off-by: Oz Tiram --- pipenv/routines/outdated.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/pipenv/routines/outdated.py b/pipenv/routines/outdated.py index 18838f8b6..180871089 100644 --- a/pipenv/routines/outdated.py +++ b/pipenv/routines/outdated.py @@ -2,6 +2,8 @@ from collections import namedtuple from collections.abc import Mapping +from pipevn.utils import console, err + from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name from pipenv.patched.pip._vendor.packaging.version import parse as parse_version from pipenv.routines.lock import do_lock @@ -11,7 +13,6 @@ get_version, pep423_name, ) -from pipenv.vendor import click def do_outdated(project, pypi_mirror=None, pre=False, clear=False): @@ -77,17 +78,15 @@ def do_outdated(project, pypi_mirror=None, pre=False, clear=False): pipfile_version_text = f" ({version} set in Pipfile)" else: pipfile_version_text = " (Unpinned in Pipfile)" - click.secho( - f"Skipped Update of Package {package!s}:" + err.print( + f"[yellow]Skipped Update of Package {package!s}:" f" {old_version!s} installed,{required!s}{pipfile_version_text!s}, " - f"{new_version!s} available.", - fg="yellow", - err=True, + f"{new_version!s} available.[/yellow]" ) for package, old_version, new_version in set(outdated).union(set(skipped)): - click.echo( + console.print( f"Package {package!r} out-of-date: {old_version!r} installed, {new_version!r} available." ) if not outdated: - click.echo(click.style("All packages are up to date!", fg="green", bold=True)) + console.print("[bold green]All packages are up to date![/bold green]") sys.exit(bool(outdated)) From ed633d8c839f8c22439dc3c06e47f37cfb9bfacc Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Tue, 10 Dec 2024 23:47:38 +0100 Subject: [PATCH 13/21] chore: pin dev dependencies These were breaking on python3.8 which is now EOL. Signed-off-by: Oz Tiram --- Pipfile | 5 +++-- Pipfile.lock | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Pipfile b/Pipfile index 9900fa512..d2ce0cb48 100644 --- a/Pipfile +++ b/Pipfile @@ -15,8 +15,8 @@ pre-commit = "==2.*" atomicwrites = {version = "*", sys_platform = "== 'win32'"} pytest-cov = "==4.*" typing-extensions = "==4.*" -waitress = {version = "*", sys_platform = "== 'win32'"} -gunicorn = {version = "*", sys_platform = "== 'linux'"} +waitress = {version = "3.*", sys_platform = "== 'win32'"} +gunicorn = {version = "23.0.*", sys_platform = "== 'linux'"} parse = "*" importlib-metadata = "*" colorama= {version = "*", sys_platform = "== 'win32'"} @@ -29,6 +29,7 @@ build = "*" twine = "*" semver = "*" pypiserver = "2.3.2" + [packages] pytz = "*" pipenv = {file = "."} diff --git a/Pipfile.lock b/Pipfile.lock index 16d461753..e50f61a9c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "78fd75c2acb4c4752b555194ac30e0d4c114e648133fe57990fdd58138ded117" + "sha256": "4a09134f28f5462cc0040e498196183b1794243ed10737637f7f0364a7d63415" }, "pipfile-spec": 6, "requires": {}, From 74f2e792772e1155104f86c43c08f5a0aeb5d2a8 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Wed, 11 Dec 2024 23:03:44 +0100 Subject: [PATCH 14/21] chore: remove click from pipenv/routines/shell.py Signed-off-by: Oz Tiram --- pipenv/routines/shell.py | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/pipenv/routines/shell.py b/pipenv/routines/shell.py index 1e8b286be..876e6a9d3 100644 --- a/pipenv/routines/shell.py +++ b/pipenv/routines/shell.py @@ -3,9 +3,9 @@ import sys from os.path import expandvars +from pipenv.utils import err from pipenv.utils.project import ensure_project from pipenv.utils.shell import cmd_list_to_shell, system_which -from pipenv.vendor import click def do_shell( @@ -27,7 +27,7 @@ def do_shell( shell = choose_shell(project) if not quiet: - click.echo("Launching subshell in virtual environment...", err=True) + err.print("Launching subshell in virtual environment...") fork_args = ( project.virtualenv_location, @@ -47,10 +47,9 @@ def do_shell( try: shell.fork_compat(*fork_args) except (AttributeError, ImportError): - click.echo( + err.print( "Compatibility mode not supported. " "Trying to continue as well-configured shell...", - err=True, ) shell.fork(*fork_args) @@ -93,9 +92,9 @@ def do_run(project, command, args, python=False, pypi_mirror=None): script = project.build_script(command, args) cmd_string = cmd_list_to_shell([script.command] + script.args) if project.s.is_verbose(): - click.echo(click.style(f"$ {cmd_string}"), err=True) + err.print(f"$ {cmd_string}") except ScriptEmptyError: - click.echo("Can't run script {0!r}-it's empty?", err=True) + err.print("Can't run script {0!r}-it's empty?") run_args = [project, script] run_kwargs = {"env": env} if os.name == "nt": @@ -111,26 +110,14 @@ def do_run_posix(project, script, command, env): command_path = system_which(script.command, path=path) if not command_path: if project.has_script(command): - click.echo( - "{}: the command {} (from {}) could not be found within {}." - "".format( - click.style("Error", fg="red", bold=True), - click.style(script.command, fg="yellow"), - click.style(command, bold=True), - click.style("PATH", bold=True), - ), - err=True, + err.print( + f"[bold red]Error[/red bold]: the command [yellow]{script.command}[/yellow]" + f"(from [bold]{command}[/bold]) could not be found within [bold]PATH[/bold]." ) else: - click.echo( - "{}: the command {} could not be found within {} or Pipfile's {}." - "".format( - click.style("Error", fg="red", bold=True), - click.style(command, fg="yellow"), - click.style("PATH", bold=True), - click.style("[scripts]", bold=True), - ), - err=True, + err.print( + f"[bold red]Error[/red bold]: the command [yellow]{command}[/yellow] could " + f"not be found within [bold]PATH[/bold] or Pipfile's [bold][scripts][/bold]." ) sys.exit(1) os.execve( From 99013e5c9b14a5dae428950bedb8c13282af265f Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Wed, 11 Dec 2024 23:46:27 +0100 Subject: [PATCH 15/21] chore: remove pipenv/routines/uninstall.py Signed-off-by: Oz Tiram --- pipenv/routines/uninstall.py | 39 ++++++++++++------------------------ 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/pipenv/routines/uninstall.py b/pipenv/routines/uninstall.py index fbb9d2e7a..9c9630e0f 100644 --- a/pipenv/routines/uninstall.py +++ b/pipenv/routines/uninstall.py @@ -16,7 +16,6 @@ from pipenv.utils.requirements import BAD_PACKAGES from pipenv.utils.resolver import venv_resolve_deps from pipenv.utils.shell import cmd_list_to_shell, project_python -from pipenv.vendor import click from pipenv.vendor.importlib_metadata.compat.py39 import normalized_name @@ -35,9 +34,9 @@ def _uninstall_from_environment(project: Project, package, system=False): "-y", ] c = run_command(cmd, is_verbose=project.s.is_verbose()) - click.secho(c.stdout, fg="cyan") + console.print("[cyan]c.stdout[/cyan]") if c.returncode != 0: - click.echo(f"Error occurred while uninstalling package {package}.") + console.print(f"Error occurred while uninstalling package {package}.") return False return True @@ -66,32 +65,20 @@ def do_uninstall( lockfile_content = project.lockfile_content if all_dev: - click.secho( - click.style( - "Un-installing all {}...".format( - click.style("[dev-packages]", fg="yellow") - ), - bold=True, - ) - ) + console.print("[bold]Un-installing all [yellow][dev-packages][yellow]...[/bold]") # Uninstall all dev-packages from environment for package in project.get_pipfile_section("dev-packages"): _uninstall_from_environment(project, package, system=system) # Remove the package from the Pipfile if project.reset_category_in_pipfile(category="dev-packages"): - click.echo("Removed [dev-packages] from Pipfile.") + console.print("Removed [dev-packages] from Pipfile.") # Finalize changes to lockfile lockfile_content["develop"] = {} lockfile_content.update({"_meta": project.get_lockfile_meta()}) project.write_lockfile(lockfile_content) if all: - click.secho( - click.style( - "Un-installing all packages...", - bold=True, - ) - ) + console.print("[bold]Un-installing all packages...[/bold]") # Uninstall all packages from all groups for category in project.get_package_categories(): if category in ["source", "requires"]: @@ -130,7 +117,7 @@ def do_uninstall( if project.remove_package_from_pipfile( normalized_name, category=pipfile_category ): - click.echo(f"Removed {normalized_name} from Pipfile.") + console.print(f"Removed {normalized_name} from Pipfile.") # Rebuild the dependencies for resolution from the updated Pipfile updated_packages = project.get_pipfile_section(pipfile_category) @@ -184,7 +171,7 @@ def do_purge(project, bare=False, downloads=False, allow_global=False): if downloads: if not bare: - click.secho("Clearing out downloads directory...", bold=True) + console.print("[bold]Clearing out downloads directory...[/bold]") shutil.rmtree(project.download_location) return @@ -199,12 +186,12 @@ def do_purge(project, bare=False, downloads=False, allow_global=False): # Skip purging if there is no packages which needs to be removed if not to_remove: if not bare: - click.echo("Found 0 installed package, skip purging.") - click.secho("Environment now purged and fresh!", fg="green") + console.print("Found 0 installed package, skip purging.") + console.print("[green]Environment now purged and fresh![/green]") return installed if not bare: - click.echo(f"Found {len(to_remove)} installed package(s), purging...") + console.print(f"Found {len(to_remove)} installed package(s), purging...") command = [ project_python(project, system=allow_global), @@ -213,13 +200,13 @@ def do_purge(project, bare=False, downloads=False, allow_global=False): "-y", ] + list(to_remove) if project.s.is_verbose(): - click.echo(f"$ {cmd_list_to_shell(command)}") + console.print(f"$ {cmd_list_to_shell(command)}") c = subprocess_run(command) if c.returncode != 0: raise exceptions.UninstallError( installed, cmd_list_to_shell(command), c.stdout + c.stderr, c.returncode ) if not bare: - click.secho(c.stdout, fg="cyan") - click.secho("Environment now purged and fresh!", fg="green") + console.print(f"[cyan]{c.stdout}[/cyan]") + console.print("[green]Environment now purged and fresh![/green]") return installed From 8d37aaf2877192a4a18925ae131508a672e69fb2 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Thu, 12 Dec 2024 19:51:52 +0100 Subject: [PATCH 16/21] chore: remove disabling of NO_COLOR on click echo rich respects the NO_COLOR environment variable. Signed-off-by: Oz Tiram --- pipenv/environments.py | 9 --------- pipenv/utils/shell.py | 8 -------- 2 files changed, 17 deletions(-) diff --git a/pipenv/environments.py b/pipenv/environments.py index e424b9e6b..f6b039a58 100644 --- a/pipenv/environments.py +++ b/pipenv/environments.py @@ -79,15 +79,6 @@ def normalize_pipfile_path(p): ) -NO_COLOR = False -if os.getenv("NO_COLOR") or os.getenv("PIPENV_COLORBLIND"): - NO_COLOR = True - from pipenv.utils.shell import style_no_color - from pipenv.vendor import click - - click.original_style = click.style - click.style = style_no_color - PIPENV_HIDE_EMOJIS = ( os.environ.get("PIPENV_HIDE_EMOJIS") is None and (os.name == "nt" or PIPENV_IS_CI) diff --git a/pipenv/utils/shell.py b/pipenv/utils/shell.py index da4811a54..28c88d79e 100644 --- a/pipenv/utils/shell.py +++ b/pipenv/utils/shell.py @@ -13,7 +13,6 @@ from pipenv.utils import err from pipenv.utils.fileutils import normalize_drive, normalize_path -from pipenv.vendor import click from pipenv.vendor.pythonfinder.utils import ensure_path, parse_python_version from .constants import FALSE_VALUES, SCHEME_LIST, TRUE_VALUES @@ -367,13 +366,6 @@ def handle_remove_readonly(func, path, exc): raise exc -def style_no_color(text, fg=None, bg=None, **kwargs) -> str: - """Wrap click style to ignore colors.""" - if hasattr(click, "original_style"): - return click.original_style(text, **kwargs) - return click.style(text, **kwargs) - - def env_to_bool(val): """ Convert **val** to boolean, returning True if truthy or False if falsey From 8c7b0f60f7e7e0e51a9ff42cb081547a25a5d2ad Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Thu, 12 Dec 2024 19:57:55 +0100 Subject: [PATCH 17/21] fix: typo pipevn->pipenv Signed-off-by: Oz Tiram --- pipenv/routines/outdated.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pipenv/routines/outdated.py b/pipenv/routines/outdated.py index 180871089..f30ee802b 100644 --- a/pipenv/routines/outdated.py +++ b/pipenv/routines/outdated.py @@ -2,11 +2,10 @@ from collections import namedtuple from collections.abc import Mapping -from pipevn.utils import console, err - from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name from pipenv.patched.pip._vendor.packaging.version import parse as parse_version from pipenv.routines.lock import do_lock +from pipenv.utils import console, err from pipenv.utils.dependencies import ( as_pipfile, expansive_install_req_from_line, From d6bee36ad7a90962b92a3d083401dd6108234afd Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Thu, 12 Dec 2024 21:03:50 +0100 Subject: [PATCH 18/21] chore: replace PipenvCmdError base class to OSError We never really made any usage of click's `ClickException.show()`. Hence, it is ok to just get read of the ClickException base class. --- pipenv/exceptions.py | 27 ++++++++++++--------------- pipenv/routines/uninstall.py | 3 +++ pipenv/routines/update.py | 2 +- pipenv/utils/processes.py | 3 ++- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/pipenv/exceptions.py b/pipenv/exceptions.py index 80f14c5ab..ead64ff65 100644 --- a/pipenv/exceptions.py +++ b/pipenv/exceptions.py @@ -84,22 +84,19 @@ def show(self, file=None): console.print(f"{self.message}") -class PipenvCmdError(PipenvException): - def __init__(self, cmd, out="", err="", exit_code=1): +class PipenvCmdError(OSError): + def __init__(self, cmd, stdout, stderr, return_code): self.cmd = cmd - self.out = out - self.err = err - self.exit_code = exit_code - message = f"Error running command: {cmd}" - PipenvException.__init__(self, message) - - def show(self, file=None): - console = Console(stderr=True, file=file, highlight=False) - console.print(f"[red]Error running command:[/red] [bold]$ {self.cmd}[/bold]") - if self.out: - console.print(f"OUTPUT: {self.out}") - if self.err: - console.print(f"STDERR: {self.err}") + self.stdout = stdout + self.stderr = stderr + self.return_code = return_code + + def __str__(self): + return ( + f"Command {self.cmd!r} failed with return code {self.return_code}.\n" + f"Output: {self.stdout}\n" + f"Error: {self.stderr}" + ) class JSONParseError(PipenvException): diff --git a/pipenv/routines/uninstall.py b/pipenv/routines/uninstall.py index 9c9630e0f..f1ea08528 100644 --- a/pipenv/routines/uninstall.py +++ b/pipenv/routines/uninstall.py @@ -33,10 +33,13 @@ def _uninstall_from_environment(project: Project, package, system=False): package, "-y", ] + c = run_command(cmd, is_verbose=project.s.is_verbose()) console.print("[cyan]c.stdout[/cyan]") + if c.returncode != 0: console.print(f"Error occurred while uninstalling package {package}.") + console.print(c.stderr) return False return True diff --git a/pipenv/routines/update.py b/pipenv/routines/update.py index 50cfcd71c..63fe750e4 100644 --- a/pipenv/routines/update.py +++ b/pipenv/routines/update.py @@ -113,7 +113,7 @@ def get_reverse_dependencies(project) -> Dict[str, Set[Tuple[str, str]]]: c = run_command(cmd_args, is_verbose=project.s.is_verbose()) if c.returncode != 0: - raise PipenvCmdError(c.err, c.out, c.returncode) + raise PipenvCmdError(c.cmdify(), c.err, c.out, c.returncode) try: dep_tree = json.loads(c.stdout.strip()) except json.JSONDecodeError: diff --git a/pipenv/utils/processes.py b/pipenv/utils/processes.py index aaf7326e1..be6a4761e 100644 --- a/pipenv/utils/processes.py +++ b/pipenv/utils/processes.py @@ -38,7 +38,8 @@ def run_command(cmd, *args, is_verbose=False, **kwargs): if is_verbose: err.print(f"[cyan]Command output: {c.stdout}[/cyan]") if c.returncode and catch_exceptions: - raise PipenvCmdError(cmd.cmdify(), c.stdout, c.stderr, c.returncode) + raise PipenvCmdError(c.returncode, f"Command failed: {cmd.cmdify()}") + return c From c0ea3731de6427d0e3d56810bc3cba165bfbc1e2 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Thu, 9 Jan 2025 23:34:06 +0100 Subject: [PATCH 19/21] refactor: replace click exception with rich based Signed-off-by: Oz Tiram --- pipenv/exceptions.py | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/pipenv/exceptions.py b/pipenv/exceptions.py index ead64ff65..ceca7b1be 100644 --- a/pipenv/exceptions.py +++ b/pipenv/exceptions.py @@ -4,6 +4,7 @@ from traceback import format_tb from pipenv.patched.pip._vendor.rich.console import Console +from pipenv.patched.pip._vendor.rich.panel import Panel from pipenv.patched.pip._vendor.rich.text import Text from pipenv.utils import err from pipenv.vendor import click @@ -61,6 +62,21 @@ def handle_exception(exc_type, exception, traceback, hook=sys.excepthook): sys.excepthook = handle_exception +class RichException(Exception): + def __init__(self, message): + self.message = message + + def show(self): + panel = Panel( + self.message, + title="Error", + expand=False, + border_style="red", + style="bold red", + ) + err.print(panel) + + class PipenvException(ClickException): message = "[bold][red]ERROR[/red][/bold]: {}" @@ -290,18 +306,13 @@ def __init__(self, package, **kwargs): PipenvException.__init__(self, message=message, extra=extra, **kwargs) -class DependencyConflict(PipenvException): - def __init__(self, message): - extra = [ - "{} {}".format( - click.style("The operation failed...", bold=True, fg="red"), - click.style( - "A dependency conflict was detected and could not be resolved.", - fg="red", - ), - ) - ] - PipenvException.__init__(self, message, extra=extra) +class DependencyConflict(RichException): + def __init__(self, msg): + banner = ( + "[red bold]The operation failed...[/bold][/red]\n" + "A dependency conflict for was detected and could not be resolved." + ) + super().__init__(f"{banner}\n{msg}") class ResolutionFailure(PipenvException): From 66c7715bfd4a899173f0ff92e05554924d1cf617 Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Sun, 12 Jan 2025 22:45:17 +0100 Subject: [PATCH 20/21] remove more usage of click exception Signed-off-by: Oz Tiram --- pipenv/exceptions.py | 102 +++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 61 deletions(-) diff --git a/pipenv/exceptions.py b/pipenv/exceptions.py index ceca7b1be..5dd856b26 100644 --- a/pipenv/exceptions.py +++ b/pipenv/exceptions.py @@ -8,7 +8,7 @@ from pipenv.patched.pip._vendor.rich.text import Text from pipenv.utils import err from pipenv.vendor import click -from pipenv.vendor.click.exceptions import ClickException, FileError, UsageError +from pipenv.vendor.click.exceptions import ClickException, FileError def unstyle(text: str) -> str: @@ -115,11 +115,10 @@ def __str__(self): ) -class JSONParseError(PipenvException): +class JSONParseError(RichException): def __init__(self, contents="", error_text=""): self.error_text = error_text self.contents = contents - PipenvException.__init__(self, contents) def show(self, file=None): console = Console(stderr=True, file=file, highlight=False) @@ -130,7 +129,7 @@ def show(self, file=None): console.print(f"[bold][red]ERROR TEXT:[/red][/bold]: {self.error_text}") -class PipenvUsageError(UsageError): +class PipenvUsageError(RichException): def __init__(self, message=None, ctx=None, **kwargs): formatted_message = "{0}: {1}" msg_prefix = "[bold red]ERROR:[/bold red]" @@ -138,22 +137,20 @@ def __init__(self, message=None, ctx=None, **kwargs): message = "Pipenv encountered a problem and had to exit." message = formatted_message.format(msg_prefix, f"[bold]{message}[/bold]") self.message = message - UsageError.__init__(self, message, ctx) def show(self, file=None): hint = "" if self.cmd is not None and self.cmd.get_help_option(self.ctx) is not None: hint = f'Try "{self.ctx.command_path} {self.ctx.help_option_names[0]}" for help.\n' - if self.ctx is not None: - console = Console( - stderr=True, file=file, highlight=False, force_terminal=self.ctx.color - ) - console.print(self.ctx.get_usage() + f"\n{hint}") + console = Console( + stderr=True, file=file, highlight=False, force_terminal=self.ctx.color + ) + console.print(self.ctx.get_usage() + f"\n{hint}") console = Console(stderr=True, file=file, highlight=False) console.print(self.message) -class PipenvFileError(FileError): +class PipenvFileError(RichException): formatted_message = "{} {{}} {{}}".format("[bold red]ERROR:[/bold red]") def __init__(self, filename, message=None, **kwargs): @@ -176,20 +173,18 @@ def show(self, file=None): console.print(self.message) -class PipfileNotFound(PipenvFileError): +class PipfileNotFound(RichException): def __init__(self, filename="Pipfile", extra=None, **kwargs): - extra = kwargs.pop("extra", []) - message = "{} {}".format( + message = ( "[bold red]Aborting![/bold red]", - "[bold]Please ensure that the file exists and is located in your project root directory.[/bold]", + f"[bold]Please ensure that the {filename} exists and is located in your project root directory.[/bold]", ) - super().__init__(filename, message=message, extra=extra, **kwargs) + super().__init__(message=message, extra=extra, **kwargs) -class LockfileNotFound(PipenvFileError): +class LockfileNotFound(RichException): def __init__(self, filename="Pipfile.lock", extra=None, **kwargs): - extra = kwargs.pop("extra", []) - message = "{} {} {}".format( + message = ( "[bold]You need to run[/bold]", "[bold red]$ pipenv lock[/bold red]", "[bold]before you can continue.[/bold]", @@ -197,51 +192,38 @@ def __init__(self, filename="Pipfile.lock", extra=None, **kwargs): super().__init__(filename, message=message, extra=extra, **kwargs) -class DeployException(PipenvUsageError): +class DeployException(RichException): def __init__(self, message=None, **kwargs): if not message: message = "[bold]Aborting deploy[/bold]" - extra = kwargs.pop("extra", []) - PipenvUsageError.__init__(self, message=message, extra=extra, **kwargs) -class PipenvOptionsError(PipenvUsageError): - def __init__(self, option_name, message=None, ctx=None, **kwargs): - extra = kwargs.pop("extra", []) - PipenvUsageError.__init__(self, message=message, ctx=ctx, **kwargs) - self.extra = extra - self.option_name = option_name +class PipenvOptionsError(RichException): + pass class SystemUsageError(PipenvOptionsError): - def __init__(self, option_name="system", message=None, ctx=None, **kwargs): - extra = kwargs.pop("extra", []) - extra += [ - "{}: --system is intended to be used for Pipfile installation, " - "not installation of specific packages. Aborting.".format( - "[bold red]Warning[/bold /red]", - ), - ] - if message is None: - message = "{} --deploy flag".format( - "[cyan]See also: {}[/cyan]", - ) - super().__init__(option_name, message=message, ctx=ctx, extra=extra, **kwargs) + def __init__(self, option_name="system", message=None): + message = ( + "[bold red]Warning[/bold /red]: --system is intended" + "to be used for Pipfile installation, " + "not installation of specific packages. Aborting." + ) + super().__init__(self, message) -class SetupException(PipenvException): - def __init__(self, message=None, **kwargs): - PipenvException.__init__(self, message, **kwargs) +class SetupException(RichException): + pass -class VirtualenvException(PipenvException): +class VirtualenvException(RichException): def __init__(self, message=None, **kwargs): if not message: message = ( "There was an unexpected error while activating your virtualenv. " "Continuing anyway..." ) - PipenvException.__init__(self, message, **kwargs) + super().__init__(self, message, **kwargs) class VirtualenvActivationException(VirtualenvException): @@ -252,7 +234,7 @@ def __init__(self, message=None, **kwargs): "not activated. Continuing anyway..." ) self.message = message - VirtualenvException.__init__(self, message, **kwargs) + super().__init__(self, message, **kwargs) class VirtualenvCreationException(VirtualenvException): @@ -269,41 +251,39 @@ def __init__(self, message=None, **kwargs): VirtualenvException.__init__(self, message, extra=extra) -class UninstallError(PipenvException): +class UninstallError(RichException): def __init__(self, package, command, return_values, return_code, **kwargs): extra = [ - "{} {}".format( - "[cyan]Attempting to run command: [/cyan]", - f"[bold yellow]$ {command!r}[/bold yellow]", - ) + "[cyan]Attempting to run command: [/cyan]", + f"[bold yellow]$ {command!r}[/bold yellow]", ] + extra.extend( [f"[cyan]{line.strip()}[/cyan]" for line in return_values.splitlines()] ) + if isinstance(package, (tuple, list, set)): package = " ".join(package) - message = "{!s} {!s}...".format( + message = ( "Failed to uninstall package(s)", f"[bold yellow]{package}!s[/bold yellow]", ) - self.exit_code = return_code - PipenvException.__init__(self, message=message, extra=extra) - self.extra = extra + message = message + extra -class InstallError(PipenvException): + +class InstallError(RichException): def __init__(self, package, **kwargs): package_message = "" if package is not None: package_message = "Couldn't install package: {}\n".format( f"[bold]{package!s}[/bold]" ) - message = "{} {}".format( + message = ( f"{package_message}", "[yellow]Package installation failed...[/yellow]", ) - extra = kwargs.pop("extra", []) - PipenvException.__init__(self, message=message, extra=extra, **kwargs) + super().__init__(self, message=message) class DependencyConflict(RichException): @@ -315,7 +295,7 @@ def __init__(self, msg): super().__init__(f"{banner}\n{msg}") -class ResolutionFailure(PipenvException): +class ResolutionFailure(RichException): def __init__(self, message, no_version_found=False): extra = ( "{}: Your dependencies could not be resolved. You likely have a " From 24f3d61cb78f6d1d7fb09b7d6a8b2cbea476ff6b Mon Sep 17 00:00:00 2001 From: Oz Tiram Date: Tue, 14 Jan 2025 21:54:04 +0100 Subject: [PATCH 21/21] refactor: remove all click from exceptions Signed-off-by: Oz Tiram --- pipenv/exceptions.py | 70 ++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 52 deletions(-) diff --git a/pipenv/exceptions.py b/pipenv/exceptions.py index 5dd856b26..9d2cbcc78 100644 --- a/pipenv/exceptions.py +++ b/pipenv/exceptions.py @@ -7,7 +7,6 @@ from pipenv.patched.pip._vendor.rich.panel import Panel from pipenv.patched.pip._vendor.rich.text import Text from pipenv.utils import err -from pipenv.vendor import click from pipenv.vendor.click.exceptions import ClickException, FileError @@ -77,29 +76,6 @@ def show(self): err.print(panel) -class PipenvException(ClickException): - message = "[bold][red]ERROR[/red][/bold]: {}" - - def __init__(self, message=None, **kwargs): - if not message: - message = "Pipenv encountered a problem and had to exit." - extra = kwargs.pop("extra", []) - self.message = self.message.format(message) - self.extra = extra - - def show(self, file=None): - if file is None: - file = sys.stderr - console = Console(file=file) - if self.extra: - if isinstance(self.extra, str): - self.extra = [self.extra] - for extra in self.extra: - extra = f"[pipenv.exceptions.{self.__class__.__name__}]: {extra}" - console.print(extra) - console.print(f"{self.message}") - - class PipenvCmdError(OSError): def __init__(self, cmd, stdout, stderr, return_code): self.cmd = cmd @@ -297,35 +273,31 @@ def __init__(self, msg): class ResolutionFailure(RichException): def __init__(self, message, no_version_found=False): + cmd = "[yellow]$ pipenv run pip install [/yellow]" + graph = "[yellow]$ pipenv graph[/yellow]" + hint = "[yellow]$ pipenv lock --pre[/yellow]" + extra = ( - "{}: Your dependencies could not be resolved. You likely have a " + f"[red bold]Warning[/red bold]: Your dependencies could not be resolved. You likely have a " "mismatch in your sub-dependencies.\n " - "You can use {} to bypass this mechanism, then run " - "{} to inspect the versions actually installed in the virtualenv.\n " - "Hint: try {} if it is a pre-release dependency." - "".format( - click.style("Warning", fg="red", bold=True), - click.style("$ pipenv run pip install ", fg="yellow"), - click.style("$ pipenv graph", fg="yellow"), - click.style("$ pipenv lock --pre", fg="yellow"), - ), + f"You can use {cmd} to bypass this mechanism, then run " + f"{graph} to inspect the versions actually installed in the virtualenv.\n " + f"Hint: try {hint} if it is a pre-release dependency." ) if "no version found at all" in message: no_version_found = True - message = click.style(f"{message}", fg="yellow") + message = f"[yellow]{message}[/yellow]" if no_version_found: - message = "{}\n{}".format( - message, - click.style( - "Please check your version specifier and version number. " - "See PEP440 for more information.", - fg="cyan", - ), + message += ( + "\n[cyan]Please check your version specifier and version number. " + "See PEP440 for more information.[/cyan]" ) - PipenvException.__init__(self, message, extra=extra) + + message += extra + super().__init__(self, message) -class RequirementError(PipenvException): +class RequirementError(RichException): def __init__(self, req=None): from pipenv.utils.constants import VCS_LIST @@ -358,14 +330,8 @@ def __init__(self, req=None): req_value = "\n".join([f" {k}: {v}" for k, v in values]) else: req_value = getattr(req.line_instance, "line", None) - message = click.style( - f"Failed creating requirement instance {req_value}", - bold=False, - fg="reset", - bg="reset", - ) - extra = [str(req)] - PipenvException.__init__(self, message, extra=extra) + message = f"Failed creating requirement instance {req_value} {[str(req)]}" + super().__init__(self, message) def prettify_exc(error):