summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/faker/generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/generator.py')
-rw-r--r--venv/lib/python3.11/site-packages/faker/generator.py191
1 files changed, 191 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/generator.py b/venv/lib/python3.11/site-packages/faker/generator.py
new file mode 100644
index 0000000..5eda964
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/generator.py
@@ -0,0 +1,191 @@
+import random as random_module
+import re
+
+from typing import TYPE_CHECKING, Any, Callable, Dict, Hashable, List, Optional, Type, Union
+
+from .typing import SeedType
+
+if TYPE_CHECKING:
+ from .providers import BaseProvider
+
+_re_token = re.compile(r"\{\{\s*(\w+)(:\s*\w+?)?\s*\}\}")
+random = random_module.Random()
+mod_random = random # compat with name released in 0.8
+
+
+Sentinel = object()
+
+
+class Generator:
+ __config: Dict[str, Dict[Hashable, Any]] = {
+ "arguments": {},
+ }
+
+ _is_seeded = False
+ _global_seed = Sentinel
+
+ def __init__(self, **config: Dict) -> None:
+ self.providers: List["BaseProvider"] = []
+ self.__config = dict(list(self.__config.items()) + list(config.items()))
+ self.__random = random
+
+ def add_provider(self, provider: Union["BaseProvider", Type["BaseProvider"]]) -> None:
+ if isinstance(provider, type):
+ provider = provider(self)
+
+ self.providers.insert(0, provider)
+
+ for method_name in dir(provider):
+ # skip 'private' method
+ if method_name.startswith("_"):
+ continue
+
+ faker_function = getattr(provider, method_name)
+
+ if callable(faker_function):
+ # add all faker method to generator
+ self.set_formatter(method_name, faker_function)
+
+ def provider(self, name: str) -> Optional["BaseProvider"]:
+ try:
+ lst = [p for p in self.get_providers() if hasattr(p, "__provider__") and p.__provider__ == name.lower()]
+ return lst[0]
+ except IndexError:
+ return None
+
+ def get_providers(self) -> List["BaseProvider"]:
+ """Returns added providers."""
+ return self.providers
+
+ @property
+ def random(self) -> random_module.Random:
+ return self.__random
+
+ @random.setter
+ def random(self, value: random_module.Random) -> None:
+ self.__random = value
+
+ def seed_instance(self, seed: Optional[SeedType] = None) -> "Generator":
+ """Calls random.seed"""
+ if self.__random == random:
+ # create per-instance random obj when first time seed_instance() is
+ # called
+ self.__random = random_module.Random()
+ self.__random.seed(seed)
+ self._is_seeded = True
+ return self
+
+ @classmethod
+ def seed(cls, seed: Optional[SeedType] = None) -> None:
+ random.seed(seed)
+ cls._global_seed = seed
+ cls._is_seeded = True
+
+ def format(self, formatter: str, *args: Any, **kwargs: Any) -> str:
+ """
+ This is a secure way to make a fake from another Provider.
+ """
+ return self.get_formatter(formatter)(*args, **kwargs)
+
+ def get_formatter(self, formatter: str) -> Callable:
+ try:
+ return getattr(self, formatter)
+ except AttributeError:
+ if "locale" in self.__config:
+ msg = f'Unknown formatter {formatter!r} with locale {self.__config["locale"]!r}'
+ else:
+ raise AttributeError(f"Unknown formatter {formatter!r}")
+ raise AttributeError(msg)
+
+ def set_formatter(self, name: str, formatter: Callable) -> None:
+ """
+ This method adds a provider method to generator.
+ Override this method to add some decoration or logging stuff.
+ """
+ setattr(self, name, formatter)
+
+ def set_arguments(self, group: str, argument: str, value: Optional[Any] = None) -> None:
+ """
+ Creates an argument group, with an individual argument or a dictionary
+ of arguments. The argument groups is used to apply arguments to tokens,
+ when using the generator.parse() method. To further manage argument
+ groups, use get_arguments() and del_arguments() methods.
+
+ generator.set_arguments('small', 'max_value', 10)
+ generator.set_arguments('small', {'min_value': 5, 'max_value': 10})
+ """
+ if group not in self.__config["arguments"]:
+ self.__config["arguments"][group] = {}
+
+ if isinstance(argument, dict):
+ self.__config["arguments"][group] = argument
+ elif not isinstance(argument, str):
+ raise ValueError("Arguments must be either a string or dictionary")
+ else:
+ self.__config["arguments"][group][argument] = value
+
+ def get_arguments(self, group: str, argument: Optional[str] = None) -> Any:
+ """
+ Get the value of an argument configured within a argument group, or
+ the entire group as a dictionary. Used in conjunction with the
+ set_arguments() method.
+
+ generator.get_arguments('small', 'max_value')
+ generator.get_arguments('small')
+ """
+ if group in self.__config["arguments"] and argument:
+ result = self.__config["arguments"][group].get(argument)
+ else:
+ result = self.__config["arguments"].get(group)
+
+ return result
+
+ def del_arguments(self, group: str, argument: Optional[str] = None) -> Any:
+ """
+ Delete an argument from an argument group or the entire argument group.
+ Used in conjunction with the set_arguments() method.
+
+ generator.del_arguments('small')
+ generator.del_arguments('small', 'max_value')
+ """
+ if group in self.__config["arguments"]:
+ if argument:
+ result = self.__config["arguments"][group].pop(argument)
+ else:
+ result = self.__config["arguments"].pop(group)
+ else:
+ result = None
+
+ return result
+
+ def parse(self, text: str) -> str:
+ """
+ Replaces tokens like '{{ tokenName }}' or '{{tokenName}}' in a string with
+ the result from the token method call. Arguments can be parsed by using an
+ argument group. For more information on the use of argument groups, please
+ refer to the set_arguments() method.
+
+ Example:
+
+ generator.set_arguments('red_rgb', {'hue': 'red', 'color_format': 'rgb'})
+ generator.set_arguments('small', 'max_value', 10)
+
+ generator.parse('{{ color:red_rgb }} - {{ pyint:small }}')
+ """
+ return _re_token.sub(self.__format_token, text)
+
+ def __format_token(self, matches):
+ formatter, argument_group = list(matches.groups())
+ argument_group = argument_group.lstrip(":").strip() if argument_group else ""
+
+ if argument_group:
+ try:
+ arguments = self.__config["arguments"][argument_group]
+ except KeyError:
+ raise AttributeError(f"Unknown argument group {argument_group!r}")
+
+ formatted = str(self.format(formatter, **arguments))
+ else:
+ formatted = str(self.format(formatter))
+
+ return "".join(formatted)