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.5.tar.gz (405.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.5-cp313-cp313-win_amd64.whl (876.4 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.5-cp313-cp313-win32.whl (768.3 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.5-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.5-cp313-cp313-macosx_11_0_arm64.whl (835.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.5-cp313-cp313-macosx_10_13_x86_64.whl (903.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.5-cp312-cp312-win_amd64.whl (876.8 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.5-cp312-cp312-win32.whl (770.1 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.5-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.5-cp312-cp312-macosx_11_0_arm64.whl (839.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.5-cp312-cp312-macosx_10_13_x86_64.whl (907.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.5-cp311-cp311-win_amd64.whl (877.0 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.5-cp311-cp311-win32.whl (770.4 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.5-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.5-cp311-cp311-macosx_11_0_arm64.whl (848.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl (903.3 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.5.tar.gz
  • Upload date:
  • Size: 405.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.5.tar.gz
Algorithm Hash digest
SHA256 5e0e52f91a7b14568021be751f011431e99f34934ce85e72503c8b55c910c8fc
MD5 db8ca171926fa4169bb9030237f5bffc
BLAKE2b-256 79d46505624a4728d2a5d1d46869d287cbb480d7578fd49e3d46c6144d49a0e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7853fa8f34e141a5c63176c68581fe07f8701e7578ba5e4230047c5895470cc0
MD5 afa7f3288e078f0b8f73598ad31859d1
BLAKE2b-256 7c5a9c0c632c6d181f55de551ce1e1675a903b8a538901e4275b5b74187c15b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 cf7f18ee9a2b35ce3d6128379350d78990aa9a2b418b7a9b4cb454c2e591529a
MD5 e634291adc628352a2f8d098bf8229a9
BLAKE2b-256 fe2f2115bc6540d44a387cd14dcbafbfc64cf6dc4331ed4a8d7e6d682ff46899

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.5-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.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a6c52a76345bdd96fa20d39374291a8b48efee98a2f6ba23ee48c8680e5c606
MD5 ccbf23853f73bc608fa5669c049cb090
BLAKE2b-256 24b73ab3656601bc30d6bf6aa24dbc7176ac15880625dc9e0a6a8dd319419ffe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f24da8119763791b11d04cf0e34c4cc43398c5cbb1f6cd4cfdd0edd4c25f3a4
MD5 014205e9d72282167bb6f92d18828f51
BLAKE2b-256 8e3e98735f5914301ed692df49b7118362fbfb54242f701f99b2ff07b162244f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0005ab669b07397905bf01bf2a123b2e5a06d533ba5a67168e8984dceaef9f7b
MD5 69cfa59cce7243da593334529d52ff38
BLAKE2b-256 0582feca667ad336ebf68061e2563af5a17acae92b258f9ff615770b8458c834

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 29c57f99b4d75a00ca881b0b16f4b38edbf028cde909db009e9063d9ceeb4659
MD5 101fbe57be00779a7b9d1b4380750afa
BLAKE2b-256 dc2790fb1159a7b1b77e4f7eac7a28129c9f1c3c2a77e0fed002f9c02a2761be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 392771bfb8c1bf5c82cff42613c5bcbbd43b8db7a6e6f029fccf0ca00fa70a04
MD5 c09afeb3b4360b0f56e77a1623e2148f
BLAKE2b-256 2083b00bece55d8438e43f590130fbade7df2ef1ac368f2ea2e1491b974c5e19

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.5-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.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4b9ce4e72213b7ccba2004441b0d8b2f11d9bc3e7f2a90f5e75a14ba1db980a8
MD5 1ffcef4eb4ad58577d4480f62d8a5fcd
BLAKE2b-256 d83fd7a769a364c03396513104b5a22c06f41ec96cb6befdccb4b170e43720e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b969b9981c857de706d39733fda41f7ac63aaa16dc911df6dbca7339dcc5e27
MD5 c2bca37f890ef65d1d5916ae2fbe3c6e
BLAKE2b-256 51893b143a46c7d39d61ccc8cad3d3841f97e9391490e6473cba96abf05cefb6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7ccd1aa545e9e458879e78dffbf73a2a0175ba14dac60993ecbf131cc5f7d428
MD5 4414323754bf68c46e3cb4788c398310
BLAKE2b-256 41caa1d480e99ca9b4a46029a4c8738760829c2577ee2aeecab44f15f3994735

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b213df7e5db412a01de23ab037be2d4a57afb7956bae0f3c6bda679bff0c3bc5
MD5 8e5e22a8ae6048093bacfbffdf5d801a
BLAKE2b-256 dcd608e8a4c699f45ed16ba2a6d232c950b5ed2053ba391fa8df6de3bed4d964

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 2c6c4cf786a907d6dae0ca6ea629d953cfc874a299821aebed28a7d6c2c3a3f8
MD5 a8c0fb2db9f5dee1da1160b1e0da1eb6
BLAKE2b-256 d7fc6af725f388c68e95bc7bd9f8429871814cbbe0697cee8f39f12cb02903b6

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.5-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.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0935b9b371d9aac8561159710ef739471bdc3b8e81f3cca4b6b021f81b9b2abe
MD5 437c6e30c4d08d08a0f7dbf7034f024b
BLAKE2b-256 58186b07ee25d298d6b40373030cf3ba9ef31171018dd63fa0cd71a8e6ed2f62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3763ea78aa08a4b8023a777e1e369ec9abf4b6edcb652b46436086b958cc226
MD5 50b610f22b6deeb1a38a2bc8b2ff1063
BLAKE2b-256 a50e6843763781fee8c894957f82badb1263e96d4b1278c59f5d279695cd1f2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 239c8fb8813a32b0b3c2b1a722aab8ac2fc2fc7388556ebdd3f8f16cda706e33
MD5 9337bd4e499ee611592893d2f83df2d2
BLAKE2b-256 51019ad2a18ad8f478926336a4de57fe931a38e72619e57c3f870ab7c336b815

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