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.6.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.6-cp313-cp313-win_amd64.whl (876.4 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.6-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.6-cp312-cp312-win_amd64.whl (876.8 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.6-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.6-cp311-cp311-win_amd64.whl (877.0 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.6-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.6.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.6.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.6.tar.gz
Algorithm Hash digest
SHA256 29766f767b36c062a9ced675084a7644e41e38cac753fa5a34f7ec17152fdaeb
MD5 2ff824bf6447b1fb08a1f2bc758fd159
BLAKE2b-256 359e7c3224b66da28fee7a1bdc76f89b5dae6643223ca7ca97d7d3e7e3e3f41d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f58154ff5c07e08aaa45dbecb9f7cdec24f5dc6a39755bc8992e09f9f8293dea
MD5 c2c6e44a8a5fb95f5a61997a404dbb2e
BLAKE2b-256 e37b1300886a7898b2180cd48b775772daa7c847a51450d0654dc6c8fe7a88e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 82a0e7caff6ae458601fe8243f71494bfacd47ab7cef4e1d88293d6f8f7ed68f
MD5 1f989dc5b824b9c1fb0b77264f679a9d
BLAKE2b-256 cff1ed037b8f0c62f30bec384f95299602eb39ac21d8706ff9150fe37da03553

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.6-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.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e4e451faca7bd74f123d0ef68430fb84aa1db1da0dbac331e6fdcfbcf8532e60
MD5 4528be8b5e502879f95cf13904a184d9
BLAKE2b-256 c5a010b37ffebaaa80320ac2cabe1d8e175fc2e504556b248ccd4ec36cebe550

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cc6c0852141b8d3346e553e35153299016fe6cd4180dd48c21ddc199c1b57aec
MD5 a6b70a60ef3333db0225f53a9131be82
BLAKE2b-256 e66e6465bcf48425cb9d6f908535c6befe4458a22526e56b434571895dd0bd86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 dcffbfb45ace5d8842bf743992cac9cd1a3ae08bc8a61e1e264d47ba049267f5
MD5 77bc3dcf899a679cb4001b9b16ab3848
BLAKE2b-256 ac2435955d6f25fcca51c09d5961c2b462bd256dc050f5ee39f00adf7f62a781

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bbd613f1687409081864171e8a70fda09e369e4ca1c870ccf74691f6d3e763ef
MD5 6f5f8bcca5e6b110c556b775a13adb66
BLAKE2b-256 6e84880451810e811348f076b6bcf61e8608e2296cba7952a2e398f815a133a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 0cc24fe078c3aca27987291d44b4704e42dfe1341846d51002a0c7165f2def63
MD5 54b789f78fd7ead6ebfd11ebd4ba7989
BLAKE2b-256 c438eec5a7c4f33a646244413afdb835e411523346eadfe30e7d7ff1124a8d96

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.6-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.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 64cfd8dff9c9ae1379f16fab39704e640d85130e73da14a9d4f146d6ec3a491f
MD5 d79e231097101b54887d2604fe6d7c3b
BLAKE2b-256 de381501852ad962b26545939bb8c108cdc0b687e7ac114733481bb1d428e963

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 022de7d72cb211ef7319426f9c5c8b98df5c33d45783b0d73fb6e5ae65227f34
MD5 50dd743195bc1221e14c2839106ca67a
BLAKE2b-256 fc11b0f19eb6887d344212dd277e5ea0cb3a62848f353463cb91480db449117e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e5ae7b6ffaed3c3e7a36e1b45fa9f2d7167fff5e6101c9d41dc45640376e9aa1
MD5 f5bae5a8451039cfaaa8f9b5964adc9b
BLAKE2b-256 b80a44e90b2913c3d84bca0c9a5f2e5fcc47b58b7601689f00ea9d03bfbcc8c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 babaf93cc545d7825a4c3f0300032e35eca313cd1dc7468ceba0a4ffc5da11c5
MD5 5c96e0df1c6d06fd3e74ef9f1dcbf741
BLAKE2b-256 9fdd6d40f601c662ab03695b59a26f565ad9f922a0967c6e7986769dd6a908a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 99e63c58a374a6a1af5db9cbd9ba1a784cd5f260d233298f757e864c45ca9672
MD5 64b220e9c428bfedcb36d9493e02f775
BLAKE2b-256 4faaacd6649dc7013c1cf45215ab6d570b6bf29789a6e27a256790be185dc5d2

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.6-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.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3b559def1586e210ffe88b86a9d920aefcb23c186bad089b498719a7454c546e
MD5 8e5e248cf4720115e84de2ff5f1bef81
BLAKE2b-256 436a37c60ac2974e521fc9f944f825c9939411d7f3c0d9052a55025326bdb28d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a05b243ab2e41e779d3df4fcc19bc8d14dec10af47cb8777b0234269ff4b7aa8
MD5 c75d8eb51e6034ceca273af26095940b
BLAKE2b-256 38cb3158344b7aa10d891015a4a1b1a9d7e5d81db6d86407434398513f572d43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cc09c0e903cf82c0d7b60581e4150355db72700ed313bf860a261475cbba7519
MD5 4b720b244dfefa9633f0af45113f2c8a
BLAKE2b-256 27c98c3ab83e7168c734ba48a54868680b298d0440c0ca5ad97b9ac8df2d5aac

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