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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.12-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.12-cp311-cp311-win_amd64.whl (886.7 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.12-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.12.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.12.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.12.tar.gz
Algorithm Hash digest
SHA256 50bd9bec878badfb6e8ea0cb0cf8315410dd32ae9a6db6abb51b72a1ae7a1f7c
MD5 6837e0110f3165727e09b008a4918888
BLAKE2b-256 e626f62d81afff63feab7044c54b16540d86e793e78e249dcddbc0def88b30b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e17cc259fc021ff482b7c9a54e8e07555853fbd3ee2fa85e18780293e835c174
MD5 a8335e1e3471aa7c45ab36bee3862d0e
BLAKE2b-256 b4079b1b07c651e74ce02773f50d07e43dcc926e1e7849173942a2ca5e634dfe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 e5182a01f30e9e986c7f5acb56cd27ff4afba351c8769b6ca4b83cc359240d01
MD5 2082688c209658f85dbe400de9a23a55
BLAKE2b-256 fa8f0d2d681fd2d7c41d7849ba4221459105e04234f3995e4c7b5b5b88e4d046

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.12-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.12-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8521f767dffcd8bb7f27342ca8d6a5da2ad04bb325869a844927e2dbe6f66ea1
MD5 490a6be83aede0b47150d82ec297f8a9
BLAKE2b-256 c22a82baf5d1898219ec124bd621fa139e3739838261baf9644ee03c584d422a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a76150b0944cff52dcb6ecfb8ce1e3aa1718f97480baad9289cb05eaca736884
MD5 0f9513a11c71a58fe2644ce210fe4775
BLAKE2b-256 30847af2bb62fc5d180c42e82daf4d90db3483a41117789a9e0f992d82cba4e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 84727c7b853d8eb84d2522388b1153f866983c0f7c8cf743a53cc6a08e988ffb
MD5 c2be0163066be5b8756e4c83c36ed767
BLAKE2b-256 21e17a42587cd31f2b312820b4983f86b25f82c557f27e3b23b576009e446342

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 71f6b296155a4321c90e869654c3e472d957f483945eb9f7cf4c26f5032e3c56
MD5 12d3b4808f0662329026504499192c9f
BLAKE2b-256 05e5e44a43b5187f707ab0cac2fcb0fe77e1078604600a3102394f2c0a8f4ea6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 83b22f89895b43f5ed3c8830c84be2a4bd68921f7a293978625d5c79956222b2
MD5 5b48d85a2a4ba0352a0b09cbe5965fcd
BLAKE2b-256 8321dbefff829488a6c6b6b7097dcb6dc7895e55879e0fc3b34509042550d378

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.12-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.12-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4b0239c1a6c0b21dc48942690cad16cbd57f49ad9d1b033053027dc267249717
MD5 a4a7613bc86bfdf17710d2fd5981ef83
BLAKE2b-256 6e9c6cd5e902c0be6ba64c74c1e1bb09afe9b597d4bee0e7d52e97f47605677b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bfb7e9baea590bda7cd07392befa230b0098e2cbf10fc65e4ddaf4d587f9c152
MD5 e517858be150974cd4a37eec8b988837
BLAKE2b-256 da80edcfdef4f8542bb4bec0700a7a0448fb4d148b307c099a4ee25d95333995

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 06bfdf0943a41d1220a901959083b3844965749a441e551b9de78ae4a2788faf
MD5 bcf053dc3eca91576a8765602e3a7f07
BLAKE2b-256 4b81463c3b5a388d57205c8e586794460a9658b6ce8811ee7d39ad87548a7433

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 98385c4d13beeb81d29876a1788e0c77283751e9774072ef64888926926bd6ab
MD5 d4468853b328b732d82759c8945f6760
BLAKE2b-256 d6fc91ba6e69bc4dfca16fa82facf2665d2931b3547e9723758ac6f0a0b0cab8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 eef0c7896c74c944063a1796b36d884fd1efa65a6c079177ab5ac1d040e5c857
MD5 de1a9d6d417799bc4e895a52062f581e
BLAKE2b-256 c5cb094641748b853c874020feb4b84e35390334f0da706c52f04559aaeecbec

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.12-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.12-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d87bf714d34e31a78fd5011a77bcc1474e035dfb3163743dace911a94cb5c25c
MD5 c897c7a9ac5681c25628c624f4ab114f
BLAKE2b-256 c6e992d1bb2d664420969ebdf1f741d019f76de0c0a77e426ea4825b07ee816b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 27280ab9a1015b8533d275e02aaff24b0c233a14b162531d15a4d0a9d1731fea
MD5 f45b1ca1ba8d1a191e79b355ced8c049
BLAKE2b-256 bbd4bdb7107c5c0d12cd258cb40da148a39dc5a85d3750bad93b82d0ae5eee92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.12-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 357903fa3d0e30e428ac89733681c2b697e17cd1b90747060b4f6a6eff72c7f3
MD5 5d8af309b58f66f28f8592a234b0a7d4
BLAKE2b-256 23a3a9e958dc24f5f41fa7bd3cd21f3bb842fa372ef2c4809ac90d5718cdf310

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