Skip to main content

Python runtime for the East programming language

Project description

East.py

License: BSL 1.1

Python runtime for the East programming language.

Overview

East.py is a Python backend that enables East IR to be compiled and executed in Python environments. It is a Cython bridge to the native east-c runtime — IR compilation, the builtin library, execution, and serialization all run in east-c. It provides:

  • Complete type system - Full representation of all East types (primitives, containers, structs, variants, functions)
  • East values as Python data - Use East values as ordinary Python objects with eager methods that delegate to the east-c builtins, plus runtime validation/coercion at the Python↔East boundary
  • Full builtin library - Array, Set, Dict, String, DateTime, Blob, Integer, Float operations, exposed eagerly
  • Serialization - East text format, JSON, and BEAST (Binary East) support
  • DateTime formatting - Custom datetime parsing and printing with format strings
  • Platform integration - Expose Python functions to East with the @platform_function decorator

Using East values from Python

East runtime values are usable as ordinary Python data. Containers carry their East element types and expose eager methods that run immediately by delegating to the east-c builtins (no IR, no rewrite); chained collection results stay backed by east-c.

from east import (EastArray, StringType, FloatType, StructType, VectorType,
                  East, array, coerce_to)

# Construct + validate from native Python (dicts are coerced to the struct type)
LineItem = StructType([("name", StringType), ("price", FloatType)])
items = array(LineItem, [{"name": "a", "price": 1}, {"name": "b", "price": 2.0}])

# Eager methods execute now and chain
cheap = items.filter(lambda r: r["price"] < 2.0).sorted(key=lambda r: r["price"])

# Primitive builtins live on the East.<Type> namespaces (you can't add methods
# to Python's float/str/int) — they delegate to east-c too
East.Float.sqrt(2.0)
East.String.upper_case("hi")
East.less(StringType, "a", "b")

# Validate / coerce at a boundary; a mismatch raises a path-pinpointed EastTypeError
coerce_to([1, 2, 3], VectorType(FloatType))   # -> Vector<Float>

Platform functions

Expose a Python function to East with the @platform_function decorator. It infers sync/async, validates the result against the declared output (a named EastTypeError instead of silent corruption), and auto-collects the function:

from east import platform_function, platform_functions, struct, FloatType, ArrayType

@platform_function(inputs=[FloatType, ArrayType(LineItem)], output=ArrayType(LineItem))
def convert_prices(fx_rate, items):
    return items.map(lambda r: struct({"name": r["name"], "price": r["price"] * fx_rate}, LineItem))

platform = platform_functions(__name__)   # pass to compile() to register

For NumPy/torch interop, EastVector.data / EastMatrix.data are the contiguous NumPy buffers — torch.from_numpy(m.data) and EastMatrix(FloatType, tensor.numpy()) need no manual dtype juggling (the bridge canonicalizes at the east-c boundary).

Current Status

Fully implemented: the East type system, the full builtin library (exposed both through IR compilation and the eager value methods), serialization (East text, JSON, BEAST2, CSV), DateTime formatting, runtime validation/coercion, and the platform-function integration API. The compliance suite (shared across the TypeScript, C, and Python runtimes) passes in full.

Installation

# Install from source
git clone https://github.com/elaraai/east-workspace/tree/main/libs/east-py
cd east-py
pip install -e .

Quick Start

Here's a complete example showing how to load, compile, and execute East IR with platform functions:

import asyncio
from east.runtime.compiler import compile_from_json
from east.runtime.platform import PlatformFunction
from east.types.types import IntegerType, NullType, StringType

# Load IR JSON exported by the East TypeScript compiler (raw bytes).
# In this example the IR is a function that logs a message, fetches an HTTP
# status (async), and logs the response.
with open("fetch_status.ir.json", "rb") as f:
    ir_json = f.read()

# Define platform function implementations
def log_impl(message: str) -> None:
    """Sync platform function: log a message."""
    print(message)

async def fetch_status_impl(url: str) -> str:
    """Async platform function: fetch HTTP status from URL."""
    import urllib.request
    loop = asyncio.get_event_loop()
    response = await loop.run_in_executor(None, urllib.request.urlopen, url)
    return f"{response.status} ({response.msg})"

def time_ns_impl() -> int:
    """Sync platform function: get current time in nanoseconds."""
    import time
    return time.time_ns()

