# Path: tinamit/unids/conv.py
# def convertir(de, a, val=1, lengua=None):
#     """
#     Esta función convierte un valor de una unidad a otra.
# 
#     Parameters
#     ----------
#     de : str
#         La unidad original.
#     a : str
#         La unidad final.
#     val : float | int
#         El valor para convertir.
#     lengua : str
#         La lengua en la cual las unidades están especificadas.
# 
#     Returns
#     -------
#     float
#         El valor convertido.
#     """
# 
#     # Guardar una copia de los unidades iniciales
#     de_orig = de
#     a_orig = a
# 
#     # Estar seguro que diferencias en mayúsculos o espacios no causen problemas
#     de = de.lower().strip()
#     a = a.lower().strip()
# 
#     # Si son las mismas unidades, no hay nada que hacer, por supuesto.
#     if de == a:
#         return val
# 
#     # Reformatear exponentes para que los entienda Pint
#     de = re.sub(r'([\p{l}\p{m}]+\w*)(-?[\p{n}]+)', repl=r'\1 ^ \2', string=de)
#     a = re.sub(r'([\p{l}\p{m}]+\w*)(-?[\p{n}]+)', repl=r'\1 ^ \2', string=a)
# 
#     # Leer los nombres de todas las unidades presentes.
#     unids_pres_de = re.findall(r'[\p{l}\p{m}]+', de)
#     unids_pres_a = re.findall(r'[\p{l}\p{m}]+', a)
#     unids_pres = list(set(unids_pres_de + unids_pres_a))
# 
#     # Agregar unidades no reconocidas por Pint
#     for u in unids_pres:
#         # Para cada tipo_mod de unidad detectada en las unidades iniciales...
# 
#         try:
#             # Ver si Pint lo reconoce
#             regu.parse_units(u)
# 
#         except pint.UndefinedUnitError:
#             # Si Pint no lo reconoce...
# 
#             try:
#                 # Primero intentamos traducirlo para Pint
#                 u_t = trad_unid(u, leng_final='en', leng_orig=lengua)
# 
#                 if u_t != u:
#                     # Si la traducción se efectuó...
# 
#                     # ...reemplazar las unidades iniciales con la versión traducida.
#                     regu.parse_units(u_t)  # Verificar que la traducción sí funcione.
#                     if u in unids_pres_de:
#                         de = re.sub(r'%s(?![\p{l}\p{m}])' % u, repl=u_t, string=de)
#                     if u in unids_pres_a:
#                         a = re.sub(r'%s(?![\p{l}\p{m}])' % u, repl=u_t, string=a)
# 
#                 else:
#                     # Si no encontramos traducción, registramos la nueva unidad con Pint.
#                     definir_en_regu(unid=u, base=buscar_singular(u)[-1])
# 
#             except pint.UndefinedUnitError:
#                 # Si Pint no reconoció aún la traducción, tenemos que registrar la unidad.
#                 definir_en_regu(unid=u, base=buscar_singular(u)[-1])
# 
#     # Intentar convertir
#     try:
#         cant = C_(val, de).to(a)
#         cant_convtd = cant.magnitude  # Guardar el valor convertido
# 
#     except (pint.errors.DimensionalityError, pint.errors.UndefinedUnitError):
#         # Si hasta ahora tenemos error, no puedo hacer nada más.
#         raise ValueError(_('No se pudo convertir "{}" a "{}".').format(de_orig, a_orig))
# 
#     # Devolver la cantidad convertida
#     return cant_convtd


