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

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.25-cp313-cp313-win32.whl (780.3 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.25-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.25-cp313-cp313-macosx_11_0_arm64.whl (848.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.25-cp313-cp313-macosx_10_13_x86_64.whl (917.4 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.25-cp312-cp312-win_amd64.whl (889.9 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.25-cp312-cp312-win32.whl (782.2 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.25-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.25-cp312-cp312-macosx_11_0_arm64.whl (852.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.25-cp312-cp312-macosx_10_13_x86_64.whl (921.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.25-cp311-cp311-win_amd64.whl (889.8 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.25-cp311-cp311-win32.whl (782.9 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.25-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.25-cp311-cp311-macosx_11_0_arm64.whl (862.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.25-cp311-cp311-macosx_10_9_x86_64.whl (916.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.25.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.25.tar.gz
Algorithm Hash digest
SHA256 df89e4ca006b8c521a50ac7faffac8f13b5b9885c25a1a45f01d43310a87062f
MD5 cee2f155b5b0307f736519b40c3d4ccc
BLAKE2b-256 cf17e4be734df68d25deb2ca390061c023828f50cc0fe1fded63d7aab50ddec1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 086fecdce689e2a31cbe9d86d48900724f7607e6ef057740a708a4739d45dcfe
MD5 9ecbdc24a4aa5b733350c4fbccb18561
BLAKE2b-256 e6ab1f8c2705a4a4bcec9d9f1231833eb472bb1ac19e0ef70ceda11626ff57fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 8edf97391355e82b8d12d1563082b86780f044f82c5b46a735a2cf2157b188b1
MD5 0990964a9ddb6be565cee264d1a9da3c
BLAKE2b-256 ddacc8ba79eb56c79d7fa16d3072bf8e5b4aa7123bf5ccf96469c379ed454543

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.25-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.25-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d2b734dd6efe865c69944bfe322aa2aba486c580f1c4f2ad61eafb9e018d0c2e
MD5 4a80920a9ae81135d336e503ca467bd6
BLAKE2b-256 6957b5fd14eabf8335e81a54340657a23351fbd64ad6d3abcd6ec5014effdf7a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 20827fdaa40eef2c1fbc29271ffe46192faee80088bfb994572c54b55a2252af
MD5 631d7a88e557c55f2dc791ace67b36d8
BLAKE2b-256 b637dfc5c3ec5344f72faf5ae6f5f9a6d6a29c29b0a40f5b3688aa674ff0cbc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9a1efeefb3c3be8403cfeef7721787642c6ce55009b0a3fc626cb2d10c62d21d
MD5 5d5d3de1baddbd662131a8e8fb34b0bd
BLAKE2b-256 73d7b06c5597fb7aeb91a95c5b428b3d79baa09273b1d25422f4c1d15288239b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f330acf5ea5d9b3cc8bb0fb621e12f8a3c260cb5a0a32c52a534bc568066ceda
MD5 43b3fcbf6c5574046e40d701d36c9ef0
BLAKE2b-256 40377ff58105e991ccd5dc2cf5400329f95ddee6e7baf60af615a3a2e879a2a6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 2688887f1dd1ae676739a222d9848f2bd8723f51e42a2ac77a28b7275476e0d3
MD5 3e8739ab3562f7b23d5ffae134415a55
BLAKE2b-256 f947befe3b0c98faa8d98af876d9fe80de51e2017ff229cd156f0e3769dba5e8

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.25-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.25-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d00451d0edb9564a4ea93f0b78c7ebc8ed422498db422d057a1911b355063f11
MD5 dd0c62c605240add784f8deadc203d43
BLAKE2b-256 4cdf43167a660d064cbc4a5e7d0e7415bcb0ae1fa046c0eeb4bacbcc34ab3827

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 feeecb13d3df6e28f0085e9c1e9bcf60073026cf7d7ee293f5c0d9fdb6c1d49c
MD5 73c7660a72996b07db3b4aa834dc0cec
BLAKE2b-256 09b51cd0f3e6be935e9a1c8821e91c84d36f3d0e8166d197063f9db5b560be51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 78d1ce59e064060a5ce00c94aef5e78bd47ed66061d89ba5be33ee9b77a8eafb
MD5 0d6b2b5c61d6f2621286104a8fb5833c
BLAKE2b-256 f75dbea639cce7e09dc5f52fd399390633490af6ad5cab00d7edd4aacc6f587c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 42f4352916ddbfdd4f471c694429f4fd4c0b80f28b2d34a1a17583bbd1a4a35a
MD5 3cc18e996577324a4dbc8d2bee40d464
BLAKE2b-256 3b7bc6801e4355acd60902faeeb6c6389f4c21f652aa3c0e7407b7e8fad54dd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 d1676290c16e3571018a3fb4f29f52cd1a929772b3d0fa391e5923c8df889a5c
MD5 0616639cd19a65fc3523d2fe34e2b5ca
BLAKE2b-256 e42ed53c639bfd320b7555c3e6b1275891355429727151a81a34b2291a9b0ca9

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.25-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.25-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3b722e6236367764fe47a5a360a17c19731f0faab673b60e8bec6c3d6aa2c998
MD5 f13b140a385f3b763f85057a6cf0ef41
BLAKE2b-256 3991d9f13496dedf7967e8b0aa1ea5513ee09ef163e07980efb88419f5c22132

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ead95e450941a2ac1cee1ad727a5c4d022d90f38a0cff29d52c52e21130c777
MD5 fab9e0beb98b56f1e42bf5b3372de8f9
BLAKE2b-256 d6e140b23e73956ed8b482767037d260ee3048e9c9c5e34daddf925ead5f9a3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.25-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c815d8134cd6c5eea7919554814b4fd51e9d4d776b5b02cfbe11853539c100f9
MD5 37740d896f51f3c5898902a29a31323a
BLAKE2b-256 74e0d8e416d2674793469c1825924702041ec03c94b8f008da9a7ffd410d65ec

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