Skip to main content

Type-friendly utilities for moving data between Python objects, Arrow, Polars, Pandas, Spark, and Databricks

Project description

Yggdrasil (Python)

Type-friendly utilities for moving data between Python objects, Arrow, Polars, pandas, Spark, and Databricks. The package bundles enhanced dataclasses, casting utilities, and lightweight wrappers around Databricks and HTTP clients so Python/data engineers can focus on schemas instead of plumbing.

When to use this package

Use Yggdrasil when you need to:

  • Convert payloads across dataframe engines without rewriting type logic for each backend.
  • Define dataclasses that auto-coerce inputs, expose defaults, and surface Arrow schemas.
  • Run Databricks SQL jobs or manage clusters with minimal boilerplate.
  • Add resilient retries, concurrency helpers, and dependency guards to data pipelines.

Prerequisites

  • Python 3.10+
  • uv for virtualenv and dependency management.

Optional extras:

  • polars, pandas, pyarrow, and pyspark for engine-specific conversions.
  • databricks-sdk for workspace, SQL, jobs, and compute helpers.
  • msal for Azure AD authentication when using MSALSession.

Installation

From the python/ directory:

uv venv .venv
source .venv/bin/activate
uv pip install -e .[dev]

Extras are grouped by engine:

  • .[polars], .[pandas], .[spark], .[databricks] – install only the integrations you need.
  • .[dev] – adds testing, linting, and typing tools (pytest, ruff, black, mypy).

Quickstart

Define an Arrow-aware dataclass, coerce inputs, and cast across containers:

from yggdrasil import yggdataclass
from yggdrasil.types.cast import convert
from yggdrasil.types import arrow_field_from_hint

@yggdataclass
class User:
    id: int
    email: str
    active: bool = True

user = User.__safe_init__("123", email="alice@example.com")
assert user.id == 123 and user.active is True

payload = {"id": "45", "email": "bob@example.com", "active": "false"}
clean = User.from_dict(payload)
print(clean.to_dict())

field = arrow_field_from_hint(User, name="user")
print(field)  # user: struct<id: int64, email: string, active: bool>

numbers = convert(["1", "2", "3"], list[int])
print(numbers)

Databricks example

Install the databricks extra and run SQL with typed results:

from yggdrasil.databricks.workspaces import Workspace
from yggdrasil.databricks.sql import SQLEngine

ws = Workspace(host="https://<workspace-url>", token="<token>")
engine = SQLEngine(workspace=ws)

stmt = engine.execute("SELECT 1 AS value")
result = stmt.wait(engine)
tbl = result.arrow_table()
print(tbl.to_pandas())

Parallel processing and retries

from yggdrasil.pyutils import parallelize, retry

@parallelize(max_workers=4)
def square(x):
    return x * x

@retry(tries=5, delay=0.2, backoff=2)
def sometimes_fails(value: int) -> int:
    ...

print(list(square(range(5))))

Project layout

  • yggdrasil/dataclassesyggdataclass decorator plus Arrow schema helpers.
  • yggdrasil/types – casting registry (convert, register_converter), Arrow inference, and default generators.
  • yggdrasil/libs – optional bridges to Polars, pandas, Spark, and Databricks SDK types.
  • yggdrasil/databricks – workspace, SQL, jobs, and compute helpers built on the Databricks SDK.
  • yggdrasil/requests – retry-capable HTTP sessions and Azure MSAL auth helpers.
  • yggdrasil/pyutils – concurrency and retry decorators.
  • yggdrasil/ser – serialization helpers and dependency inspection utilities.
  • tests/ – pytest-based coverage for conversions, dataclasses, requests, and platform helpers.

Testing

From python/:

pytest

Optional checks when developing:

ruff check
black .
mypy

Troubleshooting and common pitfalls

  • Missing optional dependency: Install the matching extra (e.g., uv pip install -e .[polars]) or wrap calls with require_polars/require_pyspark from yggdrasil.libs.
  • Schema mismatches: Use arrow_field_from_hint and CastOptions to enforce expected Arrow metadata when casting.
  • Databricks auth: Provide host and token to Workspace. For Azure, ensure environment variables align with your workspace deployment.

Contributing

  1. Fork and branch.
  2. Install with uv pip install -e .[dev].
  3. Run tests and linters.
  4. Submit a PR describing the change and any new examples added to the docs.

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

ygg-0.1.45.tar.gz (146.3 kB view details)

Uploaded Source

Built Distribution

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

ygg-0.1.45-py3-none-any.whl (169.1 kB view details)

Uploaded Python 3

File details

Details for the file ygg-0.1.45.tar.gz.

File metadata

  • Download URL: ygg-0.1.45.tar.gz
  • Upload date:
  • Size: 146.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ygg-0.1.45.tar.gz
Algorithm Hash digest
SHA256 93b5568f3dcd472b26288b374b0efc57cd0017d1a528bf343ff35c0004711d8a
MD5 cb9f56b0ffdd37a41eb8a9f2ba2e33ac
BLAKE2b-256 e6e9784422510c3b268423c48a60b0f64dbd117d8b390b0fb7ad9e0ba33b5dc3

See more details on using hashes here.

File details

Details for the file ygg-0.1.45-py3-none-any.whl.

File metadata

  • Download URL: ygg-0.1.45-py3-none-any.whl
  • Upload date:
  • Size: 169.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ygg-0.1.45-py3-none-any.whl
Algorithm Hash digest
SHA256 6d2acf89adeed45e680bd13ac1ea4de7efff42e0bd15b501ffd78959070aa03c
MD5 e30661ac7c544efbda3e18ea50e634d7
BLAKE2b-256 938e746649b1d93f0ac6500d9a149c885742d22a3b4c3d0f5dc5510b9277b49e

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