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.28.tar.gz (425.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.28-cp313-cp313-win_amd64.whl (893.5 kB view details)

Uploaded CPython 3.13Windows x86-64

elaraai_east_py-1.0.28-cp313-cp313-win32.whl (782.9 kB view details)

Uploaded CPython 3.13Windows x86

elaraai_east_py-1.0.28-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.28-cp313-cp313-macosx_11_0_arm64.whl (850.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

elaraai_east_py-1.0.28-cp313-cp313-macosx_10_13_x86_64.whl (920.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

elaraai_east_py-1.0.28-cp312-cp312-win_amd64.whl (893.5 kB view details)

Uploaded CPython 3.12Windows x86-64

elaraai_east_py-1.0.28-cp312-cp312-win32.whl (785.4 kB view details)

Uploaded CPython 3.12Windows x86

elaraai_east_py-1.0.28-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.28-cp312-cp312-macosx_11_0_arm64.whl (854.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

elaraai_east_py-1.0.28-cp312-cp312-macosx_10_13_x86_64.whl (924.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

elaraai_east_py-1.0.28-cp311-cp311-win_amd64.whl (894.0 kB view details)

Uploaded CPython 3.11Windows x86-64

elaraai_east_py-1.0.28-cp311-cp311-win32.whl (786.3 kB view details)

Uploaded CPython 3.11Windows x86

elaraai_east_py-1.0.28-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.28-cp311-cp311-macosx_11_0_arm64.whl (864.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

elaraai_east_py-1.0.28-cp311-cp311-macosx_10_9_x86_64.whl (919.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: elaraai_east_py-1.0.28.tar.gz
  • Upload date:
  • Size: 425.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.28.tar.gz
Algorithm Hash digest
SHA256 3ba7979a20285d5345f8cbf7901dff17a443ab4b68ed465f1891de88cbf3edf1
MD5 fae7d9ba6c321f9a45ff06bff1358d0b
BLAKE2b-256 2cdb774fa82f5f24534ee3bbccb71d5c4aa773fb51401469f4cd469ca0b0718a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ac5f6d67650248b737e1b6a4e0c0c39e2fbb12a0ebd3a7d2b500f302ff77f8f9
MD5 f0f64fc0ac28b7eb8785558e8078055f
BLAKE2b-256 381b1f66cc1d8caaae5c96e91ac4327c36a527ebeefe0d97f6db6b438e58a0ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 40a0d3130307a6642db961ae030a033d65d83ed21158c1af1d5152c70845db65
MD5 a4dfd1df45c09455041942ebe3989192
BLAKE2b-256 b152ec2780214eaaf4c4a9a17711ce506048c0ff2179abe26e54687a888d0220

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.28-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.28-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d669659d2225c77cf88302b28a376cbbee9c21ccafdf85157d3fe255d73ca53d
MD5 f239017170f161750a05241f7cc90f9d
BLAKE2b-256 4d1be878fae64efb455b2794a3bc2745b762fb61f455e12a894cd9f241272192

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 26f26d55a520ea1240cc83beaacf871467575c3d881a0c2864b50446bc688e82
MD5 b01fdf1a04f178d1869ece75f1934f76
BLAKE2b-256 20fbd1b5b3b4c129ea0cfccfa4c77d237b493d7f10d826fcaf0916760e8fdcdd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 313288b7f5a73b43c6d87e49b07c52f19cf7cc5359037c23849c32a6ee764c6a
MD5 47281efe37e1b4de984986746ddcb236
BLAKE2b-256 95edd11cb5642d4414584601d911f7ddaf00bdbb020d884b70231b8ddd1a0a10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4b84e4f4f6c6f4e14e58209d3bda014b3958c78550da517def736fb944bb9afa
MD5 4563cf59e3fd01abe8056409456fc0c2
BLAKE2b-256 c96cf6101a57c551631b5d83d4a5b4ed962f8c2fc9cda15330d1ac08135cdae3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 f4556fbd269b66bc674793c04fcc8ca2dfe76b1635080b74475ca458c00b362d
MD5 ea0eef5e49eb7a72b12942dbce8e7433
BLAKE2b-256 ef193894252c71216124da514cdfafe4ee8aa445943e0a04cc84a6dcc0226697

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.28-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.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5e337cdd33509b0da9975984276735d37ff44fd1986b7f564ced0ec00b2be74a
MD5 f46ce2c77b1aa68bf5f02a8399b1d2c2
BLAKE2b-256 53ded084efcd398bff572b479c6977411cb79899659e86b20213e3c1b9781951

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3ff10334831748449656bfb37be43ed1ce0df60f7df8ae038a5fb4b0567a043c
MD5 fa2ad4098ccbf3d146275659809453a3
BLAKE2b-256 6bd34b45022208dd31695417c6cd15bbc46d153f826b05adc3d04e042da430e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 233468e0de98d798c4dd5863a4db156f24c64ae60ccfcdc24a8997ae352e0ac5
MD5 7b055b273c9cc76bf5d84188afe6ccbc
BLAKE2b-256 634f31ad31d443329d6de2dac9749bd9e7ba37806b06f6a0d34b38e6c055b615

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 def7eabb9d88f069733a99f6ab13932b0359f72d6ce5e28df7fc8743e6ff5afc
MD5 8a2a539fc572ab272a239efe398adff7
BLAKE2b-256 096532ce0078360dfb778bff514383b6dcc9b1299735bc1a783f2b7b5dccafc0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 6386ebdce36f5f8d1b3481268de356018cd08456df0f77561d17283f86663f9a
MD5 8e452c47f1b48b296612ea2748653466
BLAKE2b-256 555758ffb515a69221ac98ff1afe8ad81988ee04b89f7e510654a044fc6218ac

See more details on using hashes here.

File details

Details for the file elaraai_east_py-1.0.28-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.28-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f048c89f041f8945952cb3cc5bd76dcbf97a7a1a47955a20c81fb59a6d87cb33
MD5 53f4c0dfc57b9e25e9bf227dc4beff86
BLAKE2b-256 84d6c9c293173dd7445a16629175bfaddcac3c64e7f5d364445419b1d659785a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d50347f97902d2857755bd73ac33a342c21ece3daf4ba28acbabf63a1cf8d9af
MD5 e02a1f105bcee83a4e7cff6ce2226b61
BLAKE2b-256 318703287dec7e636dd1a295ff8a4a780340f1d24a681ff432f8504135ceacd0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for elaraai_east_py-1.0.28-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a9a049dac6d1b2cd6a21dcafabe3a3c63c0e2185ba0c52ba97579eb9745b9af1
MD5 b4ded2bc89fafd9279efee8d6ed64102
BLAKE2b-256 b009e552caf3fe0d36ebd0d2c3851ab78916f83905bf023192f8de415ed6eaf7

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