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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.20-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.20-cp312-cp312-win_amd64.whl (886.9 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.20-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.20-cp311-cp311-win_amd64.whl (886.9 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.20-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.20.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.20.tar.gz
  • Upload date:
  • Size: 426.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.20.tar.gz
Algorithm Hash digest
SHA256 0d51c2c5af0d1d4e905e0ce028cd5d0af67779010549a8852d5fab9ea1085343
MD5 e77105a0a6fa48e2c1864b54705c9b57
BLAKE2b-256 077aa84535c1fa4b64254c91985479a2f8fc526f8a32e5a1555993beedb23de3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d91af8b7ad31551d25db2a12dbe6a44dc08c2493cbc5a91f6f2a44f4fcbc1c8b
MD5 a7c9f202abdc568c2cc78d38b455936d
BLAKE2b-256 3c958f9c9146aba77fb707b907c91cb91af73dd627714d73aaed87367f839326

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 a124e26823492382b836a39c880847ec2540d4866e0351f67f09265a9687ca24
MD5 acdcbc6be9a03737d6103ab64d7ad925
BLAKE2b-256 f3caf980778c0e9fdcd21d7e289057081a631adcc776621bfd7410f46e6b22d6

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.20-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.20-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5abd7ab07bab32b8d10699afb6d5e26b14d253ab6063bed27945fe3b7b580c9b
MD5 a11c28576c171d849a8d1dba5c19468f
BLAKE2b-256 1aa3bfbd3264e33f3652a4145994673e658e91202afe5aa91da9c20d68764705

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a1a3c5379e77c89a120428b760d197a5bc80694c60b01bcd9fac03436d30d80
MD5 62ff86c2c883c1b878b15efc348335db
BLAKE2b-256 10652055c2344c86b7458e38e35043b3020f4081e11e2e9519a69097b7f001b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 830a5afb7c1691e50ffba1b9e82ef88d4b2c612e88d9f3cade9f85059c7d2cdc
MD5 8f097e60d30b3b4315827055c714b252
BLAKE2b-256 df9435e93d5a20640874e098055670e8cdeb979c20925390152a343cbc894f65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4f784a944e8c32d7f72e5c0f9e2ab70002630a2e08f60839188055c62b1b7347
MD5 fa2286386b30069bce752777c37ab15c
BLAKE2b-256 6207d8aa70eee8a5090dc8b6571815fa4c10747ec106f182ae55c7080535cfb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 b1fd5862aa5446225ffb7dba2ac51795148e4c2e6313f99d8adc96038e76674d
MD5 34aabd89a63896641570ba069ba87cce
BLAKE2b-256 a203aefec748c991410d58a5f8489241642f4a8fb00fc95a89fc408f69f8b4b1

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.20-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.20-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6b8595618a0ecfa9ab3d64fbca41c2830bf3053bb6ddb7f8432ad1ef919a70b6
MD5 1e17f8ecea7cd8608307424fd58ddbc5
BLAKE2b-256 dc4e64d94932628c8259cbf1e770b64951180019e27800813c53bd0c1007eaef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 28ad63c5f9fb4524569890d80172147fae3536b49ab6b4797678a79d194018d1
MD5 4d4101fea25a6fadad5fbc5782da3c73
BLAKE2b-256 7326fc4e6dcf3b8f47203b21227653991c24f0a7a67a0569116f96f348041f5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 171ef5865cce48e34aa91db0f70c18962b86ff54d8b5647c98e6852cea594ded
MD5 e75e16b75e9cfb9ead57c44faef5e792
BLAKE2b-256 c08c50862d3b6bbc30783c10c4e43e1a9123a3f08d059cdd5ed7eb80d3727af9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 abf1168245dff71e3fd012774c5db678a7c9d1b0b5b36b4f375fc5e08765c5f7
MD5 236892622bbf181ca52a5c7bd5dc7bf2
BLAKE2b-256 fb85c7d550eab3d9905d1c3f6c8cae14c59702a08a4af60cfd107850c14e6ce0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 b551e23fd61df2c00c736f4257a3e0dae84ff3ad6b80711ee252215f392d7f11
MD5 5fc128dfb6c4cf4a874618dea1ead781
BLAKE2b-256 eaae88af81b41f25236bf69836c2dce210458a5d7bde7b75a1786644b538ec68

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.20-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.20-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7feecf44a534bc39f95fd7d93a382dc18671a625040b33a23ea575695093f705
MD5 c703c09ad13f9ba6348e0d143479ceea
BLAKE2b-256 9fc16f9f8a7dbe28a391ebc0f7e0215c11666163ce0720f2f7488bcda5607776

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f35b90ae794fcc3a1e4dae46a514ef64e43bda183698a16183372bd480152656
MD5 ecc025b92a1019fa7bbbe959cc2f2b2a
BLAKE2b-256 617cd85c74bec6cc7f473a73adb9543a71298cfeea2ce211bd2b13e12a932cc9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.20-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 023d2f77159c9512b0cf2bcc841d66064b2bd1bc903f3b0f232b107b41d022c2
MD5 c4263be2c7b32ce4b18ef9dbe88d7e0d
BLAKE2b-256 d4283c2370d8bb26c934abe7443bdeb8c4691da2a052692becc0824b20524249

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