Código fuente para mexa.core
# encoding: utf-8
""" Se encarga de implementar funciones para el nucleo de la aplicacion. """
import re
import math
import datetime
from typing import Union
[documentos]class Partes:
"""Se encarga de dividir el valor en partes"""
def __init__(self, regex:str):
"""
Constructor
:param regex: expresion regular con la que trabajará
:type regex: str
"""
self.regex = regex
self.error = True
self.re_obj = None
[documentos] def load(self, value:str):
"""
Carga el valor en el objeto evaluando dicho valor con el regex
:param value: valor del elemento en cuestión.
:type value: str
"""
self.re_obj = re.search(self.regex, value)
if self.re_obj:
self.error = False
else:
self.error = True
[documentos] def get(self, index:str) -> Union[str, None]:
"""
Devuelve un grupo dentro de la expresión regular
:param index: el indice del grupo a devolver.
:type index: int
:return: El grupo en cuestion ó None en caso de error
:rtype: str/None
"""
if self.error:
return None
try:
el = self.re_obj.group(index)
return el
except IndexError as e:
print(f"Exeption: {e}")
return None
[documentos] def value(self) -> Union[str, None]:
"""
Devuelve un grupo 0 que contiene el valor empatado.
:return: El grupo 0
:rtype: str
:rtype: str/None
"""
return self.get(0)
[documentos]class FieldInterface:
"""Forza a que la función que la implemente sobre-escriba los metodos vacios"""
errors = []
errorMsgs = {}
[documentos] @staticmethod
def is_valid(value, match = None):
"""Devuelve true si value es valido"""
pass
[documentos] @staticmethod
def generate(data):
"""Devuelve el valor a partir de los metadatos recibidos en data"""
pass
[documentos] @staticmethod
def autocomplete(value):
"""Devuelve un string igual o mayor al recibido"""
pass
[documentos] @classmethod
def add_error(cls, code = 100, value = None):
"""Agrega el mensaje de error y devuelve siempre False"""
msg = ''
if code in cls.errorMsgs:
msg = cls.errorMsgs[code]
if value is not None:
msg = msg.format(value)
else:
msg = f'Código de error incorrecto: {code}'
cls.errors.append(msg)
return False
[documentos] @classmethod
def has_errors(cls):
"""Devuelve true si existen errores"""
return len(cls.errors) > 0
[documentos] @classmethod
def clear_errors(cls):
"""Recibe un mensaje y lo guarda en el error"""
cls.errors.clear()
[documentos]def year_by_last2digit (last2_digits):
"""
Regresa el año completo a partir de los dos últimos digitos
:param last2_digits: los dos últimos digitos del año, p.e. 23 para el 2023
:type last2_digits: int
:return: El año completo
:rtype: int
"""
y = int(last2_digits)
if math.isnan(y):
return None
current_year = datetime.date.today().year % 100
centenas = 20 if y <= current_year else 19
return (centenas * 100) + y