# Register platform functions with type signatures
platform = [
    PlatformFunction(
        name="log",
        inputs=[StringType],
        output=NullType,
        type="sync",
        fn=log_impl
    ),
    PlatformFunction(
        name="fetch_status",
        inputs=[StringType],
        output=StringType,
        type="async",
        fn=fetch_status_impl
    ),
    PlatformFunction(
        name="time_ns",
        inputs=[],
        output=IntegerType,
        type="sync",
        fn=time_ns_impl
    ),
]

# Compile the IR to a Python callable (is_async=True: a platform fn is async)
fetch_status = compile_from_json(ir_json, platform, is_async=True)

# Execute the compiled function
async def main():
    await fetch_status("https://www.google.com")
    # Output:
    # Fetching URL: https://www.google.com
    # Response status: 200 (OK) - fetched in 123.45 ms

if __name__ == "__main__":
    asyncio.run(main())

Development

# First-time setup (installs dependencies and pre-commit hooks)
make install

# Development workflow
make test          # Run test suite
make lint          # Run linter (ruff)
make format        # Format code
make typecheck     # Type check with mypy
make check         # Run all checks (lint + typecheck + test)

# Other useful commands
make repl          # Start Python REPL with east loaded
make coverage      # Generate HTML coverage report
make lint-fix      # Auto-fix linting issues
make clean         # Clean build artifacts

# Run the compliance suite directly (executes the IR corpus through the bridge)
uv run pytest tests/test_compliance.py -v

The native extensions (the east-c bridge and the Cython hot paths) are compiled at install time. After editing a .pyx/.pxd or the linked east-c sources, rebuild with make install (from the libs/east-py lib root) to recompile them.

Native build

The package compiles the native east-c runtime into a Cython extension (the _eastc bridge) at install time — this is required: IR compilation, execution, the builtin library, and the eager value methods all run through it. A few hot paths (struct/variant construction, BEAST2/CSV decoding, ordering) have additional Cython acceleration with a pure-Python fallback, but the core bridge is not optional.

Building requires a C compiler and python3-dev (Linux) or Xcode CLI tools (macOS); extensions compile automatically during pip install / uv sync / make install.

Architecture

The builtin library, IR compiler, execution, and serialization live in the native east-c runtime; this package is the Python type system plus a Cython bridge to it.

Module Structure

  • east/types/ - Type system + value representation

    • types.py - Type constructors, guards, comparison/unification
    • values.py - Value classes (EastArray/Set/Dict/Vector/Matrix/Struct/Variant/Ref/Blob), their eager methods, is_value_of/type_of
    • coercion.py - coerce_to / assert_value_of / explain_value_of / EastTypeError
    • construct.py - Ergonomic constructors (variant/some/none/match/struct/array)
    • type_of_type.py - Homoiconic type encoding (types are East values)
  • east/namespace.py - The East.<Type> scalar builtin namespaces (Float/Integer/String/DateTime/Boolean + compare/equal/less)

  • east/datetime_format.py - Format-string tokenizer for the DateTime print/parse builtins

  • east/runtime/ - Execution engine

    • compiler.py / _compiler_eastc.pyx - Bridge to east-c: compile IR, east_call, the eager call_builtin shim, and the Python-callback invoke hook
    • platform.py - PlatformFunction + the @platform_function on-ramp
    • errors.py - EastError
  • east/serialization/ - East text, JSON, BEAST2, CSV (thin wrappers over the east-c encoders/decoders)

  • east/utils/ordering.py - East total order (compare_for/equal_for/less_for/make_east_key)

  • east/_eastc_bridge.pyx, east/_eastc.pxd - The Cython ↔ east-c value/type marshalling layer

Claude Code plugin

The East ecosystem also ships a Claude Code plugin — East language skills, example search, and preemptive diagnostics for East code — installed separately from the elaraai marketplace:

# Inside Claude Code
/plugin marketplace add elaraai/east-workspace
/plugin install east@elaraai
# From a terminal
claude plugin marketplace add elaraai/east-workspace
claude plugin install east@elaraai

License

BSL 1.1 (Business Source License):

  • Non-production use (evaluation, testing, development) is free
  • Production use by or on behalf of for-profit entities requires a commercial license
  • Code becomes AGPL-3.0 four years after each release

See LICENSE.md for full details.

Commercial licensing: support@elara.ai

