From 8ad0c2060376b5d93e0a46b79284ebe7f5679016 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Mon, 6 Mar 2023 20:19:56 +0100 Subject: [PATCH] Migrate to pip-tools via https://github.com/jedie/manageprojects --- .editorconfig | 10 +- .flake8 | 7 +- .github/workflows/pythonapp.yml | 74 -- .github/workflows/tests.yml | 74 ++ .gitignore | 40 +- Makefile | 86 -- PyDC/PyDC/CassetteObjects.py | 4 +- PyDC/PyDC/__init__.py | 3 +- PyDC/PyDC/bitstream_handler.py | 28 +- PyDC/PyDC/utils.py | 4 +- PyDC/PyDC/wave2bitstream.py | 17 +- PyDC/PyDC_cli.py | 6 +- README.md | 99 +- cli.py | 115 ++ devshell.py | 147 --- dragonpy/CoCo/CoCo2b_rom.py | 8 +- dragonpy/Dragon32/Dragon32_rom.py | 5 +- dragonpy/Dragon32/dragon_charmap.py | 7 +- dragonpy/Dragon32/gui_config.py | 3 +- dragonpy/Dragon32/mem_info.py | 2 + dragonpy/__init__.py | 67 +- dragonpy/__main__.py | 15 + dragonpy/cli/__init__.py | 0 dragonpy/cli/cli_app.py | 456 ++++++++ dragonpy/components/rom.py | 36 +- dragonpy/constants.py | 31 + dragonpy/core/gui_starter.py | 49 +- dragonpy/dev_shell.py | 208 ---- dragonpy/sbc09/mem_info.py | 2 +- dragonpy/tests/test_base.py | 6 +- dragonpy/tests/test_devshell_commands.py | 61 - dragonpy/tests/test_doctests.py | 13 + dragonpy/tests/test_project_setup.py | 72 ++ dragonpy/tests/test_readme.py | 49 + dragonpy/tests/test_rom_download.py | 3 + dragonpy/tests/{conftest.py => utils.py} | 3 - dragonpy/vectrex/MOS6522.py | 20 +- poetry.lock | 1353 ---------------------- pyproject.toml | 189 +-- requirements.dev.txt | 820 +++++++++++++ requirements.txt | 58 + 41 files changed, 2018 insertions(+), 2232 deletions(-) delete mode 100644 .github/workflows/pythonapp.yml create mode 100644 .github/workflows/tests.yml delete mode 100644 Makefile create mode 100755 cli.py delete mode 100755 devshell.py create mode 100644 dragonpy/__main__.py create mode 100644 dragonpy/cli/__init__.py create mode 100644 dragonpy/cli/cli_app.py delete mode 100644 dragonpy/dev_shell.py delete mode 100644 dragonpy/tests/test_devshell_commands.py create mode 100644 dragonpy/tests/test_doctests.py create mode 100644 dragonpy/tests/test_project_setup.py create mode 100644 dragonpy/tests/test_readme.py rename dragonpy/tests/{conftest.py => utils.py} (86%) delete mode 100644 poetry.lock create mode 100644 requirements.dev.txt create mode 100644 requirements.txt diff --git a/.editorconfig b/.editorconfig index 7fcae178..8d234514 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# see http://editorconfig.org +# see https://editorconfig.org root = true [*] @@ -9,16 +9,12 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -[*.{html,css,js}] -insert_final_newline = false - [*.py] -max_line_length = 120 +max_line_length = 119 [{Makefile,**.mk}] indent_style = tab insert_final_newline = false -[*.{yml}] -indent_style = space +[*.yml] indent_size = 2 diff --git a/.flake8 b/.flake8 index afd91071..3bc9b4bd 100644 --- a/.flake8 +++ b/.flake8 @@ -1,4 +1,7 @@ +# +# Move to pyproject.toml after: https://github.com/PyCQA/flake8/issues/234 +# [flake8] -exclude = .pytest_cache -ignore = E501 +exclude = .*, dist, htmlcov +#ignore = E402 max-line-length = 119 diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml deleted file mode 100644 index 70e86194..00000000 --- a/.github/workflows/pythonapp.yml +++ /dev/null @@ -1,74 +0,0 @@ -# https://github.com/actions/setup-python - -name: Test - -on: - schedule: - - cron: '0 8 * * *' - push: - branches: - - main - pull_request: - -jobs: - test: - name: 'Python ${{ matrix.python-version }} on ${{ matrix.os }}' - runs-on: ${{ matrix.os }} - env: - PYTHONUNBUFFERED: 1 - strategy: - fail-fast: false - matrix: - python-version: ["3.9"] -# TODO: python-version: ["3.10", "3.9", "3.8"] - os: [ubuntu-latest] -# TODO: os: [ubuntu-latest, macOS-latest, windows-latest] - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: 'fetch main' - run: | - git fetch origin main - - name: 'Set up Python ${{ matrix.python-version }}' - uses: actions/setup-python@v2 - with: - python-version: '${{ matrix.python-version }}' - - - uses: actions/cache@v2 - with: - path: ~/.cache/ - key: dot-cache-files - - - name: Cache ROMs - id: cache-roms - uses: actions/cache@v2 - with: - path: roms - key: cache-roms - - - name: 'pip cache information' - run: | - pip3 cache info - - - name: 'Bootstrap' - run: | - python3 devshell.py quit - - - name: 'Download ROMs' - run: | - python3 devshell.py download_roms - - - name: 'List installed packages' - run: | - python3 devshell.py list_venv_packages - - - name: 'Run tests with Python v${{ matrix.python-version }}' - run: | - python3 devshell.py pytest -vv - - - name: 'Upload coverage report' - uses: codecov/codecov-action@v2 - with: - fail_ci_if_error: false - verbose: true diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..e0c28b6d --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,74 @@ + + +name: tests + +on: + push: + branches: + - main + pull_request: + schedule: + - cron: '0 8 * * *' + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.11", "3.10"] + env: + PYTHONUNBUFFERED: 1 + PYTHONWARNINGS: always + steps: + - name: Checkout + run: | + echo $GITHUB_REF $GITHUB_SHA + git clone --depth 1 https://github.com/$GITHUB_REPOSITORY.git . + git fetch origin $GITHUB_SHA:temporary-ci-branch + git checkout $GITHUB_SHA || (git fetch && git checkout $GITHUB_SHA) + + - name: 'Set up Python ${{ matrix.python-version }}' + uses: actions/setup-python@v4 + # https://github.com/marketplace/actions/setup-python + with: + python-version: '${{ matrix.python-version }}' + cache: 'pip' # caching pip dependencies + cache-dependency-path: '**/requirements.dev.txt' + + - name: Cache ROMs + id: cache-roms + uses: actions/cache@v3 + # https://github.com/marketplace/actions/cache + with: + path: roms + key: cache-roms + + - name: 'Bootstrap' + # The first CLI call will create the .venv + run: | + ./cli.py version + + - name: 'CLI help' + run: | + ./cli.py --help + + - name: 'Download ROMs' + run: | + ./cli.py download-roms + + - name: 'Safety' + run: | + ./cli.py safety + + - name: 'Run tests with Python v${{ matrix.python-version }}' + run: | + ./cli.py coverage + + - name: 'Upload coverage report' + uses: codecov/codecov-action@v3 + # https://github.com/marketplace/actions/codecov + with: + fail_ci_if_error: false + verbose: true + diff --git a/.gitignore b/.gitignore index 70747ba5..b2ce0181 100644 --- a/.gitignore +++ b/.gitignore @@ -1,40 +1,14 @@ .* +*.egg-info +__pycache__ +/dist/ +/coverage.json +/coverage.xml !.github +!.editorconfig +!.flake8 !.gitignore *.rom /roms/* - -*.py[cod] -*~ - -# C extensions -*.so - -# Packages -*.egg -*.egg-info/* -/dist/* -build -build.log -eggs -parts -bin -var -sdist -develop-eggs -lib -lib64 - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -/htmlcov/* - -# Translations -*.mo - -/publish.log -/coverage.xml diff --git a/Makefile b/Makefile deleted file mode 100644 index b3e0c230..00000000 --- a/Makefile +++ /dev/null @@ -1,86 +0,0 @@ -SHELL := /bin/bash -MAX_LINE_LENGTH := 119 -POETRY_VERSION := $(shell poetry --version 2>/dev/null) - -help: ## List all commands - @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9 -]+:.*?## / {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) - -check-poetry: - @if [[ "${POETRY_VERSION}" == *"Poetry"* ]] ; \ - then \ - echo "Found ${POETRY_VERSION}, ok." ; \ - else \ - echo 'Please install poetry first, with e.g.:' ; \ - echo 'make install-poetry' ; \ - exit 1 ; \ - fi - -install-poetry: ## install or update poetry - pip3 install -U pip - pip3 install -U poetry - -install: check-poetry ## install DragonPy via poetry - poetry install - -update: check-poetry ## Update the dependencies as according to the pyproject.toml file - poetry update - -lint: ## Run code formatters and linter - poetry run darker --diff --check - poetry run isort --check-only . - -fix-code-style: ## Fix code formatting - poetry run darker - poetry run autopep8 --in-place --max-line-length ${MAX_LINE_LENGTH} --recursive . - poetry run darker - poetry run isort . - -tox-listenvs: check-poetry ## List all tox test environments - poetry run tox --listenvs - -tox: check-poetry ## Run pytest via tox with all environments - poetry run tox - -pytest: check-poetry ## Run pytest - poetry run pytest - -update-rst-readme: ## update README.rst from README.creole - poetry run update_rst_readme - -publish: ## Release new version to PyPi - poetry run publish - -profile: ## Profile the MC6809 emulation benchmark - poetry run MC6809 profile - -benchmark: ## Run MC6809 emulation benchmark - poetry run MC6809 benchmark - -editor: check-poetry ## Run only the BASIC editor - poetry run devshell editor - -Vectrex: check-poetry ## Run GUI with Vectrex emulation (not working, yet!) - poetry run devshell run --machine Vectrex - -sbc09: check-poetry ## Run GUI with sbc09 ROM emulation - poetry run devshell run --machine sbc09 - -Multicomp6809: check-poetry ## Run GUI with Multicomp6809 ROM emulation - poetry run devshell run --machine Multicomp6809 - -Simple6809: check-poetry ## Run GUI with Simple6809 ROM emulation - poetry run devshell run --machine Simple6809 - -CoCo2b: check-poetry ## Run GUI with CoCo 2b emulation - poetry run devshell run --machine CoCo2b - -Dragon32: check-poetry ## Run GUI with Dragon 32 emulation - poetry run devshell run --machine Dragon32 - -Dragon64: check-poetry ## Run GUI with Dragon 64 emulation - poetry run devshell run --machine Dragon64 - -run: check-poetry ## *Run the DragonPy Emulator GUI* - poetry run devshell gui - -.PHONY: help install lint fix test publish \ No newline at end of file diff --git a/PyDC/PyDC/CassetteObjects.py b/PyDC/PyDC/CassetteObjects.py index 6a4ed80f..f772d34b 100644 --- a/PyDC/PyDC/CassetteObjects.py +++ b/PyDC/PyDC/CassetteObjects.py @@ -1,3 +1,5 @@ +# flake8: noqa: E501 + """ PyDC - Cassette Objects ======================= @@ -14,7 +16,7 @@ import sys # own modules -from PyDC.utils import ( +from PyDC.PyDC.utils import ( LOG_FORMATTER, LOG_LEVEL_DICT, codepoints2string, diff --git a/PyDC/PyDC/__init__.py b/PyDC/PyDC/__init__.py index 823c6f0d..ecb48d46 100644 --- a/PyDC/PyDC/__init__.py +++ b/PyDC/PyDC/__init__.py @@ -11,8 +11,7 @@ import os import sys -from PyDC.wave2bitstream import Wave2Bitstream - +from PyDC.PyDC.wave2bitstream import Wave2Bitstream from .CassetteObjects import Cassette diff --git a/PyDC/PyDC/bitstream_handler.py b/PyDC/PyDC/bitstream_handler.py index f12cb298..241e4bd9 100755 --- a/PyDC/PyDC/bitstream_handler.py +++ b/PyDC/PyDC/bitstream_handler.py @@ -18,7 +18,7 @@ import logging import os -from PyDC.utils import ( +from PyDC.PyDC.utils import ( MaxPosArraived, PatternNotFound, bits2codepoint, @@ -222,13 +222,21 @@ def sync_bitstream(self, bitstream): leader_pos = find_iter_window(bitstream, lead_in_pattern, max_pos) except MaxPosArraived as err: log.error( - f"Error: Leader-Byte '{list2str(lead_in_pattern)}' ({hex(self.cfg.LEAD_BYTE_CODEPOINT)}) not found in the first {self.cfg.LEAD_BYTE_LEN:d} Bytes! ({err})") + f"Error: Leader-Byte '{list2str(lead_in_pattern)}'" + f" ({hex(self.cfg.LEAD_BYTE_CODEPOINT)}) not found in the first {self.cfg.LEAD_BYTE_LEN:d} Bytes!" + f" ({err})" + ) except PatternNotFound as err: log.error( - f"Error: Leader-Byte '{list2str(lead_in_pattern)}' ({hex(self.cfg.LEAD_BYTE_CODEPOINT)}) doesn't exist in bitstream! ({err})") + f"Error: Leader-Byte '{list2str(lead_in_pattern)}'" + f" ({hex(self.cfg.LEAD_BYTE_CODEPOINT)}) doesn't exist in bitstream! ({err})" + ) else: log.info( - f"Leader-Byte '{list2str(lead_in_pattern)}' ({hex(self.cfg.LEAD_BYTE_CODEPOINT)}) found at {leader_pos:d} Bytes (wave pos: {bitstream.pformat_pos()})") + f"Leader-Byte '{list2str(lead_in_pattern)}'" + f" ({hex(self.cfg.LEAD_BYTE_CODEPOINT)}) found at {leader_pos:d} Bytes" + f" (wave pos: {bitstream.pformat_pos()})" + ) log.debug(f"Search for sync-byte at wave pos: {bitstream.pformat_pos()}") @@ -239,15 +247,21 @@ def sync_bitstream(self, bitstream): sync_pos = find_iter_window(bitstream, sync_pattern, max_search_bits) except MaxPosArraived as err: raise SyncByteNotFoundError( - f"Error: Sync-Byte '{list2str(sync_pattern)}' ({hex(self.cfg.SYNC_BYTE_CODEPOINT)}) not found in the first {self.cfg.MAX_SYNC_BYTE_SEARCH:d} Bytes! ({err})" + f"Error: Sync-Byte '{list2str(sync_pattern)}'" + f" ({hex(self.cfg.SYNC_BYTE_CODEPOINT)}) not found in the" + f" first {self.cfg.MAX_SYNC_BYTE_SEARCH:d} Bytes! ({err})" ) except PatternNotFound as err: raise SyncByteNotFoundError( - f"Error: Sync-Byte '{list2str(sync_pattern)}' ({hex(self.cfg.SYNC_BYTE_CODEPOINT)}) doesn't exist in bitstream! ({err})" + f"Error: Sync-Byte '{list2str(sync_pattern)}'" + f" ({hex(self.cfg.SYNC_BYTE_CODEPOINT)}) doesn't exist in bitstream! ({err})" ) else: log.info( - f"Sync-Byte '{list2str(sync_pattern)}' ({hex(self.cfg.SYNC_BYTE_CODEPOINT)}) found at {sync_pos:d} Bytes (wave pos: {bitstream.pformat_pos()})") + f"Sync-Byte '{list2str(sync_pattern)}'" + f" ({hex(self.cfg.SYNC_BYTE_CODEPOINT)}) found at {sync_pos:d} Bytes" + f" (wave pos: {bitstream.pformat_pos()})" + ) class CasStream: diff --git a/PyDC/PyDC/utils.py b/PyDC/PyDC/utils.py index d99c51b7..46c3c1c5 100755 --- a/PyDC/PyDC/utils.py +++ b/PyDC/PyDC/utils.py @@ -232,12 +232,12 @@ def find_iter_window(bitstream, pattern, max_pos=None): >>> find_iter_window(bytes2bit_strings("HELLO!"), list(bytes2bit_strings("LO")), max_pos=16) Traceback (most recent call last): ... - PyDC.utils.MaxPosArraived: 17 + PyDC.PyDC.utils.MaxPosArraived: 17 >>> find_iter_window(bytes2bit_strings("HELLO!"), list(bytes2bit_strings("X"))) Traceback (most recent call last): ... - PyDC.utils.PatternNotFound: 40 + PyDC.PyDC.utils.PatternNotFound: 40 """ assert isinstance(bitstream, (Iterable, types.GeneratorType)) assert isinstance(pattern, (list, tuple)) diff --git a/PyDC/PyDC/wave2bitstream.py b/PyDC/PyDC/wave2bitstream.py index 4c3028a2..928de613 100644 --- a/PyDC/PyDC/wave2bitstream.py +++ b/PyDC/PyDC/wave2bitstream.py @@ -14,7 +14,7 @@ import time import wave -from PyDC.utils import ( +from PyDC.PyDC.utils import ( ProcessInfo, TextLevelMeter, average, @@ -277,7 +277,10 @@ def iter_bitstream(self, iter_duration_generator): bit_one_min_duration = self._hz2duration(bit_one_max_hz) log.info( - f"bit-0 in {bit_nul_min_hz}Hz - {bit_nul_max_hz}Hz (duration: {bit_nul_min_duration}-{bit_nul_max_duration}) | bit-1 in {bit_one_min_hz}Hz - {bit_one_max_hz}Hz (duration: {bit_one_min_duration}-{bit_one_max_duration})" + f"bit-0 in {bit_nul_min_hz}Hz - {bit_nul_max_hz}Hz" + f" (duration: {bit_nul_min_duration}-{bit_nul_max_duration})" + f" | bit-1 in {bit_one_min_hz}Hz - {bit_one_max_hz}Hz" + f" (duration: {bit_one_min_duration}-{bit_one_max_duration})" ) assert ( bit_nul_max_hz < bit_one_min_hz @@ -337,11 +340,13 @@ def iter_bitstream(self, iter_duration_generator): log.info(f"\n{bit_count:d} Bits: {bit_one_count:d} positive bits and {bit_nul_count:d} negative bits") if bit_one_count > 0: log.info( - f"Bit 1: {one_hz_min}Hz - {one_hz_max}Hz avg: {one_hz_avg:.1f}Hz variation: {one_hz_max - one_hz_min}Hz" + f"Bit 1: {one_hz_min}Hz - {one_hz_max}Hz avg:" + f" {one_hz_avg:.1f}Hz variation: {one_hz_max - one_hz_min}Hz" ) if bit_nul_count > 0: log.info( - f"Bit 0: {nul_hz_min}Hz - {nul_hz_max}Hz avg: {nul_hz_avg:.1f}Hz variation: {nul_hz_max - nul_hz_min}Hz" + f"Bit 0: {nul_hz_min}Hz - {nul_hz_max}Hz avg:" + f" {nul_hz_avg:.1f}Hz variation: {nul_hz_max - nul_hz_min}Hz" ) def iter_duration(self, iter_trigger): @@ -513,7 +518,9 @@ def __init__(self, destination_filepath, cfg): float(wave_max_value) / 100 * self.cfg.VOLUME_RATIO )) log.info( - f"Create {HUMAN_SAMPLEWIDTH[self.cfg.SAMPLEWIDTH]} wave file with {self.cfg.FRAMERATE}Hz and {self.used_max_values} max volumen ({self.cfg.VOLUME_RATIO}%)") + f"Create {HUMAN_SAMPLEWIDTH[self.cfg.SAMPLEWIDTH]} wave file" + f" with {self.cfg.FRAMERATE}Hz and {self.used_max_values} max volumen ({self.cfg.VOLUME_RATIO}%)" + ) self.typecode = self.get_typecode(self.cfg.SAMPLEWIDTH) diff --git a/PyDC/PyDC_cli.py b/PyDC/PyDC_cli.py index 9f1ff8ad..c6f2f2be 100755 --- a/PyDC/PyDC_cli.py +++ b/PyDC/PyDC_cli.py @@ -11,9 +11,9 @@ import logging import os -from PyDC import TITLE_LINE, VERSION_STRING, analyze, convert -from PyDC.base_cli import Base_CLI -from PyDC.configs import Dragon32Config +from PyDC.PyDC import TITLE_LINE, VERSION_STRING, analyze, convert +from PyDC.PyDC.base_cli import Base_CLI +from PyDC.PyDC.configs import Dragon32Config log = logging.getLogger("PyDC") diff --git a/README.md b/README.md index 11b2024e..9c9338a4 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ DragonPy is a Open source (GPL v3 or later) emulator for the old (1981) homecomp The [MC6809](https://github.com/6809/MC6809) project is used to emulate the 6809 CPU. -[![Test](https://github.com/jedie/DragonPy/actions/workflows/pythonapp.yml/badge.svg?branch=main)](https://github.com/jedie/DragonPy/actions/workflows/pythonapp.yml) -[![Coverage Status on codecov.io](https://codecov.io/gh/jedie/DragonPy/branch/main/graph/badge.svg)](https://codecov.io/gh/jedie/DragonPy) -[![DragonPy @ PyPi](https://img.shields.io/pypi/v/DragonPyEmulator?label=DragonPy%20%40%20PyPi)](https://pypi.org/project/DragonPyEmulator/) -[![Python Versions](https://img.shields.io/pypi/pyversions/DragonPyEmulator)](https://github.com/jedie/DragonPy/blob/main/pyproject.toml) -[![License GPL](https://img.shields.io/pypi/l/DragonPyEmulator)](https://github.com/jedie/DragonPy/blob/main/LICENSE) +[![tests](https://github.com/jedie/DragonPy/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/jedie/DragonPy/actions/workflows/tests.yml) +[![codecov](https://codecov.io/github/jedie/dragonpy/branch/main/graph/badge.svg)](https://app.codecov.io/github/jedie/dragonpy) +[![dragonpy @ PyPi](https://img.shields.io/pypi/v/dragonpy?label=dragonpy%20%40%20PyPi)](https://pypi.org/project/dragonpy/) +[![Python Versions](https://img.shields.io/pypi/pyversions/dragonpy)](https://github.com/jedie/DragonPy/blob/main/pyproject.toml) +[![License GPL-3.0-or-later](https://img.shields.io/pypi/l/dragonpy)](https://github.com/jedie/DragonPy/blob/main/LICENSE) Dragon 32 with CPython 3 under Linux: @@ -93,44 +93,71 @@ pip install DragonPyEmulator ```bash ~$ git clone https://github.com/jedie/DragonPy.git ~$ cd DragonPy/ -~/DragonPy$ ./devshell.py - -+ /home/jens/repos/DragonPy/.venv/bin/python /home/jens/repos/DragonPy/.venv/bin/devshell - -Developer shell - DragonPy - v0.8.0.rc1 - - ******************************************************** - * DragonPy is a Open source (GPL v3 or later) emulator * - * for the 30 years old homecomputer Dragon 32 * - * and Tandy TRS-80 Color Computer (CoCo)... * - ******************************************************** - * Homepage: https://github.com/jedie/DragonPy * - ******************************************************** - - -Documented commands (use 'help -v' for verbose/'help ' for details): +~/DragonPy$ ./cli.py --help +``` -dev-shell commands -================== -fix_code_style poetry pytest tox -list_venv_packages publish pyupgrade update +The output of `./cli.py --help` looks like: -DragonPy commands -================= -download_roms editor gui log_list run +[comment]: <> (✂✂✂ auto generated main help start ✂✂✂) +``` +Usage: ./cli.py [OPTIONS] COMMAND [ARGS]... + +╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮ +│ --help Show this message and exit. │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮ +│ check-code-style Check code style by calling darker + flake8 │ +│ coverage Run and show coverage. │ +│ download-roms Download/Test only ROM files │ +│ editor Run only the BASIC editor │ +│ fix-code-style Fix code style of all dragonpy source code files via darker │ +│ gui Start the DragonPy tkinter starter GUI │ +│ install Run pip-sync and install 'dragonpy' via pip as editable. │ +│ log-list List all exiting loggers and exit. │ +│ mypy Run Mypy (configured in pyproject.toml) │ +│ publish Build and upload this project to PyPi │ +│ run Run a machine emulation │ +│ safety Run safety check against current requirements files │ +│ test Run unittests │ +│ tox Run tox │ +│ update Update "requirements*.txt" dependencies files │ +│ update-test-snapshot-files Update all test snapshot files (by remove and recreate all snapshot │ +│ files) │ +│ version Print version and exit │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ +``` +[comment]: <> (✂✂✂ auto generated main help end ✂✂✂) -Uncategorized -============= -alias help history macro quit set shortcuts +The output of `./cli.py run --help` looks like: -(dragonpy) run +[comment]: <> (✂✂✂ auto generated run help start ✂✂✂) +``` +Usage: ./cli.py run [OPTIONS] + + Run a machine emulation + +╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮ +│ --verbosity [1|10|20|30|40|50|99|100] 1:hardcode DEBUG ;), 10:DEBUG, │ +│ 20:INFO, 30:WARNING, 40:ERROR, │ +│ 50:CRITICAL/FATAL, 99:nearly all off, │ +│ 100:all off │ +│ [default: 100] │ +│ --trace/--no-trace Create trace lines │ +│ [default: no-trace] │ +│ --max-ops INTEGER If given: Stop CPU after given cycles │ +│ else: run forever │ +│ --machine [CoCo2b|Dragon32|Dragon64|Multicomp Used machine configuration │ +│ 6809|Simple6809|Vectrex|sbc09] [default: Dragon32] │ +│ --help Show this message and exit. │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` +[comment]: <> (✂✂✂ auto generated run help end ✂✂✂) -The `devshell.py` can also used as a CLI, e.g.: +Usage e.g.: ```bash -~/DragonPy$ ./devshell.py run -~/DragonPy$ ./devshell.py editor +~/DragonPy$ ./cli.py run +~/DragonPy$ ./cli.py editor ``` ## ROMs @@ -209,7 +236,7 @@ Then just **RUN** and then it looks like this: ### DragonPy schematic ``` - Main Thread Sub Thread + Main Thread Sub Thread (Tkinter GUI) +------------------+ +---------------------+ | | | | diff --git a/cli.py b/cli.py new file mode 100755 index 00000000..facb981d --- /dev/null +++ b/cli.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 + +""" + bootstrap CLI + ~~~~~~~~~~~~~ + + Just call this file, and the magic happens ;) +""" + +import hashlib +import subprocess +import sys +import venv +from pathlib import Path + + +def print_no_pip_error(): + print('Error: Pip not available!') + print('Hint: "apt-get install python3-venv"\n') + + +try: + from ensurepip import version +except ModuleNotFoundError as err: + print(err) + print('-' * 100) + print_no_pip_error() + raise +else: + if not version(): + print_no_pip_error() + sys.exit(-1) + + +assert sys.version_info >= (3, 9), 'Python version is too old!' + + +if sys.platform == 'win32': # wtf + # Files under Windows, e.g.: .../.venv/Scripts/python.exe + BIN_NAME = 'Scripts' + FILE_EXT = '.exe' +else: + # Files under Linux/Mac and all other than Windows, e.g.: .../.venv/bin/python + 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}' +PIP_PATH = BIN_PATH / f'pip{FILE_EXT}' +PIP_SYNC_PATH = BIN_PATH / f'pip-sync{FILE_EXT}' + +DEP_LOCK_PATH = BASE_PATH / 'requirements.dev.txt' +DEP_HASH_PATH = VENV_PATH / '.dep_hash' + +# script file defined in pyproject.toml as [console_scripts] +# (Under Windows: ".exe" not added!) +PROJECT_SHELL_SCRIPT = BIN_PATH / 'dragonpy' + + +def get_dep_hash(): + """Get SHA512 hash from poetry.lock content.""" + return hashlib.sha512(DEP_LOCK_PATH.read_bytes()).hexdigest() + + +def store_dep_hash(): + """Generate .venv/.dep_hash""" + DEP_HASH_PATH.write_text(get_dep_hash()) + + +def venv_up2date(): + """Is existing .venv is up-to-date?""" + if DEP_HASH_PATH.is_file(): + return DEP_HASH_PATH.read_text() == get_dep_hash() + return False + + +def verbose_check_call(*popen_args): + print(f'\n+ {" ".join(str(arg) for arg in popen_args)}\n') + return subprocess.check_call(popen_args) + + +def main(argv): + assert DEP_LOCK_PATH.is_file(), f'File not found: "{DEP_LOCK_PATH}" !' + + # Create virtual env in ".venv/": + if not PYTHON_PATH.is_file(): + print('Create virtual env here:', VENV_PATH.absolute()) + builder = venv.EnvBuilder(symlinks=True, upgrade=True, with_pip=True) + builder.create(env_dir=VENV_PATH) + # 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)) + + # install project + verbose_check_call(PIP_PATH, 'install', '-e', '.') + store_dep_hash() + + # Call our entry point CLI: + try: + verbose_check_call(PROJECT_SHELL_SCRIPT, *sys.argv[1:]) + except subprocess.CalledProcessError as err: + sys.exit(err.returncode) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/devshell.py b/devshell.py deleted file mode 100755 index 9edd6db9..00000000 --- a/devshell.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env python3 - -""" - developer shell - ~~~~~~~~~~~~~~~ - - Just call this file, and the magic happens ;) - - This file is from: https://pypi.org/project/dev-shell/ - Source: https://github.com/jedie/dev-shell/blob/main/devshell.py - - :copyleft: 2021 by Jens Diemer - :license: GNU GPL v3 or above -""" - -import argparse -import hashlib -import signal -import subprocess -import sys -import venv -from pathlib import Path - - -try: - import ensurepip # noqa -except ModuleNotFoundError as err: - print(err) - print('-' * 100) - print('Error: Pip not available!') - print('Hint: "apt-get install python3-venv"\n') - raise - - -assert sys.version_info >= (3, 7), 'Python version is too old!' - - -if sys.platform == 'win32': # wtf - # Files under Windows, e.g.: .../.venv/Scripts/python.exe - BIN_NAME = 'Scripts' - FILE_EXT = '.exe' -else: - # Files under Linux/Mac and all other than Windows, e.g.: .../.venv/bin/python - 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}' -PIP_PATH = BIN_PATH / f'pip{FILE_EXT}' -POETRY_PATH = BIN_PATH / f'poetry{FILE_EXT}' - -DEP_LOCK_PATH = BASE_PATH / 'poetry.lock' -DEP_HASH_PATH = VENV_PATH / '.dep_hash' - -# script file defined in pyproject.toml as [tool.poetry.scripts] -# (Under Windows: ".exe" not added!) -PROJECT_SHELL_SCRIPT = BIN_PATH / 'devshell' - - -def get_dep_hash(): - """Get SHA512 hash from poetry.lock content.""" - return hashlib.sha512(DEP_LOCK_PATH.read_bytes()).hexdigest() - - -def store_dep_hash(): - """Generate /.venv/.dep_hash""" - DEP_HASH_PATH.write_text(get_dep_hash()) - - -def venv_up2date(): - """Is existing .venv is up-to-date?""" - if DEP_HASH_PATH.is_file(): - return DEP_HASH_PATH.read_text() == get_dep_hash() - return False - - -def verbose_check_call(*popen_args): - popen_args = [str(arg) for arg in popen_args] # e.g.: Path() -> str for python 3.7 - print(f'\n+ {" ".join(popen_args)}\n') - return subprocess.check_call(popen_args) - - -def noop_signal_handler(signal_num, frame): - """ - Signal handler that does nothing: Used to ignore "Ctrl-C" signals - """ - pass - - -def main(argv): - if len(argv) == 2 and argv[1] in ('--update', '--help'): - parser = argparse.ArgumentParser( - prog=Path(__file__).name, description='Developer shell', epilog='...live long and prosper...' - ) - parser.add_argument( - '--update', default=False, action='store_true', help='Force create/upgrade virtual environment' - ) - parser.add_argument( - 'command_args', - nargs=argparse.ZERO_OR_MORE, - help='arguments to pass to dev-setup shell/cli', - ) - options = parser.parse_args(argv) - force_update = options.update - extra_args = argv[2:] - else: - force_update = False - extra_args = argv[1:] - - # Create virtual env in ".../.venv/": - if not PYTHON_PATH.is_file() or force_update: - print('Create virtual env here:', VENV_PATH.absolute()) - builder = venv.EnvBuilder(symlinks=True, upgrade=True, with_pip=True) - builder.create(env_dir=VENV_PATH) - - # install/update "pip" and "poetry": - if not POETRY_PATH.is_file() or force_update: - # Note: Under Windows pip.exe can't replace this own .exe file, so use the module way: - verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip', 'setuptools') - verbose_check_call(PIP_PATH, 'install', 'poetry') - - if not DEP_LOCK_PATH.is_file(): - verbose_check_call(POETRY_PATH, 'update') - - # install via poetry, if: - # 1. .venv not exists - # 2. "--update" used - # 3. poetry.lock file was changed - if not PROJECT_SHELL_SCRIPT.is_file() or force_update or not venv_up2date(): - verbose_check_call(POETRY_PATH, 'install') - store_dep_hash() - - # The cmd2 shell should not abort on Ctrl-C => ignore "Interrupt from keyboard" signal: - signal.signal(signal.SIGINT, noop_signal_handler) - - # Run project cmd shell via "setup.py" entrypoint: - # (Call it via python, because Windows sucks calling the file direct) - try: - verbose_check_call(PYTHON_PATH, PROJECT_SHELL_SCRIPT, *extra_args) - except subprocess.CalledProcessError as err: - sys.exit(err.returncode) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/dragonpy/CoCo/CoCo2b_rom.py b/dragonpy/CoCo/CoCo2b_rom.py index 99dbfd94..755a6a19 100644 --- a/dragonpy/CoCo/CoCo2b_rom.py +++ b/dragonpy/CoCo/CoCo2b_rom.py @@ -3,7 +3,7 @@ ================================== :created: 2015 by Jens Diemer - www.jensdiemer.de - :copyleft: 2015-2020 by the DragonPy team, see AUTHORS for more details. + :copyleft: 2015-2023 by the DragonPy team, see AUTHORS for more details. :license: GNU GPL v3 or above, see LICENSE for more details. """ @@ -13,9 +13,9 @@ class CoCo2b_Basic13_ROM(ROMFile): ARCHIVE_EXT = ARCHIVE_EXT_ZIP - URL = "http://www.roust-it.dk/coco/roms/coco2b.zip" - DOWNLOAD_SHA1 = "8935dcde4ee8d9ced8fc748826870ac0c6cf6c3f" # downloaded .zip archive - FILE_COUNT = 2 # How many files are in the archive? + URL = "https://raw.githubusercontent.com/Luciano2018/Batocera_V35_Bios/master/bios/coco2b.zip" + DOWNLOAD_SHA1 = "cc18ec64c5dc181a36c1e333eccb12d6b5441030" # downloaded .zip archive + FILE_COUNT = 3 # How many files are in the archive? SHA1 = "28b92bebe35fa4f026a084416d6ea3b1552b63d3" # extracted ROM FILENAME = "bas13.rom" diff --git a/dragonpy/Dragon32/Dragon32_rom.py b/dragonpy/Dragon32/Dragon32_rom.py index 6582925a..431f2c3f 100644 --- a/dragonpy/Dragon32/Dragon32_rom.py +++ b/dragonpy/Dragon32/Dragon32_rom.py @@ -17,9 +17,8 @@ class Dragon32Rom(ROMFile): ARCHIVE_EXT = ARCHIVE_EXT_ZIP URL = ( - r"http://archive.worldofdragon.org/archive/index.php" - r"?dir=Software/Dragon/Dragon%20Data%20Ltd/Dragon%20Firmware/" - r"&file=Dragon%2032%20-%20IC17%26IC18%20%281982%29%28Dragon%20Data%20Ltd%29%5B%21%5D.zip" + r"https://archive.worldofdragon.org/browse/downloads/Software/Dragon/Dragon%20Data%20Ltd" + r"/Dragon%20Firmware/Dragon%2032%20-%20IC17&IC18%20(1982)(Dragon%20Data%20Ltd)%5B!%5D.zip" ) DOWNLOAD_SHA1 = "2cc4cbf81769746d261063eee20719899a001fed" # downloaded .zip archive FILE_COUNT = 1 # How many files are in the archive? diff --git a/dragonpy/Dragon32/dragon_charmap.py b/dragonpy/Dragon32/dragon_charmap.py index 5c3d89d0..d763cd66 100644 --- a/dragonpy/Dragon32/dragon_charmap.py +++ b/dragonpy/Dragon32/dragon_charmap.py @@ -7,8 +7,11 @@ :copyleft: 2013 by Jens Diemer :license: GNU GPL v3 or above - arrows: http://www.pylucid.org/de/contribute/developer-documentation/unicode-test/decode_unicode/arrows/#8593 - blocks: http://www.pylucid.org/de/contribute/developer-documentation/unicode-test/decode_unicode/block-elements/#9600 + arrows: + http://www.pylucid.org/de/contribute/developer-documentation/unicode-test/decode_unicode/arrows/#8593 + + blocks: + http://www.pylucid.org/de/contribute/developer-documentation/unicode-test/decode_unicode/block-elements/#9600 """ diff --git a/dragonpy/Dragon32/gui_config.py b/dragonpy/Dragon32/gui_config.py index 5fbb23b1..31a5291f 100644 --- a/dragonpy/Dragon32/gui_config.py +++ b/dragonpy/Dragon32/gui_config.py @@ -209,7 +209,8 @@ def command_cycles_per_sec(self, event=None): return self.cycles_per_sec_label_var.set( - f"cycles/sec / 1000000 = {cycles_per_sec / 1000000:f} MHz CPU frequency * 16 = {cycles_per_sec / 1000000 * 16:f} Mhz crystal" + f"cycles/sec / 1000000 = {cycles_per_sec / 1000000:f} MHz" + f" CPU frequency * 16 = {cycles_per_sec / 1000000 * 16:f} Mhz crystal" ) self.runtime_cfg.cycles_per_sec = cycles_per_sec diff --git a/dragonpy/Dragon32/mem_info.py b/dragonpy/Dragon32/mem_info.py index fd8c0be3..32525326 100644 --- a/dragonpy/Dragon32/mem_info.py +++ b/dragonpy/Dragon32/mem_info.py @@ -1,3 +1,5 @@ +# flake8: noqa: E501 + """ DragonPy - Dragon 32 emulator in Python ======================================= diff --git a/dragonpy/__init__.py b/dragonpy/__init__.py index c7a94b77..8840f8fe 100644 --- a/dragonpy/__init__.py +++ b/dragonpy/__init__.py @@ -1,5 +1,6 @@ -import os -import sys +"""dragonpy - Emulator for 6809 CPU based system like Dragon 32 / CoCo written in Python...""" + +from importlib.metadata import version from dragonpy import constants from dragonpy.CoCo.config import CoCo2bCfg @@ -19,7 +20,8 @@ from dragonpy.vectrex.machine import run_Vectrex -__version__ = "0.8.0.rc1" +__version__ = version('DragonPyEmulator') +__author__ = 'Jens Diemer ' machine_dict.register(constants.DRAGON32, (run_Dragon32, Dragon32Cfg), default=True) @@ -29,62 +31,3 @@ machine_dict.register(constants.SIMPLE6809, (run_Simple6809, Simple6809Cfg)) machine_dict.register(constants.MULTICOMP6809, (run_Multicomp6809, Multicomp6809Cfg)) machine_dict.register(constants.VECTREX, (run_Vectrex, VectrexCfg)) - - -def fix_virtualenv_tkinter(): - """ - work-a-round for tkinter under windows in a virtualenv: - "TclError: Can't find a usable init.tcl..." - Known bug, see: https://github.com/pypa/virtualenv/issues/93 - - There are "fix tk" file here: - - C:\\Python27\\Lib\\lib-tk\\FixTk.py - C:\\Python34\\Lib\tkinter\\_fix.py - - These modules will be automatic imported by tkinter import. - - The fix set theses environment variables: - - TCL_LIBRARY C:\\Python27\tcl\tcl8.5 - TIX_LIBRARY C:\\Python27\tcl\tix8.4.3 - TK_LIBRARY C:\\Python27\tcl\tk8.5 - - TCL_LIBRARY C:\\Python34\tcl\tcl8.6 - TIX_LIBRARY C:\\Python34\tcl\tix8.4.3 - TK_LIBRARY C:\\Python34\tcl\tk8.6 - - but only if: - - os.path.exists(os.path.join(sys.prefix,"tcl")) - - And the virtualenv activate script will change the sys.prefix - to the current env. So we temporary change it back to sys.real_prefix - and import the fix module. - If the fix module was imported before, then we reload it. - """ - if "TCL_LIBRARY" in os.environ: - # Fix not needed (e.g. virtualenv issues #93 fixed?) - return - - if not hasattr(sys, "real_prefix"): - # we are not in a activated virtualenv - return - - virtualprefix = sys.base_prefix - sys.base_prefix = sys.real_prefix - - try: - from tkinter import _fix - except ImportError as err: - print(f'Can not apply windows tkinter fix: {err}') - else: - if "TCL_LIBRARY" not in os.environ: - from importlib import reload - reload(_fix) - - sys.base_prefix = virtualprefix - - -if sys.platform.startswith("win"): - fix_virtualenv_tkinter() diff --git a/dragonpy/__main__.py b/dragonpy/__main__.py new file mode 100644 index 00000000..f3939f44 --- /dev/null +++ b/dragonpy/__main__.py @@ -0,0 +1,15 @@ +""" + Allow dragonpy to be executable + through `python -m dragonpy`. +""" + + +from dragonpy.cli import cli_app + + +def main(): + cli_app.main() + + +if __name__ == '__main__': + main() diff --git a/dragonpy/cli/__init__.py b/dragonpy/cli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dragonpy/cli/cli_app.py b/dragonpy/cli/cli_app.py new file mode 100644 index 00000000..14b7e148 --- /dev/null +++ b/dragonpy/cli/cli_app.py @@ -0,0 +1,456 @@ +import inspect +import locale +import logging +import sys +from pathlib import Path + +import rich_click as click +from bx_py_utils.path import assert_is_file +from manageprojects.utilities import code_style +from manageprojects.utilities.publish import publish_package +from manageprojects.utilities.subprocess_utils import verbose_check_call +from manageprojects.utilities.version_info import print_version +from rich import print # noqa +from rich_click import RichGroup + +import dragonpy +from basic_editor.editor import run_basic_editor +from dragonpy import constants +from dragonpy.components.rom import ROMFileError +from dragonpy.constants import VERBOSITY_DEFAULT_VALUE, VERBOSITY_DICT +from dragonpy.core.configs import machine_dict +from dragonpy.core.gui_starter import gui_mainloop + + +logger = logging.getLogger(__name__) + + +# use user's preferred locale +# e.g.: for formatting cycles/sec number +locale.setlocale(locale.LC_ALL, '') + + +PACKAGE_ROOT = Path(dragonpy.__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) +) + + +OPTION_KWARGS_VERBOSITY = dict( + type=click.Choice([str(number) for number in sorted(VERBOSITY_DICT.keys())]), + default=str(VERBOSITY_DEFAULT_VALUE), + show_default=True, + help=", ".join(f'{number}:{text}' for number, text in VERBOSITY_DICT.items()), +) +OPTION_KWARGS_MACHINE = dict( + type=click.Choice(sorted(machine_dict.keys())), + default=machine_dict.DEFAULT, + show_default=True, + help='Used machine configuration', +) + + +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() +@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) +def mypy(verbose: bool = True): + """Run Mypy (configured in pyproject.toml)""" + verbose_check_call('mypy', '.', cwd=PACKAGE_ROOT, verbose=verbose, exit_on_error=True) + + +cli.add_command(mypy) + + +@click.command() +@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) +def coverage(verbose: bool = True): + """ + Run and show coverage. + """ + verbose_check_call('coverage', 'run', verbose=verbose, exit_on_error=True) + verbose_check_call('coverage', 'combine', '--append', verbose=verbose, exit_on_error=True) + verbose_check_call('coverage', 'report', '--fail-under=30', verbose=verbose, exit_on_error=True) + verbose_check_call('coverage', 'xml', verbose=verbose, exit_on_error=True) + verbose_check_call('coverage', 'json', verbose=verbose, exit_on_error=True) + + +cli.add_command(coverage) + + +@click.command() +def install(): + """ + Run pip-sync and install 'dragonpy' via pip as editable. + """ + verbose_check_call('pip-sync', PACKAGE_ROOT / 'requirements.dev.txt') + verbose_check_call('pip', 'install', '-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='./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('safety', 'check', '-r', 'requirements.dev.txt') + + # Install new dependencies in current .venv: + verbose_check_call('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=dragonpy, + package_path=PACKAGE_ROOT, + distribution_name='DragonPyEmulator', + ) + + +cli.add_command(publish) + + +@click.command() +@click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) +@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) +def fix_code_style(color: bool = True, verbose: bool = False): + """ + Fix code style of all dragonpy source code files via darker + """ + code_style.fix(package_root=PACKAGE_ROOT, color=color, verbose=verbose) + + +cli.add_command(fix_code_style) + + +@click.command() +@click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) +@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) +def check_code_style(color: bool = True, verbose: bool = False): + """ + Check code style by calling darker + flake8 + """ + code_style.check(package_root=PACKAGE_ROOT, color=color, verbose=verbose) + + +cli.add_command(check_code_style) + + +@click.command() +def update_test_snapshot_files(): + """ + Update all test snapshot files (by remove and recreate all snapshot files) + """ + + def iter_snapshot_files(): + yield from PACKAGE_ROOT.rglob('*.snapshot.*') + + removed_file_count = 0 + for item in iter_snapshot_files(): + item.unlink() + removed_file_count += 1 + print(f'{removed_file_count} test snapshot files removed... run tests...') + + # Just recreate them by running tests: + _run_unittest_cli( + extra_env=dict( + RAISE_SNAPSHOT_ERRORS='0', # Recreate snapshot files without error + ), + verbose=False, + exit_after_run=False, + ) + + new_files = len(list(iter_snapshot_files())) + print(f'{new_files} test snapshot files created, ok.\n') + + +cli.add_command(update_test_snapshot_files) + + +def _run_unittest_cli(extra_env=None, verbose=True, exit_after_run=True): + """ + Call the origin unittest CLI and pass all args to it. + """ + if extra_env is None: + extra_env = dict() + + extra_env.update( + dict( + PYTHONUNBUFFERED='1', + PYTHONWARNINGS='always', + ) + ) + + args = sys.argv[2:] + if not args: + if verbose: + args = ('--verbose', '--locals', '--buffer') + else: + args = ('--locals', '--buffer') + + verbose_check_call( + sys.executable, + '-m', + 'unittest', + *args, + timeout=15 * 60, + extra_env=extra_env, + ) + if exit_after_run: + sys.exit(0) + + +@click.command() # Dummy command +def test(): + """ + Run unittests + """ + _run_unittest_cli() + + +cli.add_command(test) + + +def _run_tox(): + verbose_check_call(sys.executable, '-m', 'tox', *sys.argv[2:]) + sys.exit(0) + + +@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) + + +@click.command() +def gui(): + """Start the DragonPy tkinter starter GUI""" + gui_mainloop(confirm_exit=False) + + +cli.add_command(gui) + + +@click.command() +@click.option('--verbosity', **OPTION_KWARGS_VERBOSITY) +@click.option('--trace/--no-trace', **OPTION_ARGS_DEFAULT_FALSE, help='Create trace lines') +@click.option( + '--max-ops', + type=int, + default=None, + show_default=True, + help='If given: Stop CPU after given cycles else: run forever', +) +@click.option('--machine', **OPTION_KWARGS_MACHINE) +def run(machine: str, trace: bool, max_ops: int | None, verbosity: str): + """Run a machine emulation""" + machine_run_func, MachineConfigClass = machine_dict[machine] + print(f'Use machine func: {machine_run_func.__name__}') + cfg_dict = { + 'verbosity': int(verbosity), + 'trace': trace, + 'max_ops': max_ops, + } + print(cfg_dict) + machine_run_func(cfg_dict) + + +cli.add_command(run) + + +@click.command() +@click.option('--verbosity', **OPTION_KWARGS_VERBOSITY) +@click.option('--machine', **OPTION_KWARGS_MACHINE) +def editor(machine: str, verbosity: str): + """ + Run only the BASIC editor + """ + machine_run_func, MachineConfigClass = machine_dict[machine] + cfg_dict = { + 'verbosity': int(verbosity), + 'trace': False, + 'max_ops': None, + } + machine_cfg = MachineConfigClass(cfg_dict) + run_basic_editor(machine_cfg) + + +cli.add_command(editor) + + +@click.command() +@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) +@click.option( + '--machines', + '-m', + multiple=True, + type=click.Choice(sorted(machine_dict.keys())), + default=None, + help='Download ROM only for given machine(s). Leave empty to download all known ROMs', +) +def download_roms(machines: tuple[str] | None, verbose: bool = True): + """ + Download/Test only ROM files + """ + if not machines: + machines = sorted(machine_dict.keys()) + print(f'Download ROMs for {machines}') + success = 0 + for machine_name in machines: + machine_run_func, machine_cfg = machine_dict[machine_name] + print(f'Download / test ROM for {machine_name}:') + + for rom in machine_cfg.DEFAULT_ROMS: + print(f"\tROM file: {rom.FILENAME}") + try: + content = rom.get_data() + except ROMFileError as err: + print(f'[red]{err}') + continue + + size = len(content) + print(f"\tfile size is ${size:04x} (dez.: {size:d}) Bytes\n") + success += 1 + + print(f'{success} ROMs succeed.') + + +cli.add_command(download_roms) + + +@click.command() +def log_list(): + """ + List all exiting loggers and exit. + """ + print("A list of all loggers:") + for log_name in sorted(logging.Logger.manager.loggerDict): + print(f"\t{log_name}") + + +cli.add_command(log_list) + + +def main(): + print_version(dragonpy) + print( + inspect.cleandoc( + """ + ******************************************************** + * DragonPy is a Open source (GPL v3 or later) emulator * + * for the 30 years old homecomputer Dragon 32 * + * and Tandy TRS-80 Color Computer (CoCo)... * + ******************************************************** + * Homepage: https://github.com/jedie/DragonPy * + ******************************************************** + """ + ) + ) + + if len(sys.argv) >= 2: + # Check if we just pass a command call + command = sys.argv[1] + if command == 'test': + _run_unittest_cli() + elif command == 'tox': + _run_tox() + + # Execute Click CLI: + cli.name = './cli.py' + cli() diff --git a/dragonpy/components/rom.py b/dragonpy/components/rom.py index 872c3883..96f47c2f 100644 --- a/dragonpy/components/rom.py +++ b/dragonpy/components/rom.py @@ -7,15 +7,16 @@ :license: GNU GPL v3 or above, see LICENSE for more details. """ - import hashlib import logging import os import zipfile -from urllib.error import HTTPError +from urllib.error import URLError from urllib.request import urlopen from zipfile import BadZipFile +from rich import print # noqa + import dragonpy @@ -24,15 +25,26 @@ log = logging.getLogger(__name__) -class ROMFileNotFound(Exception): +class ROMFileError(Exception): + pass + + +class ROMFileNotFound(ROMFileError): pass -class ROMDownloadError(Exception): +class ROMDownloadError(ROMFileError): def __init__(self, url, origin_err): self.url = url self.origin_err = origin_err + def __str__(self): + return f'Download {self.url!r} -> {self.origin_err}' + + +class ROMHashError(ROMFileError): + pass + class ROMFile: ROM_PATH = os.path.normpath( @@ -74,7 +86,7 @@ def get_data(self): # Check SHA hash: current_sha1 = hashlib.sha1(data).hexdigest() assert current_sha1 == self.SHA1, f"ROM sha1 value is wrong! SHA1 is: {current_sha1!r}" - print(f"ROM SHA1: {current_sha1!r}, ok.") + print(f"[green]ROM SHA1: {current_sha1!r}, ok.") if self.max_size: filesize = os.stat(self.rom_path).st_size @@ -150,7 +162,7 @@ def download(self): # Warning: HTTPS requests do not do any verification of the server's certificate. try: f = urlopen(self.URL) - except HTTPError as err: + except URLError as err: log.error(f'Download error: {err}') raise ROMDownloadError(url=self.URL, origin_err=err) @@ -160,8 +172,10 @@ def download(self): # Check SHA hash: current_sha1 = hashlib.sha1(content).hexdigest() - assert current_sha1 == self.DOWNLOAD_SHA1, ( - f"Download sha1 value is wrong! SHA1 is:" - f" {current_sha1!r} and not {self.DOWNLOAD_SHA1!r}" - ) - print(f"Download SHA1: {current_sha1!r}, ok.") + if current_sha1 != self.DOWNLOAD_SHA1: + raise ROMHashError( + f"Download sha1 value is wrong! SHA1 is: {current_sha1!r} and not {self.DOWNLOAD_SHA1!r}" + f"\nArchive file: {self.archive_path}" + f"\nURL:{self.URL!r} " + ) + print(f"[green]Download SHA1: {current_sha1!r}, ok.") diff --git a/dragonpy/constants.py b/dragonpy/constants.py index c97a94e2..b1a782e7 100644 --- a/dragonpy/constants.py +++ b/dragonpy/constants.py @@ -1,3 +1,5 @@ +CLI_EPILOG = 'Project Homepage: https://github.com/john-doh/dragonpy' + DRAGON32 = "Dragon32" DRAGON64 = "Dragon64" COCO2B = "CoCo2b" @@ -5,3 +7,32 @@ SIMPLE6809 = "Simple6809" MULTICOMP6809 = "Multicomp6809" VECTREX = "Vectrex" + +VERBOSITY_DICT = { + 1: "hardcode DEBUG ;)", + 10: "DEBUG", + 20: "INFO", + 30: "WARNING", + 40: "ERROR", + 50: "CRITICAL/FATAL", + 99: "nearly all off", + 100: "all off", +} +VERBOSITY_DEFAULT_VALUE = 100 +VERBOSITY_DICT2 = {} +VERBOSITY_STRINGS = [] +VERBOSITY_DEFAULT = None + +for no, text in sorted(VERBOSITY_DICT.items()): + text = f"{no:3d}: {text}" + if no == VERBOSITY_DEFAULT_VALUE: + VERBOSITY_DEFAULT = text + VERBOSITY_STRINGS.append(text) + VERBOSITY_DICT2[text] = no + +# print(VERBOSITY_STRINGS) +# print(VERBOSITY_DICT2) +# print(VERBOSITY_DEFAULT_VALUE, VERBOSITY_DEFAULT) + +assert VERBOSITY_DEFAULT is not None +assert VERBOSITY_DICT2[VERBOSITY_DEFAULT] == VERBOSITY_DEFAULT_VALUE diff --git a/dragonpy/core/gui_starter.py b/dragonpy/core/gui_starter.py index e5f3cdd2..da5b0781 100644 --- a/dragonpy/core/gui_starter.py +++ b/dragonpy/core/gui_starter.py @@ -12,49 +12,21 @@ import logging import tkinter as tk -from dev_shell.utils.colorful import bright_blue -from dev_shell.utils.subprocess_utils import verbose_check_call -from MC6809.cli import DEFAULT_LOOPS, DEFAULT_MULTIPLY -from MC6809.core.bechmark import run_benchmark +from manageprojects.utilities.subprocess_utils import verbose_check_call +from rich import print # noqa import dragonpy from dragonpy import constants +from dragonpy.constants import VERBOSITY_DEFAULT, VERBOSITY_DICT2, VERBOSITY_STRINGS from dragonpy.core.configs import machine_dict from dragonpy.utils.humanize import get_python_info +from MC6809.core.bechmark import run_benchmark -log = logging.getLogger(__name__) - - -VERBOSITY_DICT = { - 1: "hardcode DEBUG ;)", - 10: "DEBUG", - 20: "INFO", - 30: "WARNING", - 40: "ERROR", - 50: "CRITICAL/FATAL", - 99: "nearly all off", - 100: "all off", -} -VERBOSITY_DEFAULT_VALUE = 100 - -VERBOSITY_DICT2 = {} -VERBOSITY_STRINGS = [] -VERBOSITY_DEFAULT = None - -for no, text in sorted(VERBOSITY_DICT.items()): - text = f"{no:3d}: {text}" - if no == VERBOSITY_DEFAULT_VALUE: - VERBOSITY_DEFAULT = text - VERBOSITY_STRINGS.append(text) - VERBOSITY_DICT2[text] = no - -# print(VERBOSITY_STRINGS) -# print(VERBOSITY_DICT2) -# print(VERBOSITY_DEFAULT_VALUE, VERBOSITY_DEFAULT) +DEFAULT_LOOPS = 5 +DEFAULT_MULTIPLY = 15 -assert VERBOSITY_DEFAULT is not None -assert VERBOSITY_DICT2[VERBOSITY_DEFAULT] == VERBOSITY_DEFAULT_VALUE +log = logging.getLogger(__name__) class SettingsFrame(tk.LabelFrame): @@ -196,8 +168,7 @@ def set_status_bar(self): self.status_bar.set_label("dragonpy_version", f"DragonPy v{dragonpy.__version__}", **defaults) def _print_run_info(self, txt): - print("\n") - print(bright_blue(txt)) + print(f"\n[blue bold]{txt}") def _run_dragonpy_cli(self, *args): """ @@ -209,7 +180,8 @@ def _run_dragonpy_cli(self, *args): log.debug(f"Verbosity: {verbosity_no:d} ({verbosity})") args = ( - 'devshell', + 'python3', + 'cli.py', *args, "--verbosity", f"{verbosity_no}" # "--log_list", @@ -217,6 +189,7 @@ def _run_dragonpy_cli(self, *args): # "dragonpy.components.cpu6809,40", # "dragonpy.Dragon32.MC6821_PIA,50", ) + print(args) verbose_check_call(*args, verbose=True) def _run_command(self, command): diff --git a/dragonpy/dev_shell.py b/dragonpy/dev_shell.py deleted file mode 100644 index 08c0b8e9..00000000 --- a/dragonpy/dev_shell.py +++ /dev/null @@ -1,208 +0,0 @@ -import argparse -import locale -import logging -from pathlib import Path -from pprint import pprint - -import cmd2 -from cmd2 import Cmd2ArgumentParser -from dev_shell.base_cmd2_app import DevShellBaseApp, run_cmd2_app -from dev_shell.command_sets import DevShellBaseCommandSet -from dev_shell.command_sets.dev_shell_commands import DevShellCommandSet as OriginDevShellCommandSet -from dev_shell.config import DevShellConfig -from dev_shell.utils.colorful import blue, bright_blue, bright_yellow, cyan, print_error -from dev_shell.utils.subprocess_utils import verbose_check_call -from poetry_publish.publish import poetry_publish - -import dragonpy -from basic_editor.editor import run_basic_editor -from dragonpy.components.rom import ROMDownloadError -from dragonpy.core.configs import machine_dict -from dragonpy.core.gui_starter import VERBOSITY_DICT, gui_mainloop - - -PACKAGE_ROOT = Path(dragonpy.__file__).parent.parent.parent - - -# use user's preferred locale -# e.g.: for formatting cycles/sec number -locale.setlocale(locale.LC_ALL, '') - - -def add_argument_machine(parser: Cmd2ArgumentParser): - parser.add_argument( - '--machine', - choices=sorted(machine_dict.keys()), - default=machine_dict.DEFAULT, - help='Used machine configuration (default: %(default)s)', - ) - - -def add_argument_verbosity(parser: Cmd2ArgumentParser): - parser.add_argument( - '--verbosity', - type=int, - choices=sorted(VERBOSITY_DICT.keys()), - default=99, - help='verbosity level to stdout (default: %(default)s)', - ) - - -@cmd2.with_default_category('DragonPy commands') -class DragonPyCommandSet(DevShellBaseCommandSet): - def do_gui(self, statement: cmd2.Statement): - """ - Start the DragonPy tkinter starter GUI - """ - gui_mainloop(confirm_exit=False) - - def do_download_roms(self, statement: cmd2.Statement): - """ - Download/Test only ROM files - """ - roms = list(machine_dict.items()) - print(f'Download {len(roms)} platform roms...') - success = 0 - for machine_name, data in roms: - machine_config = data[1] - print(blue(f'Download / test ROM for {bright_blue(machine_name)}:')) - - for rom in machine_config.DEFAULT_ROMS: - print(f"\tROM file: {cyan(rom.FILENAME)}") - try: - content = rom.get_data() - except ROMDownloadError as err: - print_error(f'Download {err.url!r} -> {err.origin_err}') - continue - - size = len(content) - print(f"\tfile size is ${size:04x} (dez.: {size:d}) Bytes\n") - success += 1 - - print(f'{success} ROMs succeed.') - - run_parser = cmd2.Cmd2ArgumentParser() - add_argument_machine(run_parser) - run_parser.add_argument( - '--max-ops', - type=int, - default=None, - help='If given: Stop CPU after given cycles else: run forever (default: %(default)s)', - ) - run_parser.add_argument( - '--trace', - action='store_true', - help='Create trace lines (default: %(default)s)', - ) - add_argument_verbosity(run_parser) - - @cmd2.with_argparser(run_parser, preserve_quotes=True) - def do_run(self, ns: argparse.Namespace): - """ - Run a machine emulation - """ - machine_run_func, MachineConfigClass = machine_dict[ns.machine] - print("Use machine func: %s", machine_run_func.__name__) - cfg_dict = { - 'verbosity': ns.verbosity, - 'trace': ns.trace, - 'max_ops': ns.max_ops, - } - pprint(cfg_dict) - machine_run_func(cfg_dict) - - run_editor = cmd2.Cmd2ArgumentParser() - add_argument_machine(run_editor) - add_argument_verbosity(run_editor) - - @cmd2.with_argparser(run_editor, preserve_quotes=True) - def do_editor(self, ns: argparse.Namespace): - """ - Run only the BASIC editor - """ - machine = ns.machine - machine_run_func, MachineConfigClass = machine_dict[machine] - cfg_dict = { - 'verbosity': ns.verbosity, - 'trace': False, - 'max_ops': None, - } - machine_cfg = MachineConfigClass(cfg_dict) - run_basic_editor(machine_cfg) - - def do_log_list(self, statement: cmd2.Statement): - """ - List all exiting loggers and exit. - """ - print("A list of all loggers:") - for log_name in sorted(logging.Logger.manager.loggerDict): - print(f"\t{log_name}") - - -class DevShellCommandSet(OriginDevShellCommandSet): - - def do_publish(self, statement: cmd2.Statement): - """ - Publish "dev-shell" to PyPi - """ - # don't publish if code style wrong: - verbose_check_call('darker', '--check') - - # don't publish if test fails: - verbose_check_call('pytest', '-x') - - poetry_publish( - package_root=PACKAGE_ROOT, - version=dragonpy.__version__, - creole_readme=True, # don't publish if README.rst is not up-to-date - ) - - -class DevShellApp(DevShellBaseApp): - # Remove some commands: - delattr(cmd2.Cmd, 'do_edit') - delattr(cmd2.Cmd, 'do_shell') - delattr(cmd2.Cmd, 'do_run_script') - delattr(cmd2.Cmd, 'do_run_pyscript') - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.intro = f'Developer shell - {bright_yellow("DragonPy")} - v{dragonpy.__version__}\n' - self.intro += """ - ******************************************************** - * DragonPy is a Open source (GPL v3 or later) emulator * - * for the 30 years old homecomputer Dragon 32 * - * and Tandy TRS-80 Color Computer (CoCo)... * - ******************************************************** - * Homepage: https://github.com/jedie/DragonPy * - ******************************************************** - """ - - -def get_devshell_app_kwargs(): - """ - Generate the kwargs for the cmd2 App. - (Separated because we needs the same kwargs in tests) - """ - config = DevShellConfig(package_module=dragonpy) - - # initialize all CommandSet() with context: - kwargs = dict(config=config) - - app_kwargs = dict( - config=config, - command_sets=[ - DragonPyCommandSet(**kwargs), - DevShellCommandSet(**kwargs), - ], - ) - return app_kwargs - - -def devshell_cmdloop(): - """ - Entry point to start the "dev-shell" cmd2 app. - Used in: [tool.poetry.scripts] - """ - app = DevShellApp(**get_devshell_app_kwargs()) - run_cmd2_app(app) # Run a cmd2 App as CLI or shell diff --git a/dragonpy/sbc09/mem_info.py b/dragonpy/sbc09/mem_info.py index 4f97ce29..69f2c082 100644 --- a/dragonpy/sbc09/mem_info.py +++ b/dragonpy/sbc09/mem_info.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +# flake8: noqa: E501 """ DragonPy - sbc09 memory info diff --git a/dragonpy/tests/test_base.py b/dragonpy/tests/test_base.py index eefb5ba4..3a110a15 100644 --- a/dragonpy/tests/test_base.py +++ b/dragonpy/tests/test_base.py @@ -19,8 +19,6 @@ import time from dragonlib.tests.test_base import BaseTestCase -from MC6809.components.cpu6809 import CPU - from dragonpy.components.memory import Memory from dragonpy.core.machine import Machine from dragonpy.Dragon32.config import Dragon32Cfg @@ -30,12 +28,16 @@ from dragonpy.Simple6809.config import Simple6809Cfg from dragonpy.Simple6809.periphery_simple6809 import Simple6809PeripheryUnittest from dragonpy.tests.test_config import TestCfg +from dragonpy.tests.utils import no_http_requests +from MC6809.components.cpu6809 import CPU log = logging.getLogger(__name__) class BaseCPUTestCase(BaseTestCase): + no_http_requests() # FIXME: Find a better place for this! + UNITTEST_CFG_DICT = { "verbosity": None, "display_cycle": False, diff --git a/dragonpy/tests/test_devshell_commands.py b/dragonpy/tests/test_devshell_commands.py deleted file mode 100644 index e53bc2df..00000000 --- a/dragonpy/tests/test_devshell_commands.py +++ /dev/null @@ -1,61 +0,0 @@ -from cmd2 import CommandResult -from cmd2_ext_test import ExternalTestMixin -from dev_shell.tests.fixtures import CmdAppBaseTestCase - -from dragonpy.dev_shell import DevShellApp, get_devshell_app_kwargs - - -class DevShellAppTester(ExternalTestMixin, DevShellApp): - pass - - -class DevShellAppBaseTestCase(CmdAppBaseTestCase): - """ - Base class for dev-shell tests - """ - - def get_app_instance(self): - # Init the test app with the same kwargs as the real app - # see: dev_shell.cmd2app.devshell_cmdloop() - app = DevShellAppTester(**get_devshell_app_kwargs()) - return app - - -class DragonPyDevShellTestCase(DevShellAppBaseTestCase): - def test_help_raw(self): - out = self.app.app_cmd('help') - - assert isinstance(out, CommandResult) - stdout = out.stdout - assert 'Documented commands' in stdout - assert 'gui' in stdout - assert 'download_roms' in stdout - assert 'run' in stdout - assert 'editor' in stdout - assert 'log_list' in stdout - - def test_help_via_execute(self): - stdout, stderr = self.execute('help') - assert stderr == '' - assert 'Documented commands' in stdout - assert 'gui' in stdout - assert 'download_roms' in stdout - assert 'run' in stdout - assert 'editor' in stdout - assert 'log_list' in stdout - - def test_help_run(self): - stdout, stderr = self.execute('help run') - assert stderr == '' - assert 'Usage: run [-h]' in stdout - assert '--machine ' in stdout - assert ' --max-ops MAX_OPS ' in stdout - assert 'CoCo2b, Dragon32, Dragon64' in stdout - - def test_download_roms(self): - stdout, stderr = self.execute('download_roms') - print(stdout) - print(stderr) - assert stderr == '' - assert 'Download 7 platform roms...\n' in stdout - assert '\n9 ROMs succeed.\n' in stdout diff --git a/dragonpy/tests/test_doctests.py b/dragonpy/tests/test_doctests.py new file mode 100644 index 00000000..bfe19b1a --- /dev/null +++ b/dragonpy/tests/test_doctests.py @@ -0,0 +1,13 @@ +from bx_py_utils.test_utils.unittest_utils import BaseDocTests + +import basic_editor +import dragonpy +import misc +import PyDC + + +class DocTests(BaseDocTests): + def test_doctests(self): + self.run_doctests( + modules=(dragonpy, basic_editor, misc, PyDC), + ) diff --git a/dragonpy/tests/test_project_setup.py b/dragonpy/tests/test_project_setup.py new file mode 100644 index 00000000..4e0f5a0b --- /dev/null +++ b/dragonpy/tests/test_project_setup.py @@ -0,0 +1,72 @@ +import subprocess +from pathlib import Path +from unittest import TestCase + + +try: + import tomllib # New in Python 3.11 +except ImportError: + import tomli as tomllib + +from bx_py_utils.path import assert_is_file +from manageprojects.test_utils.click_cli_utils import subprocess_cli +from manageprojects.utilities import code_style + +from dragonpy import __version__ +from dragonpy.cli.cli_app import PACKAGE_ROOT + + +class ProjectSetupTestCase(TestCase): + def test_version(self): + pyproject_toml_path = Path(PACKAGE_ROOT, 'pyproject.toml') + assert_is_file(pyproject_toml_path) + + self.assertIsNotNone(__version__) + + pyproject_toml = tomllib.loads(pyproject_toml_path.read_text(encoding='UTF-8')) + pyproject_version = pyproject_toml['project']['version'] + + self.assertEqual(__version__, pyproject_version) + + cli_bin = PACKAGE_ROOT / 'cli.py' + assert_is_file(cli_bin) + + output = subprocess.check_output([cli_bin, 'version'], text=True) + self.assertIn(f'dragonpy v{__version__}', output) + + def test_code_style(self): + cli_bin = PACKAGE_ROOT / 'cli.py' + assert_is_file(cli_bin) + + try: + output = subprocess_cli( + cli_bin=cli_bin, + args=('check-code-style',), + exit_on_error=False, + ) + except subprocess.CalledProcessError as err: + self.assertIn('.venv/bin/darker', err.stdout) # darker was called? + else: + if 'Code style: OK' in output: + self.assertIn('.venv/bin/darker', output) # darker was called? + return # Nothing to fix -> OK + + # Try to "auto" fix code style: + + try: + output = subprocess_cli( + cli_bin=cli_bin, + args=('fix-code-style',), + exit_on_error=False, + ) + except subprocess.CalledProcessError as err: + output = err.stdout + + self.assertIn('.venv/bin/darker', output) # darker was called? + + # Check again and display the output: + + try: + code_style.check(package_root=PACKAGE_ROOT) + except SystemExit as err: + self.assertEqual(err.code, 0, 'Code style error, see output above!') diff --git a/dragonpy/tests/test_readme.py b/dragonpy/tests/test_readme.py new file mode 100644 index 00000000..bb778f77 --- /dev/null +++ b/dragonpy/tests/test_readme.py @@ -0,0 +1,49 @@ +from bx_py_utils.auto_doc import assert_readme_block +from bx_py_utils.path import assert_is_file +from manageprojects.test_utils.click_cli_utils import invoke_click +from manageprojects.tests.base import BaseTestCase + +from dragonpy import constants +from dragonpy.cli.cli_app import PACKAGE_ROOT, cli + + +def assert_cli_help_in_readme(text_block: str, marker: str): + README_PATH = PACKAGE_ROOT / 'README.md' + assert_is_file(README_PATH) + + text_block = text_block.replace(constants.CLI_EPILOG, '') + text_block = f'```\n{text_block.strip()}\n```' + assert_readme_block( + readme_path=README_PATH, + text_block=text_block, + start_marker_line=f'[comment]: <> (✂✂✂ auto generated {marker} start ✂✂✂)', + end_marker_line=f'[comment]: <> (✂✂✂ auto generated {marker} end ✂✂✂)', + ) + + +class ReadmeTestCase(BaseTestCase): + def test_main_help(self): + stdout = invoke_click(cli, '--help') + self.assert_in_content( + got=stdout, + parts=( + 'Usage: ./cli.py [OPTIONS] COMMAND [ARGS]...', + ' gui ', + ' run ', + 'Run a machine emulation', + constants.CLI_EPILOG, + ), + ) + assert_cli_help_in_readme(text_block=stdout, marker='main help') + + def test_run_help(self): + stdout = invoke_click(cli, 'run', '--help') + self.assert_in_content( + got=stdout, + parts=( + 'Usage: ./cli.py run [OPTIONS]', + ' --machine ', + 'Dragon32', + ), + ) + assert_cli_help_in_readme(text_block=stdout, marker='run help') diff --git a/dragonpy/tests/test_rom_download.py b/dragonpy/tests/test_rom_download.py index d00eb101..613061e6 100644 --- a/dragonpy/tests/test_rom_download.py +++ b/dragonpy/tests/test_rom_download.py @@ -16,9 +16,12 @@ from dragonpy.Dragon64.Dragon64_rom import Dragon64RomIC17, Dragon64RomIC18 from dragonpy.Multicomp6809.Multicomp6809_rom import Multicomp6809Rom from dragonpy.Simple6809.Simple6809_rom import Simple6809Rom +from dragonpy.tests.utils import no_http_requests class ROMTest(unittest.TestCase): + no_http_requests() # FIXME: Find a better place for this! + def _test_rom(self, rom: ROMFile): data = rom.get_data() self.assertIsNotNone(data) diff --git a/dragonpy/tests/conftest.py b/dragonpy/tests/utils.py similarity index 86% rename from dragonpy/tests/conftest.py rename to dragonpy/tests/utils.py index 1435fa29..51975cd3 100644 --- a/dragonpy/tests/conftest.py +++ b/dragonpy/tests/utils.py @@ -1,10 +1,7 @@ import socket from unittest.mock import patch -import pytest - -@pytest.fixture(autouse=True, scope='session') def no_http_requests(): """ Deny any request in tests ;) diff --git a/dragonpy/vectrex/MOS6522.py b/dragonpy/vectrex/MOS6522.py index 025ee5fe..dfcae27a 100755 --- a/dragonpy/vectrex/MOS6522.py +++ b/dragonpy/vectrex/MOS6522.py @@ -132,7 +132,7 @@ def write_byte(self, cpu_cycles, op_address, address, value): def snd_update(self): switch_orb = self.via_orb & 0x18 if switch_orb == 0x10: - if(self.snd_select != 14): + if self.snd_select != 14: self.snd_regs[self.snd_select] = self.via_ora elif switch_orb == 0x18: if ((self.via_ora & 0xf0) == 0x00): @@ -150,15 +150,15 @@ def alg_update(self): self.alg_rsh = self.alg_xsh elif switch_orb == 0x04: self.alg_jsh = self.alg_jch2 - if ((self.via_orb & 0x01) == 0x00): - if(self.alg_xsh > 0x80): + if (self.via_orb & 0x01) == 0x00: + if self.alg_xsh > 0x80: self.alg_zsh = self.alg_xsh - 0x80 else: self.alg_zsh = 0 elif switch_orb == 0x06: self.alg_jsh = self.alg_jch3 - if(self.alg_jsh > self.alg_xsh): + if self.alg_jsh > self.alg_xsh: self.alg_compare = 0x20 else: self.alg_compare = 0 @@ -169,8 +169,8 @@ def alg_update(self): def read8(self, address): switch_addr = address & 0xf if switch_addr == 0x0: - if(self.via_acr & 0x80): - data = ((self.via_orb & 0x5f) | self.via_t1pb7 | self.alg_compare) + if self.via_acr & 0x80: + data = (self.via_orb & 0x5F) | self.via_t1pb7 | self.alg_compare else: data = ((self.via_orb & 0xdf) | self.alg_compare) return data & 0xff @@ -311,10 +311,10 @@ def write8(self, address, data): if ((self.via_ifr & 0x7f) & (self.via_ier & 0x7f)): self.via_ifr |= 0x80 else: - self.via_ifr &= 0x7f - elif switch_addr == 0xe: - if(data & 0x80): - self.via_ier |= data & 0x7f + self.via_ifr &= 0x7F + elif switch_addr == 0xE: + if data & 0x80: + self.via_ier |= data & 0x7F else: self.via_ier &= (~(data & 0x7f)) if ((self.via_ifr & 0x7f) & (self.via_ier & 0x7f)): diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 3ae603eb..00000000 --- a/poetry.lock +++ /dev/null @@ -1,1353 +0,0 @@ -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "attrs" -version = "22.1.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] - -[[package]] -name = "black" -version = "21.6b0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.8.1,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] -python2 = ["typed-ast (>=1.4.2)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "bleach" -version = "5.0.1" -description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] -dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "mypy (==0.961)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)"] - -[[package]] -name = "certifi" -version = "2022.9.24" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "2.1.1" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "cmd2" -version = "2.4.2" -description = "cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -attrs = ">=16.3.0" -pyperclip = ">=1.6" -pyreadline3 = {version = "*", markers = "sys_platform == \"win32\""} -wcwidth = ">=0.1.7" - -[package.extras] -dev = ["codecov", "doc8", "flake8", "invoke", "mypy (==0.902)", "nox", "pytest (>=4.6)", "pytest-cov", "pytest-mock", "sphinx", "sphinx-autobuild", "sphinx-rtd-theme", "twine (>=1.11)"] -test = ["codecov", "coverage", "gnureadline", "pytest (>=4.6)", "pytest-cov", "pytest-mock"] -validate = ["flake8", "mypy (==0.902)", "types-pkg-resources"] - -[[package]] -name = "cmd2-ext-test" -version = "2.0.0" -description = "External test plugin for cmd2. Allows for external invocation of commands as if from a cmd2 pyscript" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cmd2 = ">=2,<3" - -[package.extras] -dev = ["codecov", "invoke", "pylint", "pytest", "pytest-cov", "setuptools-scm", "twine", "wheel"] -test = ["codecov", "coverage", "pytest", "pytest-cov"] - -[[package]] -name = "colorama" -version = "0.4.5" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] - -[[package]] -name = "coverage" -version = "6.5.0" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "cryptography" -version = "38.0.1" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] - -[[package]] -name = "darker" -version = "1.5.1" -description = "Apply Black formatting only in regions changed since last commit" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -black = ">=21.5b1" -toml = ">=0.10.0" - -[package.extras] -color = ["Pygments (>=2.4.0)"] -isort = ["isort (>=5.0.1)"] -release = ["airium (>=0.2.3)", "click (>=8.0.0)", "defusedxml (>=0.7.1)", "requests-cache (>=0.7)"] -test = ["airium (>=0.2.3)", "black (>=21.7b1)", "defusedxml (>=0.7.1)", "isort (>=5.0.1)", "pygments", "pytest (>=6.2.0)", "pytest-darker", "pytest-kwparametrize (>=0.0.3)", "regex (>=2021.4.4)", "requests-cache (>=0.7)", "ruamel.yaml (>=0.17.21)", "twine (>=2.0.0)", "types-requests (>=2.27.9)", "types-toml (>=0.10.4)", "wheel (>=0.21.0)"] - -[[package]] -name = "dev-shell" -version = "0.6.1" -description = "Devloper shell for easy startup..." -category = "dev" -optional = false -python-versions = ">=3.7,<4.0.0" - -[package.dependencies] -cmd2 = "*" -gnureadline = {version = "*", markers = "sys_platform == \"darwin\""} - -[[package]] -name = "distlib" -version = "0.3.6" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.19" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "dragonlib" -version = "0.1.7" -description = "Library around 6809 computers like Dragon 32/64, CoCo..." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[[package]] -name = "filelock" -version = "3.8.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"] -testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "flake8" -version = "5.0.4" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.9.0,<2.10.0" -pyflakes = ">=2.5.0,<2.6.0" - -[[package]] -name = "gnureadline" -version = "8.1.2" -description = "The standard Python readline extension statically linked against the GNU readline library." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "importlib-metadata" -version = "5.0.0" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "isort" -version = "5.10.1" -description = "A Python utility / library to sort Python imports." -category = "dev" -optional = false -python-versions = ">=3.6.1,<4.0" - -[package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] - -[[package]] -name = "jaraco.classes" -version = "3.2.3" -description = "Utility functions for Python class constructs" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] - -[[package]] -name = "keyring" -version = "23.9.3" -description = "Store and access your passwords safely." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -"jaraco.classes" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "mc6809" -version = "0.6.0" -description = "MC6809 CPU emulator written in Python" -category = "main" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -click = ">=7.0,<8.0" - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "more-itertools" -version = "9.0.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pathspec" -version = "0.10.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pkginfo" -version = "1.8.3" -description = "Query metadatdata from sdists / bdists / installed packages." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.extras] -testing = ["coverage", "nose"] - -[[package]] -name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "poetry-publish" -version = "0.5.0" -description = "Helper to build and upload a project that used poetry to PyPi, with prechecks" -category = "dev" -optional = false -python-versions = ">=3.7,<4.0.0" - -[package.dependencies] -python-creole = "*" -twine = "*" - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pycodestyle" -version = "2.9.1" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyflakes" -version = "2.5.0" -description = "passive checker of Python programs" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "Pygments" -version = "2.13.0" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pyperclip" -version = "1.8.2" -description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pyreadline3" -version = "3.4.1" -description = "A python implementation of GNU readline." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pytest" -version = "7.1.3" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "4.0.0" -description = "Pytest plugin for measuring coverage." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] - -[[package]] -name = "pytest-darker" -version = "0.1.2" -description = "A pytest plugin for checking of modified code using Darker" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -darker = ">=1.1.0" - -[package.extras] -test = ["mypy (>=0.782)", "pytest (>=6.0.1)", "pytest-black", "pytest-isort (>=1.1.0)", "pytest-mypy"] - -[[package]] -name = "python-creole" -version = "1.4.10" -description = "python-creole is an open-source (GPL) markup converter in pure Python for: creole2html, html2creole, html2ReSt, html2textile" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0.0" - -[package.dependencies] -docutils = "*" - -[[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "readme-renderer" -version = "37.2" -description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -bleach = ">=2.1.0" -docutils = ">=0.13.1" -Pygments = ">=2.5.1" - -[package.extras] -md = ["cmarkgfm (>=0.8.0)"] - -[[package]] -name = "regex" -version = "2022.9.13" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "requests" -version = "2.28.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=3.7, <4" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-toolbelt" -version = "0.10.0" -description = "A utility belt for advanced users of python-requests" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rfc3986" -version = "2.0.0" -description = "Validating URI References per RFC 3986" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -idna2008 = ["idna"] - -[[package]] -name = "rich" -version = "12.6.0" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" -optional = false -python-versions = ">=3.6.3,<4.0.0" - -[package.dependencies] -commonmark = ">=0.9.0,<0.10.0" -pygments = ">=2.6.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] - -[[package]] -name = "SecretStorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "tox" -version = "3.26.0" -description = "tox is a generic virtualenv management and test command line tool" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""} -filelock = ">=3.0.0" -packaging = ">=14" -pluggy = ">=0.12.0" -py = ">=1.4.17" -six = ">=1.14.0" -tomli = {version = ">=2.0.1", markers = "python_version >= \"3.7\" and python_version < \"3.11\""} -virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" - -[package.extras] -docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] -testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)"] - -[[package]] -name = "twine" -version = "4.0.1" -description = "Collection of utilities for publishing packages on PyPI" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -importlib-metadata = ">=3.6" -keyring = ">=15.1" -pkginfo = ">=1.8.1" -readme-renderer = ">=35.0" -requests = ">=2.20" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -rfc3986 = ">=1.4.0" -rich = ">=12.0.0" -urllib3 = ">=1.26.0" - -[[package]] -name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "urllib3" -version = "1.26.12" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "virtualenv" -version = "20.16.5" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -distlib = ">=0.3.5,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<3" - -[package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.1.1)", "sphinx-argparse (>=0.3.1)", "sphinx-rtd-theme (>=1)", "towncrier (>=21.9)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "zipp" -version = "3.9.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "1.1" -python-versions = ">=3.8,<4.0" -content-hash = "45bd8c8e725a25c4913438f7df2b2fb30df1ea1045db2c81bc6cfaca1539f160" - -[metadata.files] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -black = [ - {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, - {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, -] -bleach = [ - {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, - {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -cmd2 = [ - {file = "cmd2-2.4.2-py3-none-any.whl", hash = "sha256:a77e3056751393270b4125c990cf527db132f15951a20a3a5dd2df4290aadf20"}, - {file = "cmd2-2.4.2.tar.gz", hash = "sha256:073e555c05853b0f6965f3d03329babdf9e38a5f2cea028e61a64cd7eeb74ad5"}, -] -cmd2-ext-test = [ - {file = "cmd2-ext-test-2.0.0.tar.gz", hash = "sha256:b9373ea27bab2e297041ed2dac4491dc919ae56153d5f0addeb440eeb851a5a6"}, - {file = "cmd2_ext_test-2.0.0-py3-none-any.whl", hash = "sha256:6e66a69ff65d44cf84e35c9ce8e1e3c56aa1ef1cea520a73cd53673b48d15796"}, -] -colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] -coverage = [ - {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, - {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, - {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, - {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, - {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, - {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, - {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, - {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, - {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, - {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, - {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, - {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, - {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, - {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, - {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, - {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, -] -cryptography = [ - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, - {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, - {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, - {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, -] -darker = [ - {file = "darker-1.5.1-py3-none-any.whl", hash = "sha256:bb4e7494511799e7989cefab290713f81ee3b36b36989427f70d9c786d5b13b0"}, - {file = "darker-1.5.1.tar.gz", hash = "sha256:ea2e7ea20c74fc1faaea5bf49c60bc797a2a488b49ccafb90612a8c3643dbe9d"}, -] -dev-shell = [ - {file = "dev-shell-0.6.1.tar.gz", hash = "sha256:57ec9033cdd4ee10f6c1ca16227ecffc4f68c2df12d05bb73b62c325204c2507"}, - {file = "dev_shell-0.6.1-py3-none-any.whl", hash = "sha256:fb8b2412b627e0d73e03f888f6bd9cd60b27421d3c1a2db1cb9a77f325bbf1e8"}, -] -distlib = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] -dragonlib = [ - {file = "dragonlib-0.1.7-py2.py3-none-any.whl", hash = "sha256:89646eaa63b45185c5635387434bcf5a3bc6169502c1a19f8e47469d370ccf32"}, - {file = "dragonlib-0.1.7.tar.gz", hash = "sha256:1021c9bc4e62e39712f3fee7ddf454b0882168927dcee9a8dbc9fc50ff641b30"}, -] -filelock = [ - {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, - {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, -] -flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -gnureadline = [ - {file = "gnureadline-8.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:861936c9b362d96152af2d73ccb6f3e901e70f0e4a2e7e62f4e226e91d349edb"}, - {file = "gnureadline-8.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ce5c49ecc54e1df0193e90422806a5940f908553206689aeaa04bc959d3aa9a"}, - {file = "gnureadline-8.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753aa1e46b4260b38da424c6a7da7a3ddac161a0b4e6fb71c1093e9ef3d2e73"}, - {file = "gnureadline-8.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb921c2cbc14671bb81f3f33d9363a9d0720203b5d716baee32e51c399e914b"}, - {file = "gnureadline-8.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e3a8aaf1d61d351c16ad2d3425caf5768603ff5d0e86ba61da9b8756bdd1b95"}, - {file = "gnureadline-8.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:72da8bac1eb24b6c8237a33d7019a3f004a3d5ba867337175ed764831d9a2c99"}, - {file = "gnureadline-8.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3d8ea66f1b5d00ed843b8925fc07476b8c838c38e584af8639c6a976a43d08"}, - {file = "gnureadline-8.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194bafa818d0fc3d46f8d71a8811a297a493c1264d3e2d0a71b1b1ff05f8fc15"}, - {file = "gnureadline-8.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:49df5a432e4ff39cee1b0632c6d0e5fb304757113e502d70b50e33d9ffa47372"}, - {file = "gnureadline-8.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84e903de1514043e6a22866a1973c2ad5f5717f78e9d54e4d6809c48fbd3d81"}, - {file = "gnureadline-8.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b422ff3a78e281ee2e19b0eff70efa48396284bbefa86b83438d668ea9d038a3"}, - {file = "gnureadline-8.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:264f22e865975a3c2ac1183f431dddd8ff7de5a645b89a801c6a276d800f49f3"}, - {file = "gnureadline-8.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c7971653083a48049abd52baa9c8c0188aee362e7b2dd236fe51ecd4e6bc9bbe"}, - {file = "gnureadline-8.1.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4ad9b10409d969ba42acbf89e58352cf3043a5155c2ee677d061e292336b5479"}, - {file = "gnureadline-8.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecdc4368bd2f7ae9a22de31b024455222082cb49b98ee69ffd0a59734bf648e1"}, - {file = "gnureadline-8.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fde3e6417d9004381e8e9835e0a89d81d2d77eeace9364d2e3d9fb64054d449"}, - {file = "gnureadline-8.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:17a651e0c49d4b44e8ccf8992edc5a544e33ed9695d3b940ef002858c2215744"}, - {file = "gnureadline-8.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2816bac8be6bc0e3aa2301acac76e308137eeef1b618c9e0c95c1f89a139a4d8"}, - {file = "gnureadline-8.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402bc6e107beb015ae18c3d2e11f28375f049e464423ead88b35affe80f9be0"}, - {file = "gnureadline-8.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ea248385e0d87a3fada38c9164a5756861aa59d6ee010c8be30eeb41f41b49"}, - {file = "gnureadline-8.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1e2d34b0c4ad81c7b00019fafa6de2faf6969c55fa58229e26267cae34047e"}, - {file = "gnureadline-8.1.2.tar.gz", hash = "sha256:4262a6aa356ab22ef642f43a7f94eb42a72d6f0c532edb4e8c6b933f573056d2"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -"jaraco.classes" = [ - {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, - {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -keyring = [ - {file = "keyring-23.9.3-py3-none-any.whl", hash = "sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0"}, - {file = "keyring-23.9.3.tar.gz", hash = "sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5"}, -] -mc6809 = [ - {file = "MC6809-0.6.0-py3-none-any.whl", hash = "sha256:e80cbe9fbfc6e367aee6b204de5ff860467452ab353b1c7ff3a212bed86aa177"}, - {file = "MC6809-0.6.0.tar.gz", hash = "sha256:4390cd03e466326491d88df758b22c556c992699275812bcdb474be3506077be"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -more-itertools = [ - {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, - {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, -] -pkginfo = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -poetry-publish = [ - {file = "poetry-publish-0.5.0.tar.gz", hash = "sha256:7ebc7782ee318c099715518177446122e3a752347cebf8883828e110b7da0e9d"}, - {file = "poetry_publish-0.5.0-py3-none-any.whl", hash = "sha256:41db2e004595051b4bc0ccd09017f5f81e0fa9b5673bb718ab3d26c2da5dd8f3"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, -] -Pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyperclip = [ - {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, -] -pyreadline3 = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, -] -pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, -] -pytest-cov = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, -] -pytest-darker = [ - {file = "pytest_darker-0.1.2-py3-none-any.whl", hash = "sha256:ec7bad719510f0ac2d3d9aeb698cf6d5fb88b76e43b0bc1ee0cfb125332abcfd"}, - {file = "pytest_darker-0.1.2.tar.gz", hash = "sha256:79d725b55e346bfb00304485184ba978723d99c4e475d73547074303255f7544"}, -] -python-creole = [ - {file = "python-creole-1.4.10.tar.gz", hash = "sha256:6429aedc7cef578fe681d7781ad12dbea6ee54e03937b0e1b697e4cae5ff80bb"}, - {file = "python_creole-1.4.10-py3-none-any.whl", hash = "sha256:dc24325f4ba2af3e8d73ca2905e4665df932af0cfe0ec95d5790d55a7c5c10e2"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -readme-renderer = [ - {file = "readme_renderer-37.2-py3-none-any.whl", hash = "sha256:d3f06a69e8c40fca9ab3174eca48f96d9771eddb43517b17d96583418427b106"}, - {file = "readme_renderer-37.2.tar.gz", hash = "sha256:e8ad25293c98f781dbc2c5a36a309929390009f902f99e1798c761aaf04a7923"}, -] -regex = [ - {file = "regex-2022.9.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0394265391a86e2bbaa7606e59ac71bd9f1edf8665a59e42771a9c9adbf6fd4f"}, - {file = "regex-2022.9.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86df2049b18745f3cd4b0f4c4ef672bfac4b80ca488e6ecfd2bbfe68d2423a2c"}, - {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce331b076b2b013e7d7f07157f957974ef0b0881a808e8a4a4b3b5105aee5d04"}, - {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:360ffbc9357794ae41336b681dff1c0463193199dfb91fcad3ec385ea4972f46"}, - {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18e503b1e515a10282b3f14f1b3d856194ecece4250e850fad230842ed31227f"}, - {file = "regex-2022.9.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e167d1ccd41d27b7b6655bb7a2dcb1b1eb1e0d2d662043470bd3b4315d8b2b"}, - {file = "regex-2022.9.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4146cb7ae6029fc83b5c905ec6d806b7e5568dc14297c423e66b86294bad6c39"}, - {file = "regex-2022.9.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a1aec4ae549fd7b3f52ceaf67e133010e2fba1538bf4d5fc5cd162a5e058d5df"}, - {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cab548d6d972e1de584161487b2ac1aa82edd8430d1bde69587ba61698ad1cfb"}, - {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3d64e1a7e6d98a4cdc8b29cb8d8ed38f73f49e55fbaa737bdb5933db99b9de22"}, - {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:67a4c625361db04ae40ef7c49d3cbe2c1f5ff10b5a4491327ab20f19f2fb5d40"}, - {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:5d0dd8b06896423211ce18fba0c75dacc49182a1d6514c004b535be7163dca0f"}, - {file = "regex-2022.9.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4318f69b79f9f7d84a7420e97d4bfe872dc767c72f891d4fea5fa721c74685f7"}, - {file = "regex-2022.9.13-cp310-cp310-win32.whl", hash = "sha256:26df88c9636a0c3f3bd9189dd435850a0c49d0b7d6e932500db3f99a6dd604d1"}, - {file = "regex-2022.9.13-cp310-cp310-win_amd64.whl", hash = "sha256:6fe1dd1021e0f8f3f454ce2811f1b0b148f2d25bb38c712fec00316551e93650"}, - {file = "regex-2022.9.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83cc32a1a2fa5bac00f4abc0e6ce142e3c05d3a6d57e23bd0f187c59b4e1e43b"}, - {file = "regex-2022.9.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2effeaf50a6838f3dd4d3c5d265f06eabc748f476e8441892645ae3a697e273"}, - {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a786a55d00439d8fae4caaf71581f2aaef7297d04ee60345c3594efef5648a"}, - {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b701dbc124558fd2b1b08005eeca6c9160e209108fbcbd00091fcfac641ac7"}, - {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dab81cc4d58026861445230cfba27f9825e9223557926e7ec22156a1a140d55c"}, - {file = "regex-2022.9.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0c5cc3d1744a67c3b433dce91e5ef7c527d612354c1f1e8576d9e86bc5c5e2"}, - {file = "regex-2022.9.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:518272f25da93e02af4f1e94985f5042cec21557ef3591027d0716f2adda5d0a"}, - {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8418ee2cb857b83881b8f981e4c636bc50a0587b12d98cb9b947408a3c484fe7"}, - {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cfa4c956ff0a977c4823cb3b930b0a4e82543b060733628fec7ab3eb9b1abe37"}, - {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a1c4d17879dd4c4432c08a1ca1ab379f12ab54af569e945b6fc1c4cf6a74ca45"}, - {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:77c2879d3ba51e5ca6c2b47f2dcf3d04a976a623a8fc8236010a16c9e0b0a3c7"}, - {file = "regex-2022.9.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2885ec6eea629c648ecc9bde0837ec6b92208b7f36381689937fe5d64a517e8"}, - {file = "regex-2022.9.13-cp311-cp311-win32.whl", hash = "sha256:2dda4b096a6f630d6531728a45bd12c67ec3badf44342046dc77d4897277d4f2"}, - {file = "regex-2022.9.13-cp311-cp311-win_amd64.whl", hash = "sha256:592b9e2e1862168e71d9e612bfdc22c451261967dbd46681f14e76dfba7105fd"}, - {file = "regex-2022.9.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:df8fe00b60e4717662c7f80c810ba66dcc77309183c76b7754c0dff6f1d42054"}, - {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995e70bb8c91d1b99ed2aaf8ec44863e06ad1dfbb45d7df95f76ef583ec323a9"}, - {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad75173349ad79f9d21e0d0896b27dcb37bfd233b09047bc0b4d226699cf5c87"}, - {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7681c49da1a2d4b905b4f53d86c9ba4506e79fba50c4a664d9516056e0f7dfcc"}, - {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bc8edc5f8ef0ebb46f3fa0d02bd825bbe9cc63d59e428ffb6981ff9672f6de1"}, - {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bee775ff05c9d519195bd9e8aaaccfe3971db60f89f89751ee0f234e8aeac5"}, - {file = "regex-2022.9.13-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1a901ce5cd42658ab8f8eade51b71a6d26ad4b68c7cfc86b87efc577dfa95602"}, - {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:14a7ab070fa3aec288076eed6ed828587b805ef83d37c9bfccc1a4a7cfbd8111"}, - {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d23ac6b4bf9e32fcde5fcdb2e1fd5e7370d6693fcac51ee1d340f0e886f50d1f"}, - {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:4cdbfa6d2befeaee0c899f19222e9b20fc5abbafe5e9c43a46ef819aeb7b75e5"}, - {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ab07934725e6f25c6f87465976cc69aef1141e86987af49d8c839c3ffd367c72"}, - {file = "regex-2022.9.13-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d2a1371dc73e921f3c2e087c05359050f3525a9a34b476ebc8130e71bec55e97"}, - {file = "regex-2022.9.13-cp36-cp36m-win32.whl", hash = "sha256:fcbd1edff1473d90dc5cf4b52d355cf1f47b74eb7c85ba6e45f45d0116b8edbd"}, - {file = "regex-2022.9.13-cp36-cp36m-win_amd64.whl", hash = "sha256:fe428822b7a8c486bcd90b334e9ab541ce6cc0d6106993d59f201853e5e14121"}, - {file = "regex-2022.9.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d7430f041755801b712ec804aaf3b094b9b5facbaa93a6339812a8e00d7bd53a"}, - {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:079c182f99c89524069b9cd96f5410d6af437e9dca576a7d59599a574972707e"}, - {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59bac44b5a07b08a261537f652c26993af9b1bbe2a29624473968dd42fc29d56"}, - {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a59d0377e58d96a6f11636e97992f5b51b7e1e89eb66332d1c01b35adbabfe8a"}, - {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d68eb704b24bc4d441b24e4a12653acd07d2c39940548761e0985a08bc1fff"}, - {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0385d66e73cdd4462f3cc42c76a6576ddcc12472c30e02a2ae82061bff132c32"}, - {file = "regex-2022.9.13-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:db45016364eec9ddbb5af93c8740c5c92eb7f5fc8848d1ae04205a40a1a2efc6"}, - {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:03ff695518482b946a6d3d4ce9cbbd99a21320e20d94913080aa3841f880abcd"}, - {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6b32b45433df1fad7fed738fe15200b6516da888e0bd1fdd6aa5e50cc16b76bc"}, - {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:003a2e1449d425afc817b5f0b3d4c4aa9072dd5f3dfbf6c7631b8dc7b13233de"}, - {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a9eb9558e1d0f78e07082d8a70d5c4d631c8dd75575fae92105df9e19c736730"}, - {file = "regex-2022.9.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f6e0321921d2fdc082ef90c1fd0870f129c2e691bfdc4937dcb5cd308aba95c4"}, - {file = "regex-2022.9.13-cp37-cp37m-win32.whl", hash = "sha256:3f3b4594d564ed0b2f54463a9f328cf6a5b2a32610a90cdff778d6e3e561d08b"}, - {file = "regex-2022.9.13-cp37-cp37m-win_amd64.whl", hash = "sha256:8aba0d01e3dfd335f2cb107079b07fdddb4cd7fb2d8c8a1986f9cb8ce9246c24"}, - {file = "regex-2022.9.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:944567bb08f52268d8600ee5bdf1798b2b62ea002cc692a39cec113244cbdd0d"}, - {file = "regex-2022.9.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b664a4d33ffc6be10996606dfc25fd3248c24cc589c0b139feb4c158053565e"}, - {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06cc1190f3db3192ab8949e28f2c627e1809487e2cfc435b6524c1ce6a2f391"}, - {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c57d50d4d5eb0c862569ca3c840eba2a73412f31d9ecc46ef0d6b2e621a592b"}, - {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19a4da6f513045f5ba00e491215bd00122e5bd131847586522463e5a6b2bd65f"}, - {file = "regex-2022.9.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a926339356fe29595f8e37af71db37cd87ff764e15da8ad5129bbaff35bcc5a6"}, - {file = "regex-2022.9.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:091efcfdd4178a7e19a23776dc2b1fafb4f57f4d94daf340f98335817056f874"}, - {file = "regex-2022.9.13-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:880dbeb6bdde7d926b4d8e41410b16ffcd4cb3b4c6d926280fea46e2615c7a01"}, - {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:73b985c9fc09a7896846e26d7b6f4d1fd5a20437055f4ef985d44729f9f928d0"}, - {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c0b7cb9598795b01f9a3dd3f770ab540889259def28a3bf9b2fa24d52edecba3"}, - {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37e5a26e76c46f54b3baf56a6fdd56df9db89758694516413757b7d127d4c57b"}, - {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:99945ddb4f379bb9831c05e9f80f02f079ba361a0fb1fba1fc3b267639b6bb2e"}, - {file = "regex-2022.9.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dcbcc9e72a791f622a32d17ff5011326a18996647509cac0609a7fc43adc229"}, - {file = "regex-2022.9.13-cp38-cp38-win32.whl", hash = "sha256:d3102ab9bf16bf541ca228012d45d88d2a567c9682a805ae2c145a79d3141fdd"}, - {file = "regex-2022.9.13-cp38-cp38-win_amd64.whl", hash = "sha256:14216ea15efc13f28d0ef1c463d86d93ca7158a79cd4aec0f9273f6d4c6bb047"}, - {file = "regex-2022.9.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a165a05979e212b2c2d56a9f40b69c811c98a788964e669eb322de0a3e420b4"}, - {file = "regex-2022.9.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:14c71437ffb89479c89cc7022a5ea2075a842b728f37205e47c824cc17b30a42"}, - {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee7045623a5ace70f3765e452528b4c1f2ce669ed31959c63f54de64fe2f6ff7"}, - {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6e521d9db006c5e4a0f8acfef738399f72b704913d4e083516774eb51645ad7c"}, - {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86548b8234b2be3985dbc0b385e35f5038f0f3e6251464b827b83ebf4ed90e5"}, - {file = "regex-2022.9.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b39ee3b280e15824298b97cec3f7cbbe6539d8282cc8a6047a455b9a72c598"}, - {file = "regex-2022.9.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6e6e61e9a38b6cc60ca3e19caabc90261f070f23352e66307b3d21a24a34aaf"}, - {file = "regex-2022.9.13-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d837ccf3bd2474feabee96cd71144e991472e400ed26582edc8ca88ce259899c"}, - {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6adfe300848d61a470ec7547adc97b0ccf86de86a99e6830f1d8c8d19ecaf6b3"}, - {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5b003d248e6f292475cd24b04e5f72c48412231961a675edcb653c70730e79e"}, - {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d5edd3eb877c9fc2e385173d4a4e1d792bf692d79e25c1ca391802d36ecfaa01"}, - {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:50e764ffbd08b06aa8c4e86b8b568b6722c75d301b33b259099f237c46b2134e"}, - {file = "regex-2022.9.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d43bd402b27e0e7eae85c612725ba1ce7798f20f6fab4e8bc3de4f263294f03"}, - {file = "regex-2022.9.13-cp39-cp39-win32.whl", hash = "sha256:7fcf7f94ccad19186820ac67e2ec7e09e0ac2dac39689f11cf71eac580503296"}, - {file = "regex-2022.9.13-cp39-cp39-win_amd64.whl", hash = "sha256:322bd5572bed36a5b39952d88e072738926759422498a96df138d93384934ff8"}, - {file = "regex-2022.9.13.tar.gz", hash = "sha256:f07373b6e56a6f3a0df3d75b651a278ca7bd357a796078a26a958ea1ce0588fd"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.10.0.tar.gz", hash = "sha256:f695d6207931200b46c8ef6addbc8a921fb5d77cc4cd209c2e7d39293fcd2b30"}, - {file = "requests_toolbelt-0.10.0-py2.py3-none-any.whl", hash = "sha256:64c6b8c51b515d123f9f708a29743f44eb70c4479440641ed2df8c4dea56d985"}, -] -rfc3986 = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] -rich = [ - {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, - {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, -] -SecretStorage = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tox = [ - {file = "tox-3.26.0-py2.py3-none-any.whl", hash = "sha256:bf037662d7c740d15c9924ba23bb3e587df20598697bb985ac2b49bdc2d847f6"}, - {file = "tox-3.26.0.tar.gz", hash = "sha256:44f3c347c68c2c68799d7d44f1808f9d396fc8a1a500cbc624253375c7ae107e"}, -] -twine = [ - {file = "twine-4.0.1-py3-none-any.whl", hash = "sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e"}, - {file = "twine-4.0.1.tar.gz", hash = "sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -virtualenv = [ - {file = "virtualenv-20.16.5-py3-none-any.whl", hash = "sha256:d07dfc5df5e4e0dbc92862350ad87a36ed505b978f6c39609dc489eadd5b0d27"}, - {file = "virtualenv-20.16.5.tar.gz", hash = "sha256:227ea1b9994fdc5ea31977ba3383ef296d7472ea85be9d6732e42a91c04e80da"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -zipp = [ - {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, - {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, -] diff --git a/pyproject.toml b/pyproject.toml index 8224bf23..197ea001 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,7 @@ -[tool.poetry] +[project] name = "DragonPyEmulator" -version = "0.8.0.rc1" +version = "0.8.0rc3" description = "Emulator for 6809 CPU based system like Dragon 32 / CoCo written in Python..." -authors = ["JensDiemer "] -packages = [{ include = "dragonpy" }] keywords=["Emulator","6809","Dragon","CoCo","Vectrex","tkinter","pypy"] classifiers = [ # http://pypi.python.org/pypi?%3Aaction=list_classifiers @@ -25,46 +23,77 @@ classifiers = [ "Topic :: Software Development :: Assemblers", "Topic :: Software Development :: Testing", ] -readme="README.md" - - -[tool.poetry.dependencies] -python = ">=3.8,<4.0" -dragonlib = "*" -MC6809 = "*" -pygments = "^2.5.2" - -[tool.poetry.dev-dependencies] -dev_shell = "*" # https://github.com/jedie/dev-shell -cmd2_ext_test = "*" -poetry_publish = "*" -tox = "*" -pytest = "*" -pytest-cov = "*" -pytest-darker = "*" # https://github.com/akaihola/pytest-darker -flake8 = "*" -isort = "*" -darker = "*" # https://github.com/akaihola/darker - -[tool.poetry.scripts] -devshell = 'dragonpy.dev_shell:devshell_cmdloop' -DragonPy = 'dragonpy.core.gui_starter:gui_mainloop' +readme = "README.md" +authors = [ + {name = 'Jens Diemer', email = 'git@jensdiemer.de'} +] +requires-python = ">=3.10,<4" +dependencies = [ + "MC6809>=0.7.0rc0", # https://github.com/6809/MC6809 + "dragonlib", # https://github.com/6809/dragonlib + "pygments", # https://pygments.org/ + "bx_py_utils", # https://github.com/boxine/bx_py_utils + "click", # https://github.com/pallets/click/ + "rich-click", # https://github.com/ewels/rich-click + "rich", # https://github.com/Textualize/rich +] +[project.optional-dependencies] +dev = [ + "manageprojects>=0.9.3", # https://github.com/jedie/manageprojects + "pip-tools", # https://github.com/jazzband/pip-tools/ + "tox", # https://github.com/tox-dev/tox + "coverage", # https://github.com/nedbat/coveragepy + "darker>=1.7", # https://github.com/akaihola/darker + "autopep8", # https://github.com/hhatto/autopep8 + "pyupgrade", # https://github.com/asottile/pyupgrade + "isort", # https://github.com/pycqa/isort + "flynt", # https://github.com/ikamensh/flynt + "flake8", # https://github.com/pycqa/flake8 + "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 + "mypy", # https://github.com/python/mypy + "twine", # https://github.com/pypa/twine + + "tomli", # https://github.com/hukkin/tomli + # tomli only needed for Python <3.11, but see bug: + # https://github.com/pypa/pip/issues/9644#issuecomment-1456583402 + #"tomli;python_version<\"3.11\"", # https://github.com/hukkin/tomli + + # Work-a-round for: + # https://github.com/jazzband/pip-tools/issues/994#issuecomment-1321226661 + "typing-extensions>=3.10;python_version<\"3.10\"", +] + +[project.urls] +Documentation = "https://github.com/jedie/DragonPy" +Source = "https://github.com/jedie/DragonPy" + +[project.scripts] +dragonpy = "dragonpy.__main__:main" + +[tool.setuptools.packages.find] +where = ["."] +include = ["basic_editor", "dragonpy", "PyDC"] [build-system] -requires = ["poetry-core"] -build-backend = "poetry.masonry.api" +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" [tool.darker] src = ['.'] revision = "origin/main..." -line_length = 120 +line_length = 119 verbose = true +color = true skip_string_normalization = true diff = false check = false stdout = false isort = true +flynt = true lint = [ "flake8", ] @@ -75,54 +104,78 @@ log_level = "INFO" # https://pycqa.github.io/isort/docs/configuration/config_files/#pyprojecttoml-preferred-format atomic=true profile='black' -line_length=120 -skip_glob=[".*", "*/htmlcov/*",] -known_first_party=["dragonpy", "PyDC"] +skip_glob=['.*', '*/htmlcov/*'] +known_first_party=['dragonlib','MC6809','dragonpy'] +line_length=119 lines_after_imports=2 [tool.coverage.run] -omit = [".*"] - - -[tool.pytest.ini_options] -# https://docs.pytest.org/en/latest/customize.html#pyproject-toml -minversion = "6.0" -norecursedirs = ".* __pycache__ coverage* dist htmlcov" -# sometimes helpfull "addopts" arguments: -# -vv -# --verbose -# --capture=no -# --trace-config -# --full-trace -# -p no:warnings -addopts = """ - --cov=. - --cov-report term-missing - --cov-report html - --cov-report xml - --no-cov-on-fail - --showlocals - --darker - --doctest-modules - --failed-first - --last-failed-no-failures all - --new-first - -p no:randomly -""" -# TODO: --mypy +branch = true +parallel = true +source = ['.'] +command_line = '-m unittest --verbose --locals --buffer' + +[tool.coverage.report] +omit = ['.*', '*/tests/*'] +skip_empty = true +fail_under = 30 +show_missing = true +exclude_lines = [ + 'if self.debug:', + 'pragma: no cover', + 'raise NotImplementedError', + 'if __name__ == .__main__.:', +] -[tool.tox] -# https://tox.readthedocs.io/en/latest/example/basic.html#pyproject-toml-tox-legacy-ini +[tool.tox] # https://tox.wiki/en/latest/config.html#pyproject-toml legacy_tox_ini = """ [tox] isolated_build = True -envlist = py310,py39,py38 +envlist = py{311,310} skip_missing_interpreters = True + [testenv] passenv = * -whitelist_externals = pytest +skip_install = true +commands_pre = + pip install -U pip-tools + pip-sync requirements.dev.txt commands = - pytest + {envpython} -m coverage run --context='{envname}' + {envpython} -m coverage combine --append + {envpython} -m coverage xml + {envpython} -m coverage report """ + + +[tool.mypy] +warn_unused_configs = true +ignore_missing_imports = true +allow_redefinition = true # https://github.com/python/mypy/issues/7165 +show_error_codes = true +plugins = [] +exclude = ['.venv', 'tests'] + + +[manageprojects] # https://github.com/jedie/manageprojects +initial_revision = "47cac0a" +initial_date = 2023-03-06T19:46:41+01:00 +cookiecutter_template = "https://github.com/jedie/cookiecutter_templates/" +cookiecutter_directory = "piptools-python" + +[manageprojects.cookiecutter_context.cookiecutter] +full_name = "Jens Diemer" +github_username = "jedie" +author_email = "git@jensdiemer.de" +package_name = "dragonpy" +package_version = "0.7.0" +package_description = "Emulator for 6809 CPU based system like Dragon 32 / CoCo written in Python..." +package_url = "https://github.com/jedie/DragonPy" +issues_url = "https://github.com/jedie/DragonPy/issues" +license = "GPL-3.0-or-later" +_template = "https://github.com/jedie/cookiecutter_templates/" +applied_migrations = [ + "04d5a25", # 2023-03-07T16:25:36+01:00 +] diff --git a/requirements.dev.txt b/requirements.dev.txt new file mode 100644 index 00000000..77daff89 --- /dev/null +++ b/requirements.dev.txt @@ -0,0 +1,820 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# ./cli.py update +# +arrow==1.2.3 \ + --hash=sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1 \ + --hash=sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2 + # via jinja2-time +astor==0.8.1 \ + --hash=sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5 \ + --hash=sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e + # via flynt +autopep8==2.0.2 \ + --hash=sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1 \ + --hash=sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +binaryornot==0.4.4 \ + --hash=sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061 \ + --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 + # via cookiecutter +black==23.1.0 \ + --hash=sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd \ + --hash=sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555 \ + --hash=sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481 \ + --hash=sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468 \ + --hash=sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9 \ + --hash=sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a \ + --hash=sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958 \ + --hash=sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580 \ + --hash=sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26 \ + --hash=sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32 \ + --hash=sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8 \ + --hash=sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753 \ + --hash=sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b \ + --hash=sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074 \ + --hash=sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651 \ + --hash=sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24 \ + --hash=sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6 \ + --hash=sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad \ + --hash=sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac \ + --hash=sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221 \ + --hash=sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06 \ + --hash=sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27 \ + --hash=sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648 \ + --hash=sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739 \ + --hash=sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104 + # via darker +bleach==6.0.0 \ + --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ + --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 + # via readme-renderer +build==0.10.0 \ + --hash=sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171 \ + --hash=sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269 + # via pip-tools +bx-py-utils==76 \ + --hash=sha256:c9fcedc76daa9782b0a0c535d0d803061f61117f95957862ef58253f3c35fc0e \ + --hash=sha256:f15c64731cd9df0ca9a7bd3993fc0bf4faeb25fc30157348eb9735bf0989a210 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects + # mc6809 +cachetools==5.3.0 \ + --hash=sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14 \ + --hash=sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4 + # via tox +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 + # via requests +cffi==1.15.1 \ + --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ + --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ + --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ + --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ + --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ + --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ + --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ + --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ + --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ + --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ + --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ + --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ + --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ + --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ + --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ + --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ + --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ + --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ + --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ + --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ + --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ + --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ + --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ + --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ + --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ + --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ + --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ + --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ + --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ + --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ + --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ + --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ + --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ + --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ + --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ + --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ + --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ + --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ + --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ + --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ + --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ + --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ + --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ + --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ + --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ + --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ + --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ + --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ + --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ + --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ + --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ + --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ + --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ + --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ + --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ + --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ + --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ + --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ + --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ + --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ + --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ + --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ + --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ + --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 + # via cryptography +chardet==5.1.0 \ + --hash=sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5 \ + --hash=sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9 + # via + # binaryornot + # tox +charset-normalizer==3.1.0 \ + --hash=sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6 \ + --hash=sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1 \ + --hash=sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e \ + --hash=sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373 \ + --hash=sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62 \ + --hash=sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230 \ + --hash=sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be \ + --hash=sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c \ + --hash=sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0 \ + --hash=sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448 \ + --hash=sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f \ + --hash=sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649 \ + --hash=sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d \ + --hash=sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0 \ + --hash=sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706 \ + --hash=sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a \ + --hash=sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59 \ + --hash=sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23 \ + --hash=sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5 \ + --hash=sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb \ + --hash=sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e \ + --hash=sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e \ + --hash=sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c \ + --hash=sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28 \ + --hash=sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d \ + --hash=sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41 \ + --hash=sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974 \ + --hash=sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce \ + --hash=sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f \ + --hash=sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1 \ + --hash=sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d \ + --hash=sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8 \ + --hash=sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017 \ + --hash=sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31 \ + --hash=sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7 \ + --hash=sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8 \ + --hash=sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e \ + --hash=sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14 \ + --hash=sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd \ + --hash=sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d \ + --hash=sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795 \ + --hash=sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b \ + --hash=sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b \ + --hash=sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b \ + --hash=sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203 \ + --hash=sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f \ + --hash=sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19 \ + --hash=sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1 \ + --hash=sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a \ + --hash=sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac \ + --hash=sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9 \ + --hash=sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0 \ + --hash=sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137 \ + --hash=sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f \ + --hash=sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6 \ + --hash=sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5 \ + --hash=sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909 \ + --hash=sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f \ + --hash=sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0 \ + --hash=sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324 \ + --hash=sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755 \ + --hash=sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb \ + --hash=sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854 \ + --hash=sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c \ + --hash=sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60 \ + --hash=sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84 \ + --hash=sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0 \ + --hash=sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b \ + --hash=sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1 \ + --hash=sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531 \ + --hash=sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1 \ + --hash=sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11 \ + --hash=sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326 \ + --hash=sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df \ + --hash=sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab + # via requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via + # DragonPyEmulator (pyproject.toml) + # black + # cookiecutter + # manageprojects + # mc6809 + # pip-tools + # rich-click + # safety +codespell==2.2.2 \ + --hash=sha256:87dfcd9bdc9b3cb8b067b37f0af22044d7a84e28174adfc8eaa203056b7f9ecc \ + --hash=sha256:c4d00c02b5a2a55661f00d5b4b3b5a710fa803ced9a9d7e45438268b099c319c + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via tox +cookiecutter==2.1.1 \ + --hash=sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022 \ + --hash=sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5 + # via manageprojects +coverage==7.2.1 \ + --hash=sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e \ + --hash=sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b \ + --hash=sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e \ + --hash=sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6 \ + --hash=sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454 \ + --hash=sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80 \ + --hash=sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0 \ + --hash=sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339 \ + --hash=sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384 \ + --hash=sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616 \ + --hash=sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8 \ + --hash=sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef \ + --hash=sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6 \ + --hash=sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54 \ + --hash=sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84 \ + --hash=sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273 \ + --hash=sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae \ + --hash=sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff \ + --hash=sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99 \ + --hash=sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657 \ + --hash=sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed \ + --hash=sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993 \ + --hash=sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc \ + --hash=sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97 \ + --hash=sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6 \ + --hash=sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63 \ + --hash=sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5 \ + --hash=sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec \ + --hash=sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1 \ + --hash=sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58 \ + --hash=sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9 \ + --hash=sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3 \ + --hash=sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319 \ + --hash=sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd \ + --hash=sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb \ + --hash=sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2 \ + --hash=sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820 \ + --hash=sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a \ + --hash=sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e \ + --hash=sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242 \ + --hash=sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4 \ + --hash=sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a \ + --hash=sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03 \ + --hash=sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508 \ + --hash=sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833 \ + --hash=sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8 \ + --hash=sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4 \ + --hash=sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6 \ + --hash=sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431 \ + --hash=sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa \ + --hash=sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b + # via DragonPyEmulator (pyproject.toml) +cryptography==39.0.2 \ + --hash=sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1 \ + --hash=sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7 \ + --hash=sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06 \ + --hash=sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84 \ + --hash=sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915 \ + --hash=sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074 \ + --hash=sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5 \ + --hash=sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3 \ + --hash=sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9 \ + --hash=sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3 \ + --hash=sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011 \ + --hash=sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536 \ + --hash=sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a \ + --hash=sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f \ + --hash=sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480 \ + --hash=sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac \ + --hash=sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0 \ + --hash=sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108 \ + --hash=sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828 \ + --hash=sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354 \ + --hash=sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612 \ + --hash=sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3 \ + --hash=sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97 + # via secretstorage +darker==1.7.0 \ + --hash=sha256:34e259681e931414b3d7bf3467b0af2f29005545cfc72aa4c8739a8705cbf51f \ + --hash=sha256:8d260185295fc672aefe008a300a5164f60c557b7202464c4dd74176325e15b0 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +distlib==0.3.6 \ + --hash=sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46 \ + --hash=sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e + # via virtualenv +docutils==0.19 \ + --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ + --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc + # via readme-renderer +dparse==0.6.2 \ + --hash=sha256:8097076f1dd26c377f30d4745e6ec18fef42f3bf493933b842ac5bafad8c345f \ + --hash=sha256:d45255bda21f998bc7ddf2afd5e62505ba6134756ba2d42a84c56b0826614dfe + # via safety +dragonlib==0.1.7 \ + --hash=sha256:1021c9bc4e62e39712f3fee7ddf454b0882168927dcee9a8dbc9fc50ff641b30 \ + --hash=sha256:89646eaa63b45185c5635387434bcf5a3bc6169502c1a19f8e47469d370ccf32 + # via DragonPyEmulator (pyproject.toml) +editorconfig==0.12.3 \ + --hash=sha256:57f8ce78afcba15c8b18d46b5170848c88d56fd38f05c2ec60dbbfcb8996e89e \ + --hash=sha256:6b0851425aa875b08b16789ee0eeadbd4ab59666e9ebe728e526314c4a2e52c1 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +filelock==3.9.0 \ + --hash=sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de \ + --hash=sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d + # via + # tox + # virtualenv +flake8==6.0.0 \ + --hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \ + --hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +flynt==0.77 \ + --hash=sha256:2863ac8ec19d6ec8d29e760546e6ced644baf6dff3c7cdc77e03abbd29b80f14 \ + --hash=sha256:2bd1b37043ad88a3f3c3c34a76fc0b64d24e5f03d36ea6b48cb69cc642bff17e + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via requests +importlib-metadata==6.0.0 \ + --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ + --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d + # via + # keyring + # twine +isort==5.12.0 \ + --hash=sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504 \ + --hash=sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +jaraco-classes==3.2.3 \ + --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ + --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a + # via keyring +jeepney==0.8.0 \ + --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + # via + # keyring + # secretstorage +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 + # via + # cookiecutter + # jinja2-time +jinja2-time==0.2.0 \ + --hash=sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40 \ + --hash=sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa + # via cookiecutter +keyring==23.13.1 \ + --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ + --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 + # via twine +manageprojects==0.9.3 \ + --hash=sha256:521595f7927e986ce41229d32ae42bcfc94e89bfe1a0a642ca6953a810106009 \ + --hash=sha256:7b089cf8139e955dd1312dfd50e07d5e825b102caa07353a2083244b57f49878 + # via DragonPyEmulator (pyproject.toml) +markdown-it-py==2.2.0 \ + --hash=sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30 \ + --hash=sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1 + # via rich +markupsafe==2.1.2 \ + --hash=sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed \ + --hash=sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc \ + --hash=sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2 \ + --hash=sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460 \ + --hash=sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7 \ + --hash=sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0 \ + --hash=sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1 \ + --hash=sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa \ + --hash=sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03 \ + --hash=sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323 \ + --hash=sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65 \ + --hash=sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013 \ + --hash=sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036 \ + --hash=sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f \ + --hash=sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4 \ + --hash=sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419 \ + --hash=sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2 \ + --hash=sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619 \ + --hash=sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a \ + --hash=sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a \ + --hash=sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd \ + --hash=sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7 \ + --hash=sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666 \ + --hash=sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65 \ + --hash=sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859 \ + --hash=sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625 \ + --hash=sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff \ + --hash=sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156 \ + --hash=sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd \ + --hash=sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba \ + --hash=sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f \ + --hash=sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1 \ + --hash=sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094 \ + --hash=sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a \ + --hash=sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513 \ + --hash=sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed \ + --hash=sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d \ + --hash=sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3 \ + --hash=sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147 \ + --hash=sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c \ + --hash=sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603 \ + --hash=sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601 \ + --hash=sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a \ + --hash=sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1 \ + --hash=sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d \ + --hash=sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3 \ + --hash=sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54 \ + --hash=sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2 \ + --hash=sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6 \ + --hash=sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58 + # via jinja2 +mc6809==0.7.0rc0 \ + --hash=sha256:8b93189de5b57aaaa48f85ce225573b43826a894a4152d9863474510724ac45b \ + --hash=sha256:f19f5c3ddd83f5b01a857147e821b59da88d70befe8739bb94f81fe356939a7d + # via DragonPyEmulator (pyproject.toml) +mccabe==0.7.0 \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via flake8 +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +more-itertools==9.1.0 \ + --hash=sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d \ + --hash=sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3 + # via jaraco-classes +mypy==1.1.1 \ + --hash=sha256:0a28a76785bf57655a8ea5eb0540a15b0e781c807b5aa798bd463779988fa1d5 \ + --hash=sha256:19ba15f9627a5723e522d007fe708007bae52b93faab00f95d72f03e1afa9598 \ + --hash=sha256:21b437be1c02712a605591e1ed1d858aba681757a1e55fe678a15c2244cd68a5 \ + --hash=sha256:26cdd6a22b9b40b2fd71881a8a4f34b4d7914c679f154f43385ca878a8297389 \ + --hash=sha256:2888ce4fe5aae5a673386fa232473014056967f3904f5abfcf6367b5af1f612a \ + --hash=sha256:2b0c373d071593deefbcdd87ec8db91ea13bd8f1328d44947e88beae21e8d5e9 \ + --hash=sha256:315ac73cc1cce4771c27d426b7ea558fb4e2836f89cb0296cbe056894e3a1f78 \ + --hash=sha256:39c7119335be05630611ee798cc982623b9e8f0cff04a0b48dfc26100e0b97af \ + --hash=sha256:4b398d8b1f4fba0e3c6463e02f8ad3346f71956b92287af22c9b12c3ec965a9f \ + --hash=sha256:4e4e8b362cdf99ba00c2b218036002bdcdf1e0de085cdb296a49df03fb31dfc4 \ + --hash=sha256:59bbd71e5c58eed2e992ce6523180e03c221dcd92b52f0e792f291d67b15a71c \ + --hash=sha256:5b5f81b40d94c785f288948c16e1f2da37203c6006546c5d947aab6f90aefef2 \ + --hash=sha256:5cb14ff9919b7df3538590fc4d4c49a0f84392237cbf5f7a816b4161c061829e \ + --hash=sha256:61bf08362e93b6b12fad3eab68c4ea903a077b87c90ac06c11e3d7a09b56b9c1 \ + --hash=sha256:64cc3afb3e9e71a79d06e3ed24bb508a6d66f782aff7e56f628bf35ba2e0ba51 \ + --hash=sha256:69b35d1dcb5707382810765ed34da9db47e7f95b3528334a3c999b0c90fe523f \ + --hash=sha256:9401e33814cec6aec8c03a9548e9385e0e228fc1b8b0a37b9ea21038e64cdd8a \ + --hash=sha256:a380c041db500e1410bb5b16b3c1c35e61e773a5c3517926b81dfdab7582be54 \ + --hash=sha256:ae9ceae0f5b9059f33dbc62dea087e942c0ccab4b7a003719cb70f9b8abfa32f \ + --hash=sha256:b7c7b708fe9a871a96626d61912e3f4ddd365bf7f39128362bc50cbd74a634d5 \ + --hash=sha256:c1c10fa12df1232c936830839e2e935d090fc9ee315744ac33b8a32216b93707 \ + --hash=sha256:ce61663faf7a8e5ec6f456857bfbcec2901fbdb3ad958b778403f63b9e606a1b \ + --hash=sha256:d64c28e03ce40d5303450f547e07418c64c241669ab20610f273c9e6290b4b0b \ + --hash=sha256:d809f88734f44a0d44959d795b1e6f64b2bbe0ea4d9cc4776aa588bb4229fc1c \ + --hash=sha256:dbb19c9f662e41e474e0cff502b7064a7edc6764f5262b6cd91d698163196799 \ + --hash=sha256:ef6a01e563ec6a4940784c574d33f6ac1943864634517984471642908b30b6f7 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 + # via + # black + # mypy +packaging==23.0 \ + --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ + --hash=sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97 + # via + # black + # build + # dparse + # manageprojects + # pyproject-api + # safety + # tox +pathspec==0.11.0 \ + --hash=sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229 \ + --hash=sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc + # via black +pip-tools==6.12.3 \ + --hash=sha256:480d44fae6e09fad3f9bd3d0a7e8423088715d10477e8ef0663440db25e3114f \ + --hash=sha256:8510420f46572b2e26c357541390593d9365eb6edd2d1e7505267910ecaec080 + # via DragonPyEmulator (pyproject.toml) +pkginfo==1.9.6 \ + --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ + --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 + # via twine +platformdirs==3.1.0 \ + --hash=sha256:13b08a53ed71021350c9e300d4ea8668438fb0046ab3937ac9a29913a1a1350a \ + --hash=sha256:accc3665857288317f32c7bebb5a8e482ba717b474f3fc1d18ca7f9214be0cef + # via + # black + # tox + # virtualenv +pluggy==1.0.0 \ + --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ + --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 + # via tox +pycodestyle==2.10.0 \ + --hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \ + --hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610 + # via + # autopep8 + # flake8 +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi +pyflakes==3.0.1 \ + --hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \ + --hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd + # via + # DragonPyEmulator (pyproject.toml) + # flake8 + # manageprojects +pygments==2.14.0 \ + --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ + --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 + # via + # DragonPyEmulator (pyproject.toml) + # readme-renderer + # rich +pyproject-api==1.5.0 \ + --hash=sha256:0962df21f3e633b8ddb9567c011e6c1b3dcdfc31b7860c0ede7e24c5a1200fbe \ + --hash=sha256:4c111277dfb96bcd562c6245428f27250b794bfe3e210b8714c4f893952f2c17 + # via tox +pyproject-hooks==1.0.0 \ + --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ + --hash=sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5 + # via build +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via arrow +python-slugify==8.0.1 \ + --hash=sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395 \ + --hash=sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27 + # via cookiecutter +pyupgrade==3.3.1 \ + --hash=sha256:3b93641963df022d605c78aeae4b5956a5296ea24701eafaef9c487527b77e60 \ + --hash=sha256:f88bce38b0ba92c2a9a5063c8629e456e8d919b67d2d42c7ecab82ff196f9813 + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +pyyaml==6.0 \ + --hash=sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf \ + --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ + --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ + --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \ + --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \ + --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \ + --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \ + --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \ + --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \ + --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \ + --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \ + --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \ + --hash=sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782 \ + --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ + --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ + --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ + --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ + --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ + --hash=sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1 \ + --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ + --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ + --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ + --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ + --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ + --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ + --hash=sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d \ + --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ + --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ + --hash=sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7 \ + --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ + --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ + --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ + --hash=sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358 \ + --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ + --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ + --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ + --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ + --hash=sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f \ + --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ + --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 + # via cookiecutter +readme-renderer==37.3 \ + --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ + --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 + # via twine +requests==2.28.2 \ + --hash=sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa \ + --hash=sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf + # via + # cookiecutter + # requests-toolbelt + # safety + # twine +requests-toolbelt==0.10.1 \ + --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ + --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d + # via twine +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ + --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c + # via twine +rich==13.3.2 \ + --hash=sha256:91954fe80cfb7985727a467ca98a7618e5dd15178cc2da10f553b36a93859001 \ + --hash=sha256:a104f37270bf677148d8acb07d33be1569eeee87e2d1beb286a4e9113caf6f2f + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects + # mc6809 + # rich-click + # twine +rich-click==1.6.1 \ + --hash=sha256:0fcf4d1a09029d79322dd814ab0b2e66ac183633037561881d45abae8a161d95 \ + --hash=sha256:f8ff96693ec6e261d1544e9f7d9a5811c5ef5d74c8adb4978430fc0dac16777e + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects + # mc6809 +ruamel-yaml==0.17.21 \ + --hash=sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7 \ + --hash=sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af + # via safety +ruamel-yaml-clib==0.2.7 \ + --hash=sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e \ + --hash=sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3 \ + --hash=sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5 \ + --hash=sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497 \ + --hash=sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f \ + --hash=sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac \ + --hash=sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697 \ + --hash=sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763 \ + --hash=sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282 \ + --hash=sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94 \ + --hash=sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1 \ + --hash=sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072 \ + --hash=sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9 \ + --hash=sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5 \ + --hash=sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231 \ + --hash=sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93 \ + --hash=sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b \ + --hash=sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb \ + --hash=sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f \ + --hash=sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307 \ + --hash=sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8 \ + --hash=sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b \ + --hash=sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b \ + --hash=sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640 \ + --hash=sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7 \ + --hash=sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a \ + --hash=sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71 \ + --hash=sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8 \ + --hash=sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122 \ + --hash=sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7 \ + --hash=sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80 \ + --hash=sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e \ + --hash=sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab \ + --hash=sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0 \ + --hash=sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646 \ + --hash=sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38 + # via ruamel-yaml +safety==2.3.4 \ + --hash=sha256:6224dcd9b20986a2b2c5e7acfdfba6bca42bb11b2783b24ed04f32317e5167ea \ + --hash=sha256:b9e74e794e82f54d11f4091c5d820c4d2d81de9f953bf0b4f33ac8bc402ae72c + # via + # DragonPyEmulator (pyproject.toml) + # manageprojects +secretstorage==3.3.3 \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via keyring +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # bleach + # dragonlib + # python-dateutil +text-unidecode==1.3 \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \ + --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93 + # via python-slugify +tokenize-rt==5.0.0 \ + --hash=sha256:3160bc0c3e8491312d0485171dea861fc160a240f5f5766b72a1165408d10740 \ + --hash=sha256:c67772c662c6b3dc65edf66808577968fb10badfc2042e3027196bed4daf9e5a + # via pyupgrade +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ + --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f + # via + # darker + # dparse +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via + # DragonPyEmulator (pyproject.toml) + # autopep8 + # black + # build + # flynt + # manageprojects + # mypy + # pyproject-api + # pyproject-hooks + # tox +tomlkit==0.11.6 \ + --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ + --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 + # via manageprojects +tox==4.4.6 \ + --hash=sha256:9786671d23b673ace7499c602c5746e2a225d1ecd9d9f624d0461303f40bd93b \ + --hash=sha256:e3d4a65852f029e5ba441a01824d2d839d30bb8fb071635ef9cb53952698e6bf + # via DragonPyEmulator (pyproject.toml) +twine==4.0.2 \ + --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ + --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 + # via DragonPyEmulator (pyproject.toml) +typing-extensions==4.5.0 \ + --hash=sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb \ + --hash=sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4 + # via mypy +urllib3==1.26.14 \ + --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \ + --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1 + # via + # requests + # twine +virtualenv==20.20.0 \ + --hash=sha256:3c22fa5a7c7aa106ced59934d2c20a2ecb7f49b4130b8bf444178a16b880fa45 \ + --hash=sha256:a8a4b8ca1e28f864b7514a253f98c1d62b64e31e77325ba279248c65fb4fcef4 + # via tox +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ + --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 + # via bleach +wheel==0.38.4 \ + --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ + --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 + # via pip-tools +zipp==3.15.0 \ + --hash=sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b \ + --hash=sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556 + # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +pip==23.0.1 \ + --hash=sha256:236bcb61156d76c4b8a05821b988c7b8c35bf0da28a4b614e8d6ab5212c25c6f \ + --hash=sha256:cd015ea1bfb0fcef59d8a286c1f8bebcb983f6317719d415dc5351efb7cd7024 + # via pip-tools +setuptools==67.5.1 \ + --hash=sha256:15136a251127da2d2e77ac7a1bc231eb504654f7e3346d93613a13f2e2787535 \ + --hash=sha256:1c39d42bda4cb89f7fdcad52b6762e3c309ec8f8715b27c684176b7d71283242 + # via + # pip-tools + # safety diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..a1195188 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,58 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# ./cli.py update +# +bx-py-utils==76 \ + --hash=sha256:c9fcedc76daa9782b0a0c535d0d803061f61117f95957862ef58253f3c35fc0e \ + --hash=sha256:f15c64731cd9df0ca9a7bd3993fc0bf4faeb25fc30157348eb9735bf0989a210 + # via + # DragonPyEmulator (pyproject.toml) + # mc6809 +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via + # DragonPyEmulator (pyproject.toml) + # mc6809 + # rich-click +dragonlib==0.1.7 \ + --hash=sha256:1021c9bc4e62e39712f3fee7ddf454b0882168927dcee9a8dbc9fc50ff641b30 \ + --hash=sha256:89646eaa63b45185c5635387434bcf5a3bc6169502c1a19f8e47469d370ccf32 + # via DragonPyEmulator (pyproject.toml) +markdown-it-py==2.2.0 \ + --hash=sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30 \ + --hash=sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1 + # via rich +mc6809==0.7.0rc0 \ + --hash=sha256:8b93189de5b57aaaa48f85ce225573b43826a894a4152d9863474510724ac45b \ + --hash=sha256:f19f5c3ddd83f5b01a857147e821b59da88d70befe8739bb94f81fe356939a7d + # via DragonPyEmulator (pyproject.toml) +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +pygments==2.14.0 \ + --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ + --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 + # via + # DragonPyEmulator (pyproject.toml) + # rich +rich==13.3.2 \ + --hash=sha256:91954fe80cfb7985727a467ca98a7618e5dd15178cc2da10f553b36a93859001 \ + --hash=sha256:a104f37270bf677148d8acb07d33be1569eeee87e2d1beb286a4e9113caf6f2f + # via + # DragonPyEmulator (pyproject.toml) + # mc6809 + # rich-click +rich-click==1.6.1 \ + --hash=sha256:0fcf4d1a09029d79322dd814ab0b2e66ac183633037561881d45abae8a161d95 \ + --hash=sha256:f8ff96693ec6e261d1544e9f7d9a5811c5ef5d74c8adb4978430fc0dac16777e + # via + # DragonPyEmulator (pyproject.toml) + # mc6809 +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via dragonlib