Ejemplo n.º 1
0
    def random(cls, language, country=None):
        num_type, num_type_props = cls.choose_alphanumeric_type('blocks.alphanumeric', language, country=country)
        if num_type is None:
            return None

        if num_type == cls.NUMERIC:
            number = weighted_choice(cls.block_range, cls.block_range_cdf)
            return safe_decode(number)
        else:
            alphabet = address_config.get_property('alphabet', language, country=country, default=latin_alphabet)
            alphabet_probability = address_config.get_property('alphabet_probability', language, country=country, default=None)
            if alphabet_probability is not None and random.random() >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet, 2.0)
            if num_type == cls.ALPHA:
                return safe_decode(letter)
            else:
                number = weighted_choice(cls.block_range, cls.block_range_cdf)

                whitespace_probability = float(num_type_props.get('whitespace_probability', 0.0))
                whitespace_phrase = six.u(' ') if whitespace_probability and random.random() < whitespace_probability else six.u('')

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}{}').format(letter, whitespace_phrase, number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}{}').format(number, whitespace_phrase, letter)
Ejemplo n.º 2
0
    def random(cls, language, country=None):
        num_type, num_type_props = cls.choose_alphanumeric_type(
            'staircases.alphanumeric', language, country=country)
        if num_type is None:
            return None

        if num_type == cls.NUMERIC:
            number = weighted_choice(cls.staircase_range,
                                     cls.staircase_range_cdf)
            return safe_decode(number)
        elif num_type == cls.HYPHENATED_NUMBER:
            number = weighted_choice(cls.staircase_range,
                                     cls.staircase_range_cdf)
            number2 = number + weighted_choice(cls.staircase_range,
                                               cls.staircase_range_cdf)
            return u'{}-{}'.format(number, number2)
        else:
            alphabet = address_config.get_property('alphabet',
                                                   language,
                                                   country=country,
                                                   default=latin_alphabet)
            alphabet_probability = address_config.get_property(
                'alphabet_probability',
                language,
                country=country,
                default=None)
            if alphabet_probability is not None and random.random(
            ) >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet, 2.0)
            if num_type == cls.ALPHA:
                return safe_decode(letter)
            else:
                number = weighted_choice(cls.staircase_range,
                                         cls.staircase_range_cdf)

                whitespace_probability = float(
                    num_type_props.get('whitespace_probability', 0.0))
                hyphen_probability = float(
                    num_type_props.get('hyphen_probability', 0.0))
                whitespace_phrase = u''
                r = random.random()
                if r < whitespace_probability:
                    whitespace_phrase = u' '
                elif r < (whitespace_probability + hyphen_probability):
                    whitespace_phrase = u'-'

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}{}').format(letter, whitespace_phrase,
                                                  number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}{}').format(number, whitespace_phrase,
                                                  letter)
Ejemplo n.º 3
0
    def random_from_int(cls, number, language, country=None):
        num_type, num_type_props = cls.choose_alphanumeric_type(
            'levels.alphanumeric', language, country=country)
        if num_type is None:
            return None

        numbering_starts_at = int(
            address_config.get_property('levels.numbering_starts_at',
                                        language,
                                        country=country,
                                        default=0))

        if number >= 0:
            number += numbering_starts_at

        if num_type == cls.NUMERIC:
            return safe_decode(number)
        elif num_type == cls.ROMAN_NUMERAL:
            roman_numeral = numeric_expressions.roman_numeral(number)
            if roman_numeral is not None:
                return roman_numeral
            else:
                return safe_decode(number)
        elif num_type == cls.HYPHENATED_NUMBER:
            number2 = number + sample_floors_range(1, cls.max_floors)
            return u'{}-{}'.format(number, number2)
        else:
            alphabet = address_config.get_property('alphabet',
                                                   language,
                                                   country=country,
                                                   default=latin_alphabet)
            alphabet_probability = address_config.get_property(
                'alphabet_probability',
                language,
                country=country,
                default=None)
            if alphabet_probability is not None and random.random(
            ) >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet)
            if num_type == cls.ALPHA:
                return letter
            else:
                number = weighted_choice(cls.floors_letters,
                                         cls.floors_letters_cdf)

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}').format(letter, number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}').format(number, letter)

        return None
