Lookup API response doesn't match OpenAPI spec causing PersonIsMemberOfGroup200ResponseResult to raise pydantic exception
The Lookup API returns a string "true"/"false" while the generated PersonIsMemberOfGroup200ResponseResult expects a bool as per the Lookup OpenAPI spec. When pydantic validates the return response, the client throws an error and exits.
Relevant part of the Lookup OpenAPI spec: https://gitlab.developers.cam.ac.uk/uis/devops/iam/identity-lib/-/blob/main/specs/lookup.yaml?ref_type=heads#L2216
Example exception:
webapp-1 | File "/usr/src/app/rewards/identity_services.py", line 55, in get_person_groups
webapp-1 | response = person_api_client.person_is_member_of_group(
webapp-1 | scheme="crsid", identifier="av603", groupid="108131"
webapp-1 | )
webapp-1 | File "/usr/local/lib/python3.13/site-packages/pydantic/_internal/_validate_call.py", line 39, in wrapper_function
webapp-1 | return wrapper(*args, **kwargs)
webapp-1 | File "/usr/local/lib/python3.13/site-packages/pydantic/_internal/_validate_call.py", line 136, in __call__
webapp-1 | res = self.__pydantic_validator__.validate_python(pydantic_core.ArgsKwargs(args, kwargs))
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api/person_api.py", line 2710, in person_is_member_of_group
webapp-1 | return self.api_client.response_deserialize(
webapp-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
webapp-1 | response_data=response_data,
webapp-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
webapp-1 | response_types_map=_response_types_map,
webapp-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
webapp-1 | ).data
webapp-1 | ^
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 320, in response_deserialize
webapp-1 | return_data = self.deserialize(response_text, response_type)
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 404, in deserialize
webapp-1 | return self.__deserialize(data, response_type)
webapp-1 | ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 449, in __deserialize
webapp-1 | return self.__deserialize_model(data, klass)
webapp-1 | ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/api_client.py", line 770, in __deserialize_model
webapp-1 | return klass.from_dict(data)
webapp-1 | ~~~~~~~~~~~~~~~^^^^^^
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/models/person_is_member_of_group200_response.py", line 87, in from_dict
webapp-1 | "result": PersonIsMemberOfGroup200ResponseResult.from_dict(obj["result"]) if obj.get("result") is not None else None
webapp-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
webapp-1 | File "/usr/local/lib/python3.13/site-packages/identitylib/lookup_client/models/person_is_member_of_group200_response_result.py", line 82, in from_dict
webapp-1 | _obj = cls.model_validate({
webapp-1 | "value": obj.get("value")
webapp-1 | })
webapp-1 | File "/usr/local/lib/python3.13/site-packages/pydantic/main.py", line 703, in model_validate
webapp-1 | return cls.__pydantic_validator__.validate_python(
webapp-1 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
webapp-1 | obj, strict=strict, from_attributes=from_attributes, context=context, by_alias=by_alias, by_name=by_name
webapp-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
webapp-1 | )
webapp-1 | ^
webapp-1 | pydantic_core._pydantic_core.ValidationError: 1 validation error for PersonIsMemberOfGroup200ResponseResult
webapp-1 | value
webapp-1 | Input should be a valid boolean [type=bool_type, input_value='true', input_type=str]
webapp-1 | For further information visit https://errors.pydantic.dev/2.11/v/bool_type
Edited by Andrew Vella