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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.15-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.15.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.15.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.15.tar.gz
Algorithm Hash digest
SHA256 7aec2f39bf960d7d81e0133d9f671c7572ae87b262e05b698b74ee68f3cfeaf8
MD5 ef200eca6f16d9a783dca90f4d4c8a58
BLAKE2b-256 67dbdb687d08b6ca662f0f39bc9befbe0cc20fce4421071cf28ffd830b28f60f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 980c4096e1ed44f90473d771c7900d6829f97cc0abe19f4406a28e209d3358b8
MD5 0d7333025d13b6514a15b7ac9993e71c
BLAKE2b-256 18a2107b9b208fde84c4b43bdc44f7a276cc06bc3f50e0506319221268317e36

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 566c5ef3c86c6abfc77b94b16a7e495d4b45998d777b84dc1fdb74bd2b4e7018
MD5 3479d326b05a4748577e16392e46891d
BLAKE2b-256 36127dbf6ff7ce9d517833022e93dd8d2643d37bf6000e0db378c0e5ef5de7a2

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.15-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.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1ee6e432640afb840afe6fe85187217d8ac90267e7152d4662e5c3d433a9b3c4
MD5 150e68b3f23d72b9112f18bdabdb31f4
BLAKE2b-256 4bed3ee6d0d67841e4ade82d03fcf5db0a4e7171fb0eabfc7e50daf3b2b5930e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 831b3f9e49e7f54cd282c8526ee92c1e25f8921095e5f384f76c63cc7dc7893d
MD5 2dad4c711f73f53d402dc61e56267a57
BLAKE2b-256 a27b4f9b8e2d5ec4a7da391e859dce009b1eb4f66f78da5c303fed75d6a24ab7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d252db03cb4f96485c5373240f7d51f09a5fa9dcb65d23703a03a80321fd3722
MD5 b4bbc20b6659d937619ccceec02ca514
BLAKE2b-256 c00f4d4f3435ee97ce69b477c6e5168f416c83d75df52fe1e830ec4887a5212f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6dc5c004e5ba0024daeabb19210e159e3b3686ec5e9492b66d9f01ed65d0d6dc
MD5 d94f63da69ed4a993ec83a34fd2eb2bf
BLAKE2b-256 6083e3cbc90d53ae36fef1c343779fa701cb8145b47a8100a044106166f4c475

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 976fe3b35a39422a016ef8f93ebb4f10b1bd308391c7aea63078df0408804bde
MD5 9f353c3f22dfd8d561d28c00b488b0cb
BLAKE2b-256 1247ebfba72a935d4e55eabe6de4c225cec6f88492e33ab0e7f52ebe8f02e8d4

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.15-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.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4e6bc54576ce374acde1464af7235a1f76a84a6e465f025b0ce155e225a97f61
MD5 1801bc1cc51244be1ee4f45039b8b573
BLAKE2b-256 b9829cb0f66d81d4043290fa54f900d4815d78e96a8a1e2d2a31b6f723c44dbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab1071bad9f1bbf2facb37f65b7b5ad45669422d448a06878df3eea4475216d7
MD5 2b6a04d560b2f6691eefa4d121add799
BLAKE2b-256 edc94313e2b43c58b1a50ec4ea36daaed715fe1813f421fdb2910d5620618fd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6f3f0fb2563605053e0368ed6e4f8c90c9f211df5fddb71957c70752b189ca06
MD5 e009c7c5db579feb76e3fed403790711
BLAKE2b-256 4c7fc5fc9c073fa95806a3e325ef6ba3c04e7d8249d2acbca48e88f547cc9bf2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d71ddfbf4c419fa291dc2b7d7e37f5502bcc282628d652197cd5747ad93048a9
MD5 89f931f5b0b478252bbd8157f23551de
BLAKE2b-256 c8c58ba5ff2684300269a0f18990570cd62a81a9330e81ca4c71c4b1294da186

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 d17b78095d34c1483e0694453c6a68c6bad2eb00ba4859e6787b5b85691d1523
MD5 ee89fcb1434708d54a0f72b2e5478b26
BLAKE2b-256 88e488db703ce0d272256fa0ae36faa61901689f9f0e54a586403ab11bf920be

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.15-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.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 20ace9a319e5b12cd0a88972884f949539be1687826ea9e6a6cd0d7be2c92a3c
MD5 81b9e8372d31571052a13370bb13fe5d
BLAKE2b-256 6fa6a6f3fd6a711e3e0521919a8692cbc26a1404c66b2e2d597f3563027cd8a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4845f474277cd1d86a03b53d481e92a0e70818c4b978d9168eaa75b390c0c9df
MD5 adda57fc3ee524bba1272c591574d137
BLAKE2b-256 84feb7685c6042acae0d07b8027b0ffbf90c125bd667388775c7aadacc244a8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.15-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 07d68ad79606d9e58a61bad779cfe077cf4ef9257d3cc4c9a20eb011a3035bc0
MD5 cdef0e4005f5a88316c2496434fcd102
BLAKE2b-256 0500bcea441385c92d689897d909372e4bcac26d51dbe17519520ebb9b3e16dc

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