Skip to main content

Re-usable code for Python 3 projects.

Installation

uv add python3-commons

Optional Dependencies

Some features require extra dependencies. You can install them individually or all at once:

  • api-client: For python3_commons.api_client

  • audit: For python3_commons.audit

  • authn: For python3_commons.auth

  • authz: For python3_commons.permissions

  • cache: For python3_commons.cache

  • database: For python3_commons.db

  • object-storage: For python3_commons.object_storage

  • soap-client: For python3_commons.soap_client

  • all: Install all optional dependencies

uv add "python3-commons[all]"

Features

Async LRU Cache

An LRU cache decorator for asynchronous functions that handles await and prevents the dogpile effect (mitigating multiple concurrent calls for the same key by waiting for the first one to finish).

from python3_commons.async_functools import async_lru_cache

@async_lru_cache(maxsize=128)
async def fetch_expensive_data(item_id: int):
    # This function will only be called once for a given item_id
    # even if multiple tasks await it simultaneously.
    return await db.get(item_id)

# Usage
result = await fetch_expensive_data(42)

API Client

A context manager for aiohttp requests with built-in audit logging to S3 and standardized error mapping to Python exceptions.

from python3_commons.api_client import request
from aiohttp import ClientSession

async with ClientSession() as session:
    async with request(
        session,
        base_url="https://api.example.com",
        uri="/data",
        method="get",
        audit_name="my_service_audit"
    ) as response:
        data = await response.json()

SOAP Client

Async SOAP client support for zeep with S3 auditing capabilities.

from python3_commons.soap_client import soap_client

async with soap_client("https://example.com/service?wsdl") as client:
    result = await client.service.GetData(id=42)

Database Management

SQLAlchemy async engine and session management with pool tuning, health checks, and dynamic query builders.

from python3_commons.db import AsyncSessionManager
from python3_commons.conf import DBSettings

# Configuration
configs = {"default": DBSettings(dsn="postgresql+asyncpg://user:pass@localhost/db")}
manager = AsyncSessionManager(configs)

# Usage
async with manager.get_session_context("default") as session:
    result = await session.execute(...)

# Health check
from python3_commons.db import is_healthy
await is_healthy(manager.get_engine("default"))

Object Storage

Utilities for async S3 operations using aiobotocore.

from python3_commons import object_storage
import io

# Upload an object
await object_storage.put_object(
    bucket_name="my-bucket",
    path="uploads/file.txt",
    data=io.BytesIO(b"Hello World"),
    length=11
)

# Download an object
content = await object_storage.get_object("my-bucket", "uploads/file.txt")

# List objects
async for obj in object_storage.list_objects("my-bucket", "uploads/"):
    print(obj['Key'])

OIDC Authentication

Client for OpenID Connect authentication, supporting configuration fetching, JWKS, and token acquisition.

from python3_commons.auth import OIDCClient
from pydantic import HttpUrl

client = OIDCClient(
    authority_url=HttpUrl("https://auth.example.com/realms/myrealm"),
    client_id="my-app-client",
    client_secret="secret"
)

async with client:
    token_response = await client.fetch_token(username="user", password="password")
    print(token_response.access_token)

Valkey Cache

Async caching using Valkey (Redis-compatible) with automatic Msgpack serialization for complex types.

from python3_commons import cache

# Store a dictionary
await cache.store("user:123", {"name": "Alice", "role": "admin"}, ttl=3600)

# Retrieve it
user_data = await cache.get("user:123")

# Set operations
await cache.add_set_item("active_users", "user:123")
is_active = await cache.has_set_item("active_users", "user:123")

Structured Logging

A JSONFormatter for structured logging, compatible with standard Python logging.

import logging
from python3_commons.log.formatters import JSONFormatter

handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger().addHandler(handler)

logger = logging.getLogger("app")
logger.info("User logged in", extra={"user_id": "abc-123", "ip": "1.2.3.4"})

Serialization

Enhanced JSON and Msgpack serialization for types not handled by default (Decimal, datetime, date, dataclasses, Pydantic models).

from python3_commons.serializers.msgspec import serialize_msgpack, deserialize_msgpack
from decimal import Decimal
from datetime import datetime

data = {
    "amount": Decimal("150.75"),
    "timestamp": datetime.now(),
    "tags": {"finance", "internal"}
}

# Serialize to Msgpack
binary = serialize_msgpack(data)

# Deserialize back
restored = deserialize_msgpack(binary)

RBAC Permissions

Database-backed Role-Based Access Control (RBAC) permission checking.

from python3_commons.permissions import has_user_permission
from uuid import UUID

user_uuid = UUID("...")
allowed = await has_user_permission(session, user_uuid, "reports.view")

General Helpers

A collection of useful utility functions:

  • to_snake_case(text): Converts strings to snake_case.

  • round_decimal(value, places): Rounds Decimal values.

  • tries(n): An async retry decorator.

  • log_execution_time: An async decorator to log how long a function takes.

  • date_from_string / datetime_from_string: Flexible date/time parsing.

  • request_to_curl: Converts request parameters to a curl command string.

