Ejercitar la mente
Hoy mientras intentaba solucionar unos features mas "complejos" de un proyecto, me tope con un pequeño problema:
- Como calcular si hoy es el primer Lunes del mes ?
Llevo programando creo que mas de 15 años, me considero lo que llamamos "senior" en el rubro, entonces obviamente hice lo primero que hacemos la gran mayoría de mortales programadores:
- Ir al navegador
- Click en el input de busqueda de Google, y escribir
check if first monday of the month python...
Esperaba buscar un método en la libreria datetime
o alguna solución rapida en StackOveflow, pero...
Y esto es un clásico, al menos para mi: con el paso del tiempo nos volvemos más perezosos y dejamos de lado los algoritmos simples en pos de "la última tecnología", y yo creo que son justamente esos pequeños acertijos los que nos van ejercitando mejor la cabeza.
Manos a la obra
Decidí no indagar mucho en varios resultados que me ofrecia Google, y me puse a a mirar calendarios y a escribir un poco en un cuaderno. Al cabo de unos minutos entendí que:
- Si el día de hoy es Lunes
- Y la fecha de hoy esta entre 1 y 7
...eso significa que hoy es el primer lunes del mes
Un poco de código
Juntando esas fechas que habia visto en el calendario hice un pequeño test usando pytest
principalmente para parametrizar algunos casos y tambien freezegun
para jugar un poco con el tiempo:
import pytest
from freezegun import freeze_time
from core.utils import dates_utils
@pytest.mark.parametrize(
"date,expected",
[
("2021-10-04 03:21:34", True),
("2021-10-11 03:21:34", False),
("2021-07-15 03:21:34", False),
("2021-07-26 03:21:34", False),
("2021-02-01 03:21:34", True),
("2021-12-06 03:21:34", True),
("2021-06-07 03:21:34", True),
],
)
def test_is_first_monday_of_month(date, expected):
with freeze_time(date):
assert dates_utils.is_first_monday_of_month() == expected
Y la función seria algo mas o menos así:
from datetime import datetime
def is_first_monday_of_month() -> bool:
today = datetime.today()
weekday = today.weekday()
day = today.day
return weekday == 0 and day <= 7
- A partir de acá ya vere si la maquillo un poco y la hago generica para diferentes días, pero a fines prácticos hoy ya me sirvió 🙂.
- Quise usar un par de lunes "conflictivos" en los tests, pero ahi tambien debería pulir un poco mas la forma de testear.
Conclusiones
Esto no es ingenieria nuclear, ni códigos que disrumpen mercados. Tampoco es un análisis revolucionario, pero a mi me dejo una alegría en el dia, y me puse contento de cambiar un poco de ámbito de problemas.
Lo quise poner en un post, para envalentonar a quien lea, para que comparta estos pequeños hacks y también que nos animemos más a nosotros mismos con las pequeñas victorias del día a día.