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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.17-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.17.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.17.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.17.tar.gz
Algorithm Hash digest
SHA256 b025691caddbbfc74f773bd4100a9068a66ecf2bd02a712813735eb48fa02d3b
MD5 d5335de871d495b0e1c034dd5f7bec32
BLAKE2b-256 ec59d87325b5cfbef9df34e7df6c9a1a58aa6393927ce26ad32b923a53751577

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 23843af797569046eaba503df1939a7af1b4b6c272869cf2e970ecc7ca8a9926
MD5 449803c5ea9900c075425a68359fe2ad
BLAKE2b-256 b9179ef2d01f1e2d9dd6fca3be14dfb69bdc22921d036de78ca958bbe869fffc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 60a3bc2a25ffa246f9a673b9c94ee1a9b4d34d65aeaf67089351ca9093947e4d
MD5 587965a56cdfbbe883c4c31699440a44
BLAKE2b-256 1fbefa300f4401c460f0846a0a38d5792f6f17cbf8d858f8c315a51ff0ad7214

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.17-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.17-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e7b1ccd2b598b7168449e880aa74eae1cb488c57f8b6fe88043982b7f0a25350
MD5 dc1f756610c28179e3993673330963d9
BLAKE2b-256 39e4ba8c837116ec73e4eacd0ed84fda70413b2e11893b1c2cf23f1ae998b064

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4277d0a4e850f35144a6b33dfd781f3a9f444d685598b59d7a2b6a87d19ad127
MD5 54b2266ef8ec577ff2846d9b1e22e29d
BLAKE2b-256 08d157fbd0b5479239e12d68bf1b1035a1774749a1de173d88805fe1008de960

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2129e4572ac9ed26f5cd400e576278be1cd3e35e260681c19e52a3ae8ffb567e
MD5 aea0a1dc9c6189f0308feb08a54a224f
BLAKE2b-256 b9e4dbc6a2998c4ddb32825030b7b6728a6970527d4e5adff32996de6d19d1fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7507e632249077bfad8e35942c419e6e19c63b549688e492e554cf0415788b8b
MD5 52d7f6dfb710c9eea168c8401ac90500
BLAKE2b-256 714aa07fb92e0d690788a6f0a421d30315b12fd582e12f90383dd82e6cd8cd2a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 d6d5ccf687f3c6c562e138ffa34385e3c9915973023a06f54eefe711e5bf09b7
MD5 2728bacc008425b0ae8805f61fe78646
BLAKE2b-256 c3454efc2e67ab26cfc3d419593b56455e44a492dd7c3f2640698f118628ce09

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.17-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.17-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cc41ef6d181787eba4cb84790db5ff24131d4f5c37daf98d7dd024cf94ac20b1
MD5 e3c51e6677eb897b660b8889c2caffd7
BLAKE2b-256 c7352e682a7dacf00a7eac317955f3a9373a1dc4ded1e6fa8bf16a22cc54900c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 994da17b03c594e64846f5df23b664a96a12c7d02d416bfd3e91e162ab8e642a
MD5 8c4bd7edca2024b9b4d1193effb59624
BLAKE2b-256 268ce407ccf48214cbda25432e684622a5ea378f8cd00a6eff9125d78b06f6b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c3de433361151d43eddd81f6a2454fa3e209ef478e1129d3301db141f1f094f1
MD5 9633ea73d6c9f11177a326627a809d2d
BLAKE2b-256 f4464d0466c4a73f1c6d6955fe19b5cc61033c9d03c8dd09986cb6250db98d53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0bebf04f5b923d2ee1ef495ecc9815f2e803bfdcd9051db0db99ea12f3e9212a
MD5 368abd583c9bb0189295864ff56c5c44
BLAKE2b-256 9d7767d2568e7a4ed721bc266196730781f0d74a02570a96cc7607d5bf15a4f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 0147a1d8cfa93024137da077b95a77a4f93ea521d6933bcf09ecfc26fa3716fc
MD5 676ff694fe68b27cbd71bca3b7107dbf
BLAKE2b-256 98d69d0ae42d2e8755396e9d78c0eb3d41b1045d556eca05100a816989be379d

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.17-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.17-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7e6143b731b5b2bbf9e35ad96b0b31abf589437fcc908ef48d12d80de06b173d
MD5 b7068169406978cb40362de0768d4bab
BLAKE2b-256 8b8ac267e412230ea1411a3ffedb314e9b63307fcedd8239a6b3c882b42656d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3007d9b9bd35a0351b6c1d23e2ae57b23a0e46053601348d113b24d64f518099
MD5 40a113614857999cea96bb242c1f1148
BLAKE2b-256 c2d96cb32f59b0d9e1dd9fa7e4199b1aa0b950d44c46c9a1dcf78fa526e92ba5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.17-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8f26841a0d863200f828480780532dc7c7030ded77001c0d4e96855de4046803
MD5 99097bf9e36d89010934859fd8cca183
BLAKE2b-256 8a208e5a149d9290e129577f30765e57a610599af878b71b4777e382aa25cf4c

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