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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.16-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.16.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.16.tar.gz
  • Upload date:
  • Size: 425.6 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.16.tar.gz
Algorithm Hash digest
SHA256 a49a1efae3be5e4eccd62fae74d48e880e307365f0a05eae091077076261cde3
MD5 3a5e5ecd9f25ee7604e9833fa6c8c08b
BLAKE2b-256 ec2405688fb2b91b07d42cb1aa34005b644f66f8419c5f1f5404f7901ec591a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1f90d7df87158bb6d8efddf5b082a0d29fc2b553eec25cc254effb7f5ae1e55a
MD5 d1145805abc31f7da93bcb195d8ee776
BLAKE2b-256 99c97eefea8243dce0118f4f50391f8e0c86e9399e5c2b8706037547336e1aff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 6fecdddece2d5198a530a48477eb5d52d09c5659e31aeeef9f98d6c00234bd22
MD5 5f40085355262bb0c7fe03a49375699a
BLAKE2b-256 29829322afcf0e5f65b7f7cf255210b39f257470874ba4145ffbba9188685bb2

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.16-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.16-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5e9f4515527b13a7b5233279cc63063892b8ae4e71ccf24aaed1828ef7c514f0
MD5 bc939eafb64296e10e745296a931fffe
BLAKE2b-256 0fd9b921604eff6c4b2a1ba7fe832526a778415d43e7ff21ef8ec70aec3f100d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c88295314362f2898daf5d73245e7343a85e23e91e930393d006626afc541ca9
MD5 cce8e2dbc5b652cb0915327363a6a85d
BLAKE2b-256 e81f70f150ebb2a7e35b4dc119ab4add4d9bbbe69e444f7ccb69d87d5c041a0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 48a667d661dc942a905bce71a3b200da3d2cff71154f3a8efb59f6f240d2f49a
MD5 9c5954bdb4580f70c14238b7674d5c61
BLAKE2b-256 306534c20edd45fd20a5856d04a8aa193a22f0a6a83a5cde538abff00642720d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c07ce1643aa417636994a8cc6a9088d6ed6e772dd526886aea4f4712fb3c53c2
MD5 3a865e21e6b21b383c4b90495484b49d
BLAKE2b-256 1ce2046eb0f92551b958a934e768411fa6b1b85abe41449ffdc9b922dd09c545

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 b03fe6794ff056da5a2d46c95576023f5a0aa2cd70cd1d24f7ddfd088e10e0d6
MD5 e6d43426a0bc149b4fd8258ff135a725
BLAKE2b-256 6dc4db286aa2fbf78d1ed7a2c5838c3540c04491b575db7a9e00929a57dba505

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.16-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.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0b901f436799ea30635273aad247eb3fbbdc55fd01c30ab71b3751699a8f4993
MD5 668d0fd7f80cf3ceea931294daef3da0
BLAKE2b-256 3e43d32d0ee81e51537f3fc40d3a2e9b01458df12c762fec06709cef64a663f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dea06b074970e766cc0ef9733d189d8c7fe6b159ab842c17e8d5c9b57748933b
MD5 1b960e99b28941432c32f78f3fffaad3
BLAKE2b-256 dd67cbe59784f00b74023d35e36b9844015f55e93c8055335a5cae068c70addb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 1d1e7fec3ec5c3d68c1659b06c4a6e7354c0b2d2c49599242a24c125a4d1aa36
MD5 36b17cd24ead64732eaef877d8327f23
BLAKE2b-256 09d6b79b00a82714c853e79da39f6428d3d3469a38573afede66e607711bc248

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 08320f6e644acbaf3fedf0827a36ee11cb87c8e4a782937acdfe3c4c359b1698
MD5 1266a37c824714c8dd972d46aeb0f91d
BLAKE2b-256 37aa004f6a6495f5b7d390cbb34691f326d63f4a50846dd36feb25db0b51e70c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 dc58ed3b5b65c0c90021e6492cac20723ab0f0416281af43cb9d5fbeb5bc7ad6
MD5 694e38cad13cd00d64b8627ce6225c85
BLAKE2b-256 c52f408d7312d85c44056ccbbbacda8c4d32574178c89893956a474a486038d2

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.16-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.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3a2f0b121b43bc3e53cbd6e2a55d70abded87417c8d3ccfd8b0bb6574e476e71
MD5 e353c0a6e06fe317bbc4aa5a1979a995
BLAKE2b-256 8d9e013c909e8b178dbcb68944669e32906826e61b36cf5b595270bc1b3c9e9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6024937d424ddeb615f74116eaba10caf7ce9a0cd8fbae22d3b2fd64512f05db
MD5 782a8b2a5d5228cf5173a1a2b5dac878
BLAKE2b-256 3517d60d43123d0203a683968bccb20a262c12f3bb675f1ae310488ae54407cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.16-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 06139100334affef079b146893d4754094bf83a33401c83301c6b33ba532db7e
MD5 d9bcdf46f9009a8a30c5888be071038e
BLAKE2b-256 b9a353b054fc5732a562db7fd1b8381a5c6af375d2b759179a6af92468ed7923

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