From a241b02a222eaaa38e874a058b608279b42eaf1f Mon Sep 17 00:00:00 2001 From: Al Date: Fri, 8 Dec 2023 17:03:00 +0100 Subject: [PATCH] Initial commit --- .editorconfig | 10 + .gitattributes | 1 + .github/pull_request_template.md | 5 + .github/workflows/cd.yaml | 37 + .github/workflows/check-python.yaml | 56 + .github/workflows/issue_closed.yml | 12 + .github/workflows/issue_commented.yml | 12 + .github/workflows/issue_labelled.yml | 12 + .github/workflows/pr.yaml | 8 + .../workflows/zendesk_github_add_comment.yml | 11 + .../workflows/zendesk_github_close_issue.yml | 11 + .gitignore | 171 ++ .pre-commit-config.yaml | 32 + .vscode/clear.ps1 | 1 + .vscode/extensions.json | 5 + .vscode/settings.json | 11 + .vscode/tasks.json | 94 ++ README.md | 41 + copier.yaml | 158 ++ poetry.lock | 1387 +++++++++++++++++ poetry.toml | 2 + pyproject.toml | 66 + template_content/.algokit.toml.jinja | 22 + .../generators/create_contract/copier.yaml | 10 + .../contract.py.j2 | 30 + ...on' %}deploy_config.py.j2{% endif %}.jinja | 56 + ...pt' %}deploy-config.ts.j2{% endif %}.jinja | 61 + template_content/.editorconfig | 10 + template_content/.env.localnet.template.jinja | 7 + template_content/.env.template | 1 + template_content/.env.testnet.template | 3 + template_content/.gitattributes | 1 + template_content/.gitignore.jinja | 174 +++ template_content/README.md.jinja | 147 ++ template_content/poetry.toml | 2 + template_content/pyproject.toml.jinja | 67 + .../smart_contracts/README.md.jinja | 12 + template_content/smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py.jinja | 52 + .../smart_contracts/config.py.jinja | 64 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py.jinja | 46 + ...e == 'python' %}deploy.py{% endif %}.jinja | 50 + ...= 'typescript' %}index.ts{% endif %}.jinja | 42 + .../{{ contract_name }}/contract.py.jinja | 30 + ...ython' %}deploy_config.py{% endif %}.jinja | 54 + ...cript' %}deploy-config.ts{% endif %}.jinja | 59 + ... 'typescript' %}.prettierignore{% endif %} | 12 + ...= 'typescript' %}.prettierrc.js{% endif %} | 10 + ...ypescript' %}package.json{% endif %}.jinja | 24 + .../externalDependencies.xml | 6 + .../Build_Beaker_application.xml.jinja | 35 + ...d_Beaker_application____LocalNet.xml.jinja | 37 + .../Reset_AlgoKit_LocalNet.xml | 17 + .../Start_AlgoKit_LocalNet.xml | 17 + .../Stop_AlgoKit_LocalNet.xml | 17 + ...oy_Beaker_application.xml{% endif %}.jinja | 38 + ...lt_Beaker_application.xml{% endif %}.jinja | 36 + ...oy_Beaker_application.xml{% endif %}.jinja | 18 + ...lt_Beaker_application.xml{% endif %}.jinja | 16 + .../extensions.json.jinja | 21 + .../launch.json.jinja | 57 + .../settings.json.jinja | 67 + .../tasks.json | 64 + ...on_linter == 'flake8' %}.flake8{% endif %} | 4 + .../workflows/cd.yaml.jinja | 57 + .../workflows/checks.yaml.jinja | 99 ++ .../workflows/pr.yaml | 8 + ...%}.pre-commit-config.yaml{% endif %}.jinja | 38 + .../__init__.py | 0 .../conftest.py | 25 + ... contract_name }}_test.py{% endif %}.jinja | 36 + .../{{ _copier_conf.answers_file }}.jinja | 2 + tests/test_generators.py | 235 +++ tests/test_templates.py | 214 +++ .../test_default_parameters/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_default_parameters/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_default_parameters/.env.template | 1 + .../.env.testnet.template | 3 + .../test_default_parameters/.gitattributes | 1 + .../test_default_parameters/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_default_parameters/README.md | 57 + .../test_default_parameters/poetry.toml | 2 + .../test_default_parameters/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_default_parameters/tests/__init__.py | 0 .../test_default_parameters/tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_deployment_language-python/README.md | 57 + .../poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.gitignore | 174 +++ .../.prettierignore | 12 + .../.prettierrc.js | 10 + .../.vscode/extensions.json | 9 + .../.vscode/launch.json | 36 + .../.vscode/settings.json | 35 + .../.vscode/tasks.json | 64 + .../README.md | 62 + .../package.json | 24 + .../poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 10 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 32 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy-config.ts | 49 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/index.ts | 42 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_ide_jetbrains-False/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_ide_jetbrains-False/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_ide_jetbrains-False/.env.template | 1 + .../.env.testnet.template | 3 + .../test_ide_jetbrains-False/.gitattributes | 1 + .../test_ide_jetbrains-False/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_ide_jetbrains-False/README.md | 57 + .../test_ide_jetbrains-False/poetry.toml | 2 + .../test_ide_jetbrains-False/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_ide_jetbrains-True/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_ide_jetbrains-True/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_ide_jetbrains-True/.env.template | 1 + .../.env.testnet.template | 3 + .../test_ide_jetbrains-True/.gitattributes | 1 + .../test_ide_jetbrains-True/.gitignore | 174 +++ .../Build_Beaker_application.xml | 35 + .../Build_Beaker_application____LocalNet.xml | 37 + .../Build___Deploy_Beaker_application.xml | 38 + .../Deploy_Built_Beaker_application.xml | 36 + .../Reset_AlgoKit_LocalNet.xml | 17 + .../Start_AlgoKit_LocalNet.xml | 17 + .../Stop_AlgoKit_LocalNet.xml | 17 + .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_ide_jetbrains-True/README.md | 57 + .../test_ide_jetbrains-True/poetry.toml | 2 + .../test_ide_jetbrains-True/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_ide_jetbrains-True/tests/__init__.py | 0 .../test_ide_jetbrains-True/tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_ide_vscode-False/.algokit.toml | 15 + .../test_ide_vscode-False/.copier-answers.yml | 20 + .../test_ide_vscode-False/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_ide_vscode-False/.env.template | 1 + .../.env.testnet.template | 3 + .../test_ide_vscode-False/.gitattributes | 1 + .../test_ide_vscode-False/.gitignore | 174 +++ .../test_ide_vscode-False/README.md | 55 + .../test_ide_vscode-False/poetry.toml | 2 + .../test_ide_vscode-False/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_ide_vscode-False/tests/__init__.py | 0 .../test_ide_vscode-False/tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_ide_vscode-True/.algokit.toml | 15 + .../test_ide_vscode-True/.copier-answers.yml | 19 + .../test_ide_vscode-True/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_ide_vscode-True/.env.template | 1 + .../.env.testnet.template | 3 + .../test_ide_vscode-True/.gitattributes | 1 + .../test_ide_vscode-True/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../test_ide_vscode-True/.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../test_ide_vscode-True/.vscode/tasks.json | 64 + .../test_ide_vscode-True/README.md | 57 + .../test_ide_vscode-True/poetry.toml | 2 + .../test_ide_vscode-True/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_ide_vscode-True/tests/__init__.py | 0 .../test_ide_vscode-True/tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_preset_name-production/.algokit.toml | 15 + .../.copier-answers.yml | 25 + .../test_preset_name-production/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_preset_name-production/.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.github/workflows/cd.yaml | 50 + .../.github/workflows/checks.yaml | 79 + .../.github/workflows/pr.yaml | 8 + .../test_preset_name-production/.gitignore | 174 +++ .../.pre-commit-config.yaml | 38 + .../.vscode/extensions.json | 10 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 49 + .../.vscode/tasks.json | 64 + .../test_preset_name-production/README.md | 99 ++ .../test_preset_name-production/poetry.toml | 2 + .../pyproject.toml | 50 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 26 + .../hello_world/deploy_config.py | 45 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 34 + .../test_preset_name-starter/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_preset_name-starter/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_preset_name-starter/.env.template | 1 + .../.env.testnet.template | 3 + .../test_preset_name-starter/.gitattributes | 1 + .../test_preset_name-starter/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_preset_name-starter/README.md | 57 + .../test_preset_name-starter/poetry.toml | 2 + .../test_preset_name-starter/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_python_linter-flake8/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_python_linter-flake8/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_python_linter-flake8/.env.template | 1 + .../.env.testnet.template | 3 + .../test_python_linter-flake8/.flake8 | 4 + .../test_python_linter-flake8/.gitattributes | 1 + .../test_python_linter-flake8/.gitignore | 174 +++ .../.vscode/extensions.json | 9 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 34 + .../.vscode/tasks.json | 64 + .../test_python_linter-flake8/README.md | 57 + .../test_python_linter-flake8/poetry.toml | 2 + .../test_python_linter-flake8/pyproject.toml | 27 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_python_linter-none/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_python_linter-none/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_python_linter-none/.env.template | 1 + .../.env.testnet.template | 3 + .../test_python_linter-none/.gitattributes | 1 + .../test_python_linter-none/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_python_linter-none/README.md | 57 + .../test_python_linter-none/poetry.toml | 2 + .../test_python_linter-none/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_python_linter-none/tests/__init__.py | 0 .../test_python_linter-none/tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_python_linter-ruff/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_python_linter-ruff/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_python_linter-ruff/.env.template | 1 + .../.env.testnet.template | 3 + .../test_python_linter-ruff/.gitattributes | 1 + .../test_python_linter-ruff/.gitignore | 174 +++ .../.vscode/extensions.json | 9 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 44 + .../.vscode/tasks.json | 64 + .../test_python_linter-ruff/README.md | 58 + .../test_python_linter-ruff/poetry.toml | 2 + .../test_python_linter-ruff/pyproject.toml | 39 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_python_linter-ruff/tests/__init__.py | 0 .../test_python_linter-ruff/tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../generators/create_contract/copier.yaml | 10 + .../{{ contract_name }}/contract.py.j2 | 30 + .../{{ contract_name }}/deploy_config.py.j2 | 54 + .../.copier-answers.yml | 25 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.github/workflows/cd.yaml | 50 + .../.github/workflows/checks.yaml | 79 + .../.github/workflows/pr.yaml | 8 + .../.gitignore | 174 +++ .../.pre-commit-config.yaml | 38 + .../.vscode/extensions.json | 10 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 49 + .../.vscode/tasks.json | 64 + .../README.md | 99 ++ .../poetry.toml | 2 + .../pyproject.toml | 50 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/cool_contract/contract.py | 26 + .../cool_contract/deploy_config.py | 45 + .../smart_contracts/hello_world/contract.py | 26 + .../hello_world/deploy_config.py | 45 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 34 + .../.algokit.toml | 15 + .../generators/create_contract/copier.yaml | 10 + .../{{ contract_name }}/contract.py.j2 | 30 + .../{{ contract_name }}/deploy-config.ts.j2 | 59 + .../.copier-answers.yml | 25 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.github/workflows/cd.yaml | 50 + .../.github/workflows/checks.yaml | 79 + .../.github/workflows/pr.yaml | 8 + .../.gitignore | 174 +++ .../.pre-commit-config.yaml | 38 + .../.prettierignore | 12 + .../.prettierrc.js | 10 + .../.vscode/extensions.json | 11 + .../.vscode/launch.json | 36 + .../.vscode/settings.json | 52 + .../.vscode/tasks.json | 64 + .../README.md | 104 ++ .../package.json | 24 + .../poetry.toml | 2 + .../pyproject.toml | 50 + .../smart_contracts/README.md | 10 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 32 + .../smart_contracts/config.py | 64 + .../smart_contracts/cool_contract/contract.py | 26 + .../cool_contract/deploy-config.ts | 52 + .../smart_contracts/hello_world/contract.py | 26 + .../hello_world/deploy-config.ts | 52 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/index.ts | 42 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 34 + .../.algokit.toml | 15 + .../generators/create_contract/copier.yaml | 10 + .../{{ contract_name }}/contract.py.j2 | 30 + .../{{ contract_name }}/deploy_config.py.j2 | 54 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../README.md | 57 + .../poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/cool_contract/contract.py | 10 + .../cool_contract/deploy_config.py | 36 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../generators/create_contract/copier.yaml | 10 + .../{{ contract_name }}/contract.py.j2 | 30 + .../{{ contract_name }}/deploy-config.ts.j2 | 59 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.gitignore | 174 +++ .../.prettierignore | 12 + .../.prettierrc.js | 10 + .../.vscode/extensions.json | 9 + .../.vscode/launch.json | 36 + .../.vscode/settings.json | 35 + .../.vscode/tasks.json | 64 + .../README.md | 62 + .../package.json | 24 + .../poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 10 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 32 + .../smart_contracts/config.py | 64 + .../smart_contracts/cool_contract/contract.py | 10 + .../cool_contract/deploy-config.ts | 49 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy-config.ts | 49 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/index.ts | 42 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../test_use_github_actions-False/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_use_github_actions-False/README.md | 57 + .../test_use_github_actions-False/poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../.github/workflows/cd.yaml | 50 + .../.github/workflows/checks.yaml | 71 + .../.github/workflows/pr.yaml | 8 + .../test_use_github_actions-True/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_use_github_actions-True/README.md | 94 ++ .../test_use_github_actions-True/poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_use_python_black-False/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_use_python_black-False/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_use_python_black-False/.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../test_use_python_black-False/.gitignore | 174 +++ .../.vscode/extensions.json | 7 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 31 + .../.vscode/tasks.json | 64 + .../test_use_python_black-False/README.md | 57 + .../test_use_python_black-False/poetry.toml | 2 + .../pyproject.toml | 25 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_use_python_black-True/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_use_python_black-True/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_use_python_black-True/.env.template | 1 + .../.env.testnet.template | 3 + .../test_use_python_black-True/.gitattributes | 1 + .../test_use_python_black-True/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_use_python_black-True/README.md | 57 + .../test_use_python_black-True/poetry.toml | 2 + .../test_use_python_black-True/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_use_python_mypy-False/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_use_python_mypy-False/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_use_python_mypy-False/.env.template | 1 + .../.env.testnet.template | 3 + .../test_use_python_mypy-False/.gitattributes | 1 + .../test_use_python_mypy-False/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_use_python_mypy-False/README.md | 57 + .../test_use_python_mypy-False/poetry.toml | 2 + .../test_use_python_mypy-False/pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../test_use_python_mypy-True/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_use_python_mypy-True/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_use_python_mypy-True/.env.template | 1 + .../.env.testnet.template | 3 + .../test_use_python_mypy-True/.gitattributes | 1 + .../test_use_python_mypy-True/.gitignore | 174 +++ .../.vscode/extensions.json | 9 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 37 + .../.vscode/tasks.json | 64 + .../test_use_python_mypy-True/README.md | 58 + .../test_use_python_mypy-True/poetry.toml | 2 + .../test_use_python_mypy-True/pyproject.toml | 36 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + .../.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../.editorconfig | 10 + .../.env.localnet.template | 7 + .../.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../test_use_python_pytest-False/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 31 + .../.vscode/tasks.json | 64 + .../test_use_python_pytest-False/README.md | 56 + .../test_use_python_pytest-False/poetry.toml | 2 + .../pyproject.toml | 21 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../test_use_python_pytest-True/.algokit.toml | 15 + .../.copier-answers.yml | 19 + .../test_use_python_pytest-True/.editorconfig | 10 + .../.env.localnet.template | 7 + .../test_use_python_pytest-True/.env.template | 1 + .../.env.testnet.template | 3 + .../.gitattributes | 1 + .../test_use_python_pytest-True/.gitignore | 174 +++ .../.vscode/extensions.json | 8 + .../.vscode/launch.json | 31 + .../.vscode/settings.json | 32 + .../.vscode/tasks.json | 64 + .../test_use_python_pytest-True/README.md | 57 + .../test_use_python_pytest-True/poetry.toml | 2 + .../pyproject.toml | 26 + .../smart_contracts/README.md | 9 + .../smart_contracts/__init__.py | 0 .../smart_contracts/__main__.py | 46 + .../smart_contracts/config.py | 64 + .../smart_contracts/hello_world/contract.py | 10 + .../hello_world/deploy_config.py | 36 + .../smart_contracts/helpers/__init__.py | 0 .../smart_contracts/helpers/build.py | 43 + .../smart_contracts/helpers/deploy.py | 50 + .../tests/__init__.py | 0 .../tests/conftest.py | 25 + .../tests/hello_world_test.py | 33 + 768 files changed, 24614 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/cd.yaml create mode 100644 .github/workflows/check-python.yaml create mode 100644 .github/workflows/issue_closed.yml create mode 100644 .github/workflows/issue_commented.yml create mode 100644 .github/workflows/issue_labelled.yml create mode 100644 .github/workflows/pr.yaml create mode 100644 .github/workflows/zendesk_github_add_comment.yml create mode 100644 .github/workflows/zendesk_github_close_issue.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 .vscode/clear.ps1 create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 README.md create mode 100644 copier.yaml create mode 100644 poetry.lock create mode 100644 poetry.toml create mode 100644 pyproject.toml create mode 100644 template_content/.algokit.toml.jinja create mode 100644 template_content/.algokit/generators/create_contract/copier.yaml create mode 100644 template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/contract.py.j2 create mode 100644 template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'python' %}deploy_config.py.j2{% endif %}.jinja create mode 100644 template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'typescript' %}deploy-config.ts.j2{% endif %}.jinja create mode 100644 template_content/.editorconfig create mode 100644 template_content/.env.localnet.template.jinja create mode 100644 template_content/.env.template create mode 100644 template_content/.env.testnet.template create mode 100644 template_content/.gitattributes create mode 100644 template_content/.gitignore.jinja create mode 100644 template_content/README.md.jinja create mode 100644 template_content/poetry.toml create mode 100644 template_content/pyproject.toml.jinja create mode 100644 template_content/smart_contracts/README.md.jinja create mode 100644 template_content/smart_contracts/__init__.py create mode 100644 template_content/smart_contracts/__main__.py.jinja create mode 100644 template_content/smart_contracts/config.py.jinja create mode 100644 template_content/smart_contracts/helpers/__init__.py create mode 100644 template_content/smart_contracts/helpers/build.py.jinja create mode 100644 template_content/smart_contracts/helpers/{% if deployment_language == 'python' %}deploy.py{% endif %}.jinja create mode 100644 template_content/smart_contracts/{% if deployment_language == 'typescript' %}index.ts{% endif %}.jinja create mode 100644 template_content/smart_contracts/{{ contract_name }}/contract.py.jinja create mode 100644 template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'python' %}deploy_config.py{% endif %}.jinja create mode 100644 template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'typescript' %}deploy-config.ts{% endif %}.jinja create mode 100644 template_content/{% if deployment_language == 'typescript' %}.prettierignore{% endif %} create mode 100644 template_content/{% if deployment_language == 'typescript' %}.prettierrc.js{% endif %} create mode 100644 template_content/{% if deployment_language == 'typescript' %}package.json{% endif %}.jinja create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/externalDependencies.xml create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application.xml.jinja create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application____LocalNet.xml.jinja create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Reset_AlgoKit_LocalNet.xml create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Start_AlgoKit_LocalNet.xml create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Stop_AlgoKit_LocalNet.xml create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja create mode 100644 template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja create mode 100644 template_content/{% if ide_vscode %}.vscode{% endif %}/extensions.json.jinja create mode 100644 template_content/{% if ide_vscode %}.vscode{% endif %}/launch.json.jinja create mode 100644 template_content/{% if ide_vscode %}.vscode{% endif %}/settings.json.jinja create mode 100644 template_content/{% if ide_vscode %}.vscode{% endif %}/tasks.json create mode 100644 template_content/{% if python_linter == 'flake8' %}.flake8{% endif %} create mode 100644 template_content/{% if use_github_actions %}.github{% endif %}/workflows/cd.yaml.jinja create mode 100644 template_content/{% if use_github_actions %}.github{% endif %}/workflows/checks.yaml.jinja create mode 100644 template_content/{% if use_github_actions %}.github{% endif %}/workflows/pr.yaml create mode 100644 template_content/{% if use_pre_commit %}.pre-commit-config.yaml{% endif %}.jinja create mode 100644 template_content/{% if use_python_pytest %}tests{% endif %}/__init__.py create mode 100644 template_content/{% if use_python_pytest %}tests{% endif %}/conftest.py create mode 100644 template_content/{% if use_python_pytest %}tests{% endif %}/{% if use_python_pytest %}{{ contract_name }}_test.py{% endif %}.jinja create mode 100644 template_content/{{ _copier_conf.answers_file }}.jinja create mode 100644 tests/test_generators.py create mode 100644 tests/test_templates.py create mode 100644 tests_generated/test_default_parameters/.algokit.toml create mode 100644 tests_generated/test_default_parameters/.copier-answers.yml create mode 100644 tests_generated/test_default_parameters/.editorconfig create mode 100644 tests_generated/test_default_parameters/.env.localnet.template create mode 100644 tests_generated/test_default_parameters/.env.template create mode 100644 tests_generated/test_default_parameters/.env.testnet.template create mode 100644 tests_generated/test_default_parameters/.gitattributes create mode 100644 tests_generated/test_default_parameters/.gitignore create mode 100644 tests_generated/test_default_parameters/.vscode/extensions.json create mode 100644 tests_generated/test_default_parameters/.vscode/launch.json create mode 100644 tests_generated/test_default_parameters/.vscode/settings.json create mode 100644 tests_generated/test_default_parameters/.vscode/tasks.json create mode 100644 tests_generated/test_default_parameters/README.md create mode 100644 tests_generated/test_default_parameters/poetry.toml create mode 100644 tests_generated/test_default_parameters/pyproject.toml create mode 100644 tests_generated/test_default_parameters/smart_contracts/README.md create mode 100644 tests_generated/test_default_parameters/smart_contracts/__init__.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/__main__.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/config.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_default_parameters/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_default_parameters/tests/__init__.py create mode 100644 tests_generated/test_default_parameters/tests/conftest.py create mode 100644 tests_generated/test_default_parameters/tests/hello_world_test.py create mode 100644 tests_generated/test_deployment_language-python/.algokit.toml create mode 100644 tests_generated/test_deployment_language-python/.copier-answers.yml create mode 100644 tests_generated/test_deployment_language-python/.editorconfig create mode 100644 tests_generated/test_deployment_language-python/.env.localnet.template create mode 100644 tests_generated/test_deployment_language-python/.env.template create mode 100644 tests_generated/test_deployment_language-python/.env.testnet.template create mode 100644 tests_generated/test_deployment_language-python/.gitattributes create mode 100644 tests_generated/test_deployment_language-python/.gitignore create mode 100644 tests_generated/test_deployment_language-python/.vscode/extensions.json create mode 100644 tests_generated/test_deployment_language-python/.vscode/launch.json create mode 100644 tests_generated/test_deployment_language-python/.vscode/settings.json create mode 100644 tests_generated/test_deployment_language-python/.vscode/tasks.json create mode 100644 tests_generated/test_deployment_language-python/README.md create mode 100644 tests_generated/test_deployment_language-python/poetry.toml create mode 100644 tests_generated/test_deployment_language-python/pyproject.toml create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/README.md create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/__init__.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/__main__.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/config.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_deployment_language-python/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_deployment_language-python/tests/__init__.py create mode 100644 tests_generated/test_deployment_language-python/tests/conftest.py create mode 100644 tests_generated/test_deployment_language-python/tests/hello_world_test.py create mode 100644 tests_generated/test_deployment_language-typescript/.algokit.toml create mode 100644 tests_generated/test_deployment_language-typescript/.copier-answers.yml create mode 100644 tests_generated/test_deployment_language-typescript/.editorconfig create mode 100644 tests_generated/test_deployment_language-typescript/.env.localnet.template create mode 100644 tests_generated/test_deployment_language-typescript/.env.template create mode 100644 tests_generated/test_deployment_language-typescript/.env.testnet.template create mode 100644 tests_generated/test_deployment_language-typescript/.gitattributes create mode 100644 tests_generated/test_deployment_language-typescript/.gitignore create mode 100644 tests_generated/test_deployment_language-typescript/.prettierignore create mode 100644 tests_generated/test_deployment_language-typescript/.prettierrc.js create mode 100644 tests_generated/test_deployment_language-typescript/.vscode/extensions.json create mode 100644 tests_generated/test_deployment_language-typescript/.vscode/launch.json create mode 100644 tests_generated/test_deployment_language-typescript/.vscode/settings.json create mode 100644 tests_generated/test_deployment_language-typescript/.vscode/tasks.json create mode 100644 tests_generated/test_deployment_language-typescript/README.md create mode 100644 tests_generated/test_deployment_language-typescript/package.json create mode 100644 tests_generated/test_deployment_language-typescript/poetry.toml create mode 100644 tests_generated/test_deployment_language-typescript/pyproject.toml create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/README.md create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/__init__.py create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/__main__.py create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/config.py create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/hello_world/deploy-config.ts create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_deployment_language-typescript/smart_contracts/index.ts create mode 100644 tests_generated/test_deployment_language-typescript/tests/__init__.py create mode 100644 tests_generated/test_deployment_language-typescript/tests/conftest.py create mode 100644 tests_generated/test_deployment_language-typescript/tests/hello_world_test.py create mode 100644 tests_generated/test_ide_jetbrains-False/.algokit.toml create mode 100644 tests_generated/test_ide_jetbrains-False/.copier-answers.yml create mode 100644 tests_generated/test_ide_jetbrains-False/.editorconfig create mode 100644 tests_generated/test_ide_jetbrains-False/.env.localnet.template create mode 100644 tests_generated/test_ide_jetbrains-False/.env.template create mode 100644 tests_generated/test_ide_jetbrains-False/.env.testnet.template create mode 100644 tests_generated/test_ide_jetbrains-False/.gitattributes create mode 100644 tests_generated/test_ide_jetbrains-False/.gitignore create mode 100644 tests_generated/test_ide_jetbrains-False/.vscode/extensions.json create mode 100644 tests_generated/test_ide_jetbrains-False/.vscode/launch.json create mode 100644 tests_generated/test_ide_jetbrains-False/.vscode/settings.json create mode 100644 tests_generated/test_ide_jetbrains-False/.vscode/tasks.json create mode 100644 tests_generated/test_ide_jetbrains-False/README.md create mode 100644 tests_generated/test_ide_jetbrains-False/poetry.toml create mode 100644 tests_generated/test_ide_jetbrains-False/pyproject.toml create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/README.md create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/__init__.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/__main__.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/config.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_ide_jetbrains-False/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_ide_jetbrains-False/tests/__init__.py create mode 100644 tests_generated/test_ide_jetbrains-False/tests/conftest.py create mode 100644 tests_generated/test_ide_jetbrains-False/tests/hello_world_test.py create mode 100644 tests_generated/test_ide_jetbrains-True/.algokit.toml create mode 100644 tests_generated/test_ide_jetbrains-True/.copier-answers.yml create mode 100644 tests_generated/test_ide_jetbrains-True/.editorconfig create mode 100644 tests_generated/test_ide_jetbrains-True/.env.localnet.template create mode 100644 tests_generated/test_ide_jetbrains-True/.env.template create mode 100644 tests_generated/test_ide_jetbrains-True/.env.testnet.template create mode 100644 tests_generated/test_ide_jetbrains-True/.gitattributes create mode 100644 tests_generated/test_ide_jetbrains-True/.gitignore create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Build_Beaker_application.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Build_Beaker_application____LocalNet.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Build___Deploy_Beaker_application.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Deploy_Built_Beaker_application.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Reset_AlgoKit_LocalNet.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Start_AlgoKit_LocalNet.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.idea/runConfigurations/Stop_AlgoKit_LocalNet.xml create mode 100644 tests_generated/test_ide_jetbrains-True/.vscode/extensions.json create mode 100644 tests_generated/test_ide_jetbrains-True/.vscode/launch.json create mode 100644 tests_generated/test_ide_jetbrains-True/.vscode/settings.json create mode 100644 tests_generated/test_ide_jetbrains-True/.vscode/tasks.json create mode 100644 tests_generated/test_ide_jetbrains-True/README.md create mode 100644 tests_generated/test_ide_jetbrains-True/poetry.toml create mode 100644 tests_generated/test_ide_jetbrains-True/pyproject.toml create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/README.md create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/__init__.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/__main__.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/config.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_ide_jetbrains-True/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_ide_jetbrains-True/tests/__init__.py create mode 100644 tests_generated/test_ide_jetbrains-True/tests/conftest.py create mode 100644 tests_generated/test_ide_jetbrains-True/tests/hello_world_test.py create mode 100644 tests_generated/test_ide_vscode-False/.algokit.toml create mode 100644 tests_generated/test_ide_vscode-False/.copier-answers.yml create mode 100644 tests_generated/test_ide_vscode-False/.editorconfig create mode 100644 tests_generated/test_ide_vscode-False/.env.localnet.template create mode 100644 tests_generated/test_ide_vscode-False/.env.template create mode 100644 tests_generated/test_ide_vscode-False/.env.testnet.template create mode 100644 tests_generated/test_ide_vscode-False/.gitattributes create mode 100644 tests_generated/test_ide_vscode-False/.gitignore create mode 100644 tests_generated/test_ide_vscode-False/README.md create mode 100644 tests_generated/test_ide_vscode-False/poetry.toml create mode 100644 tests_generated/test_ide_vscode-False/pyproject.toml create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/README.md create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/__init__.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/__main__.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/config.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_ide_vscode-False/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_ide_vscode-False/tests/__init__.py create mode 100644 tests_generated/test_ide_vscode-False/tests/conftest.py create mode 100644 tests_generated/test_ide_vscode-False/tests/hello_world_test.py create mode 100644 tests_generated/test_ide_vscode-True/.algokit.toml create mode 100644 tests_generated/test_ide_vscode-True/.copier-answers.yml create mode 100644 tests_generated/test_ide_vscode-True/.editorconfig create mode 100644 tests_generated/test_ide_vscode-True/.env.localnet.template create mode 100644 tests_generated/test_ide_vscode-True/.env.template create mode 100644 tests_generated/test_ide_vscode-True/.env.testnet.template create mode 100644 tests_generated/test_ide_vscode-True/.gitattributes create mode 100644 tests_generated/test_ide_vscode-True/.gitignore create mode 100644 tests_generated/test_ide_vscode-True/.vscode/extensions.json create mode 100644 tests_generated/test_ide_vscode-True/.vscode/launch.json create mode 100644 tests_generated/test_ide_vscode-True/.vscode/settings.json create mode 100644 tests_generated/test_ide_vscode-True/.vscode/tasks.json create mode 100644 tests_generated/test_ide_vscode-True/README.md create mode 100644 tests_generated/test_ide_vscode-True/poetry.toml create mode 100644 tests_generated/test_ide_vscode-True/pyproject.toml create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/README.md create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/__init__.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/__main__.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/config.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_ide_vscode-True/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_ide_vscode-True/tests/__init__.py create mode 100644 tests_generated/test_ide_vscode-True/tests/conftest.py create mode 100644 tests_generated/test_ide_vscode-True/tests/hello_world_test.py create mode 100644 tests_generated/test_preset_name-production/.algokit.toml create mode 100644 tests_generated/test_preset_name-production/.copier-answers.yml create mode 100644 tests_generated/test_preset_name-production/.editorconfig create mode 100644 tests_generated/test_preset_name-production/.env.localnet.template create mode 100644 tests_generated/test_preset_name-production/.env.template create mode 100644 tests_generated/test_preset_name-production/.env.testnet.template create mode 100644 tests_generated/test_preset_name-production/.gitattributes create mode 100644 tests_generated/test_preset_name-production/.github/workflows/cd.yaml create mode 100644 tests_generated/test_preset_name-production/.github/workflows/checks.yaml create mode 100644 tests_generated/test_preset_name-production/.github/workflows/pr.yaml create mode 100644 tests_generated/test_preset_name-production/.gitignore create mode 100644 tests_generated/test_preset_name-production/.pre-commit-config.yaml create mode 100644 tests_generated/test_preset_name-production/.vscode/extensions.json create mode 100644 tests_generated/test_preset_name-production/.vscode/launch.json create mode 100644 tests_generated/test_preset_name-production/.vscode/settings.json create mode 100644 tests_generated/test_preset_name-production/.vscode/tasks.json create mode 100644 tests_generated/test_preset_name-production/README.md create mode 100644 tests_generated/test_preset_name-production/poetry.toml create mode 100644 tests_generated/test_preset_name-production/pyproject.toml create mode 100644 tests_generated/test_preset_name-production/smart_contracts/README.md create mode 100644 tests_generated/test_preset_name-production/smart_contracts/__init__.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/__main__.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/config.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_preset_name-production/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_preset_name-production/tests/__init__.py create mode 100644 tests_generated/test_preset_name-production/tests/conftest.py create mode 100644 tests_generated/test_preset_name-production/tests/hello_world_test.py create mode 100644 tests_generated/test_preset_name-starter/.algokit.toml create mode 100644 tests_generated/test_preset_name-starter/.copier-answers.yml create mode 100644 tests_generated/test_preset_name-starter/.editorconfig create mode 100644 tests_generated/test_preset_name-starter/.env.localnet.template create mode 100644 tests_generated/test_preset_name-starter/.env.template create mode 100644 tests_generated/test_preset_name-starter/.env.testnet.template create mode 100644 tests_generated/test_preset_name-starter/.gitattributes create mode 100644 tests_generated/test_preset_name-starter/.gitignore create mode 100644 tests_generated/test_preset_name-starter/.vscode/extensions.json create mode 100644 tests_generated/test_preset_name-starter/.vscode/launch.json create mode 100644 tests_generated/test_preset_name-starter/.vscode/settings.json create mode 100644 tests_generated/test_preset_name-starter/.vscode/tasks.json create mode 100644 tests_generated/test_preset_name-starter/README.md create mode 100644 tests_generated/test_preset_name-starter/poetry.toml create mode 100644 tests_generated/test_preset_name-starter/pyproject.toml create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/README.md create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/__init__.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/__main__.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/config.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_preset_name-starter/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_preset_name-starter/tests/__init__.py create mode 100644 tests_generated/test_preset_name-starter/tests/conftest.py create mode 100644 tests_generated/test_preset_name-starter/tests/hello_world_test.py create mode 100644 tests_generated/test_python_linter-flake8/.algokit.toml create mode 100644 tests_generated/test_python_linter-flake8/.copier-answers.yml create mode 100644 tests_generated/test_python_linter-flake8/.editorconfig create mode 100644 tests_generated/test_python_linter-flake8/.env.localnet.template create mode 100644 tests_generated/test_python_linter-flake8/.env.template create mode 100644 tests_generated/test_python_linter-flake8/.env.testnet.template create mode 100644 tests_generated/test_python_linter-flake8/.flake8 create mode 100644 tests_generated/test_python_linter-flake8/.gitattributes create mode 100644 tests_generated/test_python_linter-flake8/.gitignore create mode 100644 tests_generated/test_python_linter-flake8/.vscode/extensions.json create mode 100644 tests_generated/test_python_linter-flake8/.vscode/launch.json create mode 100644 tests_generated/test_python_linter-flake8/.vscode/settings.json create mode 100644 tests_generated/test_python_linter-flake8/.vscode/tasks.json create mode 100644 tests_generated/test_python_linter-flake8/README.md create mode 100644 tests_generated/test_python_linter-flake8/poetry.toml create mode 100644 tests_generated/test_python_linter-flake8/pyproject.toml create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/README.md create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/__init__.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/__main__.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/config.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_python_linter-flake8/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_python_linter-flake8/tests/__init__.py create mode 100644 tests_generated/test_python_linter-flake8/tests/conftest.py create mode 100644 tests_generated/test_python_linter-flake8/tests/hello_world_test.py create mode 100644 tests_generated/test_python_linter-none/.algokit.toml create mode 100644 tests_generated/test_python_linter-none/.copier-answers.yml create mode 100644 tests_generated/test_python_linter-none/.editorconfig create mode 100644 tests_generated/test_python_linter-none/.env.localnet.template create mode 100644 tests_generated/test_python_linter-none/.env.template create mode 100644 tests_generated/test_python_linter-none/.env.testnet.template create mode 100644 tests_generated/test_python_linter-none/.gitattributes create mode 100644 tests_generated/test_python_linter-none/.gitignore create mode 100644 tests_generated/test_python_linter-none/.vscode/extensions.json create mode 100644 tests_generated/test_python_linter-none/.vscode/launch.json create mode 100644 tests_generated/test_python_linter-none/.vscode/settings.json create mode 100644 tests_generated/test_python_linter-none/.vscode/tasks.json create mode 100644 tests_generated/test_python_linter-none/README.md create mode 100644 tests_generated/test_python_linter-none/poetry.toml create mode 100644 tests_generated/test_python_linter-none/pyproject.toml create mode 100644 tests_generated/test_python_linter-none/smart_contracts/README.md create mode 100644 tests_generated/test_python_linter-none/smart_contracts/__init__.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/__main__.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/config.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_python_linter-none/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_python_linter-none/tests/__init__.py create mode 100644 tests_generated/test_python_linter-none/tests/conftest.py create mode 100644 tests_generated/test_python_linter-none/tests/hello_world_test.py create mode 100644 tests_generated/test_python_linter-ruff/.algokit.toml create mode 100644 tests_generated/test_python_linter-ruff/.copier-answers.yml create mode 100644 tests_generated/test_python_linter-ruff/.editorconfig create mode 100644 tests_generated/test_python_linter-ruff/.env.localnet.template create mode 100644 tests_generated/test_python_linter-ruff/.env.template create mode 100644 tests_generated/test_python_linter-ruff/.env.testnet.template create mode 100644 tests_generated/test_python_linter-ruff/.gitattributes create mode 100644 tests_generated/test_python_linter-ruff/.gitignore create mode 100644 tests_generated/test_python_linter-ruff/.vscode/extensions.json create mode 100644 tests_generated/test_python_linter-ruff/.vscode/launch.json create mode 100644 tests_generated/test_python_linter-ruff/.vscode/settings.json create mode 100644 tests_generated/test_python_linter-ruff/.vscode/tasks.json create mode 100644 tests_generated/test_python_linter-ruff/README.md create mode 100644 tests_generated/test_python_linter-ruff/poetry.toml create mode 100644 tests_generated/test_python_linter-ruff/pyproject.toml create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/README.md create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/__init__.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/__main__.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/config.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_python_linter-ruff/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_python_linter-ruff/tests/__init__.py create mode 100644 tests_generated/test_python_linter-ruff/tests/conftest.py create mode 100644 tests_generated/test_python_linter-ruff/tests/hello_world_test.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.algokit.toml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.algokit/generators/create_contract/copier.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.copier-answers.yml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.editorconfig create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.env.localnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.env.template create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.env.testnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.gitattributes create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.github/workflows/cd.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.github/workflows/checks.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.github/workflows/pr.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.gitignore create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.pre-commit-config.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.vscode/extensions.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.vscode/launch.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.vscode/settings.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/.vscode/tasks.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/poetry.toml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/pyproject.toml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/__main__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/config.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/cool_contract/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/cool_contract/deploy_config.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/tests/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/tests/conftest.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_python/tests/hello_world_test.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.algokit.toml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.algokit/generators/create_contract/copier.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.copier-answers.yml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.editorconfig create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.env.localnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.env.template create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.env.testnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.gitattributes create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.github/workflows/cd.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.github/workflows/checks.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.github/workflows/pr.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.gitignore create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.pre-commit-config.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.prettierignore create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.prettierrc.js create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.vscode/extensions.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.vscode/launch.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.vscode/settings.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/.vscode/tasks.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/package.json create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/poetry.toml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/pyproject.toml create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/__main__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/config.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/cool_contract/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/cool_contract/deploy-config.ts create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/hello_world/deploy-config.ts create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/smart_contracts/index.ts create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/tests/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/tests/conftest.py create mode 100644 tests_generated/test_smart_contract_generator_default_production_preset_typescript/tests/hello_world_test.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.algokit.toml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.algokit/generators/create_contract/copier.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy_config.py.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.copier-answers.yml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.editorconfig create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.env.localnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.env.template create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.env.testnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.gitattributes create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.gitignore create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.vscode/extensions.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.vscode/launch.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.vscode/settings.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/.vscode/tasks.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/poetry.toml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/pyproject.toml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/__main__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/config.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/cool_contract/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/cool_contract/deploy_config.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/tests/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/tests/conftest.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_python/tests/hello_world_test.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.algokit.toml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.algokit/generators/create_contract/copier.yaml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/contract.py.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.algokit/generators/create_contract/smart_contracts/{{ contract_name }}/deploy-config.ts.j2 create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.copier-answers.yml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.editorconfig create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.env.localnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.env.template create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.env.testnet.template create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.gitattributes create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.gitignore create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.prettierignore create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.prettierrc.js create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.vscode/extensions.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.vscode/launch.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.vscode/settings.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/.vscode/tasks.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/package.json create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/poetry.toml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/pyproject.toml create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/README.md create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/__main__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/config.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/cool_contract/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/cool_contract/deploy-config.ts create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/hello_world/deploy-config.ts create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/smart_contracts/index.ts create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/tests/__init__.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/tests/conftest.py create mode 100644 tests_generated/test_smart_contract_generator_default_starter_preset_typescript/tests/hello_world_test.py create mode 100644 tests_generated/test_use_github_actions-False/.algokit.toml create mode 100644 tests_generated/test_use_github_actions-False/.copier-answers.yml create mode 100644 tests_generated/test_use_github_actions-False/.editorconfig create mode 100644 tests_generated/test_use_github_actions-False/.env.localnet.template create mode 100644 tests_generated/test_use_github_actions-False/.env.template create mode 100644 tests_generated/test_use_github_actions-False/.env.testnet.template create mode 100644 tests_generated/test_use_github_actions-False/.gitattributes create mode 100644 tests_generated/test_use_github_actions-False/.gitignore create mode 100644 tests_generated/test_use_github_actions-False/.vscode/extensions.json create mode 100644 tests_generated/test_use_github_actions-False/.vscode/launch.json create mode 100644 tests_generated/test_use_github_actions-False/.vscode/settings.json create mode 100644 tests_generated/test_use_github_actions-False/.vscode/tasks.json create mode 100644 tests_generated/test_use_github_actions-False/README.md create mode 100644 tests_generated/test_use_github_actions-False/poetry.toml create mode 100644 tests_generated/test_use_github_actions-False/pyproject.toml create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/README.md create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/config.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_github_actions-False/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_github_actions-False/tests/__init__.py create mode 100644 tests_generated/test_use_github_actions-False/tests/conftest.py create mode 100644 tests_generated/test_use_github_actions-False/tests/hello_world_test.py create mode 100644 tests_generated/test_use_github_actions-True/.algokit.toml create mode 100644 tests_generated/test_use_github_actions-True/.copier-answers.yml create mode 100644 tests_generated/test_use_github_actions-True/.editorconfig create mode 100644 tests_generated/test_use_github_actions-True/.env.localnet.template create mode 100644 tests_generated/test_use_github_actions-True/.env.template create mode 100644 tests_generated/test_use_github_actions-True/.env.testnet.template create mode 100644 tests_generated/test_use_github_actions-True/.gitattributes create mode 100644 tests_generated/test_use_github_actions-True/.github/workflows/cd.yaml create mode 100644 tests_generated/test_use_github_actions-True/.github/workflows/checks.yaml create mode 100644 tests_generated/test_use_github_actions-True/.github/workflows/pr.yaml create mode 100644 tests_generated/test_use_github_actions-True/.gitignore create mode 100644 tests_generated/test_use_github_actions-True/.vscode/extensions.json create mode 100644 tests_generated/test_use_github_actions-True/.vscode/launch.json create mode 100644 tests_generated/test_use_github_actions-True/.vscode/settings.json create mode 100644 tests_generated/test_use_github_actions-True/.vscode/tasks.json create mode 100644 tests_generated/test_use_github_actions-True/README.md create mode 100644 tests_generated/test_use_github_actions-True/poetry.toml create mode 100644 tests_generated/test_use_github_actions-True/pyproject.toml create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/README.md create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/config.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_github_actions-True/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_github_actions-True/tests/__init__.py create mode 100644 tests_generated/test_use_github_actions-True/tests/conftest.py create mode 100644 tests_generated/test_use_github_actions-True/tests/hello_world_test.py create mode 100644 tests_generated/test_use_python_black-False/.algokit.toml create mode 100644 tests_generated/test_use_python_black-False/.copier-answers.yml create mode 100644 tests_generated/test_use_python_black-False/.editorconfig create mode 100644 tests_generated/test_use_python_black-False/.env.localnet.template create mode 100644 tests_generated/test_use_python_black-False/.env.template create mode 100644 tests_generated/test_use_python_black-False/.env.testnet.template create mode 100644 tests_generated/test_use_python_black-False/.gitattributes create mode 100644 tests_generated/test_use_python_black-False/.gitignore create mode 100644 tests_generated/test_use_python_black-False/.vscode/extensions.json create mode 100644 tests_generated/test_use_python_black-False/.vscode/launch.json create mode 100644 tests_generated/test_use_python_black-False/.vscode/settings.json create mode 100644 tests_generated/test_use_python_black-False/.vscode/tasks.json create mode 100644 tests_generated/test_use_python_black-False/README.md create mode 100644 tests_generated/test_use_python_black-False/poetry.toml create mode 100644 tests_generated/test_use_python_black-False/pyproject.toml create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/README.md create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/config.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_python_black-False/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_python_black-False/tests/__init__.py create mode 100644 tests_generated/test_use_python_black-False/tests/conftest.py create mode 100644 tests_generated/test_use_python_black-False/tests/hello_world_test.py create mode 100644 tests_generated/test_use_python_black-True/.algokit.toml create mode 100644 tests_generated/test_use_python_black-True/.copier-answers.yml create mode 100644 tests_generated/test_use_python_black-True/.editorconfig create mode 100644 tests_generated/test_use_python_black-True/.env.localnet.template create mode 100644 tests_generated/test_use_python_black-True/.env.template create mode 100644 tests_generated/test_use_python_black-True/.env.testnet.template create mode 100644 tests_generated/test_use_python_black-True/.gitattributes create mode 100644 tests_generated/test_use_python_black-True/.gitignore create mode 100644 tests_generated/test_use_python_black-True/.vscode/extensions.json create mode 100644 tests_generated/test_use_python_black-True/.vscode/launch.json create mode 100644 tests_generated/test_use_python_black-True/.vscode/settings.json create mode 100644 tests_generated/test_use_python_black-True/.vscode/tasks.json create mode 100644 tests_generated/test_use_python_black-True/README.md create mode 100644 tests_generated/test_use_python_black-True/poetry.toml create mode 100644 tests_generated/test_use_python_black-True/pyproject.toml create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/README.md create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/config.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_python_black-True/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_python_black-True/tests/__init__.py create mode 100644 tests_generated/test_use_python_black-True/tests/conftest.py create mode 100644 tests_generated/test_use_python_black-True/tests/hello_world_test.py create mode 100644 tests_generated/test_use_python_mypy-False/.algokit.toml create mode 100644 tests_generated/test_use_python_mypy-False/.copier-answers.yml create mode 100644 tests_generated/test_use_python_mypy-False/.editorconfig create mode 100644 tests_generated/test_use_python_mypy-False/.env.localnet.template create mode 100644 tests_generated/test_use_python_mypy-False/.env.template create mode 100644 tests_generated/test_use_python_mypy-False/.env.testnet.template create mode 100644 tests_generated/test_use_python_mypy-False/.gitattributes create mode 100644 tests_generated/test_use_python_mypy-False/.gitignore create mode 100644 tests_generated/test_use_python_mypy-False/.vscode/extensions.json create mode 100644 tests_generated/test_use_python_mypy-False/.vscode/launch.json create mode 100644 tests_generated/test_use_python_mypy-False/.vscode/settings.json create mode 100644 tests_generated/test_use_python_mypy-False/.vscode/tasks.json create mode 100644 tests_generated/test_use_python_mypy-False/README.md create mode 100644 tests_generated/test_use_python_mypy-False/poetry.toml create mode 100644 tests_generated/test_use_python_mypy-False/pyproject.toml create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/README.md create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/config.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_python_mypy-False/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_python_mypy-False/tests/__init__.py create mode 100644 tests_generated/test_use_python_mypy-False/tests/conftest.py create mode 100644 tests_generated/test_use_python_mypy-False/tests/hello_world_test.py create mode 100644 tests_generated/test_use_python_mypy-True/.algokit.toml create mode 100644 tests_generated/test_use_python_mypy-True/.copier-answers.yml create mode 100644 tests_generated/test_use_python_mypy-True/.editorconfig create mode 100644 tests_generated/test_use_python_mypy-True/.env.localnet.template create mode 100644 tests_generated/test_use_python_mypy-True/.env.template create mode 100644 tests_generated/test_use_python_mypy-True/.env.testnet.template create mode 100644 tests_generated/test_use_python_mypy-True/.gitattributes create mode 100644 tests_generated/test_use_python_mypy-True/.gitignore create mode 100644 tests_generated/test_use_python_mypy-True/.vscode/extensions.json create mode 100644 tests_generated/test_use_python_mypy-True/.vscode/launch.json create mode 100644 tests_generated/test_use_python_mypy-True/.vscode/settings.json create mode 100644 tests_generated/test_use_python_mypy-True/.vscode/tasks.json create mode 100644 tests_generated/test_use_python_mypy-True/README.md create mode 100644 tests_generated/test_use_python_mypy-True/poetry.toml create mode 100644 tests_generated/test_use_python_mypy-True/pyproject.toml create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/README.md create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/config.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_python_mypy-True/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_python_mypy-True/tests/__init__.py create mode 100644 tests_generated/test_use_python_mypy-True/tests/conftest.py create mode 100644 tests_generated/test_use_python_mypy-True/tests/hello_world_test.py create mode 100644 tests_generated/test_use_python_pytest-False/.algokit.toml create mode 100644 tests_generated/test_use_python_pytest-False/.copier-answers.yml create mode 100644 tests_generated/test_use_python_pytest-False/.editorconfig create mode 100644 tests_generated/test_use_python_pytest-False/.env.localnet.template create mode 100644 tests_generated/test_use_python_pytest-False/.env.template create mode 100644 tests_generated/test_use_python_pytest-False/.env.testnet.template create mode 100644 tests_generated/test_use_python_pytest-False/.gitattributes create mode 100644 tests_generated/test_use_python_pytest-False/.gitignore create mode 100644 tests_generated/test_use_python_pytest-False/.vscode/extensions.json create mode 100644 tests_generated/test_use_python_pytest-False/.vscode/launch.json create mode 100644 tests_generated/test_use_python_pytest-False/.vscode/settings.json create mode 100644 tests_generated/test_use_python_pytest-False/.vscode/tasks.json create mode 100644 tests_generated/test_use_python_pytest-False/README.md create mode 100644 tests_generated/test_use_python_pytest-False/poetry.toml create mode 100644 tests_generated/test_use_python_pytest-False/pyproject.toml create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/README.md create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/config.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_python_pytest-False/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_python_pytest-True/.algokit.toml create mode 100644 tests_generated/test_use_python_pytest-True/.copier-answers.yml create mode 100644 tests_generated/test_use_python_pytest-True/.editorconfig create mode 100644 tests_generated/test_use_python_pytest-True/.env.localnet.template create mode 100644 tests_generated/test_use_python_pytest-True/.env.template create mode 100644 tests_generated/test_use_python_pytest-True/.env.testnet.template create mode 100644 tests_generated/test_use_python_pytest-True/.gitattributes create mode 100644 tests_generated/test_use_python_pytest-True/.gitignore create mode 100644 tests_generated/test_use_python_pytest-True/.vscode/extensions.json create mode 100644 tests_generated/test_use_python_pytest-True/.vscode/launch.json create mode 100644 tests_generated/test_use_python_pytest-True/.vscode/settings.json create mode 100644 tests_generated/test_use_python_pytest-True/.vscode/tasks.json create mode 100644 tests_generated/test_use_python_pytest-True/README.md create mode 100644 tests_generated/test_use_python_pytest-True/poetry.toml create mode 100644 tests_generated/test_use_python_pytest-True/pyproject.toml create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/README.md create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/__init__.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/__main__.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/config.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/hello_world/contract.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/hello_world/deploy_config.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/helpers/__init__.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/helpers/build.py create mode 100644 tests_generated/test_use_python_pytest-True/smart_contracts/helpers/deploy.py create mode 100644 tests_generated/test_use_python_pytest-True/tests/__init__.py create mode 100644 tests_generated/test_use_python_pytest-True/tests/conftest.py create mode 100644 tests_generated/test_use_python_pytest-True/tests/hello_world_test.py diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e2fda34 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root=true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true + +[*.py] +indent_size = 4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..fabab73 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,5 @@ +## Proposed Changes + +- +- +- diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml new file mode 100644 index 0000000..479d064 --- /dev/null +++ b/.github/workflows/cd.yaml @@ -0,0 +1,37 @@ +name: Continuous Delivery of Template + +on: + push: + branches: + - main + +concurrency: release + +jobs: + ci-check-python: + name: Check Python + uses: ./.github/workflows/check-python.yaml + + tag-release: + runs-on: "ubuntu-latest" + needs: ci-check-python + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Tag release + id: tag + uses: TriPSs/conventional-changelog-action@v3.18.0 + with: + skip-commit: "true" + tag-prefix: "" + skip-on-empty: "false" + + - name: Create Release + uses: softprops/action-gh-release@v1 + if: ${{ steps.tag.outputs.skipped == 'false' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.tag.outputs.tag }} + body: ${{ steps.tag.outputs.clean_changelog }} diff --git a/.github/workflows/check-python.yaml b/.github/workflows/check-python.yaml new file mode 100644 index 0000000..4958c23 --- /dev/null +++ b/.github/workflows/check-python.yaml @@ -0,0 +1,56 @@ +name: Check Template + +on: + workflow_call: + +jobs: + check-python: + runs-on: "ubuntu-latest" + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Install poetry + run: pipx install poetry + + - name: Install algokit + run: pipx install algokit + + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: "3.10" + cache: "poetry" + + - name: Install dependencies + run: poetry install --no-interaction --no-root + + - name: Check formatting with Black + run: | + # stop the build if there are files that don't meet formatting requirements + poetry run black --check . + + - name: Check linting with Ruff + run: | + # stop the build if there are Python syntax errors or undefined names + poetry run ruff . + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" + + - name: Run tests + shell: bash + run: | + set -o pipefail + poetry run pytest --junitxml=pytest-junit.xml -n auto + + - name: Check generated templates have been reviewed + shell: bash + run: | + # Add untracked files as empty so they come up in diff + git add -N ./tests_generated + # Look for changes in generated templates and error if there are any + git diff --exit-code --minimal ./tests_generated diff --git a/.github/workflows/issue_closed.yml b/.github/workflows/issue_closed.yml new file mode 100644 index 0000000..80399ea --- /dev/null +++ b/.github/workflows/issue_closed.yml @@ -0,0 +1,12 @@ +name: Solve zendesk ticket when the issue is closed +on: + issues: + types: [closed] +jobs: + issue_closed: + uses: algorandfoundation/gh_zendesk_sync/.github/workflows/github_zendesk_issue_closed.yml@main + with: + ZENDESK_TENANT_NAME: ${{ vars.ZENDESK_TENANT_NAME }} + ISSUE_LABEL: makerx + secrets: + ZENDESK_AUTH_TOKEN: ${{ secrets.ZENDESK_AUTH_TOKEN }} diff --git a/.github/workflows/issue_commented.yml b/.github/workflows/issue_commented.yml new file mode 100644 index 0000000..17c7c29 --- /dev/null +++ b/.github/workflows/issue_commented.yml @@ -0,0 +1,12 @@ +name: Add comment to zendesk ticket on GitHub issue commented +on: + issue_comment: + types: [created] +jobs: + issue_closed: + uses: algorandfoundation/gh_zendesk_sync/.github/workflows/github_zendesk_issue_commented.yml@main + with: + ZENDESK_TENANT_NAME: ${{ vars.ZENDESK_TENANT_NAME }} + ISSUE_LABEL: makerx + secrets: + ZENDESK_AUTH_TOKEN: ${{ secrets.ZENDESK_AUTH_TOKEN }} diff --git a/.github/workflows/issue_labelled.yml b/.github/workflows/issue_labelled.yml new file mode 100644 index 0000000..d8689d1 --- /dev/null +++ b/.github/workflows/issue_labelled.yml @@ -0,0 +1,12 @@ +name: Create Zendesk ticket when an issue is labelled with makerx +on: + issues: + types: [labeled] +jobs: + issue_created: + uses: algorandfoundation/gh_zendesk_sync/.github/workflows/github_zendesk_issue_labelled.yml@main + with: + ZENDESK_TENANT_NAME: ${{ vars.ZENDESK_TENANT_NAME }} + ISSUE_LABEL: makerx + secrets: + ZENDESK_AUTH_TOKEN: ${{ secrets.ZENDESK_AUTH_TOKEN }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 0000000..43f82d5 --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,8 @@ +name: Pull Request validation + +on: [pull_request] + +jobs: + pr-check: + name: Check Python + uses: ./.github/workflows/check-python.yaml diff --git a/.github/workflows/zendesk_github_add_comment.yml b/.github/workflows/zendesk_github_add_comment.yml new file mode 100644 index 0000000..07f0c1b --- /dev/null +++ b/.github/workflows/zendesk_github_add_comment.yml @@ -0,0 +1,11 @@ +name: Add comment to GitHub issue on Zendesk ticket commented +on: + repository_dispatch: + types: + - zendesk_github_add_comment +permissions: + issues: write +jobs: + add-comment: + name: Add comment to issue + uses: algorandfoundation/gh_zendesk_sync/.github/workflows/zendesk_github_add_comment.yml@main diff --git a/.github/workflows/zendesk_github_close_issue.yml b/.github/workflows/zendesk_github_close_issue.yml new file mode 100644 index 0000000..42d33d7 --- /dev/null +++ b/.github/workflows/zendesk_github_close_issue.yml @@ -0,0 +1,11 @@ +name: Close GitHub issue on Zendesk ticket solved +on: + repository_dispatch: + types: + - zendesk_github_close_issue +permissions: + issues: write +jobs: + close_issue: + name: Close GitHub issue + uses: algorandfoundation/gh_zendesk_sync/.github/workflows/zendesk_github_close_issue.yml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d33789 --- /dev/null +++ b/.gitignore @@ -0,0 +1,171 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5c55a8f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,32 @@ +repos: + - repo: local + hooks: + - id: black + name: black + description: "Black: The uncompromising Python code formatter" + entry: poetry run black + language: system + minimum_pre_commit_version: 2.9.2 + require_serial: true + types_or: [ python, pyi ] + - id: ruff + name: ruff + description: "Run 'ruff' for extremely fast Python linting" + entry: poetry run ruff + language: system + 'types': [python] + args: [--fix] + require_serial: false + additional_dependencies: [] + minimum_pre_commit_version: '0' + files: '^(src|tests)/' + - id: mypy + name: mypy + description: '`mypy` will check Python types for correctness' + entry: poetry run mypy + language: system + types_or: [ python, pyi ] + require_serial: true + additional_dependencies: [ ] + minimum_pre_commit_version: '2.9.2' + files: '^(src|tests)/' diff --git a/.vscode/clear.ps1 b/.vscode/clear.ps1 new file mode 100644 index 0000000..4c1c666 --- /dev/null +++ b/.vscode/clear.ps1 @@ -0,0 +1 @@ +Remove-Item -Recurse -Force test_output -ErrorAction Ignore \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..b30f405 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "wholroyd.jinja" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..05054ef --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "files.associations": { + "**/*.jinja": "jinja" + }, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "files.eol": "\n" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..a93c48c --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,94 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Run template using algokit (Python, no-prompts)", + "command": "algokit", + "args": [ + "-v", + "init", + "--name", + "test_output", + "--no-git", + "--defaults", + "--UNSAFE-SECURITY-accept-template-url", + "--template-url", + "${workspaceFolder}", + "--template-url-ref", + "HEAD", + "--no-bootstrap" + ], + "type": "shell", + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOn": ["Delete test_output folder"], + "problemMatcher": [] + }, + { + "label": "Run template using algokit (TypeScript, no-prompts)", + "command": "algokit", + "args": [ + "-v", + "init", + "--name", + "test_output", + "--no-git", + "--defaults", + "--UNSAFE-SECURITY-accept-template-url", + "--template-url", + "${workspaceFolder}", + "--template-url-ref", + "HEAD", + "--no-bootstrap", + "-a", + "deployment_language", + "typescript" + ], + "type": "shell", + "group": { + "kind": "build", + "isDefault": true + }, + "dependsOn": ["Delete test_output folder"], + "problemMatcher": [] + }, + { + "label": "Run template using algokit (template prompts)", + "command": "algokit", + "args": [ + "-v", + "init", + "--name", + "test_output", + "--no-git", + "--UNSAFE-SECURITY-accept-template-url", + "--template-url", + "${workspaceFolder}", + "--template-url-ref", + "HEAD", + "--no-bootstrap" + ], + "type": "shell", + "dependsOn": ["Delete test_output folder"], + "problemMatcher": [] + }, + { + "label": "Delete test_output folder", + "command": "rm", + "args": [ + "-rf", + "test_output" + ], + "type": "shell", + "windows": { + "command": "./.vscode/clear.ps1" + }, + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..808c449 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +
+ +
+ +

