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.7.tar.gz (405.8 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.7-cp313-cp313-win_amd64.whl (876.4 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.7-cp313-cp313-win32.whl (768.3 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.7-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.7-cp313-cp313-macosx_11_0_arm64.whl (835.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.7-cp313-cp313-macosx_10_13_x86_64.whl (903.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.7-cp312-cp312-win_amd64.whl (876.8 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.7-cp312-cp312-win32.whl (770.1 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.7-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.7-cp312-cp312-macosx_11_0_arm64.whl (839.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.7-cp312-cp312-macosx_10_13_x86_64.whl (907.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.7-cp311-cp311-win_amd64.whl (877.0 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.7-cp311-cp311-win32.whl (770.4 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.7-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.7-cp311-cp311-macosx_11_0_arm64.whl (848.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl (903.3 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.7.tar.gz
  • Upload date:
  • Size: 405.8 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.7.tar.gz
Algorithm Hash digest
SHA256 ae936c2d8aeb787964c2f7d9b6a3a029cf2136665d32b7b86cfbc0a56202c8ef
MD5 680747d5dcda6651ff641becf91a647a
BLAKE2b-256 34a969f0c17c9f62afe7b7b39fc993f7611e0057164c6f5e09f306a9d85688dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 94c3caf03f0aed8bb6c6a4cf009b21838e739dffcce60db37c139665cdd122cb
MD5 6938953721a486633794fb1309abed09
BLAKE2b-256 87957e43a1d79a83ed49ba2af4c8b8151de38ef92a44d6708af70a3a3d51cbdf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 b736781759648331abb7a3af3638877d618b8f88dbc483391860aaf13d6fe9b1
MD5 de1ea8212bc20750e60c19d26a01ee95
BLAKE2b-256 a9cd833a75f56289fb273b4b8a76ba32f55132097165e1aead30f82dde23def3

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.7-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.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 be4c86e1db00d2a9e2872af090492fb76e735fdb8f5684fe3dd94e2769bb5ce7
MD5 38add1041303cdfdb07cc3597c8fbf73
BLAKE2b-256 34d25c496262bc06f9141a085ccce7502c46645766446896b87b83563b9ec468

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8570c200d6fd662cfdbeeafe4eb8d3ef449b1e587c19bec8603f7de287e337c
MD5 7e61cbb3a914fbb69e938dfdec2ce11c
BLAKE2b-256 ca9727815f45fd2d76e8073d955372b86f7640d01e49d04f253645a3591d279c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 22cf67711a1b0ff993a1d82a8e99c4cfbad539419a3c5eda5b0e9207910b355b
MD5 3af13724d1d59d4769ceb9bd4dda808e
BLAKE2b-256 2069722e79fdce85bdc5633433a7be0c7ac696605fd799ac3f644b0e060ad473

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c2ae9c198ba69fe48e4b80f1f6d4b26cc3db9b8a5e984657aed0166d3c7197a9
MD5 55941e02850059aa8cd657ce032f9dec
BLAKE2b-256 681b91830fc6971be4c9aa225d9b2980bf0d131f12e832d01217b41c0e558019

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 faee437831fd3e578a1a07f4840c132226b6564fa546de1a313b3f3dd60e1362
MD5 fc3372f639d371d262a959cf0983d1a5
BLAKE2b-256 4d2270de2fd1836846d6f774a431fc14498a75887a3354d46bb340f3b3a6d857

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.7-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.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fa570567ad654607fb140a506528f1bec82f4f1273dd2bddb5e63e5e1d5b2369
MD5 89e9b2b1531752c8e300810e1a4221fe
BLAKE2b-256 c1e41d792033df7a342c6eef74a4b89ce5cc8561eb38c8d613ebf8cc5c9adcb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 04dc924537e19f422e847cfe2adc459c850f5113127b26f016dbc69436ba30e8
MD5 d7eeaaeb0dcc18ab1c6d596298dc7e98
BLAKE2b-256 420a73179cd26eba79a8dee21dbfd9847c000f7a0ce4b8befe6915050b458bfc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 63d0c7b35d59e6a682476a164498c28453a7a78857789f80c2319c3d07006153
MD5 ef177aa1b33145c6556174524ef32df3
BLAKE2b-256 fdc1badc6d6b305cd645202659cb8aa6afe2ae5a282484df0a2740c1ec576875

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7199a60706840c51f18acafb7c9752a07357c3f5e2ec3de1e40d2fb52402c7d6
MD5 898b6e7acdc63e2d938d052ff7362ca9
BLAKE2b-256 156b857c3e2d8df97db2a9b9d166c7972c708720ffb6041e6f1069918e20297e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 5fc04f872fc4849c9d8469db2dcb8cedd388ecfd5fb4a433df30c823f4400176
MD5 58d213c624248de0b5c0fc11300f056c
BLAKE2b-256 bfd3e498277dd7181aeae72e41cd7134a78a1707dd0b71f189d986b39e061ddf

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.7-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.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c52fb085b5fc94c902b993c1fe82b904395c7a2237a7a66240c998f2b8806954
MD5 7fa895a2c16fe867f008ce4d9baf1439
BLAKE2b-256 855ba445f88cbd301b2e55e24f04a8f4e6e396f4b6056c7c221d5583a3cfcbc3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a60afdaa1fcd723c107709e6a57b914f110af7d891c5476c92bb677d413c425
MD5 4cbd7b0ca5125be2f71532233da61305
BLAKE2b-256 30daad4498bd3fd085cf440a6f3a6ea571ddd46ac0740ea38dd8ab4949a9d585

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 10a852319c71823a66442e7fbe5ce0242749b87656a54795cbe3b3b700eb987e
MD5 ee05d3384e4a7240c5fde67b16ecf88a
BLAKE2b-256 aae0e6ccf7724e023ba21e89779291da18f99a26e2529d42f5688251befe7bfe

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