diff options
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/providers/__init__.py')
-rw-r--r-- | venv/lib/python3.11/site-packages/faker/providers/__init__.py | 735 |
1 files changed, 0 insertions, 735 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/providers/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/__init__.py deleted file mode 100644 index add840a..0000000 --- a/venv/lib/python3.11/site-packages/faker/providers/__init__.py +++ /dev/null @@ -1,735 +0,0 @@ -import re -import string - -from collections import OrderedDict -from typing import Any, Collection, List, Optional, Sequence, TypeVar, Union - -from ..generator import Generator -from ..typing import OrderedDictType -from ..utils.distribution import choices_distribution, choices_distribution_unique - -_re_hash = re.compile(r"#") -_re_perc = re.compile(r"%") -_re_dol = re.compile(r"\$") -_re_excl = re.compile(r"!") -_re_at = re.compile(r"@") -_re_qm = re.compile(r"\?") -_re_cir = re.compile(r"\^") - -T = TypeVar("T") -ElementsType = Union[Collection[str], Collection[T], OrderedDictType[T, float]] - - -class BaseProvider: - __provider__ = "base" - __lang__: Optional[str] = None - __use_weighting__ = False - - # Locales supported by Linux Mint from `/usr/share/i18n/SUPPORTED` - language_locale_codes = { - "aa": ("DJ", "ER", "ET"), - "af": ("ZA",), - "ak": ("GH",), - "am": ("ET",), - "an": ("ES",), - "apn": ("IN",), - "ar": ( - "AE", - "BH", - "DJ", - "DZ", - "EG", - "EH", - "ER", - "IL", - "IN", - "IQ", - "JO", - "KM", - "KW", - "LB", - "LY", - "MA", - "MR", - "OM", - "PS", - "QA", - "SA", - "SD", - "SO", - "SS", - "SY", - "TD", - "TN", - "YE", - ), - "as": ("IN",), - "ast": ("ES",), - "ayc": ("PE",), - "az": ("AZ", "IN"), - "be": ("BY",), - "bem": ("ZM",), - "ber": ("DZ", "MA"), - "bg": ("BG",), - "bhb": ("IN",), - "bho": ("IN",), - "bn": ("BD", "IN"), - "bo": ("CN", "IN"), - "br": ("FR",), - "brx": ("IN",), - "bs": ("BA",), - "byn": ("ER",), - "ca": ("AD", "ES", "FR", "IT"), - "ce": ("RU",), - "ckb": ("IQ",), - "cmn": ("TW",), - "crh": ("UA",), - "cs": ("CZ",), - "csb": ("PL",), - "cv": ("RU",), - "cy": ("GB",), - "da": ("DK",), - "de": ("AT", "BE", "CH", "DE", "LI", "LU"), - "doi": ("IN",), - "dv": ("MV",), - "dz": ("BT",), - "el": ("GR", "CY"), - "en": ( - "AG", - "AU", - "BD", - "BW", - "CA", - "DK", - "GB", - "HK", - "IE", - "IN", - "NG", - "NZ", - "PH", - "SG", - "US", - "ZA", - "ZM", - "ZW", - ), - "eo": ("US",), - "es": ( - "AR", - "BO", - "CL", - "CO", - "CR", - "CU", - "DO", - "EC", - "ES", - "GT", - "HN", - "MX", - "NI", - "PA", - "PE", - "PR", - "PY", - "SV", - "US", - "UY", - "VE", - ), - "et": ("EE",), - "eu": ("ES", "FR"), - "fa": ("IR",), - "ff": ("SN",), - "fi": ("FI",), - "fil": ("PH",), - "fo": ("FO",), - "fr": ("CA", "CH", "FR", "LU"), - "fur": ("IT",), - "fy": ("NL", "DE"), - "ga": ("IE",), - "gd": ("GB",), - "gez": ("ER", "ET"), - "gl": ("ES",), - "gu": ("IN",), - "gv": ("GB",), - "ha": ("NG",), - "hak": ("TW",), - "he": ("IL",), - "hi": ("IN",), - "hne": ("IN",), - "hr": ("HR",), - "hsb": ("DE",), - "ht": ("HT",), - "hu": ("HU",), - "hy": ("AM",), - "ia": ("FR",), - "id": ("ID",), - "ig": ("NG",), - "ik": ("CA",), - "is": ("IS",), - "it": ("CH", "IT"), - "iu": ("CA",), - "iw": ("IL",), - "ja": ("JP",), - "ka": ("GE",), - "kk": ("KZ",), - "kl": ("GL",), - "km": ("KH",), - "kn": ("IN",), - "ko": ("KR",), - "kok": ("IN",), - "ks": ("IN",), - "ku": ("TR",), - "kw": ("GB",), - "ky": ("KG",), - "lb": ("LU",), - "lg": ("UG",), - "li": ("BE", "NL"), - "lij": ("IT",), - "ln": ("CD",), - "lo": ("LA",), - "lt": ("LT",), - "lv": ("LV",), - "lzh": ("TW",), - "mag": ("IN",), - "mai": ("IN",), - "mg": ("MG",), - "mhr": ("RU",), - "mi": ("NZ",), - "mk": ("MK",), - "ml": ("IN",), - "mn": ("MN",), - "mni": ("IN",), - "mr": ("IN",), - "ms": ("MY",), - "mt": ("MT",), - "my": ("MM",), - "nan": ("TW",), - "nb": ("NO",), - "nds": ("DE", "NL"), - "ne": ("NP",), - "nhn": ("MX",), - "niu": ("NU", "NZ"), - "nl": ("AW", "BE", "NL"), - "nn": ("NO",), - "nr": ("ZA",), - "nso": ("ZA",), - "oc": ("FR",), - "om": ("ET", "KE"), - "or": ("IN",), - "os": ("RU",), - "pa": ("IN", "PK"), - "pap": ("AN", "AW", "CW"), - "pl": ("PL",), - "ps": ("AF",), - "pt": ("BR", "PT"), - "quz": ("PE",), - "raj": ("IN",), - "ro": ("RO",), - "ru": ("RU", "UA"), - "rw": ("RW",), - "sa": ("IN",), - "sat": ("IN",), - "sc": ("IT",), - "sd": ("IN", "PK"), - "se": ("NO",), - "shs": ("CA",), - "si": ("LK",), - "sid": ("ET",), - "sk": ("SK",), - "sl": ("SI",), - "so": ("DJ", "ET", "KE", "SO"), - "sq": ("AL", "ML"), - "sr": ("ME", "RS"), - "ss": ("ZA",), - "st": ("ZA",), - "sv": ("FI", "SE"), - "sw": ("KE", "TZ"), - "szl": ("PL",), - "ta": ("IN", "LK"), - "tcy": ("IN",), - "te": ("IN",), - "tg": ("TJ",), - "th": ("TH",), - "the": ("NP",), - "ti": ("ER", "ET"), - "tig": ("ER",), - "tk": ("TM",), - "tl": ("PH",), - "tn": ("ZA",), - "tr": ("CY", "TR"), - "ts": ("ZA",), - "tt": ("RU",), - "ug": ("CN",), - "uk": ("UA",), - "unm": ("US",), - "ur": ("IN", "PK"), - "uz": ("UZ",), - "ve": ("ZA",), - "vi": ("VN",), - "wa": ("BE",), - "wae": ("CH",), - "wal": ("ET",), - "wo": ("SN",), - "xh": ("ZA",), - "yi": ("US",), - "yo": ("NG",), - "yue": ("HK",), - "zh": ("CN", "HK", "SG", "TW"), - "zu": ("ZA",), - } - - def __init__(self, generator: Any) -> None: - """ - Base class for fake data providers - :param generator: `Generator` instance - """ - self.generator = generator - - def locale(self) -> str: - """Generate a random underscored i18n locale code (e.g. en_US).""" - - language_code = self.language_code() - return ( - language_code - + "_" - + self.random_element( - BaseProvider.language_locale_codes[language_code], - ) - ) - - def language_code(self) -> str: - """Generate a random i18n language code (e.g. en).""" - - return self.random_element(BaseProvider.language_locale_codes.keys()) - - def random_int(self, min: int = 0, max: int = 9999, step: int = 1) -> int: - """Generate a random integer between two integers ``min`` and ``max`` inclusive - while observing the provided ``step`` value. - - This method is functionally equivalent to randomly sampling an integer - from the sequence ``range(min, max + 1, step)``. - - :sample: min=0, max=15 - :sample: min=0, max=15, step=3 - """ - return self.generator.random.randrange(min, max + 1, step) - - def random_digit(self) -> int: - """Generate a random digit (0 to 9).""" - - return self.generator.random.randint(0, 9) - - def random_digit_not_null(self) -> int: - """Generate a random non-zero digit (1 to 9).""" - - return self.generator.random.randint(1, 9) - - def random_digit_above_two(self) -> int: - """Generate a random digit above value two (2 to 9).""" - - return self.generator.random.randint(2, 9) - - def random_digit_or_empty(self) -> Union[int, str]: - """Generate a random digit (0 to 9) or an empty string. - - This method will return an empty string 50% of the time, - and each digit has a 1/20 chance of being generated. - """ - - if self.generator.random.randint(0, 1): - return self.generator.random.randint(0, 9) - else: - return "" - - def random_digit_not_null_or_empty(self) -> Union[int, str]: - """Generate a random non-zero digit (1 to 9) or an empty string. - - This method will return an empty string 50% of the time, - and each digit has a 1/18 chance of being generated. - """ - - if self.generator.random.randint(0, 1): - return self.generator.random.randint(1, 9) - else: - return "" - - def random_number(self, digits: Optional[int] = None, fix_len: bool = False) -> int: - """Generate a random integer according to the following rules: - - - If ``digits`` is ``None`` (default), its value will be set to a random - integer from 1 to 9. - - If ``fix_len`` is ``False`` (default), all integers that do not exceed - the number of ``digits`` can be generated. - - If ``fix_len`` is ``True``, only integers with the exact number of - ``digits`` can be generated. - - :sample: fix_len=False - :sample: fix_len=True - :sample: digits=3 - :sample: digits=3, fix_len=False - :sample: digits=3, fix_len=True - """ - if digits is None: - digits = self.random_digit_not_null() - if digits < 0: - raise ValueError("The digit parameter must be greater than or equal to 0.") - if fix_len: - if digits > 0: - return self.generator.random.randint(pow(10, digits - 1), pow(10, digits) - 1) - else: - raise ValueError("A number of fixed length cannot have less than 1 digit in it.") - else: - return self.generator.random.randint(0, pow(10, digits) - 1) - - def random_letter(self) -> str: - """Generate a random ASCII letter (a-z and A-Z).""" - - return self.generator.random.choice(getattr(string, "letters", string.ascii_letters)) - - def random_letters(self, length: int = 16) -> Sequence[str]: - """Generate a list of random ASCII letters (a-z and A-Z) of the specified ``length``. - - :sample: length=10 - """ - return self.random_choices( - getattr(string, "letters", string.ascii_letters), - length=length, - ) - - def random_lowercase_letter(self) -> str: - """Generate a random lowercase ASCII letter (a-z).""" - - return self.generator.random.choice(string.ascii_lowercase) - - def random_uppercase_letter(self) -> str: - """Generate a random uppercase ASCII letter (A-Z).""" - - return self.generator.random.choice(string.ascii_uppercase) - - def random_elements( - self, - elements: ElementsType[T] = ("a", "b", "c"), # type: ignore[assignment] - length: Optional[int] = None, - unique: bool = False, - use_weighting: Optional[bool] = None, - ) -> Sequence[T]: - """Generate a list of randomly sampled objects from ``elements``. - - Set ``unique`` to ``False`` for random sampling with replacement, and set ``unique`` to - ``True`` for random sampling without replacement. - - If ``length`` is set to ``None`` or is omitted, ``length`` will be set to a random - integer from 1 to the size of ``elements``. - - The value of ``length`` cannot be greater than the number of objects - in ``elements`` if ``unique`` is set to ``True``. - - The value of ``elements`` can be any sequence type (``list``, ``tuple``, ``set``, - ``string``, etc) or an ``OrderedDict`` type. If it is the latter, the keys will be - used as the objects for sampling, and the values will be used as weighted probabilities - if ``unique`` is set to ``False``. For example: - - .. code-block:: python - - # Random sampling with replacement - fake.random_elements( - elements=OrderedDict([ - ("variable_1", 0.5), # Generates "variable_1" 50% of the time - ("variable_2", 0.2), # Generates "variable_2" 20% of the time - ("variable_3", 0.2), # Generates "variable_3" 20% of the time - ("variable_4": 0.1), # Generates "variable_4" 10% of the time - ]), unique=False - ) - - # Random sampling without replacement (defaults to uniform distribution) - fake.random_elements( - elements=OrderedDict([ - ("variable_1", 0.5), - ("variable_2", 0.2), - ("variable_3", 0.2), - ("variable_4": 0.1), - ]), unique=True - ) - - :sample: elements=('a', 'b', 'c', 'd'), unique=False - :sample: elements=('a', 'b', 'c', 'd'), unique=True - :sample: elements=('a', 'b', 'c', 'd'), length=10, unique=False - :sample: elements=('a', 'b', 'c', 'd'), length=4, unique=True - :sample: elements=OrderedDict([ - ("a", 0.45), - ("b", 0.35), - ("c", 0.15), - ("d", 0.05), - ]), length=20, unique=False - :sample: elements=OrderedDict([ - ("a", 0.45), - ("b", 0.35), - ("c", 0.15), - ("d", 0.05), - ]), unique=True - """ - use_weighting = use_weighting if use_weighting is not None else self.__use_weighting__ - - if isinstance(elements, dict) and not isinstance(elements, OrderedDict): - raise ValueError("Use OrderedDict only to avoid dependency on PYTHONHASHSEED (See #363).") - - fn = choices_distribution_unique if unique else choices_distribution - - if length is None: - length = self.generator.random.randint(1, len(elements)) - - if unique and length > len(elements): - raise ValueError("Sample length cannot be longer than the number of unique elements to pick from.") - - if isinstance(elements, dict): - if not hasattr(elements, "_key_cache"): - elements._key_cache = tuple(elements.keys()) # type: ignore - - choices = elements._key_cache # type: ignore[attr-defined, union-attr] - probabilities = tuple(elements.values()) if use_weighting else None - else: - if unique: - # shortcut - return self.generator.random.sample(elements, length) - choices = elements - probabilities = None - - return fn( - tuple(choices), - probabilities, - self.generator.random, - length=length, - ) - - def random_choices( - self, - elements: ElementsType[T] = ("a", "b", "c"), # type: ignore[assignment] - length: Optional[int] = None, - ) -> Sequence[T]: - """Generate a list of objects randomly sampled from ``elements`` with replacement. - - For information on the ``elements`` and ``length`` arguments, please refer to - :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which - is used under the hood with the ``unique`` argument explicitly set to ``False``. - - :sample: elements=('a', 'b', 'c', 'd') - :sample: elements=('a', 'b', 'c', 'd'), length=10 - :sample: elements=OrderedDict([ - ("a", 0.45), - ("b", 0.35), - ("c", 0.15), - ("d", 0.05), - ]) - :sample: elements=OrderedDict([ - ("a", 0.45), - ("b", 0.35), - ("c", 0.15), - ("d", 0.05), - ]), length=20 - """ - return self.random_elements(elements, length, unique=False) - - def random_element(self, elements: ElementsType[T] = ("a", "b", "c")) -> T: - """Generate a randomly sampled object from ``elements``. - - For information on the ``elements`` argument, please refer to - :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which - is used under the hood with the ``unique`` argument set to ``False`` and the - ``length`` argument set to ``1``. - - :sample: elements=('a', 'b', 'c', 'd') - :sample size=10: elements=OrderedDict([ - ("a", 0.45), - ("b", 0.35), - ("c", 0.15), - ("d", 0.05), - ]) - """ - - return self.random_elements(elements, length=1)[0] - - def random_sample( - self, elements: ElementsType[T] = ("a", "b", "c"), length: Optional[int] = None # type: ignore[assignment] - ) -> Sequence[T]: - """Generate a list of objects randomly sampled from ``elements`` without replacement. - - For information on the ``elements`` and ``length`` arguments, please refer to - :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which - is used under the hood with the ``unique`` argument explicitly set to ``True``. - - :sample: elements=('a', 'b', 'c', 'd', 'e', 'f') - :sample: elements=('a', 'b', 'c', 'd', 'e', 'f'), length=3 - """ - return self.random_elements(elements, length, unique=True) - - def randomize_nb_elements( - self, - number: int = 10, - le: bool = False, - ge: bool = False, - min: Optional[int] = None, - max: Optional[int] = None, - ) -> int: - """Generate a random integer near ``number`` according to the following rules: - - - If ``le`` is ``False`` (default), allow generation up to 140% of ``number``. - If ``True``, upper bound generation is capped at 100%. - - If ``ge`` is ``False`` (default), allow generation down to 60% of ``number``. - If ``True``, lower bound generation is capped at 100%. - - If a numerical value for ``min`` is provided, generated values less than ``min`` - will be clamped at ``min``. - - If a numerical value for ``max`` is provided, generated values greater than - ``max`` will be clamped at ``max``. - - If both ``le`` and ``ge`` are ``True``, the value of ``number`` will automatically - be returned, regardless of the values supplied for ``min`` and ``max``. - - :sample: number=100 - :sample: number=100, ge=True - :sample: number=100, ge=True, min=120 - :sample: number=100, le=True - :sample: number=100, le=True, max=80 - :sample: number=79, le=True, ge=True, min=80 - """ - if le and ge: - return number - _min = 100 if ge else 60 - _max = 100 if le else 140 - nb = int(number * self.generator.random.randint(_min, _max) / 100) - if min is not None and nb < min: - nb = min - if max is not None and nb > max: - nb = max - return nb - - def numerify(self, text: str = "###") -> str: - """Generate a string with each placeholder in ``text`` replaced according - to the following rules: - - - Number signs ('#') are replaced with a random digit (0 to 9). - - Percent signs ('%') are replaced with a random non-zero digit (1 to 9). - - Dollar signs ('$') are replaced with a random digit above two (2 to 9). - - Exclamation marks ('!') are replaced with a random digit or an empty string. - - At symbols ('@') are replaced with a random non-zero digit or an empty string. - - Under the hood, this method uses :meth:`random_digit() <faker.providers.BaseProvider.random_digit>`, - :meth:`random_digit_not_null() <faker.providers.BaseProvider.random_digit_not_null>`, - :meth:`random_digit_or_empty() <faker.providers.BaseProvider.random_digit_or_empty>`, - and :meth:`random_digit_not_null_or_empty() <faker.providers.BaseProvider.random_digit_not_null_or_empty>` - to generate the random values. - - :sample: text='Intel Core i%-%%##K vs AMD Ryzen % %%##X' - :sample: text='!!! !!@ !@! !@@ @!! @!@ @@! @@@' - """ - text = _re_hash.sub(lambda x: str(self.random_digit()), text) - text = _re_perc.sub(lambda x: str(self.random_digit_not_null()), text) - text = _re_dol.sub(lambda x: str(self.random_digit_above_two()), text) - text = _re_excl.sub(lambda x: str(self.random_digit_or_empty()), text) - text = _re_at.sub(lambda x: str(self.random_digit_not_null_or_empty()), text) - return text - - def lexify(self, text: str = "????", letters: str = string.ascii_letters) -> str: - """Generate a string with each question mark ('?') in ``text`` - replaced with a random character from ``letters``. - - By default, ``letters`` contains all ASCII letters, uppercase and lowercase. - - :sample: text='Random Identifier: ??????????' - :sample: text='Random Identifier: ??????????', letters='ABCDE' - """ - return _re_qm.sub(lambda x: self.random_element(letters), text) - - def bothify(self, text: str = "## ??", letters: str = string.ascii_letters) -> str: - """Generate a string with each placeholder in ``text`` replaced according to the following rules: - - - Number signs ('#') are replaced with a random digit (0 to 9). - - Question marks ('?') are replaced with a random character from ``letters``. - - By default, ``letters`` contains all ASCII letters, uppercase and lowercase. - - Under the hood, this method uses :meth:`numerify() <faker.providers.BaseProvider.numerify>` and - and :meth:`lexify() <faker.providers.BaseProvider.lexify>` to generate random values for number - signs and question marks respectively. - - :sample: letters='ABCDE' - :sample: text='Product Number: ????-########' - :sample: text='Product Number: ????-########', letters='ABCDE' - """ - return self.lexify(self.numerify(text), letters=letters) - - def hexify(self, text: str = "^^^^", upper: bool = False) -> str: - """Generate a string with each circumflex ('^') in ``text`` - replaced with a random hexadecimal character. - - By default, ``upper`` is set to False. If set to ``True``, output - will be formatted using uppercase hexadecimal characters. - - :sample: text='MAC Address: ^^:^^:^^:^^:^^:^^' - :sample: text='MAC Address: ^^:^^:^^:^^:^^:^^', upper=True - """ - letters = string.hexdigits[:-6] - if upper: - letters = letters.upper() - return _re_cir.sub(lambda x: self.random_element(letters), text) - - -class DynamicProvider(BaseProvider): - def __init__( - self, - provider_name: str, - elements: Optional[List] = None, - generator: Optional[Any] = None, - ): - """ - A faker Provider capable of getting a list of elements to randomly select from, - instead of using the predefined list of elements which exist in the default providers in faker. - - :param provider_name: Name of provider, which would translate into the function name e.g. faker.my_fun(). - :param elements: List of values to randomly select from - :param generator: Generator object. If missing, the default Generator is used. - - :example: - >>>from faker import Faker - >>>from faker.providers import DynamicProvider - - >>>medical_professions_provider = DynamicProvider( - >>> provider_name="medical_profession", - >>> elements=["dr.", "doctor", "nurse", "surgeon", "clerk"], - >>>) - >>>fake = Faker() - >>>fake.add_provider(medical_professions_provider) - - >>>fake.medical_profession() - "dr." - - """ - - if not generator: - generator = Generator() - super().__init__(generator) - if provider_name.startswith("__"): - raise ValueError("Provider name cannot start with __ as it would be ignored by Faker") - - self.provider_name = provider_name - - self.elements = [] - if elements: - self.elements = elements - - setattr(self, provider_name, self.get_random_value) # Add a method for the provider_name value - - def add_element(self, element: str) -> None: - """Add new element.""" - self.elements.append(element) - - def get_random_value(self, use_weighting: bool = True) -> Any: - """Returns a random value for this provider. - - :param use_weighting: boolean option to use weighting. Defaults to True - """ - if not self.elements or len(self.elements) == 0: - raise ValueError("Elements should be a list of values the provider samples from") - - return self.random_elements(self.elements, length=1, use_weighting=use_weighting)[0] |