🚀 Introduzione
Zen Generator è un tool open-source progettato per semplificare la generazione di codice Python a partire da specifiche AsyncAPI e per ottenere specifiche AsyncAPI da codice Python esistente. Il suo obiettivo è automatizzare la creazione di componenti per architetture a microservizi basate su messaggistica, riducendo il lavoro manuale e garantendo coerenza tra implementazione e documentazione.
📌 Cos’è AsyncAPI?
AsyncAPI è una specifica open-source pensata per definire e documentare API asincrone, analogamente a quanto fa OpenAPI per le API REST.
Viene utilizzata per descrivere il comportamento di sistemi che comunicano tramite eventi e messaggi, come quelli basati su RabbitMQ, Kafka, MQTT e NATS.
Un documento AsyncAPI è scritto in YAML o JSON e contiene informazioni su:
✅ Canali di comunicazione
✅ Messaggi trasmessi
✅ Schemi di dati
✅ Protocolli supportati
Esempio di una specifica AsyncAPI:
asyncapi: 3.0.0
info:
title: Account Service
version: 1.0.0
description: This service is in charge of processing user signups :rocket:
channels:
userSignedup:
address: 'user/signedup'
messages:
userSignedupMessage:
$ref: '#/components/messages/UserSignedUp'
operations:
processUserSignups:
action: 'receive'
channel:
$ref: '#/channels/userSignedup'
components:
messages:
UserSignedUp:
payload:
type: object
properties:
displayName:
type: string
description: Name of the user
email:
type: string
format: email
description: Email of the user
✨ Funzionalità principali
Zen Generator fornisce diverse funzionalità chiave:
🐍 Generazione di codice Python da AsyncAPI: crea automaticamente il codice per produttori e consumatori di messaggi.
🐍 Supporto per Python con type hints: il codice generato utilizza Python tipizzato per una maggiore leggibilità e manutenibilità.
⚡ Generazione di API FastAPI: è possibile generare direttamente applicazioni FastAPI compatibili con AsyncAPI.
🔍 Estrazione di AsyncAPI dal codice: analizza il codice Python e genera la specifica AsyncAPI corrispondente.
📡 Architettura modulare ed estensibile: è possibile personalizzare il processo di generazione per adattarlo a esigenze specifiche.
📦 Installazione
Zen Generator è disponibile come pacchetto Python e può essere installato con:
con uv:
uv tool install zen-generator
con pipx:
pipx install zen-generator
con uvx:
uvx zen-generator
🖥️ Esempi d’uso
🎯 Generare codice da un file AsyncAPI
Per generare codice Python a partire da una specifica AsyncAPI in formato YAML o JSON:
# Generare implementazione FastAPI da specifica AsyncAPI
uvx zen-generator fastapi
# Generare implementazione Python con type hints da specifica AsyncAPI
uvx zen-generator pure-python
# Generare specifica AsyncAPI dal codice Python
uvx zen-generator asyncapi-documentation
Implementazione Python con type hints
# models.py
from __future__ import annotations
from typing import TypedDict
class UserModel(TypedDict):
id: int
name: str
email: str | None = None
#functions.py
from __future__ import annotations
from .models import UserModel
def get_user(user_id: int) -> UserModel:
...
Implementazione FastAPI
# models.py
from __future__ annotations
from pydantic import BaseModel
class UserModel(BaseModel):
id: int
name: str
email: str | None = None
# functions.py
from __future__ nnotations
from fastapi import FastAPI
from .models import UserModel
app = FastAPI()
@app.get("/users/{user_id}")
async def get_user(user_id: int) -> UserModel:
...
Generare specifica AsyncAPI dal codice Python
# asyncapi.yaml
asyncapi: 3.0.0
info:
title: Zen
version: 0.0.1
description: ''
channels:
get_user:
$ref: '#/components/channels/get_user'
operations:
get_user:
$ref: '#/components/operations/get_user'
components:
channels:
get_user:
messages:
request:
$ref: '#/components/messages/get_user_request'
response:
$ref: '#/components/messages/get_user_response'
operations:
get_user:
action: receive
description: ''
channel:
$ref: '#/channels/get_user'
messages:
- $ref: '#/channels/get_user/messages/request'
reply:
channel:
$ref: '#/channels/get_user'
messages:
- $ref: '#/channels/get_user/messages/response'
messages:
get_user_request:
title: Request params for get_user
summary: ''
description: ''
payload:
type: object
required:
- user_id
properties:
user_id:
type: integer
description: ''
get_user_response:
title: Response params for get_user
summary: ''
description: ''
payload:
$ref: '#/components/schemas/UserModel'
format: required
schemas:
UserModel:
type: object
base_class: BaseModel
required:
- id
- name
properties:
id:
type: integer
name:
type: string
email:
type: string
❌ Cosa è attualmente supportato e non?
Attualmente, sono supportate solo le definizioni di modelli e funzioni nel blocco components
del file AsyncAPI.
Le definizioni inline non sono supportate.
⚙️ Il parametro required
Zen Generator introduce il parametro required
, che consente di specificare esplicitamente i campi obbligatori in una definizione AsyncAPI.
Esempio:
components:
messages:
get_user_request:
title: Request params for get_user
summary: ''
description: ''
payload:
type: object
required:
- user_id
properties:
user_id:
type: integer
description: ''
schemas:
UserModel:
type: object
base_class: BaseModel
required:
- user_id
- name
properties:
id:
type: integer
name:
type: string
email:
type: string
📌 Questa configurazione assicura che il campo user_id
e name
vengano considerato obbligatorio nel codice generato.
📢 Conclusione
Zen Generator semplifica lo sviluppo e la documentazione di microservizi basati su messaggistica, garantendo coerenza tra implementazione e specifiche AsyncAPI.
✨ Supporto per Python con type hints e FastAPI.
✨ Generazione ed estrazione di AsyncAPI.
✨ Estensibilità e personalizzazione.
📌 Il progetto è open-source e disponibile su GitHub: WaYdotNET/zen-generator. Feedback e contributi sono benvenuti! 🚀
📬 Vuoi rimanere aggiornato?
Seguimi su GitHub e resta aggiornato sulle future evoluzioni del progetto!