Example #1
0
    def __init__(self):
        # Se crea el Lock 'self._parser_lock' para evitar problemas con
        # 'self._parser' en contextos de ejecución donde se usen threads, ya
        # que el parser cuenta con un estado interno mutable (su propiedad
        # '_cache'). Si se utilizan threads o no depende de la configuración
        # que se esté usando para los workers de Gunicorn. Por defecto los
        # workers son de tipo 'sync', por lo que se crea un proceso separado
        # por worker (no se usan threads).
        self._parser_lock = threading.Lock()

        cache = utils.LFUDict(constants.ADDRESS_PARSER_CACHE_SIZE)
        self._parser = AddressParser(cache=cache)
        super().__init__(required=True)
    def test_address_parser_cache_same_structures(self):
        """Al utilizar un cache, y si dos direcciones comparten la misma
        estructura, solo se debería agregar una key para las dos."""
        cache = {}
        parser = AddressParser(cache=cache)
        addresses = [
            'Corrientes 1000',
            'Tucumán 2000',
            'Córdoba 3333'
        ]

        for address in addresses:
            parser.parse(address)

        self.assertEqual(len(cache), 1)
    def test_address_parser_cache(self):
        """Al utilizar un cache, se debería agregar una key por cada
        esctructura de dirección distinta."""
        cache = {}
        parser = AddressParser(cache=cache)
        addresses = [
            'Corrientes 1000',
            'Santa fe 2000',
            'callle 10 123 y Tucumán'
        ]

        for address in addresses:
            parser.parse(address)

        self.assertEqual(len(cache), len(addresses))
    def setUpClass(cls):
        cls._parser = AddressParser()

        filename = cls._test_file  # pylint: disable=no-member
        with open(filename) as f:
            cls._test_cases = json.load(f)

        for test_case in cls._test_cases:
            test_case.pop('_comment', None)

        assert all(
            test_case['type'] in ADDRESS_TYPES or test_case['type'] is None
            for test_case in cls._test_cases
        ) and cls._test_cases

        logging.debug('\n%s: %s test cases', os.path.basename(filename),
                      len(cls._test_cases))
def benchmark(use_cache):
    parser = AddressParser({} if use_cache else None)

    def test_fn():
        parser.parse('Tucuman')
        parser.parse('Tucuman 1000')
        parser.parse('Tucuman Nro 1000')
        parser.parse('Tucuman Nro 1000 2 c')
        parser.parse('Tucuman y Salta')
        parser.parse('Tucuman y Salta 1000')
        parser.parse('Tucuman 1000 y Salta')
        parser.parse('Tucuman e/ Corrientes y Salta')
        parser.parse('Tucuman e/ Corrientes y Salta 1000')
        parser.parse('Tucuman 1000 e/ Corrientes y Salta')

    result = timeit.timeit(stmt=test_fn, number=ITERATIONS)

    print('- Total:         {0:.7f}'.format(result))
    print('- Por iteración: {0:.7f}'.format(result / ITERATIONS))
    print('- Por dirección: {0:.7f}'.format((result / ITERATIONS) / 10))
 def setUp(self):
     self.parser = AddressParser()