Skip to main content

Yandex.Cloud Functions toolkit

Project description

yalambda

Yalambda lets you write Yanex.Cloud Functions with less boilerplate

Features:

  • everything is type-annotated, so you'll get autocompletion in IDEs
  • base64 de/encoding and other details are handled for you
  • automatically parse JSON using dataclass-factory

Echo server example

from yalambda import function, YaRequest, YaResponse


@function()
async def handler(req: YaRequest) -> YaResponse:
    return YaResponse(200, req.body)

Automatically parse dataclasses

from dataclasses import dataclass
from yalambda import function, YaResponse


@dataclass
class Point:
    x: float
    y: float


@function()
async def handler(point: Point) -> YaResponse:
    dist = (point.x**2 + point.y**2)**0.5
    return YaResponse(200, {"distance_to_origin": dist})

Access both the dataclass and the request

from dataclasses import dataclass
from yalambda import function, YaRequest, YaResponse


@dataclass
class Point:
    x: float
    y: float


@function()
async def handler(point: Point, req: YaRequest) -> YaResponse:
    if req.http_method != "POST":
        return YaResponse(405, "Only POST requests are allowed")

    dist = (point.x**2 + point.y**2)**0.5
    return YaResponse(200, {"distance_to_origin": dist})

Initialize something asynchronously on first call

from yalambda import function, YaRequest, YaResponse


async def init():
    global answer
    answer = 42


@function(init)
async def handler(req: YaRequest) -> YaResponse:
    return YaResponse(200, "Answer: {}".format(answer))

Routing

from dataclasses import dataclass
from yalambda import dispatch, YaRequest, YaResponse


@dataclass
class Point:
    x: float
    y: float


async def get_all_points(req: YaRequest) -> YaResponse:
    points = [{"x": 3.0, "y": 4.0}, {"x": -1.0, "y": 3.27}]
    return YaResponse(200, points)


async def compute_distance(point: Point) -> YaResponse:
    dist = (point.x**2 + point.y**2)**0.5
    return YaResponse(200, {"distance_to_origin": dist})


handler = dispatch({
    "GET": get_all_points,
    "POST": compute_distance,
})

Full example

This function acts as a GitHub webhook and sends a pretty embed on Discord webhook when an issue is opened or closed. See the source code on GitHub.

Screenshot from Discord showing two embeds

Development server

You can install aiohttp and run your function locally. It's not the same as the real thing, but it should be enough for simple functions.

$ python -m yalambda your_module
======== Running on http://0.0.0.0:55710 ========
(Press CTRL+C to quit)

Condition DSL

We can modify our GitHub->Discord example so that it doesn't error out on the initial ping event:

from yalambda import when

...

async def handle_issue_events(event: IssueEvent) -> YaResponse:
    embed = create_embed(event)
    if embed is not None:
        await client.post(DISCORD_WEBHOOK, json={"embeds": [embed]})
    return YaResponse(200, "")


async def handle_ping(req: YaRequest) -> YaResponse:
    return YaResponse(200, "")


handler = when.dispatch(
    when.header_is("x-github-event", "ping", handle_ping),
    when.header_is("x-github-event", "issues", handle_issue_events),
    init=init
)

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

yalambda-0.6.0.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

yalambda-0.6.0-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

Details for the file yalambda-0.6.0.tar.gz.

File metadata

  • Download URL: yalambda-0.6.0.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.8 CPython/3.8.8 Linux/5.10.63-1-MANJARO

File hashes

Hashes for yalambda-0.6.0.tar.gz
Algorithm Hash digest
SHA256 f3c9bff6e5eb2a0d52bf1e8202b9f8f2d43ad87f2a61667604f603e502387eb9
MD5 804387f5255582292f6817352aee8154
BLAKE2b-256 f60cfb080651a2cdf033ecb05fa7366b53a0c4769a19ba28fb2b75df254f47d8

See more details on using hashes here.

File details

Details for the file yalambda-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: yalambda-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 8.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.8 CPython/3.8.8 Linux/5.10.63-1-MANJARO

File hashes

Hashes for yalambda-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 94c01b4d0e58cc8e7c41986f9b28c3dcf78fac5f41b0d79f4efb0692fb9cf5fc
MD5 5cb6447dc2e8f8a30d1b254a76844119
BLAKE2b-256 ae6c7654c4f099e8b1895ae3e3e209f80c0dc62bffce1e6f760679ee4e7b3498

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page