Metadata-Version: 2.4
Name: spin-sdk
Version: 4.0.0rc1
Summary: Python SDK for Spin
Author: Spin Framework Contributors
Maintainer: Spin Framework Contributors
Project-URL: repository, https://github.com/spinframework/spin-python-sdk
Project-URL: documentation, https://spinframework.github.io/spin-python-sdk
Keywords: webassembly,wasm,component,spin
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# Spin Python SDK

This is an SDK for creating [Spin](https://github.com/spinframework/spin) apps using Python.

Note that this SDK supersedes an earlier, experimental version, which may be
found in the [old-sdk](https://github.com/spinframework/spin-python-sdk/tree/old-sdk)
branch.

## [API Documentation](https://spinframework.github.io/spin-python-sdk/v4/index.html)

## Example

### Prerequisites

- [Python 3.10 or later and pip](https://www.python.org/downloads/)
- [componentize-py](https://pypi.org/project/componentize-py/)
- [spin-sdk](https://pypi.org/project/spin-sdk/)
- [Spin](https://github.com/spinframework/spin) 4.0 or later.
- [MyPy](https://pypi.org/project/mypy/) -- This is optional, but useful for during development.

Once you have Python and pip installed, you can use the latter to create and
enter a virtual environment and then install the desired packages

```shell
python -m venv .venv
source .venv/bin/activate
pip install componentize-py==0.23.0 spin-sdk==4.0.0 mypy==1.8.0
```

### Hello, World

A minimal app requires two files: a `spin.toml` and a Python script, which we'll
name `app.py`:

```shell
cat >spin.toml <<EOF
spin_manifest_version = 2

[application]
name = "hello"
version = "0.1.0"
authors = ["Dev Eloper <dev@example.com>"]

[[trigger.http]]
route = "/..."
component = "hello"

[component.hello]
source = "app.wasm"
[component.hello.build]
command = "componentize-py -w spin:up/http-trigger@4.0.0 componentize app -o app.wasm"
EOF
```

```shell
cat >app.py <<EOF
from spin_sdk import http
from spin_sdk.http import Request, Response

class HttpHandler(http.Handler):
    async def handle_request(self, request: Request) -> Response:
        return Response(
            200,
            {"content-type": "text/plain"},
            bytes("Hello from Python!", "utf-8")
        )
EOF
```

Once you've created those files, you can check, build, and run your app:

```.py
python -m mypy app.py
spin build -u
```

Finally, you can test your app using e.g. `curl` in another terminal:

```shell
curl -i http://127.0.0.1:3000
```

If all goes well, you should see something like:

```
HTTP/1.1 200 OK
content-type: text/plain
content-length: 18
date: Thu, 11 Apr 2024 17:42:31 GMT

Hello from Python!
```

Please file an issue if you have any trouble.

See the [examples directory](https://github.com/spinframework/spin-python-sdk/tree/main/examples) in the repository for more examples.
