Ideas en bits

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:

  1. Ir al navegador
  2. 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...

travolta

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

well done

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.