Ecosystem

  • East: Statically typed, expression-based language with serializable IR. Run portable logic across TypeScript, Python, C, and other runtimes.

    • @elaraai/east: Core language SDK with type system, expressions, and reference JS compiler
  • East Node: Node.js platform functions for I/O, databases, and system operations.

  • East C: C11 native runtime for executing East IR. Distributed via npm (launcher + per-platform optional dependencies) and as tarballs on each GitHub Release.

    • @elaraai/east-c-cli: npm launcher — installs the matching native binary as an optional dependency
    • east-c: Core runtime — type system, IR interpreter, builtins, serialization (Beast2, JSON, CSV, East text)
    • east-c-std: Console, FileSystem, Fetch, Crypto, Time, Path, Random
    • east-c-cli: CLI for running East IR programs natively
  • East Python: Python runtime, standard platform, I/O, and data-science platform functions. Published to PyPI.

    • east-py: Core Python runtime — type system, Cython bridge to the east-c runtime (compiler, builtins, serialization), eager value methods
    • east-py-std: Console, FileSystem, Fetch, Crypto, Time, Path, Random
    • east-py-io: SQLite, PostgreSQL, MySQL, MongoDB, Redis, S3, FTP, SFTP, XLSX, XML, compression
    • east-py-cli: CLI for running East IR programs in Python
    • east-py-datascience (PyPI) + @elaraai/east-py-datascience (npm): Optimization (MADS, Optuna, ALNS, GoogleOR), ML (XGBoost, LightGBM, NGBoost, PyTorch, Lightning, GP), Bayesian inference (PyMC), explainability (SHAP), conformal prediction (MAPIE)
  • East UI: Typed UI component definitions and React renderer, plus VS Code preview.

  • e3 — East Execution Engine: Durable execution engine for running East pipelines at scale. Git-like content-addressable storage, automatic memoization, reactive dataflow, real-time monitoring.

Links

About Elara

East is developed by Elara AI Pty Ltd, an AI-powered platform that creates economic digital twins of businesses that optimize performance. Elara combines business objectives, decisions and data to help organizations make data-driven decisions across operations, purchasing, sales and customer engagement, and project and investment planning. East powers the computational layer of Elara solutions, enabling the expression of complex business logic and data in a simple, type-safe and portable language.


Developed by Elara AI Pty Ltd.

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

elaraai_east_py-1.0.30.tar.gz (431.4 kB view details)

Uploaded Source

Built Distributions

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

