State machine framework for BotCity automation bots
Project description
beapro-state-machine
BeaPro (BotCity Enterprise Automation Process) é uma biblioteca Python de automação baseada em máquina de estados para construir bots de processamento de dados com integração nativa à plataforma BotCity Maestro.
Fornece uma arquitetura declarativa com quatro estados padrão e um pipeline de tratamento de erros embutido, deixando ao desenvolvedor apenas a responsabilidade de implementar a lógica de negócio no estado PROCESS.
Instalação
pip install beapro-state-machine
Configuração de Credenciais
Chame beapro.configure() antes de instanciar ExecutionContext. Ela carrega as credenciais do Maestro a partir de um arquivo .env (por padrão) ou de parâmetros explícitos, sem sobrescrever variáveis já definidas no ambiente de processo.
import beapro
beapro.configure() # lê do .env sem sobrescrever vars já definidas no ambiente
from beapro import BeaproStateMachine, ExecutionContext, ContextProvider
Parâmetros de configure()
| Parâmetro | Padrão | Descrição |
|---|---|---|
server |
"" |
URL do servidor Maestro — sobrescreve DEFAULT_SERVER |
login |
"" |
UUID de login — sobrescreve DEFAULT_LOGIN |
key |
"" |
Chave de API — sobrescreve DEFAULT_KEY |
dotenv_path |
".env" |
Caminho do arquivo .env a carregar |
Para passar credenciais diretamente sem .env:
beapro.configure(
server="https://developers.botcity.dev",
login="<uuid>",
key="<chave>",
dotenv_path="", # desativa o carregamento do .env
)
Precedência (maior para menor): parâmetros explícitos → variáveis de ambiente → arquivo .env.
Variáveis de Ambiente
DEFAULT_SERVER='https://developers.botcity.dev'
DEFAULT_LOGIN='<uuid-do-login>'
DEFAULT_KEY='<chave-api>'
TASK_ID='<id-da-task>' # opcional — usado apenas em execução local sem runner
BEAPRO_LOG_DIR='/caminho' # opcional — diretório de logs (padrão: output/)
DEFAULT_SERVER, DEFAULT_LOGIN e DEFAULT_KEY são obrigatórios.
Fluxo de Estados
INIT → GET_DATA → PROCESS → END
↓ ↓ ↓
└──────→ ErrorHandler (retry → fallback → abort)
| Estado | Responsabilidade |
|---|---|
INIT |
Valida ambiente e prepara serviços |
GET_DATA |
Fornece o próximo item para processamento |
PROCESS |
Lógica de negócio — ponto de extensão principal |
END |
Reporta contagens ao Maestro e finaliza a task |
ErrorHandler |
Captura exceções, executa retries e envia alertas em fallback |
Modos de Operação
BeaproStateMachine suporta dois modos, definidos pelo parâmetro mode:
| Modo | mode= |
Fonte dos dados | Iteração |
|---|---|---|---|
| datapool (padrão) | "datapool" |
Itens do DataPool do Maestro | Loop até esgotar todos os itens |
| task | "task" |
Parâmetros da task atual | Processa uma única vez |
No modo task não é necessário definir datapool_label. Os parâmetros configurados na Automação do Maestro ficam disponíveis em context.item.data dentro do ProcessState, com o mesmo contrato do modo datapool.
Passar
get_data_stateexplicitamente tem prioridade sobremode.
Uso Básico
1. Implemente o estado PROCESS
from beapro.state_templates import ProcessState
class MeuProcessState(ProcessState):
def execute(self):
item = self.context.item
self.services.log(f"Processando: {item.data}")
# lógica de negócio aqui
return "SUCCESS"
Valores de retorno aceitos por execute():
| Retorno | Efeito |
|---|---|
"SUCCESS" |
Item marcado como sucesso no DataPool; avança para o próximo |
"BUSINESS_ERROR" |
Item marcado como erro de negócio; avança para o próximo |
| qualquer outro / exceção | Aciona pipeline de retry → fallback → abort |
2. Inicialize e execute — modo datapool
import beapro
beapro.configure()
from beapro import BeaproStateMachine, ExecutionContext, ContextProvider
context = ExecutionContext(datapool_label="meu-datapool")
ContextProvider.initialize(context)
try:
machine = BeaproStateMachine(process_state=MeuProcessState())
machine.activate_initial_state()
finally:
ContextProvider.reset()
3. Inicialize e execute — modo task
Ideal para bots acionados diretamente pelo Maestro com parâmetros configurados na Automação. Não requer DataPool.
import beapro
beapro.configure()
from beapro import BeaproStateMachine, ExecutionContext, ContextProvider
context = ExecutionContext()
ContextProvider.initialize(context)
try:
machine = BeaproStateMachine(mode="task", process_state=MeuProcessState())
machine.activate_initial_state()
finally:
ContextProvider.reset()
ContextProvider.reset() no bloco finally limpa o singleton ao final de cada execução.
Tratamento de Erros
Lance as exceções da lib para acionar comportamentos específicos do pipeline:
from beapro import BusinessException, SystemException, StopProcessException
from beapro.state_templates import ProcessState
class MeuProcessState(ProcessState):
def execute(self):
item = self.context.item
if not item.data.get("cpf"):
raise BusinessException("CPF ausente — item inválido")
if not self._conectar_erp():
raise SystemException("Timeout ao conectar ao ERP")
return "SUCCESS"
| Exceção | Efeito |
|---|---|
BusinessException |
Item marcado como erro de negócio; sem retry |
SystemException |
Aciona retry; em abort, reinicia a task automaticamente |
StopProcessException |
Parada controlada sem registrar erro |
InterruptRequested |
Interrupção via Maestro; relançada sem retry |
Pipeline completo:
- Exceção não tratada →
fail()→ErrorHandler.retry - Retries esgotados →
fallback→ log crítico + alerta enviado abort→ executaENDpara limpeza final
Logging
O logger escreve simultaneamente em três destinos:
- Console —
INFOe acima - Arquivo local —
output/<timestamp>.log(todos os níveis) - BotCity Maestro — via SDK (falha silenciosa se indisponível)
BEAPRO_LOG_DIR=/caminho/para/logs # padrão: output/
API Pública
import beapro
beapro.configure()
from beapro import (
BeaproStateMachine, # orquestrador principal
ExecutionContext, # estado compartilhado da execução
TransactionItem, # item de dados atual
ContextProvider, # singleton de contexto global
BusinessException,
SystemException,
StopProcessException,
InterruptRequested,
)
from beapro.state_templates import ProcessState # base para extensão
Estrutura da Biblioteca
beapro/
├── __init__.py # API pública + configure()
├── core/
│ ├── state_machine.py # BeaproStateMachine
│ ├── base_state.py # BaseState (abstrata)
│ ├── context_provider.py # ContextProvider (singleton)
│ ├── execution.py # ExecutionContext + TransactionItem
│ ├── container.py # ServicesContainer (DI)
│ ├── exceptions.py # Hierarquia de exceções
│ └── settings.py # Leitura de variáveis de ambiente
├── services/
│ ├── logger.py # MaestroLogger
│ ├── datapool.py # DataPool (lazy init)
│ ├── alert.py # Alert
│ └── screenshot.py # ScreenshotService
└── state_templates/
├── init.py # InitState
├── get_data.py # GetDataState (modo datapool)
├── get_task.py # GetTaskState (modo task)
├── process.py # ProcessState (ponto de extensão)
└── end.py # EndState
Dependências
| Pacote | Versão |
|---|---|
botcity-maestro-sdk |
==0.9.0 |
python-statemachine |
>=3.0.0,<4.0.0 |
python-dotenv |
>=1.0.0 |
mss |
>=9.0.0 |
Padrões de Design
| Padrão | Onde |
|---|---|
| Singleton | ContextProvider |
| Template Method | BaseState.execute() |
| Dependency Injection | ServicesContainer |
| Iterator | DataPool |
| Strategy | Estados concretos substituem comportamento padrão |
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file beapro_state_machine-0.1.3.tar.gz.
File metadata
- Download URL: beapro_state_machine-0.1.3.tar.gz
- Upload date:
- Size: 27.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c9c0f8a2500ff032125ea87989e7a6c46be6b4da3f7553854aedbf20f841611
|
|
| MD5 |
b3316c2c554208551ad833d279d2078b
|
|
| BLAKE2b-256 |
cda2b1f86210730662d91f2567bb9ea6dd91f93b1602dbc1b1df0784dae56dd5
|
File details
Details for the file beapro_state_machine-0.1.3-py3-none-any.whl.
File metadata
- Download URL: beapro_state_machine-0.1.3-py3-none-any.whl
- Upload date:
- Size: 28.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7b664af0e483fed15f4c7350ad1306fa7d137b00b956bf4cbd71802b1f8a545
|
|
| MD5 |
f48f8fc210ba53c564f006db214908ef
|
|
| BLAKE2b-256 |
e3781cf4dbb37d870b65f8868235282a82fdc598b2b398253526c76e3db0242f
|