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.22.tar.gz (426.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.22-cp313-cp313-win_amd64.whl (887.0 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.22-cp313-cp313-win32.whl (777.8 kB view details)

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.22-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.22-cp312-cp312-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.22-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.22.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.22.tar.gz
  • Upload date:
  • Size: 426.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.22.tar.gz
Algorithm Hash digest
SHA256 9e5f859b820f102ae1804b194a18c8dcd69bde4da4115547042b762f2fbaccaf
MD5 db715570982e54b076acbd15e6ac6693
BLAKE2b-256 1e71c5599b41b06bb00ba274c468e0f6fadd9ab665a93b5afd8ccc18cd72d443

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f22b41f74ceefaf78aea474fe3f37b9054a1265f3966c2af776ae339028a2975
MD5 6ad646c9a186ca627a08590a94a0ec03
BLAKE2b-256 b53bb05348fef93353cd650fe02bc560b467be9c85cb7714eead07fb23adbeeb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 7f131a8a4e38f8bfbd57db3e37336aa9fe36cf8e89e715c3e94caaf635886d40
MD5 65ea4f03bf67fccbf336d087b37853c5
BLAKE2b-256 6ff793fbbaf03fef526f4e9e6be5690a4b79d41048315904e1a10f955e76c282

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.22-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.22-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a9b020c625420bc4bcf65b7fb1ad6aebb10a070a1fe06cbcffed36497574c322
MD5 ccff51994b7cd7bb5ab4da7ddf60d935
BLAKE2b-256 092e0a97651d1b3626c5a4050abe324db3046c2f30c689dd24417061a0e29b7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d581042754c117744c2e105d1db0e60dd11c2ef4b63084484e900fc027c1d69c
MD5 b97f9ebc85c6981bf0ba6fb5d11355ee
BLAKE2b-256 5ce4038401da2f8fed943c3bea45c7093ea4378f020fefe490d6009d574c51cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 dc76ea809e7b6b2ba1c494015259feee03939e2259f2f1819b3b733eebfa6569
MD5 c8aab37086b914f5fc655bc8ca4ec0e8
BLAKE2b-256 4a3090e8e8aec3f2dbcb4c0575dc4713cf002626b11f68c92604a9b3723241ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5c92d7c625282eb23e18a86986a3d134c2e7a8050b2cc38be39c73cebf794026
MD5 5b52b4a5334bffb9ce95d602464d45bb
BLAKE2b-256 3a7bf682f059a0b98ba0990da7ae71ceab77e78dc23bdd409a1fe3100e9c0561

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 2f5758e09ffd2db654f43edf693abf6bec758273fb539e50736d06817b5da8b5
MD5 ee8f312b2c723870efe994104936971d
BLAKE2b-256 309e184d195e38989aa022fe1cc1ebb8918e960c3fc595c666c5c4a8f6544d70

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.22-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.22-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9b72470a9883b5747ae277a3f74fa50aa23b3d5c2f64d65e5826c2b1aaee3dbd
MD5 ea2fb6ac91a569a63b3e53a23d9a7ef3
BLAKE2b-256 97fbf31e3457e7ea7f293fd07306b94451c94de55c66a4001cf6c7922da8a0f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c89a0eb30f13e9a0efb93c5a736f3157a59fab58a700deb944f5646d7739d883
MD5 3803f55837c5ea6e5c7301a941d8c889
BLAKE2b-256 6268baf82954cd803a8fb22c873c3f2a7f2386f53c73e9a5fdf53d78dbd768c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6bf59f6cb0f5c74246c0c6590d4fa49cfc5a516b7c74bdcbff814072f8591262
MD5 cec6175fbc6eae33f74a8e9d10c8f7d0
BLAKE2b-256 edae21428ba6cc6d22145719ffa6b6b555d81f99f79aeea9d78adedaa4b9d815

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6fb86169eb48fb873a3f66084f44c7637d86b3c7758a6eb32779395b7af6859c
MD5 0de9a03e7456f984a8fa011d8a338a20
BLAKE2b-256 065240ded2b4fbb1785d4589e47eac55071996653aff775b9f8d285fa7bd45bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 aca7c3a4de788801fc007a02963cf3a2183ab79376c25247f7f8dc83bb966a1a
MD5 1556d83f18cae820d557bcd9ff205622
BLAKE2b-256 3314450b3eef69a035320d5ad99e04c94b075c4bef0253998bcc9be89e1f3490

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.22-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.22-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b022d03b97810f5fc16cf35b910990fd5fc17e59defacecaeca4874326ef25d4
MD5 8a0486f0d7de94c4e0d062a93bb6aac5
BLAKE2b-256 753e9e793bed8f24262032d00c9dd3d4e770645566354e478e908a664d23128f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0cafbbdef86a320d80c576e318c12bdb07384178ed529c7aa926a3766f2569fa
MD5 b8e1a130c0ad14dcffb7477a5e5a8b52
BLAKE2b-256 d0de45e62165b1a62ea42e306920538bdd247cc290130ec51b6a6edd973e1d0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.22-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c42bb1ac95394307e3d4f97832e5a040b66f85747cf9d56da3b65f6e4a487c4a
MD5 9e5feb58d3bb24eba43378b61a2c7d32
BLAKE2b-256 05f34187ff1dcf8e168d6c6a4549c6fdf221f9a397347a0efc592a4944cdd8be

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