Skip to main content

A fast DynamoDB ORM for Python with a Rust core

Project description

pydynox 🐍⚙️

CI PyPI version Python versions License Downloads OpenSSF Scorecard

A fast DynamoDB ORM for Python with a Rust core.

Pre-release: The core features are working and tested. We're adding features, polishing the API, receiving ideas, and testing performance and edge cases before v1.0. Feel free to try it out and share feedback!

Why "pydynox"?

Py(thon) + Dyn(amoDB) + Ox(ide/Rust)

GenAI Contributions 🤖

I believe GenAI is transforming how we build software. It's a powerful tool that accelerates development when used by developers who understand what they're doing.

To support both humans and AI agents, I created:

  • .ai/ folder - Guidelines for agentic IDEs (Cursor, Windsurf, Kiro, etc.)
  • ADR/ folder - Architecture Decision Records for humans to understand the "why" behind decisions

If you're contributing with AI help:

  • Understand what the AI generated before submitting
  • Make sure the code follows the project patterns
  • Test your changes

I reserve the right to reject low-quality PRs where project patterns are not followed and it's clear that GenAI was driving instead of the developer.

Features

  • Simple class-based API like PynamoDB
  • Fast serialization with Rust
  • Batch operations with auto-splitting
  • Transactions
  • Global Secondary Indexes
  • Async support
  • Pydantic integration
  • TTL (auto-expiring items)
  • Lifecycle hooks
  • Auto-generate IDs and timestamps
  • Optimistic locking
  • Rate limiting
  • Field encryption (KMS)
  • Compression (zstd, lz4, gzip)
  • S3 attribute for large files
  • PartiQL support
  • Observability (logging, metrics)

Installation

pip install pydynox

For Pydantic support:

pip install pydynox[pydantic]

Quick Start

Define a Model

from pydynox import Model, ModelConfig
from pydynox.attributes import StringAttribute, NumberAttribute, BooleanAttribute, ListAttribute

class User(Model):
    model_config = ModelConfig(table="users")
    
    pk = StringAttribute(hash_key=True)
    sk = StringAttribute(range_key=True)
    name = StringAttribute()
    email = StringAttribute()
    age = NumberAttribute(default=0)
    active = BooleanAttribute(default=True)
    tags = ListAttribute()

CRUD Operations

# Create
user = User(pk="USER#123", sk="PROFILE", name="John", email="john@test.com")
user.save()

# Read
user = User.get(pk="USER#123", sk="PROFILE")

# Update - full save
user.name = "John Doe"
user.save()

# Update - partial
user.update(name="John Doe", age=31)

# Delete
user.delete()

Query

# Query by hash key
for user in User.query(hash_key="USER#123"):
    print(user.name)

# With range key condition
for user in User.query(
    hash_key="USER#123",
    range_key_condition=User.sk.begins_with("ORDER#")
):
    print(user.sk)

# With filter
for user in User.query(
    hash_key="USER#123",
    filter_condition=User.age > 18
):
    print(user.name)

# Get first result
first = User.query(hash_key="USER#123").first()

# Collect all
users = list(User.query(hash_key="USER#123"))

Conditions

Conditions use attribute operators directly:

# Save only if item doesn't exist
user.save(condition=User.pk.does_not_exist())

# Delete with condition
user.delete(condition=User.version == 5)

# Combine conditions with & (AND) and | (OR)
user.save(
    condition=User.pk.does_not_exist() | (User.version == 1)
)

Available condition methods:

  • User.field == value - equals
  • User.field != value - not equals
  • User.field > value - greater than
  • User.field >= value - greater than or equal
  • User.field < value - less than
  • User.field <= value - less than or equal
  • User.field.exists() - attribute exists
  • User.field.does_not_exist() - attribute does not exist
  • User.field.begins_with(prefix) - string starts with
  • User.field.contains(value) - string or list contains
  • User.field.between(low, high) - value in range
  • User.field.is_in(val1, val2, ...) - value in list

Atomic Updates

# Increment a number
user.update(atomic=[User.age.add(1)])

# Append to list
user.update(atomic=[User.tags.append(["verified"])])

# Remove from list
user.update(atomic=[User.tags.remove([0])])  # Remove first element

# Set if not exists
user.update(atomic=[User.views.if_not_exists(0)])