elaraai_east_py-1.0.30-cp313-cp313-win_amd64.whl (897.3 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.30-cp313-cp313-win32.whl (786.5 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.30-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

elaraai_east_py-1.0.30-cp313-cp313-macosx_11_0_arm64.whl (854.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.30-cp313-cp313-macosx_10_13_x86_64.whl (923.7 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.30-cp312-cp312-win_amd64.whl (897.4 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.30-cp312-cp312-win32.whl (788.8 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.30-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

elaraai_east_py-1.0.30-cp312-cp312-macosx_11_0_arm64.whl (858.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.30-cp312-cp312-macosx_10_13_x86_64.whl (928.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.30-cp311-cp311-win_amd64.whl (897.8 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.30-cp311-cp311-win32.whl (789.7 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.30-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

elaraai_east_py-1.0.30-cp311-cp311-macosx_11_0_arm64.whl (867.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.30-cp311-cp311-macosx_10_9_x86_64.whl (923.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file elaraai_east_py-1.0.30.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.30.tar.gz
  • Upload date:
  • Size: 431.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for elaraai_east_py-1.0.30.tar.gz
Algorithm Hash digest
SHA256 37646a030fca89272abda580f3051f9602be66291e6238b96749e369b181bfce
MD5 a0ed259f4986b03af67db841642a66f5
BLAKE2b-256 e393c1a589231a679442055886a928dbeee50d7f28c01847242ad73fb59a89bf

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d9d9c25c620c376b48a76977c7c627efe0c955cb800c690dc26d3f79c5dcbac3
MD5 e054a06f84e192d0e78fce140522ddac
BLAKE2b-256 2678a504beb09d85ea694b39503127c48dc1f60390722168be5b18567881daaa

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp313-cp313-win32.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 eb8e112810c26ad0a7584cf210bab5fb98483f0df353ae37ea7dfe3ccead93fd
MD5 c03cf280019539b3261a7008d4267f52
BLAKE2b-256 838073cf84016a3ec9b7692a07b20dc4d76e84cca4dbcccacd21751010813ceb

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a85c987903bb31c5ca12a830fbd0dcd85c6f82bc968ff70a0ec99e67358816d2
MD5 81994899e9c434bd748fcabe0263acad
BLAKE2b-256 9ed2887816554766ff7fe32fd2ef37a28cec7b746bb8787c0d8a0f4f62f6151f

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 38d17d12178e4434a9fc879c93d5943ad64f3b890aaa57d3e76e505179c3d0bd
MD5 99e61e538348a7c0bd0b14ea067e86d0
BLAKE2b-256 a29e1a52799d4f0bd1e6694471410d73bc9c5a906c9dd8df8977ff75fad35e93

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 82e052656adacbfc91999413bdf52e63d81bae2e0f8fd5f662e1882be91da556
MD5 d179adf85aa4aef66f0059b2f0ae5544
BLAKE2b-256 d820f21eff986b0008a683bd5482b7acf19ceba803dd81db336481150f53540f

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a911ad74a599340697e1c4ec4bba1503aa424d475a223de2127fe45af4f26f00
MD5 b017089560b77d7692ee0ffbbad59d48
BLAKE2b-256 79f6be973b3e62b416a1275842ac89f850517f1259f2b966bc4526b41a02d738

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp312-cp312-win32.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 19edd0d05154b33bc02b1973e6eb96dcb6cb375c284a06e16220f4ce5b0ca460
MD5 15d28f0a01fa381d82c0a18d32375b5f
BLAKE2b-256 af391b4487b0d815926d26340d4ce9a90188a80315c7d46bbd296a04beb72796

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dcd9376598f917fec7ae2c47679ea6208e6591de41b9b3f44023be8b8d0ecd1f
MD5 c7519d3572ff9ce6e44f08eb213a358f
BLAKE2b-256 a7bb815ad0fc28ef58d247b0984c85627bb5841f2d840b413d9209a2338e3a23

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b55a948cf77dd7204bdd9e56456dfd9d99c2837c8c07be50d688911d4f1ca60
MD5 e573bf2596ad080d0f4a8f981871ad75
BLAKE2b-256 5d33f9d43e31406b5ee272023a41fe2519f3bc5e7cc1ea3044499b9831fa01e3

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0efef7f349a79f0c4fc01667c182f3db7c5817694682e829f9e873422856f04a
MD5 acd19f8a91dd54dea65866eb2c711935
BLAKE2b-256 bd168cacac075f44906c732cc1fdfc92429a7024f827022a8a320aed26177a61

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4d9915a322a0407c2282362bee4d0eb8e8002600461c3ffcc68dec84d5f193a8
MD5 3156a63c2a864d93393cfd855e9b2425
BLAKE2b-256 c41b0fdb6c8b23f2bc7d92cc027e1df7ffc790868a80324b5aee96baf84aa47c

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp311-cp311-win32.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 216779d39fa8148a7ee694b00be26c8a476ec5a3cace36fe7a92d5854b334e61
MD5 90109ddf8d3ed1fea8fec08567169243
BLAKE2b-256 0c0d5ae5e2594624304a6b9c4d820ba2ddccf83639f920baeb8a7c81fd6cc352

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b216dfad9b6136035e983d07e3d72a0cb0a3975437db2f282b87d7f0bc720a9c
MD5 1aae9145a199839d4ff56498c53abc08
BLAKE2b-256 b51ac43db8339e9958895e6239ea38ef24176cf51568da1ab2ef21b3ae500d59

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eb68d0de0ee58a838f0bd335e7a58f28a27e3e78595efdaa05d1861d7dabc480
MD5 f6b8f7579e02bf22cc4cd6c71eff2ff4
BLAKE2b-256 54a2cf4c3236f536ea087d93c1e876c572f6e9bc4962912c04a7d97afc7efc24

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.30-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for elaraai_east_py-1.0.30-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 834550908e28ed763a0e25b3cf82ba2a715f2bcb5b37d120d71b8b89ea0f2972
MD5 b9ab37cefd33d6da52e6fc6d6e413c26
BLAKE2b-256 148835cc4649a17f5bd68689b40e86a3b7a46f7473b34803ef459b7025cae5c8

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