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.10.tar.gz (423.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.10-cp313-cp313-win_amd64.whl (886.8 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.10-cp313-cp313-win32.whl (777.6 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.10-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.10-cp313-cp313-macosx_11_0_arm64.whl (844.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.10-cp313-cp313-macosx_10_13_x86_64.whl (913.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.10-cp312-cp312-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.10-cp312-cp312-win32.whl (779.7 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.10-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.10-cp312-cp312-macosx_11_0_arm64.whl (848.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.10-cp312-cp312-macosx_10_13_x86_64.whl (918.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.10-cp311-cp311-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.10-cp311-cp311-win32.whl (780.4 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.10-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.10-cp311-cp311-macosx_11_0_arm64.whl (858.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.10-cp311-cp311-macosx_10_9_x86_64.whl (913.4 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.10.tar.gz
  • Upload date:
  • Size: 423.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.10.tar.gz
Algorithm Hash digest
SHA256 280c0f61ef75417df364fcf64a4f3704349a4b41c4cc8958a9ca1cd904beb0f1
MD5 5d0a15640abcaf33b3129e3782563064
BLAKE2b-256 3f6b4d93e63eefcf8944b063548aadf9809f88a674ede39a0db604104e38439f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 72d5c4be0b1e485bd541842fd087d2773c51b1396723e4376f3707db67116dc7
MD5 9b8ea18a44303a7f456c781b27e57a6d
BLAKE2b-256 8eed138e5ba9b3d60efec6f59dc9356c2025d453ace47ae5025a7c9afe9e5fee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 77141d20e83600be3c2711d73a59a3547109178fc5edad60a4bce81828f5513a
MD5 5da06a0729d98b5ce5057667c875bc82
BLAKE2b-256 802eca2d32f4dbf2c3ee2c93914d3dcefad4be8495ef6bccec026a129fe6bee4

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.10-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.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9bcbab9bd1a273a5cfb93bb0afae9a105866cb4d87248b9c63165d19e4bcc065
MD5 14bade2de5ebc35f9005d1828e698257
BLAKE2b-256 c352d7e4405a5030de015ea2dda6035724b473cd2150967dd8dddd8f68574e90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b870649e7ee27a1cdb9de6c1cf7baaa3862a4649107da2e70d3dafa37bd3990
MD5 2ccf2b56c1396f190ec2eec13a730f2e
BLAKE2b-256 0411d2df45c7eda3841ac9265c7111ee69e534f580145471101a666fe8a7892c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 dd55b421fe934f31e4a7e5bc2b74941b85abc69371b28d9c975907d9509e5323
MD5 6874c1c869723eb0c085fbc825eb9ccf
BLAKE2b-256 87da4c6b20d6c301c3cbb74714792da7db7fd0475aada57afff7b578367c7b6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cb09791e44084b56af975a0abfe03688d14ff7caf06c6bfaf74cdba07ec1a804
MD5 cbacdf4741fc51941bba993de8a94521
BLAKE2b-256 84fc66a68bd8eda0d956d5f3381b5a830b5505d09f89d94e55e1e5d06942f947

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 2d5cbf4067bfa3c6e04b293a1279a3b63c881fa5fba952958436ebdbf22b3d54
MD5 fdb778ba0b0acfa57dd478290cc62f50
BLAKE2b-256 764749d56433edc612cc8953499959450a8a6651a6bab42e06ac7f89ebd83398

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.10-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.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fdd4383f7188b65682ec135af37fd01a92b1335d96cd75c3a5f3f9ab36cbefdb
MD5 e0eb40e81a72847d7e0d049e223814b8
BLAKE2b-256 c043d95d17a103460e5d452e42b4bdc1eb56d63d05e2dc4eec29b2ac315a1791

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 262298faa9ff78a92d1feba4a9ec38015da469b443b19b8a4ca49409e6ddddc8
MD5 709bcfde0c1046c193540c0105ddf955
BLAKE2b-256 542a35ef07b9b7f0aab85974b91c08eff8134e4ee1f8607e29932c98c1be3518

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 aa2ca58a1f652a4ef4c7410231582904cf0a61d66bf849ec1f6e7a24bf7b30f9
MD5 1a78164645c864a1fd1ee4e03ac4ea6a
BLAKE2b-256 11b025b9d17fb0ad431bc6827441d50bb7f2b3444195611fd51defa4f7386513

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a8c864d7bf30d4e4663e4fc01f737bf720fad49b3a61966fec62ee4fc9f98d70
MD5 859f2fb575183e169a7d23373c01baf3
BLAKE2b-256 d0feb1274116f796827e795e569d68f1aa7273161414d17edbfef5251be53119

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 5aad883f28eb4a4363825170633eb5d3ae6275914797dcac28d0949923706d1a
MD5 9dc4fba4c61bb7b46b6c33cb5ec4e0f9
BLAKE2b-256 1b1332a849ed4612e5ec06eac39607c7d39bbb987e6f7b4b18ae2bb088573d97

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.10-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.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8187048fdff6b529c0001a80b51be819b81c21b6d30567379a952fb045cf10f3
MD5 e7e6ceae92d96eb29488fb685e1ae281
BLAKE2b-256 47df8f15e6411f50d3bef08a36b0f499a03a74b14adf360af815c0980e7b9350

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c1e55f46111e9ab58304cad7a5429888a065ad4111bea1b2291d336fa52d7d2
MD5 02687c8bcce3042050e44c90fbd9c34d
BLAKE2b-256 f75226c8bec871c8cc0965090a3e48ab7f4285814bb7af56545f2b9795403f81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.10-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cffb717707bc2522ebc2b4a92035c9115f697c89488d7ad621c1b54e18a7436d
MD5 b247569e749853f4c4a04998edb05b33
BLAKE2b-256 66736de4630c2614274e789382932c380bda3ae4e80bd22443bdf7191050ff26

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