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

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.23-cp313-cp313-win32.whl (777.8 kB view details)

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.23-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.23-cp312-cp312-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.23-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.23.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.23.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.23.tar.gz
Algorithm Hash digest
SHA256 9cea825e0ef31b01fc33b7cb1eedb46862b02b10c11e3835d951ac1f046af821
MD5 e4fe5a273bbc1e70e98b20d7a7702b5f
BLAKE2b-256 384732d711c7adb7afe42e8f360f22e1f7e3957506c794c5398605ea4db75f14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6662fa9f61f91f3eccea3661a5936985a33bc78295586d906e6d3db354bb88b6
MD5 a6098fd63093b48d5501cbc212d21d22
BLAKE2b-256 2c08a3b8718f5e6a60f85453061c256e6a746930fdc5214b800f8024123d6d18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 07ef222ee0e0dd66efaa3e5d21c7e08b52091d1d78ffbdf61982b75dd4ee78b1
MD5 f09692216c7a6e03272cdd4c33e3951e
BLAKE2b-256 3ac5e3dae6e0f342277d467f4e82a9aabfa210aa925f23b7bbfab914f820ed9a

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.23-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.23-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 747caa0925cafe9e1e1ebdee4ad5e2d324d2681876c3d3a684f0ffe8507f6e3a
MD5 b3c5af0e9690c72cae062e1fdde06883
BLAKE2b-256 73a086a43baf48fa3bcf3014bd08bdd8244ce06cfd4d117938fcdd32475e80e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 045af4276bc9e8689f651bc021176166348608ac36b9a961f3f9a1988aee298c
MD5 30a8653d1ec1c54984b2eccdd6680403
BLAKE2b-256 333b4a8426352238cbfae251e826547b39dd51ed95fbeccf7bcce0e7173370ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 31a6a84016789e496980986b3939aa05cbd4d04a2ae36d8d7065f71962aafe41
MD5 8808e748c5906cec9ed803d4e24e26e6
BLAKE2b-256 b230b90456096077b8f37fe05fa3d4cfce1d9d3d66fddb9411a12ab4127dffcc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ad3bb6d40c43541f357c4e6500203cea6bb890c3ebacda20253eddfe31aa2e27
MD5 0533a5f1452c5e69fb1c8252b0a97f14
BLAKE2b-256 242021d4e4eb18a15a53839bce0339c015a871948f0c7dcdf6d45527277efde6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 6c5e20dfa6b7de7616d3a64cbfeddbe6f40e3d8f0f2c9e01d79c2f4145195ab8
MD5 92c4df04825050f9cb5c170549682075
BLAKE2b-256 3d6a0a13b61cfce02b96fa38f2cc2744e7a7ba8f292f8a81b59e63a0e0fdf573

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.23-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.23-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5008b4d34991545127e8a34ad95cd772cf4709d407ae23a050c849f3c8416140
MD5 779e050bd52ac1a0c99987e69f0691a6
BLAKE2b-256 28f8e5414070ac96914e915cc6899a172233a3445babb5a7ba20a554f1610d0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a359d7710307d26fa1bec0e7ebb8b6872f273d63959c38ca3f4aa50dfba96933
MD5 69677662d57f2b3a6968ef297da871a9
BLAKE2b-256 a45bbeb031a4ee02ff94860184b2c548fa559bdb4b6eb3ffe548944e76f55e1d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b65136d2615014df2f5597d16ec4ed0161a9f28797300c34e7d31fc1eb7d9e5f
MD5 8333ba2a1c606b51d65bb5272965fe1d
BLAKE2b-256 cdf4f2729900519569dd2345961cab3ec07ef53e11424e4399ffa072a6c7f8ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e0a0844498b90c9d91069a13a43b55be5f3c1c58856dea8be80439961e78ce64
MD5 cd19bfe5981d0443aaf57d53db302942
BLAKE2b-256 a0b341aaa2e7a9e7efdd2ca1f6784918b6b359c24c91b4d9d5ebe5889e284e2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 9802ba0a908785bfd6fff7c9324a561ee34a238cd53c14968843e1a0445f9e02
MD5 d7c6633f593bad5566f1e413c10b0965
BLAKE2b-256 228059cb2f36853a9a881d469394e964aa98554daae5be34e4261d0e8dec028b

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.23-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.23-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7a4e89d6034f07ca38bbdbea6fbafea2aeaba86de46ce1dc7a89e0cca8e2dd00
MD5 f63868c99a50f6735d5b55240d219c62
BLAKE2b-256 975404148daf0b7ef3275ca2e720ead0d11d54baf20c44e4b9dc8c34b6924766

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0caf5aa45537171033fbaf2564259fd749ce809171c92ce6ab5679b692b7dbc3
MD5 1705c9f06bf7ff6edf5ec498c3c4f627
BLAKE2b-256 2ee06d78f374b0c3a738146784c3f331f2b730b48c4f958c89741e258a51e1eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.23-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d8479c3f606eb91922f0a01608bf02e489797c0e2be52b33303192545be99a98
MD5 bc892ed5966a0b6d77a913e68e33bcef
BLAKE2b-256 0bb6a7f75d272f3db4f65a62efd17ca8c03712df6c73609b3374fe759e1ae61c

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