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.26.tar.gz (426.2 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.26-cp313-cp313-win_amd64.whl (890.1 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.26-cp313-cp313-win32.whl (780.3 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.26-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.26-cp313-cp313-macosx_11_0_arm64.whl (848.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.26-cp313-cp313-macosx_10_13_x86_64.whl (917.4 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.26-cp312-cp312-win_amd64.whl (889.9 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.26-cp312-cp312-win32.whl (782.2 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.26-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.26-cp312-cp312-macosx_11_0_arm64.whl (852.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.26-cp312-cp312-macosx_10_13_x86_64.whl (921.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.26-cp311-cp311-win_amd64.whl (889.8 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.26-cp311-cp311-win32.whl (782.9 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.26-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.26-cp311-cp311-macosx_11_0_arm64.whl (862.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.26-cp311-cp311-macosx_10_9_x86_64.whl (916.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.26.tar.gz
  • Upload date:
  • Size: 426.2 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.26.tar.gz
Algorithm Hash digest
SHA256 1035bbdddaade20466c2b82c7bb631e60f8d9820186da994957462490f458895
MD5 f4cb12ce447e421a54d7a4197dced3f5
BLAKE2b-256 b43ed7f50593c7590d5de4c47e3c267d8b5f732d0ffc398852b70854ca8d1954

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 961001c3ba23b63aae2ccbf4234da84385510ef81e1c279333afb08fb6a6e936
MD5 b8eae3779fe52fe29966132272f125d6
BLAKE2b-256 165680a289790b923e0efb2820d0a238e8709e106e0f74d5fd5432718ac2fc15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 7e4a70e30c4500017933e814d3d3c17470d060d446c826d4b944dc2180e5749a
MD5 df6f04f01edaa248dff379d70357ba6f
BLAKE2b-256 d142314a21bb0e0f3b424c835110eace1fc22838e6c34372ddb0053f420d54f3

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.26-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.26-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c91f453817d2b6032ebe05199367f075968823290188d1b600c24abeda7b6e07
MD5 830f9f470a54db8c5d936114113596c3
BLAKE2b-256 eddc7a54e8df8d00639148f054064c9ace9f4f6aca147adbadb055ff18c46a4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8fa1d1a468db1913de48656aaf15ea90f1f5a8ceebf5b85c09ee9c4eaeb88b05
MD5 13464edfc5a0cbb652d9b2fb361a63d5
BLAKE2b-256 6bfb97e05cfe7ff5192d05694fa53f95aba5c9338ad99790a256c10dd5383f2a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 37f7627f0c406f30be91615733cd138ae38344a2946bf8386116d660f7ba5cef
MD5 4d361a5efd9a078f21f5f063a3a029e3
BLAKE2b-256 1e765f71d98a4c35ac7139225fc11425a369dd45acd833835b5a399e5c6e03e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c48350a02bb062ebcaf3150ad3e50b0b976f4335367f49f3d45e39b6b02460af
MD5 f1bff38849af632fc6afe619c950c47c
BLAKE2b-256 a2103b6c9dfb88051fed49855c1721efc622cb10959b9722a2724dc3b01a4135

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 c1decb360a8bd6620c94ff233e4d8cb0fabf7dbf290250fac191b794ec8f6553
MD5 9528af7bb5f8918e789b663b89c72bd4
BLAKE2b-256 278e911a60159d8429f5415cbbb4a30017e6b7e1f66606c872ebebe7b48b10f0

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.26-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.26-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 86b03173b90da86732eb64e6707f676b26641ee0f3d0b556c0889ec1efc96275
MD5 bdd15d12d6cd89420f9b0d4c3c22872f
BLAKE2b-256 c395080681c4574069bad2ec6c1fe85998ec029e66920ac29e1b66c67a180dd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e90cd6d857b752b1c692a3256c440a56fcd30ede56c121c0690481a1065c44f3
MD5 5d8d9f827ce590cc43c5f59d6c5cd003
BLAKE2b-256 d18954ac2d081efbc3538a4e97b9e175853f4dad0be1142a8ef39afcdd1a9025

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e37d591c07536a28b584943c451df50086cbb8edbe4d4dd2b7ae9c244fd7cfd9
MD5 65ba925459841ff391d692e3c68ba3c6
BLAKE2b-256 575c8881432977f4176ed5997590e5bc1ba83e8c942c6de425e51e39ed3d0708

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 72f7839063b561c1b31650344937a1e83277aa10664669ac41990dacf65d246d
MD5 bba7358dc037ba0db8910f321b364464
BLAKE2b-256 a29d193336b566ecbb7c6dee071dfaf4babe55daee08d24614a6400bff4ee6c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 b084ab4b381a835ae861f2f4a16b59be048bd1167a0f90dadbf002d6050e4eff
MD5 079608cb595f5f31c6f74c05dec9c94e
BLAKE2b-256 f13214290351438de85615b973acd86bcdb5ca4842a796f305d4273dca15bd05

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.26-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.26-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 331cf0c4ab490b822ba114c29c33abb6a38d8678c2ddf2a2581f84373d0847ba
MD5 3f1a7513b8fd3666f2870a713b51bd81
BLAKE2b-256 ff1fdf7e062bbb2c6011903f78701ac1a946b3cdbe8592617e53eafe33d35df6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab7eaab150f3423b7c93abf82d88033b3730083e43cda9253a58a23d0fd2e416
MD5 4e212bbdf186900e1f995168107d9961
BLAKE2b-256 a17ee600e8b48a8accfa7d4a90176b657b80c623c610fb7adae2540fe168b390

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.26-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 df8a2b0fb0b7e44f772b2cc63f002ec52c4efa1598182d47caf3e064f725ba98
MD5 95af623cfb035ca3f40bfcf203185211
BLAKE2b-256 b4dbe4954a45dec7007ce1c331aff990adf5c17acd849f13cbbfe2a5328b0ddf

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