+ + + + +

+ +--- + +This template provides a production-ready baseline for developing and deploying [Beaker](https://github.com/algorand-devrel/beaker) smart contracts. + +To use it [install AlgoKit](https://github.com/algorandfoundation/algokit-cli#readme) and then either pass in `-t beaker_production` to `algokit init` or select the `beaker_production` template. + +This is one of the official templates used by AlgoKit to initialize an Algorand smart contract project. It's a [Copier template](https://copier.readthedocs.io/en/stable/). + +## Features + +This template supports the following features: + +- Compilation of [multiple Beaker contracts](template_content/smart_contracts/config.py) to a [predictable folder location and file layout](template_content/smart_contracts/__main__.py) where they can be deployed +- Deploy-time immutability and permanence control +- [Poetry](https://python-poetry.org/) for Python dependency management and virtual environment management +- Linting via [Ruff](https://github.com/charliermarsh/ruff) or [Flake8](https://flake8.pycqa.org/en/latest/) +- Formatting via [Black](https://github.com/psf/black) +- Type checking via [mypy](https://mypy-lang.org/) +- Testing via pytest (not yet used) +- Dependency vulnerability scanning via pip-audit (not yet used) +- VS Code configuration (linting, formatting, breakpoint debugging) +- dotenv (.env) file for configuration +- Automated testing of the compiled smart contracts +- [Output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests of the TEAL output +- CI/CD pipeline using GitHub Actions: +- - Optionally pick deployments to Netlify or Vercel + +# Getting started + +Once the template is instantiated you can follow the [README.md](template_content/README.md.jinja) file to see instructions for how to use the template. diff --git a/copier.yaml b/copier.yaml new file mode 100644 index 0000000..2ccf085 --- /dev/null +++ b/copier.yaml @@ -0,0 +1,158 @@ +_subdirectory: template_content +_templates_suffix: ".jinja" + +# questions +# project_name should never get prompted, AlgoKit should always pass it by convention +project_name: + type: str + help: Name for this project. + placeholder: "algorand-app" + +preset_name: + type: str + help: Name of the preset to use. Starter is optimal for simpler projects, Production is optimal for more complex projects that require CI/CD and other features. + choices: + Starter: "starter" + Production: "production" + default: "starter" + +contract_name: + type: str + help: Name of the default smart contract app. + placeholder: "hello_world" + default: "hello_world" + validator: >- + {% if not (contract_name | regex_search('^[a-z]+(?:_[a-z]+)*$')) %} + contract_name must be formatted in snake case. + {% endif %} + +author_name: + type: str + help: Package author name + placeholder: "Your Name" + +author_email: + type: str + help: Package author email + placeholder: "your@email.tld" + +ide_vscode: + type: bool + help: Do you want to add VSCode configuration? + default: yes + +ide_jetbrains: + type: bool + help: Do you want to add JetBrains configuration (primarily optimized for PyCharm CE)? + when: "{{ ide_vscode == false }}" + default: no + +deployment_language: + type: str + help: What programming language do you want to use for your contract deployment code? + choices: + Python: "python" + TypeScript: "typescript" + default: "python" + +python_linter: + type: str + help: Do you want to use a Python linter? + when: "{{ preset_name == 'production' }}" + choices: + Ruff: "ruff" + Flake8: "flake8" + No thanks: "none" + default: |- + {% if preset_name == 'production' -%} + ruff + {%- else -%} + none + {%- endif %} + +use_python_black: + type: bool + help: Do you want to use a Python formatter (via Black)? + default: yes + +use_python_mypy: + type: bool + when: "{{ preset_name == 'production' }}" + help: Do you want to use a Python type checker (via mypy)? + default: |- + {% if preset_name == 'production' -%} + yes + {%- else -%} + no + {%- endif %} + +use_python_pytest: + type: bool + help: Do you want to include unit tests (via pytest)? + default: yes + +use_python_pip_audit: + type: bool + when: "{{ preset_name == 'production' }}" + help: Do you want to include Python dependency vulnerability scanning (via pip-audit)? + default: yes + +use_github_actions: + type: bool + when: "{{ preset_name == 'production' }}" + help: Do you want to include Github Actions workflows for build and testnet deployment? + default: |- + {% if preset_name == 'production' -%} + yes + {%- else -%} + no + {%- endif %} + +use_pre_commit: + type: bool + when: "{{ preset_name == 'production' }}" + help: Do you want to include pre-commit for linting, type checking and formatting? + default: |- + {% if preset_name == 'production' -%} + yes + {%- else -%} + no + {%- endif %} + +use_dispenser: + type: bool + when: "{{ preset_name == 'production' }}" + help: Do you want to fund your deployment account using an optional dispenser account? + default: no + +# The following should never get prompted; algokit should always pass these values through by convention + +algod_token: + type: str + help: Default Algod Token + default: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + +algod_server: + type: str + help: Default Algod server + default: "http://localhost" + +algod_port: + type: int + help: Default Algod port + default: 4001 + +indexer_token: + type: str + help: Default Indexer token + default: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + +indexer_server: + type: str + help: Default Indexer server + default: "http://localhost" + +indexer_port: + type: int + help: Default Indexer port + default: 8980 diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..93ce6ef --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1387 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "algokit-utils" +version = "1.3.0" +description = "Utilities for Algorand development for use by AlgoKit" +optional = false +python-versions = ">=3.10,<4.0" +files = [ + {file = "algokit_utils-1.3.0-py3-none-any.whl", hash = "sha256:7167daa4412b74fe23ec4000193f32f1553e149786e8db7f0a8ca9f47ba37536"}, +] + +[package.dependencies] +py-algorand-sdk = ">=2.2.0,<3.0.0" + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "beaker-pyteal" +version = "1.0.1" +description = "A Framework for building PyTeal Applications" +optional = false +python-versions = ">=3.10,<4.0" +files = [ + {file = "beaker_pyteal-1.0.1-py3-none-any.whl", hash = "sha256:e10122de9761cf033ea2de557ef381f4cd4a83c80e3c38aeca32bac250da4c9c"}, +] + +[package.dependencies] +algokit-utils = ">=1.0.2,<2.0.0" +py-algorand-sdk = ">=2.0.0" +pyteal = ">=0.24,<0.25" + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +aiohttp = {version = ">=3.7.4", optional = true, markers = "extra == \"d\""} +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {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"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "docstring-parser" +version = "0.14.1" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "docstring_parser-0.14.1-py3-none-any.whl", hash = "sha256:14ac6ec1f1ba6905c4d8cb90fd0bc55394f5678183752c90e44812bf28d7a515"}, + {file = "docstring_parser-0.14.1.tar.gz", hash = "sha256:2c77522e31b7c88b1ab457a1f3c9ae38947ad719732260ba77ee8a3deb58622a"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "execnet" +version = "2.0.2" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.7" +files = [ + {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, + {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, +] + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.12.2" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "flake8" +version = "6.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, + {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.10.0,<2.11.0" +pyflakes = ">=3.0.0,<3.1.0" + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[package]] +name = "identify" +version = "2.5.24" +description = "File identification library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, + {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "msgpack" +version = "1.0.5" +description = "MessagePack serializer" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, + {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, + {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, + {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, + {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, + {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, + {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, + {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, + {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, + {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, + {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, + {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, + {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, + {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, + {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, + {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "1.4.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3af348e0925a59213244f28c7c0c3a2c2088b4ba2fe9d6c8d4fbb0aba0b7d05"}, + {file = "mypy-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0b2e0da7ff9dd8d2066d093d35a169305fc4e38db378281fce096768a3dbdbf"}, + {file = "mypy-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210fe0f39ec5be45dd9d0de253cb79245f0a6f27631d62e0c9c7988be7152965"}, + {file = "mypy-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f7a5971490fd4a5a436e143105a1f78fa8b3fe95b30fff2a77542b4f3227a01f"}, + {file = "mypy-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:50f65f0e9985f1e50040e603baebab83efed9eb37e15a22a4246fa7cd660f981"}, + {file = "mypy-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1b5c875fcf3e7217a3de7f708166f641ca154b589664c44a6fd6d9f17d9e7e"}, + {file = "mypy-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4c734d947e761c7ceb1f09a98359dd5666460acbc39f7d0a6b6beec373c5840"}, + {file = "mypy-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5984a8d13d35624e3b235a793c814433d810acba9eeefe665cdfed3d08bc3af"}, + {file = "mypy-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0f98973e39e4a98709546a9afd82e1ffcc50c6ec9ce6f7870f33ebbf0bd4f26d"}, + {file = "mypy-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:19d42b08c7532d736a7e0fb29525855e355fa51fd6aef4f9bbc80749ff64b1a2"}, + {file = "mypy-1.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ba9a69172abaa73910643744d3848877d6aac4a20c41742027dcfd8d78f05d9"}, + {file = "mypy-1.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34eed094c16cad0f6b0d889811592c7a9b7acf10d10a7356349e325d8704b4f"}, + {file = "mypy-1.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:53c2a1fed81e05ded10a4557fe12bae05b9ecf9153f162c662a71d924d504135"}, + {file = "mypy-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bba57b4d2328740749f676807fcf3036e9de723530781405cc5a5e41fc6e20de"}, + {file = "mypy-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:653863c75f0dbb687d92eb0d4bd9fe7047d096987ecac93bb7b1bc336de48ebd"}, + {file = "mypy-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7461469e163f87a087a5e7aa224102a30f037c11a096a0ceeb721cb0dce274c8"}, + {file = "mypy-1.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cf0ca95e4b8adeaf07815a78b4096b65adf64ea7871b39a2116c19497fcd0dd"}, + {file = "mypy-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94a81b9354545123feb1a99b960faeff9e1fa204fce47e0042335b473d71530d"}, + {file = "mypy-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:67242d5b28ed0fa88edd8f880aed24da481929467fdbca6487167cb5e3fd31ff"}, + {file = "mypy-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f2b353eebef669529d9bd5ae3566905a685ae98b3af3aad7476d0d519714758"}, + {file = "mypy-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62bf18d97c6b089f77f0067b4e321db089d8520cdeefc6ae3ec0f873621c22e5"}, + {file = "mypy-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca33ab70a4aaa75bb01086a0b04f0ba8441e51e06fc57e28585176b08cad533b"}, + {file = "mypy-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a0ee54c2cb0f957f8a6f41794d68f1a7e32b9968675ade5846f538504856d42"}, + {file = "mypy-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6c34d43e3d54ad05024576aef28081d9d0580f6fa7f131255f54020eb12f5352"}, + {file = "mypy-1.4.0-py3-none-any.whl", hash = "sha256:f051ca656be0c179c735a4c3193f307d34c92fdc4908d44fd4516fbe8b10567d"}, + {file = "mypy-1.4.0.tar.gz", hash = "sha256:de1e7e68148a213036276d1f5303b3836ad9a774188961eb2684eddff593b042"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "platformdirs" +version = "3.6.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.6.0-py3-none-any.whl", hash = "sha256:ffa199e3fbab8365778c4a10e1fbf1b9cd50707de826eb304b50e57ec0cc8d38"}, + {file = "platformdirs-3.6.0.tar.gz", hash = "sha256:57e28820ca8094678b807ff529196506d7a21e17156cb1cddb3e74cebce54640"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.3.3" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, + {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "py-algorand-sdk" +version = "2.3.0" +description = "Algorand SDK in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "py-algorand-sdk-2.3.0.tar.gz", hash = "sha256:6ccd9777007b3462f44fface7a7d040b6e21e03cede9319b0242d5498499889d"}, + {file = "py_algorand_sdk-2.3.0-py3-none-any.whl", hash = "sha256:a4e0e55a488daed6262c78b5358eb90bfd465758ee345e816bb603460341d816"}, +] + +[package.dependencies] +msgpack = ">=1.0.0,<2" +pycryptodomex = ">=3.6.0,<4" +pynacl = ">=1.4.0,<2" + +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pycryptodomex" +version = "3.18.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pyflakes" +version = "3.0.1" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, + {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, +] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pyteal" +version = "0.24.1" +description = "Algorand Smart Contracts in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "pyteal-0.24.1-py3-none-any.whl", hash = "sha256:19c601f0ea4d1a0be41a3fe48cd3807558a0e907cd47d0dca5df60977d78f2c4"}, + {file = "pyteal-0.24.1.tar.gz", hash = "sha256:172d796981f8f9d3a9a8fbe71a71a49cf185509780f46d82e29aaa692386d1fa"}, +] + +[package.dependencies] +docstring-parser = "0.14.1" +executing = "1.2.0" +py-algorand-sdk = ">=2.0.0,<3.0.0" +semantic-version = ">=2.9.0,<3.0.0" +tabulate = ">=0.9.0,<0.10.0" + +[[package]] +name = "pytest" +version = "7.3.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, + {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-xdist" +version = "3.3.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-xdist-3.3.1.tar.gz", hash = "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93"}, + {file = "pytest_xdist-3.3.1-py3-none-any.whl", hash = "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"}, +] + +[package.dependencies] +execnet = ">=1.1" +pytest = ">=6.2.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "ruff" +version = "0.1.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:88b8cdf6abf98130991cbc9f6438f35f6e8d41a02622cc5ee130a02a0ed28703"}, + {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c549ed437680b6105a1299d2cd30e4964211606eeb48a0ff7a93ef70b902248"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cf5f701062e294f2167e66d11b092bba7af6a057668ed618a9253e1e90cfd76"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:05991ee20d4ac4bb78385360c684e4b417edd971030ab12a4fbd075ff535050e"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87455a0c1f739b3c069e2f4c43b66479a54dea0276dd5d4d67b091265f6fd1dc"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:683aa5bdda5a48cb8266fcde8eea2a6af4e5700a392c56ea5fb5f0d4bfdc0240"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:137852105586dcbf80c1717facb6781555c4e99f520c9c827bd414fac67ddfb6"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd98138a98d48a1c36c394fd6b84cd943ac92a08278aa8ac8c0fdefcf7138f35"}, + {file = "ruff-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0cd909d25f227ac5c36d4e7e681577275fb74ba3b11d288aff7ec47e3ae745"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8fd1c62a47aa88a02707b5dd20c5ff20d035d634aa74826b42a1da77861b5ff"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd89b45d374935829134a082617954120d7a1470a9f0ec0e7f3ead983edc48cc"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:491262006e92f825b145cd1e52948073c56560243b55fb3b4ecb142f6f0e9543"}, + {file = "ruff-0.1.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ea284789861b8b5ca9d5443591a92a397ac183d4351882ab52f6296b4fdd5462"}, + {file = "ruff-0.1.6-py3-none-win32.whl", hash = "sha256:1610e14750826dfc207ccbcdd7331b6bd285607d4181df9c1c6ae26646d6848a"}, + {file = "ruff-0.1.6-py3-none-win_amd64.whl", hash = "sha256:4558b3e178145491e9bc3b2ee3c4b42f19d19384eaa5c59d10acf6e8f8b57e33"}, + {file = "ruff-0.1.6-py3-none-win_arm64.whl", hash = "sha256:03910e81df0d8db0e30050725a5802441c2022ea3ae4fe0609b76081731accbc"}, + {file = "ruff-0.1.6.tar.gz", hash = "sha256:1b09f29b16c6ead5ea6b097ef2764b42372aebe363722f1605ecbcd2b9207184"}, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +description = "A library implementing the 'SemVer' scheme." +optional = false +python-versions = ">=2.7" +files = [ + {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, + {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, +] + +[package.extras] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.10" +description = "Typing stubs for PyYAML" +optional = false +python-versions = "*" +files = [ + {file = "types-PyYAML-6.0.12.10.tar.gz", hash = "sha256:ebab3d0700b946553724ae6ca636ea932c1b0868701d4af121630e78d695fc97"}, + {file = "types_PyYAML-6.0.12.10-py3-none-any.whl", hash = "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.6.3" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, +] + +[[package]] +name = "virtualenv" +version = "20.23.1" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, + {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.12,<4" +platformdirs = ">=3.5.1,<4" + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "a1be7e90d0aa7be5d883b5f4f298f12b7b4d98b2bd136f09f449b522347cc385" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000..ab1033b --- /dev/null +++ b/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..4ac1b7e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,66 @@ +[tool.poetry] +name = "copier-testing-template" +version = "0.1.0" +description = "" +authors = ["MakerX "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +beaker-pyteal = "^1.0.0" +algokit-utils = "^1.3" +python-dotenv = "^1.0.0" + +[tool.poetry.group.dev.dependencies] +ruff = "^0.1.6" +black = {extras = ["d"], version = "^22.10.0"} +flake8 = "^6.0.0" +pytest = "^7.2.2" +mypy = "^1.1.1" +pre-commit = "^3.2.1" +types-pyyaml = "^6.0.12.9" +pytest-xdist = "^3.3.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.ruff] +select = ["E", "F", "ANN", "UP", "N", "C4", "B", "A", "YTT", "W", "FBT", "Q", "RUF", "I"] +extend-exclude = [ + "tests_generated/*", # Ignoring generated tests, ruff specific errors are to be caught by pytest + "template_content", + ".git", + ".mypy_cache", + ".ruff_cache", + ] +ignore = [ + "ANN101", # no type for self + "ANN102", # no type for cls + "RET505", # allow else after return + "SIM108", # allow if-else in place of ternary + "E111", # indentation is not a multiple of four + "E117", # over-indented + "ISC001", # single line implicit string concatenation + "ISC002", # multi line implicit string concatenation + "Q000", # bad quotes inline string + "Q001", # bad quotes multiline string + "Q002", # bad quotes docstring + "Q003", # avoidable escaped quotes + "W191", # indentation contains tabs +] +unfixable = ["B", "RUF"] + +[tool.pytest.ini_options] +pythonpath = ["tests"] +testpaths = [ + "tests", +] + +[tool.mypy] +python_version = "3.10" +check_untyped_defs = true +warn_redundant_casts = true +warn_unused_ignores = true +allow_untyped_defs = false +strict_equality = true diff --git a/template_content/.algokit.toml.jinja b/template_content/.algokit.toml.jinja new file mode 100644 index 0000000..786275c --- /dev/null +++ b/template_content/.algokit.toml.jinja @@ -0,0 +1,22 @@ +[algokit] +min_version = "v1.7.3" + +[deploy] +{%- if deployment_language == 'python' %} +command = "poetry run python -m smart_contracts deploy" +{%- elif deployment_language == 'typescript' %} +command = "npm run deploy:ci" +{%- endif %} +environment_secrets = [ + "DEPLOYER_MNEMONIC", +{%- if use_dispenser %} + "DISPENSER_MNEMONIC", +{%- endif %} +] + +[deploy.localnet] +environment_secrets = [] + +[generate.smart_contract] +description = "Adds new smart contract to existing project" +path = ".algokit/generators/create_contract" diff --git a/template_content/.algokit/generators/create_contract/copier.yaml b/template_content/.algokit/generators/create_contract/copier.yaml new file mode 100644 index 0000000..73805de --- /dev/null +++ b/template_content/.algokit/generators/create_contract/copier.yaml @@ -0,0 +1,10 @@ +_tasks: + - "echo '==== Successfully initialized new smart contract 🚀 ===='" + +contract_name: + type: str + help: Name of your new contract. + placeholder: "my-new-contract" + default: "my-new-contract" + +_templates_suffix: ".j2" diff --git a/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/contract.py.j2 b/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/contract.py.j2 new file mode 100644 index 0000000..01e5881 --- /dev/null +++ b/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/contract.py.j2 @@ -0,0 +1,30 @@ +import beaker +import pyteal as pt +{% if preset_name == 'starter' %} + +app = beaker.Application("{{ contract_name }}") +{% elif preset_name == 'production' -%} +from algokit_utils import DELETABLE_TEMPLATE_NAME, UPDATABLE_TEMPLATE_NAME + +app = beaker.Application("{{ contract_name }}") + + +@app.update(authorize=beaker.Authorize.only_creator(), bare=True) +def update() -> pt.Expr: + return pt.Assert( + pt.Tmpl.Int(UPDATABLE_TEMPLATE_NAME), + comment="Check app is updatable", + ) + + +@app.delete(authorize=beaker.Authorize.only_creator(), bare=True) +def delete() -> pt.Expr: + return pt.Assert( + pt.Tmpl.Int(DELETABLE_TEMPLATE_NAME), + comment="Check app is deletable", + ) +{% endif %} + +@app.external +def hello(name: pt.abi.String, *, output: pt.abi.String) -> pt.Expr: + return output.set(pt.Concat(pt.Bytes("Hello, "), name.get())) diff --git a/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'python' %}deploy_config.py.j2{% endif %}.jinja b/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'python' %}deploy_config.py.j2{% endif %}.jinja new file mode 100644 index 0000000..c86ec1f --- /dev/null +++ b/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'python' %}deploy_config.py.j2{% endif %}.jinja @@ -0,0 +1,56 @@ +{% raw -%} +import logging + +import algokit_utils +from algosdk.v2client.algod import AlgodClient +from algosdk.v2client.indexer import IndexerClient + +logger = logging.getLogger(__name__) + + +# define deployment behaviour based on supplied app spec +def deploy( + algod_client: AlgodClient, + indexer_client: IndexerClient, + app_spec: algokit_utils.ApplicationSpecification, + deployer: algokit_utils.Account, +) -> None: + from smart_contracts.artifacts.{{ contract_name }}.client import ( + {{ contract_name.split('_')|map('capitalize')|join }}Client, + ) + + app_client = {{ contract_name.split('_')|map('capitalize')|join }}Client( + algod_client, + creator=deployer, + indexer_client=indexer_client, + ) + + + {%- if preset_name == 'starter' %} + app_client.deploy( + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + on_update=algokit_utils.OnUpdate.AppendApp, + ) + {%- elif preset_name == 'production' %} + is_mainnet = algokit_utils.is_mainnet(algod_client) + app_client.deploy( + on_schema_break=( + algokit_utils.OnSchemaBreak.AppendApp + if is_mainnet + else algokit_utils.OnSchemaBreak.ReplaceApp + ), + on_update=algokit_utils.OnUpdate.AppendApp + if is_mainnet + else algokit_utils.OnUpdate.UpdateApp, + allow_delete=not is_mainnet, + allow_update=not is_mainnet, + ) + {%- endif %} + + name = "world" + response = app_client.hello(name=name) + logger.info( + f"Called hello on {app_spec.contract.name} ({app_client.app_id}) " + f"with name={name}, received: {response.return_value}" + ) +{% endraw -%} diff --git a/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'typescript' %}deploy-config.ts.j2{% endif %}.jinja b/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'typescript' %}deploy-config.ts.j2{% endif %}.jinja new file mode 100644 index 0000000..dddaad1 --- /dev/null +++ b/template_content/.algokit/generators/create_contract/smart_contracts/{% raw %}{{ contract_name }}{% endraw %}/{% if deployment_language == 'typescript' %}deploy-config.ts.j2{% endif %}.jinja @@ -0,0 +1,61 @@ +{% raw -%} +import * as algokit from '@algorandfoundation/algokit-utils' +import { {{ contract_name.split('_')|map('capitalize')|join }}Client } from '../artifacts/{{ contract_name }}/client' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') + + const algod = algokit.getAlgoClient() + const indexer = algokit.getAlgoIndexerClient() + const deployer = await algokit.mnemonicAccountFromEnvironment({ name: 'DEPLOYER', fundWith: algokit.algos(3) }, algod) + await algokit.ensureFunded( + { + accountToFund: deployer, + minSpendingBalance: algokit.algos(2), + minFundingIncrement: algokit.algos(2), + }, + algod, + ) + const appClient = new {{ contract_name.split('_')|map('capitalize')|join }}Client( + { + resolveBy: 'creatorAndName', + findExistingUsing: indexer, + sender: deployer, + creatorAddress: deployer.addr, + }, + algod, + ) + + {%- if preset_name == 'starter' %} + const app = await appClient.deploy({ + onSchemaBreak: 'append', + onUpdate: 'append', + }) + {% elif preset_name == 'production' %} + const isMainNet = await algokit.isMainNet(algod) + const app = await appClient.deploy({ + allowDelete: !isMainNet, + allowUpdate: !isMainNet, + onSchemaBreak: isMainNet ? 'append' : 'replace', + onUpdate: isMainNet ? 'append' : 'update', + }) + {% endif %} + + // If app was just created fund the app account + if (['create', 'replace'].includes(app.operationPerformed)) { + algokit.transferAlgos( + { + amount: algokit.algos(1), + from: deployer, + to: app.appAddress, + }, + algod, + ) + } + + const method = 'hello' + const response = await appClient.hello({ name: 'world' }) + console.log(`Called ${method} on ${app.name} (${app.appId}) with name = world, received: ${response.return}`) +} +{% endraw -%} diff --git a/template_content/.editorconfig b/template_content/.editorconfig new file mode 100644 index 0000000..e2fda34 --- /dev/null +++ b/template_content/.editorconfig @@ -0,0 +1,10 @@ +root=true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true + +[*.py] +indent_size = 4 diff --git a/template_content/.env.localnet.template.jinja b/template_content/.env.localnet.template.jinja new file mode 100644 index 0000000..6143299 --- /dev/null +++ b/template_content/.env.localnet.template.jinja @@ -0,0 +1,7 @@ +# this file should contain environment variables specific to algokit localnet +ALGOD_TOKEN={{ algod_token }} +ALGOD_SERVER={{ algod_server }} +ALGOD_PORT={{ algod_port }} +INDEXER_TOKEN={{ indexer_token }} +INDEXER_SERVER={{ indexer_server }} +INDEXER_PORT={{ indexer_port }} diff --git a/template_content/.env.template b/template_content/.env.template new file mode 100644 index 0000000..184b393 --- /dev/null +++ b/template_content/.env.template @@ -0,0 +1 @@ +# this file should contain environment variables common to all environments/networks diff --git a/template_content/.env.testnet.template b/template_content/.env.testnet.template new file mode 100644 index 0000000..eeea43d --- /dev/null +++ b/template_content/.env.testnet.template @@ -0,0 +1,3 @@ +# this file contains algorand network settings for interacting with testnet via algonode +ALGOD_SERVER=https://testnet-api.algonode.cloud +INDEXER_SERVER=https://testnet-idx.algonode.cloud diff --git a/template_content/.gitattributes b/template_content/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/template_content/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/template_content/.gitignore.jinja b/template_content/.gitignore.jinja new file mode 100644 index 0000000..832924c --- /dev/null +++ b/template_content/.gitignore.jinja @@ -0,0 +1,174 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +.env.* +!.env.*.template +!.env.template +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Ruff (linter) +.ruff_cache/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +.idea +!.idea/ +.idea/* +!.idea/runConfigurations/ + +# macOS +.DS_Store + +# Received approval test files +*.received.* + +# NPM +node_modules diff --git a/template_content/README.md.jinja b/template_content/README.md.jinja new file mode 100644 index 0000000..06106cf --- /dev/null +++ b/template_content/README.md.jinja @@ -0,0 +1,147 @@ +# {{ project_name }} + +This project has been generated using AlgoKit. See below for default getting started instructions. + +# Setup + +### Initial setup + +1. Clone this repository locally +2. Install pre-requisites: + - Make sure to have [Docker](https://www.docker.com/) installed and running on your machine. + - Install `AlgoKit` - [Link](https://github.com/algorandfoundation/algokit-cli#install): The minimum required version is `1.1`. Ensure you can execute `algokit --version` and get `1.1` or later. + - Bootstrap your local environment; run `algokit bootstrap all` within this folder, which will: + - Install `Poetry` - [Link](https://python-poetry.org/docs/#installation): The minimum required version is `1.2`. Ensure you can execute `poetry -V` and get `1.2`+ + - Run `poetry install` in the root directory, which will set up a `.venv` folder with a Python virtual environment and also install all Python dependencies + - Copy `.env.template` to `.env` + - Run `algokit localnet start` to start a local Algorand network in Docker. If you are using VS Code launch configurations provided by the template, this will be done automatically for you. +{%- if deployment_language == "typescript" %} + - Run `npm install` to install NPM packages +{%- endif %} +3. Open the project and start debugging / developing via: + - VS Code + 1. Open the repository root in VS Code + 2. Install recommended extensions + 3. Hit F5 (or whatever you have debug mapped to) and it should start running with breakpoint debugging. + > **Note** + > If using Windows: Before running for the first time you will need to select the Python Interpreter. + 1. Open the command palette (Ctrl/Cmd + Shift + P) + 2. Search for `Python: Select Interpreter` + 3. Select `./.venv/Scripts/python.exe` + - JetBrains IDEs (please note, this setup is primarily optimized for PyCharm Community Edition) + 1. Open the repository root in the IDE + 2. It should automatically detect it's a Poetry project and set up a Python interpreter and virtual environment. + 3. Hit Shift+F10|Ctrl+R (or whatever you have debug mapped to) and it should start running with breakpoint debugging. Please note, JetBrains IDEs on Windows have a known bug that in some cases may prevent executing shell scripts as pre-launch tasks, for workarounds refer to [JetBrains forums](https://youtrack.jetbrains.com/issue/IDEA-277486/Shell-script-configuration-cannot-run-as-before-launch-task). + - Other + 1. Open the repository root in your text editor of choice + 2. In a terminal run `poetry shell` + 3. Run `python -m smart_contracts` through your debugger of choice + +### Subsequently + +1. If you update to the latest source code and there are new dependencies you will need to run `algokit bootstrap all` again +2. Follow step 3 above + +> For guidance on `smart_contracts` folder and adding new contracts to the project please see [README](smart_contracts/README.md) on the respective folder. + +{%- if use_github_actions -%} +### Continuous Integration / Continuous Deployment (CI/CD) + +This project uses [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) to define CI/CD workflows, which are located in the [`.github/workflows`](./.github/workflows) folder. + +#### Setting up GitHub for CI/CD workflow and TestNet deployment + + 1. Every time you have a change to your smart contract, and when you first initialize the project you need to [build the contract](#initial-setup) and then commit the `smart_contracts/artifacts` folder so the [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) tests pass +{%- if deployment_language == 'python' %} + 2. Decide what values you want to use for the `allow_update`, `allow_delete` and the `on_schema_break`, `on_update` parameters specified in [`contract.py`](./smart_contracts/{{ contract_name }}/contract.py). + When deploying to LocalNet these values are both set to allow update and replacement of the app for convenience. But for non-LocalNet networks + the defaults are more conservative. +{%- elif deployment_language == 'typescript' %} + 2. Decide what values you want to use for the `allowUpdate` and `allowDelete` parameters specified in [`deploy-config.ts`](./smart_contracts/{{ contract_name }}/deploy-config.ts). + When deploying to LocalNet these values are both set to `true` for convenience. But for non-LocalNet networks + they are more conservative and use `false` +{%- endif %} + These default values will allow the smart contract to be deployed initially, but will not allow the app to be updated or deleted if is changed and the build will instead fail. + To help you decide it may be helpful to read the [AlgoKit Utils app deployment documentation](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/docs/capabilities/app-deploy.md) or the [AlgoKit smart contract deployment architecture](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md#upgradeable-and-deletable-contracts). + 3. Create a [Github Environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#creating-an-environment) named `Test`. + Note: If you have a private repository and don't have GitHub Enterprise then Environments won't work and you'll need to convert the GitHub Action to use a different approach. Ignore this step if you picked `Starter` preset. + 4. Create or obtain a mnemonic for an Algorand account for use on TestNet to deploy apps, referred to as the `DEPLOYER` account. + 5. Store the mnemonic as a [secret](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) `DEPLOYER_MNEMONIC` + in the Test environment created in step 3. + 6. The account used to deploy the smart contract will require enough funds to create the app, and also fund it. There are two approaches available here: + * Either, ensure the account is funded outside of CI/CD. + In Testnet, funds can be obtained by using the [Algorand TestNet dispenser](https://bank.testnet.algorand.network/) and we recommend provisioning 50 ALGOs. + * Or, fund the account as part of the CI/CD process by using a `DISPENSER_MNEMONIC` GitHub Environment secret to point to a separate `DISPENSER` account that you maintain ALGOs in (similarly, you need to provision ALGOs into this account using the [TestNet dispenser](https://bank.testnet.algorand.network/)). + +#### Continuous Integration + +For pull requests and pushes to `main` branch against this repository the following checks are automatically performed by GitHub Actions: +{%- if use_python_pip_audit %} + - Python dependencies are audited using [pip-audit](https://pypi.org/project/pip-audit/) +{%- endif %} +{%- if use_python_black %} + - Code formatting is checked using [Black](https://github.com/psf/black) +{%- endif %} +{%- if python_linter == 'ruff' %} + - Linting is checked using [Ruff](https://github.com/charliermarsh/ruff) +{%- elif python_linter == 'flake8' %} + - Linting is checked using [Flake8](https://flake8.pycqa.org/en/latest/) +{%- endif %} +{%- if use_python_mypy %} + - Types are checked using [mypy](https://mypy-lang.org/) +{%- endif %} +{%- if use_python_pytest %} + - Python tests are executed using [pytest](https://docs.pytest.org/) +{%- endif %} + - Smart contract artifacts are built + - Smart contract artifacts are checked for [output stability](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/articles/output_stability.md) + - Smart contract is deployed to a AlgoKit LocalNet instance + +#### Continuous Deployment + +For pushes to `main` branch, after the above checks pass, the following deployment actions are performed: + - The smart contract(s) are deployed to TestNet using [AlgoNode](https://algonode.io). + +> Please note deployment is also performed via `algokit deploy` command which can be invoked both via CI as seen on this project, or locally. For more information on how to use `algokit deploy` please see [AlgoKit documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/deploy.md). + +{%- endif %} + +# Tools + +This project makes use of Python to build Algorand smart contracts. The following tools are in use: + +- [Algorand](https://www.algorand.com/) - Layer 1 Blockchain; [Developer portal](https://developer.algorand.org/), [Why Algorand?](https://developer.algorand.org/docs/get-started/basics/why_algorand/) +- [AlgoKit](https://github.com/algorandfoundation/algokit-cli) - One-stop shop tool for developers building on the Algorand network; [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md), [intro tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) +- [Beaker](https://github.com/algorand-devrel/beaker) - Smart contract development framework for PyTeal; [docs](https://beaker.algo.xyz), [examples](https://github.com/algorand-devrel/beaker/tree/master/examples) +- [PyTEAL](https://github.com/algorand/pyteal) - Python language binding for Algorand smart contracts; [docs](https://pyteal.readthedocs.io/en/stable/) +- [AlgoKit Utils]({% if deployment_language == "typescript" %}https://github.com/algorandfoundation/algokit-utils-ts{% else %}https://github.com/algorandfoundation/algokit-utils-py{% endif %}) - A set of core Algorand utilities that make it easier to build solutions on Algorand. +- [Poetry](https://python-poetry.org/): Python packaging and dependency management. +{%- if use_python_black -%} +- [Black](https://github.com/psf/black): A Python code formatter. +{%- endif %} +{%- if python_linter == "ruff" -%} +- [Ruff](https://github.com/charliermarsh/ruff): An extremely fast Python linter. +{% elif python_linter == "flake8" -%} +- [Flake8](https://flake8.pycqa.org/en/latest/): A Python linter for style guide enforcement. +{%- endif %} +{%- if use_python_mypy %} +- [mypy](https://mypy-lang.org/): Static type checker. +{%- endif %} +{%- if use_python_pytest %} +- [pytest](https://docs.pytest.org/): Automated testing. +{%- endif %} +{%- if use_python_pip_audit %} +- [pip-audit](https://pypi.org/project/pip-audit/): Tool for scanning Python environments for packages with known vulnerabilities. +{%- endif %} +{%- if use_pre_commit %} + - [pre-commit](https://pre-commit.com/): A framework for managing and maintaining multi-language pre-commit hooks, to enable pre-commit you need to run `pre-commit install` in the root of the repository. This will install the pre-commit hooks and run them against modified files when committing. If any of the hooks fail, the commit will be aborted. To run the hooks on all files, use `pre-commit run --all-files`. +{%- endif %} +{%- if deployment_language == "typescript" %} +- [npm](https://www.npmjs.com/): Node.js package manager +- [TypeScript](https://www.typescriptlang.org/): Strongly typed programming language that builds on JavaScript +- [ts-node-dev](https://github.com/wclr/ts-node-dev): TypeScript development execution environment +{% endif -%} + +{% if ide_vscode %} +It has also been configured to have a productive dev experience out of the box in [VS Code](https://code.visualstudio.com/), see the [.vscode](./.vscode) folder. +{% endif %} diff --git a/template_content/poetry.toml b/template_content/poetry.toml new file mode 100644 index 0000000..ab1033b --- /dev/null +++ b/template_content/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/template_content/pyproject.toml.jinja b/template_content/pyproject.toml.jinja new file mode 100644 index 0000000..5879dc5 --- /dev/null +++ b/template_content/pyproject.toml.jinja @@ -0,0 +1,67 @@ +[tool.poetry] +name = "{{ project_name }}" +version = "0.1.0" +description = "Algorand smart contracts" +authors = ["{{ author_name }} <{{ author_email }}>"] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +beaker-pyteal = "^1.1.1" +algokit-utils = "^2.0.1" +python-dotenv = "^1.0.0" + +[tool.poetry.group.dev.dependencies] +{% if use_python_black -%} +black = {extras = ["d"], version = "*"} +{% endif -%} +{% if python_linter == 'ruff' -%} +ruff = "^0.1.6" +{% elif python_linter == 'flake8' -%} +flake8 = "*" +{% endif -%} +{% if use_python_mypy -%} +mypy = "*" +{% endif -%} +{% if use_python_pytest -%} +pytest = "*" +pytest-cov = "*" +{% endif -%} +{% if use_python_pip_audit -%} +pip-audit = "*" +{% endif -%} +{% if use_pre_commit -%} +pre-commit = "*" +{% endif %} +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +{% if python_linter == 'ruff' -%} +[tool.ruff] +line-length = 120 +select = ["E", "F", "ANN", "UP", "N", "C4", "B", "A", "YTT", "W", "FBT", "Q", "RUF", "I"] +ignore = [ + "ANN101", # no type for self + "ANN102", # no type for cls +] +unfixable = ["B", "RUF"] + +[tool.ruff.flake8-annotations] +allow-star-arg-any = true +suppress-none-returning = true +{% endif -%} +{% if use_python_pytest %} +[tool.pytest.ini_options] +pythonpath = ["smart_contracts", "tests"] +{% endif -%} +{% if use_python_mypy %} +[tool.mypy] +files = "smart_contracts/" +python_version = "3.10" +check_untyped_defs = true +warn_redundant_casts = true +warn_unused_ignores = true +allow_untyped_defs = false +strict_equality = true +{% endif -%} diff --git a/template_content/smart_contracts/README.md.jinja b/template_content/smart_contracts/README.md.jinja new file mode 100644 index 0000000..99fa275 --- /dev/null +++ b/template_content/smart_contracts/README.md.jinja @@ -0,0 +1,12 @@ +## How to add new smart contracts? + +By the default the template creates a single `HelloWorld` contract under {{ contract_name }} folder in the `smart_contracts` directory. To add a new contract: + +1. From the root of the project (`../`) execute `algokit generate smart-contract`. This will create a new starter smart contract and deployment configuration file under `{your_contract_name}` subfolder under `smart_contracts` directory. +2. Each contract potentially has different creation parameters and deployment steps. Hence, you need to define your deployment logic in {% if deployment_language == 'python' %}`deploy_config.py`{% elif deployment_language == 'typescript' %}`deploy-config.ts`{% endif %}file. +3. `config.py` file will automatically build all contracts under `smart_contracts` directory. If you want to build specific contracts manually, modify the default code provided by the template in `config.py` file. +{%- if deployment_language == 'typescript' %} +4. Since you are generating a TypeScript client, you also need to reference your contract deployment logic in `index.ts` file. However, similar to config.py, by default, `index.ts` will auto import all TypeScript deployment files under `smart_contracts` directory. If you want to manually import specific contracts, modify the default code provided by the template in `index.ts` file. +{%- endif %} + +> Please note, above is just a suggested convention tailored for the base configuration and structure of this template. Default code supplied by the template in `config.py` and `index.ts` (if using ts clients) files are tailored for the suggested convention. You are free to modify the structure and naming conventions as you see fit. diff --git a/template_content/smart_contracts/__init__.py b/template_content/smart_contracts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/template_content/smart_contracts/__main__.py.jinja b/template_content/smart_contracts/__main__.py.jinja new file mode 100644 index 0000000..669b12e --- /dev/null +++ b/template_content/smart_contracts/__main__.py.jinja @@ -0,0 +1,52 @@ +import logging +import sys +from pathlib import Path + +from dotenv import load_dotenv + +from smart_contracts.config import contracts +{% if deployment_language == 'python' -%} +from smart_contracts.helpers.build import build +from smart_contracts.helpers.deploy import deploy +{%- elif deployment_language == 'typescript' -%} +from smart_contracts.helpers.build import build +{%- endif %} + +logging.basicConfig( + level=logging.DEBUG, format="%(asctime)s %(levelname)-10s: %(message)s" +) +logger = logging.getLogger(__name__) +logger.info("Loading .env") +load_dotenv() +root_path = Path(__file__).parent + + +def main(action: str) -> None: + artifact_path = root_path / "artifacts" + match action: + case "build": + for contract in contracts: + logger.info(f"Building app {contract.app.name}") + build(artifact_path / contract.app.name, contract.app) + {%- if deployment_language == 'python' %} + case "deploy": + for contract in contracts: + logger.info(f"Deploying app {contract.app.name}") + app_spec_path = artifact_path / contract.app.name / "application.json" + if contract.deploy: + deploy(app_spec_path, contract.deploy) + case "all": + for contract in contracts: + logger.info(f"Building app {contract.app.name}") + app_spec_path = build(artifact_path / contract.app.name, contract.app) + logger.info(f"Deploying {contract.app.name}") + if contract.deploy: + deploy(app_spec_path, contract.deploy) + {%- endif %} + + +if __name__ == "__main__": + if len(sys.argv) > 1: + main(sys.argv[1]) + else: + main("{{ 'all' if deployment_language == 'python' else 'build' }}") diff --git a/template_content/smart_contracts/config.py.jinja b/template_content/smart_contracts/config.py.jinja new file mode 100644 index 0000000..8cefdd6 --- /dev/null +++ b/template_content/smart_contracts/config.py.jinja @@ -0,0 +1,64 @@ +import dataclasses +import importlib +from collections.abc import Callable +from pathlib import Path + +from algokit_utils import Account, ApplicationSpecification +from algosdk.v2client.algod import AlgodClient +from algosdk.v2client.indexer import IndexerClient +from beaker import Application + + +@dataclasses.dataclass +class SmartContract: + app: Application + deploy: Callable[ + [AlgodClient, IndexerClient, ApplicationSpecification, Account], None + ] | None = None + + +def import_contract(folder: Path) -> Application: + """Imports the contract from a folder if it exists.""" + try: + contract_module = importlib.import_module( + f"{folder.parent.name}.{folder.name}.contract" + ) + return contract_module.app + except ImportError as e: + raise Exception(f"Contract not found in {folder}") from e + + +def import_deploy_if_exists( + folder: Path, +) -> ( + Callable[[AlgodClient, IndexerClient, ApplicationSpecification, Account], None] + | None +): + """Imports the deploy function from a folder if it exists.""" + try: + deploy_module = importlib.import_module( + f"{folder.parent.name}.{folder.name}.deploy_config" + ) + return deploy_module.deploy + except ImportError: + return None + + +def has_contract_file(directory: Path) -> bool: + """Checks whether the directory contains contract.py file.""" + return (directory / "contract.py").exists() + + +# define contracts to build and/or deploy +base_dir = Path("smart_contracts") +contracts = [ + SmartContract(app=import_contract(folder), deploy=import_deploy_if_exists(folder)) + for folder in base_dir.iterdir() + if folder.is_dir() and has_contract_file(folder) +] + +## Comment the above and uncomment the below and define contracts manually if you want to build and specify them +## manually otherwise the above code will always include all contracts under contract.py file for any subdirectory +## in the smart_contracts directory. Optionally it will also grab the deploy function from deploy_config.py if it exists. + +# contracts = [] diff --git a/template_content/smart_contracts/helpers/__init__.py b/template_content/smart_contracts/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/template_content/smart_contracts/helpers/build.py.jinja b/template_content/smart_contracts/helpers/build.py.jinja new file mode 100644 index 0000000..7dc047b --- /dev/null +++ b/template_content/smart_contracts/helpers/build.py.jinja @@ -0,0 +1,46 @@ +import logging +import subprocess +from pathlib import Path +from shutil import rmtree + +import beaker + +logger = logging.getLogger(__name__) +{% if deployment_language == 'python' -%} +deployment_extension = "py" +{% elif deployment_language == 'typescript' -%} +deployment_extension = "ts" +{% endif %} + +def build(output_dir: Path, app: beaker.Application) -> Path: + output_dir = output_dir.resolve() + if output_dir.exists(): + rmtree(output_dir) + output_dir.mkdir(exist_ok=True, parents=True) + logger.info(f"Exporting {app.name} to {output_dir}") + specification = app.build() + specification.export(output_dir) + + result = subprocess.run( + [ + "algokit", + "generate", + "client", + output_dir / "application.json", + "--output", + output_dir / f"client.{deployment_extension}", + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + if result.returncode: + if "No such command" in result.stdout: + raise Exception( + "Could not generate typed client, requires AlgoKit 1.1 or " + "later. Please update AlgoKit" + ) + else: + raise Exception(f"Could not generate typed client:\n{result.stdout}") + + return output_dir / "application.json" diff --git a/template_content/smart_contracts/helpers/{% if deployment_language == 'python' %}deploy.py{% endif %}.jinja b/template_content/smart_contracts/helpers/{% if deployment_language == 'python' %}deploy.py{% endif %}.jinja new file mode 100644 index 0000000..08367a3 --- /dev/null +++ b/template_content/smart_contracts/helpers/{% if deployment_language == 'python' %}deploy.py{% endif %}.jinja @@ -0,0 +1,50 @@ +import logging +from collections.abc import Callable +from pathlib import Path + +from algokit_utils import ( + Account, + ApplicationSpecification, + EnsureBalanceParameters, + ensure_funded, + get_account, + get_algod_client, + get_indexer_client, +) +from algosdk.util import algos_to_microalgos +from algosdk.v2client.algod import AlgodClient +from algosdk.v2client.indexer import IndexerClient + +logger = logging.getLogger(__name__) + + +def deploy( + app_spec_path: Path, + deploy_callback: Callable[ + [AlgodClient, IndexerClient, ApplicationSpecification, Account], None + ], + deployer_initial_funds: int = 2, +) -> None: + # get clients + # by default client configuration is loaded from environment variables + algod_client = get_algod_client() + indexer_client = get_indexer_client() + + # get app spec + app_spec = ApplicationSpecification.from_json(app_spec_path.read_text()) + + # get deployer account by name + deployer = get_account(algod_client, "DEPLOYER", fund_with_algos=0) + + minimum_funds_micro_algos = algos_to_microalgos(deployer_initial_funds) + ensure_funded( + algod_client, + EnsureBalanceParameters( + account_to_fund=deployer, + min_spending_balance_micro_algos=minimum_funds_micro_algos, + min_funding_increment_micro_algos=minimum_funds_micro_algos, + ), + ) + + # use provided callback to deploy the app + deploy_callback(algod_client, indexer_client, app_spec, deployer) diff --git a/template_content/smart_contracts/{% if deployment_language == 'typescript' %}index.ts{% endif %}.jinja b/template_content/smart_contracts/{% if deployment_language == 'typescript' %}index.ts{% endif %}.jinja new file mode 100644 index 0000000..4f18d4d --- /dev/null +++ b/template_content/smart_contracts/{% if deployment_language == 'typescript' %}index.ts{% endif %}.jinja @@ -0,0 +1,42 @@ +import * as fs from 'fs' +import * as path from 'path' +import { consoleLogger } from '@algorandfoundation/algokit-utils/types/logging' +import * as algokit from '@algorandfoundation/algokit-utils' + +algokit.Config.configure({ + logger: consoleLogger, +}) + +// base directory +const baseDir = path.resolve(__dirname) + +// function to validate and dynamically import a module +async function importDeployerIfExists(dir: string) { + const deployerPath = path.resolve(dir, 'deploy-config') + if (fs.existsSync(deployerPath + '.ts') || fs.existsSync(deployerPath + '.js')) { + const deployer = await import(deployerPath) + return deployer.deploy + } +} + +// get a list of all deployers from the subdirectories +async function getDeployers() { + const directories = fs.readdirSync(baseDir, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => path.resolve(baseDir, dirent.name)) + + return Promise.all(directories.map(importDeployerIfExists)) +} + +// execute all the deployers +(async () => { + const contractDeployers = (await getDeployers()).filter(Boolean) + + for (const deployer of contractDeployers) { + try { + await deployer() + } catch (e) { + console.error(e) + } + } +})() diff --git a/template_content/smart_contracts/{{ contract_name }}/contract.py.jinja b/template_content/smart_contracts/{{ contract_name }}/contract.py.jinja new file mode 100644 index 0000000..01e5881 --- /dev/null +++ b/template_content/smart_contracts/{{ contract_name }}/contract.py.jinja @@ -0,0 +1,30 @@ +import beaker +import pyteal as pt +{% if preset_name == 'starter' %} + +app = beaker.Application("{{ contract_name }}") +{% elif preset_name == 'production' -%} +from algokit_utils import DELETABLE_TEMPLATE_NAME, UPDATABLE_TEMPLATE_NAME + +app = beaker.Application("{{ contract_name }}") + + +@app.update(authorize=beaker.Authorize.only_creator(), bare=True) +def update() -> pt.Expr: + return pt.Assert( + pt.Tmpl.Int(UPDATABLE_TEMPLATE_NAME), + comment="Check app is updatable", + ) + + +@app.delete(authorize=beaker.Authorize.only_creator(), bare=True) +def delete() -> pt.Expr: + return pt.Assert( + pt.Tmpl.Int(DELETABLE_TEMPLATE_NAME), + comment="Check app is deletable", + ) +{% endif %} + +@app.external +def hello(name: pt.abi.String, *, output: pt.abi.String) -> pt.Expr: + return output.set(pt.Concat(pt.Bytes("Hello, "), name.get())) diff --git a/template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'python' %}deploy_config.py{% endif %}.jinja b/template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'python' %}deploy_config.py{% endif %}.jinja new file mode 100644 index 0000000..bb169ac --- /dev/null +++ b/template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'python' %}deploy_config.py{% endif %}.jinja @@ -0,0 +1,54 @@ +import logging + +import algokit_utils +from algosdk.v2client.algod import AlgodClient +from algosdk.v2client.indexer import IndexerClient + +logger = logging.getLogger(__name__) + + +# define deployment behaviour based on supplied app spec +def deploy( + algod_client: AlgodClient, + indexer_client: IndexerClient, + app_spec: algokit_utils.ApplicationSpecification, + deployer: algokit_utils.Account, +) -> None: + from smart_contracts.artifacts.{{ contract_name }}.client import ( + {{ contract_name.split('_')|map('capitalize')|join }}Client, + ) + + app_client = {{ contract_name.split('_')|map('capitalize')|join }}Client( + algod_client, + creator=deployer, + indexer_client=indexer_client, + ) + + + {%- if preset_name == 'starter' %} + app_client.deploy( + on_schema_break=algokit_utils.OnSchemaBreak.AppendApp, + on_update=algokit_utils.OnUpdate.AppendApp, + ) + {%- elif preset_name == 'production' %} + is_mainnet = algokit_utils.is_mainnet(algod_client) + app_client.deploy( + on_schema_break=( + algokit_utils.OnSchemaBreak.AppendApp + if is_mainnet + else algokit_utils.OnSchemaBreak.ReplaceApp + ), + on_update=algokit_utils.OnUpdate.AppendApp + if is_mainnet + else algokit_utils.OnUpdate.UpdateApp, + allow_delete=not is_mainnet, + allow_update=not is_mainnet, + ) + {%- endif %} + + name = "world" + response = app_client.hello(name=name) + logger.info( + f"Called hello on {app_spec.contract.name} ({app_client.app_id}) " + f"with name={name}, received: {response.return_value}" + ) diff --git a/template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'typescript' %}deploy-config.ts{% endif %}.jinja b/template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'typescript' %}deploy-config.ts{% endif %}.jinja new file mode 100644 index 0000000..325fb24 --- /dev/null +++ b/template_content/smart_contracts/{{ contract_name }}/{% if deployment_language == 'typescript' %}deploy-config.ts{% endif %}.jinja @@ -0,0 +1,59 @@ +import * as algokit from '@algorandfoundation/algokit-utils' +import { {{ contract_name.split('_')|map('capitalize')|join }}Client } from '../artifacts/{{ contract_name }}/client' + +// Below is a showcase of various deployment options you can use in TypeScript Client +export async function deploy() { + console.log('=== Deploying {{ contract_name.split('_')|map('capitalize')|join }} ===') + + const algod = algokit.getAlgoClient() + const indexer = algokit.getAlgoIndexerClient() + const deployer = await algokit.mnemonicAccountFromEnvironment({ name: 'DEPLOYER', fundWith: algokit.algos(3) }, algod) + await algokit.ensureFunded( + { + accountToFund: deployer, + minSpendingBalance: algokit.algos(2), + minFundingIncrement: algokit.algos(2), + }, + algod, + ) + const appClient = new {{ contract_name.split('_')|map('capitalize')|join }}Client( + { + resolveBy: 'creatorAndName', + findExistingUsing: indexer, + sender: deployer, + creatorAddress: deployer.addr, + }, + algod, + ) + + {%- if preset_name == 'starter' %} + const app = await appClient.deploy({ + onSchemaBreak: 'append', + onUpdate: 'append', + }) + {% elif preset_name == 'production' %} + const isMainNet = await algokit.isMainNet(algod) + const app = await appClient.deploy({ + allowDelete: !isMainNet, + allowUpdate: !isMainNet, + onSchemaBreak: isMainNet ? 'append' : 'replace', + onUpdate: isMainNet ? 'append' : 'update', + }) + {% endif %} + + // If app was just created fund the app account + if (['create', 'replace'].includes(app.operationPerformed)) { + algokit.transferAlgos( + { + amount: algokit.algos(1), + from: deployer, + to: app.appAddress, + }, + algod, + ) + } + + const method = 'hello' + const response = await appClient.hello({ name: 'world' }) + console.log(`Called ${method} on ${app.name} (${app.appId}) with name = world, received: ${response.return}`) +} diff --git a/template_content/{% if deployment_language == 'typescript' %}.prettierignore{% endif %} b/template_content/{% if deployment_language == 'typescript' %}.prettierignore{% endif %} new file mode 100644 index 0000000..dbda6ae --- /dev/null +++ b/template_content/{% if deployment_language == 'typescript' %}.prettierignore{% endif %} @@ -0,0 +1,12 @@ +# don't ever format node_modules +node_modules +# don't lint format output (make sure it's set to your correct build folder name) +dist +build +# don't format nyc coverage output +coverage +# don't format generated types +**/generated/types.d.ts +**/generated/types.ts +# don't format ide files +.idea diff --git a/template_content/{% if deployment_language == 'typescript' %}.prettierrc.js{% endif %} b/template_content/{% if deployment_language == 'typescript' %}.prettierrc.js{% endif %} new file mode 100644 index 0000000..c484d0e --- /dev/null +++ b/template_content/{% if deployment_language == 'typescript' %}.prettierrc.js{% endif %} @@ -0,0 +1,10 @@ +module.exports = { + singleQuote: true, + jsxSingleQuote: false, + semi: false, + tabWidth: 2, + trailingComma: 'all', + printWidth: 120, + endOfLine: 'lf', + arrowParens: 'always', +} diff --git a/template_content/{% if deployment_language == 'typescript' %}package.json{% endif %}.jinja b/template_content/{% if deployment_language == 'typescript' %}package.json{% endif %}.jinja new file mode 100644 index 0000000..927b682 --- /dev/null +++ b/template_content/{% if deployment_language == 'typescript' %}package.json{% endif %}.jinja @@ -0,0 +1,24 @@ +{ + "name": "smart_contracts", + "version": "1.0.0", + "description": "Smart contract deployer", + "main": "index.ts", + "scripts": { + "deploy": "ts-node-dev --transpile-only --watch .env -r dotenv/config smart_contracts/index.ts", + "deploy:ci": "ts-node --transpile-only -r dotenv/config smart_contracts/index.ts", + "format": "prettier --write ." + }, + "engines": { + "node": ">=18.0" + }, + "dependencies": { + "@algorandfoundation/algokit-utils": "^3.0.0", + "algosdk": "^2.5.0" + }, + "devDependencies": { + "dotenv": "^16.0.3", + "prettier": "^2.8.4", + "ts-node-dev": "^2.0.0", + "typescript": "^4.9.5" + } +} diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/externalDependencies.xml b/template_content/{% if ide_jetbrains %}.idea{% endif %}/externalDependencies.xml new file mode 100644 index 0000000..03ecbed --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/externalDependencies.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application.xml.jinja b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application.xml.jinja new file mode 100644 index 0000000..d4b8841 --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application.xml.jinja @@ -0,0 +1,35 @@ + + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application____LocalNet.xml.jinja b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application____LocalNet.xml.jinja new file mode 100644 index 0000000..a2b0f2a --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Build_Beaker_application____LocalNet.xml.jinja @@ -0,0 +1,37 @@ + + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Reset_AlgoKit_LocalNet.xml b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Reset_AlgoKit_LocalNet.xml new file mode 100644 index 0000000..7f1236a --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Reset_AlgoKit_LocalNet.xml @@ -0,0 +1,17 @@ + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Start_AlgoKit_LocalNet.xml b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Start_AlgoKit_LocalNet.xml new file mode 100644 index 0000000..f699a7a --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Start_AlgoKit_LocalNet.xml @@ -0,0 +1,17 @@ + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Stop_AlgoKit_LocalNet.xml b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Stop_AlgoKit_LocalNet.xml new file mode 100644 index 0000000..e510cbc --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/Stop_AlgoKit_LocalNet.xml @@ -0,0 +1,17 @@ + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja new file mode 100644 index 0000000..ad46e78 --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja @@ -0,0 +1,38 @@ + + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja new file mode 100644 index 0000000..ac77102 --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'python' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja @@ -0,0 +1,36 @@ + + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja new file mode 100644 index 0000000..44d3796 --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Build___Deploy_Beaker_application.xml{% endif %}.jinja @@ -0,0 +1,18 @@ + + + + diff --git a/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja new file mode 100644 index 0000000..b8842d9 --- /dev/null +++ b/template_content/{% if ide_jetbrains %}.idea{% endif %}/runConfigurations/{% if deployment_language == 'typescript' %}Deploy_Built_Beaker_application.xml{% endif %}.jinja @@ -0,0 +1,16 @@ + + + + diff --git a/template_content/{% if ide_vscode %}.vscode{% endif %}/extensions.json.jinja b/template_content/{% if ide_vscode %}.vscode{% endif %}/extensions.json.jinja new file mode 100644 index 0000000..6ef4824 --- /dev/null +++ b/template_content/{% if ide_vscode %}.vscode{% endif %}/extensions.json.jinja @@ -0,0 +1,21 @@ +{ + "recommendations": [ + "ms-python.python", + {% if python_linter == 'ruff' -%} + "charliermarsh.ruff", + {% elif python_linter == 'flake8' -%} + "ms-python.flake8", + {% endif -%} + {% if use_python_mypy -%} + "matangover.mypy", + {% endif -%} + {% if use_python_black -%} + "ms-python.black-formatter", + {% endif -%} + {% if deployment_language == 'typescript' -%} + "esbenp.prettier-vscode", + {% endif -%} + "tamasfe.even-better-toml", + "editorconfig.editorconfig" + ] +} diff --git a/template_content/{% if ide_vscode %}.vscode{% endif %}/launch.json.jinja b/template_content/{% if ide_vscode %}.vscode{% endif %}/launch.json.jinja new file mode 100644 index 0000000..4b88a5c --- /dev/null +++ b/template_content/{% if ide_vscode %}.vscode{% endif %}/launch.json.jinja @@ -0,0 +1,57 @@ +{ + "version": "0.2.0", + "configurations": [ + {% if deployment_language == 'python' -%} + { + "name": "Build & Deploy Beaker application", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "cwd": "${workspaceFolder}", + "preLaunchTask": "Start AlgoKit LocalNet", + "envFile": "${workspaceFolder}/.env.localnet" + }, + { + "name": "Deploy Built Beaker application", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "args": ["deploy"], + "cwd": "${workspaceFolder}", + "envFile": "${workspaceFolder}/.env.localnet" + }, + {% elif deployment_language == 'typescript' -%} + { + "name": "Build & Deploy Beaker application", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "preLaunchTask": "Build Beaker application (+ LocalNet)", + "envFile": "${workspaceFolder}/.env.localnet" + }, + { + "name": "Deploy Built Beaker application", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "deploy"], + "cwd": "${workspaceFolder}/smart_contracts", + "console": "integratedTerminal", + "skipFiles": ["/**", "node_modules/**"], + "envFile": "${workspaceFolder}/.env.localnet" + }, + {% endif -%} + { + "name": "Build Beaker application", + "type": "python", + "request": "launch", + "module": "smart_contracts", + "args": ["build"], + "cwd": "${workspaceFolder}" + } + ] +} diff --git a/template_content/{% if ide_vscode %}.vscode{% endif %}/settings.json.jinja b/template_content/{% if ide_vscode %}.vscode{% endif %}/settings.json.jinja new file mode 100644 index 0000000..708895f --- /dev/null +++ b/template_content/{% if ide_vscode %}.vscode{% endif %}/settings.json.jinja @@ -0,0 +1,67 @@ +{ + // General - see also /.editorconfig + "editor.formatOnSave": true, + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + ".mypy_cache": true, + ".pytest_cache": true, + ".ruff_cache": true, + "**/__pycache__": true, + ".idea": true + }, + {% if deployment_language == 'typescript' %} + // TypeScript + "editor.defaultFormatter": "esbenp.prettier-vscode", + {% endif %} + // Python + "python.analysis.extraPaths": ["${workspaceFolder}/smart_contracts"], + "python.defaultInterpreterPath": "${workspaceFolder}/.venv", + "[python]": { + "editor.codeActionsOnSave": { + "source.fixAll": true, + // Prevent default import sorting from running; Ruff will sort imports for us anyway + "source.organizeImports": false + }, + {% if use_python_black -%} + "editor.defaultFormatter": "ms-python.black-formatter", + {% else -%} + "editor.defaultFormatter": null, + {% endif -%} + }, + {% if use_python_black -%} + "black-formatter.args": ["--config=pyproject.toml"], + {% endif -%} + {% if use_python_pytest -%} + "python.testing.pytestEnabled": true, + {% endif -%} + {% if python_linter == 'flake8' -%} + "flake8.importStrategy": "fromEnvironment", + "flake8.args": ["--config=.flake8"], + {% endif -%} + {% if python_linter == 'ruff' -%} + "ruff.enable": true, + "ruff.lint.run": "onSave", + "ruff.lint.args": ["--config=pyproject.toml"], + "ruff.importStrategy": "fromEnvironment", + "ruff.fixAll": true, //lint and fix all files in workspace + "ruff.organizeImports": true, //organize imports on save + "ruff.codeAction.disableRuleComment": { + "enable": true + }, + "ruff.codeAction.fixViolation": { + "enable": true + }, + {% endif -%} + {% if use_python_mypy -%} + "python.analysis.typeCheckingMode": "off", + "mypy.configFile": "pyproject.toml", + // set to empty array to use config from project + "mypy.targets": [], + "mypy.runUsingActiveInterpreter": true, + {% endif %} + // On Windows, if execution policy is set to Signed (default) then it won't be able to activate the venv + // so instead let's set it to RemoteSigned for VS Code terminal + "terminal.integrated.shellArgs.windows": ["-ExecutionPolicy", "RemoteSigned"], +} diff --git a/template_content/{% if ide_vscode %}.vscode{% endif %}/tasks.json b/template_content/{% if ide_vscode %}.vscode{% endif %}/tasks.json new file mode 100644 index 0000000..fe7889a --- /dev/null +++ b/template_content/{% if ide_vscode %}.vscode{% endif %}/tasks.json @@ -0,0 +1,64 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build Beaker application", + "command": "${workspaceFolder}/.venv/bin/python", + "windows": { + "command": "${workspaceFolder}/.venv/Scripts/python.exe" + }, + "args": ["-m", "smart_contracts", "build"], + "options": { + "cwd": "${workspaceFolder}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "label": "Build Beaker application (+ LocalNet)", + "command": "${workspaceFolder}/.venv/bin/python", + "windows": { + "command": "${workspaceFolder}/.venv/Scripts/python.exe" + }, + "args": ["-m", "smart_contracts", "build"], + "options": { + "cwd": "${workspaceFolder}" + }, + "dependsOn": "Start AlgoKit LocalNet", + "problemMatcher": [] + }, + { + "label": "Start AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "start"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Stop AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "stop"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + }, + { + "label": "Reset AlgoKit LocalNet", + "command": "algokit", + "args": ["localnet", "reset"], + "type": "shell", + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [] + } + ] +} diff --git a/template_content/{% if python_linter == 'flake8' %}.flake8{% endif %} b/template_content/{% if python_linter == 'flake8' %}.flake8{% endif %} new file mode 100644 index 0000000..eeaac64 --- /dev/null +++ b/template_content/{% if python_linter == 'flake8' %}.flake8{% endif %} @@ -0,0 +1,4 @@ +[flake8] +max-line-length = 88 +select = B,C,E,F,W,T4,B9 +extend-ignore = E203 diff --git a/template_content/{% if use_github_actions %}.github{% endif %}/workflows/cd.yaml.jinja b/template_content/{% if use_github_actions %}.github{% endif %}/workflows/cd.yaml.jinja new file mode 100644 index 0000000..40ec64a --- /dev/null +++ b/template_content/{% if use_github_actions %}.github{% endif %}/workflows/cd.yaml.jinja @@ -0,0 +1,57 @@ +name: Continuous Delivery of Smart Contract + +on: + push: + branches: + - main + +concurrency: release + +jobs: + ci-check: + name: Perform Checks + uses: ./.github/workflows/checks.yaml + + deploy-testnet: + runs-on: 'ubuntu-latest' + needs: ci-check + environment: Test + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Install poetry + run: pipx install poetry + + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: '3.10' + cache: 'poetry' + + - name: Install algokit + run: pipx install algokit + + - name: Bootstrap dependencies + run: algokit bootstrap all + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" + + - name: Deploy to testnet + run: algokit deploy testnet + env: +{%- if use_dispenser %} + # This is the account that becomes the creator of the contract + DEPLOYER_MNEMONIC: {% raw %}${{ secrets.DEPLOYER_MNEMONIC }}{% endraw %} + # The dispenser account is used to ensure the deployer account is funded + DISPENSER_MNEMONIC: {% raw %}${{ secrets.DISPENSER_MNEMONIC }}{% endraw %} +{%- else %} + # This is the account that becomes the creator of the contract. + # Since we are not using the optional dispenser account (via DISPENSER_MNEMONIC), + # it must also be funded with enough Algos to deploy and fund the smart contracts created + DEPLOYER_MNEMONIC: {% raw %}${{ secrets.DEPLOYER_MNEMONIC }}{% endraw %} +{%- endif %} diff --git a/template_content/{% if use_github_actions %}.github{% endif %}/workflows/checks.yaml.jinja b/template_content/{% if use_github_actions %}.github{% endif %}/workflows/checks.yaml.jinja new file mode 100644 index 0000000..edd56e6 --- /dev/null +++ b/template_content/{% if use_github_actions %}.github{% endif %}/workflows/checks.yaml.jinja @@ -0,0 +1,99 @@ +name: Check code base + +on: + workflow_call: + +jobs: + checks: + runs-on: 'ubuntu-latest' + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Install poetry + run: pipx install poetry + + - name: Set up Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: '3.10' + cache: 'poetry' + + - name: Install algokit + run: pipx install algokit + + - name: Start LocalNet + run: algokit localnet start + + - name: Bootstrap dependencies + run: algokit bootstrap all + + - name: Configure git + shell: bash + run: | + # set git user and email as test invoke git + git config --global user.email "actions@github.com" && git config --global user.name "github-actions" +{%- if use_python_pip_audit %} + + - name: Audit with pip-audit + run: | + # audit non dev dependencies, no exclusions + poetry export --without=dev > requirements.txt && poetry run pip-audit -r requirements.txt + + # audit all dependencies, with exclusions. + # If a vulnerability is found in a dev dependency without an available fix, + # it can be temporarily ignored by adding --ignore-vuln e.g. + # --ignore-vuln "GHSA-hcpj-qp55-gfph" # GitPython vulnerability, dev only dependency + poetry run pip-audit +{%- endif %} +{%- if use_python_black %} + + - name: Check formatting with Black + run: | + # stop the build if there are files that don't meet formatting requirements + poetry run black --check . +{%- endif %} +{%- if python_linter == 'ruff' %} + + - name: Check linting with Ruff + run: | + # stop the build if there are Python syntax errors or undefined names + poetry run ruff . +{%- elif python_linter == 'flake8' %} + + - name: Check linting with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + poetry run flake8 . +{%- endif %} +{%- if use_python_mypy %} + + - name: Check types with mypy + run: poetry run mypy +{%- endif %} +{%- if use_python_pytest %} + + - name: Run tests + shell: bash + run: | + set -o pipefail + poetry run pytest --junitxml=pytest-junit.xml +{%- endif %} + + - name: Build smart contracts + run: poetry run python -m smart_contracts build + + - name: Check output stability of the smart contracts + shell: bash + run: | + # Add untracked files as empty so they come up in diff + git add -N ./smart_contracts/artifacts + # Error out if there are any changes in teal after generating output + git diff --exit-code --minimal ./smart_contracts/artifacts || (echo "::error ::Smart contract artifacts have changed, ensure committed artifacts are up to date" && exit 1); + + - name: Run deployer against LocalNet +{%- if deployment_language == 'typescript' %} + run: npm run --prefix smart_contracts deploy:ci +{%- elif deployment_language == 'python' %} + run: poetry run python -m smart_contracts deploy +{%- endif %} diff --git a/template_content/{% if use_github_actions %}.github{% endif %}/workflows/pr.yaml b/template_content/{% if use_github_actions %}.github{% endif %}/workflows/pr.yaml new file mode 100644 index 0000000..a80f784 --- /dev/null +++ b/template_content/{% if use_github_actions %}.github{% endif %}/workflows/pr.yaml @@ -0,0 +1,8 @@ +name: Pull Request validation + +on: [pull_request] + +jobs: + pr-check: + name: Perform Checks + uses: ./.github/workflows/checks.yaml diff --git a/template_content/{% if use_pre_commit %}.pre-commit-config.yaml{% endif %}.jinja b/template_content/{% if use_pre_commit %}.pre-commit-config.yaml{% endif %}.jinja new file mode 100644 index 0000000..c2f10a9 --- /dev/null +++ b/template_content/{% if use_pre_commit %}.pre-commit-config.yaml{% endif %}.jinja @@ -0,0 +1,38 @@ +repos: + - repo: local + hooks: + {% if use_python_black %} + - id: black + name: black + description: "Black: The uncompromising Python code formatter" + entry: poetry run black + language: system + minimum_pre_commit_version: 2.9.2 + require_serial: true + types_or: [ python, pyi ] + {% endif %} + {% if python_linter == 'ruff' %} + - id: ruff + name: ruff + description: "Run 'ruff' for extremely fast Python linting" + entry: poetry run ruff + language: system + types: [ python ] + args: [ --fix ] + require_serial: false + additional_dependencies: [ ] + minimum_pre_commit_version: '0' + files: '^(src|tests)/' + {% endif %} + {% if use_python_mypy %} + - id: mypy + name: mypy + description: '`mypy` will check Python types for correctness' + entry: poetry run mypy + language: system + types_or: [ python, pyi ] + require_serial: true + additional_dependencies: [ ] + minimum_pre_commit_version: '2.9.2' + files: '^(src|tests)/' + {% endif %} diff --git a/template_content/{% if use_python_pytest %}tests{% endif %}/__init__.py b/template_content/{% if use_python_pytest %}tests{% endif %}/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/template_content/{% if use_python_pytest %}tests{% endif %}/conftest.py b/template_content/{% if use_python_pytest %}tests{% endif %}/conftest.py new file mode 100644 index 0000000..06a89eb --- /dev/null +++ b/template_content/{% if use_python_pytest %}tests{% endif %}/conftest.py @@ -0,0 +1,25 @@ +from pathlib import Path + +import pytest +from algokit_utils import ( + get_algod_client, + is_localnet, +) +from algosdk.v2client.algod import AlgodClient +from dotenv import load_dotenv + + +@pytest.fixture(autouse=True, scope="session") +def environment_fixture() -> None: + env_path = Path(__file__).parent.parent / ".env.localnet" + load_dotenv(env_path) + + +@pytest.fixture(scope="session") +def algod_client() -> AlgodClient: + client = get_algod_client() + + # you can remove this assertion to test on other networks, + # included here to prevent accidentally running against other networks + assert is_localnet(client) + return client diff --git a/template_content/{% if use_python_pytest %}tests{% endif %}/{% if use_python_pytest %}{{ contract_name }}_test.py{% endif %}.jinja b/template_content/{% if use_python_pytest %}tests{% endif %}/{% if use_python_pytest %}{{ contract_name }}_test.py{% endif %}.jinja new file mode 100644 index 0000000..49a75ad --- /dev/null +++ b/template_content/{% if use_python_pytest %}tests{% endif %}/{% if use_python_pytest %}{{ contract_name }}_test.py{% endif %}.jinja @@ -0,0 +1,36 @@ +import pytest +from algokit_utils import ( + ApplicationClient, + ApplicationSpecification, + get_localnet_default_account, +) +from algosdk.v2client.algod import AlgodClient + +from smart_contracts.{{ contract_name }} import contract as {{ contract_name }}_contract + + +@pytest.fixture(scope="session") +def {{ contract_name }}_app_spec(algod_client: AlgodClient) -> ApplicationSpecification: + return {{ contract_name }}_contract.app.build(algod_client) + + +@pytest.fixture(scope="session") +def {{ contract_name }}_client( + algod_client: AlgodClient, {{ contract_name }}_app_spec: ApplicationSpecification +) -> ApplicationClient: + client = ApplicationClient( + algod_client, + app_spec={{ contract_name }}_app_spec, + signer=get_localnet_default_account(algod_client), + {%- if preset_name == 'production' %} + template_values={"UPDATABLE": 1, "DELETABLE": 1}, + {%- endif %} + ) + client.create() + return client + + +def test_says_hello({{ contract_name }}_client: ApplicationClient) -> None: + result = {{ contract_name }}_client.call({{ contract_name }}_contract.hello, name="World") + + assert result.return_value == "Hello, World" diff --git a/template_content/{{ _copier_conf.answers_file }}.jinja b/template_content/{{ _copier_conf.answers_file }}.jinja new file mode 100644 index 0000000..23c8bac --- /dev/null +++ b/template_content/{{ _copier_conf.answers_file }}.jinja @@ -0,0 +1,2 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +{{_copier_answers|to_nice_yaml}} diff --git a/tests/test_generators.py b/tests/test_generators.py new file mode 100644 index 0000000..4996189 --- /dev/null +++ b/tests/test_generators.py @@ -0,0 +1,235 @@ +import re +import shutil +import subprocess +import tempfile +from collections.abc import Iterator +from pathlib import Path + +import pytest +import yaml + +commit_pattern = re.compile(r"^_commit: .*", flags=re.MULTILINE) +src_path_pattern = re.compile(r"_src_path: .*") +tests_path = Path(__file__).parent +root = tests_path.parent +generated_folder = "tests_generated" +generated_root = root / generated_folder +DEFAULT_PARAMETERS = { + "author_name": "None", + "author_email": "None", +} +config_path = Path(__file__).parent.parent / "pyproject.toml" +BLACK_ARGS = ["black", "--check", "--diff", "--config", str(config_path), "."] +RUFF_ARGS = ["ruff", "--diff", "--config", str(config_path), "."] +MYPY_ARGS = [ + "mypy", + "--ignore-missing-imports", # TODO: only ignore missing typed clients in config.py + ".", +] + + +def _load_copier_yaml(path: Path) -> dict[str, str | bool | dict]: + with path.open("r", encoding="utf-8") as stream: + return yaml.safe_load(stream) + + +@pytest.fixture(autouse=True, scope="module") +def working_dir() -> Iterator[Path]: + with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as temp: + working_dir = Path(temp) / "template" + working_generated_root = working_dir / generated_folder + shutil.copytree(root, working_dir) + subprocess.run(["git", "add", "-A"], cwd=working_dir) + subprocess.run( + ["git", "commit", "-m", "draft changes", "--no-verify"], cwd=working_dir + ) + + yield working_dir + + for src_dir in working_generated_root.iterdir(): + if not src_dir.is_dir(): + continue + + dest_dir = generated_root / src_dir.stem + shutil.rmtree(dest_dir, ignore_errors=True) + shutil.copytree(src_dir, dest_dir, dirs_exist_ok=True) + + +def run_init( + working_dir: Path, + test_name: str, + *args: str, + template_url: str | None = None, + template_branch: str | None = None, + answers: dict[str, str] | None = None, +) -> subprocess.CompletedProcess: + copy_to = working_dir / generated_folder / test_name + shutil.rmtree(copy_to, ignore_errors=True) + if template_url is None: + template_url = str(working_dir) + + if template_branch is None: + git_output = subprocess.run( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], + cwd=working_dir, + stdout=subprocess.PIPE, + ) + template_branch = git_output.stdout.decode("utf-8").strip() + + init_args = [ + "algokit", + "--verbose", + "init", + "--name", + str(copy_to.stem), + "--template-url", + template_url, + "--UNSAFE-SECURITY-accept-template-url", + "--defaults", + "--no-ide", + "--no-git", + "--no-bootstrap", + ] + answers = {**DEFAULT_PARAMETERS, **(answers or {})} + + for question, answer in answers.items(): + init_args.extend(["-a", question, answer]) + if template_branch: + init_args.extend(["--template-url-ref", template_branch]) + init_args.extend(args) + + result = subprocess.run( + init_args, + input="y", # acknowledge that input is not a tty + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + cwd=copy_to.parent, + ) + + return result + + +def check_codebase(working_dir: Path, test_name: str) -> subprocess.CompletedProcess: + copy_to = working_dir / generated_folder / test_name + + # if successful, normalize .copier-answers.yml to make observing diffs easier + copier_answers = Path(copy_to / ".copier-answers.yml") + content = copier_answers.read_text("utf-8") + content = commit_pattern.sub("_commit: ", content) + content = src_path_pattern.sub("_src_path: ", content) + copier_answers.write_text(content, "utf-8") + + check_args = [BLACK_ARGS] + + # Starter template does not have ruff config or mypy config by default + # so only check for them if the starter template is not used + processed_questions = _load_copier_yaml(copier_answers) + if processed_questions["preset_name"] == "production": + check_args += [RUFF_ARGS, MYPY_ARGS] + + for check_arg in check_args: + result = subprocess.run( + check_arg, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + cwd=copy_to, + ) + if result.returncode: + break + + return result + + +def run_generator( + working_dir: Path, + test_name: str, + generator_name: str, + answers: dict[str, str] | None = None, +) -> subprocess.CompletedProcess: + copy_to = working_dir / generated_folder / test_name + + init_args = [ + "algokit", + "--verbose", + "generate", + str(generator_name), + ] + + if answers: + for question, answer in answers.items(): + init_args.extend(["-a", question, answer]) + + result = subprocess.run( + init_args, + input="y", # acknowledge that input is not a tty + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + cwd=copy_to.absolute(), + ) + + return result + + +@pytest.mark.parametrize("language", ["python", "typescript"]) +def test_smart_contract_generator_default_starter_preset( + language: str, working_dir: Path +) -> None: + test_name = f"test_smart_contract_generator_default_starter_preset_{language}" + + response = run_init( + working_dir, + test_name, + answers={ + "preset_name": "starter", + "deployment_language": language, + }, + ) + assert response.returncode == 0, response.stdout + + response = run_generator( + working_dir, + test_name, + "smart-contract", + { + "contract_name": "cool_contract", + "deployment_language": language, + }, + ) + assert response.returncode == 0, response.stdout + + response = check_codebase(working_dir, test_name) + assert response.returncode == 0, response.stdout + + +@pytest.mark.parametrize("language", ["python", "typescript"]) +def test_smart_contract_generator_default_production_preset( + language: str, working_dir: Path +) -> None: + test_name = f"test_smart_contract_generator_default_production_preset_{language}" + + response = run_init( + working_dir, + test_name, + answers={ + "preset_name": "production", + "deployment_language": language, + }, + ) + assert response.returncode == 0, response.stdout + + response = run_generator( + working_dir, + test_name, + "smart-contract", + { + "contract_name": "cool_contract", + "deployment_language": language, + }, + ) + assert response.returncode == 0, response.stdout + + response = check_codebase(working_dir, test_name) + assert response.returncode == 0, response.stdout diff --git a/tests/test_templates.py b/tests/test_templates.py new file mode 100644 index 0000000..0771ec2 --- /dev/null +++ b/tests/test_templates.py @@ -0,0 +1,214 @@ +import re +import shutil +import subprocess +import tempfile +from collections.abc import Iterator +from pathlib import Path + +import pytest +import yaml + +commit_pattern = re.compile(r"^_commit: .*", flags=re.MULTILINE) +src_path_pattern = re.compile(r"_src_path: .*") +tests_path = Path(__file__).parent +root = tests_path.parent +generated_folder = "tests_generated" +generated_root = root / generated_folder +DEFAULT_PARAMETERS = { + "author_name": "None", + "author_email": "None", +} +config_path = Path(__file__).parent.parent / "pyproject.toml" +BLACK_ARGS = ["black", "--check", "--diff", "--config", str(config_path), "."] +RUFF_ARGS = ["ruff", "--diff", "--config", str(config_path), "."] +MYPY_ARGS = [ + "mypy", + "--ignore-missing-imports", # TODO: only ignore missing typed clients in config.py + ".", +] + + +def _load_copier_yaml(path: Path) -> dict[str, str | bool | dict]: + with path.open("r", encoding="utf-8") as stream: + return yaml.safe_load(stream) + + +@pytest.fixture(autouse=True, scope="module") +def working_dir() -> Iterator[Path]: + with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as temp: + working_dir = Path(temp) / "template" + working_generated_root = working_dir / generated_folder + shutil.copytree(root, working_dir) + subprocess.run(["git", "add", "-A"], cwd=working_dir) + subprocess.run( + ["git", "commit", "-m", "draft changes", "--no-verify"], cwd=working_dir + ) + + yield working_dir + + for src_dir in working_generated_root.iterdir(): + if not src_dir.is_dir(): + continue + + dest_dir = generated_root / src_dir.stem + shutil.rmtree(dest_dir, ignore_errors=True) + shutil.copytree(src_dir, dest_dir, dirs_exist_ok=True) + + +def run_init( + working_dir: Path, + test_name: str, + *args: str, + template_url: str | None = None, + template_branch: str | None = None, + answers: dict[str, str] | None = None, +) -> subprocess.CompletedProcess: + copy_to = working_dir / generated_folder / test_name + shutil.rmtree(copy_to, ignore_errors=True) + if template_url is None: + template_url = str(working_dir) + + if template_branch is None: + git_output = subprocess.run( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], + cwd=working_dir, + stdout=subprocess.PIPE, + ) + template_branch = git_output.stdout.decode("utf-8").strip() + + init_args = [ + "algokit", + "--verbose", + "init", + "--name", + str(copy_to.stem), + "--template-url", + template_url, + "--UNSAFE-SECURITY-accept-template-url", + "--defaults", + "--no-ide", + "--no-git", + "--no-bootstrap", + ] + answers = {**DEFAULT_PARAMETERS, **(answers or {})} + + for question, answer in answers.items(): + init_args.extend(["-a", question, answer]) + if template_branch: + init_args.extend(["--template-url-ref", template_branch]) + init_args.extend(args) + + result = subprocess.run( + init_args, + input="y", # acknowledge that input is not a tty + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + cwd=copy_to.parent, + ) + + if result.returncode: + return result + # if successful, normalize .copier-answers.yml to make observing diffs easier + copier_answers = Path(copy_to / ".copier-answers.yml") + content = copier_answers.read_text("utf-8") + content = commit_pattern.sub("_commit: ", content) + content = src_path_pattern.sub("_src_path: ", content) + copier_answers.write_text(content, "utf-8") + + check_args = [BLACK_ARGS] + + # Starter template does not have ruff config or mypy config by default + # so only check for them if the starter template is not used + processed_questions = _load_copier_yaml(copier_answers) + if processed_questions["preset_name"] == "production": + check_args += [RUFF_ARGS, MYPY_ARGS] + + for check_arg in check_args: + result = subprocess.run( + check_arg, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + cwd=copy_to, + ) + if result.returncode: + break + + # Remove .algokit generators folder to avoid polluting the git history + shutil.rmtree(copy_to / ".algokit", ignore_errors=True) + + # Check if .idea folder exists and if so modify os specific SDK_HOME path + idea_folder = copy_to / ".idea" + if idea_folder.exists(): + # Iterate over all files in .idea/runConfigurations + for file in (idea_folder / "runConfigurations").iterdir(): + # Read the file content + content = file.read_text() + # Replace the line containing SDK_HOME + content = re.sub( + r'