diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8e33dff..85facf0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,10 +16,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.12", "3.11", "3.10", "3.9"] - env: - PYTHONUNBUFFERED: 1 - PYTHONWARNINGS: always + python-version: ["3.12", "3.11", "3.10"] steps: - name: Checkout run: | @@ -34,7 +31,7 @@ jobs: with: python-version: '${{ matrix.python-version }}' cache: 'pip' # caching pip dependencies - cache-dependency-path: '**/requirements.dev.txt' + cache-dependency-path: '**/requirements.*.txt' - name: 'Bootstrap app venv' # The first CLI call will create the .venv @@ -59,6 +56,9 @@ jobs: ./dev-cli.py safety - name: 'Run tests with Python v${{ matrix.python-version }}' + env: + PYTHONUNBUFFERED: 1 + PYTHONWARNINGS: always run: | ./dev-cli.py coverage diff --git a/README.md b/README.md index 159c424..fec69d9 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ Usage: ./cli.py format-file [OPTIONS] FILE_PATH ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮ │ --py-version TEXT Fallback Python version for darker/pyupgrade, if │ │ version is not defined in pyproject.toml │ -│ [default: 3.9] │ +│ [default: 3.10] │ │ --max-line-length -l INTEGER Fallback max. line length for darker/isort etc., if │ │ not defined in .editorconfig │ │ [default: 119] │ @@ -332,6 +332,12 @@ See also git tags: https://github.com/jedie/manageprojects/tags [comment]: <> (✂✂✂ auto generated history start ✂✂✂) +* [v0.17.0](https://github.com/jedie/manageprojects/compare/v0.16.2...v0.17.0) + * 2023-12-21 - Bugfix: Don't loose the "[manageprojects]" content on overwrite-update + * 2023-12-21 - typing: Optional -> None + * 2023-12-21 - Unify BASE_PATH / PACKAGE_ROOT etc. + * 2023-12-21 - Apply manageprojects updates: Skip Python 3.9 support + * 2023-12-21 - Update requirements * [v0.16.2](https://github.com/jedie/manageprojects/compare/v0.16.1...v0.16.2) * 2023-12-16 - Update pre-commit-config * 2023-12-16 - Skip test_readme_history() on CI @@ -344,11 +350,11 @@ See also git tags: https://github.com/jedie/manageprojects/tags * 2023-12-02 - Use code style tooling from cli-base-utilities * 2023-12-01 - Apply https://github.com/jedie/cookiecutter_templates updates * 2023-12-01 - Use: cli_base.cli_tools.test_utils.logs.AssertLogs -* [v0.15.4](https://github.com/jedie/manageprojects/compare/v0.15.3...v0.15.4) - * 2023-11-27 - Use "flake8-bugbear", too.
Expand older history entries ... +* [v0.15.4](https://github.com/jedie/manageprojects/compare/v0.15.3...v0.15.4) + * 2023-11-27 - Use "flake8-bugbear", too. * [v0.15.3](https://github.com/jedie/manageprojects/compare/v0.15.2...v0.15.3) * 2023-11-09 - Bugfix "reverse" if context contains a list * 2023-11-07 - Update requirements diff --git a/cli.py b/cli.py index 4043912..175bb51 100755 --- a/cli.py +++ b/cli.py @@ -8,6 +8,7 @@ """ import hashlib +import shlex import subprocess import sys import venv @@ -32,7 +33,7 @@ def print_no_pip_error(): sys.exit(-1) -assert sys.version_info >= (3, 9), 'Python version is too old!' +assert sys.version_info >= (3, 10), f'Python version {sys.version_info} is too old!' if sys.platform == 'win32': # wtf @@ -77,7 +78,7 @@ def venv_up2date(): def verbose_check_call(*popen_args): - print(f'\n+ {" ".join(str(arg) for arg in popen_args)}\n') + print(f'\n+ {shlex.join(str(arg) for arg in popen_args)}\n') return subprocess.check_call(popen_args) diff --git a/dev-cli.py b/dev-cli.py index 3449618..6f46420 100755 --- a/dev-cli.py +++ b/dev-cli.py @@ -8,6 +8,7 @@ """ import hashlib +import shlex import subprocess import sys import venv @@ -32,7 +33,7 @@ def print_no_pip_error(): sys.exit(-1) -assert sys.version_info >= (3, 9), 'Python version is too old!' +assert sys.version_info >= (3, 10), f'Python version {sys.version_info} is too old!' if sys.platform == 'win32': # wtf @@ -77,7 +78,7 @@ def venv_up2date(): def verbose_check_call(*popen_args): - print(f'\n+ {" ".join(str(arg) for arg in popen_args)}\n') + print(f'\n+ {shlex.join(str(arg) for arg in popen_args)}\n') return subprocess.check_call(popen_args) diff --git a/manageprojects/__init__.py b/manageprojects/__init__.py index 4ff16de..6a1c5da 100644 --- a/manageprojects/__init__.py +++ b/manageprojects/__init__.py @@ -3,5 +3,5 @@ Manage Python / Django projects """ -__version__ = '0.16.2' +__version__ = '0.17.0' __author__ = 'Jens Diemer ' diff --git a/manageprojects/cli/cli_app.py b/manageprojects/cli/cli_app.py index 5311ded..972487e 100644 --- a/manageprojects/cli/cli_app.py +++ b/manageprojects/cli/cli_app.py @@ -6,10 +6,9 @@ import subprocess import sys from pathlib import Path -from typing import Optional import rich_click as click -from bx_py_utils.path import assert_is_dir, assert_is_file +from bx_py_utils.path import assert_is_dir from cli_base.cli_tools.subprocess_utils import verbose_check_call from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE from cli_base.cli_tools.version_info import print_version @@ -39,9 +38,6 @@ logger = logging.getLogger(__name__) -PACKAGE_ROOT = Path(manageprojects.__file__).parent.parent -assert_is_file(PACKAGE_ROOT / 'pyproject.toml') - OPTION_ARGS_DEFAULT_TRUE = dict(is_flag=True, show_default=True, default=True) OPTION_ARGS_DEFAULT_FALSE = dict(is_flag=True, show_default=True, default=False) ARGUMENT_EXISTING_DIR = dict( @@ -116,12 +112,12 @@ def cli(): def start_project( template: str, output_dir: Path, - directory: Optional[str], - checkout: Optional[str], + directory: str | None, + checkout: str | None, input: bool, replay: bool, - password: Optional[str], - config_file: Optional[Path], + password: str | None, + config_file: Path | None, ): """ Start a new "managed" project via a CookieCutter Template. @@ -199,8 +195,8 @@ def start_project( def update_project( project_path: Path, overwrite: bool, - password: Optional[str], - config_file: Optional[Path], + password: str | None, + config_file: Path | None, input: bool, cleanup: bool, ): @@ -250,9 +246,9 @@ def clone_project( project_path: Path, output_dir: Path, input: bool, - checkout: Optional[str] = None, - password: Optional[str] = None, - config_file: Optional[Path] = None, + checkout: str | None = None, + password: str | None = None, + config_file: Path | None = None, ): """ Clone existing project by replay the cookiecutter template in a new directory. diff --git a/manageprojects/cli/dev.py b/manageprojects/cli/dev.py index 27cfee8..489e7e5 100644 --- a/manageprojects/cli/dev.py +++ b/manageprojects/cli/dev.py @@ -19,13 +19,14 @@ import manageprojects from manageprojects import constants +from manageprojects.constants import BASE_PATH from manageprojects.utilities.publish import publish_package logger = logging.getLogger(__name__) -PACKAGE_ROOT = Path(manageprojects.__file__).parent.parent +PACKAGE_ROOT = BASE_PATH.parent assert_is_file(PACKAGE_ROOT / 'pyproject.toml') OPTION_ARGS_DEFAULT_TRUE = dict(is_flag=True, show_default=True, default=True) diff --git a/manageprojects/constants.py b/manageprojects/constants.py index a541791..323eafd 100644 --- a/manageprojects/constants.py +++ b/manageprojects/constants.py @@ -1,6 +1,8 @@ import sys from pathlib import Path +import manageprojects + INITIAL_REVISION = 'initial_revision' INITIAL_DATE = 'initial_date' @@ -24,7 +26,8 @@ ] ) ) -FORMAT_PY_FILE_DEFAULT_MIN_PYTON_VERSION = '3.9' +FORMAT_PY_FILE_DEFAULT_MIN_PYTON_VERSION = '3.10' FORMAT_PY_FILE_DEFAULT_MAX_LINE_LENGTH = 119 PY_BIN_PATH = Path(sys.executable).parent +BASE_PATH = Path(manageprojects.__file__).parent diff --git a/manageprojects/cookiecutter_templates.py b/manageprojects/cookiecutter_templates.py index c6fe560..302c0bc 100644 --- a/manageprojects/cookiecutter_templates.py +++ b/manageprojects/cookiecutter_templates.py @@ -2,7 +2,6 @@ import subprocess import sys from pathlib import Path -from typing import Optional from cli_base.cli_tools.git import Git from rich import print as rprint @@ -27,13 +26,13 @@ def start_managed_project( *, template: str, # CookieCutter Template path or GitHub url output_dir: Path, # Target path where CookieCutter should store the result files - directory: Optional[str] = None, # Directory name of the CookieCutter Template + directory: str | None = None, # Directory name of the CookieCutter Template input: bool = True, # Prompt the user at command line for manual configuration? - extra_context: Optional[dict] = None, - replay: Optional[bool] = None, - checkout: Optional[str] = None, - password: Optional[str] = None, # Optional password to use when extracting the repository - config_file: Optional[Path] = None, # Optional path to 'cookiecutter_config.yaml' + extra_context: dict | None = None, + replay: bool | None = None, + checkout: str | None = None, + password: str | None = None, # Optional password to use when extracting the repository + config_file: Path | None = None, # Optional path to 'cookiecutter_config.yaml' ) -> CookiecutterResult: """ Start a new "managed" project by run cookiecutter and create/update "pyproject.toml" @@ -86,11 +85,11 @@ def start_managed_project( def update_managed_project( project_path: Path, overwrite: bool = False, # Don't apply git patches -> Just overwrite all template files! - password: Optional[str] = None, - config_file: Optional[Path] = None, # CookieCutter config file + password: str | None = None, + config_file: Path | None = None, # CookieCutter config file cleanup: bool = True, # Remove temp files if not exceptions happens input: bool = False, # Prompt the user at command line for manual configuration? -) -> Optional[GenerateTemplatePatchResult]: +) -> GenerateTemplatePatchResult | None: """ Update a existing project by apply git patch from cookiecutter template changes. """ @@ -164,12 +163,12 @@ def update_managed_project( print(f'./cli.py wiggle {project_path}') print() + # Important: We *must* read the current "pyproject.toml" here again! + # Otherwise, we may overwrite template changed with old content! + toml = PyProjectToml(project_path=project_path) + ############################################################################# # Update "pyproject.toml" with applied patch information - - # Important: We *must* read the current "pyproject.toml" here again! - # Otherwise, we may overwrite template changed with old content! - toml = PyProjectToml(project_path=project_path) toml.add_applied_migrations(git_hash=result.to_rev, dt=result.to_commit_date) toml.save() @@ -179,9 +178,9 @@ def update_managed_project( def clone_managed_project( project_path: Path, destination: Path, - checkout: Optional[str] = None, # Optional branch, tag or commit ID to checkout after clone - password: Optional[str] = None, - config_file: Optional[Path] = None, # CookieCutter config file + checkout: str | None = None, # Optional branch, tag or commit ID to checkout after clone + password: str | None = None, + config_file: Path | None = None, # CookieCutter config file input: bool = False, # Prompt the user at command line for manual configuration? ) -> CookiecutterResult: """ diff --git a/manageprojects/tests/base.py b/manageprojects/tests/base.py index a36a77e..030d9d4 100644 --- a/manageprojects/tests/base.py +++ b/manageprojects/tests/base.py @@ -7,11 +7,9 @@ from bx_py_utils.path import assert_is_file -import manageprojects from manageprojects.utilities.pyproject_toml import TomlDocument, get_toml_document -PROJECT_PATH = Path(manageprojects.__file__).parent.parent GIT_BIN_PARENT = Path(shutil.which('git')).parent diff --git a/manageprojects/tests/test_cli.py b/manageprojects/tests/test_cli.py index 624e4f6..03e4077 100644 --- a/manageprojects/tests/test_cli.py +++ b/manageprojects/tests/test_cli.py @@ -4,7 +4,8 @@ from unittest.mock import MagicMock from manageprojects.cli import cli_app -from manageprojects.cli.cli_app import PACKAGE_ROOT, start_project, update_project +from manageprojects.cli.cli_app import start_project, update_project +from manageprojects.cli.dev import PACKAGE_ROOT from manageprojects.cli.dev import cli as dev_cli from manageprojects.constants import PY_BIN_PATH from manageprojects.data_classes import CookiecutterResult diff --git a/manageprojects/tests/test_format_file.py b/manageprojects/tests/test_format_file.py index 2e482ea..dfc0005 100644 --- a/manageprojects/tests/test_format_file.py +++ b/manageprojects/tests/test_format_file.py @@ -5,6 +5,7 @@ from cli_base.cli_tools.test_utils.logs import AssertLogs from packaging.version import Version +from manageprojects.cli.dev import PACKAGE_ROOT from manageprojects.constants import PY_BIN_PATH from manageprojects.format_file import ( Config, @@ -17,7 +18,7 @@ get_pyproject_info, ) from manageprojects.test_utils.subprocess import SimpleRunReturnCallback, SubprocessCallMock -from manageprojects.tests.base import GIT_BIN_PARENT, PROJECT_PATH +from manageprojects.tests.base import GIT_BIN_PARENT from manageprojects.utilities.temp_path import TemporaryDirectory @@ -111,9 +112,9 @@ def test_get_pyproject_info(self): self.assertEqual( get_pyproject_info(file_path=Path(__file__), default_min_py_version='3.7'), PyProjectInfo( - pyproject_toml_path=PROJECT_PATH / 'pyproject.toml', - py_min_ver=Version('3.9'), - raw_py_ver_req='>=3.9,<4', + pyproject_toml_path=PACKAGE_ROOT / 'pyproject.toml', + py_min_ver=Version('3.10'), + raw_py_ver_req='>=3.10', ), ) @@ -129,11 +130,11 @@ def test_get_config(self): self.assertEqual( config, Config( - git_info=GitInfo(cwd=PROJECT_PATH, main_branch_name='main'), + git_info=GitInfo(cwd=PACKAGE_ROOT, main_branch_name='main'), pyproject_info=PyProjectInfo( - pyproject_toml_path=PROJECT_PATH / 'pyproject.toml', - py_min_ver=Version('3.9'), - raw_py_ver_req='>=3.9,<4', + pyproject_toml_path=PACKAGE_ROOT / 'pyproject.toml', + py_min_ver=Version('3.10'), + raw_py_ver_req='>=3.10', ), max_line_length=119, ), @@ -146,7 +147,7 @@ def test_get_config(self): Config( git_info=None, pyproject_info=PyProjectInfo( - py_min_ver=Version('3.9'), pyproject_toml_path=None, raw_py_ver_req=None + py_min_ver=Version('3.10'), pyproject_toml_path=None, raw_py_ver_req=None ), max_line_length=119, ), @@ -173,7 +174,7 @@ def test_format_one_file(self): [ '.../pyupgrade', '--exit-zero-even-if-changed', - '--py39-plus', + '--py310-plus', 'manageprojects/tests/test_format_file.py', ], [ @@ -201,7 +202,7 @@ def test_format_one_file(self): '--line-length', '119', '--target-version', - 'py39', + 'py310', 'manageprojects/tests/test_format_file.py', ], ['.../flake8', '--max-line-length', '119', 'manageprojects/tests/test_format_file.py'], @@ -238,7 +239,7 @@ def test_format_one_file(self): [ '.../pyupgrade', '--exit-zero-even-if-changed', - '--py39-plus', + '--py310-plus', 'manageprojects/tests/test_format_file.py', ], ['.../autoflake', '--in-place', 'manageprojects/tests/test_format_file.py'], diff --git a/manageprojects/tests/test_overwrite.py b/manageprojects/tests/test_overwrite.py index 6f29fd2..17b84bf 100644 --- a/manageprojects/tests/test_overwrite.py +++ b/manageprojects/tests/test_overwrite.py @@ -189,3 +189,5 @@ def test_happy_path(self): logs.assert_in('Read existing pyproject.toml') self.assertEqual(mp_meta.initial_revision, from_rev) self.assertEqual(mp_meta.applied_migrations, [to_rev]) + content = toml.dumps() + self.assertIn('[manageprojects] # https://github.com/jedie/manageprojects', content) diff --git a/manageprojects/tests/test_project_setup.py b/manageprojects/tests/test_project_setup.py index a9dc7be..8b994f5 100644 --- a/manageprojects/tests/test_project_setup.py +++ b/manageprojects/tests/test_project_setup.py @@ -6,7 +6,7 @@ from packaging.version import Version from manageprojects import __version__ -from manageprojects.cli.cli_app import PACKAGE_ROOT +from manageprojects.cli.dev import PACKAGE_ROOT from manageprojects.test_utils.project_setup import check_editor_config, get_py_max_line_length diff --git a/manageprojects/tests/test_readme.py b/manageprojects/tests/test_readme.py index b02c845..999f483 100644 --- a/manageprojects/tests/test_readme.py +++ b/manageprojects/tests/test_readme.py @@ -2,7 +2,8 @@ from bx_py_utils.path import assert_is_file from manageprojects import constants -from manageprojects.cli.cli_app import PACKAGE_ROOT, cli +from manageprojects.cli.cli_app import cli +from manageprojects.cli.dev import PACKAGE_ROOT from manageprojects.cli.dev import cli as dev_cli from manageprojects.test_utils.click_cli_utils import invoke_click from manageprojects.tests.base import BaseTestCase diff --git a/manageprojects/tests/test_utilities_pyproject_toml.py b/manageprojects/tests/test_utilities_pyproject_toml.py index 358f21d..96bbb1d 100644 --- a/manageprojects/tests/test_utilities_pyproject_toml.py +++ b/manageprojects/tests/test_utilities_pyproject_toml.py @@ -5,7 +5,7 @@ from bx_py_utils.test_utils.datetime import parse_dt from cli_base.cli_tools.test_utils.logs import AssertLogs -import manageprojects +from manageprojects.constants import BASE_PATH from manageprojects.data_classes import ManageProjectsMeta from manageprojects.tests.base import BaseTestCase from manageprojects.utilities.pyproject_toml import PyProjectToml, find_pyproject_toml @@ -268,7 +268,7 @@ def test_expand_existing_toml(self): logs.assert_in('Read existing pyproject.toml') def test_find_pyproject_toml(self): - own_pyproject_toml = Path(manageprojects.__file__).parent.parent / 'pyproject.toml' + own_pyproject_toml = BASE_PATH.parent / 'pyproject.toml' assert_is_file(own_pyproject_toml) self.assertEqual(find_pyproject_toml(file_path=Path(__file__)), own_pyproject_toml) diff --git a/pyproject.toml b/pyproject.toml index cdaae18..5650511 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" authors = [ {name = 'Jens Diemer', email = 'mamageprojects@jensdiemer.de'} ] -requires-python = ">=3.9,<4" +requires-python = ">=3.10" dependencies = [ "cookiecutter>=2.4.0", # https://github.com/cookiecutter/cookiecutter "tomlkit", @@ -28,7 +28,7 @@ dependencies = [ "codespell", # https://github.com/codespell-project/codespell "mypy", # https://github.com/python/mypy - "cli-base-utilities>=0.7.0rc2", # https://github.com/jedie/cli-base-utilities + "cli-base-utilities", # https://github.com/jedie/cli-base-utilities "click", # https://github.com/pallets/click/ "rich-click", # https://github.com/ewels/rich-click "rich", # https://github.com/Textualize/rich @@ -125,7 +125,7 @@ exclude_lines = [ legacy_tox_ini = """ [tox] isolated_build = True -envlist = py{312,311,310,39} +envlist = py{312,311,310} skip_missing_interpreters = True [testenv] @@ -168,6 +168,7 @@ applied_migrations = [ "be3f649", # 2023-08-22T19:36:57+02:00 "385f654", # 2023-10-08T21:09:24+02:00 "d1ed4b1", # 2023-12-01T21:41:29+01:00 + "c538ae7", # 2023-12-21T20:21:58+01:00 ] [manageprojects.cookiecutter_context.cookiecutter] diff --git a/requirements.dev.txt b/requirements.dev.txt index 878eeac..0279029 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -312,9 +312,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -cli-base-utilities==0.7.0rc2 \ - --hash=sha256:725ef65ab4905ea6600ce8cec0399369a684365e24aaa538824728817c54bff6 \ - --hash=sha256:80ac7aa311b0d4e6a31878648dbab8dd336fda349692b1d3b0813862c5827105 +cli-base-utilities==0.7.0 \ + --hash=sha256:3d13b861d4c96b597b1dc3c6fdbe428dc72c444ab61008cc9555292d7b3ec8b4 \ + --hash=sha256:fa39bd83900749ece5866ea996d270880081a5155497f74db46995c28b1a9425 # via manageprojects (pyproject.toml) click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ @@ -339,59 +339,59 @@ cookiecutter==2.5.0 \ --hash=sha256:8aa2f12ed11bc05628651e9dc4353a10571dd9908aaaaeec959a2b9ea465a5d2 \ --hash=sha256:e61e9034748e3f41b8bd2c11f00d030784b48711c4d5c42363c50989a65331ec # via manageprojects (pyproject.toml) -coverage==7.3.3 \ - --hash=sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29 \ - --hash=sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e \ - --hash=sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134 \ - --hash=sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523 \ - --hash=sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc \ - --hash=sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936 \ - --hash=sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c \ - --hash=sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb \ - --hash=sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4 \ - --hash=sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132 \ - --hash=sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8 \ - --hash=sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92 \ - --hash=sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15 \ - --hash=sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284 \ - --hash=sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94 \ - --hash=sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70 \ - --hash=sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069 \ - --hash=sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f \ - --hash=sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0 \ - --hash=sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa \ - --hash=sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6 \ - --hash=sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69 \ - --hash=sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb \ - --hash=sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438 \ - --hash=sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837 \ - --hash=sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a \ - --hash=sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327 \ - --hash=sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56 \ - --hash=sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f \ - --hash=sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06 \ - --hash=sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59 \ - --hash=sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717 \ - --hash=sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973 \ - --hash=sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348 \ - --hash=sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb \ - --hash=sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab \ - --hash=sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494 \ - --hash=sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd \ - --hash=sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7 \ - --hash=sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee \ - --hash=sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39 \ - --hash=sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85 \ - --hash=sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb \ - --hash=sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2 \ - --hash=sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1 \ - --hash=sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394 \ - --hash=sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d \ - --hash=sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea \ - --hash=sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97 \ - --hash=sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c \ - --hash=sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1 \ - --hash=sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40 +coverage==7.3.4 \ + --hash=sha256:020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0 \ + --hash=sha256:11ab62d0ce5d9324915726f611f511a761efcca970bd49d876cf831b4de65be5 \ + --hash=sha256:183c16173a70caf92e2dfcfe7c7a576de6fa9edc4119b8e13f91db7ca33a7923 \ + --hash=sha256:27ee94f088397d1feea3cb524e4313ff0410ead7d968029ecc4bc5a7e1d34fbf \ + --hash=sha256:3024ec1b3a221bd10b5d87337d0373c2bcaf7afd86d42081afe39b3e1820323b \ + --hash=sha256:309ed6a559bc942b7cc721f2976326efbfe81fc2b8f601c722bff927328507dc \ + --hash=sha256:33e63c578f4acce1b6cd292a66bc30164495010f1091d4b7529d014845cd9bee \ + --hash=sha256:36797b3625d1da885b369bdaaa3b0d9fb8865caed3c2b8230afaa6005434aa2f \ + --hash=sha256:36d75ef2acab74dc948d0b537ef021306796da551e8ac8b467810911000af66a \ + --hash=sha256:38d0b307c4d99a7aca4e00cad4311b7c51b7ac38fb7dea2abe0d182dd4008e05 \ + --hash=sha256:3d892a19ae24b9801771a5a989fb3e850bd1ad2e2b6e83e949c65e8f37bc67a1 \ + --hash=sha256:3f477fb8a56e0c603587b8278d9dbd32e54bcc2922d62405f65574bd76eba78a \ + --hash=sha256:47ee56c2cd445ea35a8cc3ad5c8134cb9bece3a5cb50bb8265514208d0a65928 \ + --hash=sha256:4a4184dcbe4f98d86470273e758f1d24191ca095412e4335ff27b417291f5964 \ + --hash=sha256:5214362abf26e254d749fc0c18af4c57b532a4bfde1a057565616dd3b8d7cc94 \ + --hash=sha256:607b6c6b35aa49defaebf4526729bd5238bc36fe3ef1a417d9839e1d96ee1e4c \ + --hash=sha256:610afaf929dc0e09a5eef6981edb6a57a46b7eceff151947b836d869d6d567c1 \ + --hash=sha256:6879fe41c60080aa4bb59703a526c54e0412b77e649a0d06a61782ecf0853ee1 \ + --hash=sha256:74397a1263275bea9d736572d4cf338efaade2de9ff759f9c26bcdceb383bb49 \ + --hash=sha256:758ebaf74578b73f727acc4e8ab4b16ab6f22a5ffd7dd254e5946aba42a4ce76 \ + --hash=sha256:782693b817218169bfeb9b9ba7f4a9f242764e180ac9589b45112571f32a0ba6 \ + --hash=sha256:7c4277ddaad9293454da19121c59f2d850f16bcb27f71f89a5c4836906eb35ef \ + --hash=sha256:85072e99474d894e5df582faec04abe137b28972d5e466999bc64fc37f564a03 \ + --hash=sha256:8a9c5bc5db3eb4cd55ecb8397d8e9b70247904f8eca718cc53c12dcc98e59fc8 \ + --hash=sha256:8ce03e25e18dd9bf44723e83bc202114817f3367789052dc9e5b5c79f40cf59d \ + --hash=sha256:93698ac0995516ccdca55342599a1463ed2e2d8942316da31686d4d614597ef9 \ + --hash=sha256:997aa14b3e014339d8101b9886063c5d06238848905d9ad6c6eabe533440a9a7 \ + --hash=sha256:9ac17b94ab4ca66cf803f2b22d47e392f0977f9da838bf71d1f0db6c32893cb9 \ + --hash=sha256:a02ac7c51819702b384fea5ee033a7c202f732a2a2f1fe6c41e3d4019828c8d3 \ + --hash=sha256:a1c3e9d2bbd6f3f79cfecd6f20854f4dc0c6e0ec317df2b265266d0dc06535f1 \ + --hash=sha256:a877810ef918d0d345b783fc569608804f3ed2507bf32f14f652e4eaf5d8f8d0 \ + --hash=sha256:a8e258dcc335055ab59fe79f1dec217d9fb0cdace103d6b5c6df6b75915e7959 \ + --hash=sha256:aefbb29dc56317a4fcb2f3857d5bce9b881038ed7e5aa5d3bcab25bd23f57328 \ + --hash=sha256:aff2bd3d585969cc4486bfc69655e862028b689404563e6b549e6a8244f226df \ + --hash=sha256:b1e0f25ae99cf247abfb3f0fac7ae25739e4cd96bf1afa3537827c576b4847e5 \ + --hash=sha256:b710869a15b8caf02e31d16487a931dbe78335462a122c8603bb9bd401ff6fb2 \ + --hash=sha256:bfed0ec4b419fbc807dec417c401499ea869436910e1ca524cfb4f81cf3f60e7 \ + --hash=sha256:c15fdfb141fcf6a900e68bfa35689e1256a670db32b96e7a931cab4a0e1600e5 \ + --hash=sha256:c6a23ae9348a7a92e7f750f9b7e828448e428e99c24616dec93a0720342f241d \ + --hash=sha256:c75738ce13d257efbb6633a049fb2ed8e87e2e6c2e906c52d1093a4d08d67c6b \ + --hash=sha256:d1d0ce6c6947a3a4aa5479bebceff2c807b9f3b529b637e2b33dea4468d75fc7 \ + --hash=sha256:d5b14abde6f8d969e6b9dd8c7a013d9a2b52af1235fe7bebef25ad5c8f47fa18 \ + --hash=sha256:d6ed790728fb71e6b8247bd28e77e99d0c276dff952389b5388169b8ca7b1c28 \ + --hash=sha256:e0d84099ea7cba9ff467f9c6f747e3fc3906e2aadac1ce7b41add72e8d0a3712 \ + --hash=sha256:e4353923f38d752ecfbd3f1f20bf7a3546993ae5ecd7c07fd2f25d40b4e54571 \ + --hash=sha256:e91029d7f151d8bf5ab7d8bfe2c3dbefd239759d642b211a677bc0709c9fdb96 \ + --hash=sha256:ea473c37872f0159294f7073f3fa72f68b03a129799f3533b2bb44d5e9fa4f82 \ + --hash=sha256:f154bd866318185ef5865ace5be3ac047b6d1cc0aeecf53bf83fe846f4384d5d \ + --hash=sha256:f97ff5a9fc2ca47f3383482858dd2cb8ddbf7514427eecf5aa5f7992d0571429 \ + --hash=sha256:f99b7d3f7a7adfa3d11e3a48d1a91bb65739555dd6a0d3fa68aa5852d962e5b1 \ + --hash=sha256:fb220b3596358a86361139edce40d97da7458412d412e1e10c8e1970ee8c09ab \ + --hash=sha256:fd2f8a641f8f193968afdc8fd1697e602e199931012b574194052d132a79be13 # via manageprojects (pyproject.toml) cryptography==41.0.7 \ --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ @@ -733,34 +733,34 @@ multidict==6.0.4 \ # via # aiohttp # yarl -mypy==1.7.1 \ - --hash=sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340 \ - --hash=sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49 \ - --hash=sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82 \ - --hash=sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce \ - --hash=sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb \ - --hash=sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51 \ - --hash=sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5 \ - --hash=sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e \ - --hash=sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7 \ - --hash=sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33 \ - --hash=sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9 \ - --hash=sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1 \ - --hash=sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6 \ - --hash=sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a \ - --hash=sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe \ - --hash=sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7 \ - --hash=sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200 \ - --hash=sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7 \ - --hash=sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a \ - --hash=sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28 \ - --hash=sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea \ - --hash=sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120 \ - --hash=sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d \ - --hash=sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42 \ - --hash=sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea \ - --hash=sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2 \ - --hash=sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a +mypy==1.8.0 \ + --hash=sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6 \ + --hash=sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d \ + --hash=sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02 \ + --hash=sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d \ + --hash=sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3 \ + --hash=sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3 \ + --hash=sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3 \ + --hash=sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66 \ + --hash=sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259 \ + --hash=sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835 \ + --hash=sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd \ + --hash=sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d \ + --hash=sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8 \ + --hash=sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07 \ + --hash=sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b \ + --hash=sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e \ + --hash=sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6 \ + --hash=sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae \ + --hash=sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9 \ + --hash=sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d \ + --hash=sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a \ + --hash=sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592 \ + --hash=sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218 \ + --hash=sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817 \ + --hash=sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4 \ + --hash=sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410 \ + --hash=sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55 # via manageprojects (pyproject.toml) mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ @@ -1186,9 +1186,9 @@ zipp==3.17.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -pip==23.3.1 \ - --hash=sha256:1fcaa041308d01f14575f6d0d2ea4b75a3e2871fe4f9c694976f908768e14174 \ - --hash=sha256:55eb67bb6171d37447e82213be585b75fe2b12b359e993773aca4de9247a052b +pip==23.3.2 \ + --hash=sha256:5052d7889c1f9d05224cd41741acb7c5d6fa735ab34e339624a614eaaa7e7d76 \ + --hash=sha256:7fd9972f96db22c8077a1ee2691b172c8089b17a5652a44494a9ecb0d78f9149 # via pip-tools setuptools==69.0.2 \ --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ diff --git a/requirements.txt b/requirements.txt index 5810b32..a47f58f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -244,9 +244,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -cli-base-utilities==0.7.0rc2 \ - --hash=sha256:725ef65ab4905ea6600ce8cec0399369a684365e24aaa538824728817c54bff6 \ - --hash=sha256:80ac7aa311b0d4e6a31878648dbab8dd336fda349692b1d3b0813862c5827105 +cli-base-utilities==0.7.0 \ + --hash=sha256:3d13b861d4c96b597b1dc3c6fdbe428dc72c444ab61008cc9555292d7b3ec8b4 \ + --hash=sha256:fa39bd83900749ece5866ea996d270880081a5155497f74db46995c28b1a9425 # via manageprojects (pyproject.toml) click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ @@ -534,34 +534,34 @@ multidict==6.0.4 \ # via # aiohttp # yarl -mypy==1.7.1 \ - --hash=sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340 \ - --hash=sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49 \ - --hash=sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82 \ - --hash=sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce \ - --hash=sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb \ - --hash=sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51 \ - --hash=sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5 \ - --hash=sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e \ - --hash=sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7 \ - --hash=sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33 \ - --hash=sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9 \ - --hash=sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1 \ - --hash=sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6 \ - --hash=sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a \ - --hash=sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe \ - --hash=sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7 \ - --hash=sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200 \ - --hash=sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7 \ - --hash=sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a \ - --hash=sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28 \ - --hash=sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea \ - --hash=sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120 \ - --hash=sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d \ - --hash=sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42 \ - --hash=sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea \ - --hash=sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2 \ - --hash=sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a +mypy==1.8.0 \ + --hash=sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6 \ + --hash=sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d \ + --hash=sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02 \ + --hash=sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d \ + --hash=sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3 \ + --hash=sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3 \ + --hash=sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3 \ + --hash=sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66 \ + --hash=sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259 \ + --hash=sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835 \ + --hash=sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd \ + --hash=sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d \ + --hash=sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8 \ + --hash=sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07 \ + --hash=sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b \ + --hash=sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e \ + --hash=sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6 \ + --hash=sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae \ + --hash=sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9 \ + --hash=sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d \ + --hash=sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a \ + --hash=sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592 \ + --hash=sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218 \ + --hash=sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817 \ + --hash=sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4 \ + --hash=sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410 \ + --hash=sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55 # via manageprojects (pyproject.toml) mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \