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)
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)
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
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)
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
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)
def random_letter(cls, language, country=None): alphabet = address_config.get_property('alphabet', language, country=country, default=latin_alphabet) return sample_alphabet(alphabet)
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)
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)