"""LT1 · 50 · cotejo de 10 normas (DEFINICIONES_PREVIAS §7): fecha del catálogo frente a la cláusula de entrada en vigor del propio texto.""" import json, re, html, datetime as dt B = '/w/fuentes_boe/' def T(f): return re.sub(r'\s+', ' ', html.unescape(re.sub(r'<[^>]+>', ' ', open(B + f, encoding='utf-8').read()))) def addm(d, m): y, mo = divmod(d.month - 1 + m, 12); return d.replace(year=d.year + y, month=mo + 1) D = dt.date # norma, fichero, fecha de publicación que rige la cláusula (diario y fecha), patrón de la cláusula, regla, fecha del catálogo, fecha del catálogo inicial (TRASPASO/encargo) N = [('LCSP (Ley 9/2017)', 'txt_lcsp.xml', ('BOE', D(2017, 11, 9)), r'La presente ley entrará en vigor a los cuatro meses', lambda p: addm(p, 4), D(2018, 3, 9), D(2018, 3, 9)), ('RDL 3/2020', 'txt_rdl3_2020.xml', ('BOE', D(2020, 2, 5)), r'El presente real decreto-ley entrará en vigor el día siguiente', lambda p: p + dt.timedelta(1), D(2020, 2, 6), D(2020, 2, 5)), ('RDL 7/2020', 'txt_rdl7_2020.xml', ('BOE', D(2020, 3, 13)), r'entrará en vigor el mismo día de su publicación', lambda p: p, D(2020, 3, 13), D(2020, 3, 1)), ('RDL 8/2020', 'txt_rdl8_2020.xml', ('BOE', D(2020, 3, 18)), r'entrará en vigor el mismo día de su publicación', lambda p: p, D(2020, 3, 18), D(2020, 3, 1)), ('RDL 36/2020', 'txt_rdl36_2020.xml', ('BOE', D(2020, 12, 31)), r'entrará en vigor el día siguiente al de su publicación', lambda p: p + dt.timedelta(1), D(2021, 1, 1), D(2020, 12, 31)), ('Ley 2/2023', 'txt_ley2_2023.xml', ('BOE', D(2023, 2, 21)), r'entrará en vigor a los veinte días', lambda p: p + dt.timedelta(20), D(2023, 3, 13), None), ('RDL 3/2019 (DA 54.ª SECTI)', 'txt_rdl3_2019.xml', ('BOE', D(2019, 2, 9)), r'entrará en vigor el mismo día de su publicación', lambda p: p, D(2019, 2, 9), D(2022, 1, 1)), ('Ley 19/2013 (títulos prel., I y III)', 'ley19_2013_df9.xml', ('BOE', D(2013, 12, 10)), r'entrarán en vigor al año de su publicación', lambda p: p.replace(year=p.year + 1), D(2014, 12, 10), None), ('Cataluña DL 3/2016', 'cat_dl3_2016.xml', ('DOGC', D(2016, 6, 2)), r'entrará en vigor al día siguiente de su publicación', lambda p: p + dt.timedelta(1), D(2016, 6, 3), None), ('Euskadi Ley 3/2016', 'txt_eus_ley3_2016.xml', ('BOPV', D(2016, 4, 15)), r'entrará en vigor en el plazo de dos meses', lambda p: addm(p, 2), D(2016, 6, 15), None)] ORIG = {'Cataluña DL 3/2016': ('orig_cat_dl3_2016.xml', r'Publicada en el DOGC núm\. \d+, de 2 de junioi? de 2016'), 'Euskadi Ley 3/2016': ('orig_eus_ley3_2016.xml', r'Publicada en el BOPV núm\. \d+, de 15 de abril de 2016')} out = [] for nom, f, (diario, fp), pat, regla, cat, ini in N: t = T(f); hall = re.search(pat, t) is not None if nom in ORIG: hall = hall and re.search(ORIG[nom][1], T(ORIG[nom][0])) is not None calc = regla(fp) out.append(dict(norma=nom, publicacion=f'{diario} {fp}', clausula_hallada=hall, regla=pat, fecha_texto=str(calc), fecha_catalogo=str(cat), coincide=hall and calc == cat, catalogo_inicial=None if ini is None else str(ini), inicial_coincide=None if ini is None else ini == cat)) print(out[-1]) res = dict(normas=out, coinciden=sum(o['coincide'] for o in out), de=len(out), veredicto='PASA' if all(o['coincide'] for o in out) else 'NO PASA', nota='catálogo inicial = apunte del TRASPASO / encargo; RDL 7 y 8/2020 se daban como «mar-2020» (se pone día 1); la DA 54.ª se daba como 2022') json.dump(res, open('/w/salidas/50_cotejo_normas.json', 'w'), indent=1, ensure_ascii=False) print(res['coinciden'], '/', res['de'], res['veredicto'])