Metadata-Version: 2.4
Name: roberty-code
Version: 0.1.0
Summary: SDK oficial para Code Projects da Roberty: leia argumentos, escreva o resultado e descubra o gatilho da execução.
Project-URL: Homepage, https://github.com/robertyautomation/code-sdk/tree/main/packages/python#readme
Project-URL: Repository, https://github.com/robertyautomation/code-sdk
Project-URL: Issues, https://github.com/robertyautomation/code-sdk/issues
Project-URL: Documentation, https://github.com/robertyautomation/code/blob/main/roberty-code-project-guide.md
Author: Roberty Automation
License-Expression: MIT
License-File: LICENSE
Keywords: automation,code-project,roberty,rpa,sdk
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# roberty-code

SDK oficial para **Code Projects** da [Roberty](https://roberty.app) em Python. Leia argumentos, escreva o resultado e descubra o gatilho da execução sem lidar com variáveis de ambiente.

```bash
pip install roberty-code
```

Python ≥ 3.9. Sem dependências. Tipado.

## Uso

```python
from datetime import datetime, timezone
import roberty_code as roberty

print(f"Iniciando ({roberty.environment}, gatilho: {roberty.trigger})")

cpf = roberty.input("cpf")   # um argumento
args = roberty.inputs()      # todos os argumentos (ou None)

# ... lógica do robô ...

roberty.output({"status": "ok", "processedAt": datetime.now(timezone.utc).isoformat()})
```

Fora da Roberty o mesmo código roda: `inputs()` devolve `None`, `output()` avisa uma vez e devolve `False`.

## API

| Membro | Retorno | Descrição |
| --- | --- | --- |
| `roberty.trigger` | `str \| None` | `manual`, `schedule`, `webhook` ou `evaluation` |
| `roberty.environment` | `str \| None` | `production` ou `preview` |
| `roberty.is_roberty` | `bool` | `True` quando roda na Roberty |
| `roberty.inputs()` | `Any \| None` | Todos os argumentos (`webhook`/`evaluation`) |
| `roberty.input(name, default=None)` | `Any` | Um argumento específico |
| `roberty.output(value)` | `bool` | Grava o resultado (JSON) lido pela plataforma |
| `roberty.exception()` | `ExceptionDetails \| None` | `{"message", "stack", "exitCode"}` dentro do `exceptionHandler` |
| `roberty.run(handler, exit_on_complete=True)` | `Any` | **Opcional**: executa `handler(roberty)`, grava o retorno e encerra com exit code `0`/`1`. Aceita `async def` |
| `roberty.ENV_VARS` | `dict` | Nomes das variáveis `roberty-*` |

Erros: `RobertyArgsError` (arquivo de argumentos com JSON inválido) e `RobertyOutputError` (valor não serializável; converta `datetime` com `.isoformat()`).

### `exceptionHandler`

```python
# on_error.py — declarado em roberty.json como "exceptionHandler": "on_error.py"
import roberty_code as roberty

error = roberty.exception()
print(f"Robô falhou (exit code {error['exitCode']}): {error['message']}")
```

### Atalho `run`

```python
roberty.run(lambda r: {"status": "ok", "cpf": r.input("cpf")})
```

Encerra o processo ao terminar; passe `exit_on_complete=False` para embutir em testes.

## Documentação

[Guia de Code Projects](https://github.com/robertyautomation/code/blob/main/roberty-code-project-guide.md): contrato de execução, `roberty.json`, gatilhos e webhook.

## Licença

MIT. Copyright © Roberty Automation. Todos os direitos reservados.
