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.33.tar.gz (477.0 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.33-cp313-cp313-win_amd64.whl (987.3 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.33-cp313-cp313-win32.whl (865.2 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.33-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

elaraai_east_py-1.0.33-cp313-cp313-macosx_11_0_arm64.whl (940.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.33-cp313-cp313-macosx_10_13_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.33-cp312-cp312-win_amd64.whl (986.8 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.33-cp312-cp312-win32.whl (867.3 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.33-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

elaraai_east_py-1.0.33-cp312-cp312-macosx_11_0_arm64.whl (944.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.33-cp312-cp312-macosx_10_13_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.33-cp311-cp311-win_amd64.whl (987.5 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.33-cp311-cp311-win32.whl (867.9 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.33-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

elaraai_east_py-1.0.33-cp311-cp311-macosx_11_0_arm64.whl (954.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.33-cp311-cp311-macosx_10_9_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.33.tar.gz
  • Upload date:
  • Size: 477.0 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.33.tar.gz
Algorithm Hash digest
SHA256 2e2c9448df8009b433ef2465901de0a8d9e9a4793d14b21e1530426d2b17afa0
MD5 d8acbe1801855fe00c3ecebfbaac64b0
BLAKE2b-256 58ca197630604c1385d069bf4c22e226c2aba597de7ec9985e30bfa2ae014a6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a1a61ec488d9568b3a3518530ef44b6b945666d9780ca964bc0fc18472541f3f
MD5 45ff1f696186b33bf04fd12281acd710
BLAKE2b-256 30b588439650d8e8a215112394f52897b493c49db4975b7846c69dff7e4e3c54

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 ac7809b264a72b46e2373abfc10cf7cffbe23c899d1fd0159aa6d8e85887afba
MD5 fd23d2ed5f9fa2e871ba15908f8a725f
BLAKE2b-256 29c302dbff30c29efd3d557bf81e6ddc9f867450947eface19a4945ba2667284

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.33-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.33-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9e51dd889d88c55031dc5d385219850a8e46d06f4a43db83cab2c44a8821afd9
MD5 1c56d2283f57952aa9ef85837abb33d7
BLAKE2b-256 2b9cb8d74c8f7d9e0e8abc363408090af82a84c7bc39db39d17fb097d03e0669

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be421ab0bfe369a8e4e26b7694018ddf3420435a3e2c18dfbfe270b1ca7a3589
MD5 255eb72c7e4e69c406547fe56b49b628
BLAKE2b-256 5ab29832217af1e103eedf1f5e2d741d35e98d582585b772b7b30dd8a717c2dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a8b5b4559b5af81c33f01fccc4d0fbd5660bda4e715024601ba96fa227f7d4e5
MD5 f3e3a00bd1038fee96a60e3756d8198d
BLAKE2b-256 c51d3c75bce45d6aa960695f29fdec0e8baa4f67e32fd11c822ba9a6bf06f669

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fb0cd582ce4964ee6ba34cb2d5ffc07d9eab91d4f1bfbe5d85e2aae5d36be318
MD5 7d1846c56af1e304083d999260620dba
BLAKE2b-256 d5a541fe4f54a3d421ccc43a4eb116ab259e0fd6cf92c28b9046677a200bfd6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 c5acf4643805d996dbdcb33d0e6240899484453a2f111354f75302f8905ab7b3
MD5 60c362ab165160cd41b61b534e82b355
BLAKE2b-256 4785f59f7774368f1a091561067debdb2ea18637f248c1d63f8a82877065af39

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.33-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.33-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 14f285f919e5608d9c98c040bae65c58e06be849362aba8ae2473992c9a41b90
MD5 901ba675166b9be437f8ef17419926b1
BLAKE2b-256 736b9a3bd6d1effbabb4590ee1786b53d67b28b174db6b8023adbe317a9e6634

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f2771c0753b819024712f5439f2726198cb77aa18a34aa915f7a11fa09a7113
MD5 cbfa97fc85ce9a727fc778322c32468b
BLAKE2b-256 bd1c7a5d5bb250cdc0e00fbe5755d3c5f91b08ab1c6477a0d340f0d525c6e44a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 cbceb09fd3037fe37b03403f1c6942276c444fa3397c70fb2c540be79cf4519c
MD5 d8480c13655f0f2eadcd15ea713f4482
BLAKE2b-256 af71a9963a56983df6de4921ee1123eefd99d404fc4ce5f358a7b44de3b2f90b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1d9ddf51565bcef2bace3c0fb43fcc0ef23ac166ea753c24eb7f4d802bdbb18e
MD5 38880821f800d21761814fe50daaf22c
BLAKE2b-256 3b84290a16ba1b432d6f5993b9e7ced7671116eadeea27d0294799a67ea35974

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 084cbef12dbd2f54b5443472a572753419e8c64863ce1388b14e1cc6c86651d2
MD5 c8051b78799c2cc5d39ccfbd4789b66a
BLAKE2b-256 7c2825be8f2e8ea8ca5d515d2cfba9f52a0be1ae10424c5c35b4d9ee5c57505f

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.33-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.33-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 25a92e98fc2841ffcfc50d1589741dcf83061f39d79ddfd53d713323b259b8e9
MD5 c4ab803d68e96dd0a53fd88244a060f5
BLAKE2b-256 4871c9e21e13f5967d8a71016be7decd8b071bd48e874edf6d3da69ab7eae5dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0b9795df8be627676f969c856074768940fd5d371fb772625a7df68164ce457c
MD5 88d65d9a3c05e6a332919e6425f5dbb5
BLAKE2b-256 43b4c542f0b2fff552b877f24db9f29649cca5852fd5e945a68bea09e86fe551

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.33-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 dc1afdff65bc705de0bdf8fa172d18c3d52bfc235327e83cdd00b220947f75bf
MD5 772c202fa0ac88050772127ba108956a
BLAKE2b-256 fd611554f7fd64b86a71342962a5e4b1d7dbbd9bdf2dcad337cab7ed21325c26

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