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.31.tar.gz (434.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.31-cp313-cp313-win_amd64.whl (897.3 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.31-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.31-cp313-cp313-macosx_11_0_arm64.whl (854.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.31-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.31-cp312-cp312-win_amd64.whl (897.4 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.31-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.31-cp312-cp312-macosx_11_0_arm64.whl (858.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.31-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.31-cp311-cp311-win_amd64.whl (897.8 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.31-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.31-cp311-cp311-macosx_11_0_arm64.whl (867.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.31-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.31.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.31.tar.gz
  • Upload date:
  • Size: 434.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.31.tar.gz
Algorithm Hash digest
SHA256 9ef0ff4e96d4705c717adf8c1f9405ab65915f7a83c87476749505489bd37a86
MD5 e64d17a98b28c8d037445c7189723d04
BLAKE2b-256 81048551ce92a4228df2c68c2b05f40c3b77dfb3739cd5728909c4314f0c9a06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 72597507e7f14f3ea121920e28e581ec1a3e9d7ca3d4d816161e025fd25d4c2a
MD5 053a5bf191810a6daf78d6efd4f52e96
BLAKE2b-256 1d287d792f5022ff5333b542a8ce756cbdf3431ae9be067da54ec328e43c8837

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 a20aecae72770150695e1fc483f718b3bad9ecd2ad8c795305e63061d0ea7016
MD5 9e45be8b1e6abe68d62beca7c0de0b37
BLAKE2b-256 ccf66ee106b894101e31014578e92fbcf5714868348b480fc86fbbec6a89a0bb

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.31-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.31-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a50ba1b30343f769a67aedd924f22ad9ed6d3cc4e04cd1b0ad2c6093a64a9a9f
MD5 4365b0cec830cdb5b2c759a5915ee319
BLAKE2b-256 16bf539ce8f91c03e1844dc9def073a8fe0a0521f281cd5e1dea2e8bed06e897

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a64933da66c124d732d3061be1ed29edbfb34b75761e2b5d9096d0cf2537827
MD5 57312de7e43981bb7fec43f705360e35
BLAKE2b-256 af1b8abc14f8eedee08b7387ede65cbde83f1143a8aac2458956a7e8e0dc11df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 41be684595299cff14e954543565d73d59e6b21cf14f344c8f3fe93cdaf37c77
MD5 eb4039f82adfed1fa70a3e8e8666fb1f
BLAKE2b-256 6adbc1a89766063c4cfbc39da86c459d77cbf5da208cdc53dae12998a05a98d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 31e66eba70487c99ca65626f26bf452ba4d1703124f4fa3a004da1a970759430
MD5 78db10e140193cd84e2abcf4247c337c
BLAKE2b-256 f8bfedf9df67d552c7452940bc5988515e100dc0135e3240027abe8e9b8d0b9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 408a267ef1fbcfbe737d7a4f81d91c0d953857262a695669073410f1130c36a9
MD5 2ca5965b28d142747c349661c00492d5
BLAKE2b-256 55c73dc0c89e0aaaf04af3e40d9fb1dc04dfbb53896956a23a38736dae59ebf2

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.31-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.31-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 977006a206ed392033f98a3540bb6fc4c86bfe6dac5970db02664fe27381a7de
MD5 df1171c7f7f8d133ef904db088f43320
BLAKE2b-256 dbc33031016052f62021e57b9cb12dc87268863bb667c48acdc04073be779a43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 347d6ddc8fd0264b7160da3f7ce36d6c80010fedc612c08b27908410ecf203c0
MD5 91835832a5d92b9f5357507b2580ada0
BLAKE2b-256 0443eee0a60a74ecc3253f0a870867e220cedecbad7237d2db01ed4f82504588

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2cc8ae66e3031631b125737a734c665d751f0aeed5b5ff9931c6dd4b252fcec0
MD5 b7f4d227c68af9592fc3ebd1b8481989
BLAKE2b-256 1e4050a516aed9ad28e20d249d3a0b9a3846e3be82ec727b17dbfca6ad590c39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 18480188fbad28b552df1284e7904d784d765b0513a4f03f8add60ff53111edd
MD5 b195b66cd45c59018118778d646cb11d
BLAKE2b-256 f6ef03b08ac942912e5cfad5cf4fc776db8439735625b8e10bc9e7d40e2a0ced

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 928737e699c67868016d06fda7c8b060ca4bdb513b76dae84d063538975ff8bb
MD5 9ae64467e30dd8da38f74a17af63c815
BLAKE2b-256 2aa3a784b6f0cd41a1a7e61e5739dc3c2807f1f00f31a65f02454a8b3883e27c

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.31-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.31-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2e3f02cbc7194a8e94bc899b86166c970e40b78df48097ea4da9627411ec86d1
MD5 ddd0658054d8b40a2469a655fdae0649
BLAKE2b-256 b72693ca700c196322e6ce3014abf47649be10778a1861910d50d22072d7ddd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ac1249ee89a231301361c9e49e22622a8fbced538c4132d6201e007880a21dde
MD5 c6613f843813921bb51f0bccacbebb94
BLAKE2b-256 1ea63d6e8299147d9d63609ffc6109b279bf92942391080166828b45d77ae822

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.31-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ee4016e9b89484d0ce1bc0a7a69eac9b01b81bb0fdc5b3521b9dff282d2272d1
MD5 3a51fe9c7cb38368acac9ae0047788ca
BLAKE2b-256 61d6ef9da36c388a6bebd1e060cbf41c33ac6fe66926f4ac460de70fd2b273f4

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