algorand-python-testing 1.1.0__tar.gz → 1.2.0b1__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-1.1.0 → algorand_python_testing-1.2.0b1}/CHANGELOG.md +6 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/PKG-INFO +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/coverage.md +2 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/avm-types.md +16 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/pyproject.toml +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/__init__.py +2 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/decorators/arc4.py +3 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/__init__.py +2 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/bytes.py +7 -8
- algorand_python_testing-1.2.0b1/src/_algopy_testing/primitives/fixed_bytes.py +336 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/serialize.py +10 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/utils.py +2 -5
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utils.py +2 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/avm.py +15 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/__init__.py +2 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_arc4_method_signature.py +9 -3
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/Contract.approval.teal +7 -7
- algorand_python_testing-1.2.0b1/tests/artifacts/AVM12/data/Contract.arc56.json +119 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/Contract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV0.approval.teal +3 -5
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV0.arc56.json +6 -18
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV0.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV1.approval.teal +3 -5
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV1.arc56.json +6 -18
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/data/ContractV1.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/contract.py +5 -2
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.approval.teal +96 -84
- algorand_python_testing-1.2.0b1/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +496 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.approval.teal +3 -5
- algorand_python_testing-1.2.0b1/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +88 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.approval.teal +13 -15
- algorand_python_testing-1.2.0b1/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +1575 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/Contract.approval.teal +186 -178
- algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/Contract.arc56.json +367 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/Contract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/DynamicArrayInitContract.approval.teal +48 -82
- algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +131 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/DynamicArrayInitContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayContract.approval.teal +106 -108
- algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +828 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/StaticSizeContract.approval.teal +15 -21
- algorand_python_testing-1.2.0b1/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +322 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/StaticSizeContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/data/BoxContract.approval.teal +49 -47
- algorand_python_testing-1.2.0b1/tests/artifacts/BoxContract/data/BoxContract.arc56.json +768 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/data/BoxContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/data/MyContract.approval.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/data/MyContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.approval.teal +3 -5
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.arc56.json +6 -19
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.approval.teal +10 -5
- algorand_python_testing-1.2.0b1/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +169 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/data/CryptoOpsContract.approval.teal +7 -9
- algorand_python_testing-1.2.0b1/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +437 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/data/CryptoOpsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.approval.teal +5 -5
- algorand_python_testing-1.2.0b1/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +99 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.approval.teal +2 -4
- algorand_python_testing-1.2.0b1/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +999 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/contract.py +3 -2
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.approval.teal +11 -8
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc56.json +10 -19
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/StateMutations.approval.teal +2 -4
- algorand_python_testing-1.2.0b1/tests/artifacts/StateMutations/data/StateMutations.arc56.json +258 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/StateMutations.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.approval.teal +1 -3
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.arc56.json +20 -32
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/ITxnOpsContract.approval.teal +3 -3
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +83 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/ITxnOpsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/LocalStateContract.approval.teal +2 -4
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +565 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/LocalStateContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.approval.teal +2 -4
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +466 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalContract.approval.teal +1 -3
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +241 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalExContract.approval.teal +2 -4
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +97 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalExContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalContract.approval.teal +4 -6
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +310 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.approval.teal +5 -7
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc56.json +6 -19
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppParamsContract.approval.teal +1 -3
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +285 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppParamsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.approval.teal +4 -6
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc56.json +6 -19
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetParamsContract.approval.teal +2 -4
- algorand_python_testing-1.2.0b1/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +354 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetParamsContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.approval.teal +2 -4
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.arc56.json +6 -19
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.clear.teal +1 -1
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_box.py +15 -1
- algorand_python_testing-1.2.0b1/tests/primitives/test_fixed_bytes.py +695 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/test_log.py +5 -3
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/test_size_of.py +4 -2
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/value_generators/test_avm.py +15 -2
- algorand_python_testing-1.1.0/tests/artifacts/AVM12/data/Contract.arc56.json +0 -131
- algorand_python_testing-1.1.0/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc56.json +0 -498
- algorand_python_testing-1.1.0/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc56.json +0 -101
- algorand_python_testing-1.1.0/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc56.json +0 -1587
- algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/Contract.arc56.json +0 -379
- algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/DynamicArrayInitContract.arc56.json +0 -144
- algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/ImmutableArrayContract.arc56.json +0 -840
- algorand_python_testing-1.1.0/tests/artifacts/Arrays/data/StaticSizeContract.arc56.json +0 -334
- algorand_python_testing-1.1.0/tests/artifacts/BoxContract/data/BoxContract.arc56.json +0 -780
- algorand_python_testing-1.1.0/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc56.json +0 -181
- algorand_python_testing-1.1.0/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc56.json +0 -450
- algorand_python_testing-1.1.0/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc56.json +0 -111
- algorand_python_testing-1.1.0/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc56.json +0 -1012
- algorand_python_testing-1.1.0/tests/artifacts/StateMutations/data/StateMutations.arc56.json +0 -276
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/ITxnOpsContract.arc56.json +0 -96
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/LocalStateContract.arc56.json +0 -583
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc56.json +0 -478
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppGlobalContract.arc56.json +0 -254
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc56.json +0 -104
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppLocalContract.arc56.json +0 -329
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAppParamsContract.arc56.json +0 -297
- algorand_python_testing-1.1.0/tests/artifacts/StateOps/data/StateAssetParamsContract.arc56.json +0 -366
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.coveragerc +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.editorconfig +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/dependabot.yml +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/pull_request_template.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/workflows/cd.yaml +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/workflows/ci.yaml +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.github/workflows/gh-pages.yaml +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.gitignore +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.pre-commit-config.yaml +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.vscode/extensions.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.vscode/launch.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/.vscode/settings.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/CONTRIBUTING.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/LICENSE +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/README.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/Makefile +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/_static/custom.css +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/algopy.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/api.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/conf.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/examples.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/faq.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/index.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/make.bat +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/arc4-types.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/concepts.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/contract-testing.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/index.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/opcodes.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/signature-testing.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/state-management.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/subroutines.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/transactions.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/README.md +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/auction/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/auction/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/auction/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/htlc_logicsig/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/htlc_logicsig/signature.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/htlc_logicsig/test_signature.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/marketplace/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/marketplace/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/marketplace/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/proof_of_attendance/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/proof_of_attendance/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/proof_of_attendance/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/scratch_storage/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/scratch_storage/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/scratch_storage/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/simple_voting/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/simple_voting/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/simple_voting/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/zk_whitelist/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/zk_whitelist/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/examples/zk_whitelist/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/check_stubs_cov.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/refresh_test_artifacts.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/scripts/validate_examples.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/arc4.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/compiled.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/constants.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/context_storage.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/ledger_context.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/context_helpers/txn_context.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/decorators/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/decorators/subroutine.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/enums.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/gtxn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/itxn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/itxn_loader.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/account.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/application.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/asset.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/logicsig.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/template_variable.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/txn_fields.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/models/unsigned_builtins.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/mutable.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/block.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/constants.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/crypto.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/global_values.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/itxn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/misc.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/pure.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/op/txn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/array.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/biguint.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/string.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/primitives/uint64.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/protocols.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/py.typed +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/box.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/global_state.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/local_state.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/budget.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/log.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utilities/size_of.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/arc4.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/value_generators/txn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/arc4.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/gtxn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/itxn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/op.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy/py.typed +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy_testing/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/algopy_testing/py.typed +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/templates/.macros.j2 +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/templates/.release_notes.md.j2 +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/templates/CHANGELOG.md.j2 +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/conftest.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_abi_call.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_address.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_bool.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_dynamic_array.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_dynamic_bytes.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_emit.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_static_array.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_string.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_struct.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_tuple.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_ufixednxm.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/arc4/test_uintn.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/AVM12/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4ABIMethod/data/SignaturesContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4InnerTxns/data/Arc4InnerTxnsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arc4PrimitiveOps/data/Arc4PrimitiveOpsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/Contract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.approval.teal +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.arc56.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/ImmutableArrayInitContract.clear.teal +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/data/StaticSizeContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/immutable.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/static_size.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Arrays/uint64.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/BoxContract/data/BoxContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Contains/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppCall.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/data/AppExpectingEffects.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CreatedAppAsset/other.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/CryptoOps/data/CryptoOpsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/GlobalStateValidator/data/GlobalStateValidator.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/MiscellaneousOps/data/MiscellaneousOpsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/PrimitiveOps/data/PrimitiveOpsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/Contract.approval.teal +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/Contract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/Contract.clear.teal +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/data/StateMutations.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateMutations/statemutations.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/GlobalStateContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/ITxnOpsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/LocalStateContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGet.approval.teal +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGet.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGet.clear.teal +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAcctParamsGetContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppGlobalExContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppLocalExContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAppParamsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetHoldingContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/StateOps/data/StateAssetParamsContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/Tuples/data/TuplesContract.arc32.json +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/artifacts/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/avm12/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/avm12/conftest.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/avm12/test_avm12.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/common.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/conftest.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/contexts/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_asset.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_box_map.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_box_ref.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_contract.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_uenumerate.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/models/test_urange.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/conftest.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_biguint.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_bytes.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_string.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/primitives/test_uint64.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/conftest.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/test_global_state.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/test_local_state.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/state/test_mutations.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_array.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_context.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_miscellaneous_op.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/test_op.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/util.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/__init__.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/utilities/conftest.py +0 -0
- {algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/tests/value_generators/__init__.py +0 -0
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
|
+
## v1.2.0-beta.1 (2025-12-05)
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add fixed size variant of bytes as a separate `FixedBytes` type ([`9a2ab8e`](https://github.com/algorandfoundation/algorand-python-testing/commit/9a2ab8e3f94e9e7a2a416a94a54cf51b57599089))
|
|
7
|
+
|
|
2
8
|
## v1.1.0 (2025-10-20)
|
|
3
9
|
|
|
4
10
|
## v1.1.0-beta.1 (2025-10-20)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: algorand-python-testing
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0b1
|
|
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
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
See which `algorand-python` stubs are implemented by the `algorand-python-testing` library. See the [Concepts](testing-guide/concepts.md#types-of-algopy-stub-implementations) section for more details on the implementation categories. Refer to the [`algorand-python` stubs API](api.md) for the full list of stubs for which the `algorand-python-testing` library provides implementations referenced in the table below.
|
|
4
4
|
|
|
5
5
|
| Name | Implementation type |
|
|
6
|
-
|
|
6
|
+
| ------------------------------------------- | ------------------- |
|
|
7
7
|
| algopy.Account | Emulated |
|
|
8
8
|
| algopy.Application | Emulated |
|
|
9
9
|
| algopy.Asset | Emulated |
|
|
@@ -18,6 +18,7 @@ See which `algorand-python` stubs are implemented by the `algorand-python-testin
|
|
|
18
18
|
| algopy.CompiledLogicSig | Mockable |
|
|
19
19
|
| algopy.Contract | Emulated |
|
|
20
20
|
| algopy.FixedArray | Native |
|
|
21
|
+
| algopy.FixedBytes | Native |
|
|
21
22
|
| algopy.Global | Emulated |
|
|
22
23
|
| algopy.GlobalState | Emulated |
|
|
23
24
|
| algopy.ImmutableArray | Native |
|
{algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/docs/testing-guide/avm-types.md
RENAMED
|
@@ -50,6 +50,22 @@ random_bytes = context.any.bytes()
|
|
|
50
50
|
random_bytes = context.any.bytes(length=32)
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
+
## FixedBytes
|
|
54
|
+
|
|
55
|
+
```{testcode}
|
|
56
|
+
import typing
|
|
57
|
+
|
|
58
|
+
# Direct instantiation
|
|
59
|
+
bytes_value = algopy.FixedBytes[typing.Literal[16]](b"Hello, Algorand!")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# Instantiate test context
|
|
63
|
+
...
|
|
64
|
+
|
|
65
|
+
# Generate random byte sequences of length 32
|
|
66
|
+
random_bytes = context.any.fixed_bytes(algopy.FixedBytes[typing.Literal[32]])
|
|
67
|
+
```
|
|
68
|
+
|
|
53
69
|
## String
|
|
54
70
|
|
|
55
71
|
```{testcode}
|
{algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/__init__.py
RENAMED
|
@@ -19,7 +19,7 @@ from _algopy_testing.models import (
|
|
|
19
19
|
uenumerate,
|
|
20
20
|
urange,
|
|
21
21
|
)
|
|
22
|
-
from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64
|
|
22
|
+
from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64
|
|
23
23
|
from _algopy_testing.state import Box, BoxMap, BoxRef, GlobalState, LocalState
|
|
24
24
|
from _algopy_testing.value_generators.arc4 import ARC4ValueGenerator
|
|
25
25
|
from _algopy_testing.value_generators.avm import AVMValueGenerator
|
|
@@ -39,6 +39,7 @@ __all__ = [
|
|
|
39
39
|
"BoxRef",
|
|
40
40
|
"Bytes",
|
|
41
41
|
"Contract",
|
|
42
|
+
"FixedBytes",
|
|
42
43
|
"GlobalState",
|
|
43
44
|
"ITxnGroupLoader",
|
|
44
45
|
"ITxnLoader",
|
|
@@ -12,7 +12,7 @@ import _algopy_testing
|
|
|
12
12
|
from _algopy_testing.constants import ALWAYS_APPROVE_TEAL_PROGRAM, ARC4_RETURN_PREFIX
|
|
13
13
|
from _algopy_testing.context_helpers import lazy_context
|
|
14
14
|
from _algopy_testing.enums import OnCompleteAction
|
|
15
|
-
from _algopy_testing.primitives import BigUInt, Bytes, String, UInt64
|
|
15
|
+
from _algopy_testing.primitives import BigUInt, Bytes, FixedBytes, String, UInt64
|
|
16
16
|
|
|
17
17
|
_P = typing.ParamSpec("_P")
|
|
18
18
|
_R = typing.TypeVar("_R")
|
|
@@ -418,6 +418,8 @@ def _type_to_arc4( # noqa: PLR0912 PLR0911
|
|
|
418
418
|
return "uint512"
|
|
419
419
|
if issubclass(annotation, Bytes):
|
|
420
420
|
return "byte[]"
|
|
421
|
+
if issubclass(annotation, FixedBytes):
|
|
422
|
+
return f"byte[{annotation._length}]"
|
|
421
423
|
if issubclass(annotation, bool):
|
|
422
424
|
return "bool"
|
|
423
425
|
raise TypeError(f"type not a valid ARC4 type: {annotation}")
|
|
@@ -9,6 +9,7 @@ from _algopy_testing.primitives.array import (
|
|
|
9
9
|
)
|
|
10
10
|
from _algopy_testing.primitives.biguint import BigUInt
|
|
11
11
|
from _algopy_testing.primitives.bytes import Bytes
|
|
12
|
+
from _algopy_testing.primitives.fixed_bytes import FixedBytes
|
|
12
13
|
from _algopy_testing.primitives.string import String
|
|
13
14
|
from _algopy_testing.primitives.uint64 import UInt64
|
|
14
15
|
|
|
@@ -17,6 +18,7 @@ __all__ = [
|
|
|
17
18
|
"BigUInt",
|
|
18
19
|
"Bytes",
|
|
19
20
|
"FixedArray",
|
|
21
|
+
"FixedBytes",
|
|
20
22
|
"ImmutableArray",
|
|
21
23
|
"ImmutableFixedArray",
|
|
22
24
|
"ReferenceArray",
|
|
@@ -7,6 +7,8 @@ from typing import TYPE_CHECKING
|
|
|
7
7
|
if TYPE_CHECKING:
|
|
8
8
|
from collections.abc import Iterator
|
|
9
9
|
|
|
10
|
+
from _algopy_testing.primitives.fixed_bytes import FixedBytes
|
|
11
|
+
|
|
10
12
|
|
|
11
13
|
from itertools import zip_longest
|
|
12
14
|
|
|
@@ -27,7 +29,7 @@ class Bytes:
|
|
|
27
29
|
check_type(value, bytes)
|
|
28
30
|
self.value = as_bytes(value)
|
|
29
31
|
|
|
30
|
-
def __contains__(self, item: Bytes | bytes) -> bool:
|
|
32
|
+
def __contains__(self, item: Bytes | FixedBytes | bytes) -> bool: # type: ignore[type-arg]
|
|
31
33
|
item_bytes = as_bytes(item)
|
|
32
34
|
return item_bytes in self.value
|
|
33
35
|
|
|
@@ -43,11 +45,8 @@ class Bytes:
|
|
|
43
45
|
def __add__(self, other: Bytes | bytes) -> Bytes:
|
|
44
46
|
"""Concatenate Bytes with another Bytes or bytes literal e.g. `Bytes(b"Hello ")
|
|
45
47
|
+ b"World"`."""
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
else:
|
|
49
|
-
result = self.value + as_bytes(other)
|
|
50
|
-
return _checked_result(result, "+")
|
|
48
|
+
result = self.value + as_bytes(other)
|
|
49
|
+
return _checked_result(result, "+")
|
|
51
50
|
|
|
52
51
|
def __radd__(self, other: bytes) -> Bytes:
|
|
53
52
|
"""Concatenate Bytes with another Bytes or bytes literal e.g. `b"Hello " +
|
|
@@ -70,7 +69,7 @@ class Bytes:
|
|
|
70
69
|
self, index: UInt64 | int | slice
|
|
71
70
|
) -> Bytes: # maps to substring/substring3 if slice, extract/extract3 otherwise?
|
|
72
71
|
"""Returns a Bytes containing a single byte if indexed with UInt64 or int
|
|
73
|
-
otherwise the substring
|
|
72
|
+
otherwise the substring of bytes described by the slice."""
|
|
74
73
|
if isinstance(index, slice):
|
|
75
74
|
return Bytes(self.value[index])
|
|
76
75
|
else:
|
|
@@ -181,7 +180,7 @@ def _checked_result(result: bytes, op: str) -> Bytes:
|
|
|
181
180
|
"""Ensures `result` is a valid Bytes value.
|
|
182
181
|
|
|
183
182
|
Raises:
|
|
184
|
-
|
|
183
|
+
OverflowError: If `result` of `op` is out of bounds
|
|
185
184
|
"""
|
|
186
185
|
if len(result) > MAX_BYTES_SIZE:
|
|
187
186
|
raise OverflowError(f"{op} overflows")
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import base64
|
|
4
|
+
import operator
|
|
5
|
+
import types
|
|
6
|
+
import typing
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from collections.abc import Callable, Iterator
|
|
10
|
+
|
|
11
|
+
from itertools import zip_longest
|
|
12
|
+
|
|
13
|
+
from _algopy_testing.constants import MAX_BYTES_SIZE
|
|
14
|
+
from _algopy_testing.primitives.bytes import Bytes
|
|
15
|
+
from _algopy_testing.primitives.uint64 import UInt64
|
|
16
|
+
from _algopy_testing.protocols import BytesBacked
|
|
17
|
+
from _algopy_testing.utils import (
|
|
18
|
+
as_bytes,
|
|
19
|
+
get_int_literal_from_type_generic,
|
|
20
|
+
get_type_generic_from_int_literal,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
_TBytesLength = typing.TypeVar("_TBytesLength", bound=int)
|
|
24
|
+
_TBytesLength_Arg = typing.TypeVar("_TBytesLength_Arg", bound=int)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_or_create_class_from_type(cls: type, length_t: type) -> type:
|
|
28
|
+
_length = get_int_literal_from_type_generic(length_t)
|
|
29
|
+
return _get_or_create_class(cls, _length, length_t)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _get_or_create_class_from_int(cls: type, length: int) -> type:
|
|
33
|
+
length_t = get_type_generic_from_int_literal(length)
|
|
34
|
+
return _get_or_create_class(cls, length, length_t)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _get_or_create_class(cls: type, length: int, length_t: type) -> type:
|
|
38
|
+
"""Get or create a type that is parametrized with element_t and length."""
|
|
39
|
+
cache = getattr(cls, "__concrete__", {})
|
|
40
|
+
if c := cache.get(length_t, None):
|
|
41
|
+
assert isinstance(c, type)
|
|
42
|
+
return c
|
|
43
|
+
|
|
44
|
+
cls_name = f"{cls.__name__}[{length}]"
|
|
45
|
+
|
|
46
|
+
cache[length_t] = t = types.new_class(
|
|
47
|
+
cls_name,
|
|
48
|
+
bases=(cls,),
|
|
49
|
+
exec_body=lambda ns: ns.update(
|
|
50
|
+
_length=length,
|
|
51
|
+
),
|
|
52
|
+
)
|
|
53
|
+
return t
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class _FixedBytesMeta(type):
|
|
57
|
+
__concrete__: typing.ClassVar[dict[type, type]] = {}
|
|
58
|
+
|
|
59
|
+
def __getitem__(cls, length_t: type) -> type:
|
|
60
|
+
if length_t == typing.Any:
|
|
61
|
+
return cls
|
|
62
|
+
|
|
63
|
+
return _get_or_create_class_from_type(cls, length_t)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class FixedBytes(
|
|
67
|
+
BytesBacked,
|
|
68
|
+
typing.Generic[_TBytesLength],
|
|
69
|
+
metaclass=_FixedBytesMeta,
|
|
70
|
+
):
|
|
71
|
+
"""A statically-sized byte sequence, where the length is known at compile time.
|
|
72
|
+
|
|
73
|
+
Unlike `Bytes`, `FixedBytes` has a fixed length specified via a type parameter.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
FixedBytes[typing.Literal[32]] # A 32-byte fixed-size bytes value
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
value: bytes # underlying 'bytes' value representing the FixedBytes
|
|
80
|
+
_length: int
|
|
81
|
+
|
|
82
|
+
def __init__(self, value: Bytes | bytes | None = None, /):
|
|
83
|
+
if value is None:
|
|
84
|
+
self.value = b"\x00" * self._length
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
self.value = as_bytes(value)
|
|
88
|
+
if not hasattr(self, "_length"):
|
|
89
|
+
self._length = len(self.value)
|
|
90
|
+
|
|
91
|
+
if len(self.value) != self._length:
|
|
92
|
+
raise ValueError(f"expected value of length {self._length}, not {len(self.value)}")
|
|
93
|
+
|
|
94
|
+
def __repr__(self) -> str:
|
|
95
|
+
return repr(self.value)
|
|
96
|
+
|
|
97
|
+
def __str__(self) -> str:
|
|
98
|
+
return str(self.value)
|
|
99
|
+
|
|
100
|
+
def __bool__(self) -> bool:
|
|
101
|
+
return bool(self._length)
|
|
102
|
+
|
|
103
|
+
def __len__(self) -> int:
|
|
104
|
+
return self._length
|
|
105
|
+
|
|
106
|
+
def __eq__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool: # type: ignore[override]
|
|
107
|
+
"""FixedBytes can be compared using the `==` operator with another FixedBytes,
|
|
108
|
+
Bytes or bytes."""
|
|
109
|
+
|
|
110
|
+
if isinstance(other, FixedBytes) and other.length != self.length:
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
other_bytes = as_bytes(other)
|
|
115
|
+
except TypeError:
|
|
116
|
+
return NotImplemented
|
|
117
|
+
|
|
118
|
+
return self.value == other_bytes
|
|
119
|
+
|
|
120
|
+
def __hash__(self) -> int:
|
|
121
|
+
return hash(self.value)
|
|
122
|
+
|
|
123
|
+
def __add__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Bytes:
|
|
124
|
+
"""Concatenate FixedBytes with another Bytes or bytes literal e.g.
|
|
125
|
+
`FixedBytes[typing.Literal[5]](b"Hello ") + b"World"`."""
|
|
126
|
+
result = self.value + as_bytes(other)
|
|
127
|
+
return _checked_result(result, "+")
|
|
128
|
+
|
|
129
|
+
def __radd__(self, other: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> Bytes:
|
|
130
|
+
"""Concatenate FixedBytes with another Bytes or bytes literal e.g. `b"Hello " +
|
|
131
|
+
FixedBytes[typing.Literal[5]](b"World")`."""
|
|
132
|
+
result = as_bytes(other) + self.value
|
|
133
|
+
return _checked_result(result, "+")
|
|
134
|
+
|
|
135
|
+
def __iadd__(self, _other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
|
|
136
|
+
raise TypeError("FixedBytes does not support in-place addition")
|
|
137
|
+
|
|
138
|
+
@property
|
|
139
|
+
def length(self) -> UInt64:
|
|
140
|
+
"""Returns the specified length of the FixedBytes."""
|
|
141
|
+
return UInt64(self._length)
|
|
142
|
+
|
|
143
|
+
def __getitem__(self, index: UInt64 | int | slice) -> Bytes:
|
|
144
|
+
"""Returns a Bytes containing a single byte if indexed with UInt64 or int
|
|
145
|
+
otherwise the substring of bytes described by the slice."""
|
|
146
|
+
value = self.value[: self.length]
|
|
147
|
+
if isinstance(index, slice):
|
|
148
|
+
return Bytes(value[index])
|
|
149
|
+
else:
|
|
150
|
+
int_index = index.value if isinstance(index, UInt64) else index
|
|
151
|
+
int_index = self.length.value + int_index if int_index < 0 else int_index
|
|
152
|
+
if (int_index >= self.length) or (int_index < 0):
|
|
153
|
+
raise ValueError("FixedBytes index out of range")
|
|
154
|
+
# my_bytes[0:1] => b'j' whereas my_bytes[0] => 106
|
|
155
|
+
return Bytes(value[slice(int_index, int_index + 1)])
|
|
156
|
+
|
|
157
|
+
def __iter__(self) -> Iterator[Bytes]:
|
|
158
|
+
"""FixedBytes can be iterated, yielding each consecutive byte."""
|
|
159
|
+
return _FixedBytesIter(self, 1)
|
|
160
|
+
|
|
161
|
+
def __reversed__(self) -> Iterator[Bytes]:
|
|
162
|
+
"""FixedBytes can be iterated in reverse, yield each preceding byte starting at
|
|
163
|
+
the end."""
|
|
164
|
+
return _FixedBytesIter(self, -1)
|
|
165
|
+
|
|
166
|
+
@typing.overload
|
|
167
|
+
def __and__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap]
|
|
168
|
+
@typing.overload
|
|
169
|
+
def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ...
|
|
170
|
+
def __and__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes:
|
|
171
|
+
"""Compute the bitwise AND of the FixedBytes with another FixedBytes, Bytes, or
|
|
172
|
+
bytes.
|
|
173
|
+
|
|
174
|
+
Returns FixedBytes if other has the same length, otherwise returns Bytes.
|
|
175
|
+
"""
|
|
176
|
+
return self._operate_bitwise(other, operator.and_)
|
|
177
|
+
|
|
178
|
+
def __rand__(self, other: bytes) -> Bytes:
|
|
179
|
+
return self & other
|
|
180
|
+
|
|
181
|
+
def __iand__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
|
|
182
|
+
other_bytes = as_bytes(other)
|
|
183
|
+
other_fixed_bytes = self.__class__(other_bytes)
|
|
184
|
+
result = self._operate_bitwise(other_fixed_bytes, operator.and_)
|
|
185
|
+
assert isinstance(result, self.__class__)
|
|
186
|
+
return result
|
|
187
|
+
|
|
188
|
+
@typing.overload
|
|
189
|
+
def __or__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap]
|
|
190
|
+
@typing.overload
|
|
191
|
+
def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ...
|
|
192
|
+
def __or__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes:
|
|
193
|
+
return self._operate_bitwise(other, operator.or_)
|
|
194
|
+
|
|
195
|
+
def __ror__(self, other: bytes) -> Bytes:
|
|
196
|
+
return self | other
|
|
197
|
+
|
|
198
|
+
def __ior__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
|
|
199
|
+
other_bytes = as_bytes(other)
|
|
200
|
+
other_fixed_bytes = self.__class__(other_bytes)
|
|
201
|
+
result = self._operate_bitwise(other_fixed_bytes, operator.or_)
|
|
202
|
+
assert isinstance(result, self.__class__)
|
|
203
|
+
return result
|
|
204
|
+
|
|
205
|
+
@typing.overload
|
|
206
|
+
def __xor__(self, other: typing.Self) -> typing.Self: ... # type: ignore[overload-overlap]
|
|
207
|
+
@typing.overload
|
|
208
|
+
def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> Bytes: ...
|
|
209
|
+
def __xor__(self, other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes) -> typing.Self | Bytes:
|
|
210
|
+
return self._operate_bitwise(other, operator.xor)
|
|
211
|
+
|
|
212
|
+
def __rxor__(self, other: bytes) -> Bytes:
|
|
213
|
+
return self ^ other
|
|
214
|
+
|
|
215
|
+
def __ixor__(self, other: Bytes | typing.Self | bytes) -> typing.Self: # type: ignore[misc]
|
|
216
|
+
other_bytes = as_bytes(other)
|
|
217
|
+
other_fixed_bytes = self.__class__(other_bytes)
|
|
218
|
+
result = self._operate_bitwise(other_fixed_bytes, operator.xor)
|
|
219
|
+
assert isinstance(result, self.__class__)
|
|
220
|
+
return result
|
|
221
|
+
|
|
222
|
+
def __invert__(self) -> typing.Self:
|
|
223
|
+
"""Compute the bitwise inversion of the FixedBytes.
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
FixedBytes: The result of the bitwise inversion operation.
|
|
227
|
+
"""
|
|
228
|
+
return self.__class__.from_bytes(bytes(~x + 256 for x in self.value))
|
|
229
|
+
|
|
230
|
+
def _operate_bitwise(
|
|
231
|
+
self,
|
|
232
|
+
other: FixedBytes[_TBytesLength_Arg] | bytes | Bytes,
|
|
233
|
+
op: Callable[[int, int], int],
|
|
234
|
+
) -> typing.Self | Bytes:
|
|
235
|
+
maybe_bytes = as_bytes(other)
|
|
236
|
+
# pad the shorter of self.value and other bytes with leading zero
|
|
237
|
+
# by reversing them as zip_longest fills at the end
|
|
238
|
+
|
|
239
|
+
result = bytes(
|
|
240
|
+
reversed(
|
|
241
|
+
bytes(
|
|
242
|
+
op(a[0], a[1])
|
|
243
|
+
for a in zip_longest(reversed(self.value), reversed(maybe_bytes), fillvalue=0)
|
|
244
|
+
)
|
|
245
|
+
)
|
|
246
|
+
)
|
|
247
|
+
if isinstance(other, FixedBytes) and len(other.value) == len(self.value):
|
|
248
|
+
return self.__class__.from_bytes(result)
|
|
249
|
+
return Bytes(result)
|
|
250
|
+
|
|
251
|
+
def __contains__(self, item: FixedBytes[_TBytesLength_Arg] | Bytes | bytes) -> bool:
|
|
252
|
+
item_bytes = as_bytes(item)
|
|
253
|
+
return item_bytes in self.value
|
|
254
|
+
|
|
255
|
+
@classmethod
|
|
256
|
+
def from_base32(cls, value: str) -> typing.Self:
|
|
257
|
+
"""Creates FixedBytes from a base32 encoded string e.g.
|
|
258
|
+
`FixedBytes.from_base32("74======")`"""
|
|
259
|
+
bytes_value = base64.b32decode(value)
|
|
260
|
+
c = cls._ensure_class_with_length(bytes_value)
|
|
261
|
+
return c(bytes_value)
|
|
262
|
+
|
|
263
|
+
@classmethod
|
|
264
|
+
def from_base64(cls, value: str) -> typing.Self:
|
|
265
|
+
"""Creates FixedBytes from a base64 encoded string e.g.
|
|
266
|
+
`FixedBytes.from_base64("RkY=")`"""
|
|
267
|
+
bytes_value = base64.b64decode(value)
|
|
268
|
+
c = cls._ensure_class_with_length(bytes_value)
|
|
269
|
+
return c(bytes_value)
|
|
270
|
+
|
|
271
|
+
@classmethod
|
|
272
|
+
def from_hex(cls, value: str) -> typing.Self:
|
|
273
|
+
"""Creates FixedBytes from a hex/octal encoded string e.g.
|
|
274
|
+
`FixedBytes.from_hex("FF")`"""
|
|
275
|
+
bytes_value = base64.b16decode(value)
|
|
276
|
+
c = cls._ensure_class_with_length(bytes_value)
|
|
277
|
+
return c(bytes_value)
|
|
278
|
+
|
|
279
|
+
@classmethod
|
|
280
|
+
def from_bytes(cls, value: Bytes | bytes) -> typing.Self:
|
|
281
|
+
"""Construct an instance from the underlying bytes (no validation)"""
|
|
282
|
+
bytes_value = value.value if isinstance(value, Bytes) else value
|
|
283
|
+
c = cls._ensure_class_with_length(bytes_value)
|
|
284
|
+
result = c()
|
|
285
|
+
result.value = bytes_value
|
|
286
|
+
return result
|
|
287
|
+
|
|
288
|
+
@classmethod
|
|
289
|
+
def _ensure_class_with_length(cls, bytes_value: bytes) -> type[typing.Self]:
|
|
290
|
+
"""Returns the appropriate class for the given bytes value.
|
|
291
|
+
|
|
292
|
+
If cls has a fixed _length, returns cls. Otherwise, returns or creates a
|
|
293
|
+
specialized class with the length set to match bytes_value.
|
|
294
|
+
"""
|
|
295
|
+
return (
|
|
296
|
+
_get_or_create_class_from_int(cls, len(bytes_value))
|
|
297
|
+
if not hasattr(cls, "_length")
|
|
298
|
+
else cls
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
@property
|
|
302
|
+
def bytes(self) -> Bytes:
|
|
303
|
+
"""Get the underlying Bytes."""
|
|
304
|
+
return Bytes(self.value)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class _FixedBytesIter(typing.Generic[_TBytesLength]):
|
|
308
|
+
value: FixedBytes[_TBytesLength]
|
|
309
|
+
|
|
310
|
+
def __init__(self, sequence: FixedBytes[_TBytesLength], step: int = 1):
|
|
311
|
+
self.value = sequence
|
|
312
|
+
self.current = 0 if step > 0 else len(sequence) - 1
|
|
313
|
+
self.step = step
|
|
314
|
+
self.myend = len(sequence) - 1 if step > 0 else 0
|
|
315
|
+
|
|
316
|
+
def __iter__(self) -> typing.Self:
|
|
317
|
+
return self
|
|
318
|
+
|
|
319
|
+
def __next__(self) -> Bytes:
|
|
320
|
+
# if current is one step over the end
|
|
321
|
+
if self.current == self.myend + self.step:
|
|
322
|
+
raise StopIteration
|
|
323
|
+
|
|
324
|
+
self.current += self.step
|
|
325
|
+
return self.value[self.current - self.step]
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def _checked_result(result: bytes, op: str) -> Bytes:
|
|
329
|
+
"""Ensures `result` is a valid Bytes value.
|
|
330
|
+
|
|
331
|
+
Raises:
|
|
332
|
+
OverflowError: If `result` of `op` is out of bounds
|
|
333
|
+
"""
|
|
334
|
+
if len(result) > MAX_BYTES_SIZE:
|
|
335
|
+
raise OverflowError(f"{op} overflows")
|
|
336
|
+
return Bytes(result)
|
{algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/serialize.py
RENAMED
|
@@ -4,6 +4,7 @@ import inspect
|
|
|
4
4
|
import typing
|
|
5
5
|
from collections.abc import Callable, Sequence
|
|
6
6
|
|
|
7
|
+
from _algopy_testing.primitives.fixed_bytes import FixedBytes
|
|
7
8
|
from _algopy_testing.primitives.uint64 import UInt64
|
|
8
9
|
from _algopy_testing.utils import get_type_generic_from_int_literal
|
|
9
10
|
|
|
@@ -62,6 +63,15 @@ def get_native_to_arc4_serializer( # noqa: PLR0911
|
|
|
62
63
|
native_to_arc4=lambda n: arc4.UInt64(n.int_),
|
|
63
64
|
arc4_to_native=lambda a: typ.from_int(a.native),
|
|
64
65
|
)
|
|
66
|
+
if issubclass(typ, FixedBytes):
|
|
67
|
+
length_type = get_type_generic_from_int_literal(typ._length)
|
|
68
|
+
arc4_static_bytes = arc4.StaticArray[arc4.Byte, length_type] # type: ignore[valid-type]
|
|
69
|
+
return _Serializer(
|
|
70
|
+
arc4_type=arc4_static_bytes,
|
|
71
|
+
native_to_arc4=lambda n: arc4_static_bytes(*[arc4.Byte.from_bytes(e) for e in n]),
|
|
72
|
+
arc4_to_native=lambda a: typ(a.bytes),
|
|
73
|
+
)
|
|
74
|
+
|
|
65
75
|
if typing.NamedTuple in getattr(typ, "__orig_bases__", []):
|
|
66
76
|
tuple_fields = tuple(inspect.get_annotations(typ).values())
|
|
67
77
|
if any(isinstance(f, str) for f in tuple_fields):
|
{algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/state/utils.py
RENAMED
|
@@ -42,11 +42,7 @@ def deserialize(typ: type[_TValue], value: SerializableValue) -> _TValue:
|
|
|
42
42
|
if isinstance(value, bytes):
|
|
43
43
|
raise TypeError("expected int, received bytes")
|
|
44
44
|
return typ.from_int(value) # type: ignore[return-value]
|
|
45
|
-
elif issubclass(typ, BytesBacked):
|
|
46
|
-
if isinstance(value, int):
|
|
47
|
-
raise TypeError("expected bytes, received int")
|
|
48
|
-
return typ.from_bytes(Bytes(value)) # type: ignore[return-value]
|
|
49
|
-
elif issubclass(typ, Serializable):
|
|
45
|
+
elif issubclass(typ, BytesBacked | Serializable):
|
|
50
46
|
if isinstance(value, int):
|
|
51
47
|
raise TypeError("expected bytes, received int")
|
|
52
48
|
return typ.from_bytes(value) # type: ignore[return-value]
|
|
@@ -70,6 +66,7 @@ def cast_from_bytes(typ: type[_TValue], value: bytes) -> _TValue:
|
|
|
70
66
|
serialized = as_int64(serialized)
|
|
71
67
|
else:
|
|
72
68
|
serialized = value
|
|
69
|
+
|
|
73
70
|
return deserialize(typ, serialized)
|
|
74
71
|
|
|
75
72
|
|
{algorand_python_testing-1.1.0 → algorand_python_testing-1.2.0b1}/src/_algopy_testing/utils.py
RENAMED
|
@@ -103,6 +103,8 @@ def as_bytes(value: object, *, max_size: int = MAX_BYTES_SIZE) -> bytes:
|
|
|
103
103
|
pass
|
|
104
104
|
case _algopy_testing.Bytes(value=bytes_value):
|
|
105
105
|
pass
|
|
106
|
+
case _algopy_testing.FixedBytes(value=bytes_value):
|
|
107
|
+
pass
|
|
106
108
|
case _:
|
|
107
109
|
raise TypeError(f"value must be a bytes or Bytes type, not {type(value).__name__!r}")
|
|
108
110
|
if len(bytes_value) > max_size:
|
|
@@ -23,6 +23,8 @@ from _algopy_testing.utils import generate_random_int
|
|
|
23
23
|
if typing.TYPE_CHECKING:
|
|
24
24
|
import algopy
|
|
25
25
|
|
|
26
|
+
_TBytesLength = typing.TypeVar("_TBytesLength", bound=int)
|
|
27
|
+
|
|
26
28
|
|
|
27
29
|
class AVMValueGenerator:
|
|
28
30
|
"""Factory for generating test data for AVM abstractions (uint64, bytes, string,
|
|
@@ -198,6 +200,19 @@ class AVMValueGenerator:
|
|
|
198
200
|
length = length or MAX_BYTES_SIZE
|
|
199
201
|
return _algopy_testing.Bytes(secrets.token_bytes(length))
|
|
200
202
|
|
|
203
|
+
def fixed_bytes(
|
|
204
|
+
self, fixed_bytes_type: type[algopy.FixedBytes[_TBytesLength]]
|
|
205
|
+
) -> algopy.FixedBytes[_TBytesLength]:
|
|
206
|
+
"""Generate a random fixed byte sequence of a specified length.
|
|
207
|
+
|
|
208
|
+
:param fixed_bytes_type: The FixedBytes type with length parameter (e.g.,
|
|
209
|
+
FixedBytes[typing.Literal[10]]).
|
|
210
|
+
:returns: The randomly generated fixed byte sequence.
|
|
211
|
+
"""
|
|
212
|
+
# Extract the length from the type parameter
|
|
213
|
+
length = fixed_bytes_type._length
|
|
214
|
+
return fixed_bytes_type(secrets.token_bytes(length))
|
|
215
|
+
|
|
201
216
|
|
|
202
217
|
def _get_app_id(app: algopy.Application | algopy.UInt64 | int) -> int:
|
|
203
218
|
from _algopy_testing.models import Application
|
|
@@ -19,6 +19,7 @@ from _algopy_testing.primitives import (
|
|
|
19
19
|
BigUInt,
|
|
20
20
|
Bytes,
|
|
21
21
|
FixedArray,
|
|
22
|
+
FixedBytes,
|
|
22
23
|
ImmutableArray,
|
|
23
24
|
ImmutableFixedArray,
|
|
24
25
|
ReferenceArray,
|
|
@@ -49,6 +50,7 @@ __all__ = [
|
|
|
49
50
|
"CompiledLogicSig",
|
|
50
51
|
"Contract",
|
|
51
52
|
"FixedArray",
|
|
53
|
+
"FixedBytes",
|
|
52
54
|
"Global",
|
|
53
55
|
"GlobalState",
|
|
54
56
|
"ImmutableArray",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import typing
|
|
1
2
|
from collections.abc import Generator
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
|
|
@@ -70,17 +71,22 @@ def test_app_args_is_correct_with_simple_args(
|
|
|
70
71
|
# act
|
|
71
72
|
|
|
72
73
|
# ensure same execution in AVM runs without errors
|
|
73
|
-
get_avm_result("sink", value="hello", arr=[1, 2])
|
|
74
|
+
get_avm_result("sink", value="hello", arr=[1, 2], fixed_bytes=b"test")
|
|
74
75
|
# then run inside emulator
|
|
75
|
-
contract.sink(
|
|
76
|
+
contract.sink(
|
|
77
|
+
arc4.String("hello"),
|
|
78
|
+
UInt8Array(arc4.UInt8(1), arc4.UInt8(2)),
|
|
79
|
+
algopy.FixedBytes[typing.Literal[4]](b"test"),
|
|
80
|
+
)
|
|
76
81
|
|
|
77
82
|
# assert
|
|
78
83
|
txn = context.txn.last_active
|
|
79
84
|
app_args = [txn.app_args(i) for i in range(int(txn.num_app_args))]
|
|
80
85
|
assert app_args == [
|
|
81
|
-
algosdk.abi.Method.from_signature("sink(string,uint8[])void").get_selector(),
|
|
86
|
+
algosdk.abi.Method.from_signature("sink(string,uint8[],byte[4])void").get_selector(),
|
|
82
87
|
b"\x00\x05hello",
|
|
83
88
|
b"\x00\x02\x01\x02",
|
|
89
|
+
b"test",
|
|
84
90
|
]
|
|
85
91
|
assert app_args[0] == arc4.arc4_signature(SignaturesContract.sink)
|
|
86
92
|
|