Skip to main content

A base62-encoded identifier for use in URLs. Supports Pydantic validation.

Project description

ResourceId

The resource-id package provides a ResourceId class implementing base62-encoded identifiers, suitable for URLs, URIs, and perhaps something else.

ResourceId is written to work with Pydantic. In particular, it can be used with FastAPI as a path parameter.

tox

Requirements

Resource-id requires Python >= 3.10. As of version 1.4.0, resource-id requires pydantic 2.

Installation

pip install resource-id

Usage

There is one class, ResourceId.

from resource_id import ResourceId

Create a ResourceId:

id = ResourceId(43)
id1 = ResourceId('deadbeef')
id2 = ResourceId(UUID(int=101))

A ResourceId can be created from a str (a base62 string, or a UUID in dashed or dashless-hex form), an int, a uuid.UUID, or another ResourceId. The value must be non-negative and fit in a UUID (< 2**128).

Create a URL path using a ResourceId:

path = f"/api/foo/{ResourceId('deadbeef')}"

Define a FastAPI request handler with a ResourceId:

@app.get('/api/foo/{foo_id}')
async def get_foo(foo_id: ResourceId):
    ...

Here, FastAPI will validate the value of the path variable foo_id with Pydantic. If validation fails, FastAPI returns 422 Unprocessable Entity.

Litestar

FastAPI builds its OpenAPI schema from Pydantic, so ResourceId works there out of the box. Litestar uses its own schema system and has no public API for custom path-parameter types (litestar#4205), so resource-id ships the integration as an optional extra:

pip install resource-id[litestar]

Importing resource_id.litestar registers ResourceId as the resourceid path-parameter type; add ResourceIdSchemaPlugin to your app so ResourceId fields render correctly in the OpenAPI document:

import resource_id.litestar  # registers the {...:resourceid} path-param type
from resource_id.litestar import ResourceIdPathParameter, ResourceIdSchemaPlugin
from litestar import Litestar, get


@get("/api/foo/{foo_id:resourceid}")
async def get_foo(foo_id: ResourceIdPathParameter) -> str:
    ...


app = Litestar([get_foo], plugins=[ResourceIdSchemaPlugin()])

The path parameter is parsed into a ResourceId (an invalid value yields a 400), and the plugin renders ResourceId fields as {"type": "string", "format": "resource-id"} instead of the empty schema litestar would otherwise emit.

Convert a ResourceId to a UUID:

res_id = ResourceId(43)
id = res_id.uuid

More

I have some projects that use PostgreSQL and asyncpg. It is quite simple to add conversion between PostgreSQL UUID datatype and ResourceId.

def get_uuid(value: ResourceId) -> str:
    assert isinstance(value, ResourceId)
    return str(value.uuid)


def get_resource_id(value: str) -> ResourceId:
    assert isinstance(value, str)
    return ResourceId(UUID(value))


async def init_connection(conn: asyncpg.Connection):
    await conn.set_type_codec(
        "uuid", encoder=get_uuid, decoder=get_resource_id, schema="pg_catalog"
    )

Testing

This project uses uv for development. To set up and run tests:

uv sync --all-extras --dev
uv run pytest tests

Package Verification

As of version 1.4.0, releases use trusted publishing. As of version 1.5.0, commits are now signed using gitsign.

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

resource_id-1.6.0.tar.gz (90.0 kB view details)

Uploaded Source

Built Distribution

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

resource_id-1.6.0-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file resource_id-1.6.0.tar.gz.

File metadata

  • Download URL: resource_id-1.6.0.tar.gz
  • Upload date:
  • Size: 90.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for resource_id-1.6.0.tar.gz
Algorithm Hash digest
SHA256 bf72da25580730602488d0d1153a045790878aebeeba92e9244d8ba5b259c712
MD5 9186a69b10ac22490e597a337bd0612b
BLAKE2b-256 fd2be37a0454975236b04c9eaa55689d8036220ccaa0370fa64024a49e2b5052

See more details on using hashes here.

Provenance

The following attestation bundles were made for resource_id-1.6.0.tar.gz:

Publisher: release-package.yml on declaresub/resource-id

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

File details

Details for the file resource_id-1.6.0-py3-none-any.whl.

File metadata

  • Download URL: resource_id-1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 8.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for resource_id-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 78ecded34b7be8373abe6d81e716287d4ffe3f962f209d5ab93337f2869e2786
MD5 627ddcd8e70330faad37dc8b45125b4b
BLAKE2b-256 86901b0072f631b3a4b4ca5b23da137f1ce3f01ebf226be457d7a6e2d193aed8

See more details on using hashes here.

Provenance

The following attestation bundles were made for resource_id-1.6.0-py3-none-any.whl:

Publisher: release-package.yml on declaresub/resource-id

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