from python3_commons.helpers import tries, log_execution_time

@tries(3)
@log_execution_time
async def flaky_network_call():
    ...

Async CSV Stream

Efficiently generate CSV data as a byte stream from an async generator of tuples.

from python3_commons.generators import tuple_csv_stream

async def generate_rows():
    for i in range(1000):
        yield (i, f"Name {i}", 10.5 * i)

async for chunk in tuple_csv_stream(generate_rows(), header=("ID", "Name", "Value")):
    # Send chunk to HTTP response or write to file
    pass

Download files

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

Source Distribution

python3_commons-0.24.0.tar.gz (135.1 kB view details)

Uploaded Source

Built Distribution

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

python3_commons-0.24.0-py3-none-any.whl (47.7 kB view details)

Uploaded Python 3

File details

Details for the file python3_commons-0.24.0.tar.gz.

File metadata

  • Download URL: python3_commons-0.24.0.tar.gz
  • Upload date:
  • Size: 135.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for python3_commons-0.24.0.tar.gz
Algorithm Hash digest
SHA256 264c000cbeda5d820c6c863751ab5533522959b45af22782212faffbc82d1a5f
MD5 9e553203253885917ed5ce962039e207
BLAKE2b-256 a489fd0394f37ef322df1fd0ef8e6cbde9db56e81977204d5b136c70808dff8d

See more details on using hashes here.

File details

Details for the file python3_commons-0.24.0-py3-none-any.whl.

File metadata

File hashes

Hashes for python3_commons-0.24.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6caaaf78d72a4c98e5225d86fb000c242da71188079b20e158ead2a233b4d47b
MD5 f5a4bce7dbc9a9caa3b9a4823a60cea1
BLAKE2b-256 93245b8edeeb38b4812a3c1e69c44b483a98e4152066a624d82e88e97b1e9eac

See more details on using hashes here.

Release history Release notifications | RSS feed

0.24.6

2 files

0.24.5

2 files

0.24.4

2 files

0.24.3

2 files

0.24.2

2 files

0.24.1

2 files

This release

0.24.0 This release

2 files

0.23.4

2 files

0.23.3

2 files

0.23.2

2 files

0.23.1

2 files

0.23.0

2 files

0.22.10

2 files

0.22.9

2 files

0.22.8

2 files

0.22.7

2 files

0.22.6

2 files

0.22.5

2 files

0.22.4

2 files

0.22.3

2 files

0.21.2

2 files

0.21.1

2 files

0.21.0

2 files

0.20.16

2 files

0.20.14

2 files

0.20.13

2 files

0.20.12

2 files

0.20.11

2 files

0.20.10

2 files

0.20.9

2 files

0.20.8

2 files

0.20.7

2 files

0.20.6

2 files

0.20.5

2 files

0.20.4

2 files

0.20.3

2 files

0.20.2

2 files

0.20.1

2 files

0.20.0

2 files

0.19.0

2 files

0.18.22

2 files

0.18.21

2 files

0.18.20

2 files

0.18.19

2 files

0.18.18

2 files

0.18.17

2 files

0.18.16

2 files

0.18.15

2 files

0.18.14

2 files

0.18.13

2 files

0.18.12

2 files

0.18.11

2 files

0.18.10

2 files

0.18.9

2 files

0.18.8

2 files

0.18.7

2 files

0.18.6

2 files

0.18.5

2 files

0.18.4

2 files

0.18.3

2 files

0.18.2

2 files

0.18.1

2 files

0.18.0

2 files

0.17.8

2 files

0.17.7

2 files

0.17.6

2 files

0.17.5

2 files

0.17.4

2 files

0.17.3

2 files

0.17.2

2 files

0.17.1

2 files

0.17.0

2 files

0.16.8

2 files

0.16.7

2 files

0.16.6

2 files

0.16.5

2 files

0.16.4

2 files

0.16.3

2 files

0.16.2

2 files

0.16.1

2 files

0.16.0

2 files

0.15.21

2 files

0.15.20

2 files

0.15.19

2 files

0.15.18

2 files

0.15.17

2 files

0.15.16

2 files

0.15.15

2 files

0.15.14

2 files

0.15.13

2 files

0.15.12

2 files

0.15.11

2 files

0.15.10

2 files

0.15.9

2 files

0.15.8

2 files

0.15.7

2 files

0.15.6

2 files

0.15.5

2 files

0.15.4

2 files

0.15.3

2 files

0.15.2

2 files

0.15.1

2 files

0.15.0

2 files

0.14.26

2 files

0.14.25

2 files

0.14.24

2 files

0.14.23

2 files

0.14.22

2 files

0.14.21

2 files

0.14.20

2 files

0.14.19

2 files

0.14.18

2 files

0.14.17

2 files

0.14.16

