1c8a86594f
Dos funciones nuevas del grupo de capacidad `dav`: - expand_rrule_py_infra (pure): expande una RRULE iCalendar a las fechas de cada ocurrencia dentro de un rango [from, to]. Solo stdlib (datetime, re). Soporta FREQ DAILY/WEEKLY/MONTHLY/YEARLY, INTERVAL, COUNT, UNTIL, BYDAY. 9 tests. - dav_make_calendar_py_infra (impure): crea una coleccion de calendario nueva via MKCALENDAR + PROPPATCH de nombre/color. Idempotente si ya existe. 11 tests. Consumidas por la app osint_web (eventos recurrentes + creacion de agendas). Pagina del grupo dav actualizada con ambas. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.3 KiB
4.3 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | params | output | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| expand_rrule | function | py | infra | 1.0.0 | pure | def expand_rrule(dtstart_ical: str, rrule: str, range_start: str, range_end: str, all_day: bool = False) -> list[str] | Expande una RRULE iCalendar a la lista ordenada de fechas DTSTART de cada ocurrencia que cae dentro de un rango [range_start, range_end]. Pura, determinista, solo stdlib (sin python-dateutil). Soporta FREQ DAILY/WEEKLY/MONTHLY/YEARLY, INTERVAL, COUNT, UNTIL y BYDAY (para WEEKLY). |
|
false | true |
|
python/functions/infra/expand_rrule_test.py | python/functions/infra/expand_rrule.py |
|
Lista ordenada de strings DTSTART iCal, una por ocurrencia en rango. Lista vacia si la RRULE no produce ninguna en [range_start, range_end]. |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from infra.expand_rrule import expand_rrule
# Reunion semanal los lunes a las 09:00, 4 ocurrencias, ventana de enero 2026.
fechas = expand_rrule(
"20260105T090000",
"FREQ=WEEKLY;COUNT=4",
"20260101",
"20261231",
)
print(fechas)
# ['20260105T090000', '20260112T090000', '20260119T090000', '20260126T090000']
# Evento all-day mensual cada 2 meses, solo las que caen en el primer semestre.
fechas = expand_rrule(
"20260115",
"FREQ=MONTHLY;INTERVAL=2;COUNT=4",
"20260101",
"20260630",
all_day=True,
)
print(fechas)
# ['20260115', '20260315', '20260515']
Cuando usarla
Cuando un cliente CalDAV necesita mostrar las ocurrencias de un evento recurrente dentro de la ventana visible del calendario: tienes el DTSTART y la RRULE del VEVENT maestro y quieres la lista concreta de fechas de inicio que caen entre dos limites para pintarlas en la agenda. Tambien para contar o iterar instancias de una serie sin instanciar todo el iCal.
Gotchas
- No implementa el RFC 5545 completo. Componentes soportados:
FREQ(obligatorio):DAILY,WEEKLY,MONTHLY,YEARLY.INTERVAL(default 1).COUNT(incluye la primera ocurrencia = dtstart).UNTIL(YYYYMMDDoYYYYMMDDTHHMMSSZ, inclusive).BYDAYsolo paraFREQ=WEEKLY(MO,TU,WE,TH,FR,SA,SU).
- Cualquier otro componente (
BYMONTHDAY,BYSETPOS,BYMONTH,WKSTavanzado, EXDATE, RDATE, etc.) se ignora silenciosamente — no falla, pero el resultado puede diferir del esperado por el RFC en esos casos. - Si faltan COUNT y UNTIL a la vez, la generacion se acota por
range_endcon un tope de seguridad duro de 1000 ocurrencias para no colgar. - En
FREQ=MONTHLY/YEARLYcon dia 29/30/31, los meses sin ese dia recortan al ultimo dia valido del mes destino. - No gestiona zonas horarias: con
all_day=Falseconserva la hora local del dtstart sin sufijoZ; el llamador es responsable de la tz (TZID/VTIMEZONE). - El filtro de rango compara solo la parte
YYYYMMDDdel DTSTART, no la hora.