Skip to content

Commit 132f5c3

Browse files
author
Esteban Echeverry
committed
Merge branch 'feat/06_main'
2 parents 8d84ce6 + a362205 commit 132f5c3

25 files changed

+240
-69
lines changed

docs/_static/.gitinclude

Whitespace-only changes.

docs/fundamentos/index.rst

Lines changed: 78 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,102 @@ mantener en el tiempo.
1010
SOLID
1111
*****
1212

13-
- S-ingle Responsability Principle
13+
- **S-ingle Responsability Principle**
1414

15-
Cada componente del sistema debería tener una única reponsabilidad.
15+
*Un módulo debería tener una, y sólo una, razón para cambiar*
1616

17-
- O-pen/Closed Principle
17+
*Un módulo debería ser responsabilidad de un sólo actor*
1818

19-
Abierto para extensión, cerrado para modificación.
19+
.. todo::
20+
Ejemplo de clase "Empleado" con métodos calculatePay (CFO),
21+
reportHours (COO) y save (CTO)
2022

21-
- L-iskov Substitution Principle
2223

23-
- I-nterface Segregation Principle
24+
- **O-pen/Closed Principle**
2425

25-
- D-ependency Inversion Principle
26+
*Un artefacto de software debería estar abierto para su extensión
27+
pero cerrado para su modificación*
28+
29+
.. todo::
30+
Esto impacta como estructuramos los componentes de nuestras aplicaciones,
31+
para dirigir las *dependencias* eficientemente. Se trata sobre todo de
32+
evitar ciclos de dependencias y de proteger aquellos componentes que cambian
33+
con menos frecuencia y son más abstractos (i.e. son de más alto *nivel*).
34+
35+
- **L-iskov Substitution Principle**
36+
37+
*Lo que se quiere aquí es algo como la siguiente propiedad de substitución:
38+
Si para cada objeto *o1* de tipo *S* hay un objeto *o2* de tipo *T*, tal que
39+
para todos los programas *P* definidos en términos de *T*, el comportamiento
40+
de *P* no se modifica cuando *o1* es substituido por *o2* entonces *S* es
41+
un subtipo de *T*.
42+
43+
*Barbara Liskov, 1988*
44+
45+
.. todo::
46+
Este principio podría ser la definición formal de lo que conocemos como
47+
*duck-typing*. Seguir este principio, nos permite crear aplicaciones que
48+
sean extensibles a través de *plugins*.
49+
50+
51+
- **I-nterface Segregation Principle**
52+
53+
*Es perjudicial depender de módulos que contienen más de lo que se necesita*
54+
55+
*Varias interfaces específicas por cliente son mejores que una sóla interfaz
56+
de propósito general*
57+
58+
.. graphviz:: media/interface-segregation.dot
59+
60+
.. todo::
61+
No es tan crítico en Python al ser un lenguaje dinámico dónde un cambio en
62+
las dependencias no implica recompilación.
63+
64+
- **D-ependency Inversion Principle**
65+
66+
*Los sistemas más flexibles son aquellos en los que las dependencias de
67+
código se refieren a abstracciones y no a concreciones*
68+
69+
.. graphviz:: media/dependency-inversion-1.dot
70+
.. graphviz::
71+
72+
digraph foo {
73+
"VS";
74+
}
75+
.. graphviz:: media/dependency-inversion-2.dot
76+
77+
.. todo::
78+
Se debe tener cuidado con la *volatilidad* de componentes *concretos* y no
79+
depender de ellos.
2680

2781
Tipos de Programación
2882
*********************
2983

30-
- Programación Estructurada
84+
- **Programación Estructurada**
85+
86+
*Impone disciplina en la transferencia directa de control*
87+
88+
*Resuelve el problema de los 'GOTO' mediante la iteración y selección*
3189

32-
Secuencia y selección e iteración. (def, if, while, for)
90+
- **Programación Orientada a Objetos**
3391

