Skip to main content

A minimal VGI (Vector Gateway Interface) worker exposing a SQL easter_date(year) scalar function to DuckDB

Project description

Vector Gateway Interface

vgi-easter

CI PyPI Python License: MIT

A tiny VGI (Vector Gateway Interface) worker that gives DuckDB one SQL function — easter_date(year) — returning the date of Western (Gregorian) Easter Sunday. It has no external data and almost no code, which makes it a clean, copyable example of a VGI scalar-function worker.

Quick start

In DuckDB:

ATTACH 'easter' (TYPE 'vgi', LOCATION 'uvx vgi-easter');

SELECT easter.easter_date(2025);   -- 2025-04-20

SELECT year, easter.easter_date(year) AS easter
FROM range(2020, 2025) t(year);

DuckDB launches the worker for you, and easter_date then behaves like a native function (a null year yields a null date). The uvx vgi-easter location fetches the worker on demand; to keep it around, pip install vgi-easter.

How it works

A VGI worker publishes catalogs, schemas, and functions that DuckDB can ATTACH and query as if they were built in. Values cross the boundary as Apache Arrow, so they stay columnar end to end.

This worker publishes a single function:

easter                                  (catalog)
└── main                                (schema)
    └── easter_date(year BIGINT) → DATE

The whole implementation is ~160 lines in easter_worker.py: the date calculation (_easter_sunday, the Anonymous Gregorian Computus — pure standard library), a ScalarFunction that maps an Arrow array of years to dates, and a few lines wiring it into a catalog.

Running it

Once installed, the package gives you one command per VGI transport:

Command Transport Use it when
vgi-easter stdio DuckDB spawns the worker as a subprocess (the quickstart)
vgi-easter-http HTTP you want a long-running server to attach to

To run over HTTP, start the server and attach to its URL:

VGI_SIGNING_KEY=dev vgi-easter-http --host 0.0.0.0 --port 8000
ATTACH 'easter' (TYPE 'vgi', LOCATION 'http://localhost:8000');

Working from a checkout instead? Both modules carry PEP 723 metadata, so uv run easter_worker.py (stdio) and uv run serve.py (HTTP) run without installing anything.

Configuration

Variable Purpose
VGI_SIGNING_KEY Signing key for HTTP state tokens (required by the HTTP server).
VGI_HTTP_HOST / VGI_HTTP_PORT HTTP bind address (default: all interfaces / 8000).
VGI_EASTER_GIT_COMMIT Reported as the catalog's implementation_version.
VGI_WORKER_DEBUG Set to 1 for debug logging.

Development

Requires Python 3.13+ and uv; the only dependency is vgi-python.

uv run --frozen pytest tests/ -q

The tests/ suite covers the Easter calculation (including the March 22 / April 25 extremes) and the Arrow compute path. A separate sqllogictest suite in test/sql/ drives the worker through the real DuckDB vgi extension. CI runs both on Linux, macOS, and Windows — see ci/README.md.

Releasing

vgi-easter is built with hatchling and published to PyPI by CI when a GitHub Release is created (it runs the test suites, then uv build && uv publish). To cut a release, bump version in pyproject.toml and publish a GitHub Release.

License

MIT — see LICENSE. Copyright 2026 Query Farm LLC — https://query.farm

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

vgi_easter-0.1.1.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

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

vgi_easter-0.1.1-py3-none-any.whl (6.7 kB view details)

Uploaded Python 3

File details

Details for the file vgi_easter-0.1.1.tar.gz.

File metadata

  • Download URL: vgi_easter-0.1.1.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","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 vgi_easter-0.1.1.tar.gz
Algorithm Hash digest
SHA256 b9b8baf3f6d72ee70d449f3fc833659f1ab676b5da99a0197fee94c86c5658fd
MD5 d79966971198cc1b44adf292b6e7fca1
BLAKE2b-256 18e7d2b7d120f52708929c163661aedb949ddfcc8b2ee0454972aad9d9a31876

See more details on using hashes here.

File details

Details for the file vgi_easter-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: vgi_easter-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 6.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","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 vgi_easter-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 dd29c59d95744d1a3b794ecc43afb771c61b18ad421ba2845e94eab821bc9a51
MD5 33d1878241a3823e9efad0f230be84fc
BLAKE2b-256 bdb5e0f4b485fa02247649a74c4e840e01ef4ad448c4e053abef7b5e9f55d795

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