Proyecto básico para aprender POO en Python construyendo un CRUD de contactos en memoria con una interfaz de terminal.
Tu misión: implementar las clases y métodos marcados con
TODOhasta que pasen todas las pruebas.
- Diseño de clases y objetos
- Encapsulación con
@propertyy validaciones simples - Abstracción con una interfaz
ContactRepository(ABC) - Composición / Inversión de dependencias:
ContactServiceusa el repositorio - Dunder methods:
__repr__,__eq__ - Manejo de excepciones básicas
- Pruebas con
pytest(TDD-friendly)
starter/
├─ src/
│ └─ contacts/
│ ├─ __init__.py
│ ├─ contact.py # Entidad Contact con validaciones
│ ├─ exceptions.py # Errores del dominio
│ ├─ repository.py # ABC + InMemoryContactRepository
│ ├─ service.py # ContactService (usa el repo)
│ └─ cli.py # CLI simple (create/list/update/delete/search)
├─ tests/
│ ├─ test_contact.py
│ └─ test_service.py
├─ pyproject.toml
├─ requirements.txt
├─ .editorconfig
└─ .gitignore
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pytestAl inicio fallarán. Ve completando los TODO hasta que todo quede verde ✅.
-
Contact:- Campos:
id: int,name: str,email: str,phone: str | None = None - Validaciones:
nameno vacío;emaildebe contener@ @propertyparanamecon setter que valida no vacío__repr__legible;__eq__porid
- Campos:
-
ContactRepository(ABC) +InMemoryContactRepository:- Métodos:
add,get,list_all,update,delete,search_by_name - Implementación en memoria usando
dict[int, Contact]
- Métodos:
-
ContactService:- Usa un repositorio inyectado por constructor
- Reglas:
create_contact(name, email, phone)valida y delega a repoupdate_contact(id, ...)valida y delegadelete_contact(id)delega; error si no existesearch(query)delega a repo
-
cli.py(opcional pero recomendado):- Menú simple con
input()para crear, listar, actualizar, borrar, buscar y salir - Puede usar
ContactServicecomo dependencia
- Menú simple con
pytesten verde- Código claro y legible
- CLI funcional para un flujo básico