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.11.tar.gz (423.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.11-cp313-cp313-win_amd64.whl (886.8 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.11-cp313-cp313-win32.whl (777.6 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.11-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.11-cp313-cp313-macosx_11_0_arm64.whl (844.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.11-cp313-cp313-macosx_10_13_x86_64.whl (913.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.11-cp312-cp312-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.11-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.11-cp312-cp312-macosx_11_0_arm64.whl (848.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.11-cp312-cp312-macosx_10_13_x86_64.whl (918.0 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.11-cp311-cp311-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.11-cp311-cp311-win32.whl (780.4 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.11-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.11-cp311-cp311-macosx_11_0_arm64.whl (858.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.11-cp311-cp311-macosx_10_9_x86_64.whl (913.4 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.11.tar.gz
  • Upload date:
  • Size: 423.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.11.tar.gz
Algorithm Hash digest
SHA256 a584364a3ba6cda181c6aba82eb1ea24c00f7023c3e7bacc72ad685415e01081
MD5 13193c0942178510c8255caa3789f867
BLAKE2b-256 5223ffe2b893c0c5fdf1988872cb69e49c5a94ac20c4d10118a70b57e83828b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b41382a7f151b5055cb1eb51adf015a72979ddd295030f5d822578f12df1629a
MD5 4092831ff85f1dc678620cd59fd7ed0d
BLAKE2b-256 828964d5629a361fb2d6e375c4b46493bd9cbacb4872b6ae9dcc3ddaba75c2bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 009e33da440b36c185cdd841504d3e9eeb35e0124d77ee48c88b74d7e79d6023
MD5 142ffb15f88c14c6c48b78e26c926b5f
BLAKE2b-256 cd08691a8fe98edcd87044824006439f96209fcc92b7a9a46c3bb06ce52d3646

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.11-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.11-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 41a33457318d48e20ab0b197b6e18fc1a864bac4d27632a7fc10b43560388e53
MD5 0e34fa405f510aa895aa38aba25ead3b
BLAKE2b-256 e75e38143e1b7c4b6b7b5aca1af659d97ecaba7e4953fd80252df8a164c4b4da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2948aeb1ca431ffbe93dd9202d1846a7cc7eab73d7a604cb124a837d94ad9cb
MD5 b95bad2d0253a51e6db358aeb6b338c5
BLAKE2b-256 b85114a2c1243359f32eb1e560ff68703cc905c441c265376f3b9cefbe304e95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 663075f243333bfee2ae175b3176aa97193a50757f1a6d99f4186b2e5512be2a
MD5 a1f811d0a8bad331db9039b894a129b5
BLAKE2b-256 d8ce3f906dfc0b5cd7983b5fcc558e28b2e3dd579b1adf5fa72be050b86f5f35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0ac25069e66ea4f56471c983e0f4f6bd600eb4eb9a72732488d234ff7d530587
MD5 9165a62126d3237af96ee50bef23c130
BLAKE2b-256 0a61fefcecd7c6f5ac7f60e075659f34dd80c900e69a6e8f850fc3f73bf5fdb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 935ca1a5f2561f2783fa832d8904326bb72c6bf0d46aa055c3d46ef83f66e0b4
MD5 d480c1f9bd7818e369d514d61117b383
BLAKE2b-256 29525382b2af7c714569db49fd1716e42f58d9f83d8bdf2c74b1768b29a20392

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.11-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.11-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 81d6797b6d1ec8b9c50594422e7373836e9aff67376f58ddd55087b89b5bf0a2
MD5 826d7a607c267179c2ef2977a4bc9418
BLAKE2b-256 2afd5e5ba338622a99da94b5a81d882218cd888538e808c291c705bf2c29acc7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82ed79902fa4a30c86576e05d6c70d1096930590ac70a4ed2c8c18da4b4ea9b8
MD5 77cc1fc6de572d6e93b9aa01d63fdd5d
BLAKE2b-256 c6cc67e9b28165c4bb45e7fb76ed453dfd27926e1bfe3a3754a8bc8787962bd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d07d7ddb7961ae558599e1f51640423b8a6ca14fd74d307bbe509d4e0b87052e
MD5 58bc48da3133a6e369250f7831e4b0f2
BLAKE2b-256 faaf56f88adead07226789012cc8e3dadc104ca5d6685345b6aa5a3696360179

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 28804750d392151f5b11f957af34cd50c574473189c7a9dd4e9ff4c5d8661f34
MD5 06ed7106855d52438f6fab7f98fc9b58
BLAKE2b-256 4027b755bee4d318bbf838e4587d98174477a858637e3be598632d412f681647

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 70ea9b9b287b66e173de65ae5109e837b7d1d4f2899f01e5bc09d153533beff7
MD5 b2329e159826eae91941152d60b607ed
BLAKE2b-256 af978698751e3b79a384ea0f95341049598cb475cc8624d8661edfea4d0b2c2c

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.11-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.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 24c08e1758a011fef3d2d75191fb5abb437af16bc6db7508227b0ddf6d59cfc2
MD5 662e36538f27ba5d00f03ec101e751b6
BLAKE2b-256 5d6339d176b06caa869fddfea765c45a5a094272798a219627320eb63e31352c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6cb1d3d5ec99f627f4f399c0b8a3a27502003b1f4283160300370348e05b1156
MD5 e8bb7df7b864da8c09dee8c944676eca
BLAKE2b-256 f9c9c099f395ac173c596eb51397bf67abc03a69b54765538c83b035ed29d773

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.11-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 38c74239a0b41eaba2d2fe4ca39faa489c6854b5f12763deb5f4ff2bdbd90436
MD5 c031c8e0cb77eaa885615d9b60173e49
BLAKE2b-256 4faf3c487e747b7d1beebdaa469984c994d8b35e578aa53fea7e60f5a4983a8d

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