Python client library for Calimero Network - a comprehensive blockchain API client
Project description
Calimero Python Client Bindings
This directory contains the Python bindings for the Calimero Rust client, providing a complete Python interface to all Calimero client functionality.
🚀 Features
- Complete API Coverage: All 39 methods from the Rust client are available
- Professional Implementation: Clean, documented, and maintainable code
- Full Workflow Support: From application installation to alias management
- Enterprise Features: Permissions, proposals, governance, and synchronization
- Comprehensive Testing: Integration tests with real Merobox nodes
📦 Installation
Prerequisites
- Python 3.8+
- Rust toolchain
- Docker (for Merobox testing)
Building from Source
-
Clone the repository:
git clone <repository-url> cd core/crates/client
-
Build the Python wheel:
# Set compatibility for Python 3.13+
export PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1
# Build the wheel
maturin build --features python
- Install the wheel:
</code></pre> </li> </ol> <p>pip install target/wheels/calimero_client_py_bindings-*.whl</p> <pre><code> ## 🔧 Usage ### Basic Usage ```python from calimero_client_py_bindings import create_connection, create_client # Create a connection to a Calimero node connection = create_connection("http://localhost:2528", "my-node") # Create a client from the connection client = create_client(connection) # Use the client methods apps = client.list_applications() print(f"Installed applications: {apps}")
Available Methods
The Python client provides access to all methods from the Rust client. Here's the complete API reference:
Connection & Client Creation (2)
create_connection(api_url, node_name=None)- Create a connection to a Calimero nodecreate_client(connection)- Create a client from a connection
Application Management (5)
install_application(url, hash=None, metadata=None)- Install applications from URLsinstall_dev_application(path, metadata=None)- Install development applications from local pathsuninstall_application(app_id)- Remove installed applicationslist_applications()- List all installed applicationsget_application(app_id)- Get information about specific applications
Blob Management (3)
list_blobs()- List all blobsget_blob_info(blob_id)- Get information about specific blobsdelete_blob(blob_id)- Delete blobs
Context Management (8)
create_context(app_id, protocol, params=None)- Create new contextsdelete_context(context_id)- Delete contextsget_context(context_id)- Get context informationlist_contexts()- List all contextsget_context_storage(context_id)- Get context storage informationget_context_identities(context_id)- Get context member identitiesget_context_client_keys(context_id)- Get context client keyssync_context(context_id)- Synchronize context state
Context Collaboration (2)
invite_to_context(context_id, inviter_id, invitee_id)- Invite nodes to contextsjoin_context(context_id, invitee_id, invitation_payload)- Join contexts using invitation payload
Identity & Networking (2)
generate_context_identity()- Generate new context identitiesget_peers_count()- Get connected peers count
Function Execution (1)
execute_function(context_id, method, args, executor_public_key)- Execute functions via JSON-RPC
Permissions & Governance (6)
grant_permissions(context_id, granter_id, grantee_id, capability)- Grant capabilities to usersrevoke_permissions(context_id, revoker_id, revokee_id, capability)- Revoke capabilities from usersupdate_context_application(context_id, app_id, executor_public_key)- Update context applicationget_proposal(context_id, proposal_id)- Get proposal informationget_proposal_approvers(context_id, proposal_id)- Get proposal approverslist_proposals(context_id, args=None)- List proposals in a context
Synchronization (2)
sync_context(context_id)- Sync individual contextsync_all_contexts()- Sync all contexts
Alias Management (16)
create_context_alias(alias, context_id)- Create context aliasescreate_context_identity_alias(context_id, alias, public_key)- Create context identity aliasescreate_application_alias(alias, app_id)- Create application aliasescreate_alias_generic(alias, value, scope=None)- Create generic aliasesdelete_context_alias(alias)- Delete context aliasesdelete_context_identity_alias(alias, context_id)- Delete context identity aliasesdelete_application_alias(alias)- Delete application aliaseslist_context_aliases()- List context aliaseslist_context_identity_aliases(context_id)- List context identity aliaseslist_application_aliases()- List application aliaseslookup_context_alias(alias)- Lookup context alias valueslookup_context_identity_alias(alias, context_id)- Lookup context identity alias valueslookup_application_alias(alias)- Lookup application alias valuesresolve_context_alias(alias)- Resolve context aliasesresolve_context_identity_alias(alias, context_id)- Resolve context identity aliasesresolve_application_alias(alias)- Resolve application aliases
Connection Methods (2)
get(path)- Make a GET request to a specific pathdetect_auth_mode()- Check if authentication is required
Client Properties (1)
get_api_url()- Get the API URL of the client
Total: 48 methods (including the 2 creation functions)
🧪 Testing
Prerequisites for Testing
-
Install Merobox:
pip install merobox
-
Install PyYAML (for workflow tests):
pip install pyyaml
-
Install Pytest (for pytest tests):
pip install pytest
Running Tests
Quick Verification
Test that the bindings are working correctly:
python run_tests.py --mode quick
Standalone Integration Test
Run the comprehensive integration test with Merobox cluster management:
python run_tests.py --mode standalone
Pytest Tests
Run pytest-based tests with fixtures:
python run_tests.py --mode pytest
All Tests
Run all tests in sequence:
python run_tests.py --mode all
Test Modes
1. Merobox Cluster Management
Uses Merobox's
cluster()context manager for automatic node management:from merobox.testing import cluster with cluster(count=2, prefix="test", image="ghcr.io/calimero-network/merod:edge") as env: nodes = env["nodes"] endpoints = env["endpoints"] # Your test code here # Nodes are automatically cleaned up on exit
2. Merobox Workflow Setup
Uses Merobox's
workflow()context manager for complex test scenarios:from merobox.testing import workflow with workflow("workflow.yml", prefix="test") as env: workflow_result = env["workflow_result"] nodes = env["nodes"] endpoints = env["endpoints"] # Your test code here # Workflow environment is automatically cleaned up on exit
3. Pytest Fixtures
Use the provided pytest fixtures for integration testing:
# conftest.py provides these fixtures: # - merobox_cluster: 2-node cluster for testing # - merobox_workflow: workflow-based testing # - test_environment: test environment with cluster access def test_something(test_environment): endpoints = test_environment["endpoints"] nodes = test_environment["nodes"] # Your test code here
Test Coverage
The integration tests cover:
- Basic Connectivity: Connection and client creation
- Application Workflow: Installation, listing, and management
- Context Workflow: Creation, management, and collaboration
- Identity Management: Generation and invitation workflows
- Function Execution: Cross-node function calls
- Additional Methods: Peers, blobs, and synchronization
- Alias Methods: Complete alias lifecycle management
🏗️ Architecture
Binding Structure
- PyConnectionInfo: Python wrapper for connection information
- PyClient: Python wrapper for the Calimero client
- PyJwtToken: Python wrapper for JWT tokens
- PyClientError: Python wrapper for client errors
- PyAuthMode: Python wrapper for authentication modes
Error Handling
All methods return
PyResult<PyObject>and properly handle:- Network errors
- Authentication errors
- Storage errors
- Internal errors
- Invalid input parameters
Method Signatures & Parameters
Core Types
- Application IDs: String identifiers that must be valid
ApplicationIdformat - Context IDs: String identifiers that must be valid
ContextIdformat - Public Keys: String identifiers that must be valid
PublicKeyformat - Blob IDs: String identifiers that must be valid
BlobIdformat - Hash: String identifiers that must be valid
Hashformat
Parameter Formats
- Initialization Parameters:
Noneor JSON string for context creation - Permissions: JSON string array of
[public_key, capability]pairs - Function Arguments: JSON string for function execution
- Metadata: Optional bytes for application installation
Return Values
All methods return Python objects that can be:
- Dictionaries (for structured responses)
- Lists (for collections)
- Strings (for simple values)
- Numbers (for counts and IDs)
- None (for void operations)
Error Response Format
try: result = client.some_method() except Exception as e: # e will contain the error details print(f"Error: {e}")
Complete Parameter Reference
Quick Reference Table
Method Category Method Count Key Parameters Connection 2 api_url,node_nameApplications 5 app_id,url,path,hash,metadataBlobs 3 blob_idContexts 8 context_id,protocol,paramsCollaboration 2 inviter_id,invitee_id,invitation_payloadIdentity 2 None Functions 1 method,args,executor_public_keyPermissions 6 granter_id,grantee_id,revoker_id,capabilitySync 2 context_idAliases 16 alias,context_id,public_key,scopeConnection & Client Creation
-
create_connection(api_url, node_name=None)api_url(str, required): Full URL to the Calimero node (e.g., "http://localhost:2528")node_name(str, optional): Node identifier for authentication. UseNonefor local testing
-
create_client(connection)connection(PyConnectionInfo, required): Connection object fromcreate_connection
Application Management
-
install_application(url, hash=None, metadata=None)url(str, required): URL to the WASM application filehash(str, optional): Hex string of the expected file hash (32 bytes)metadata(bytes, optional): Application metadata bytes
-
install_dev_application(path, metadata=None)path(str, required): Local filesystem path to the WASM application filemetadata(bytes, optional): Application metadata bytes
-
uninstall_application(app_id)app_id(str, required): Application ID to remove
-
list_applications()- No parameters
-
get_application(app_id)app_id(str, required): Application ID to retrieve
Blob Management
-
list_blobs()- No parameters
-
get_blob_info(blob_id)blob_id(str, required): Blob ID to retrieve information for
-
delete_blob(blob_id)blob_id(str, required): Blob ID to delete
Context Management
-
create_context(app_id, protocol, params=None)app_id(str, required): Application ID to create context forprotocol(str, required): Protocol name (e.g., "ethereum", "near", "stellar", "icp")params(str, optional): JSON string of initialization parameters, orNone
-
delete_context(context_id)context_id(str, required): Context ID to delete
-
get_context(context_id)context_id(str, required): Context ID to retrieve
-
list_contexts()- No parameters
-
get_context_storage(context_id)context_id(str, required): Context ID to get storage info for
-
get_context_identities(context_id)context_id(str, required): Context ID to get identities for
-
get_context_client_keys(context_id)context_id(str, required): Context ID to get client keys for
-
sync_context(context_id)context_id(str, required): Context ID to synchronize
Context Collaboration
-
invite_to_context(context_id, inviter_id, invitee_id)context_id(str, required): Context ID to invite toinviter_id(str, required): Public key of the inviterinvitee_id(str, required): Public key of the invitee
-
join_context(context_id, invitee_id, invitation_payload)context_id(str, required): Context ID to joininvitee_id(str, required): Public key of the joining nodeinvitation_payload(str, required): Base58-encoded invitation payload containing protocol, network, and contract details
Note: The invitation payload contains all necessary information (protocol, network, contract_id) and should be used as-is from the invitation response.
Identity & Networking
-
generate_context_identity()- No parameters
-
get_peers_count()- No parameters
Function Execution
execute_function(context_id, method, args, executor_public_key)context_id(str, required): Context ID to execute function inmethod(str, required): Function name to callargs(str, required): JSON string of function argumentsexecutor_public_key(str, required): Public key of the executing node
Permissions & Governance
-
grant_permissions(context_id, granter_id, grantee_id, capability)context_id(str, required): Context ID to grant permissions ingranter_id(str, required): Public key of the user granting the permissiongrantee_id(str, required): Public key of the user receiving the permissioncapability(str, required): JSON string representation of the capability to grant
-
revoke_permissions(context_id, revoker_id, revokee_id, capability)context_id(str, required): Context ID to revoke permissions inrevoker_id(str, required): Public key of the user revoking the permissionrevokee_id(str, required): Public key of the user losing the permissioncapability(str, required): JSON string representation of the capability to revoke
-
update_context_application(context_id, app_id, executor_public_key)context_id(str, required): Context ID to updateapp_id(str, required): New application IDexecutor_public_key(str, required): Public key of the executing node
-
get_proposal(context_id, proposal_id)context_id(str, required): Context ID containing the proposalproposal_id(str, required): Hash of the proposal to retrieve
-
get_proposal_approvers(context_id, proposal_id)context_id(str, required): Context ID containing the proposalproposal_id(str, required): Hash of the proposal to get approvers for
-
list_proposals(context_id, args=None)context_id(str, required): Context ID to list proposals forargs(str, optional): JSON string of additional arguments for filtering proposals
Synchronization
-
sync_context(context_id)context_id(str, required): Context ID to synchronize
-
sync_all_contexts()- No parameters
Alias Management
-
create_context_alias(alias, context_id)alias(str, required): Alias name to createcontext_id(str, required): Context ID to alias
-
create_context_identity_alias(context_id, alias, public_key)context_id(str, required): Context ID for the identity aliasalias(str, required): Alias name to createpublic_key(str, required): Public key to alias
-
create_application_alias(alias, app_id)alias(str, required): Alias name to createapp_id(str, required): Application ID to alias
-
create_alias_generic(alias, value, scope=None)alias(str, required): Alias name to createvalue(str, required): Value to alias (parsed as ContextId by default)scope(str, optional): Scope for the alias (currently unused in implementation)
-
delete_context_alias(alias)alias(str, required): Alias name to delete
-
delete_context_identity_alias(alias, context_id)alias(str, required): Alias name to deletecontext_id(str, required): Context ID for the identity alias
-
delete_application_alias(alias)alias(str, required): Alias name to delete
-
list_context_aliases()- No parameters
-
list_context_identity_aliases(context_id)context_id(str, required): Context ID to list identity aliases for
-
list_application_aliases()- No parameters
-
lookup_context_alias(alias)alias(str, required): Alias name to lookup
-
lookup_context_identity_alias(alias, context_id)alias(str, required): Alias name to lookupcontext_id(str, required): Context ID for the identity alias
-
lookup_application_alias(alias)alias(str, required): Alias name to lookup
-
resolve_context_alias(alias)alias(str, required): Alias name to resolve
-
resolve_context_identity_alias(alias, context_id)alias(str, required): Alias name to resolvecontext_id(str, required): Context ID for the identity alias
-
resolve_application_alias(alias)alias(str, required): Alias name to resolve
Connection Methods
-
get(path)path(str, required): API path to make GET request to
-
detect_auth_mode()- No parameters
Client Properties
get_api_url()- No parameters
Parameter Validation & Formats
ID Format Requirements
- Application IDs: Must be valid base58-encoded strings (e.g., "37H2H5sXEquiq6WypfnKcrwCmM5WgfPW6WaZKXoVnVVT")
- Context IDs: Must be valid base58-encoded strings
- Public Keys: Must be valid base58-encoded strings (e.g., "4MFSzKrtmu19fXjXie8H2wFE8BSUfvHCkfrXtzcT5AEt")
- Blob IDs: Must be valid base58-encoded strings
- Hash: Must be valid hex strings (32 bytes)
JSON Parameter Examples
# Context initialization parameters init_params = json.dumps({"name": "my-context", "version": "1.0"}) # Function execution arguments function_args = json.dumps({"key": "hello", "value": "world"}) # Permissions (array of [public_key, capability] pairs) permissions = json.dumps([ ["4MFSzKrtmu19fXjXie8H2wFE8BSUfvHCkfrXtzcT5AEt", "read"], ["8ftA1B4ojHXdzHVH3yrq6JLvAdxPbrrANEwYEGFGgP4b", "write"] ])
Optional Parameters
params=None: Use for context creation without initializationhash=None: Skip hash verification for application installationmetadata=None: Skip metadata for application installationnode_name=None: Skip authentication for local testing
Parameter Type Conversion
The bindings automatically handle:
- String to ID type conversion (with validation)
- JSON string parsing for complex parameters
- Base58 encoding/decoding for IDs
- Hex encoding/decoding for hashes
Async Support
The bindings properly handle async Rust operations using:
tokio::runtime::Runtimefor async executionPython::with_gil()for Python GIL management- Proper error propagation from Rust to Python
🔍 Troubleshooting
Common Issues
- Import Errors: Ensure the wheel is properly installed
- Version Compatibility: Use
PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1for Python 3.13+ - Merobox Not Found: Install with
pip install merobox - Docker Issues: Ensure Docker is running for Merobox tests
Context Creation Issues
Problem:
create_context()may return a 500 Internal Server Error even with valid parameters.Symptoms:
- Server returns 500 error for all context creation attempts
- Different protocol names and initialization parameters don't help
- Application installation and listing work correctly
Possible Causes:
- Server-side issue with the context creation endpoint
- Protocol name validation on the server
- Initialization parameter format requirements
- Server configuration or deployment issues
Workarounds:
- Use
params=None: PassNoneinstead of initialization parameters - Try Different Protocols: Test with "kv-store", "kvstore", "test", or "default"
- Check Server Logs: Look for server-side error details
- Verify Application: Ensure the application is properly installed and accessible
- Skip Context Tests: Continue with other functionality while investigating the server issue
Note: This appears to be a server-side issue, not a client binding problem. The Python bindings are correctly implemented and working.
API Design Issues
Problem: The
join_contextmethod requiresprotocol,network, andcontract_idparameters that should come from the invitation payload.Current Implementation:
# Current (problematic) signature client.join_context(context_id, invitee_id, protocol, network, contract_id)
What It Should Be:
# Better design - just pass the invitation payload client.join_context(context_id, invitee_id, invitation_payload)
Why This Is Wrong:
- The joiner shouldn't need to know protocol/network/contract details
- These values are already encoded in the invitation payload
- It creates unnecessary complexity and potential for errors
- The invitation payload contains all the necessary information
Workaround: For now, extract the protocol, network, and contract_id from the invitation response when inviting someone, then pass them to join_context. This is not ideal but works with the current implementation.
Debug Mode
Enable verbose output:
python run_tests.py --verbose
Manual Testing
Test individual components:
# Test imports from calimero_client_py_bindings import create_connection, create_client # Test connection conn = create_connection("http://localhost:9999", "test") print(f"Connection: {conn.api_url}") # Test client client = create_client(conn) print(f"Client methods: {[m for m in dir(client) if not m.startswith('_')]}")
📚 Examples
Complete Workflow Example
from calimero_client_py_bindings import create_connection, create_client import json # Setup - Note: node_name=None for local testing (no authentication) connection = create_connection("http://localhost:2528", None) client = create_client(connection) # Install application app_response = client.install_application( "https://example.com/app.wasm" ) app_id = app_response['data']['applicationId'] # Note: 'applicationId' not 'application_id' # Create context - Note: params=None for no initialization parameters context_response = client.create_context( app_id, "ethereum", # Use actual protocol name like "ethereum", "near", "stellar" None # No initialization parameters ) context_id = context_response['data']['context_id'] # Example: Invite another node to the context invitation_response = client.invite_to_context( context_id, "inviter-public-key", # Your public key "invitee-public-key" # Their public key ) invitation_payload = invitation_response['data']['invitation_payload'] # Example: Join context using invitation payload join_response = client.join_context( context_id, "invitee-public-key", # Your public key invitation_payload # The invitation payload from the invite ) # Execute function result = client.execute_function( context_id, "set", json.dumps({"key": "hello", "value": "world"}), "executor-public-key" # Must be a valid public key ) print(f"Function result: {result}")
Important Usage Notes
- Authentication: For local testing, pass
node_name=Noneto avoid authentication prompts - Initialization Parameters: The
create_contextmethod acceptsparams=Nonefor no initialization - Response Format: Check the actual response structure - fields may use camelCase (e.g.,
applicationId) - Public Keys: Identity-related methods expect valid public key strings
- JSON Parameters: Methods like
grant_permissionsexpect JSON strings, not Python objects
🤝 Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
📄 License
This project is licensed under the same terms as the main Calimero project.
🆘 Support
For issues and questions:
- Check the troubleshooting section
- Review the test examples
- Open an issue on GitHub
- Check the Calimero documentation
🎉 Congratulations! You now have access to the complete Calimero Python client API with comprehensive testing infrastructure.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file calimero_client_py_bindings-0.1.5-cp313-cp313-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp313-cp313-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 16.8 MB
- Tags: CPython 3.13, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f4b114f846de8adaf4587ea9f580185cbe0926bc7000692890f7825e43cb54e
|
|
| MD5 |
570240a49262f68dde9a95cfbf551d24
|
|
| BLAKE2b-256 |
a79eeda377a484795dc122518704af76c0b36b4ec99300c99154c5cea2c1743d
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3247cc5ccdd338b91205656356d8b2bdcec89102a2b598165f9d749de35a9931
|
|
| MD5 |
deedd814cab0f99faadc34cbf39d095e
|
|
| BLAKE2b-256 |
c2f370a68e4e22a0eaaa10d0a6d617feb0cdc5f4ffb86c2cfe3353cfca2403f0
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp312-cp312-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp312-cp312-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 15.8 MB
- Tags: CPython 3.12, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
159d0503304d3142b8cf7f1d7bf4e9423e05be8347ca7d40de47e73576c943ae
|
|
| MD5 |
dd75bf84ddb22eccb6b92ae8561e49db
|
|
| BLAKE2b-256 |
90e190db8e61e1426a56f381c204b4b52871bc02119038d9362f0380d0d9b97e
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d975d847f78114fd071ac053e23e36e681e5da0b06e71e970dcc57d52d0f1ad9
|
|
| MD5 |
3cc56dbf7779b9297d1f7a4089fa6bcd
|
|
| BLAKE2b-256 |
60a3bd616a2017833d7d27137ce13ccd58b60fe3716d605bd59bfc33c2b448ec
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp311-cp311-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp311-cp311-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 12.9 MB
- Tags: CPython 3.11, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b7f877d61dc6c299cd82d1e829428a0dec5798036e311a3df2cf584adcfcfe4
|
|
| MD5 |
9495e8a9f9bb4416fd1ff4ec6db4081e
|
|
| BLAKE2b-256 |
71c8feabaddd932a60f05bf413afae920d53b06299d0abb63481ad3dbe8d2b5f
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64c96dadd439581db605856242ff15678c082fd1535a73151b4410535c6ba668
|
|
| MD5 |
1f7b61dd0aa903c85dc98a1e1dd3d3c5
|
|
| BLAKE2b-256 |
933b7451de10d37a9f76072798dcb1b61d83a97a7f3fe34cc02976e899ed359a
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp310-cp310-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp310-cp310-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 10.7 MB
- Tags: CPython 3.10, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
701afa1e1d5d4263acfac73c0c9f37eea654c7d79046d0e2bad1ce0421b3adb8
|
|
| MD5 |
bb51c725018c038f715cd705835667ab
|
|
| BLAKE2b-256 |
c5993fcd3946d753177f4c5de48139062b96ba65dbb19bc0b53ecbe7b6f6d54e
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e5afe363f28f633ad7f57214cd90fe74df1f75632b17051a9a01012bb77b369
|
|
| MD5 |
0567c94ea5c4db10b8f748a79a75fee5
|
|
| BLAKE2b-256 |
1340ae9c072890de29b435a89ea97ad894bda21256bfa315cdc9389408ff93f8
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp39-cp39-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp39-cp39-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 10.0 MB
- Tags: CPython 3.9, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfa413f92abd62b64359352633fbbc696fd8935e07bd89a2a735e9870e3b9186
|
|
| MD5 |
60c86df1cbb9872c343bc1ce940526ff
|
|
| BLAKE2b-256 |
b1734d350dd0e657a4219a43d28a6d1616b21085b83286a19dc1248a29cb54ec
|
File details
Details for the file calimero_client_py_bindings-0.1.5-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: calimero_client_py_bindings-0.1.5-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
19de0d3f259980f605c35175aafffa8adc85a3c1696283eab630d13aea534c58
|
|
| MD5 |
25a6940d1aaa75eddf6ad05a2093e92a
|
|
| BLAKE2b-256 |
fbf8ae87bb925831738296832088499774c01345004cb606db5f78ceba28d6f7
|