Ejemplo n.º 4
0
    def random(cls, language, country=None):
        num_type, num_type_props = cls.choose_alphanumeric_type(
            'blocks.alphanumeric', language, country=country)
        if num_type is None:
            return None

        if num_type == cls.NUMERIC:
            number = weighted_choice(cls.block_range, cls.block_range_cdf)
            return safe_decode(number)
        else:
            alphabet = address_config.get_property('alphabet',
                                                   language,
                                                   country=country,
                                                   default=latin_alphabet)
            alphabet_probability = address_config.get_property(
                'alphabet_probability',
                language,
                country=country,
                default=None)
            if alphabet_probability is not None and random.random(
            ) >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet, 2.0)
            if num_type == cls.ALPHA:
                return safe_decode(letter)
            else:
                number = weighted_choice(cls.block_range, cls.block_range_cdf)

                whitespace_probability = float(
                    num_type_props.get('whitespace_probability', 0.0))
                whitespace_phrase = six.u(
                    ' ') if whitespace_probability and random.random(
                    ) < whitespace_probability else six.u('')

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}{}').format(letter, whitespace_phrase,
                                                  number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}{}').format(number, whitespace_phrase,
                                                  letter)
Ejemplo n.º 5
0
    def random_from_int(cls, number, language, country=None):
        num_type, num_type_props = cls.choose_alphanumeric_type('levels.alphanumeric', language, country=country)
        if num_type is None:
            return None

        numbering_starts_at = int(address_config.get_property('levels.numbering_starts_at', language, country=country, default=0))

        if number >= 0:
            number += numbering_starts_at

        if num_type == cls.NUMERIC:
            return safe_decode(number)
        elif num_type == cls.ROMAN_NUMERAL:
            roman_numeral = numeric_expressions.roman_numeral(number)
            if roman_numeral is not None:
                return roman_numeral
            else:
                return safe_decode(number)
        elif num_type == cls.HYPHENATED_NUMBER:
            number2 = number + sample_floors_range(1, cls.max_floors)
            return u'{}-{}'.format(number, number2)
        else:
            alphabet = address_config.get_property('alphabet', language, country=country, default=latin_alphabet)
            alphabet_probability = address_config.get_property('alphabet_probability', language, country=country, default=None)
            if alphabet_probability is not None and random.random() >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet)
            if num_type == cls.ALPHA:
                return letter
            else:
                number = weighted_choice(cls.floors_letters, cls.floors_letters_cdf)

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}').format(letter, number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}').format(number, letter)

        return None
Ejemplo n.º 6
0
    def random(cls, language, country=None):
        num_type, num_type_props = cls.choose_alphanumeric_type('staircases.alphanumeric', language, country=country)
        if num_type is None:
            return None

        if num_type == cls.NUMERIC:
            number = weighted_choice(cls.staircase_range, cls.staircase_range_cdf)
            return safe_decode(number)
        elif num_type == cls.HYPHENATED_NUMBER:
            number = weighted_choice(cls.staircase_range, cls.staircase_range_cdf)
            number2 = number + weighted_choice(cls.staircase_range, cls.staircase_range_cdf)
            return u'{}-{}'.format(number, number2)
        else:
            alphabet = address_config.get_property('alphabet', language, country=country, default=latin_alphabet)
            alphabet_probability = address_config.get_property('alphabet_probability', language, country=country, default=None)
            if alphabet_probability is not None and random.random() >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet, 2.0)
            if num_type == cls.ALPHA:
                return safe_decode(letter)
            else:
                number = weighted_choice(cls.staircase_range, cls.staircase_range_cdf)

                whitespace_probability = float(num_type_props.get('whitespace_probability', 0.0))
                hyphen_probability = float(num_type_props.get('hyphen_probability', 0.0))
                whitespace_phrase = u''
                r = random.random()
                if r < whitespace_probability:
                    whitespace_phrase = u' '
                elif r < (whitespace_probability + hyphen_probability):
                    whitespace_phrase = u'-'

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}{}').format(letter, whitespace_phrase, number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}{}').format(number, whitespace_phrase, letter)
Ejemplo n.º 7
0
 def random_letter(cls, language, country=None):
     alphabet = address_config.get_property('alphabet', language, country=country, default=latin_alphabet)
     return sample_alphabet(alphabet)
Ejemplo n.º 8
0
 def random_letter(cls, language, country=None):
     alphabet = address_config.get_property('alphabet',
                                            language,
                                            country=country,
                                            default=latin_alphabet)
     return sample_alphabet(alphabet)
