Skip to main content

SQLAlchemy building blocks for Belgie

Project description

Belgie Alchemy

[!WARNING] Belgie Alchemy is a low-level SQLAlchemy layer. You own the concrete models, migrations, and schema changes in your app. It provides mixins and adapters, not a database framework.

Belgie Alchemy is the SQLAlchemy package behind Belgie's auth, organization, and team features. It gives you explicit adapter wiring and small composable mixins so you can build app-owned models without giving up type safety or clear schema boundaries.

Installation

uv add belgie[alchemy]
uv add belgie[alchemy,organization,team]

[!NOTE] Application code should import from belgie.alchemy. The implementation package is belgie_alchemy, but the public re-exports live under belgie.alchemy.

What It Provides

  • BelgieAdapter for core auth records.
  • OrganizationAdapter for organization membership and invitations.
  • TeamAdapter for organization-scoped teams.
  • AccountMixin, IndividualMixin, OAuthAccountMixin, SessionMixin, and OAuthStateMixin for account/auth models.
  • OrganizationMixin, OrganizationMemberMixin, and OrganizationInvitationMixin for organization models.
  • TeamMixin and TeamMemberMixin for team models.

Quick Start

from brussels.base import DataclassBase
from brussels.mixins import PrimaryKeyMixin, TimestampMixin

from belgie.alchemy import AccountMixin, BelgieAdapter, OAuthAccountMixin, OAuthStateMixin, SessionMixin, IndividualMixin


class Individual(DataclassBase, PrimaryKeyMixin, TimestampMixin, IndividualMixin):
    pass


class Account(DataclassBase, PrimaryKeyMixin, TimestampMixin, AccountMixin):
    pass


class OAuthAccount(DataclassBase, PrimaryKeyMixin, TimestampMixin, OAuthAccountMixin):
    pass


class Session(DataclassBase, PrimaryKeyMixin, TimestampMixin, SessionMixin):
    pass


class OAuthState(DataclassBase, PrimaryKeyMixin, TimestampMixin, OAuthStateMixin):
    pass


adapter = BelgieAdapter(
    account=Account,
    individual=Individual,
    oauth_account=OAuthAccount,
    session=Session,
    oauth_state=OAuthState,
)

This keeps your schema in your application while Belgie handles the adapter contract. You can add custom columns and relationships on top of the mixins without changing how the adapter works.

Auth Models

The auth mixins map to the common Belgie records:

  • IndividualMixin adds email, profile, scopes, and related OAuth account/session/state relationships.
  • AccountMixin stores the shared account hierarchy fields used by individuals, organizations, and teams.
  • SessionMixin stores session expiry plus request metadata.
  • OAuthStateMixin stores OAuth state, PKCE verifier, redirect URL, and optional user linkage.

The default PostgreSQL variants use CITEXT for case-insensitive email, provider, and provider_account_id columns.

[!NOTE] If you use the default PostgreSQL column variants, make sure the citext extension is installed in your database.

Organization And Team

Use the organization and team mixins when your app needs shared org membership plus team-scoped access:

[!NOTE] The snippet below assumes you have already defined Account, Individual, OAuthAccount, Session, OAuthState, Organization, OrganizationMember, OrganizationInvitation, Team, and TeamMember from the mixins above.

from belgie.alchemy import (
    AccountMixin,
    BelgieAdapter,
    OAuthAccountMixin,
    OAuthStateMixin,
    OrganizationInvitationMixin,
    OrganizationMemberMixin,
    OrganizationMixin,
    SessionMixin,
    TeamMemberMixin,
    TeamMixin,
    IndividualMixin,
)
from belgie.alchemy.organization import OrganizationAdapter
from belgie.alchemy.team import TeamAdapter

core_adapter = BelgieAdapter(
    account=Account,
    individual=Individual,
    oauth_account=OAuthAccount,
    session=Session,
    oauth_state=OAuthState,
)

# Organizations only (no team plugin)
organization_adapter = OrganizationAdapter(
    organization=Organization,
    member=OrganizationMember,
    invitation=OrganizationInvitation,
)

# Organization + team plugins: one adapter for both plugins
team_adapter = TeamAdapter(
    organization=Organization,
    member=OrganizationMember,
    invitation=OrganizationInvitation,
    team=Team,
    team_member=TeamMember,
)

When you enable both plugins, use the team-capable adapter for both. If you only need organizations, the organization adapter is sufficient.

The organization and team protocols match the SQLAlchemy row shape, so your app models can stay plain SQLAlchemy classes without adding explicit protocol bases just to satisfy ty.

The default PostgreSQL variants also use CITEXT for organization slug values and pending invitation email addresses. Pending invitations are unique per (organization_id, email) while their status is pending.

Examples

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

belgie_alchemy-0.15.1.tar.gz (14.2 kB view details)

Uploaded Source

Built Distribution

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

belgie_alchemy-0.15.1-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

File details

Details for the file belgie_alchemy-0.15.1.tar.gz.

File metadata

  • Download URL: belgie_alchemy-0.15.1.tar.gz
  • Upload date:
  • Size: 14.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for belgie_alchemy-0.15.1.tar.gz
Algorithm Hash digest
SHA256 3b08bf83c2a2e3151f1a55d7ed20acd8d7e57a3e0448cb411ab4f85a85038b95
MD5 685ea26f7064a71b00b69aa134d7535d
BLAKE2b-256 16c99dbd00632b351caa93947bd44b3bf85ebd4e24957a2ab97005cc31654b43

See more details on using hashes here.

File details

Details for the file belgie_alchemy-0.15.1-py3-none-any.whl.

File metadata

  • Download URL: belgie_alchemy-0.15.1-py3-none-any.whl
  • Upload date:
  • Size: 23.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for belgie_alchemy-0.15.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d1b97642257a2c40a76773c90c51ead466e8d32108e6ad9cf97782b5be3728db
MD5 9fe706bf3097d8e5ed0c2fd16e4b94d2
BLAKE2b-256 e48e2f966163b9ef05db60fda284fac127b44abb8f38fb5cc4503c9ba5f68b1e

See more details on using hashes here.

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