Metadata-Version: 2.4
Name: sinusoidal
Version: 1.0.0
Summary: An SDK to use the Sinusoidal framework
Author-email: Maximilian Algehed <maximilian.algehed@sinusoidalsystems.com>, Ulf Norell <ulf.norell@sinusoidalsystems.com>
Project-URL: Homepage, https://github.com/sinusoidalsystems/sinusoidal-framework
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: protobuf>=4.21
Provides-Extra: dev
Requires-Dist: mypy; extra == "dev"
Requires-Dist: mypy-protobuf; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: pytest; extra == "dev"
Requires-Dist: hypothesis>=6; extra == "dev"

# Sinusoidal Python SDK

This SDK mirrors the structure of the Rust SDK (`sdks/rust/sinusoidal`).

Apps are built by subclassing `App` and running through `Sinusoidal`:

```python
from dataclasses import dataclass
from sinusoidal.sinusoidal import App, Connection, InputStream, OutStream, Sinusoidal
from sinusoidal.streaming_api_pb2 import Datagram


@dataclass
class MySettings:
    input_stream: InputStream


class MyApp(App):
    def __init__(self, settings: MySettings) -> None:
        self.settings = settings
        self.out: OutStream | None = None

    def handle_connect(self, connection: Connection) -> None:
        connection.connect_to_stream(self.settings.input_stream)
        self.out = connection.register_out_stream("output")

    def handle_packet(
        self, connection: Connection, stream_id: str, d: Datagram
    ) -> None:
        assert self.out is not None
        self.out.send(d)


def main() -> None:
    Sinusoidal(MyApp).run()
```

## Structure

| Module | Purpose |
|--------|---------|
| `sinusoidal.sinusoidal` | Core SDK: `App`, `Connection`, `OutStream`, `Sinusoidal`, `InputStream`, `OutputStream` |
| `sinusoidal.goose` | GOOSE packet types: `GooseEvent`, `GooseBool`, etc. |

## Building

```bash
make setup   # install dev dependencies
make proto   # generate protobuf code
make test    # run tests
make release # typecheck + test + build wheel
```
