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.9.tar.gz (413.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.9-cp313-cp313-win_amd64.whl (881.9 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.9-cp313-cp313-win32.whl (772.4 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.9-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.9-cp313-cp313-macosx_11_0_arm64.whl (840.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.9-cp313-cp313-macosx_10_13_x86_64.whl (909.1 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.9-cp312-cp312-win_amd64.whl (882.2 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.9-cp312-cp312-win32.whl (774.7 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.9-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.9-cp312-cp312-macosx_11_0_arm64.whl (844.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.9-cp312-cp312-macosx_10_13_x86_64.whl (913.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.9-cp311-cp311-win_amd64.whl (882.0 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.9-cp311-cp311-win32.whl (774.9 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.9-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.9-cp311-cp311-macosx_11_0_arm64.whl (853.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl (909.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file elaraai_east_py-1.0.9.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.9.tar.gz
  • Upload date:
  • Size: 413.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.9.tar.gz
Algorithm Hash digest
SHA256 43b6d1de340648989c1fdf029e761872f1d1b420cc6e2a83916f06d8cf3a288a
MD5 3cba514447c4fb54fb39a8c3c6eda4d4
BLAKE2b-256 501291cc10ae37dc334509f06872b527f0ca25f43b540309866f8b1d0bc00ffa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c70f873bf072830097fa61984d855fcf08521e6c98adfd8e79c19b2316011923
MD5 30fe97ab0a43c050f32f92f687dd9a8e
BLAKE2b-256 6a18afc8a159250c59f86009cc2348fde4e9d021de0b251109597ad13975336b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 62dbb8cba469d0e3d5ef920a521b0edcff93f4f10b4ca3a54ee1ded22af1828a
MD5 5da2a258243c69a0a52759b32382960e
BLAKE2b-256 0db83360fbc800e0a744782805cf928024ea41fb5897555aab18f479adbca29a

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.9-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.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bff2c330188b50db847afd7747ac95ccf0b8ae3a05d64ea230c1fd3fae695376
MD5 2b3c475f6289359337bc74f029af790a
BLAKE2b-256 74dac9b52c723f796690d1246a0bb886f13a7e2f4e60f553cc5a3bb9c5eca87e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33d20433beb2f0b155d10ba5f047bb68b5e2dca687b639e4e4a6c80cbe423a9b
MD5 329efe9822d4c08625a08071facf898d
BLAKE2b-256 96f576835a1282abfeb043a56e66c2789dd2c53c78b6c9de1bf5e0ed0f0e0a38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5564365b519160248c6716ee9202d4e205406e225119d9cd19cb00a5b2938596
MD5 1f206759f4dd74e724245521bd411312
BLAKE2b-256 48e71a5e873b713c67b71a6bfb53d2f8e068750b83e2f03d5ce402811294949c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 482646d74bb835d4af84cab4ecac604f944effdb3d35fec5a98fa8b69281f29a
MD5 b917bdd3dd2958800386784da78189ca
BLAKE2b-256 d14b05b7e82f18c182eb007675978b5ce2acd395be094acab11ccea3fdb9caf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 92ef336caaed062cb3a7524cba7929a28df03c47c805aa78870dc33dd7c451c6
MD5 cfca3d9d58df1b7f89d5290ec0bc0956
BLAKE2b-256 01e9ec84c8685ff488a15d0ae5bf71c71c989b48ee235b5dfff1cb8066a016bb

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.9-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.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 71c0fa8b9becf619fd984e918cb097d8fcd376be98e03c43697f8eabc441397e
MD5 0c98c87f3978f8addb1d0194adf35a2d
BLAKE2b-256 2a81a04ea89114d000d618e631fddea8ccc7fdd93e1d2464b79535edb1a36a80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c0bc339e5db006accd35f70e0dc8ab69aa05e6a5abe2a07f717a2dad1ab4fa0
MD5 945560627fa71a18950bbc085c06d410
BLAKE2b-256 0a3e3fe2ec82b27dacb681034367be548b79fcfed526b4d0983e74598da223dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 09a6eda2fbe9dea35649669bfa38b0d8c462e2523919676901ad3aed616172c9
MD5 c5a629f81f08ece376136d0f0f2272ae
BLAKE2b-256 17e5a104b857a1d8386ec2e807ef4ce9e35727c40c8c599a4046f9dab4b1b86a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c4c2a4eb539151418c6de46db058e6574bcbb361db8183388e6b9852cbbc4b8a
MD5 ff51e7b4148e8f00bb124dd48c8e1ece
BLAKE2b-256 2f5ba5ec4d5a954d96727933009592bab3825911b3e1a8b0bec8ccb7307c1412

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 05b2cd2c899dc203110f2d53a0746c31fd7a09036f566c88c2892b70d441f566
MD5 f270cb3c808aa5c90265bc08e4b79605
BLAKE2b-256 c6f4dedb7f11183e8cc1c0a91371ffd82a5f01432bb02aec60050c17ec9e43f8

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.9-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.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b9b8763a652102e5eb9590ab6960b2d8fe5302f017c00b69e0509d1f281d6369
MD5 4355ed70bbcff2e7152f98885323d777
BLAKE2b-256 6136f9cbc66e1037367e435ef9a0888ef6763899a2eca631feebd91986e769e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9919b7153e6d16bba68d5dd3be03652f8696746b0aaa0e6aa619c7ccfb749acc
MD5 3e678e35dda053dd7825b3cb34a5f9f3
BLAKE2b-256 f81741a05f6fba892ed568dc6110331f293d566364208c4be04cac2897351c89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2f16de215aab9407b60d179a444d6103b292f63d8515f53dd36adc029a74f54e
MD5 64cc939b2669934b93a4675a17651756
BLAKE2b-256 ed209493f56c619ba6a355897641a54bbac33ddd163f7b504c56f3acf1cc9470

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