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.18.tar.gz (425.6 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.18-cp313-cp313-win_amd64.whl (887.0 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.18-cp313-cp313-win32.whl (777.9 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.18-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.18-cp313-cp313-macosx_11_0_arm64.whl (845.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.18-cp313-cp313-macosx_10_13_x86_64.whl (914.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.18-cp312-cp312-win_amd64.whl (886.9 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.18-cp312-cp312-win32.whl (780.0 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.18-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.18-cp312-cp312-macosx_11_0_arm64.whl (849.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.18-cp312-cp312-macosx_10_13_x86_64.whl (918.4 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.18-cp311-cp311-win_amd64.whl (886.9 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.18-cp311-cp311-win32.whl (780.7 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.18-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.18-cp311-cp311-macosx_11_0_arm64.whl (858.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.18-cp311-cp311-macosx_10_9_x86_64.whl (913.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.18.tar.gz
  • Upload date:
  • Size: 425.6 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.18.tar.gz
Algorithm Hash digest
SHA256 3084c8bcbcfea82001d5396222d46e812a393809036adc4e10c144683c640cab
MD5 3d6b07155e0be41cbb485dc72fd64e8a
BLAKE2b-256 2d3b2764469ff9f6a945c3dbf970bd5d805f0a45ed35e99f18ec5e1d7b4968d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8d3ed12f7f26df0d77fcfaea967f2f94b99db719e24ea18af2169a5297430632
MD5 f46983785a8633bfae181708dc1b36fa
BLAKE2b-256 553910e9013fd4aa41713471ea890b210e36aeff6508253af6a859fcc65723ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 0208396fceea5ce035e5f99d5d363d5970330ca8452a4b529b720cc712bfa804
MD5 187be8e51445ddea43b04ea287ad97e3
BLAKE2b-256 6983450a9c7869418476d377ec5f501a2ba6a6257b00e339c5ee357aa4769e32

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.18-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.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 382be273db53a6c2dda90877bd43ad7225aa7c03725c78d4ae310f72c37b7886
MD5 26379cc051f233367cf4f03ac45a8db7
BLAKE2b-256 31f68c390a6be7276aa752849c36813ab2d6945e52a23ad104c756ff8d60d99f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 63b08409cb905fddccdd37ea7845445a28c52cc01c87ac2dc2b5fbc5e75d29f1
MD5 d490e84817f65a623c483a275ffc33f9
BLAKE2b-256 f5026d932ef3e5c25746228e60313f89698265b9c8dd8343fcf16aeff29aac19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bad9cf1e8bc1fc428e089897d9f0bf4cfb979d5aec8ef8bb1798280359f97b75
MD5 fb2c1dd0c18c6f9586f23e927fcbe54d
BLAKE2b-256 19a2119cd7099d0c2b8f945baa942be4da81cb75866c3b06bf2ef2132bf19eaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fbc7c9c58f50ab36b775279bbda63025704413543b8a54032d69bc69f4e09916
MD5 28df6e0ce5e97a5f4abb2f07e81137c6
BLAKE2b-256 e60a147d454d51b8e19492f33cddb9103adfb23d91576eedc32fefde850aa55c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 aff8473b46a41a4154ce1198fca2d690faaecb94f69ed623298330653dc34cea
MD5 1ae7f1288593582236f0d6d50b4673c5
BLAKE2b-256 f6c1262879c525fbe3b71c0bcc6203c8a3017ab637d07f7eb145fe2746734c76

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.18-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.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 431e7b468bbe9ecdc817e86ff15b4b2e184bee5bb13f3f6104ae4210d851a21e
MD5 6318a0e37d30011c3bac8079f8fbff89
BLAKE2b-256 0be6fa60223ffade93ddfcfda0f680f9f2b726dd7ff1b22e1a36894ad98a5773

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f710e968fbb3e93705a413b052b160ecf10110914bbbc353473753b32d1fbabe
MD5 33cec9272d58108e1265204387255e12
BLAKE2b-256 09a7a7213e164c1443d24f325d8ec3b785551721ccf8e19c431519dc855a021f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 8eca69c42ba7f8fbae6fa4859b2bc5bb348f7e62f994b8e1c4d76fec674c6071
MD5 32f612aa23bdaa771e25e63dea76b187
BLAKE2b-256 fe189477aabc69181616d03ec9968076ca14e97688ce06d0e30ccefb6894326f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 10d5669ded4823aa86223f22a05cf4aa352c2716dddb80ed9f0598dc0414a035
MD5 8aa5681a9ee6163a6bba49c35b081dda
BLAKE2b-256 8715565d5f5966f76969a795e35800c9291fe3dc88430a1f61ddccabbe24cf60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 5b4548d59017203afc2eedcd6aac952a65c9b0ba750f494aeb543403ef5bb628
MD5 9e120101e19f16146eca38c6cbbd6686
BLAKE2b-256 1f173546347d2f6a11cdadc47a4c7b18c9b3054d0ce82e23d34a2dcd40a0adfe

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.18-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.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1741da13253567c1d0b528c226e354eb261ffccbbca236e1bc12953dd8d51a6e
MD5 5b27f6a7b8667e7e5252c8edae4c8020
BLAKE2b-256 6784b2391eb719dd7f6cbddb0539b493b1e9f0fd1d18157a9d46bb9aa3e04c64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e20da018c81ce2e8fa5c30dc15f2563c94d8d4073ab7d7d24f64efd996c157ab
MD5 d541103d1fb26f697ca51588f9806840
BLAKE2b-256 7d90ff0d5df97c7e162618a9da638297e57145be3f99339c24646181e883e2cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.18-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 dde41e551b0c5bfc55469117fc99e852b60edc74315ce546f47b046576ab44e8
MD5 3e99b71ec0d59a9ef017e200a9da11ee
BLAKE2b-256 da17f5e05f374587d4dfb7c4d2468fca9da8a734799f73ae6b0533e85027dab9

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