34-
- Programación Orientada a Objetos
92+
*Impone disciplina en la la transferencia indirecta de control*
3593

36-
Clases, Objetos, Herencia.
94+
*Resuelve el problema de los punteros a funciones mediante clases y objetos*
3795

38-
- Programación Funcional
96+
- **Programación Funcional**
3997

40-
Funciones. No se persiste el estado.
98+
*Impone disciplina en la asignación*
99+
100+
*Resuelve problemas de condiciones de carrera mediante la inmutabilidad*
41101

42102
Modelado del Dominio
43103
********************
44104

45105
El núcleo de una aplicación es el dominio que tiene como propósito modelar.
46106
Este dominio se representa a través de lo que llamamos, la lógica de negocio.
107+
108+
.. image:: media/bounded-context.png
109+
:width: 400px
110+
:height: 300px
111+
27.3 KB
Loading
114 KB
Loading
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
digraph foo {
2+
"Presentation" -> "Business Logic";
3+
"Business Logic" -> "Data";
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
digraph foo {
2+
"Presentation" -> "Business Logic";
3+
"Data" -> "Business Logic";
4+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
digraph foo {
2+
"User1" -> "OPS\n+op1 +op2 +op3";
3+
"User2" -> "OPS\n+op1 +op2 +op3";
4+
"User3" -> "OPS\n+op1 +op2 +op3";
5+
}

docs/implementacion/index.rst

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,60 @@
11
Implementación
22
##############
33

4+
.. image:: media/clean-graph.jpg
5+
:height: 400px
46

57
!Arquitectura que Grita!
68
************************
79

810
El propósito de nuestras aplicaciones debe hacerse notar de primera mano.
911

12+
.. image:: media/file-tree.png
13+
:height: 400px
14+
:width: 300px
15+
1016
La Regla de las Dependencias
1117
****************************
1218

1319
Las dependencias de una aplicación deben dirigirse en la vía de mayor
1420
abstracción.
1521

22+
.. graphviz:: media/three-layers.dot
23+
1624
Capas y Fronteras
1725
*****************
1826

1927
Los componentes de una aplicación se comunican entre sí a través de fronteras
2028
bien definidas.
2129

30+
.. image:: media/ports-adapters.png
31+
:height: 250px
32+
2233
Los Detalles
2334
************
2435

2536
Las consideraciones de infraestructura son sólo *detalles* del sistema.
2637
La base de datos, el framework web, las librerías de consola, son sólo
2738
herramientas de nuestras aplicaciones y no su esencia.
2839

29-
```
30-
For the framework author, coupling to his or her own framework is not a risk...
3140

32-
The author wants you to couple to the framework, because once coupled in this
33-
way, it is very hard to break away.
34-
```
41+
*"For the framework author, coupling to his or her own framework
42+
is not a risk..."*
43+
44+
*"The author wants you to couple to the framework, because once
45+
coupled in this way, it is very hard to break away."*
46+
47+
*Uncle Bob*
48+
3549

3650
El Componente Principal
3751
***********************
3852

3953
El más sucio de los componentes. Es el encargado de instanciar el arbol de
4054
dependencias para crear la aplicación final.
4155

56+
.. graphviz:: media/main.dot
57+
4258
Las Pruebas
4359
***********
4460

@@ -47,5 +63,6 @@ pesar de que no pueden asegurar que nuestras aplicaciones son correctas, si
4763
pueden informarnos que *no son incorrectas* y prevenir regresiones durante el
4864
desarrollo.
4965

50-
.. todo::
51-
agregar imagen de un escalador con su arnés
66+
.. image:: media/climb.jpg
67+
:width: 100%
68+
:height: 250px
105 KB
Loading

docs/implementacion/media/climb.jpg

95.8 KB
Loading
5.23 KB
Loading

docs/implementacion/media/main.dot

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
digraph foo {
2+
"Presentation" -> "Business Logic";
3+
"Data" -> "Business Logic";
4+
"Main" -> "Presentation";
5+
"Main" -> "Business Logic";
6+
"Main" -> "Data";
7+
8+
}
45.8 KB
Loading
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
digraph foo {
2+
"Presentation" -> "Business Logic";
3+
"Data" -> "Business Logic";
4+
}

docs/index.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ Clean Architecture con Python
88

99
.. toctree::
1010
:maxdepth: 2
11-
:caption: Contenido:
1211

1312
introduccion/index.rst
1413
fundamentos/index.rst

docs/introduccion/index.rst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ Clean Architecture o arquitectura limpia, es un compendio de principios y
55
patrones de desarrollo que tienen como objetivo el facilitar el proceso de
66
construcción del software, así como su mantenimiento.
77

8-
.. todo::
9-
Agregar imágen introductoria
10-
11-
Entre sus principales beneficios podemos encontrar:
8+
.. image:: media/galaxy.jpg
9+
:height: 300px
10+
:width: 100%
1211

1312
Beneficios
1413
**********
@@ -24,5 +23,6 @@ Usos
2423

2524
- Aplicaciones de negocios proyectadas para estar en operación indefinidamente.
2625
- Sistemas distribuidos que se beneficien de un diseño desacoplado (e.g. usando
27-
microservicios).
28-
- Infraestructuras heterogeneas a nivel de bases de datos, servicios web, etc.
26+
microservicios).
27+
- Infraestructuras heterogeneas a nivel de bases de datos, servicios web, etc.
28+
- Aplicaciones pensadas para ser extendidas por terceros a través de plugins.

docs/introduccion/media/galaxy.jpg

218 KB
Loading

docs/proyecto/descripcion.rst

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,37 @@
11
Descripción
22
***********
33

4-
5-
- **Tarea** (task): Unidad básica de gestión del trabajo cuyos atributos serán:
6-
- UID (uid: str)
7-
- Nombre (name: str)
8-
- Fecha Límite (due_date: datetime)
9-
- Prioridad (priority: int)
10-
- ID Proyecto (project_id: str)
11-
- ID Etapa (stage_id: str)
12-
- Comentarios (comments: str)
13-
14-
- **Proyecto** (project): Contenedor de tareas con un mismo propósito cuyos atributos serán:
15-
- UID (uid: str)
16-
- Nombre (name: str)
17-
- Etapas (stage_ids: List[str])
18-
- Comentarios (comments: str)
19-
20-
- **Etapa** (stage): Estado en el que puede estar cada tarea. Un proyecto tiene múltiples etapas. Sus atributos son:
21-
- UID (uid: str)
22-
- Nombre (name: str)
23-
- Cierre (closure: bool)
4+
Realizaremos una aplicación para gestionar nuestras tareas por realizar.
5+
En general, la estructura de la aplicación estará compuesta por:
6+
7+
`Taskit Repo <https://github.com/nubark/clean-architecture-python.git>`_
8+
9+
| - **Tarea** (task): Unidad básica de gestión del trabajo cuyos atributos serán:
10+
| UID (uid: str)
11+
| Nombre (name: str)
12+
| Fecha Límite (due_date: datetime)
13+
| Prioridad (priority: int)
14+
| ID Proyecto (project_id: str)
15+
| Etapa (stage: str)
16+
| Comentarios (comments: str)
17+
18+
| - **Proyecto** (project): Contenedor de tareas con un mismo propósito cuyos
19+
atributos serán:
20+
| UID (uid: str)
21+
| Nombre (name: str)
22+
| Comentarios (comments: str)
2423
2524
La aplicación nos permitirá:
2625

27-
- Crear, leer, modificar y eliminar nuevas tareas, proyectos y etapas.
26+
- Crear, leer, modificar y eliminar nuevas tareas y proyectos.
2827
- Asignar tareas a proyectos específicos.
29-
- Definir la prioridad y fecha límite de cada tarea.
30-
- Mover las tareas por las distintas etapas del proyecto hasta el estado de cierre.
31-
32-
Igualmente, implementaremos algunas restricciones:
33-
34-
- Un proyecto sólo podrá tener una etapa de cierre.
35-
- No se podrán eliminar tareas en estado de cierre.
36-
- Habrá un proyecto, entre todos, que se usará por defecto cuando no se especifique alguno en las tareas.
28+
- Mover las tareas por las distintas etapas del proyecto hasta el
29+
estado de cierre.
3730

38-
Finalmente, obtendremos información valiosa para analizar detalladamente nuestro trabajo pudiendo:
31+
Obtendremos información valiosa para analizar detalladamente
32+
nuestro trabajo pudiendo:
3933

40-
- Reportar las tareas con fecha límite igual o inferior al día actual, los próximos 7 días, etc.
41-
- Reportar las tareas que se encuentran en un mismo proyecto.
42-
- Reportar las tareas que se encuentran en una misma etapa (a través de todos los proyectos).
34+
- Reportar todas las tareas registradas.
35+
- Reportar todos los proyectos registrados.
36+
- Reportar todas las tareas pertenecientes a un mismo proyecto.
37+
- Reportar todas las tareas con la misma etapa.

docs/proyecto/ejecución.rst

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Ejecución
2+
*********
3+
4+
El repositorio contiene 6 ramas de desarrollo incremental:
5+
6+
- feat/01_models
7+
- feat/02_repositories
8+
- feat/03_coordinators
9+
- feat/04_infrastructure
10+
- feat/05_reports
11+
- feat/06_main
12+
13+
Cada una de ellas construye una capa o componente de la aplicación. En el
14+
proceso de recrear esta construcción, usaremos un enfoque de desarrollo
15+
guiado por pruebas (i.e. *TDD*). Esto asegurará que los componentes que
16+
diseñemos, se encuentren desacoplados desde el inicio y sean fáciles de
17+
extender.
18+
19+
Todos iniciarán en la rama *feat/docs* la cuál no contiene código. En el
20+
proyector se presentará el *estado* o rama objetivo. En la primera iteración
21+
esta rama será la *feat/01_models*. En la segunda iteración, cuando hayamos
22+
alcanzado el estado de la rama *feat/01_models*, la rama objetivo será la
23+
*feat/02_repositories*. Así lo haremos sucesivamente hasta completar la
24+
aplicación.
25+
26+
Dedicaremos un tiempo máximo de 15 minutos a cada fase. Si al completarse los
27+
15 minutos no se ha terminado la totalidad de la funcionalidad requerida,
28+
lamentablemente tendremos que ejecutar **git reset --hard**. Por supuesto,
29+
pueden guardar sus cambios en una rama temporal si quieren (e.g. my/01_models).
30+
La idea es contar con el tiempo suficiente para abordar la totalidad de la
31+
aplicación. No se preocupen, tendrán tiempo de sobra para seguir el paso a
32+
paso en la comodidad de sus casas ;D
33+
34+
Comandos Importantes
35+
====================
36+
37+
- Correr los tests con pytest:
38+
39+
pytest -s --cov-report term-missing --cov-branch --cov taskit tests
40+
41+
- Empaquetar nuestra
42+
43+
pyinstaller -F taskit/__main__.py -n taskit
44+
45+
Finalmente
46+
==========
47+
48+
**¡Manos a la obra!**

docs/proyecto/index.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
Proyecto *Taskit*
22
#################
33

4-
Realizaremos una aplicación para gestionar nuestras tareas por realizar. En general, la estructura de la aplicación estará compuesta por:
4+
*¡Para que no se te olvide!*
55

66
.. toctree::
77
:maxdepth: 2
88
:caption: Contenido:
99

1010
descripcion.rst
11+
preparacion.rst
12+
ejecución.rst
1113

1214

0 commit comments

Comments
 (0)