# Multiple atomic operations
user.update(atomic=[
    User.age.add(1),
    User.tags.append(["premium"]),
])

# With condition
user.update(
    atomic=[User.age.add(1)],
    condition=User.status == "active"
)

Batch Operations

from pydynox import BatchWriter, DynamoDBClient

client = DynamoDBClient()

# Batch write - items are sent in groups of 25
with BatchWriter(client, "users") as batch:
    for i in range(100):
        batch.put({"pk": f"USER#{i}", "sk": "PROFILE", "name": f"User {i}"})

# Mix puts and deletes
with BatchWriter(client, "users") as batch:
    batch.put({"pk": "USER#1", "sk": "PROFILE", "name": "John"})
    batch.delete({"pk": "USER#2", "sk": "PROFILE"})

Global Secondary Index

from pydynox import Model, ModelConfig
from pydynox.attributes import StringAttribute
from pydynox.indexes import GlobalSecondaryIndex

class User(Model):
    model_config = ModelConfig(table="users")
    
    pk = StringAttribute(hash_key=True)
    sk = StringAttribute(range_key=True)
    email = StringAttribute()
    status = StringAttribute()
    
    # GSI with hash key only
    email_index = GlobalSecondaryIndex(
        index_name="email-index",
        hash_key="email",
    )
    
    # GSI with hash and range key
    status_index = GlobalSecondaryIndex(
        index_name="status-index",
        hash_key="status",
        range_key="pk",
    )

# Query on index
for user in User.email_index.query(hash_key="john@test.com"):
    print(user.name)

Transactions

from pydynox import DynamoDBClient, Transaction

client = DynamoDBClient()

with Transaction(client) as tx:
    tx.put("users", {"pk": "USER#1", "sk": "PROFILE", "name": "John"})
    tx.put("orders", {"pk": "ORDER#1", "sk": "DETAILS", "user": "USER#1"})
    tx.delete("temp", {"pk": "TEMP#1"})

Async Support

# All methods have async versions with async_ prefix
user = await User.async_get(pk="USER#123", sk="PROFILE")
await user.async_save()
await user.async_update(name="Jane")
await user.async_delete()

# Async iteration
async for user in User.async_query(hash_key="USER#123"):
    print(user.name)

Pydantic Integration

from pydantic import BaseModel, EmailStr
from pydynox import DynamoDBClient
from pydynox.integrations.pydantic import dynamodb_model

client = DynamoDBClient()

@dynamodb_model(table="users", hash_key="pk", range_key="sk", client=client)
class User(BaseModel):
    pk: str
    sk: str
    name: str
    email: EmailStr
    age: int = 0

# Pydantic validation works
user = User(pk="USER#123", sk="PROFILE", name="John", email="john@test.com")
user.save()

# Get
user = User.get(pk="USER#123", sk="PROFILE")

S3 Attribute (Large Files)

DynamoDB has a 400KB item limit. S3Attribute stores files in S3 and keeps metadata in DynamoDB. Upload on save, download on demand, delete when the item is deleted.

from pydynox import Model, ModelConfig
from pydynox.attributes import StringAttribute, S3Attribute
from pydynox._internal._s3 import S3File

class Document(Model):
    model_config = ModelConfig(table="documents")
    
    pk = StringAttribute(hash_key=True)
    content = S3Attribute(bucket="my-bucket", prefix="docs/")

# Upload
doc = Document(pk="DOC#1")
doc.content = S3File(b"...", name="report.pdf", content_type="application/pdf")
doc.save()

# Download
doc = Document.get(pk="DOC#1")
data = doc.content.get_bytes()           # Load to memory
doc.content.save_to("/path/to/file.pdf") # Stream to file
url = doc.content.presigned_url(3600)    # Share via URL

# Metadata (no S3 call)
print(doc.content.size)
print(doc.content.content_type)

# Delete - removes from both DynamoDB and S3
doc.delete()

Table Management

from pydynox import DynamoDBClient

client = DynamoDBClient()

# Create table
client.create_table(
    "users",
    hash_key=("pk", "S"),
    range_key=("sk", "S"),
    wait=True,
)

# Create with on-demand billing (default)
client.create_table(
    "users",
    hash_key=("pk", "S"),
    billing_mode="PAY_PER_REQUEST",
)

