(
self,
ids: Iterable[Union[None, str, float, int, bool]],
parameters: Sequence[ParameterSet],
func_name: str,
)
| 1206 | return idmaker(argnames, parameters, idfn, ids_, self.config, nodeid=nodeid) |
| 1207 | |
| 1208 | def _validate_ids( |
| 1209 | self, |
| 1210 | ids: Iterable[Union[None, str, float, int, bool]], |
| 1211 | parameters: Sequence[ParameterSet], |
| 1212 | func_name: str, |
| 1213 | ) -> List[Union[None, str]]: |
| 1214 | try: |
| 1215 | num_ids = len(ids) # type: ignore[arg-type] |
| 1216 | except TypeError: |
| 1217 | try: |
| 1218 | iter(ids) |
| 1219 | except TypeError as e: |
| 1220 | raise TypeError("ids must be a callable or an iterable") from e |
| 1221 | num_ids = len(parameters) |
| 1222 | |
| 1223 | # num_ids == 0 is a special case: https://github.com/pytest-dev/pytest/issues/1849 |
| 1224 | if num_ids != len(parameters) and num_ids != 0: |
| 1225 | msg = "In {}: {} parameter sets specified, with different number of ids: {}" |
| 1226 | fail(msg.format(func_name, len(parameters), num_ids), pytrace=False) |
| 1227 | |
| 1228 | new_ids = [] |
| 1229 | for idx, id_value in enumerate(itertools.islice(ids, num_ids)): |
| 1230 | if id_value is None or isinstance(id_value, str): |
| 1231 | new_ids.append(id_value) |
| 1232 | elif isinstance(id_value, (float, int, bool)): |
| 1233 | new_ids.append(str(id_value)) |
| 1234 | else: |
| 1235 | msg = ( # type: ignore[unreachable] |
| 1236 | "In {}: ids must be list of string/float/int/bool, " |
| 1237 | "found: {} (type: {!r}) at index {}" |
| 1238 | ) |
| 1239 | fail( |
| 1240 | msg.format(func_name, saferepr(id_value), type(id_value), idx), |
| 1241 | pytrace=False, |
| 1242 | ) |
| 1243 | return new_ids |
| 1244 | |
| 1245 | def _resolve_arg_value_types( |
| 1246 | self, |
no test coverage detected