2 files

0.14.15

2 files

0.14.14

2 files

0.14.13

2 files

0.14.12

2 files

0.14.11

2 files

0.14.10

2 files

0.14.9

2 files

0.14.8

2 files

0.14.7

2 files

0.14.6

2 files

0.14.5

2 files

0.14.4

2 files

0.14.3

2 files

0.14.2

2 files

0.14.1

2 files

0.13.5

2 files

0.13.4

2 files

0.13.3

1 file

0.13.2

2 files

0.13.1

2 files

0.13.0

2 files

0.12.7

2 files

0.12.6

2 files

0.12.5

2 files

0.12.4

2 files

0.12.3

2 files

0.12.2

2 files

0.12.0

2 files

0.11.1

2 files

0.11.0

2 files

0.10.2

2 files

0.10.1

2 files

0.10.0

2 files

0.9.22

2 files

0.9.21

2 files

0.9.20

2 files

0.9.19

2 files

0.9.18

2 files

0.9.17

2 files

0.9.16

2 files

0.9.15

2 files

0.9.14

2 files

0.9.13

2 files

0.9.12

2 files

0.9.11

2 files

0.9.10

2 files

0.9.8

2 files

0.9.7

2 files

0.9.6

2 files

0.9.5

2 files

0.9.4

2 files

0.9.3

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.48

2 files

0.8.47

2 files

0.8.46

2 files

0.8.45

2 files

0.8.44

2 files

0.8.43

2 files

0.8.42

2 files

0.8.41

2 files

0.8.40

2 files

0.8.39

2 files

0.8.38

2 files

0.8.36

2 files

0.8.35

2 files

0.8.34

2 files

0.8.33

2 files

0.8.32

2 files

0.8.31

2 files

0.8.30

2 files

0.8.29

2 files

0.8.28

2 files

0.8.27

2 files

0.8.26

2 files

0.8.25

2 files

0.8.24

2 files

0.8.23

2 files

0.8.22

2 files

0.8.21

2 files

0.8.20

2 files

0.8.19

2 files

0.8.18

2 files

0.8.17

2 files

0.8.16

2 files

0.8.15

2 files

0.8.13

2 files

0.8.12

2 files

0.8.11

2 files

0.8.10

2 files

0.8.9

2 files

0.8.8

2 files

0.8.7

2 files

0.8.6

2 files

0.8.5

2 files

0.8.4

2 files

0.8.3

2 files

0.8.2

2 files

0.8.1

2 files

0.8.0

2 files

0.7.6

2 files

0.7.5

2 files

0.7.4

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.20

2 files

0.6.19

2 files

0.6.18

2 files

0.6.17

2 files

0.6.16

2 files

0.6.15

2 files

0.6.14

2 files

0.6.13

2 files

0.6.12

2 files

0.6.11

2 files

0.6.10

2 files

0.6.9

2 files

0.6.8

2 files

0.6.7

2 files

0.6.6

2 files

0.6.5

2 files

0.6.4

2 files

0.6.3

2 files

0.6.2

2 files

0.6.1

2 files

0.6.0

2 files

0.5.39

2 files

0.5.38

2 files

0.5.37

2 files

0.5.34

2 files

0.5.33

2 files

0.5.32

2 files

0.5.31

2 files

0.5.30

2 files

0.5.29

2 files

0.5.28

2 files

0.5.26

2 files

0.5.25

2 files

0.5.24

2 files

0.5.23

2 files

0.5.22

2 files

0.5.21

2 files

0.5.20

2 files

0.5.19

2 files

0.5.18

2 files

0.5.17

2 files

0.5.16

2 files

0.5.14

2 files

0.5.13

2 files

0.5.12

2 files

0.5.11

2 files

0.5.10

2 files

0.5.9

2 files

0.5.8

2 files

0.5.7

2 files

0.5.6

2 files

0.5.5

2 files

0.5.4

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.15

2 files

0.4.0

2 files

0.3.19

2 files

0.3.17

2 files

0.3.16

2 files

0.3.15

2 files

0.3.14

2 files

0.3.13

2 files

0.3.12

2 files

0.3.11

2 files

0.3.10

2 files

0.3.9

2 files

0.3.8

2 files

0.3.7

2 files

0.3.6

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.17

2 files

0.2.16

2 files

0.2.11

2 files

0.2.10

2 files

0.2.9

2 files

0.2.8

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

0.0.30

2 files

0.0.29

2 files

0.0.28

2 files

0.0.27

2 files

0.0.26

2 files

0.0.25

2 files

0.0.24

2 files

0.0.23

2 files

0.0.22

2 files

0.0.21

2 files

0.0.20

2 files

0.0.19

2 files

0.0.18

2 files

0.0.17

2 files

0.0.16

2 files

0.0.15

2 files

0.0.14

2 files

0.0.13

2 files

0.0.12

2 files

0.0.11

2 files

0.0.10

2 files

0.0.9

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page