| 135 | return requests |
| 136 | |
| 137 | def from_method( |
| 138 | self, method: Callable[..., Any], results: TestResult |
| 139 | ) -> Request | None: |
| 140 | contracts = self.extract_contracts(method) |
| 141 | if contracts: |
| 142 | request_cls = Request |
| 143 | for contract in contracts: |
| 144 | if contract.request_cls is not None: |
| 145 | request_cls = contract.request_cls |
| 146 | |
| 147 | # calculate request args |
| 148 | args, kwargs = get_spec(request_cls.__init__) |
| 149 | |
| 150 | # Don't filter requests to allow |
| 151 | # testing different callbacks on the same URL. |
| 152 | kwargs["dont_filter"] = True |
| 153 | kwargs["callback"] = method |
| 154 | |
| 155 | for contract in contracts: |
| 156 | kwargs = contract.adjust_request_args(kwargs) |
| 157 | |
| 158 | args.remove("self") |
| 159 | |
| 160 | # check if all positional arguments are defined in kwargs |
| 161 | if set(args).issubset(set(kwargs)): |
| 162 | request = request_cls(**kwargs) |
| 163 | |
| 164 | # execute pre and post hooks in order |
| 165 | for contract in reversed(contracts): |
| 166 | request = contract.add_pre_hook(request, results) |
| 167 | for contract in contracts: |
| 168 | request = contract.add_post_hook(request, results) |
| 169 | |
| 170 | self._clean_req(request, method, results) |
| 171 | return request |
| 172 | return None |
| 173 | |
| 174 | def _clean_req( |
| 175 | self, request: Request, method: Callable[..., Any], results: TestResult |