Skip to main content

ODM para Firestore utilizando Pydantic y operaciones asíncronas

Project description

Firestore Pydantic ODM es una librería para interactuar con Google Cloud Firestore de forma sencilla y eficiente. Utiliza Pydantic para la validación y serialización de datos y ofrece soporte para operaciones asíncronas, batch writes, transacciones, paginación, proyecciones y más.

Esta librería está diseñada para facilitar el desarrollo de aplicaciones que requieren almacenar y consultar datos en Firestore, ofreciendo una interfaz Pythonic y desacoplada que permite cambiar fácilmente el cliente (por ejemplo, para usar emuladores o mocks en testing).

Características

  • CRUD Asíncrono: Soporte completo para crear, leer, actualizar y eliminar documentos de Firestore usando async/await.

  • Validación con Pydantic: Define tus modelos de datos con validación automática, asegurando la integridad de la información.

  • Consultas Avanzadas: Realiza búsquedas con filtros, proyecciones (seleccionar solo ciertos campos) y ordenación.

  • Batch Operations y Transacciones: Agrupa múltiples operaciones de escritura y ejecuta transacciones de forma atómica para mayor eficiencia y coherencia.

  • Soporte para Emulador y Testing: Configura de forma sencilla el uso del emulador de Firestore o integra mocks para pruebas unitarias.

  • Fácil Integración: Se integra sin problemas en cualquier proyecto Python.

Instalación

Desde el Código Fuente

  1. Clona el repositorio:

    git clone https://github.com/santosdevco/firestore-pydantic-odm
    cd firestore_pydantic_odm
  2. Instala las dependencias y el paquete en modo editable:

    pip install -e .

Dependencias

Revisa el archivo requirements.txt para conocer las dependencias necesarias, entre las que se incluyen: - pydantic - google-cloud-firestore>=2.0.0 - pytest y pytest-asyncio (para testing)

Estructura del Proyecto

La organización recomendada es la siguiente:

firestore_pydantic_odm/
    __init__.py         # Exposición de la API pública
    firestore_model.py  # Lógica principal del ODM
    firestore_fields.py # Descriptores y manejo de filtros
    enums.py            # Enumeraciones (e.g., BatchOperation)
    firestore_client.py # Inicialización y gestión del cliente Firestore
tests/
    conftest.py         # Fixtures para pruebas
    tests.py            # Pruebas unitarias
Dockerfile              # Configuración Docker
docker-compose.yaml     # Configuración Docker Compose
requirements.txt        # Dependencias del proyecto
pytest.ini              # Configuración global de Pytest
setup.py                # Script de instalación del paquete

Nota: El archivo __init__.py es fundamental para que Python reconozca el directorio firestore_pydantic_odm como un paquete. En él se exportan las clases y funciones principales de la librería.

Uso Básico

Definir un Modelo

Crea tus modelos extendiendo la clase base BaseFirestoreModel:

from firestore_pydantic_odm import BaseFirestoreModel

class User(BaseFirestoreModel):
    class Settings:
        name = "users"  # Nombre de la colección en Firestore

    name: str
    email: str

Inicializar el Cliente de Firestore

Antes de utilizar los modelos, inicializa la conexión:

from firestore_pydantic_odm import FirestoreDB, BaseFirestoreModel

# Inicializa el cliente, pudiendo especificar el host del emulador si es necesario
db = FirestoreDB(project_id="tu-proyecto", emulator_host="localhost:8080")

# Inyecta el cliente en la clase base para que todos los modelos lo utilicen
BaseFirestoreModel.initialize_db(db)

Operaciones CRUD

Crear y Guardar un Documento

user = User(name="Alice", email="alice@example.com")
await user.save()

Actualizar un Documento

user.email = "nueva_alice@example.com"
await user.update()

Eliminar un Documento

await user.delete()

Obtener un Documento por ID

user = await User.get("id_del_documento")

Consultas

Buscar Documentos

Realiza búsquedas utilizando filtros:

async for user in User.find(filters=[User.name == "Alice"]):
    print(user)

Buscar un Único Documento

user = await User.find_one(filters=[User.email ==  "alice@example.com"])

Usar Proyecciones

Si solo necesitas ciertos campos, puedes usar un modelo de proyección:

from pydantic import BaseModel

class UserProjection(BaseModel):
    name: str

async for user in User.find(filters=[User.name ==  "Alice"], projection=UserProjection):
    print(user)

Batch Operations y Transacciones

Operaciones en Batch

from firestore_pydantic_odm import BatchOperation

ops = [
    (BatchOperation.CREATE, User(name="Bob", email="bob@example.com")),
    (BatchOperation.UPDATE, user),
    (BatchOperation.DELETE, another_user)
]

await User.batch_write(ops)

Testing

El proyecto incluye pruebas unitarias con pytest y pytest-asyncio.
Para ejecutar los tests, simplemente corre:
pytest

El archivo pytest.ini y conftest.py (ubicado en la raíz o en el directorio tests/) proporcionan la configuración y las fixtures necesarias.

Contribuir

¡Contribuciones son bienvenidas! Si deseas aportar mejoras:

  1. Haz un fork del repositorio.

  2. Crea una rama para tu feature o corrección.

  3. Realiza tus cambios y asegúrate de que todos los tests pasen.

  4. Envía un Pull Request describiendo tus mejoras.

Licencia

Distribuido bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.

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

firestore_pydantic_odm-0.1.3.tar.gz (11.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

firestore_pydantic_odm-0.1.3-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file firestore_pydantic_odm-0.1.3.tar.gz.

File metadata

  • Download URL: firestore_pydantic_odm-0.1.3.tar.gz
  • Upload date:
  • Size: 11.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.11

File hashes

Hashes for firestore_pydantic_odm-0.1.3.tar.gz
Algorithm Hash digest
SHA256 22487a84a870a884b2302113ccf8a19c8fe3812db8778f62d9a6ffa628648def
MD5 194f456749c109ff5bbd5bef60d94628
BLAKE2b-256 dfec522c82f8f7f8fcd1593692cca704e94687a7a7d79b5fa1314738334e952b

See more details on using hashes here.

File details

Details for the file firestore_pydantic_odm-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for firestore_pydantic_odm-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4b7d8267238cf6bfdbb2ecb887c7e1026a016636032172766366b3b1805788ff
MD5 3cc724ee7b5aefa8b3fe596d4ea310e3
BLAKE2b-256 ea5cb9ed1a907329fad5eaefdf5be3c2dc2bdbaf41fe4d0ff4bdc36942122b6f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page