Ejemplo n.º 9
0
    def random(cls, language, country=None, num_floors=None, num_basements=None, floor=None):
        num_type, num_type_props = cls.choose_alphanumeric_type('units.alphanumeric', language, country=country)
        if num_type is None:
            return None

        use_floor_prob = address_config.get_property('units.alphanumeric.use_floor_probability', language, country=country, default=0.0)

        use_positive_numbers_prob = address_config.get_property('units.alphanumeric.use_positive_numbers_probability', language, country=country, default=0.0)

        if (num_floors is None and floor is None) or random.random() >= use_floor_prob:
            if random.random() >= use_positive_numbers_prob:
                number = weighted_choice(cls.numbered_units, cls.unit_probs_cdf)
            else:
                number = weighted_choice(cls.positive_units, cls.positive_units_cdf)
        else:
            if floor is None or not floor.isdigit():
                floor = Floor.random_int(language, country=country, num_floors=num_floors, num_basements=num_basements)

            floor_numbering_starts_at = address_config.get_property('levels.numbering_starts_at', language, country=country, default=0)
            ground_floor_starts_at = address_config.get_property('units.alphanumeric.use_floor_ground_starts_at', language, country=country, default=None)

            if ground_floor_starts_at is not None:
                try:
                    floor = int(floor)
                    if floor >= floor_numbering_starts_at:
                        floor -= floor_numbering_starts_at
                    floor += ground_floor_starts_at
                    floor = safe_decode(floor)
                except (TypeError, ValueError):
                    pass

            use_floor_affix_prob = address_config.get_property('units.alphanumeric.use_floor_numeric_affix_probability', language, country=country, default=0.0)
            if use_floor_affix_prob and random.random() < use_floor_affix_prob:
                floor_phrase = Floor.phrase(floor, language, country=country)
                # Only works if the floor phrase is strictly numeric e.g. "1" or "H1"
                if is_numeric_strict(floor_phrase):
                    unit = weighted_choice(cls.positive_units, cls.positive_units_cdf)

                    unit_num_digits = address_config.get_property('units.alphanumeric.use_floor_unit_num_digits', language, country=country, default=None)
                    if unit_num_digits is not None:
                        unit = safe_decode(unit).zfill(unit_num_digits)

                    return six.u('{}{}').format(floor_phrase, unit)

            floor_num_digits = address_config.get_property('units.alphanumeric.use_floor_floor_num_digits', language, country=country, default=None)
            if floor_num_digits is not None and floor.isdigit():
                floor = floor.zfill(floor_num_digits)

            number = cls.for_floor(floor)

        if num_type == cls.NUMERIC:
            return safe_decode(number)
        elif num_type == cls.HYPHENATED_NUMBER:
            number2 = weighted_choice(cls.positive_units, cls.positive_units_cdf)
            range_prob = float(address_config.get_property('units.alphanumeric.hyphenated_number.range_probability', language, country=country, default=0.5))
            direction = address_config.get_property('units.alphanumeric.hyphenated_number.direction', language, country=country, default='right')
            direction_prob = float(address_config.get_property('units.alphanumeric.hyphenated_number.direction_probability', language, country=country, default=0.0))

            if random.random() < direction_prob:
                direction = 'left' if direction == 'right' else 'right'

            direction_right = direction == 'right'

            if random.random() < range_prob:
                if direction_right:
                    number2 += number
                else:
                    number2 = max(0, number - number2)
            if direction == 'right':
                return u'{}-{}'.format(number, number2)
            else:
                return u'{}-{}'.format(number2, number)
        else:
            alphabet = address_config.get_property('alphabet', language, country=country, default=latin_alphabet)
            alphabet_probability = address_config.get_property('alphabet_probability', language, country=country, default=None)
            if alphabet_probability is not None and random.random() >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet)
            if num_type == cls.ALPHA:
                return safe_decode(letter)
            else:
                if num_floors is None:
                    number = weighted_choice(cls.positive_units_letters, cls.positive_units_letters_cdf)

                whitespace_probability = float(num_type_props.get('whitespace_probability', 0.0))
                hyphen_probability = float(num_type_props.get('hyphen_probability', 0.0))
                whitespace_phrase = u''
                r = random.random()
                if r < whitespace_probability:
                    whitespace_phrase = u' '
                elif r < (whitespace_probability + hyphen_probability):
                    whitespace_phrase = u'-' 

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}{}').format(letter, whitespace_phrase, number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}{}').format(number, whitespace_phrase, letter)
Ejemplo n.º 10
0
    def random(cls,
               language,
               country=None,
               num_floors=None,
               num_basements=None,
               floor=None):
        num_type, num_type_props = cls.choose_alphanumeric_type(
            'units.alphanumeric', language, country=country)
        if num_type is None:
            return None

        use_floor_prob = address_config.get_property(
            'units.alphanumeric.use_floor_probability',
            language,
            country=country,
            default=0.0)

        use_positive_numbers_prob = address_config.get_property(
            'units.alphanumeric.use_positive_numbers_probability',
            language,
            country=country,
            default=0.0)

        if (num_floors is None
                and floor is None) or random.random() >= use_floor_prob:
            if random.random() >= use_positive_numbers_prob:
                number = weighted_choice(cls.numbered_units,
                                         cls.unit_probs_cdf)
            else:
                number = weighted_choice(cls.positive_units,
                                         cls.positive_units_cdf)
        else:
            if floor is None or not floor.isdigit():
                floor = Floor.random_int(language,
                                         country=country,
                                         num_floors=num_floors,
                                         num_basements=num_basements)

            floor_numbering_starts_at = address_config.get_property(
                'levels.numbering_starts_at',
                language,
                country=country,
                default=0)
            ground_floor_starts_at = address_config.get_property(
                'units.alphanumeric.use_floor_ground_starts_at',
                language,
                country=country,
                default=None)

            if ground_floor_starts_at is not None:
                try:
                    floor = int(floor)
                    if floor >= floor_numbering_starts_at:
                        floor -= floor_numbering_starts_at
                    floor += ground_floor_starts_at
                    floor = safe_decode(floor)
                except (TypeError, ValueError):
                    pass

            use_floor_affix_prob = address_config.get_property(
                'units.alphanumeric.use_floor_numeric_affix_probability',
                language,
                country=country,
                default=0.0)
            if use_floor_affix_prob and random.random() < use_floor_affix_prob:
                floor_phrase = Floor.phrase(floor, language, country=country)
                # Only works if the floor phrase is strictly numeric e.g. "1" or "H1"
                if is_numeric_strict(floor_phrase):
                    unit = weighted_choice(cls.positive_units,
                                           cls.positive_units_cdf)

                    unit_num_digits = address_config.get_property(
                        'units.alphanumeric.use_floor_unit_num_digits',
                        language,
                        country=country,
                        default=None)
                    if unit_num_digits is not None:
                        unit = safe_decode(unit).zfill(unit_num_digits)

                    return six.u('{}{}').format(floor_phrase, unit)

            floor_num_digits = address_config.get_property(
                'units.alphanumeric.use_floor_floor_num_digits',
                language,
                country=country,
                default=None)
            if floor_num_digits is not None and floor.isdigit():
                floor = floor.zfill(floor_num_digits)

            number = cls.for_floor(floor)

        if num_type == cls.NUMERIC:
            return safe_decode(number)
        elif num_type == cls.HYPHENATED_NUMBER:
            number2 = weighted_choice(cls.positive_units,
                                      cls.positive_units_cdf)
            range_prob = float(
                address_config.get_property(
                    'units.alphanumeric.hyphenated_number.range_probability',
                    language,
                    country=country,
                    default=0.5))
            direction = address_config.get_property(
                'units.alphanumeric.hyphenated_number.direction',
                language,
                country=country,
                default='right')
            direction_prob = float(
                address_config.get_property(
                    'units.alphanumeric.hyphenated_number.direction_probability',
                    language,
                    country=country,
                    default=0.0))

            if random.random() < direction_prob:
                direction = 'left' if direction == 'right' else 'right'

            direction_right = direction == 'right'

            if random.random() < range_prob:
                if direction_right:
                    number2 += number
                else:
                    number2 = max(0, number - number2)
            if direction == 'right':
                return u'{}-{}'.format(number, number2)
            else:
                return u'{}-{}'.format(number2, number)
        else:
            alphabet = address_config.get_property('alphabet',
                                                   language,
                                                   country=country,
                                                   default=latin_alphabet)
            alphabet_probability = address_config.get_property(
                'alphabet_probability',
                language,
                country=country,
                default=None)
            if alphabet_probability is not None and random.random(
            ) >= alphabet_probability:
                alphabet = latin_alphabet
            letter = sample_alphabet(alphabet)
            if num_type == cls.ALPHA:
                return safe_decode(letter)
            else:
                if num_floors is None:
                    number = weighted_choice(cls.positive_units_letters,
                                             cls.positive_units_letters_cdf)

                whitespace_probability = float(
                    num_type_props.get('whitespace_probability', 0.0))
                hyphen_probability = float(
                    num_type_props.get('hyphen_probability', 0.0))
                whitespace_phrase = u''
                r = random.random()
                if r < whitespace_probability:
                    whitespace_phrase = u' '
                elif r < (whitespace_probability + hyphen_probability):
                    whitespace_phrase = u'-'

                if num_type == cls.ALPHA_PLUS_NUMERIC:
                    return six.u('{}{}{}').format(letter, whitespace_phrase,
                                                  number)
                elif num_type == cls.NUMERIC_PLUS_ALPHA:
                    return six.u('{}{}{}').format(number, whitespace_phrase,
                                                  letter)