# Create with provisioned capacity
client.create_table(
    "users",
    hash_key=("pk", "S"),
    billing_mode="PROVISIONED",
    read_capacity=10,
    write_capacity=5,
)

# Check if table exists
if not client.table_exists("users"):
    client.create_table("users", hash_key=("pk", "S"))

# Delete table
client.delete_table("users")

Documentation

Full documentation: https://leandrodamascena.github.io/pydynox

License

MIT License

Inspirations

This project was inspired by:

  • PynamoDB - The ORM-style API and model design
  • Pydantic - Data validation patterns and integration approach
  • dynarust - Rust DynamoDB client patterns
  • dyntastic - Pydantic + DynamoDB integration ideas

Building from Source

Requirements

  • Python 3.11+
  • Rust 1.70+
  • maturin

Setup

# Clone the repo
git clone https://github.com/leandrodamascena/pydynox.git
cd pydynox

# Install maturin
pip install maturin

# Build and install locally
maturin develop

# Or with uv
uv run maturin develop

Running Tests

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pydynox-0.15.0.tar.gz (361.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pydynox-0.15.0-cp314-cp314-manylinux_2_24_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ x86-64

pydynox-0.15.0-cp314-cp314-manylinux_2_24_aarch64.whl (7.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64

pydynox-0.15.0-cp314-cp314-macosx_11_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pydynox-0.15.0-cp314-cp314-macosx_10_12_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

pydynox-0.15.0-cp313-cp313-manylinux_2_24_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64

pydynox-0.15.0-cp313-cp313-manylinux_2_24_aarch64.whl (7.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64

pydynox-0.15.0-cp313-cp313-macosx_11_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pydynox-0.15.0-cp313-cp313-macosx_10_12_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

pydynox-0.15.0-cp312-cp312-manylinux_2_24_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64

pydynox-0.15.0-cp312-cp312-manylinux_2_24_aarch64.whl (7.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64

pydynox-0.15.0-cp312-cp312-macosx_11_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pydynox-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

pydynox-0.15.0-cp311-cp311-manylinux_2_24_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64

pydynox-0.15.0-cp311-cp311-manylinux_2_24_aarch64.whl (7.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64

pydynox-0.15.0-cp311-cp311-macosx_11_0_arm64.whl (6.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pydynox-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

File details

Details for the file pydynox-0.15.0.tar.gz.

File metadata

  • Download URL: pydynox-0.15.0.tar.gz
  • Upload date:
  • Size: 361.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pydynox-0.15.0.tar.gz
Algorithm Hash digest
SHA256 b5020d1bebc5249f539b3f5f7076ef7f7dbedd70aae6e391e3c6c629fbf8863d
MD5 1da0f9ce4ddfe8d74fac125e2160e43f
BLAKE2b-256 50d9d6e11a2e4dfae0af2b39014b339f4ab53bb24dd52b16ba5a77446bfdc517

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0.tar.gz:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp314-cp314-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp314-cp314-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 e8312b1c2808681acfd04abe85d75978e33a0e20cb9c745135cbe71413a9f79c
MD5 d8f80c0c0215af4f53ba3d7404f702d7
BLAKE2b-256 2eb42662263bb62d8e64f90513efd9c4baff57b5f548b433c78c34bffd6df55a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp314-cp314-manylinux_2_24_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp314-cp314-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp314-cp314-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 de63700ce815daddf5fe95d2247d9b73ae1239a8743df80589fb0269401405c0
MD5 8a9923b75214d7884faba3f73d16ae0c
BLAKE2b-256 22e2bc1137e68022546f2485784662a331558e109d3eead2f0abedac0894e0ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp314-cp314-manylinux_2_24_aarch64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2bc6ccd4afbadb9d00ab928830a68e15332860b63dbe283ce48ed09b12e01e2
MD5 8c527d4cf6a4da7608b1d73068e9c176
BLAKE2b-256 1737418305221dffb4e536230c5a781e2901ef2f8769aee0e321804945915831

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 688ef9fa7110fccd14c056bd76d142572701b5534dc70bb9225d0dc1ccfef0d9
MD5 5e38d0f71237d899a4a0b29b363b349c
BLAKE2b-256 ad9c8f6721a9b07d63d11c4aa18e69b14cf7f672b7eb87e80bf94d1f73d8f5b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp313-cp313-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp313-cp313-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 3df2003ada1ed0989bab32f406cbefa010682486b1cd9520b691d855c7977d7b
MD5 ac0a9c8f481673e174f973e7082e4f79
BLAKE2b-256 97218c08ff5b7a7659fdef6263f82d42d02493b60390bcd296cafeef22b4ed29

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp313-cp313-manylinux_2_24_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp313-cp313-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp313-cp313-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 140dae7bb3f6869dc9e6c1f1ad1dba918b9bd23d2a5a169c8925465c2a69c497
MD5 836487bff56b590f80e0c751e99ad85e
BLAKE2b-256 0f63a863c71b4f1720538799505ce8829cf105c0577315c385d623fbbb680ade

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp313-cp313-manylinux_2_24_aarch64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ddec16bd32c22b72d88581bbd96a09816dc6987039844e5f50849b879b1a38be
MD5 58252f466eaa583f81485afc128c5975
BLAKE2b-256 30539c93c47e971d0526fb721e9db2e7626b3b20fb5bd05f1a5e4531c7e3153b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f38f5b99e336075755b333eff85405ce1bce0d343938112089e6ef6860f58b1b
MD5 a058e7893f9de1ef4d6c5beacd089a64
BLAKE2b-256 049b0faa4b9eb017af80ef29f317c59fd84ba21597f3812233386f162c3cb428

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp312-cp312-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp312-cp312-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 c8b1e1b1ffd9bea21dd4aea15ea9f00987d3e19e768fcbadc97ce6dfc961d9b0
MD5 cd85b25c7d3497e4093d3cd654862db3
BLAKE2b-256 74e1d445510d5aa05a0d9d104e0a6e294418fba106708d54ecc8eafebbf790ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp312-cp312-manylinux_2_24_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp312-cp312-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp312-cp312-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 4d925089edcb25e5ff91d777eee034820e170c0e67cd9ca9f671757b84a4b7bd
MD5 e41c3968f826f9dd40453618edd04ea0
BLAKE2b-256 412cad4b6312cdce2dfff96af9e25b87ffceaa120c59c5c916069c5ece24b0d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp312-cp312-manylinux_2_24_aarch64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 209f725d46c436ca9ea8bfd0456d95a76c015626da04ffbb4dec6410e336c24d
MD5 5ed73fe56733dc2ce5bda80266c3e020
BLAKE2b-256 9a2e1b3a07e82eae581cda6f815de2ab2900e975fbef406f789a115a23b13089

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3ae76a4516dca02b1ed23a11386673f0436078e179704914f9cccac4f8e39bd9
MD5 ef5912b5d2f6100c6a0a86eac469442b
BLAKE2b-256 6ed45ae956a8af09de9d9fb5f3295a3313c775d05bc5ad1a76a3ac831389e2b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp311-cp311-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp311-cp311-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 441d9b1da59222a5cff6bcc7a3e116271ae74a99eb91442cceee0d03c62db4f0
MD5 f3435987998d5427455abb6be2100288
BLAKE2b-256 b7df541f09625c8da20ca92fee32dbaee5ce2196455f1dc378cf09c6155d5d39

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp311-cp311-manylinux_2_24_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp311-cp311-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp311-cp311-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 0c70bde83725901b2f6ff08b302fcc30516a4f823a008c242dcf4f93cdb7e6da
MD5 c138ed916ece1a0629beb620aed8f884
BLAKE2b-256 a58c174a1690ff8c5b63c749c91b245f437642825d97cd0ea2e839a503396daf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp311-cp311-manylinux_2_24_aarch64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0e6b1cd8f698540bfea35c61cf0198ae21fb3b6e5d02f461bfccbb80a1029399
MD5 50486c3b8c519fef93a59c3bc4be4abf
BLAKE2b-256 4e13823955d7b5f16fa2dd105bcca484e1907fdb57b73fd2e797dae366a8c6a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydynox-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pydynox-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ff014ceda7beefe075e5826e59fdfd1b65ff3aa80a937d3471669d181e0d3b1a
MD5 1c1fab9be8aba5c544e5ef7e1a6eb8a3
BLAKE2b-256 dd116ca02f45044f24c9e352bba599acaca037265af5f2dbcfba47d93d2115f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydynox-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: release.yml on leandrodamascena/pydynox

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page