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.27.tar.gz (425.8 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.27-cp313-cp313-win_amd64.whl (889.8 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.27-cp313-cp313-win32.whl (780.1 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.27-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.27-cp313-cp313-macosx_11_0_arm64.whl (848.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.27-cp313-cp313-macosx_10_13_x86_64.whl (917.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.27-cp312-cp312-win_amd64.whl (889.6 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.27-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.27-cp312-cp312-macosx_11_0_arm64.whl (852.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.27-cp312-cp312-macosx_10_13_x86_64.whl (921.4 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.27-cp311-cp311-win_amd64.whl (889.5 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.27-cp311-cp311-win32.whl (782.8 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.27-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.27-cp311-cp311-macosx_11_0_arm64.whl (861.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.27-cp311-cp311-macosx_10_9_x86_64.whl (916.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.27.tar.gz
  • Upload date:
  • Size: 425.8 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.27.tar.gz
Algorithm Hash digest
SHA256 63d58749cbb7d12df0e80d025650d90ea4eebe840e36ed4c9c43c6977cfff9ab
MD5 b1ba35a8dfe8a71066f6f1739441c12a
BLAKE2b-256 a7c39464efc15cc1113d43c0429503e10382bbca5c6b4b0129ee882c9ebd99f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9ad0eacf0c988115e2c5513c09d9b8a61264cf2eecd7c02435420a4b3d8f97df
MD5 fe744192b852d180a93596f9762a3bcf
BLAKE2b-256 829475d7857399f5b41ea15d555858c74eb1922c4c04fb2968e5ba3d1e541b24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 0a105a0517efee110647adccdeda89e810f8310f9bb6fa4c90ab1c01b21bc276
MD5 f4db467bd720b5b7806673e47c42984c
BLAKE2b-256 98650c857241d869797d0b1767d15fdd51e6f6acc3e0b6cd3b1a5cb4b9908743

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.27-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.27-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b4fd4299a1bfbda9b33efa9ee391bbd873aa10107509df9ee5b644aa4701af55
MD5 80dde290abc48e6ad2433ac2ec399e84
BLAKE2b-256 921da2813a1660ea5e1e51c5a04156a338c35c1199340fc657d3ebf731bf77bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8dd1c5bbceeab9252e4b8c4e2bb9fe7356f22394237bce1f65559310223c544f
MD5 c6de8a5448da0509c3b0a8b693b7b766
BLAKE2b-256 1097f98ce09d60a73c4e114ad9f83a2fd0c27614dba050c4c6420966e1d3433f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bb502ec75583f0a4ec390db8dbe93b0791ffb5d25664d13e702700097af2defe
MD5 f7cbbc4e89e9c690a3d5a9e67ccd9771
BLAKE2b-256 5bcf81f938358b927ee2a6ab00d8658bc806981c530e99f31102d3d1acb91e4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 98cbc8f2f84e60b0209cc484fe6f1dd066f6030cdff2489dcf1f99fc225eda5e
MD5 bc72ea69303ef19ad650d2e3dcdaf31d
BLAKE2b-256 b2898ce1a56f71e874e5efce1b9d02953c69ba9b3fc4fbf2b2dc34a87d136748

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 a4209e0ee297bef5eaa55d156ba6b53cd280c6612686e310c4c793e31761179c
MD5 f12559abbaa29811060ffe27a3bff66f
BLAKE2b-256 34cd4b94a7cd58852f84c633bc73412151fb4496c777624beef90546872be281

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.27-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.27-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 61fbdbcb5f6fafe734c66672bfd45f1a4da51faaf76669cb94bb55fcfae31059
MD5 881d44a9768bfe1015ee655b05d26670
BLAKE2b-256 bda68d2fbae101f2420f92f43a327ae31d66f8cf17e4e397cf59e27c2f822726

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cfa77ac60f6a580f3f5a4f362890027d6be982455574bfed2af57d7986a901ac
MD5 0b5875a2c27e679fce103083eb937dfb
BLAKE2b-256 671ec29d0635eaa5b970ace268f1cf370726dfcabd64c525bd7ff03cfb2d0776

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b2b5d9948cb59c1bdf3fa912f2b0874ba098ccfbce1e7536ec2982b8ae74b547
MD5 dbb81979886d8e473258a95c04ccd06d
BLAKE2b-256 46cb7cfc16ca126c6965c1e9c7c8c947a861f25691a31456007fa6fdb2caeb91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b7589b9d36ffb3209287d72a5d87d50d95c6adf5eb8c2e631a3ea5df6e5ef804
MD5 a725b2a26008f442beb63a2806370ec2
BLAKE2b-256 456a2c4cc3e7d84c25e21ac7bfc7df4fe5f022bd6f26109847275e68e1d1bede

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 55c51692f33da806bc844b695134a8b7154972ed82d5dc70846b3bc931892fce
MD5 92d82936d2d275d8d7488a65ca28c8dc
BLAKE2b-256 9ecf1bf77082efe4f554b820007bb4c0e48eed861d11ef018da981d469dd379c

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.27-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.27-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6728bfccd4eb90fe2e82948d28cdbffb5d5853ec39ca3b00323e267aca61ba2c
MD5 f2676113967cb37f609964c0573399c9
BLAKE2b-256 bec0fd612945cbdae5e46ce2aafe8e83fc9353ab5d1ca7826d2a7e1e742679d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ca8527c0b43f83cdc1fd46ac404b6c8f07acb8c1ee0b5d4504734aa4feedbc3d
MD5 293411a6133ec52bd634640043ed4ffc
BLAKE2b-256 503650b6d1df91ef733457e0ca200c412696aa71ff9a82337013a71961d2f7c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.27-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1eefc033abcaed5fa3f6d3009f91ddb021e46f87632f2ac4a1ec87a69c2bb989
MD5 415f9a16164f32492d5108a39b0b8907
BLAKE2b-256 ffa893b39fd884034ce942632dcb65a4b9d30559b8b3186afd0c44fdcfb615d4

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