import unittest
import tinamit.unids.trads as trads
from tinamit.unids.conv import convertir
        Comprobar que devolvamos aviso para unidades que no existen en la lengua especificada.
        """

        res = trads.trad_unid('paj', leng_final='fr', leng_orig='es')

        # Asegurarque que devolvimos el valor inicial para la unidad.
        símismo.assertEqual(res, 'paj')

    def test_trad_unidad_errónea_sin_especificar_leng(símismo):
        """
        Comprobar que devolvamos aviso error para unidades que no existen.
        """

        with símismo.assertRaises(ValueError):
            trads.trad_unid('¡Yo no existo!', leng_final='fr', falla_silencio=False)

    def test_agregar_sinónimo(símismo):
        """
        Comprobar que podemos agregar sinónimos de unidades.
        """

        trads.agregar_sinónimos(unid='foot', sinónimos='feet', leng='en', guardar=True)
        símismo.assertEqual(convertir(de='foot', a='feet'), 1)

    def test_agregar_sinónimo_listas(símismo):
        """
        Comprobar que podemos agregar sinónimos de unidades en formato de lista.
        """

        trads.agregar_sinónimos(unid='meter', sinónimos=['metre', 'm'], leng='en', guardar=False)

# Path: tinamit/unids/conv.py
# def convertir(de, a, val=1, lengua=None):
#     """
#     Esta función convierte un valor de una unidad a otra.
# 
#     Parameters
#     ----------
#     de : str
#         La unidad original.
#     a : str
#         La unidad final.
#     val : float | int
#         El valor para convertir.
#     lengua : str
#         La lengua en la cual las unidades están especificadas.
# 
#     Returns
#     -------
#     float
#         El valor convertido.
#     """
# 
#     # Guardar una copia de los unidades iniciales
#     de_orig = de
#     a_orig = a
# 
#     # Estar seguro que diferencias en mayúsculos o espacios no causen problemas
#     de = de.lower().strip()
#     a = a.lower().strip()
# 
#     # Si son las mismas unidades, no hay nada que hacer, por supuesto.
#     if de == a:
#         return val
# 
#     # Reformatear exponentes para que los entienda Pint
#     de = re.sub(r'([\p{l}\p{m}]+\w*)(-?[\p{n}]+)', repl=r'\1 ^ \2', string=de)
#     a = re.sub(r'([\p{l}\p{m}]+\w*)(-?[\p{n}]+)', repl=r'\1 ^ \2', string=a)
# 
#     # Leer los nombres de todas las unidades presentes.
#     unids_pres_de = re.findall(r'[\p{l}\p{m}]+', de)
#     unids_pres_a = re.findall(r'[\p{l}\p{m}]+', a)
#     unids_pres = list(set(unids_pres_de + unids_pres_a))
# 
#     # Agregar unidades no reconocidas por Pint
#     for u in unids_pres:
#         # Para cada tipo_mod de unidad detectada en las unidades iniciales...
# 
#         try:
#             # Ver si Pint lo reconoce
#             regu.parse_units(u)
# 
#         except pint.UndefinedUnitError:
#             # Si Pint no lo reconoce...
# 
#             try:
#                 # Primero intentamos traducirlo para Pint
#                 u_t = trad_unid(u, leng_final='en', leng_orig=lengua)
# 
#                 if u_t != u:
#                     # Si la traducción se efectuó...
# 
#                     # ...reemplazar las unidades iniciales con la versión traducida.
#                     regu.parse_units(u_t)  # Verificar que la traducción sí funcione.
#                     if u in unids_pres_de:
#                         de = re.sub(r'%s(?![\p{l}\p{m}])' % u, repl=u_t, string=de)
#                     if u in unids_pres_a:
#                         a = re.sub(r'%s(?![\p{l}\p{m}])' % u, repl=u_t, string=a)
# 
#                 else:
#                     # Si no encontramos traducción, registramos la nueva unidad con Pint.
#                     definir_en_regu(unid=u, base=buscar_singular(u)[-1])
# 
#             except pint.UndefinedUnitError:
#                 # Si Pint no reconoció aún la traducción, tenemos que registrar la unidad.
#                 definir_en_regu(unid=u, base=buscar_singular(u)[-1])
# 
#     # Intentar convertir
#     try:
#         cant = C_(val, de).to(a)
#         cant_convtd = cant.magnitude  # Guardar el valor convertido
# 
#     except (pint.errors.DimensionalityError, pint.errors.UndefinedUnitError):
#         # Si hasta ahora tenemos error, no puedo hacer nada más.
#         raise ValueError(_('No se pudo convertir "{}" a "{}".').format(de_orig, a_orig))
# 
#     # Devolver la cantidad convertida
#     return cant_convtd


# Path: pruebas/test_unidades.py
import unittest
import tinamit.unids.trads as trads
from tinamit.unids.conv import convertir

        Comprobar que devolvamos aviso para unidades que no existen en la lengua especificada.
        """

        res = trads.trad_unid('paj', leng_final='fr', leng_orig='es')

        # Asegurarque que devolvimos el valor inicial para la unidad.
        símismo.assertEqual(res, 'paj')

    def test_trad_unidad_errónea_sin_especificar_leng(símismo):
        """
        Comprobar que devolvamos aviso error para unidades que no existen.
        """

        with símismo.assertRaises(ValueError):
            trads.trad_unid('¡Yo no existo!', leng_final='fr', falla_silencio=False)

    def test_agregar_sinónimo(símismo):
        """
        Comprobar que podemos agregar sinónimos de unidades.
        """

        trads.agregar_sinónimos(unid='foot', sinónimos='feet', leng='en', guardar=True)
        símismo.assertEqual(convertir(de='foot', a='feet'), 1)

    def test_agregar_sinónimo_listas(símismo):
        """
        Comprobar que podemos agregar sinónimos de unidades en formato de lista.
        """

        trads.agregar_sinónimos(unid='meter', sinónimos=['metre', 'm'], leng='en', guardar=False)

        símismo.assertEqual(convertir(de='metre', a='m'), 1)