summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/faker/documentor.py
diff options
context:
space:
mode:
authorcyfraeviolae <cyfraeviolae>2024-04-03 03:10:44 -0400
committercyfraeviolae <cyfraeviolae>2024-04-03 03:10:44 -0400
commit6d7ba58f880be618ade07f8ea080fe8c4bf8a896 (patch)
treeb1c931051ffcebd2bd9d61d98d6233ffa289bbce /venv/lib/python3.11/site-packages/faker/documentor.py
parent4f884c9abc32990b4061a1bb6997b4b37e58ea0b (diff)
venv
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/documentor.py')
-rw-r--r--venv/lib/python3.11/site-packages/faker/documentor.py127
1 files changed, 127 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/documentor.py b/venv/lib/python3.11/site-packages/faker/documentor.py
new file mode 100644
index 0000000..0dbce60
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/documentor.py
@@ -0,0 +1,127 @@
+import inspect
+import warnings
+
+from enum import Enum, auto
+from typing import Any, Dict, List, Optional, Tuple, Type, Union
+
+from .generator import Generator
+from .providers import BaseProvider
+from .proxy import Faker
+
+
+class FakerEnum(Enum):
+ """Required for faker.providers.enum"""
+
+ A = auto
+ B = auto
+
+
+class Documentor:
+ def __init__(self, generator: Union[Generator, Faker]) -> None:
+ """
+ :param generator: a localized Generator with providers filled,
+ for which to write the documentation
+ :type generator: faker.Generator()
+ """
+ self.generator = generator
+ self.max_name_len: int = 0
+ self.already_generated: List[str] = []
+
+ def get_formatters(
+ self,
+ locale: Optional[str] = None,
+ excludes: Optional[List[str]] = None,
+ **kwargs: Any,
+ ) -> List[Tuple[BaseProvider, Dict[str, str]]]:
+ self.max_name_len = 0
+ self.already_generated = [] if excludes is None else excludes[:]
+ formatters = []
+ providers: List[BaseProvider] = self.generator.get_providers()
+ for provider in providers[::-1]: # reverse
+ if locale and provider.__lang__ and provider.__lang__ != locale:
+ continue
+ formatters.append(
+ (provider, self.get_provider_formatters(provider, **kwargs)),
+ )
+ return formatters
+
+ def get_provider_formatters(
+ self,
+ provider: BaseProvider,
+ prefix: str = "fake.",
+ with_args: bool = True,
+ with_defaults: bool = True,
+ ) -> Dict[str, str]:
+ formatters = {}
+
+ for name, method in inspect.getmembers(provider, inspect.ismethod):
+ # skip 'private' method and inherited methods
+ if name.startswith("_") or name in self.already_generated:
+ continue
+
+ arguments = []
+ faker_args: List[Union[str, Type[Enum]]] = []
+ faker_kwargs = {}
+
+ if name == "binary":
+ faker_kwargs["length"] = 1024
+ elif name in ["zip", "tar"]:
+ faker_kwargs.update(
+ {
+ "uncompressed_size": 1024,
+ "min_file_size": 512,
+ }
+ )
+
+ if name == "enum":
+ faker_args = [FakerEnum]
+
+ if with_args:
+ # retrieve all parameter
+ argspec = inspect.getfullargspec(method)
+
+ lst = [x for x in argspec.args if x not in ["self", "cls"]]
+ for i, arg in enumerate(lst):
+ if argspec.defaults and with_defaults:
+ try:
+ default = argspec.defaults[i]
+ if isinstance(default, str):
+ default = repr(default)
+ else:
+ # TODO check default type
+ default = f"{default}"
+
+ arg = f"{arg}={default}"
+
+ except IndexError:
+ pass
+
+ arguments.append(arg)
+ if with_args == "first":
+ break
+
+ if with_args != "first":
+ if argspec.varargs:
+ arguments.append("*" + argspec.varargs)
+ if argspec.varkw:
+ arguments.append("**" + argspec.varkw)
+
+ # build fake method signature
+ signature = f"{prefix}{name}({', '.join(arguments)})"
+
+ try:
+ # make a fake example
+ example = self.generator.format(name, *faker_args, **faker_kwargs)
+ except (AttributeError, ValueError) as e:
+ warnings.warn(str(e))
+ continue
+ formatters[signature] = example
+
+ self.max_name_len = max(self.max_name_len, *(len(part) for part in signature.split()))
+ self.already_generated.append(name)
+
+ return formatters
+
+ @staticmethod
+ def get_provider_name(provider_class: BaseProvider) -> str:
+ return provider_class.__provider__