algorand-python-testing 0.3.0b7__tar.gz → 0.3.0b8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/CHANGELOG.md +6 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/PKG-INFO +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/arc4-types.md +0 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/avm-types.md +0 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/opcodes.md +23 -28
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/signature-testing.md +0 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/state-management.md +0 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/transactions.md +2 -2
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/pyproject.toml +9 -10
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/__init__.py +7 -7
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/arc4.py +14 -31
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/context.py +2 -2
- algorand_python_testing-0.3.0b8/src/_algopy_testing/context_helpers/__init__.py +13 -0
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_context_helpers → algorand_python_testing-0.3.0b8/src/_algopy_testing/context_helpers}/context_storage.py +4 -4
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_context_helpers → algorand_python_testing-0.3.0b8/src/_algopy_testing/context_helpers}/txn_context.py +35 -27
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/decorators/arc4.py +45 -41
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/gtxn.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/itxn.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/account.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/application.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/asset.py +2 -2
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/contract.py +22 -23
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/template_variable.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/txn_fields.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/block.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/crypto.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/global_values.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/itxn.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/misc.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/txn.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/state/box.py +2 -2
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/state/global_state.py +2 -2
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/state/local_state.py +2 -2
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/state/utils.py +2 -3
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/utilities/log.py +1 -1
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_value_generators → algorand_python_testing-0.3.0b8/src/_algopy_testing/value_generators}/avm.py +1 -1
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_value_generators → algorand_python_testing-0.3.0b8/src/_algopy_testing/value_generators}/txn.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy/__init__.py +1 -1
- algorand_python_testing-0.3.0b8/src/algopy_testing/__init__.py +25 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/test_box.py +18 -18
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/test_box_map.py +4 -5
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/test_box_ref.py +4 -5
- algorand_python_testing-0.3.0b8/tests/models/test_contract.py +108 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/state/test_global_state.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/state/test_local_state.py +1 -1
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/test_context.py +2 -2
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/test_op.py +40 -45
- algorand_python_testing-0.3.0b7/src/_algopy_testing/_context_helpers/__init__.py +0 -13
- algorand_python_testing-0.3.0b7/src/algopy_testing/__init__.py +0 -25
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.coveragerc +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.editorconfig +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.github/pull_request_template.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.github/workflows/cd.yaml +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.github/workflows/ci.yaml +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.github/workflows/gh-pages.yaml +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.gitignore +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.pre-commit-config.yaml +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.vscode/extensions.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.vscode/launch.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/.vscode/settings.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/CONTRIBUTING.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/LICENSE +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/README.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/Makefile +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/_static/custom.css +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/algopy.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/api.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/conf.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/coverage.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/examples.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/glossary.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/index.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/make.bat +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/concepts.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/contract-testing.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/index.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/subroutines.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/README.md +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/auction/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/auction/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/auction/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/htlc_logicsig/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/htlc_logicsig/signature.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/htlc_logicsig/test_signature.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/marketplace/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/marketplace/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/marketplace/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/proof_of_attendance/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/proof_of_attendance/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/proof_of_attendance/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/scratch_storage/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/scratch_storage/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/scratch_storage/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/simple_voting/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/simple_voting/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/simple_voting/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/zk_whitelist/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/zk_whitelist/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/examples/zk_whitelist/test_contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/scripts/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/scripts/check_stubs_cov.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/scripts/refresh_test_artifacts.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/scripts/validate_examples.py +0 -0
- /algorand_python_testing-0.3.0b7/src/_algopy_testing/_compiled.py → /algorand_python_testing-0.3.0b8/src/_algopy_testing/compiled.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/constants.py +0 -0
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_context_helpers → algorand_python_testing-0.3.0b8/src/_algopy_testing/context_helpers}/ledger_context.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/decorators/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/decorators/subroutine.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/enums.py +0 -0
- /algorand_python_testing-0.3.0b7/src/_algopy_testing/_itxn_loader.py → /algorand_python_testing-0.3.0b8/src/_algopy_testing/itxn_loader.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/logicsig.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/models/unsigned_builtins.py +0 -0
- /algorand_python_testing-0.3.0b7/src/_algopy_testing/_mutable.py → /algorand_python_testing-0.3.0b8/src/_algopy_testing/mutable.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/constants.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/op/pure.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/primitives/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/primitives/biguint.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/primitives/bytes.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/primitives/string.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/primitives/uint64.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/protocols.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/py.typed +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/state/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/utilities/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/utilities/budget.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/utils.py +0 -0
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_value_generators → algorand_python_testing-0.3.0b8/src/_algopy_testing/value_generators}/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7/src/_algopy_testing/_value_generators → algorand_python_testing-0.3.0b8/src/_algopy_testing/value_generators}/arc4.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy/arc4.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy/gtxn.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy/itxn.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy/op.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy/py.typed +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/algopy_testing/py.typed +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/templates/.macros.j2 +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/templates/.release_notes.md.j2 +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/templates/CHANGELOG.md.j2 +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/conftest.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_abi_call.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_address.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_arc4_method_signature.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_bool.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_dynamic_array.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_dynamic_bytes.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_emit.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_static_array.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_string.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_struct.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_tuple.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_ufixednxm.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/arc4/test_uintn.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4ABIMethod/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4ABIMethod/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4InnerTxns/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4InnerTxns/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4PrimitiveOps/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4PrimitiveOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/BoxContract/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/BoxContract/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/BoxContract/data/BoxContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/BoxContract/data/BoxContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/BoxContract/data/BoxContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/CryptoOps/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/CryptoOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/GlobalStateValidator/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/GlobalStateValidator/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/MiscellaneousOps/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/MiscellaneousOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/PrimitiveOps/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/PrimitiveOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateMutations/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateMutations/data/Contract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateMutations/data/Contract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateMutations/data/Contract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateMutations/statemutations.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/contract.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/GlobalStateContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/ITxnOpsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/LocalStateContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/LocalStateContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAcctParamsGet.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAcctParamsGet.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAcctParamsGet.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppGlobalContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppLocalContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppParamsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAssetParamsContract.arc32.json +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/artifacts/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/common.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/conftest.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/contexts/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/test_asset.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/test_uenumerate.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/models/test_urange.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/primitives/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/primitives/conftest.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/primitives/test_biguint.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/primitives/test_bytes.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/primitives/test_string.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/primitives/test_uint64.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/state/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/state/conftest.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/state/test_mutations.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/test_miscellaneous_op.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/util.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/utilities/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/utilities/conftest.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/utilities/test_log.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/value_generators/__init__.py +0 -0
- {algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/tests/value_generators/test_avm.py +0 -0
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
|
+
## v0.3.0-beta.8 (2024-08-22)
|
|
3
|
+
|
|
4
|
+
### Feature
|
|
5
|
+
|
|
6
|
+
* include ARC4 results in log, and handle > 15 ARC4 arguments (#18) ([`fd83ee8`](https://github.com/algorandfoundation/algorand-python-testing/commit/fd83ee8525a393d4a1a66f20acdb661906d84b51))
|
|
7
|
+
|
|
2
8
|
## v0.3.0-beta.7 (2024-08-21)
|
|
3
9
|
|
|
4
10
|
## v0.3.0-beta.6 (2024-08-21)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: algorand-python-testing
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.0b8
|
|
4
4
|
Summary: Algorand Python testing library
|
|
5
5
|
Project-URL: Documentation, https://github.com/algorandfoundation/puya/tree/main/algopy_testing#README.md
|
|
6
6
|
Project-URL: Issues, https://github.com/algorandfoundation/puya/issues
|
{algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/docs/testing-guide/opcodes.md
RENAMED
|
@@ -6,7 +6,6 @@ The [coverage](coverage.md) file provides a comprehensive list of all opcodes an
|
|
|
6
6
|
|
|
7
7
|
```{testsetup}
|
|
8
8
|
import algopy
|
|
9
|
-
import algopy_testing
|
|
10
9
|
from algopy_testing import algopy_testing_context
|
|
11
10
|
|
|
12
11
|
# Create the context manager for snippets below
|
|
@@ -29,7 +28,7 @@ The following opcodes are demonstrated:
|
|
|
29
28
|
- `op.ecdsa_verify`
|
|
30
29
|
|
|
31
30
|
```{testcode}
|
|
32
|
-
|
|
31
|
+
from algopy import op
|
|
33
32
|
|
|
34
33
|
# SHA256 hash
|
|
35
34
|
data = algopy.Bytes(b"Hello, World!")
|
|
@@ -59,7 +58,7 @@ The following opcodes are demonstrated:
|
|
|
59
58
|
- `op.setbit_uint64`
|
|
60
59
|
|
|
61
60
|
```{testcode}
|
|
62
|
-
|
|
61
|
+
from algopy import op
|
|
63
62
|
|
|
64
63
|
# Addition with carry
|
|
65
64
|
result, carry = op.addw(algopy.UInt64(2**63), algopy.UInt64(2**63))
|
|
@@ -80,7 +79,7 @@ These types necessitate interaction with the transaction context:
|
|
|
80
79
|
### algopy.op.Global
|
|
81
80
|
|
|
82
81
|
```{testcode}
|
|
83
|
-
|
|
82
|
+
from algopy import op
|
|
84
83
|
|
|
85
84
|
class MyContract(algopy.ARC4Contract):
|
|
86
85
|
@algopy.arc4.abimethod
|
|
@@ -102,12 +101,12 @@ assert result == algopy.UInt64(101000)
|
|
|
102
101
|
### algopy.op.Txn
|
|
103
102
|
|
|
104
103
|
```{testcode}
|
|
105
|
-
|
|
104
|
+
from algopy import op
|
|
106
105
|
|
|
107
106
|
class MyContract(algopy.ARC4Contract):
|
|
108
107
|
@algopy.arc4.abimethod
|
|
109
|
-
def check_txn_fields(self) -> algopy.
|
|
110
|
-
return op.Txn.sender
|
|
108
|
+
def check_txn_fields(self) -> algopy.arc4.Address:
|
|
109
|
+
return algopy.arc4.Address(op.Txn.sender)
|
|
111
110
|
|
|
112
111
|
... # setup context (below assumes available under 'ctx' variable)
|
|
113
112
|
|
|
@@ -121,7 +120,7 @@ assert result == custom_sender
|
|
|
121
120
|
### algopy.op.AssetHoldingGet
|
|
122
121
|
|
|
123
122
|
```{testcode}
|
|
124
|
-
|
|
123
|
+
from algopy import op
|
|
125
124
|
|
|
126
125
|
class AssetContract(algopy.ARC4Contract):
|
|
127
126
|
@algopy.arc4.abimethod
|
|
@@ -141,7 +140,7 @@ assert result == algopy.UInt64(5000)
|
|
|
141
140
|
### algopy.op.AppGlobal
|
|
142
141
|
|
|
143
142
|
```{testcode}
|
|
144
|
-
|
|
143
|
+
from algopy import op
|
|
145
144
|
|
|
146
145
|
class StateContract(algopy.ARC4Contract):
|
|
147
146
|
@algopy.arc4.abimethod
|
|
@@ -162,7 +161,7 @@ assert stored_value == 42
|
|
|
162
161
|
### algopy.op.Block
|
|
163
162
|
|
|
164
163
|
```{testcode}
|
|
165
|
-
|
|
164
|
+
from algopy import op
|
|
166
165
|
|
|
167
166
|
class BlockInfoContract(algopy.ARC4Contract):
|
|
168
167
|
@algopy.arc4.abimethod
|
|
@@ -180,7 +179,7 @@ assert seed == algopy.op.itob(123456)
|
|
|
180
179
|
### algopy.op.AcctParamsGet
|
|
181
180
|
|
|
182
181
|
```{testcode}
|
|
183
|
-
|
|
182
|
+
from algopy import op
|
|
184
183
|
|
|
185
184
|
class AccountParamsContract(algopy.ARC4Contract):
|
|
186
185
|
@algopy.arc4.abimethod
|
|
@@ -205,7 +204,7 @@ class AppParamsContract(algopy.ARC4Contract):
|
|
|
205
204
|
def get_app_creator(self, app_id: algopy.Application) -> algopy.arc4.Address:
|
|
206
205
|
creator, exists = algopy.op.AppParamsGet.app_creator(app_id)
|
|
207
206
|
assert exists
|
|
208
|
-
return creator
|
|
207
|
+
return algopy.arc4.Address(creator)
|
|
209
208
|
|
|
210
209
|
... # setup context (below assumes available under 'ctx' variable)
|
|
211
210
|
|
|
@@ -218,8 +217,7 @@ assert creator == context.default_sender
|
|
|
218
217
|
### algopy.op.AssetParamsGet
|
|
219
218
|
|
|
220
219
|
```{testcode}
|
|
221
|
-
from
|
|
222
|
-
import algopy.op as op
|
|
220
|
+
from algopy import op
|
|
223
221
|
|
|
224
222
|
class AssetParamsContract(algopy.ARC4Contract):
|
|
225
223
|
@algopy.arc4.abimethod
|
|
@@ -239,8 +237,7 @@ assert total == algopy.UInt64(1000000)
|
|
|
239
237
|
### algopy.op.Box
|
|
240
238
|
|
|
241
239
|
```{testcode}
|
|
242
|
-
from
|
|
243
|
-
import algopy.op as op
|
|
240
|
+
from algopy import op
|
|
244
241
|
|
|
245
242
|
class BoxStorageContract(algopy.ARC4Contract):
|
|
246
243
|
@algopy.arc4.abimethod
|
|
@@ -329,23 +326,22 @@ assert result == 11
|
|
|
329
326
|
```{testcode}
|
|
330
327
|
from unittest.mock import patch, MagicMock
|
|
331
328
|
import algopy
|
|
332
|
-
from algopy_testing.primitives import Bytes
|
|
333
329
|
|
|
334
330
|
def test_mock_vrf_verify():
|
|
335
|
-
mock_result = (Bytes(b'mock_output'), True)
|
|
331
|
+
mock_result = (algopy.Bytes(b'mock_output'), True)
|
|
336
332
|
with patch('algopy.op.vrf_verify', return_value=mock_result) as mock_vrf_verify:
|
|
337
333
|
result = algopy.op.vrf_verify(
|
|
338
334
|
algopy.op.VrfVerify.VrfAlgorand,
|
|
339
|
-
Bytes(b'proof'),
|
|
340
|
-
Bytes(b'message'),
|
|
341
|
-
Bytes(b'public_key')
|
|
335
|
+
algopy.Bytes(b'proof'),
|
|
336
|
+
algopy.Bytes(b'message'),
|
|
337
|
+
algopy.Bytes(b'public_key')
|
|
342
338
|
)
|
|
343
339
|
assert result == mock_result
|
|
344
340
|
mock_vrf_verify.assert_called_once_with(
|
|
345
341
|
algopy.op.VrfVerify.VrfAlgorand,
|
|
346
|
-
Bytes(b'proof'),
|
|
347
|
-
Bytes(b'message'),
|
|
348
|
-
Bytes(b'public_key')
|
|
342
|
+
algopy.Bytes(b'proof'),
|
|
343
|
+
algopy.Bytes(b'message'),
|
|
344
|
+
algopy.Bytes(b'public_key')
|
|
349
345
|
)
|
|
350
346
|
|
|
351
347
|
test_mock_vrf_verify()
|
|
@@ -356,19 +352,18 @@ test_mock_vrf_verify()
|
|
|
356
352
|
```{testcode}
|
|
357
353
|
from unittest.mock import patch, MagicMock
|
|
358
354
|
import algopy
|
|
359
|
-
from algopy_testing.primitives import Bytes
|
|
360
355
|
|
|
361
356
|
def test_mock_elliptic_curve_decompress():
|
|
362
|
-
mock_result = (Bytes(b'x_coord'), Bytes(b'y_coord'))
|
|
357
|
+
mock_result = (algopy.Bytes(b'x_coord'), algopy.Bytes(b'y_coord'))
|
|
363
358
|
with patch('algopy.op.EllipticCurve.decompress', return_value=mock_result) as mock_decompress:
|
|
364
359
|
result = algopy.op.EllipticCurve.decompress(
|
|
365
360
|
algopy.op.EC.BN254g1,
|
|
366
|
-
Bytes(b'compressed_point')
|
|
361
|
+
algopy.Bytes(b'compressed_point')
|
|
367
362
|
)
|
|
368
363
|
assert result == mock_result
|
|
369
364
|
mock_decompress.assert_called_once_with(
|
|
370
365
|
algopy.op.EC.BN254g1,
|
|
371
|
-
Bytes(b'compressed_point')
|
|
366
|
+
algopy.Bytes(b'compressed_point')
|
|
372
367
|
)
|
|
373
368
|
|
|
374
369
|
test_mock_elliptic_curve_decompress()
|
|
@@ -115,8 +115,8 @@ from algopy_testing import AlgopyTestContext, algopy_testing_context
|
|
|
115
115
|
|
|
116
116
|
class SimpleContract(algopy.ARC4Contract):
|
|
117
117
|
@algopy.arc4.abimethod
|
|
118
|
-
def check_sender(self) -> algopy.
|
|
119
|
-
return algopy.Txn.sender
|
|
118
|
+
def check_sender(self) -> algopy.arc4.Address:
|
|
119
|
+
return algopy.arc4.Address(algopy.Txn.sender)
|
|
120
120
|
...
|
|
121
121
|
|
|
122
122
|
# Create a contract instance
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "algorand-python-testing"
|
|
7
|
-
version = "0.3.0-beta.
|
|
7
|
+
version = "0.3.0-beta.8"
|
|
8
8
|
description = 'Algorand Python testing library'
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -41,7 +41,7 @@ Source = "https://github.com/algorandfoundation/puya/tree/main/algopy_testing"
|
|
|
41
41
|
allow-direct-references = true
|
|
42
42
|
|
|
43
43
|
[tool.hatch.build.targets.wheel]
|
|
44
|
-
packages = ["src/algopy", 'src/algopy_testing']
|
|
44
|
+
packages = ["src/algopy", 'src/algopy_testing', 'src/_algopy_testing']
|
|
45
45
|
|
|
46
46
|
[[tool.hatch.envs.all.matrix]]
|
|
47
47
|
python = ["3.12"]
|
|
@@ -126,7 +126,6 @@ clean_dist = "rm -rf dist"
|
|
|
126
126
|
|
|
127
127
|
# docs environment
|
|
128
128
|
[tool.hatch.envs.docs]
|
|
129
|
-
detached = true
|
|
130
129
|
path = ".venv.docs"
|
|
131
130
|
type = "virtual"
|
|
132
131
|
python = "3.12"
|
|
@@ -141,13 +140,13 @@ dependencies = [
|
|
|
141
140
|
"ipykernel",
|
|
142
141
|
"pytest",
|
|
143
142
|
"py-algorand-sdk",
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
143
|
+
]
|
|
144
|
+
# environment has algopy_testing included as an editable dependency
|
|
145
|
+
# however it also includes the package dependencies
|
|
146
|
+
# the stubs can't be in the same as the project when it is editable
|
|
147
|
+
# so explicitly remove them
|
|
148
|
+
post-install-commands = [
|
|
149
|
+
"hatch run docs:pip uninstall -y algorand-python",
|
|
151
150
|
]
|
|
152
151
|
|
|
153
152
|
[tool.hatch.envs.docs.scripts]
|
{algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/__init__.py
RENAMED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
from _algopy_testing import arc4, gtxn, itxn
|
|
2
|
-
from _algopy_testing._context_helpers.context_storage import algopy_testing_context
|
|
3
|
-
from _algopy_testing._context_helpers.ledger_context import LedgerContext
|
|
4
|
-
from _algopy_testing._context_helpers.txn_context import TransactionContext
|
|
5
|
-
from _algopy_testing._itxn_loader import ITxnGroupLoader, ITxnLoader
|
|
6
|
-
from _algopy_testing._value_generators.arc4 import ARC4ValueGenerator
|
|
7
|
-
from _algopy_testing._value_generators.avm import AVMValueGenerator
|
|
8
|
-
from _algopy_testing._value_generators.txn import TxnValueGenerator
|
|
9
2
|
from _algopy_testing.context import AlgopyTestContext
|
|
3
|
+
from _algopy_testing.context_helpers.context_storage import algopy_testing_context
|
|
4
|
+
from _algopy_testing.context_helpers.ledger_context import LedgerContext
|
|
5
|
+
from _algopy_testing.context_helpers.txn_context import TransactionContext
|
|
10
6
|
from _algopy_testing.decorators.subroutine import subroutine
|
|
11
7
|
from _algopy_testing.enums import OnCompleteAction, TransactionType
|
|
8
|
+
from _algopy_testing.itxn_loader import ITxnGroupLoader, ITxnLoader
|
|
12
9
|
from _algopy_testing.models import (
|
|
13
10
|
Account,
|
|
14
11
|
Application,
|
|
@@ -24,6 +21,9 @@ from _algopy_testing.models import (
|
|
|
24
21
|
)
|
|
25
22
|
from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64
|
|
26
23
|
from _algopy_testing.state import Box, BoxMap, BoxRef, GlobalState, LocalState
|
|
24
|
+
from _algopy_testing.value_generators.arc4 import ARC4ValueGenerator
|
|
25
|
+
from _algopy_testing.value_generators.avm import AVMValueGenerator
|
|
26
|
+
from _algopy_testing.value_generators.txn import TxnValueGenerator
|
|
27
27
|
|
|
28
28
|
# TODO: clean up and ensure only algopy_testing namespace specific user facing abstractions
|
|
29
29
|
# are exposed Only keep the _value_generators, ledger_context, txn_context,
|
{algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/arc4.py
RENAMED
|
@@ -8,11 +8,6 @@ import typing
|
|
|
8
8
|
import algosdk
|
|
9
9
|
from Cryptodome.Hash import SHA512
|
|
10
10
|
|
|
11
|
-
from _algopy_testing._mutable import (
|
|
12
|
-
MutableBytes,
|
|
13
|
-
add_mutable_callback,
|
|
14
|
-
set_item_on_mutate,
|
|
15
|
-
)
|
|
16
11
|
from _algopy_testing.constants import (
|
|
17
12
|
ARC4_RETURN_PREFIX,
|
|
18
13
|
BITS_IN_BYTE,
|
|
@@ -21,6 +16,11 @@ from _algopy_testing.constants import (
|
|
|
21
16
|
UINT512_SIZE,
|
|
22
17
|
)
|
|
23
18
|
from _algopy_testing.models.account import Account
|
|
19
|
+
from _algopy_testing.mutable import (
|
|
20
|
+
MutableBytes,
|
|
21
|
+
add_mutable_callback,
|
|
22
|
+
set_item_on_mutate,
|
|
23
|
+
)
|
|
24
24
|
from _algopy_testing.primitives import Bytes
|
|
25
25
|
from _algopy_testing.protocols import BytesBacked
|
|
26
26
|
from _algopy_testing.utils import (
|
|
@@ -62,6 +62,8 @@ __all__ = [
|
|
|
62
62
|
"UInt8",
|
|
63
63
|
"UIntN",
|
|
64
64
|
"abi_call",
|
|
65
|
+
"arc4_create",
|
|
66
|
+
"arc4_update",
|
|
65
67
|
"arc4_signature",
|
|
66
68
|
"emit",
|
|
67
69
|
]
|
|
@@ -216,7 +218,7 @@ class String(_ABIEncoded):
|
|
|
216
218
|
f"value must be a string or String type, not {type(value).__name__!r}"
|
|
217
219
|
)
|
|
218
220
|
|
|
219
|
-
self._value = len(bytes_value)
|
|
221
|
+
self._value = as_bytes(_encode_length(len(bytes_value)) + bytes_value)
|
|
220
222
|
|
|
221
223
|
@property
|
|
222
224
|
def native(self) -> algopy.String:
|
|
@@ -533,25 +535,12 @@ class Byte(UIntN[typing.Literal[8]]):
|
|
|
533
535
|
|
|
534
536
|
|
|
535
537
|
UInt8: typing.TypeAlias = UIntN[typing.Literal[8]]
|
|
536
|
-
"""An ARC4 UInt8."""
|
|
537
|
-
|
|
538
538
|
UInt16: typing.TypeAlias = UIntN[typing.Literal[16]]
|
|
539
|
-
"""An ARC4 UInt16."""
|
|
540
|
-
|
|
541
539
|
UInt32: typing.TypeAlias = UIntN[typing.Literal[32]]
|
|
542
|
-
"""An ARC4 UInt32."""
|
|
543
|
-
|
|
544
540
|
UInt64: typing.TypeAlias = UIntN[typing.Literal[64]]
|
|
545
|
-
"""An ARC4 UInt64."""
|
|
546
|
-
|
|
547
541
|
UInt128: typing.TypeAlias = BigUIntN[typing.Literal[128]]
|
|
548
|
-
"""An ARC4 UInt128."""
|
|
549
|
-
|
|
550
542
|
UInt256: typing.TypeAlias = BigUIntN[typing.Literal[256]]
|
|
551
|
-
"""An ARC4 UInt256."""
|
|
552
|
-
|
|
553
543
|
UInt512: typing.TypeAlias = BigUIntN[typing.Literal[512]]
|
|
554
|
-
"""An ARC4 UInt512."""
|
|
555
544
|
|
|
556
545
|
|
|
557
546
|
class _BoolTypeInfo(_TypeInfo):
|
|
@@ -665,6 +654,8 @@ class StaticArray(
|
|
|
665
654
|
super().__init__()
|
|
666
655
|
items = _check_is_arc4(_items)
|
|
667
656
|
for item in items:
|
|
657
|
+
if len(items) != self._type_info.size:
|
|
658
|
+
raise TypeError(f"expected {self._type_info.size} items, not {len(items)}")
|
|
668
659
|
if self._type_info.item_type != item._type_info:
|
|
669
660
|
raise TypeError(
|
|
670
661
|
f"item must be of type {self._type_info.item_type!r}, not {item._type_info!r}"
|
|
@@ -735,10 +726,10 @@ class Address(StaticArray[Byte, typing.Literal[32]]):
|
|
|
735
726
|
bytes_value = algosdk.encoding.decode_address(value)
|
|
736
727
|
except Exception as e:
|
|
737
728
|
raise ValueError(f"cannot encode the following address: {value!r}") from e
|
|
729
|
+
elif isinstance(value, Account):
|
|
730
|
+
bytes_value = value.bytes.value
|
|
738
731
|
else:
|
|
739
|
-
bytes_value = (
|
|
740
|
-
value.bytes.value if isinstance(value, Account) else as_bytes(value, max_size=32)
|
|
741
|
-
)
|
|
732
|
+
bytes_value = as_bytes(value)
|
|
742
733
|
if len(bytes_value) != 32:
|
|
743
734
|
raise ValueError(f"expected 32 bytes, got: {len(bytes_value)}")
|
|
744
735
|
self._value = bytes_value
|
|
@@ -1124,14 +1115,6 @@ class Struct(MutableBytes, _ABIEncoded, metaclass=_StructMeta): # type: ignore[
|
|
|
1124
1115
|
tuple_value = tuple_type.from_bytes(value)
|
|
1125
1116
|
return cls(*tuple_value.native)
|
|
1126
1117
|
|
|
1127
|
-
@classmethod
|
|
1128
|
-
def from_log(cls, log: algopy.Bytes, /) -> typing.Self:
|
|
1129
|
-
"""Load an ABI type from application logs, checking for the ABI return prefix
|
|
1130
|
-
`0x151f7c75`"""
|
|
1131
|
-
if log[:4] == ARC4_RETURN_PREFIX:
|
|
1132
|
-
return cls.from_bytes(log[4:])
|
|
1133
|
-
raise ValueError("ABI return prefix not found")
|
|
1134
|
-
|
|
1135
1118
|
@property
|
|
1136
1119
|
def bytes(self) -> algopy.Bytes:
|
|
1137
1120
|
"""Get the underlying bytes[]"""
|
|
@@ -1212,7 +1195,7 @@ def native_value_to_arc4(value: object) -> _ABIEncoded: # noqa: PLR0911
|
|
|
1212
1195
|
if isinstance(value, algopy.String):
|
|
1213
1196
|
return String(value)
|
|
1214
1197
|
if isinstance(value, tuple):
|
|
1215
|
-
return Tuple(value)
|
|
1198
|
+
return Tuple(tuple(map(native_value_to_arc4, value)))
|
|
1216
1199
|
raise TypeError(f"Unsupported type: {type(value).__name__}")
|
|
1217
1200
|
|
|
1218
1201
|
|
{algorand_python_testing-0.3.0b7 → algorand_python_testing-0.3.0b8}/src/_algopy_testing/context.py
RENAMED
|
@@ -4,8 +4,8 @@ import typing
|
|
|
4
4
|
|
|
5
5
|
import algosdk
|
|
6
6
|
|
|
7
|
-
from _algopy_testing.
|
|
8
|
-
from _algopy_testing.
|
|
7
|
+
from _algopy_testing.context_helpers import LedgerContext, TransactionContext
|
|
8
|
+
from _algopy_testing.value_generators import AlgopyValueGenerator
|
|
9
9
|
|
|
10
10
|
if typing.TYPE_CHECKING:
|
|
11
11
|
from collections.abc import Sequence
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from _algopy_testing.context_helpers.context_storage import (
|
|
2
|
+
algopy_testing_context,
|
|
3
|
+
lazy_context,
|
|
4
|
+
)
|
|
5
|
+
from _algopy_testing.context_helpers.ledger_context import LedgerContext
|
|
6
|
+
from _algopy_testing.context_helpers.txn_context import TransactionContext
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"LedgerContext",
|
|
10
|
+
"TransactionContext",
|
|
11
|
+
"algopy_testing_context",
|
|
12
|
+
"lazy_context",
|
|
13
|
+
]
|
|
@@ -9,13 +9,13 @@ if typing.TYPE_CHECKING:
|
|
|
9
9
|
|
|
10
10
|
import algopy
|
|
11
11
|
|
|
12
|
-
from _algopy_testing._context_helpers.ledger_context import LedgerContext
|
|
13
|
-
from _algopy_testing._context_helpers.txn_context import TransactionContext, TransactionGroup
|
|
14
|
-
from _algopy_testing._value_generators import AlgopyValueGenerator
|
|
15
12
|
from _algopy_testing.context import AlgopyTestContext
|
|
13
|
+
from _algopy_testing.context_helpers.ledger_context import LedgerContext
|
|
14
|
+
from _algopy_testing.context_helpers.txn_context import TransactionContext, TransactionGroup
|
|
16
15
|
from _algopy_testing.models.account import AccountContextData
|
|
17
16
|
from _algopy_testing.models.application import ApplicationContextData
|
|
18
17
|
from _algopy_testing.models.asset import AssetFields
|
|
18
|
+
from _algopy_testing.value_generators import AlgopyValueGenerator
|
|
19
19
|
|
|
20
20
|
_var: ContextVar[AlgopyTestContext] = ContextVar("_var")
|
|
21
21
|
|
|
@@ -47,7 +47,7 @@ class _InternalContext:
|
|
|
47
47
|
def any(self) -> AlgopyValueGenerator:
|
|
48
48
|
return self.value.any
|
|
49
49
|
|
|
50
|
-
def
|
|
50
|
+
def get_active_txn_overrides(self) -> dict[str, typing.Any]:
|
|
51
51
|
active_group = self.txn._active_group
|
|
52
52
|
if active_group is None:
|
|
53
53
|
return {}
|
|
@@ -5,7 +5,7 @@ import typing
|
|
|
5
5
|
|
|
6
6
|
import algosdk
|
|
7
7
|
|
|
8
|
-
from _algopy_testing
|
|
8
|
+
from _algopy_testing import gtxn
|
|
9
9
|
from _algopy_testing.decorators.arc4 import (
|
|
10
10
|
check_routing_conditions,
|
|
11
11
|
create_abimethod_txns,
|
|
@@ -14,22 +14,20 @@ from _algopy_testing.decorators.arc4 import (
|
|
|
14
14
|
get_ordered_args,
|
|
15
15
|
)
|
|
16
16
|
from _algopy_testing.enums import OnCompleteAction
|
|
17
|
+
from _algopy_testing.gtxn import TransactionBase
|
|
18
|
+
from _algopy_testing.itxn import InnerTransaction, submit_txns
|
|
19
|
+
from _algopy_testing.itxn_loader import ITxnGroupLoader, ITxnLoader
|
|
20
|
+
from _algopy_testing.models import Application
|
|
21
|
+
from _algopy_testing.primitives import UInt64
|
|
17
22
|
|
|
18
23
|
if typing.TYPE_CHECKING:
|
|
19
24
|
from collections.abc import Callable, Iterator, Sequence
|
|
20
25
|
|
|
21
26
|
import algopy
|
|
22
27
|
|
|
23
|
-
from _algopy_testing.
|
|
28
|
+
from _algopy_testing.itxn_loader import InnerTransactionResultType
|
|
24
29
|
from _algopy_testing.models.txn_fields import ActiveTransactionFields
|
|
25
30
|
|
|
26
|
-
from _algopy_testing import gtxn
|
|
27
|
-
from _algopy_testing._itxn_loader import ITxnLoader
|
|
28
|
-
from _algopy_testing.gtxn import TransactionBase
|
|
29
|
-
from _algopy_testing.itxn import InnerTransaction, submit_txns
|
|
30
|
-
from _algopy_testing.models import Application
|
|
31
|
-
from _algopy_testing.primitives import UInt64
|
|
32
|
-
|
|
33
31
|
TReturn = typing.TypeVar("TReturn")
|
|
34
32
|
TParamSpec = typing.ParamSpec("TParamSpec")
|
|
35
33
|
|
|
@@ -71,19 +69,19 @@ class TransactionContext:
|
|
|
71
69
|
@contextlib.contextmanager
|
|
72
70
|
def _maybe_implicit_txn_group(
|
|
73
71
|
self, gtxns: typing.Sequence[algopy.gtxn.TransactionBase]
|
|
74
|
-
) -> Iterator[
|
|
72
|
+
) -> Iterator[TransactionGroup]:
|
|
75
73
|
"""Only creates a group if there isn't one already active."""
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
ctx: typing.ContextManager[None] = self.create_group(gtxns)
|
|
79
|
-
else:
|
|
74
|
+
expected_app_id = gtxns[-1].app_id.id
|
|
75
|
+
with self._get_or_create_group() as active_group:
|
|
80
76
|
if not active_group.txns:
|
|
81
77
|
active_group._set_txn_group(gtxns)
|
|
82
|
-
elif
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
elif expected_app_id != active_group.active_app_id:
|
|
79
|
+
from _algopy_testing.context_helpers import lazy_context
|
|
80
|
+
|
|
81
|
+
app_data = lazy_context.get_app_data(active_group.active_app_id)
|
|
82
|
+
if not (app_data.is_creating and expected_app_id == 0):
|
|
83
|
+
raise ValueError("Executing contract has different app_id than active txn")
|
|
84
|
+
yield active_group
|
|
87
85
|
|
|
88
86
|
def defer_app_call(
|
|
89
87
|
self,
|
|
@@ -113,6 +111,7 @@ class TransactionContext:
|
|
|
113
111
|
raise ValueError("The provided method must be an instance method of an ARC4 contract")
|
|
114
112
|
|
|
115
113
|
app_id = contract.__app_id__
|
|
114
|
+
allow_actions = arc4_metadata.allow_actions or [OnCompleteAction.NoOp]
|
|
116
115
|
# Handle ABI methods
|
|
117
116
|
if arc4_metadata.arc4_signature:
|
|
118
117
|
ordered_args = get_ordered_args(fn, args, kwargs)
|
|
@@ -120,11 +119,11 @@ class TransactionContext:
|
|
|
120
119
|
app_id=app_id,
|
|
121
120
|
arc4_signature=arc4_metadata.arc4_signature,
|
|
122
121
|
args=ordered_args,
|
|
123
|
-
allow_actions=
|
|
122
|
+
allow_actions=allow_actions,
|
|
124
123
|
)
|
|
125
124
|
# Handle bare methods
|
|
126
125
|
else:
|
|
127
|
-
txns = create_baremethod_txns(app_id)
|
|
126
|
+
txns = create_baremethod_txns(app_id, allow_actions)
|
|
128
127
|
|
|
129
128
|
return DeferredAppCall(app_id=app_id, txns=txns, method=method, args=args, kwargs=kwargs)
|
|
130
129
|
|
|
@@ -165,7 +164,7 @@ class TransactionContext:
|
|
|
165
164
|
active_txn_index = processed_gtxns.index(last_app_call_txn)
|
|
166
165
|
|
|
167
166
|
previous_group = self._active_group
|
|
168
|
-
self._active_group = TransactionGroup(
|
|
167
|
+
active_group = self._active_group = TransactionGroup(
|
|
169
168
|
txns=processed_gtxns,
|
|
170
169
|
active_txn_index=active_txn_index,
|
|
171
170
|
active_txn_overrides=typing.cast(dict[str, typing.Any], active_txn_overrides),
|
|
@@ -173,10 +172,21 @@ class TransactionContext:
|
|
|
173
172
|
try:
|
|
174
173
|
yield
|
|
175
174
|
finally:
|
|
176
|
-
if
|
|
177
|
-
self._groups.append(
|
|
175
|
+
if active_group.txns:
|
|
176
|
+
self._groups.append(active_group)
|
|
178
177
|
self._active_group = previous_group
|
|
179
178
|
|
|
179
|
+
@contextlib.contextmanager
|
|
180
|
+
def _get_or_create_group(self) -> Iterator[TransactionGroup]:
|
|
181
|
+
if not self._active_group:
|
|
182
|
+
ctx: typing.ContextManager[None] = self.create_group()
|
|
183
|
+
else:
|
|
184
|
+
ctx = contextlib.nullcontext()
|
|
185
|
+
with ctx:
|
|
186
|
+
active_group = self._active_group
|
|
187
|
+
assert active_group is not None
|
|
188
|
+
yield active_group
|
|
189
|
+
|
|
180
190
|
@property
|
|
181
191
|
def last_group(self) -> TransactionGroup:
|
|
182
192
|
if not self._groups:
|
|
@@ -212,9 +222,7 @@ class TransactionGroup:
|
|
|
212
222
|
self.active_txn_index = 0
|
|
213
223
|
return
|
|
214
224
|
if not all(isinstance(txn, gtxn.TransactionBase) for txn in txns):
|
|
215
|
-
raise ValueError(
|
|
216
|
-
"All transactions must be instances of TransactionBase or DeferredAppCall"
|
|
217
|
-
)
|
|
225
|
+
raise ValueError("All transactions must be instances of TransactionBase")
|
|
218
226
|
|
|
219
227
|
if len(txns) > algosdk.constants.TX_GROUP_LIMIT:
|
|
220
228
|
raise ValueError(
|