Source code for mimesis.builtins.ru

"""Specific data provider for Russia (ru)."""

from datetime import datetime

from mimesis.enums import Gender
from mimesis.locales import Locale
from mimesis.providers import BaseDataProvider
from mimesis.types import MissingSeed, Seed

__all__ = ["RussiaSpecProvider"]


[docs] class RussiaSpecProvider(BaseDataProvider): """Class that provides special data for Russia (ru)."""
[docs] def __init__(self, seed: Seed = MissingSeed) -> None: """Initialize attributes.""" super().__init__(locale=Locale.RU, seed=seed) self._current_year = str(datetime.now().year)
[docs] class Meta: """The name of the provider.""" name = "russia_provider" datafile = "builtin.json"
[docs] def generate_sentence(self) -> str: """Generate sentence from the parts. :return: Sentence. """ sentences = self._extract(["sentence"]) sentence = [ self.random.choice(sentences[k]) for k in ("head", "p1", "p2", "tail") ] return " ".join(sentence)
[docs] def patronymic(self, gender: Gender | None = None) -> str: """Generate random patronymic name. :param gender: Gender of person. :return: Patronymic name. :Example: Алексеевна. """ gender = self.validate_enum(gender, Gender) patronymics: list[str] = self._extract(["patronymic", str(gender)]) return self.random.choice(patronymics)
[docs] def passport_series(self, year: int | None = None) -> str: """Generate random series of passport. :param year: Year of manufacture. :type year: int or None :return: Series. :Example: 02 15. """ if not year: year = self.random.randint(10, int(self._current_year[2:])) region = self.random.randint(1, 99) return f"{region:02d} {year}"
[docs] def passport_number(self) -> int: """Generate random passport number. :return: Number. :Example: 560430 """ return self.random.randint(100000, 999999)
[docs] def series_and_number(self) -> str: """Generate a random passport number and series. :return: Series and number. :Example: 57 16 805199. """ series = self.passport_series() number = self.passport_number() return f"{series} {number}"
[docs] def snils(self) -> str: """Generate snils with a special algorithm. :return: SNILS. :Example: 41917492600. """ numbers = [] control_codes = [] for i in range(0, 9): numbers.append(self.random.randint(0, 9)) for i in range(9, 0, -1): control_codes.append(numbers[9 - i] * i) control_code = sum(control_codes) code = "".join(map(str, numbers)) if control_code in (100, 101): _snils = code + "00" return _snils if control_code < 100: _snils = code + str(control_code) return _snils if control_code > 101: control_code = control_code % 101 if control_code == 100: control_code = 0 _snils = code + f"{control_code:02}" return _snils raise RuntimeError("Must not be reached")
[docs] def inn(self) -> str: """Generate random, but valid ``INN``. :return: INN. """ def control_sum(nums: list[int], t: str) -> int: digits_dict = { "n2": [7, 2, 4, 10, 3, 5, 9, 4, 6, 8], "n1": [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8], } number = 0 digits = digits_dict[t] for i, _ in enumerate(digits, start=0): number += nums[i] * digits[i] return number % 11 % 10 numbers = [] for x in range(0, 10): numbers.append(self.random.randint(1 if x == 0 else 0, 9)) n2 = control_sum(numbers, "n2") numbers.append(n2) n1 = control_sum(numbers, "n1") numbers.append(n1) return "".join(map(str, numbers))
[docs] def ogrn(self) -> str: """Generate random valid ``OGRN``. :return: OGRN. :Example: 4715113303725. """ numbers = [] for _ in range(0, 12): numbers.append(self.random.randint(1 if _ == 0 else 0, 9)) _ogrn = "".join(str(i) for i in numbers) check_sum = str(int(_ogrn) % 11 % 10) return f"{_ogrn}{check_sum}"
[docs] def bic(self) -> str: """Generate random ``BIC`` (Bank ID Code). :return: BIC. :Example: 044025575. """ country_code = "04" code = f"{self.random.randint(1, 10):02}" bank_number = f"{self.random.randint(0, 99):02}" bank_office = f"{self.random.randint(50, 999):03}" bic = country_code + code + bank_number + bank_office return bic
[docs] def kpp(self) -> str: """Generate random ``KPP``. :return: 'KPP'. :Example: 560058652. """ tax_codes: list[str] = self._extract(["tax_codes"]) tax_code = tax_codes[self.random.randint(0, len(tax_codes) - 1)] reg_code = f"{self.random.randint(1, 99):02}" reg_number = f"{self.random.randint(1, 999):03}" kpp = tax_code + reg_code + reg_number return kpp