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

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.19-cp313-cp313-win32.whl (777.9 kB view details)

Uploaded CPython 3.13Windows x86

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

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.19-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.19-cp312-cp312-win_amd64.whl (886.9 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.19-cp312-cp312-win32.whl (780.0 kB view details)

Uploaded CPython 3.12Windows x86

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

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

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.19-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.19.tar.gz.

File metadata

  • Download URL: elaraai_east_py-1.0.19.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.19.tar.gz
Algorithm Hash digest
SHA256 6b1a5f5c19c812defe7e5c48b94949a69c07335b1eeeab6bcbe5c22a3d769d72
MD5 7e23dae917a9ccdae460be84cdc0cf1f
BLAKE2b-256 2cd957f847a0ea02805583b2618b9f02983f2a561de53dcc80978dec0b2c18bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 201e3561d9040d31fc425da9e8becf21fdd2ac360dfba50f3641d8efc6af7bbb
MD5 bdfba94633e99d04ddab2f80f8c75e34
BLAKE2b-256 e39a56ea389bf798a5f6b1d14d856142ed04a41345b2523231a33e2d5f7e46bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 954869354d6e4e5983150f7eba7aa6b1ae132516b4d7c0f7723d339dcf312ca3
MD5 d9aa291b2af8a9d0eab47882713d85d0
BLAKE2b-256 d64018a7d8a349f08ebb6fa6f5224f58a844c79c70979f8d138fb8b9738e6784

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.19-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.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 90d47900335d17064c172f1a055ccd2f57d2d1007aff6c01e942f346022eb2f1
MD5 b4429213547adcac9d1908d0bbb29d9d
BLAKE2b-256 445b21503ec61c763148f34765c4b3323b0523ff0693c34401d3d3a44fec4796

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 927e0fd5100f6dab248da29c2b789903b07c4d47b2f4c20a27d51e3c97e837b4
MD5 c6c78f04c6ebf4282355a4367a74c17a
BLAKE2b-256 1fd83d3aa6ba9f260af073c3037633b25dc9bd8ed464674ea09c0486d5a136c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2457112c4ddba3c89e2dae2a6d5b637cbe4526d731ed321c3b711ddf99969ac0
MD5 b42303ca6dcd8235c0b3948011ad67e1
BLAKE2b-256 e173855785ea3c0644c1ec4f10ea2a8eb8f20cd9f975ae956849a47be07470fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 62b1a2d32bfd764508691b56c375002d5b77324ccd149bcbfcc45818a483710f
MD5 36130d9d582e4c87755fa680a760926a
BLAKE2b-256 5d00d924ba68f597375227ac3421e89d7f629fc15cf69a2a81a92c79ea7abe80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 1ec1f342763bf42fab3f58993bc3eb89f567d17965d333f2c33da1b7b6fdb4f5
MD5 380f1e95ad86a89b7d0aed02e5457d76
BLAKE2b-256 40c43609f551c5bac138422dbd3ab7d9aa75b4225a45750beba778b54fdeeda5

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.19-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.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 74774e6a84c965a9e9d927afd7eae16cd83ed18434ac208b2b428ac802ffcef2
MD5 6d0b6d61925346a6beb15d1b2c0606bb
BLAKE2b-256 5bbc1b5c7e9b258c1b1b5f9033919d2f4597c28994e08652bcfa09f39fee72fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1f44edfeda2a8d8d4f8a8a1c6c35693075846e5386637e10bf75593798d62c85
MD5 f46e8d9eefec1217116963e63fc7274f
BLAKE2b-256 39a52333698585b88b3d3500acf0a09adc05d6c462d8596b37478a6b13d0e099

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 42ea0389d6d9ba2107ceaae5bd3ba3b09c83267dfe4a7a945c9c6da7fa71e6e5
MD5 3660cff301953a123c8be624552b6240
BLAKE2b-256 5bb56b7a43f51583db1b8da5dee131353b861abdaa05547b321d791f5b1a6b6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fa242a0a49ffb9dc0f6e71232345062e61fd648d16370a09490c56cfea66abb9
MD5 b1029056be7b5906e9cdc7de766457d6
BLAKE2b-256 dc655622d09d1a630e88acd18feb169727ae375b0cf02f878c2ba58ad86e0c09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 c2b08c51cb44b3f4dd7e31650371b7fffea2b319a0af7b2c1566b3aac37bf7e0
MD5 003a6e0405a46d787db2a52f2c8dbf47
BLAKE2b-256 3a3a0c0326be03f1cf7268ad13616fbf4869beb870805a6265567db8c455533b

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.19-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.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c1575fe7cd99b6b8325b3f8bf2ec264425d0a18e9ab1d7525851c7cc52e2b4c2
MD5 e99c201fa0cb64fd0fd5995724cb7b18
BLAKE2b-256 d90dcb5623e96b948e03bb2481a1ddbc606b1ecc9e4a5c49be7cd3a7624bd9ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 41f26a3270663fcddb747d7e0dc1112c5f47221fa9b078ebc781b6faea167e42
MD5 07345937ee6c02bbf9ab4d931a9ef955
BLAKE2b-256 7ed4b872c6588f0768c0193f5151f7310cac2d920036574e743483800f47ac87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.19-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 70a14fa8928d6f428137b3ffb089238acff6af93192381a95042d918d124c532
MD5 b1906a325f0c3d210c4393e4612fb3ab
BLAKE2b-256 6daa97e7a33ce014625a6ded6f2b8827e9f8b3dbe50b007dceadb070f6b32eca

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