diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c987b67..3d22a91 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.12", "3.11", "3.10", "3.9"] + python-version: ["3.12", "3.11"] steps: - name: Checkout run: | @@ -26,7 +26,7 @@ jobs: git checkout $GITHUB_SHA || (git fetch && git checkout $GITHUB_SHA) - name: 'Set up Python ${{ matrix.python-version }}' - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 # https://github.com/marketplace/actions/setup-python with: python-version: '${{ matrix.python-version }}' @@ -51,9 +51,9 @@ jobs: run: | ./dev-cli.py --help - - name: 'Safety' + - name: 'Run pip-audit' run: | - ./dev-cli.py safety + ./dev-cli.py pip-audit - name: 'Run tests with Python v${{ matrix.python-version }}' env: @@ -63,7 +63,7 @@ jobs: ./dev-cli.py coverage - name: 'Upload coverage report' - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 # https://github.com/marketplace/actions/codecov with: fail_ci_if_error: false diff --git a/.gitignore b/.gitignore index c6aad5a..ec72297 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ __pycache__ !.editorconfig !.flake8 !.gitignore +!.pre-commit-config.yaml +!.pre-commit-hooks.yaml !.gitkeep diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..61dd4fd --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,12 @@ +# pre-commit plugin configuration +# See https://pre-commit.com for more information +default_install_hook_types: + - pre-commit + - post-rewrite + - pre-push + +repos: + - repo: https://github.com/jedie/cli-base-utilities + rev: v0.11.0 + hooks: + - id: update-readme-history diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml new file mode 100644 index 0000000..d6f5771 --- /dev/null +++ b/.pre-commit-hooks.yaml @@ -0,0 +1,13 @@ +# https://pre-commit.com/#creating-new-hooks +- id: update-readme-history + name: cli-base-utilities + description: >- + Update history in README.md from git log. + entry: "python -m cli_base update-readme-history -v" + language: python + language_version: python3 + require_serial: true + pass_filenames: false + always_run: true + verbose: true + stages: [pre-commit, post-rewrite, pre-push] diff --git a/MC6809/__init__.py b/MC6809/__init__.py index c8c0f98..af596ee 100644 --- a/MC6809/__init__.py +++ b/MC6809/__init__.py @@ -2,5 +2,6 @@ MC6809 CPU emulator written in Python """ -__version__ = '0.7.2' +# See https://packaging.python.org/en/latest/specifications/version-specifiers/ +__version__ = '0.7.3' __author__ = 'Jens Diemer ' diff --git a/MC6809/__main__.py b/MC6809/__main__.py index aa15be2..69e5b84 100644 --- a/MC6809/__main__.py +++ b/MC6809/__main__.py @@ -4,11 +4,7 @@ """ -from MC6809.cli import cli_app - - -def main(): - cli_app.main() +from MC6809.cli_app import main if __name__ == '__main__': diff --git a/MC6809/cli/__init__.py b/MC6809/cli/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/MC6809/cli/cli_app.py b/MC6809/cli/cli_app.py deleted file mode 100644 index 1b029e2..0000000 --- a/MC6809/cli/cli_app.py +++ /dev/null @@ -1,113 +0,0 @@ -""" - CLI for usage -""" -import cProfile -import logging -import pstats -import sys -from pathlib import Path - -import rich_click as click -from bx_py_utils.path import assert_is_file -from cli_base.cli_tools.version_info import print_version -from rich.console import Console -from rich.traceback import install as rich_traceback_install -from rich_click import RichGroup - -import MC6809 -from MC6809 import constants -from MC6809.core.bechmark import run_benchmark - - -logger = logging.getLogger(__name__) - - -PACKAGE_ROOT = Path(MC6809.__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( - type=click.Path(exists=True, file_okay=False, dir_okay=True, readable=True, path_type=Path) -) -ARGUMENT_NOT_EXISTING_DIR = dict( - type=click.Path( - exists=False, - file_okay=False, - dir_okay=True, - readable=False, - writable=True, - path_type=Path, - ) -) -ARGUMENT_EXISTING_FILE = dict( - type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True, path_type=Path) -) - - -class ClickGroup(RichGroup): # FIXME: How to set the "info_name" easier? - def make_context(self, info_name, *args, **kwargs): - info_name = './cli.py' - return super().make_context(info_name, *args, **kwargs) - - -@click.group( - cls=ClickGroup, - epilog=constants.CLI_EPILOG, -) -def cli(): - pass - - -@click.command() -def version(): - """Print version and exit""" - # Pseudo command, because the version always printed on every CLI call ;) - sys.exit(0) - - -cli.add_command(version) - - -@click.command() -@click.option('--loops', type=int, default=6, show_default=True, help='How many benchmark loops should be run?') -@click.option('--multiply', type=int, default=15, show_default=True, help='est data multiplier') -def benchmark(loops, multiply): - """ - Run a MC6809 emulation benchmark - """ - run_benchmark(loops=loops, multiply=multiply) - - -cli.add_command(benchmark) - - -@click.command() -@click.option('--loops', type=int, default=6, show_default=True, help='How many benchmark loops should be run?') -@click.option('--multiply', type=int, default=15, show_default=True, help='est data multiplier') -def profile(loops, multiply): - """ - Profile the MC6809 emulation benchmark - """ - with cProfile.Profile() as pr: - run_benchmark(loops=loops, multiply=multiply) - pstats.Stats(pr).sort_stats('tottime', 'cumulative', 'calls').print_stats(20) - - -cli.add_command(profile) - - -def main(): - print_version(MC6809) - - console = Console() - rich_traceback_install( - width=console.size.width, # full terminal width - show_locals=True, - suppress=[click], - max_frames=2, - ) - - # Execute Click CLI: - cli.name = './cli.py' - cli() diff --git a/MC6809/cli/dev.py b/MC6809/cli/dev.py deleted file mode 100644 index 7ef121c..0000000 --- a/MC6809/cli/dev.py +++ /dev/null @@ -1,281 +0,0 @@ -""" - CLI for development -""" -import logging -import sys -from pathlib import Path - -import rich_click as click -from bx_py_utils.path import assert_is_file -from cli_base.cli_tools import code_style -from cli_base.cli_tools.dev_tools import run_coverage, run_tox, run_unittest_cli -from cli_base.cli_tools.subprocess_utils import verbose_check_call -from cli_base.cli_tools.test_utils.snapshot import UpdateTestSnapshotFiles -from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE -from cli_base.cli_tools.version_info import print_version -from manageprojects.utilities.publish import publish_package -from rich.console import Console -from rich.traceback import install as rich_traceback_install -from rich_click import RichGroup - -import MC6809 -from MC6809 import constants -from MC6809.constants import BASE_PATH - - -logger = logging.getLogger(__name__) - - -PACKAGE_ROOT = BASE_PATH.parent -assert_is_file(PACKAGE_ROOT / 'pyproject.toml') # Exists only in cloned git repo - - -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( - type=click.Path(exists=True, file_okay=False, dir_okay=True, readable=True, path_type=Path) -) -ARGUMENT_NOT_EXISTING_DIR = dict( - type=click.Path( - exists=False, - file_okay=False, - dir_okay=True, - readable=False, - writable=True, - path_type=Path, - ) -) -ARGUMENT_EXISTING_FILE = dict( - type=click.Path(exists=True, file_okay=True, dir_okay=False, readable=True, path_type=Path) -) - - -class ClickGroup(RichGroup): # FIXME: How to set the "info_name" easier? - def make_context(self, info_name, *args, **kwargs): - info_name = './dev-cli.py' - return super().make_context(info_name, *args, **kwargs) - - -@click.group( - cls=ClickGroup, - epilog=constants.CLI_EPILOG, -) -def cli(): - pass - - -@click.command() -@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) -def mypy(verbosity: int): - """Run Mypy (configured in pyproject.toml)""" - verbose_check_call('mypy', '.', cwd=PACKAGE_ROOT, verbose=verbosity > 0, exit_on_error=True) - - -cli.add_command(mypy) - - -@click.command() -def install(): - """ - Run pip-sync and install 'MC6809' via pip as editable. - """ - verbose_check_call('pip-sync', PACKAGE_ROOT / 'requirements.dev.txt') - verbose_check_call('pip', 'install', '--no-deps', '-e', '.') - - -cli.add_command(install) - - -@click.command() -def safety(): - """ - Run safety check against current requirements files - """ - verbose_check_call('safety', 'check', '-r', 'requirements.dev.txt') - - -cli.add_command(safety) - - -@click.command() -def update(): - """ - Update "requirements*.txt" dependencies files - """ - bin_path = Path(sys.executable).parent - - verbose_check_call(bin_path / 'pip', 'install', '-U', 'pip') - verbose_check_call(bin_path / 'pip', 'install', '-U', 'pip-tools') - - extra_env = dict( - CUSTOM_COMPILE_COMMAND='./dev-cli.py update', - ) - - pip_compile_base = [ - bin_path / 'pip-compile', - '--verbose', - '--allow-unsafe', # https://pip-tools.readthedocs.io/en/latest/#deprecations - '--resolver=backtracking', # https://pip-tools.readthedocs.io/en/latest/#deprecations - '--upgrade', - '--generate-hashes', - ] - - # Only "prod" dependencies: - verbose_check_call( - *pip_compile_base, - 'pyproject.toml', - '--output-file', - 'requirements.txt', - extra_env=extra_env, - ) - - # dependencies + "dev"-optional-dependencies: - verbose_check_call( - *pip_compile_base, - 'pyproject.toml', - '--extra=dev', - '--output-file', - 'requirements.dev.txt', - extra_env=extra_env, - ) - - verbose_check_call(bin_path / 'safety', 'check', '-r', 'requirements.dev.txt') - - # Install new dependencies in current .venv: - verbose_check_call(bin_path / 'pip-sync', 'requirements.dev.txt') - - -cli.add_command(update) - - -@click.command() -def publish(): - """ - Build and upload this project to PyPi - """ - run_unittest_cli(verbose=False, exit_after_run=False) # Don't publish a broken state - - publish_package( - module=MC6809, - package_path=PACKAGE_ROOT, - distribution_name='MC6809', - ) - - -cli.add_command(publish) - - -@click.command() -@click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) -@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) -def fix_code_style(color: bool, verbosity: int): - """ - Fix code style of all MC6809 source code files via darker - """ - code_style.fix(package_root=PACKAGE_ROOT, darker_color=color, darker_verbose=verbosity > 0) - - -cli.add_command(fix_code_style) - - -@click.command() -@click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) -@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) -def check_code_style(color: bool, verbosity: int): - """ - Check code style by calling darker + flake8 - """ - code_style.check(package_root=PACKAGE_ROOT, darker_color=color, darker_verbose=verbosity > 0) - - -cli.add_command(check_code_style) - - -@click.command() -@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) -def update_test_snapshot_files(verbosity: int): - """ - Update all test snapshot files (by remove and recreate all snapshot files) - """ - - with UpdateTestSnapshotFiles(root_path=PACKAGE_ROOT, verbose=verbosity > 0): - # Just recreate them by running tests: - run_unittest_cli( - extra_env=dict( - RAISE_SNAPSHOT_ERRORS='0', # Recreate snapshot files without error - ), - verbose=verbosity > 1, - exit_after_run=False, - ) - - -cli.add_command(update_test_snapshot_files) - - -@click.command() # Dummy command -def test(): - """ - Run unittests - """ - run_unittest_cli() - - -cli.add_command(test) - - -@click.command() # Dummy command -def coverage(): - """ - Run tests and show coverage report. - """ - run_coverage() - - -cli.add_command(coverage) - - -@click.command() # Dummy "tox" command -def tox(): - """ - Run tox - """ - run_tox() - - -cli.add_command(tox) - - -@click.command() -def version(): - """Print version and exit""" - # Pseudo command, because the version always printed on every CLI call ;) - sys.exit(0) - - -cli.add_command(version) - - -def main(): - print_version(MC6809) - - console = Console() - rich_traceback_install( - width=console.size.width, # full terminal width - show_locals=True, - suppress=[click], - max_frames=2, - ) - - if len(sys.argv) >= 2: - # Check if we can just pass a command call to origin CLI: - command = sys.argv[1] - command_map = { - 'test': run_unittest_cli, - 'tox': run_tox, - 'coverage': run_coverage, - } - if real_func := command_map.get(command): - real_func(argv=sys.argv, exit_after_run=True) - - # Execute Click CLI: - cli() diff --git a/MC6809/cli_app/__init__.py b/MC6809/cli_app/__init__.py new file mode 100644 index 0000000..669d230 --- /dev/null +++ b/MC6809/cli_app/__init__.py @@ -0,0 +1,61 @@ +""" + CLI for usage +""" + +import logging +import sys + +import rich_click as click +from cli_base.autodiscover import import_all_files +from cli_base.cli_tools.version_info import print_version +from rich import print # noqa +from rich.console import Console +from rich.traceback import install as rich_traceback_install +from rich_click import RichGroup + +import MC6809 +from MC6809 import constants + + +logger = logging.getLogger(__name__) + + +class ClickGroup(RichGroup): # FIXME: How to set the "info_name" easier? + def make_context(self, info_name, *args, **kwargs): + info_name = './cli.py' + return super().make_context(info_name, *args, **kwargs) + + +@click.group( + cls=ClickGroup, + epilog=constants.CLI_EPILOG, +) +def cli(): + pass + + +# Register all click commands, just by import all files in this package: +import_all_files(package=__package__, init_file=__file__) + + +@cli.command() +def version(): + """Print version and exit""" + # Pseudo command, because the version always printed on every CLI call ;) + sys.exit(0) + + +def main(): + print_version(MC6809) + + console = Console() + rich_traceback_install( + width=console.size.width, # full terminal width + show_locals=True, + suppress=[click], + max_frames=2, + ) + + # Execute Click CLI: + cli.name = './cli.py' + cli() diff --git a/MC6809/cli_app/mc6809.py b/MC6809/cli_app/mc6809.py new file mode 100644 index 0000000..bd28ac0 --- /dev/null +++ b/MC6809/cli_app/mc6809.py @@ -0,0 +1,33 @@ +import cProfile +import logging +import pstats + +import rich_click as click + +from MC6809.cli_app import cli +from MC6809.core.bechmark import run_benchmark + + +logger = logging.getLogger(__name__) + + +@cli.command() +@click.option('--loops', type=int, default=6, show_default=True, help='How many benchmark loops should be run?') +@click.option('--multiply', type=int, default=15, show_default=True, help='est data multiplier') +def benchmark(loops, multiply): + """ + Run a MC6809 emulation benchmark + """ + run_benchmark(loops=loops, multiply=multiply) + + +@cli.command() +@click.option('--loops', type=int, default=6, show_default=True, help='How many benchmark loops should be run?') +@click.option('--multiply', type=int, default=15, show_default=True, help='est data multiplier') +def profile(loops, multiply): + """ + Profile the MC6809 emulation benchmark + """ + with cProfile.Profile() as pr: + run_benchmark(loops=loops, multiply=multiply) + pstats.Stats(pr).sort_stats('tottime', 'cumulative', 'calls').print_stats(20) diff --git a/MC6809/cli_app/update_readme_history.py b/MC6809/cli_app/update_readme_history.py new file mode 100644 index 0000000..cdbf107 --- /dev/null +++ b/MC6809/cli_app/update_readme_history.py @@ -0,0 +1,27 @@ +import sys + +import rich_click as click +from cli_base.cli_tools import git_history +from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE, setup_logging +from rich import print # noqa + +from MC6809.cli_app import cli + + +@cli.command() +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def update_readme_history(verbosity: int): + """ + Update project history base on git commits/tags in README.md + + Will be exited with 1 if the README.md was updated otherwise with 0. + + Also, callable via e.g.: + python -m cli_base update-readme-history -v + """ + setup_logging(verbosity=verbosity) + updated = git_history.update_readme_history(verbosity=verbosity) + exit_code = 1 if updated else 0 + if verbosity: + print(f'{exit_code=}') + sys.exit(exit_code) diff --git a/MC6809/cli_dev/__init__.py b/MC6809/cli_dev/__init__.py new file mode 100644 index 0000000..c262d5c --- /dev/null +++ b/MC6809/cli_dev/__init__.py @@ -0,0 +1,82 @@ +""" + CLI for development +""" + +import logging +import sys + +import rich_click as click +from bx_py_utils.path import assert_is_file +from cli_base.autodiscover import import_all_files +from cli_base.cli_tools.dev_tools import run_coverage, run_tox, run_unittest_cli +from cli_base.cli_tools.version_info import print_version +from rich.console import Console +from rich.traceback import install as rich_traceback_install +from rich_click import RichGroup +from typeguard import install_import_hook + +import MC6809 +from MC6809 import constants + + +# Check type annotations via typeguard in all tests. +# Sadly we must activate this here and can't do this in ./tests/__init__.py +install_import_hook(packages=('MC6809',)) + + +logger = logging.getLogger(__name__) + + +PACKAGE_ROOT = constants.BASE_PATH.parent +assert_is_file(PACKAGE_ROOT / 'pyproject.toml') # Exists only in cloned git repo + + +class ClickGroup(RichGroup): # FIXME: How to set the "info_name" easier? + def make_context(self, info_name, *args, **kwargs): + info_name = './dev-cli.py' + return super().make_context(info_name, *args, **kwargs) + + +@click.group( + cls=ClickGroup, + epilog=constants.CLI_EPILOG, +) +def cli(): + pass + + +# Register all click commands, just by import all files in this package: +import_all_files(package=__package__, init_file=__file__) + + +@cli.command() +def version(): + """Print version and exit""" + # Pseudo command, because the version always printed on every CLI call ;) + sys.exit(0) + + +def main(): + print_version(MC6809) + + console = Console() + rich_traceback_install( + width=console.size.width, # full terminal width + show_locals=True, + suppress=[click], + max_frames=2, + ) + + if len(sys.argv) >= 2: + # Check if we can just pass a command call to origin CLI: + command = sys.argv[1] + command_map = { + 'test': run_unittest_cli, + 'tox': run_tox, + 'coverage': run_coverage, + } + if real_func := command_map.get(command): + real_func(argv=sys.argv, exit_after_run=True) + + # Execute Click CLI: + cli() diff --git a/MC6809/cli_dev/code_style.py b/MC6809/cli_dev/code_style.py new file mode 100644 index 0000000..50fefc2 --- /dev/null +++ b/MC6809/cli_dev/code_style.py @@ -0,0 +1,26 @@ +import rich_click as click +from cli_base.cli_tools import code_style +from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE +from cli_base.click_defaults import OPTION_ARGS_DEFAULT_TRUE + +from MC6809.cli_dev import PACKAGE_ROOT, cli + + +@cli.command() +@click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def fix_code_style(color: bool, verbosity: int): + """ + Fix code style of all cli_base source code files via darker + """ + code_style.fix(package_root=PACKAGE_ROOT, darker_color=color, darker_verbose=verbosity > 0) + + +@cli.command() +@click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def check_code_style(color: bool, verbosity: int): + """ + Check code style by calling darker + flake8 + """ + code_style.check(package_root=PACKAGE_ROOT, darker_color=color, darker_verbose=verbosity > 0) diff --git a/MC6809/cli_dev/packaging.py b/MC6809/cli_dev/packaging.py new file mode 100644 index 0000000..e0df6c4 --- /dev/null +++ b/MC6809/cli_dev/packaging.py @@ -0,0 +1,85 @@ +import sys +from pathlib import Path + +import cli_base +import click +from cli_base.cli_tools.dev_tools import run_unittest_cli +from cli_base.cli_tools.subprocess_utils import verbose_check_call +from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE +from cli_base.run_pip_audit import run_pip_audit +from manageprojects.utilities.publish import publish_package + +from MC6809.cli_dev import PACKAGE_ROOT, cli + + +@cli.command() +def install(): + """ + Run pip-sync and install 'cli_base' via pip as editable. + """ + verbose_check_call('pip-sync', PACKAGE_ROOT / 'requirements.dev.txt') + verbose_check_call('pip', 'install', '--no-deps', '-e', '.') + + +@cli.command() +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def pip_audit(verbosity: int): + """ + Run pip-audit check against current requirements files + """ + run_pip_audit(base_path=PACKAGE_ROOT, verbosity=verbosity) + + +@cli.command() +def update(): + """ + Update "requirements*.txt" dependencies files + """ + bin_path = Path(sys.executable).parent + + verbose_check_call(bin_path / 'pip', 'install', '-U', 'pip') + verbose_check_call(bin_path / 'pip', 'install', '-U', 'pip-tools') + + extra_env = dict( + CUSTOM_COMPILE_COMMAND='./dev-cli.py update', + ) + + pip_compile_base = [bin_path / 'pip-compile', '--verbose', '--upgrade'] + + # Only "prod" dependencies: + verbose_check_call( + *pip_compile_base, + 'pyproject.toml', + '--output-file', + 'requirements.txt', + extra_env=extra_env, + ) + + # dependencies + "dev"-optional-dependencies: + verbose_check_call( + *pip_compile_base, + 'pyproject.toml', + '--extra=dev', + '--output-file', + 'requirements.dev.txt', + extra_env=extra_env, + ) + + run_pip_audit(base_path=PACKAGE_ROOT) + + # Install new dependencies in current .venv: + verbose_check_call(bin_path / 'pip-sync', 'requirements.dev.txt') + + +@cli.command() +def publish(): + """ + Build and upload this project to PyPi + """ + run_unittest_cli(verbose=False, exit_after_run=False) # Don't publish a broken state + + publish_package( + module=cli_base, + package_path=PACKAGE_ROOT, + distribution_name='cli-base-utilities', + ) diff --git a/MC6809/cli_dev/testing.py b/MC6809/cli_dev/testing.py new file mode 100644 index 0000000..5997448 --- /dev/null +++ b/MC6809/cli_dev/testing.py @@ -0,0 +1,56 @@ +import rich_click as click +from cli_base.cli_tools.dev_tools import run_coverage, run_tox, run_unittest_cli +from cli_base.cli_tools.subprocess_utils import verbose_check_call +from cli_base.cli_tools.test_utils.snapshot import UpdateTestSnapshotFiles +from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE + +from MC6809.cli_dev import PACKAGE_ROOT, cli + + +@cli.command() +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def mypy(verbosity: int): + """Run Mypy (configured in pyproject.toml)""" + verbose_check_call('mypy', '.', cwd=PACKAGE_ROOT, verbose=verbosity > 0, exit_on_error=True) + + +@cli.command() +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def update_test_snapshot_files(verbosity: int): + """ + Update all test snapshot files (by remove and recreate all snapshot files) + """ + + with UpdateTestSnapshotFiles(root_path=PACKAGE_ROOT, verbose=verbosity > 0): + # Just recreate them by running tests: + run_unittest_cli( + extra_env=dict( + RAISE_SNAPSHOT_ERRORS='0', # Recreate snapshot files without error + ), + verbose=verbosity > 1, + exit_after_run=False, + ) + + +@cli.command() # Dummy command +def test(): + """ + Run unittests + """ + run_unittest_cli() + + +@cli.command() # Dummy command +def coverage(): + """ + Run tests and show coverage report. + """ + run_coverage() + + +@cli.command() # Dummy "tox" command +def tox(): + """ + Run tox + """ + run_tox() diff --git a/MC6809/tests/__init__.py b/MC6809/tests/__init__.py index e530cc8..e6ca7ca 100644 --- a/MC6809/tests/__init__.py +++ b/MC6809/tests/__init__.py @@ -3,7 +3,7 @@ from pathlib import Path from bx_py_utils.test_utils.deny_requests import deny_any_real_request -from cli_base.cli_tools.verbosity import setup_logging +from cli_base.cli_tools.verbosity import MAX_LOG_LEVEL, setup_logging from rich import print # noqa @@ -19,7 +19,7 @@ def pre_configure_tests() -> None: deny_any_real_request() # Display DEBUG logs in tests: - setup_logging(verbosity=2) + setup_logging(verbosity=MAX_LOG_LEVEL) def load_tests(loader, tests, pattern): diff --git a/MC6809/tests/test_project_setup.py b/MC6809/tests/test_project_setup.py index dc5279a..3f43a3f 100644 --- a/MC6809/tests/test_project_setup.py +++ b/MC6809/tests/test_project_setup.py @@ -7,7 +7,7 @@ from packaging.version import Version from MC6809 import __version__ -from MC6809.cli.dev import PACKAGE_ROOT +from MC6809.cli_dev import PACKAGE_ROOT class ProjectSetupTestCase(TestCase): diff --git a/MC6809/tests/test_readme.py b/MC6809/tests/test_readme.py index 5dacfe5..adf2b12 100644 --- a/MC6809/tests/test_readme.py +++ b/MC6809/tests/test_readme.py @@ -4,8 +4,9 @@ from manageprojects.tests.base import BaseTestCase from MC6809 import constants -from MC6809.cli.cli_app import PACKAGE_ROOT, cli -from MC6809.cli.dev import cli as dev_cli +from MC6809.cli_app import cli +from MC6809.cli_dev import PACKAGE_ROOT +from MC6809.cli_dev import cli as dev_cli def assert_cli_help_in_readme(text_block: str, marker: str): diff --git a/MC6809/tests/test_readme_history.py b/MC6809/tests/test_readme_history.py index a2f57d7..488d41b 100644 --- a/MC6809/tests/test_readme_history.py +++ b/MC6809/tests/test_readme_history.py @@ -4,7 +4,7 @@ from cli_base.cli_tools.git_history import get_git_history import MC6809 -from MC6809.cli.cli_app import PACKAGE_ROOT +from MC6809.cli_dev import PACKAGE_ROOT class ReadmeHistoryTestCase(TestCase): diff --git a/MC6809/utils/humanize.py b/MC6809/utils/humanize.py index 7ccc76e..8b29296 100644 --- a/MC6809/utils/humanize.py +++ b/MC6809/utils/humanize.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - """ DragonPy - Humanize =================== @@ -9,7 +7,6 @@ """ -import locale import platform import sys @@ -21,12 +18,7 @@ def locale_format_number(val): > locale_format_number(1234567.89) '1.234.567.890' """ - try: - return locale.format('%d', val, 1) - except UnicodeDecodeError: - # For PyPy3, see: https://bitbucket.org/pypy/pypy/issue/1858/pypy3-localeformat-d-val-1 - # return '{:n}'.format(val) # makes 1234567890.1234 to 1,23457e+09 :( - return f'{int(val):,}' + return f'{int(val):,}' def byte2bit_string(data): @@ -95,8 +87,3 @@ def get_python_info(): sys.executable, sys.version.replace("\n", " ") ) - - -if __name__ == "__main__": - import doctest - print(doctest.testmod(verbose=0)) diff --git a/README.md b/README.md index 0f954f6..3c9dfe6 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,10 @@ Usage: ./cli.py [OPTIONS] COMMAND [ARGS]... │ --help Show this message and exit. │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮ -│ benchmark Run a MC6809 emulation benchmark │ -│ profile Profile the MC6809 emulation benchmark │ -│ version Print version and exit │ +│ benchmark Run a MC6809 emulation benchmark │ +│ profile Profile the MC6809 emulation benchmark │ +│ update-readme-history Update project history base on git commits/tags in README.md │ +│ version Print version and exit │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` [comment]: <> (✂✂✂ auto generated main help end ✂✂✂) @@ -105,11 +106,11 @@ Usage: ./dev-cli.py [OPTIONS] COMMAND [ARGS]... ╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮ │ check-code-style Check code style by calling darker + flake8 │ │ coverage Run tests and show coverage report. │ -│ fix-code-style Fix code style of all MC6809 source code files via darker │ -│ install Run pip-sync and install 'MC6809' via pip as editable. │ +│ fix-code-style Fix code style of all cli_base source code files via darker │ +│ install Run pip-sync and install 'cli_base' via pip as editable. │ │ mypy Run Mypy (configured in pyproject.toml) │ +│ pip-audit Run pip-audit check against current requirements files │ │ publish Build and upload this project to PyPi │ -│ safety Run safety check against current requirements files │ │ test Run unittests │ │ tox Run tox │ │ update Update "requirements*.txt" dependencies files │ @@ -160,8 +161,10 @@ To make a new release, do this: [comment]: <> (✂✂✂ auto generated history start ✂✂✂) -* [**dev**](https://github.com/6809/MC6809/compare/v0.7.2...main) - * 2024-02-09 - Update requirements +* [v0.7.3](https://github.com/6809/MC6809/compare/v0.7.2...v0.7.3) + * 2024-09-24 - + pre-commit hook + * 2024-09-24 - Split CLI by manageprojects updates + * 2024-09-24 - Update requirements * 2023-11-29 - Update requirements + fix code style + manageprojects updates * [v0.7.2](https://github.com/6809/MC6809/compare/v0.7.1...v0.7.2) * 2023-11-03 - Auto generate README history diff --git a/cli.py b/cli.py index e447dcb..ec38d64 100755 --- a/cli.py +++ b/cli.py @@ -41,14 +41,14 @@ def print_no_pip_error(): BIN_NAME = 'Scripts' FILE_EXT = '.exe' else: - # Files under Linux/Mac and all other than Windows, e.g.: .../.venv/bin/python + # Files under Linux/Mac and all other than Windows, e.g.: .../.venv/bin/python3 BIN_NAME = 'bin' FILE_EXT = '' BASE_PATH = Path(__file__).parent VENV_PATH = BASE_PATH / '.venv-app' BIN_PATH = VENV_PATH / BIN_NAME -PYTHON_PATH = BIN_PATH / f'python{FILE_EXT}' +PYTHON_PATH = BIN_PATH / f'python3{FILE_EXT}' PIP_PATH = BIN_PATH / f'pip{FILE_EXT}' PIP_SYNC_PATH = BIN_PATH / f'pip-sync{FILE_EXT}' @@ -87,17 +87,17 @@ def main(argv): # Create virtual env in ".venv/": if not PYTHON_PATH.is_file(): - print('Create virtual env here:', VENV_PATH.absolute()) + print(f'Create virtual env here: {VENV_PATH.absolute()}') builder = venv.EnvBuilder(symlinks=True, upgrade=True, with_pip=True) builder.create(env_dir=VENV_PATH) + + if not PROJECT_SHELL_SCRIPT.is_file() or not venv_up2date(): # Update pip verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip') - if not PIP_SYNC_PATH.is_file(): # Install pip-tools verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip-tools') - if not PROJECT_SHELL_SCRIPT.is_file() or not venv_up2date(): # install requirements via "pip-sync" verbose_check_call(PIP_SYNC_PATH, str(DEP_LOCK_PATH)) @@ -110,6 +110,9 @@ def main(argv): verbose_check_call(PROJECT_SHELL_SCRIPT, *argv[1:]) except subprocess.CalledProcessError as err: sys.exit(err.returncode) + except KeyboardInterrupt: + print('Bye!') + sys.exit(130) if __name__ == '__main__': diff --git a/dev-cli.py b/dev-cli.py index 6d3a970..92ae2e5 100755 --- a/dev-cli.py +++ b/dev-cli.py @@ -41,14 +41,14 @@ def print_no_pip_error(): BIN_NAME = 'Scripts' FILE_EXT = '.exe' else: - # Files under Linux/Mac and all other than Windows, e.g.: .../.venv/bin/python + # Files under Linux/Mac and all other than Windows, e.g.: .../.venv/bin/python3 BIN_NAME = 'bin' FILE_EXT = '' BASE_PATH = Path(__file__).parent VENV_PATH = BASE_PATH / '.venv' BIN_PATH = VENV_PATH / BIN_NAME -PYTHON_PATH = BIN_PATH / f'python{FILE_EXT}' +PYTHON_PATH = BIN_PATH / f'python3{FILE_EXT}' PIP_PATH = BIN_PATH / f'pip{FILE_EXT}' PIP_SYNC_PATH = BIN_PATH / f'pip-sync{FILE_EXT}' @@ -87,17 +87,17 @@ def main(argv): # Create virtual env in ".venv/": if not PYTHON_PATH.is_file(): - print('Create virtual env here:', VENV_PATH.absolute()) + print(f'Create virtual env here: {VENV_PATH.absolute()}') builder = venv.EnvBuilder(symlinks=True, upgrade=True, with_pip=True) builder.create(env_dir=VENV_PATH) + + if not PROJECT_SHELL_SCRIPT.is_file() or not venv_up2date(): # Update pip verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip') - if not PIP_SYNC_PATH.is_file(): # Install pip-tools verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip-tools') - if not PROJECT_SHELL_SCRIPT.is_file() or not venv_up2date(): # install requirements via "pip-sync" verbose_check_call(PIP_SYNC_PATH, str(DEP_LOCK_PATH)) @@ -105,11 +105,18 @@ def main(argv): verbose_check_call(PIP_PATH, 'install', '--no-deps', '-e', '.') store_dep_hash() + # Activate git pre-commit hooks: + verbose_check_call(PYTHON_PATH, '-m', 'pre_commit', 'install') + verbose_check_call(PYTHON_PATH, '-m', 'pre_commit', 'autoupdate') + # Call our entry point CLI: try: verbose_check_call(PROJECT_SHELL_SCRIPT, *argv[1:]) except subprocess.CalledProcessError as err: sys.exit(err.returncode) + except KeyboardInterrupt: + print('Bye!') + sys.exit(130) if __name__ == '__main__': diff --git a/pyproject.toml b/pyproject.toml index b231ab6..83a2e83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,9 +7,9 @@ readme = "README.md" authors = [ {name = 'Jens Diemer', email = 'git@jensdiemer.de'} ] -requires-python = ">=3.9,<4" +requires-python = ">=3.11" dependencies = [ - "cli-base-utilities>=0.3.0", # https://github.com/jedie/cli-base-utilities + "cli-base-utilities", # https://github.com/jedie/cli-base-utilities "bx_py_utils", # https://github.com/boxine/bx_py_utils "click", # https://github.com/pallets/click/ "rich-click", # https://github.com/ewels/rich-click @@ -18,6 +18,7 @@ dependencies = [ [project.optional-dependencies] dev = [ "manageprojects", # https://github.com/jedie/manageprojects + "urllib3", # for bx_py_utils.test_utils.deny_requests.deny_any_real_request() in tests "pip-tools", # https://github.com/jazzband/pip-tools/ "tox", # https://github.com/tox-dev/tox "coverage", # https://github.com/nedbat/coveragepy @@ -28,9 +29,11 @@ dev = [ "pyflakes", # https://github.com/PyCQA/pyflakes "codespell", # https://github.com/codespell-project/codespell "EditorConfig", # https://github.com/editorconfig/editorconfig-core-py - "safety", # https://github.com/pyupio/safety + "pip-audit", # https://github.com/pypa/pip-audit "mypy", # https://github.com/python/mypy "twine", # https://github.com/pypa/twine + "pre-commit", # https://github.com/pre-commit/pre-commit + "typeguard", # https://github.com/agronholm/typeguard/ # https://github.com/akaihola/darker # https://github.com/ikamensh/flynt @@ -38,20 +41,31 @@ dev = [ # https://github.com/pygments/pygments "darker[flynt, isort, color]", - "tomli", # https://github.com/hukkin/tomli - # - # tomli only needed for Python <3.11, but see pip bug: - # https://github.com/pypa/pip/issues/9644 / https://github.com/jazzband/pip-tools/issues/1866 - #'tomli;python_version<"3.11"', # https://github.com/hukkin/tomli + # Work-a-round for: https://github.com/jazzband/pip-tools/issues/1866 + # see also: https://github.com/jazzband/pip-tools/issues/994#issuecomment-1321226661 + # backports.tarfile is needed for python <3.12 + 'backports.tarfile', # via jaraco-context -> keyring -> twine ] +[tool.pip-tools.compile] +index-url="https://pypi.org/simple" +extra-index-url=["https://www.piwheels.org/simple"] # Add hashes of piwheels packages, too! +generate-hashes = true +# https://pip-tools.readthedocs.io/en/stable/#deprecations +allow-unsafe = true +resolver="backtracking" +strip-extras = true + [project.urls] Documentation = "https://github.com/6809/MC6809" Source = "https://github.com/6809/MC6809" [project.scripts] MC6809_app = "MC6809.__main__:main" -MC6809_dev = "MC6809.cli.dev:main" +MC6809_dev = "MC6809.cli_dev:main" + +[tool.cli_base] +version_module_name = "MC6809" # Used by "update-readme-history" git hook [build-system] requires = ["setuptools>=61.0", "setuptools_scm>=7.1"] @@ -65,18 +79,23 @@ include = ["MC6809*"] version = {attr = "MC6809.__version__"} +[tool.cli_base.pip_audit] +requirements=["requirements.dev.txt"] +strict=true +require_hashes=true +ignore-vuln=[] + + [tool.darker] src = ['.'] revision = "origin/main..." line_length = 119 -verbose = true color = true skip_string_normalization = true diff = false check = false stdout = false isort = true -flynt = true lint = [ "flake8", ] @@ -117,7 +136,7 @@ exclude_lines = [ legacy_tox_ini = """ [tox] isolated_build = True -envlist = py{312,311,310,39} +envlist = py{312,311} skip_missing_interpreters = True [testenv] @@ -128,9 +147,6 @@ commands_pre = pip-sync requirements.dev.txt commands = {envpython} -m coverage run --context='{envname}' - {envpython} -m coverage combine --append - {envpython} -m coverage xml - {envpython} -m coverage report """ @@ -150,6 +166,7 @@ cookiecutter_template = "https://github.com/jedie/cookiecutter_templates/" cookiecutter_directory = "piptools-python" applied_migrations = [ "a66e5ae", # 2024-01-16T19:13:13+01:00 + "56c3caa", # 2024-09-22T16:52:30+02:00 ] [manageprojects.cookiecutter_context.cookiecutter] diff --git a/requirements.dev.txt b/requirements.dev.txt index 7cd8e01..6d0cc36 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -4,10 +4,8 @@ # # ./dev-cli.py update # -annotated-types==0.7.0 \ - --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ - --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 - # via pydantic +--extra-index-url https://www.piwheels.org/simple + arrow==1.3.0 \ --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 \ --hash=sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85 @@ -18,26 +16,30 @@ astor==0.8.1 \ # via flynt async-timeout==4.0.3 \ --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ - --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 + --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 \ + --hash=sha256:fd893e4cb1d9dff66d0e0576cc6376a23eacbbcd43b6607e4d3ecfae1ab15367 # via cli-base-utilities attrs==24.2.0 \ + --hash=sha256:09df292052496e45c3edea6e1046968c7e5231b5fee8106a49f950b42dd5eeef \ --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 # via flake8-bugbear -authlib==1.3.2 \ - --hash=sha256:4b16130117f9eb82aa6eec97f6dd4673c3f960ac0283ccdae2897ee4bc030ba2 \ - --hash=sha256:ede026a95e9f5cdc2d4364a52103f5405e75aa156357e831ef2bfd0bc5094dfc - # via safety autoflake==2.3.1 \ --hash=sha256:3ae7495db9084b7b32818b4140e6dc4fc280b712fb414f5b8fe57b0a8e85a840 \ --hash=sha256:c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e # via manageprojects autopep8==2.3.1 \ --hash=sha256:8d6c87eba648fdcfc83e29b788910b8643171c395d9c4bcf115ece035b9c9dda \ - --hash=sha256:a203fe0fcad7939987422140ab17a930f684763bf7335bdb6709991dd7ef6c2d + --hash=sha256:a203fe0fcad7939987422140ab17a930f684763bf7335bdb6709991dd7ef6c2d \ + --hash=sha256:e889a44238a4d9a64d74d6e7b81c65a9c2d2dcd5dc898a6d054568c0d2479e0e # via # MC6809 (pyproject.toml) # manageprojects +backports-tarfile==1.2.0 \ + --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ + --hash=sha256:7ecb5ff4d016780ea7a9c7d0230e566f658bc0e192a6c02e3cfef76975659663 \ + --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 + # via MC6809 (pyproject.toml) binaryornot==0.4.4 \ --hash=sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061 \ --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 @@ -66,21 +68,36 @@ black==24.8.0 \ --hash=sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920 \ --hash=sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1 # via darker +boolean-py==4.0 \ + --hash=sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4 \ + --hash=sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd \ + --hash=sha256:7400ad07f5606b59271a9762f58ea131b77644f4d56dd6df5b7dff0fa1706515 + # via license-expression build==1.2.2 \ --hash=sha256:119b2fb462adef986483438377a13b2f42064a2a3a4161f24a0cca698a07ac8c \ - --hash=sha256:277ccc71619d98afdd841a0e96ac9fe1593b823af481d3b0cea748e8894e0613 + --hash=sha256:277ccc71619d98afdd841a0e96ac9fe1593b823af481d3b0cea748e8894e0613 \ + --hash=sha256:45b7d306fed5299c934f42ead7fc470286a3a30c957e44246ad982ab285fbb43 # via pip-tools bx-py-utils==104 \ --hash=sha256:508cfc1d0fa6c22298f697c4efaa913337847d488d8a53eeccfae9ee106123f6 \ + --hash=sha256:77fddff99aaf2cb558ce2974ef66d0e7a4d48cca1cbb99e43eca0d8b77fa07fc \ --hash=sha256:c92ebc4fb122e3e3c228d984d0a1f5c3284c3da6aab1a1c753f7eb1f71bdab3a # via # MC6809 (pyproject.toml) # cli-base-utilities +cachecontrol==0.14.0 \ + --hash=sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938 \ + --hash=sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0 + # via + # cachecontrol + # pip-audit cachetools==5.5.0 \ --hash=sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292 \ - --hash=sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a + --hash=sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a \ + --hash=sha256:bb8dc9a16172c8165e14b83c01b3dcb4070993ab743bbaaee6bf6656397843f6 # via tox certifi==2024.8.30 \ + --hash=sha256:3dffae5ce57c3934b457066e04f14270151dd908412a601a3abb554c5acff9d4 \ --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 # via requests @@ -140,6 +157,7 @@ cffi==1.17.1 \ --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ + --hash=sha256:df27fb06fb48fa1ca9b2a87f05bae8ff3edc0ac5d8c65e8f77df3f9987a1b36b \ --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ @@ -153,8 +171,14 @@ cffi==1.17.1 \ --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b # via cryptography +cfgv==3.4.0 \ + --hash=sha256:a26cde6f2dbc2fb41e75d59fe67f9a9deb9c0257659fd357194e97f3e0891297 \ + --hash=sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9 \ + --hash=sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560 + # via pre-commit chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ + --hash=sha256:5e60dfdc063399966f1864c5cfdb9dfeb45361dc57770ddf07eea37f6bea3019 \ --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 # via # binaryornot @@ -198,6 +222,7 @@ charset-normalizer==3.3.2 \ --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ + --hash=sha256:7c3627434be5f9e083deea5193461b7b75bc51b47cecf0a7cacf66f34d3394bf \ --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ @@ -252,12 +277,14 @@ charset-normalizer==3.3.2 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests cli-base-utilities==0.11.0 \ + --hash=sha256:22c01bffece11781db0cba2110e9bf721361d50fb8a877bd251422ebaf3daee9 \ --hash=sha256:2c674f3af4898f97d101f6687fb45e85a4b996b93fb9a155a29b4daaf302dc43 \ --hash=sha256:fc503f8df7e19653167ebd12551718aa0c114114b959f177be2092eab1ce1b11 # via # MC6809 (pyproject.toml) # manageprojects click==8.1.7 \ + --hash=sha256:8e38806544348fdafedd47e92e90aca882377a0680918dec4c80c225a0e5ed13 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via @@ -268,9 +295,8 @@ click==8.1.7 \ # manageprojects # pip-tools # rich-click - # safety - # typer codespell==2.3.0 \ + --hash=sha256:2aadc005c73e46f364d90ad2ec53f4f5e725eecc9947a4279eded22a4a38eeec \ --hash=sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f \ --hash=sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1 # via @@ -282,13 +308,15 @@ colorama==0.4.6 \ # via tox cookiecutter==2.6.0 \ --hash=sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d \ - --hash=sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c + --hash=sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c \ + --hash=sha256:e24aa0a6aee3b225cb4cf395ad2e11b82f2737e57ab863cbfc120a21830fd09b # via manageprojects coverage==7.6.1 \ --hash=sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca \ --hash=sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d \ --hash=sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6 \ --hash=sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989 \ + --hash=sha256:0efc26b3345182f40b1e05ffe3a83052922861b84c3d1758b13a1845364a915b \ --hash=sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c \ --hash=sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b \ --hash=sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223 \ @@ -303,6 +331,7 @@ coverage==7.6.1 \ --hash=sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8 \ --hash=sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f \ --hash=sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a \ + --hash=sha256:4bbacd18d4462035cb435c0e223825c7a38fec63984cf53302071f8043fa17a0 \ --hash=sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962 \ --hash=sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8 \ --hash=sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391 \ @@ -365,6 +394,7 @@ cryptography==43.0.1 \ --hash=sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062 \ --hash=sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2 \ --hash=sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4 \ + --hash=sha256:48f856c79ff4dd4f0ddbca8af99957730b34d8ead94b016e7bfc1f045e5450a4 \ --hash=sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1 \ --hash=sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85 \ --hash=sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84 \ @@ -386,10 +416,13 @@ cryptography==43.0.1 \ --hash=sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034 \ --hash=sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a \ --hash=sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289 - # via - # authlib - # secretstorage -darker[color,flynt,isort]==2.1.1 \ + # via secretstorage +cyclonedx-python-lib==7.6.1 \ + --hash=sha256:42e510e957c2ce9c71dd33020e43ce53fe6d0c854cfdc3c56e854e9461e846eb \ + --hash=sha256:6570f14ad191c4c2a87032f4fb0fc913e5c37a43a577898daeb42a3079e52126 + # via pip-audit +darker==2.1.1 \ + --hash=sha256:0ce80b96fb84f5f312a34d6a9b3235d51a7884340ff55ada41fb2f030a5bfc5b \ --hash=sha256:a6e6a682c0604e76fe9aec7650e96a944f517563c69b28fcc076db9d957d98ea \ --hash=sha256:ead701414c45359fc0312bc285614d3285fc135476d43f3bc08d989ee19d9020 # via @@ -397,26 +430,28 @@ darker[color,flynt,isort]==2.1.1 \ # manageprojects darkgraylib==1.2.1 \ --hash=sha256:60c59de69842367ce0c78c32c451fa8e9d29500e681312d9864a7416bcdb7792 \ - --hash=sha256:a5dd6a2015a470d9047278cdd01a91ccb1d746675f8fd4562b3b5f6b8cbda930 + --hash=sha256:a5dd6a2015a470d9047278cdd01a91ccb1d746675f8fd4562b3b5f6b8cbda930 \ + --hash=sha256:dfa96200aa470455c55cc5160bbec05f262843e2a953b3e35a147ee4ec062c63 # via # darker # graylint +defusedxml==0.7.1 \ + --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 + # via py-serializable distlib==0.3.8 \ --hash=sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784 \ + --hash=sha256:0444bad8dcf71ec6c3281939ed79fe8a3a278dd0745b8e6d1374d038dd5d64c7 \ --hash=sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64 # via virtualenv docutils==0.21.2 \ --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ - --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 \ + --hash=sha256:f6c6a2ce2fceaf3a3bb162dd3b43ee5aa6b481f363d1af4021f7f194d94f0eea # via readme-renderer -dparse==0.6.4b0 \ - --hash=sha256:592ff183348b8a5ea0a18442a7965e29445d3a26063654ec2c7e8ef42cd5753c \ - --hash=sha256:f8d49b41a527f3d16a269f854e6665245b325e50e41d2c213810cb984553e5c8 - # via - # safety - # safety-schemas editorconfig==0.12.4 \ - --hash=sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80 + --hash=sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80 \ + --hash=sha256:bc3762aae43e78db19a28f21438d90d176e8a7a78b62c4b9b01b36c796863e9f # via # MC6809 (pyproject.toml) # manageprojects @@ -424,10 +459,12 @@ filelock==3.16.1 \ --hash=sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0 \ --hash=sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435 # via + # cachecontrol # tox # virtualenv flake8==7.1.1 \ --hash=sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38 \ + --hash=sha256:1655b1e0ef48cb379a4893ac851225d58392ccde0b16e41395b7960af51e66ce \ --hash=sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213 # via # MC6809 (pyproject.toml) @@ -435,64 +472,89 @@ flake8==7.1.1 \ # manageprojects flake8-bugbear==24.8.19 \ --hash=sha256:25bc3867f7338ee3b3e0916bf8b8a0b743f53a9a5175782ddc4325ed4f386b89 \ + --hash=sha256:4ee3d12e790c70021a269d60f391efdda17381de3c1f83553cbe01cafc96558d \ --hash=sha256:9b77627eceda28c51c27af94560a72b5b2c97c016651bdce45d8f56c180d2d32 # via # MC6809 (pyproject.toml) # manageprojects flynt==1.0.1 \ --hash=sha256:65d1c546434827275123222a98408e9561bcd67db832dd58f530ff17b8329ec1 \ + --hash=sha256:7f8b46341eabefeee5a14b4284a547ee0eafb9b447f2b3c227de2fbb5c769305 \ --hash=sha256:988aac00672a5469726cc0a17cef7d1178c284a9fe8563458db2475d0aaed965 # via darker graylint==1.1.1 \ --hash=sha256:0fd8e02972ca03d0ef2bf0adea76b5343efcd492d7afb5f658f3e3a724f55a36 \ + --hash=sha256:a895ab9b4fc0666a24979b5e769df2c964189bfaad8f6a86684c980dea5634f3 \ --hash=sha256:b7e0eab6c159684dbf5ef84e942c3340f6a6549b02a3d11b1a1763cc4f8f0593 # via darker +html5lib==1.1 \ + --hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d \ + --hash=sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f \ + --hash=sha256:e6a6ca5b1d876bce04ea36e2dd747a45b36fe3d9ac4db0b8437f46842fbebcbf + # via pip-audit +identify==2.6.1 \ + --hash=sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0 \ + --hash=sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98 \ + --hash=sha256:fabaffe28c2f7e909ce6424a31ca8ee25b4c90beee6ca5900c5fdb77b2ef6aee + # via pre-commit idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests importlib-metadata==8.5.0 \ + --hash=sha256:25fdeef51551b4bf26b88884dea00a484828b76d3bf033b01fd7db602b15c78b \ --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 # via twine isort==5.13.2 \ + --hash=sha256:34a146c22c83acbd192a848e12a9b5e6bc14ef3d17f38fd5ad22a0b0488b87ba \ --hash=sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109 \ --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 # via darker jaraco-classes==3.4.0 \ + --hash=sha256:3eee3025d493c64ae6f07a075647b8a31f6ab52633465398b64254d842aa694f \ --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \ --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 # via keyring jaraco-context==6.0.1 \ --hash=sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3 \ + --hash=sha256:a8d40a2423da612544547753f21b6d901437836453ba240d734bccf9b7ee48d7 \ --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 # via keyring jaraco-functools==4.0.2 \ + --hash=sha256:089319bf84b20bc74cc019b25619b203f0cedec1a1942e50851709a307d4e20b \ --hash=sha256:3460c74cd0d32bf82b9576bbb3527c4364d5b27a21f5158a62aed6c4b42e23f5 \ --hash=sha256:c9d16a3ed4ccb5a889ad8e0b7a343401ee5b2a71cee6ed192d3f68bc351e94e3 # via keyring jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ - --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 \ + --hash=sha256:d33e9925c7f8fede3d08133df6499da70d87883dcb80a83d192d2f696cfd9467 # via # keyring # secretstorage jinja2==3.1.4 \ + --hash=sha256:2cc61acdcd68c66df952089a1f22f3a5047ecf02a4598de6d82ec2991f701077 \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - # via - # cookiecutter - # safety + # via cookiecutter keyring==25.4.1 \ + --hash=sha256:24996478704ab666032c630a4728ba286a6b545b5dc43a9418b442716980381e \ --hash=sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf \ --hash=sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b # via twine +license-expression==30.3.1 \ + --hash=sha256:4b67d089930f4c4ceaade36c74ae3529ea81a51c9ad425748c0d75a1111bcbf7 \ + --hash=sha256:60d5bec1f3364c256a92b9a08583d7ea933c7aa272c8d36d04144a89a3858c01 \ + --hash=sha256:97904b9185c7bbb1e98799606fa7424191c375e70ba63a524b6f7100e42ddc46 + # via cyclonedx-python-lib manageprojects==0.19.2 \ --hash=sha256:4c5649deb9791f3016c1848b34080e1564ea3bec2a8e25a09f9f0af9012086df \ --hash=sha256:5f9b7d692df1540b8787ae31acc9613270be01c7d4416aad77e5dee4ca97e363 # via MC6809 (pyproject.toml) markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ + --hash=sha256:6d00561ef69282f31c923e5520f8f7025f6c2bbd1d7796f3d730840cc54130a6 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich markupsafe==2.1.5 \ @@ -500,9 +562,11 @@ markupsafe==2.1.5 \ --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:192e316d05938784327f7e4970b0508ea32a03aad31988ba6623b1e4f460df02 \ --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2cd05d6c529898e729ea24672f95288cf2a2cb6f5a1b08b6800938e78135cb12 \ --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ @@ -533,6 +597,7 @@ markupsafe==2.1.5 \ --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:a89baf8dc3291ecfd0bee0732cf641f470ad6f05d4db9bb1be2c469c464e0b06 \ --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ @@ -557,13 +622,10 @@ markupsafe==2.1.5 \ --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via jinja2 -marshmallow==3.22.0 \ - --hash=sha256:4972f529104a220bb8637d595aa4c9762afbe7f7a77d82dc58c1615d70c5823e \ - --hash=sha256:71a2dce49ef901c3f97ed296ae5051135fd3febd2bf43afe0ae9a82143a494d9 - # via safety mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ - --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e \ + --hash=sha256:afd5dbbfbc7a5c66374ba2c14777063ec6fb2f0218bf1de55c65dbcf8a7f053d # via flake8 mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ @@ -571,10 +633,79 @@ mdurl==0.1.2 \ # via markdown-it-py more-itertools==10.5.0 \ --hash=sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef \ + --hash=sha256:10dc83c9dd717b6e23423252cef14a1f0efa9d91afed5a60905fef9d7639d0f1 \ --hash=sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6 # via # jaraco-classes # jaraco-functools +msgpack==1.1.0 \ + --hash=sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b \ + --hash=sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf \ + --hash=sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca \ + --hash=sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330 \ + --hash=sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f \ + --hash=sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f \ + --hash=sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39 \ + --hash=sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247 \ + --hash=sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b \ + --hash=sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c \ + --hash=sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7 \ + --hash=sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044 \ + --hash=sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6 \ + --hash=sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b \ + --hash=sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0 \ + --hash=sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2 \ + --hash=sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468 \ + --hash=sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7 \ + --hash=sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734 \ + --hash=sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434 \ + --hash=sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325 \ + --hash=sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1 \ + --hash=sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846 \ + --hash=sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88 \ + --hash=sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420 \ + --hash=sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e \ + --hash=sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2 \ + --hash=sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59 \ + --hash=sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb \ + --hash=sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68 \ + --hash=sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915 \ + --hash=sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f \ + --hash=sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701 \ + --hash=sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b \ + --hash=sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d \ + --hash=sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa \ + --hash=sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d \ + --hash=sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd \ + --hash=sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc \ + --hash=sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48 \ + --hash=sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb \ + --hash=sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74 \ + --hash=sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b \ + --hash=sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346 \ + --hash=sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e \ + --hash=sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6 \ + --hash=sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5 \ + --hash=sha256:a27072dbdd43f16e7f5d555415e19de580dbbc3a81626f2d16aa04010502c1d6 \ + --hash=sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f \ + --hash=sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5 \ + --hash=sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b \ + --hash=sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c \ + --hash=sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f \ + --hash=sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec \ + --hash=sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8 \ + --hash=sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5 \ + --hash=sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d \ + --hash=sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e \ + --hash=sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e \ + --hash=sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870 \ + --hash=sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f \ + --hash=sha256:e8598af127c3ebc78ec460f96848942eca0126563c3e5b9724b33edf20106b76 \ + --hash=sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96 \ + --hash=sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c \ + --hash=sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd \ + --hash=sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788 + # via cachecontrol mypy==1.11.2 \ --hash=sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36 \ --hash=sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce \ @@ -598,6 +729,7 @@ mypy==1.11.2 \ --hash=sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70 \ --hash=sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12 \ --hash=sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104 \ + --hash=sha256:cecf1897ad229cbc3b84d26738f58f348e7924912073539839414a8bc1b498a5 \ --hash=sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a \ --hash=sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318 \ --hash=sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1 \ @@ -609,7 +741,8 @@ mypy==1.11.2 \ # refurb mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ - --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 \ + --hash=sha256:7b58bcc6d3a548c146400c2e5de934bdbf2658503f897adee40f210e19b1f0ac # via # black # mypy @@ -617,6 +750,7 @@ nh3==0.2.18 \ --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \ --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \ --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \ + --hash=sha256:1c6e9383e082f5895d49836603af919395b99e293e0818a5e15492843d0b4d53 \ --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \ --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \ --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \ @@ -631,30 +765,56 @@ nh3==0.2.18 \ --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \ --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe # via readme-renderer +nodeenv==1.9.1 \ + --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ + --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 \ + --hash=sha256:e3d5a1b67a0cdf73b094aca8a68a80befbde9ca317303f18bf8af61198edc37f + # via pre-commit +packageurl-python==0.15.6 \ + --hash=sha256:0d39b14186da7367ab71ca35e656cfc1e81eaf98dcd2801ded953f34232bfc92 \ + --hash=sha256:a40210652c89022772a6c8340d6066f7d5dc67132141e5284a4db7a27d0a8ab0 \ + --hash=sha256:cbc89afd15d5f4d05db4f1b61297e5b97a43f61f28799f6d282aff467ed2ee96 + # via cyclonedx-python-lib packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:270c5ae91ef4184b318179b819b2e4420e8f41246d05334899bc9dfc30c80cac \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via # black # build # cli-base-utilities - # dparse - # marshmallow + # pip-audit + # pip-requirements-parser # pyproject-api - # safety - # safety-schemas # tox pathspec==0.12.1 \ --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ - --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 \ + --hash=sha256:abdf2ccde2babf20f12de0f090074ebea14a544ece6a038e20fb5e000a30e869 # via black +pip-api==0.0.34 \ + --hash=sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb \ + --hash=sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625 \ + --hash=sha256:d395ae96471efb8efc3574e75406c1ae495c36e4ca4e68905cd0be57cb5d182d + # via pip-audit +pip-audit==2.7.3 \ + --hash=sha256:08891bbf179bffe478521f150818112bae998424f58bf9285c0078965aef38bc \ + --hash=sha256:46a11faee3323f76adf7987de8171daeb660e8f57d8088cc27fb1c1e5c7747b0 + # via MC6809 (pyproject.toml) +pip-requirements-parser==32.0.1 \ + --hash=sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526 \ + --hash=sha256:53464120dcec4eaa04fdc5d7577ef231a7d1194d397dd9cb066d7155c9be6f27 \ + --hash=sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3 + # via pip-audit pip-tools==7.4.1 \ + --hash=sha256:35d594eaaa262f2d3161954aeb25617ee9e597ecf624b77089e5c7ee309e5937 \ --hash=sha256:4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9 \ --hash=sha256:864826f5073864450e24dbeeb85ce3920cdfb09848a3d69ebf537b521f14bcc9 # via MC6809 (pyproject.toml) pkginfo==1.10.0 \ --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \ - --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097 + --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097 \ + --hash=sha256:ac3003435f60fdd443e836719b8b3312c7f2f12ec42d137d1b2feacbac73d757 # via twine platformdirs==4.3.6 \ --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ @@ -664,118 +824,34 @@ platformdirs==4.3.6 \ # tox # virtualenv pluggy==1.5.0 \ + --hash=sha256:0a73af206bfd0f78d40b53c4da46553729ce04cb0d1c23e3b26c1d2f4538c691 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # via tox +pre-commit==3.8.0 \ + --hash=sha256:03a8cc30ccb2ff639d46e6f47563a1ceffb02578ce6ab3adb5f10c38d4e47cea \ + --hash=sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af \ + --hash=sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f + # via MC6809 (pyproject.toml) +py-serializable==1.1.1 \ + --hash=sha256:008cf879c8a227851e745e307c1a1c9b58bc22ab87f3794a3750513b6c9e8713 \ + --hash=sha256:f268db3afc42c8786da6dc64a8a36e33a82cf65cdcff22d1188b0927f6d4cfa9 + # via cyclonedx-python-lib pycodestyle==2.12.1 \ + --hash=sha256:37e5160726190311bb6ce887106c6ab5553f7a646d4294017ccccbac26a7b86d \ --hash=sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3 \ --hash=sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521 # via # autopep8 # flake8 pycparser==2.22 \ + --hash=sha256:1a6dcf2544745c9222d3981d9ffcd6231ffc69b827b0847fc40586388287a0ca \ --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc # via cffi -pydantic==2.9.2 \ - --hash=sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f \ - --hash=sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12 - # via - # safety - # safety-schemas -pydantic-core==2.23.4 \ - --hash=sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36 \ - --hash=sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05 \ - --hash=sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071 \ - --hash=sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327 \ - --hash=sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c \ - --hash=sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36 \ - --hash=sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29 \ - --hash=sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744 \ - --hash=sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d \ - --hash=sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec \ - --hash=sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e \ - --hash=sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e \ - --hash=sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577 \ - --hash=sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232 \ - --hash=sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863 \ - --hash=sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6 \ - --hash=sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368 \ - --hash=sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480 \ - --hash=sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2 \ - --hash=sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2 \ - --hash=sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6 \ - --hash=sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769 \ - --hash=sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d \ - --hash=sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2 \ - --hash=sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84 \ - --hash=sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166 \ - --hash=sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271 \ - --hash=sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5 \ - --hash=sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb \ - --hash=sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13 \ - --hash=sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323 \ - --hash=sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556 \ - --hash=sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665 \ - --hash=sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef \ - --hash=sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb \ - --hash=sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119 \ - --hash=sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126 \ - --hash=sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510 \ - --hash=sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b \ - --hash=sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87 \ - --hash=sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f \ - --hash=sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc \ - --hash=sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8 \ - --hash=sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21 \ - --hash=sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f \ - --hash=sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6 \ - --hash=sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658 \ - --hash=sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b \ - --hash=sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3 \ - --hash=sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb \ - --hash=sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59 \ - --hash=sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24 \ - --hash=sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9 \ - --hash=sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3 \ - --hash=sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd \ - --hash=sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753 \ - --hash=sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55 \ - --hash=sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad \ - --hash=sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a \ - --hash=sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605 \ - --hash=sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e \ - --hash=sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b \ - --hash=sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433 \ - --hash=sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8 \ - --hash=sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07 \ - --hash=sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728 \ - --hash=sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0 \ - --hash=sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327 \ - --hash=sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555 \ - --hash=sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64 \ - --hash=sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6 \ - --hash=sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea \ - --hash=sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b \ - --hash=sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df \ - --hash=sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e \ - --hash=sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd \ - --hash=sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068 \ - --hash=sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3 \ - --hash=sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040 \ - --hash=sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12 \ - --hash=sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916 \ - --hash=sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f \ - --hash=sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f \ - --hash=sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801 \ - --hash=sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231 \ - --hash=sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5 \ - --hash=sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8 \ - --hash=sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee \ - --hash=sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607 - # via pydantic pyflakes==3.2.0 \ --hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \ + --hash=sha256:2f47e486427c68ec1f4a5f04dfcb1df637f456b649852051047181ec76dc8cf8 \ --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a # via # MC6809 (pyproject.toml) @@ -789,6 +865,11 @@ pygments==2.18.0 \ # darker # readme-renderer # rich +pyparsing==3.1.4 \ + --hash=sha256:7b4bab7b9f90b65322e263c942eadc57997d42553c2d6bd7c32798f6c04b823f \ + --hash=sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c \ + --hash=sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032 + # via pip-requirements-parser pyproject-api==1.8.0 \ --hash=sha256:3d7d347a047afe796fd5d1885b1e391ba29be7169bd2f102fcd378f04273d228 \ --hash=sha256:77b8049f2feb5d33eefcc21b57f1e279636277a8ac8ad6b5871037b243778496 @@ -801,15 +882,18 @@ pyproject-hooks==1.1.0 \ # pip-tools python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:5d23f9d7e398684c7dac22b46a93fb71de568cfdcd004512f7072819e41ef54c \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via # arrow # cli-base-utilities python-slugify==8.0.4 \ --hash=sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 \ - --hash=sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856 + --hash=sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856 \ + --hash=sha256:cbe9e94cf0011a0079b3fe056ceab7275030bcb10bfc545d28dab6a4d3c1174d # via cookiecutter pyupgrade==3.17.0 \ + --hash=sha256:81a234c8e8630146b5e705caf1b86d127d799cbc5c369d3ca43c056b505783ec \ --hash=sha256:cbc8f67a61d3f4e7ca9c2ef57b9aae67f023d3780ce30c99fccec78401723754 \ --hash=sha256:d5dd1dcaf9a016c31508bb9d3d09fd335d736578092f91df52bb26ac30c37919 # via @@ -834,6 +918,7 @@ pyyaml==6.0.2 \ --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:4a116b1e66edb7eea662c281c85f5669606bdccb6173b03d442a0dd33586c8cc \ --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ @@ -856,6 +941,7 @@ pyyaml==6.0.2 \ --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c17d542ee2e07d5085fd1a99af3c9bd7d313b0f26527f4fb2cdc5b553f3f5af2 \ --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ @@ -869,29 +955,36 @@ pyyaml==6.0.2 \ --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 - # via cookiecutter + # via + # cookiecutter + # pre-commit readme-renderer==44.0 \ --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \ - --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1 + --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1 \ + --hash=sha256:d812ef55c1e4fba85c293a8a06646caef3a915dedf37258a18380390f9d1befd # via twine refurb==2.0.0 \ --hash=sha256:8a8f1e7c131ef7dc460cbecbeaf536f5eb0ecb657c099d7823941f0e65b1cfe1 \ --hash=sha256:fa9e950dc6edd7473642569c118f8714eefd1e6f21a15ee4210a1be853aaaf80 # via manageprojects requests==2.32.3 \ + --hash=sha256:41c1576e09f429d8f841b1143f51754df46557f6eb229605898a79b98c311db4 \ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via + # cachecontrol # cookiecutter + # pip-audit # requests-toolbelt - # safety # twine requests-toolbelt==1.0.0 \ --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ + --hash=sha256:9ffec1e9f4d197a5411d14206189aac1b171d66e33c1858b558325c011358cbe \ --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ + --hash=sha256:7b542865c173d046c1f1ed2bccb7ae55f7f9535d0a5ab4809b11217d0e09556b \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine rich==13.8.1 \ @@ -902,100 +995,38 @@ rich==13.8.1 \ # cli-base-utilities # cookiecutter # manageprojects + # pip-audit # rich-click - # safety # twine - # typer rich-click==1.8.3 \ --hash=sha256:636d9c040d31c5eee242201b5bf4f2d358bfae4db14bb22ec1cafa717cfd02cd \ - --hash=sha256:6d75bdfa7aa9ed2c467789a0688bc6da23fbe3a143e19aa6ad3f8bac113d2ab3 + --hash=sha256:6d75bdfa7aa9ed2c467789a0688bc6da23fbe3a143e19aa6ad3f8bac113d2ab3 \ + --hash=sha256:ef50d4087a5a4f1e7fcee7972f78775e9b33c0709a86dc10f9f5b929ba4d51b8 # via # MC6809 (pyproject.toml) # cli-base-utilities # manageprojects -ruamel-yaml==0.18.6 \ - --hash=sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636 \ - --hash=sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b - # via - # safety - # safety-schemas -ruamel-yaml-clib==0.2.8 \ - --hash=sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d \ - --hash=sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001 \ - --hash=sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462 \ - --hash=sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9 \ - --hash=sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe \ - --hash=sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b \ - --hash=sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b \ - --hash=sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615 \ - --hash=sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62 \ - --hash=sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15 \ - --hash=sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b \ - --hash=sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1 \ - --hash=sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9 \ - --hash=sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675 \ - --hash=sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899 \ - --hash=sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7 \ - --hash=sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7 \ - --hash=sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312 \ - --hash=sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa \ - --hash=sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91 \ - --hash=sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b \ - --hash=sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6 \ - --hash=sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3 \ - --hash=sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334 \ - --hash=sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5 \ - --hash=sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3 \ - --hash=sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe \ - --hash=sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c \ - --hash=sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed \ - --hash=sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337 \ - --hash=sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880 \ - --hash=sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f \ - --hash=sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d \ - --hash=sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248 \ - --hash=sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d \ - --hash=sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf \ - --hash=sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512 \ - --hash=sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069 \ - --hash=sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb \ - --hash=sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942 \ - --hash=sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d \ - --hash=sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31 \ - --hash=sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92 \ - --hash=sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5 \ - --hash=sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28 \ - --hash=sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d \ - --hash=sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1 \ - --hash=sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2 \ - --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ - --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 - # via ruamel-yaml -safety==3.2.3 \ - --hash=sha256:414154934f1727daf8a6473493944fecb380540c3f00875dc1ae377382f7d83f \ - --hash=sha256:cda1e91749f610337a18b7f21f78267c127e44ebbbbcbbd419c83284279a5024 - # via MC6809 (pyproject.toml) -safety-schemas==0.0.5 \ - --hash=sha256:0de5fc9a53d4423644a8ce9a17a2e474714aa27e57f3506146e95a41710ff104 \ - --hash=sha256:6ac9eb71e60f0d4e944597c01dd48d6d8cd3d467c94da4aba3702a05a3a6ab4f - # via safety secretstorage==3.3.3 \ --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:cd7ed5cdeb3e5d7f18a7651500e0fec895205ae9c0abf7e5e63f6768d69418a2 \ --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 # via keyring -shellingham==1.5.4 \ - --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 \ - --hash=sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de - # via typer six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via python-dateutil + # via + # html5lib + # python-dateutil +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via cyclonedx-python-lib text-unidecode==1.3 \ --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \ --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93 # via python-slugify tokenize-rt==6.0.0 \ + --hash=sha256:719a8c00371c80a9b33b8d8a648c07eed2cbcad3d841981557c7683994b89e3a \ --hash=sha256:b9711bdfc51210211137499b5e355d3de5ec88a85d2025c520cbb921b5194367 \ --hash=sha256:d4ff7ded2873512938b4f8cbb98c9b07118f01d30ac585a30d7a88353ca36d22 # via pyupgrade @@ -1005,12 +1036,11 @@ toml==0.10.2 \ # via # darker # darkgraylib + # pip-audit tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - # via - # MC6809 (pyproject.toml) - # cli-base-utilities + # via cli-base-utilities tomlkit==0.13.2 \ --hash=sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde \ --hash=sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79 @@ -1023,14 +1053,17 @@ tox==4.20.0 \ # via MC6809 (pyproject.toml) twine==5.1.1 \ --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \ + --hash=sha256:3c7f799b77e4bf2e6993bf820c6896e02983ed04bf072148da9fc8c07473fb58 \ --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db # via MC6809 (pyproject.toml) -typer==0.12.5 \ - --hash=sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b \ - --hash=sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722 - # via safety +typeguard==4.3.0 \ + --hash=sha256:4d24c5b39a117f8a895b9da7a9b3114f04eb63bade45a4492de49b175b6f7dfa \ + --hash=sha256:92ee6a0aec9135181eae6067ebd617fd9de8d75d714fb548728a4933b1dea651 \ + --hash=sha256:fea0fb5d99b2e2389f6b0b35e0098265c57a050fb4438718eb64a5a7ac08a67f + # via MC6809 (pyproject.toml) types-python-dateutil==2.9.0.20240906 \ --hash=sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6 \ + --hash=sha256:505e12a984040ecdd2e5b8c807128b224c219ea5fb943800ff3a3e3840f435d4 \ --hash=sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e # via arrow typing-extensions==4.12.2 \ @@ -1038,28 +1071,32 @@ typing-extensions==4.12.2 \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via # mypy - # pydantic - # pydantic-core # rich-click - # safety - # safety-schemas - # typer + # typeguard urllib3==2.2.3 \ + --hash=sha256:53042b594bc77c4b5d43f598b9eca1333bf4f884c300473192f4d4f47bab1d2d \ --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \ --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9 # via + # MC6809 (pyproject.toml) # requests - # safety # twine virtualenv==20.26.5 \ --hash=sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6 \ --hash=sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4 - # via tox + # via + # pre-commit + # tox +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ + --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 + # via html5lib wheel==0.44.0 \ --hash=sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f \ --hash=sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49 # via pip-tools zipp==3.20.2 \ + --hash=sha256:22a9c23c796186ac7e78301bb1771c074e1f568b91bbce8157bd705d53f7e600 \ --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \ --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29 # via importlib-metadata @@ -1067,11 +1104,13 @@ zipp==3.20.2 \ # The following packages are considered to be unsafe in a requirements file: pip==24.2 \ --hash=sha256:2cd581cf58ab7fcfca4ce8efa6dcacd0de5bf8d0a3eb9ec927e07405f4d9e2a2 \ - --hash=sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8 - # via pip-tools + --hash=sha256:5b5e490b5e9cb275c879595064adce9ebd31b854e3e803740b72f9ccf34a45b8 \ + --hash=sha256:9a022a9c8b0cf5b9fc444c3d62800163f3c5bad729b893faa1162bd234a2f5fb + # via + # pip-api + # pip-tools setuptools==75.1.0 \ --hash=sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2 \ + --hash=sha256:8d32e2f72308958f2609687a4278931d414ce02ddce193c6d725808d6634b084 \ --hash=sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538 - # via - # pip-tools - # safety + # via pip-tools diff --git a/requirements.txt b/requirements.txt index dfda9b5..5b765be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,21 +4,27 @@ # # ./dev-cli.py update # +--extra-index-url https://www.piwheels.org/simple + async-timeout==4.0.3 \ --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ - --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 + --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 \ + --hash=sha256:fd893e4cb1d9dff66d0e0576cc6376a23eacbbcd43b6607e4d3ecfae1ab15367 # via cli-base-utilities bx-py-utils==104 \ --hash=sha256:508cfc1d0fa6c22298f697c4efaa913337847d488d8a53eeccfae9ee106123f6 \ + --hash=sha256:77fddff99aaf2cb558ce2974ef66d0e7a4d48cca1cbb99e43eca0d8b77fa07fc \ --hash=sha256:c92ebc4fb122e3e3c228d984d0a1f5c3284c3da6aab1a1c753f7eb1f71bdab3a # via # MC6809 (pyproject.toml) # cli-base-utilities cli-base-utilities==0.11.0 \ + --hash=sha256:22c01bffece11781db0cba2110e9bf721361d50fb8a877bd251422ebaf3daee9 \ --hash=sha256:2c674f3af4898f97d101f6687fb45e85a4b996b93fb9a155a29b4daaf302dc43 \ --hash=sha256:fc503f8df7e19653167ebd12551718aa0c114114b959f177be2092eab1ce1b11 # via MC6809 (pyproject.toml) click==8.1.7 \ + --hash=sha256:8e38806544348fdafedd47e92e90aca882377a0680918dec4c80c225a0e5ed13 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via @@ -27,6 +33,7 @@ click==8.1.7 \ # rich-click markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ + --hash=sha256:6d00561ef69282f31c923e5520f8f7025f6c2bbd1d7796f3d730840cc54130a6 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb # via rich mdurl==0.1.2 \ @@ -35,6 +42,7 @@ mdurl==0.1.2 \ # via markdown-it-py packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:270c5ae91ef4184b318179b819b2e4420e8f41246d05334899bc9dfc30c80cac \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via cli-base-utilities pygments==2.18.0 \ @@ -43,6 +51,7 @@ pygments==2.18.0 \ # via rich python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:5d23f9d7e398684c7dac22b46a93fb71de568cfdcd004512f7072819e41ef54c \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via cli-base-utilities rich==13.8.1 \ @@ -54,7 +63,8 @@ rich==13.8.1 \ # rich-click rich-click==1.8.3 \ --hash=sha256:636d9c040d31c5eee242201b5bf4f2d358bfae4db14bb22ec1cafa717cfd02cd \ - --hash=sha256:6d75bdfa7aa9ed2c467789a0688bc6da23fbe3a143e19aa6ad3f8bac113d2ab3 + --hash=sha256:6d75bdfa7aa9ed2c467789a0688bc6da23fbe3a143e19aa6ad3f8bac113d2ab3 \ + --hash=sha256:ef50d4087a5a4f1e7fcee7972f78775e9b33c0709a86dc10f9f5b929ba4d51b8 # via # MC6809 (pyproject.toml) # cli-base-utilities