(self, function, args=None)
| 69 | """Defines the per-function singleton applied to hugged functions defining common data needed by all interfaces""" |
| 70 | |
| 71 | def __init__(self, function, args=None): |
| 72 | self.api = hug.api.from_object(function) |
| 73 | self.spec = getattr(function, "original", function) |
| 74 | self.arguments = introspect.arguments(function) |
| 75 | self.name = introspect.name(function) |
| 76 | self._function = function |
| 77 | |
| 78 | self.is_coroutine = introspect.is_coroutine(self.spec) |
| 79 | if self.is_coroutine: |
| 80 | self.spec = getattr(self.spec, "__wrapped__", self.spec) |
| 81 | |
| 82 | self.takes_args = introspect.takes_args(self.spec) |
| 83 | self.takes_kwargs = introspect.takes_kwargs(self.spec) |
| 84 | |
| 85 | self.parameters = list(introspect.arguments(self.spec, self.takes_kwargs + self.takes_args)) |
| 86 | if self.takes_kwargs: |
| 87 | self.kwarg = self.parameters.pop(-1) |
| 88 | if self.takes_args: |
| 89 | self.arg = self.parameters.pop(-1) |
| 90 | self.parameters = tuple(self.parameters) |
| 91 | self.defaults = dict(zip(reversed(self.parameters), reversed(self.spec.__defaults__ or ()))) |
| 92 | self.required = self.parameters[: -(len(self.spec.__defaults__ or ())) or None] |
| 93 | self.is_method = introspect.is_method(self.spec) or introspect.is_method(function) |
| 94 | if self.is_method: |
| 95 | self.required = self.required[1:] |
| 96 | self.parameters = self.parameters[1:] |
| 97 | |
| 98 | self.all_parameters = set(self.parameters) |
| 99 | if self.spec is not function: |
| 100 | self.all_parameters.update(self.arguments) |
| 101 | |
| 102 | if args is not None: |
| 103 | transformers = args |
| 104 | else: |
| 105 | transformers = self.spec.__annotations__ |
| 106 | |
| 107 | self.transform = transformers.get("return", None) |
| 108 | self.directives = {} |
| 109 | self.input_transformations = {} |
| 110 | for name, transformer in transformers.items(): |
| 111 | if isinstance(transformer, str): |
| 112 | continue |
| 113 | elif hasattr(transformer, "directive"): |
| 114 | self.directives[name] = transformer |
| 115 | continue |
| 116 | |
| 117 | if hasattr(transformer, "from_string"): |
| 118 | transformer = transformer.from_string |
| 119 | elif hasattr(transformer, "load"): |
| 120 | transformer = MarshmallowInputSchema(transformer) |
| 121 | elif hasattr(transformer, "deserialize"): |
| 122 | transformer = transformer.deserialize |
| 123 | |
| 124 | self.input_transformations[name] = transformer |
| 125 | |
| 126 | def __call__(__hug_internal_self, *args, **kwargs): # noqa: N805 |
| 127 | """"Calls the wrapped function, uses __hug_internal_self incase self is passed in as a kwarg from the wrapper""" |
nothing calls this directly
no test coverage detected