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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.24-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.24.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.24.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.24.tar.gz
Algorithm Hash digest
SHA256 9c72fe19d7ef448dc9bc43e77dcea5724501b4ff9511e25dc5a2e404abf34f13
MD5 c4c754b5727fac7ec59e32b0247133ba
BLAKE2b-256 4b6c9b58eb67cb0a9ce03e30fd7687b6625c64ba2bc9a230dc90812c9bf3e08c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 238e3d12cd47c8d0c1c3710a41835d9a9f7bc57e19bfae5ead2917bb1b32eab6
MD5 ce55ae5b6615e5e580afa2ccce5dadb0
BLAKE2b-256 2b173cb031ba91d391850aed83d69a4d053eee601444f3bb26bcba64a10e37f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 1b0626188e3d46cea044ba09770c2879a3f04fc251e9ae6a01d309dd8c8e4535
MD5 e574d4ba9329c5f204b51d0460cc87f2
BLAKE2b-256 07ecf63927fe634e8fc2c18b146f319a79962399c587ed2027ec8603fd786986

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.24-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.24-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e899a5c2ed74c457dd20951a5110eabcef94bc98defa43e30e44e522bd34d762
MD5 edc7d46c0a92e59752759e413c76d3bd
BLAKE2b-256 8402b53344135805f29304b9134f544eec173535f2d45706b97c7204cf243cea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aee09fd3928e6796dafa68e5ed6870794e411ed4f072bedf7bd4e1835d221f71
MD5 b5226988f6fc2b50af525df68fbc20c3
BLAKE2b-256 169b42b6667c412eade58631b7283ca2b06e9c7c8b6511d9c044b931cf303894

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c246bb0462429f0b1517811f017b24a9140185de8a3336e737ce6249c2e9369d
MD5 f3f54d33d852b88e195d6cca50eb8f9f
BLAKE2b-256 661d6973210604e19d0dd2cfa9671ae773f759779da4eab51a7c3748575e1532

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c48f805bfb94e957b248cc3345943fa06080af1ee3ad3e1efe19f65c8411c0ec
MD5 9cca6048420a6060b56d376f70618867
BLAKE2b-256 84e36fb3ea7fb33e8ef36235721839796a60e19cdc83bfaee0330b2e9e513363

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 788fa65416a54e4d02801b441d8489ffa38632aaa35bd26443e0c3ddd46e99b0
MD5 ff83e6945aadd449d26dd7eaf4077561
BLAKE2b-256 78fe10d149766e7aefa46da67c0311cb50c003b4f9d786af28c2dae65f8e675b

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.24-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.24-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9d016eab84e88ef2f23d95ff7576568c8a943f06ee57043272a8df262cfcc9b2
MD5 f9c9aab3ffc159e241eda5c46e055c48
BLAKE2b-256 f9b68612cdd7a6806022a1b50eb1867ba923574443a3ee1462916d8e76de4e4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bdd1f943d563ac81f6e0edcb2da2dc2f6bec9db435c5638a217b8ec9cb11f2ab
MD5 fe52f1f6b6d4ffbe5f0a74dedf927aee
BLAKE2b-256 108151fa5a243cd15b19b14a8735c554da514da656e24beda0ea5012b385a7e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 696200ff2b9f715bcfa31f07f4d41af2ab1da3fa222d6f06f228a3eed8ce8d96
MD5 2f81fb01147743068b71c2e03b5fc0eb
BLAKE2b-256 a13bbbcf64321bf6ed8756fbaaf62dc8fe5165d920f5b17fb98a1f0d47f60f65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 50819010659a5d656afbbf6b2a3c5734963bbe2b67a54b36936e6659678e2270
MD5 fe847edaff23ef85823ab0307eae9ba0
BLAKE2b-256 f92faae08790c3c7f1170eabc0dedcf85093de97bd155480851f63dc88e2a485

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 83d6c813fbcb921eb47630e9893080eae5079c6acd6758967c246b63809a13ea
MD5 df789d086c1685e5fd46596c8e162233
BLAKE2b-256 320ffd6f7a94e5b30fce7b98e71791d195674c68e471165de9464e0a8effdd38

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.24-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.24-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 27fa1095ea058abc99d2c6aea38ba3101079534682e0f65ffc1c825dd3e9a7c3
MD5 356f9dce6ee78d5eece18e5a49626bec
BLAKE2b-256 a7d4ad95c25cf9f42cfa79c205d793a7146e314e12cf1f9445c1c220955fbd81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 55e2dd2be2683b3ce154f0cbc493e2152f77677d687ff9d76835ba1a3c31578b
MD5 c964f466b6f12b62f0ac09a5a0e15c49
BLAKE2b-256 beb0e8063ef2e2d7cc2dc622783da77c35953c53da26115a9b0aa9793b4a3fc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.24-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 179c5f2a3206e8b9e649c4ece3225c03647467f18ac3b15f66a7ab563edcd9ec
MD5 88b47b3c3b7eb7141715697c8887cb4b
BLAKE2b-256 18fc834b096889d07115dd8a1fed3b95f2ce07178c4b019c23be93c86886ea2b

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