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.2.tar.gz (11.3 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.2-py3-none-any.whl (7.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: vgi_easter-0.1.2.tar.gz
  • Upload date:
  • Size: 11.3 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.2.tar.gz
Algorithm Hash digest
SHA256 382cd982c63006c960710ab8604fd6dcfce7496862b2c2835759d60bea2c3748
MD5 ef97adfcc41ee87bc61943cb7afea97e
BLAKE2b-256 100d4729f7b8d95b86ae61e9c5ab4e28ff20cf1a0454d915554a5f024cb01a8c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: vgi_easter-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 7.0 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 4f5140748ec25ea7e0430e872f4d5661a0ba6921a78c4cfbab03167633a28a77
MD5 63172f6145f2c1f095321b45e625531b
BLAKE2b-256 9ecddafd5317aae70279bd0530fab99159aa4a4de5a64cb3d4dc37897331196e

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