--- Begin Message ---
Source: fastapi
Version: 0.115.11-4
Severity: serious
Tags: ftbfs
Forwarded: https://github.com/fastapi/fastapi/pull/14036
fastapi FTBFS and fails its autopkgtests with the current version of
pydantic in unstable (2.12.0~a1-1 - I had no choice but to package an
alpha release in this case because there was no other combination of
pydantic/pydantic-core/etc. versions that was usable with the current
rust-pyo3 transition).
You can see the autopkgtest failure in
https://ci.debian.net/packages/f/fastapi/testing/amd64/64021591/, and
here's a version of the failure with "pytest -vv":
_____________________________ test_openapi_schema
______________________________
def test_openapi_schema():
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
> assert response.json() == {
"openapi": "3.1.0",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/items/": {
"post": {
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema":
{}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref":
"#/components/schemas/HTTPValidationError"
}
}
},
},
},
"summary": "Save Item No Body",
"operationId": "save_item_no_body_items__post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"title": "Item",
"type": "array",
"items": {"$ref":
"#/components/schemas/Item"},
}
}
},
"required": True,
},
}
}
},
"components": {
"schemas": {
"Item": {
"title": "Item",
"required": ["name", "age"],
"type": "object",
"properties": {
"name": {"title": "Name", "type": "string"},
"age": IsDict(
{
"title": "Age",
"anyOf": [
{"exclusiveMinimum": 0.0, "type":
"number"},
{"type": "string"},
],
}
)
| IsDict(
# TODO: remove when deprecating Pydantic v1
{
"title": "Age",
"exclusiveMinimum": 0.0,
"type": "number",
}
),
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {
"anyOf": [{"type": "string"}, {"type":
"integer"}]
},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {"$ref":
"#/components/schemas/ValidationError"},
}
},
},
}
},
}
E AssertionError: assert {'openapi': '3.1.0', 'info': {'title':
'FastAPI', 'version': '0.1.0'}, 'paths': {'/items/': {'post': {'summary': 'Save
Item No Body', 'operationId': 'save_item_no_body_items__post', 'requestBody':
{'content': {'application/json': {'schema': {'items': {'$ref':
'#/components/schemas/Item'}, 'type': 'array', 'title': 'Item'}}}, 'required':
True}, 'responses': {'200': {'description': 'Successful Response', 'content':
{'application/json': {'schema': {}}}}, '422': {'description': 'Validation
Error', 'content': {'application/json': {'schema': {'$ref':
'#/components/schemas/HTTPValidationError'}}}}}}}}, 'components': {'schemas':
{'HTTPValidationError': {'properties': {'detail': {'items': {'$ref':
'#/components/schemas/ValidationError'}, 'type': 'array', 'title': 'Detail'}},
'type': 'object', 'title': 'HTTPValidationError'}, 'Item': {'properties':
{'name': {'type': 'string', 'title': 'Name'}, 'age': {'anyOf': [{'type':
'number', 'exclusiveMinimum': 0.0}, {'type': 'string', 'pattern':
'^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$'}], 'title': 'Age'}}, 'type': 'object',
'required': ['name', 'age'], 'title': 'Item'}, 'ValidationError':
{'properties': {'loc': {'items': {'anyOf': [{'type': 'string'}, {'type':
'integer'}]}, 'type': 'array', 'title': 'Location'}, 'msg': {'type': 'string',
'title': 'Message'}, 'type': {'type': 'string', 'title': 'Error Type'}},
'type': 'object', 'required': ['loc', 'msg', 'type'], 'title':
'ValidationError'}}}} == {'openapi': '3.1.0', 'info': {'title': 'FastAPI',
'version': '0.1.0'}, 'paths': {'/items/': {'post': {'responses': {'200':
{'description': 'Successful Response', 'content': {'application/json':
{'schema': {}}}}, '422': {'description': 'Validation Error', 'content':
{'application/json': {'schema': {'$ref':
'#/components/schemas/HTTPValidationError'}}}}}, 'summary': 'Save Item No
Body', 'operationId': 'save_item_no_body_items__post', 'requestBody':
{'content': {'application/json': {'schema': {'title': 'Item', 'type': 'array',
'items': {'$ref': '#/components/schemas/Item'}}}}, 'required': True}}}},
'components': {'schemas': {'Item': {'title': 'Item', 'required': ['name',
'age'], 'type': 'object', 'properties': {'name': {'title': 'Name', 'type':
'string'}, 'age': IsDict(title='Age', anyOf=[{'exclusiveMinimum': 0.0, 'type':
'number'}, {'type': 'string'}]) | IsDict(title='Age', exclusiveMinimum=0.0,
type='number')}}, 'ValidationError': {'title': 'ValidationError', 'required':
['loc', 'msg', 'type'], 'type': 'object', 'properties': {'loc': {'title':
'Location', 'type': 'array', 'items': {'anyOf': [{'type': 'string'}, {'type':
'integer'}]}}, 'msg': {'title': 'Message', 'type': 'string'}, 'type': {'title':
'Error Type', 'type': 'string'}}}, 'HTTPValidationError': {'title':
'HTTPValidationError', 'type': 'object', 'properties': {'detail': {'title':
'Detail', 'type': 'array', 'items': {'$ref':
'#/components/schemas/ValidationError'}}}}}}}
E
E Common items:
E {'info': {'title': 'FastAPI', 'version': '0.1.0'},
E 'openapi': '3.1.0',
E 'paths': {'/items/': {'post': {'operationId':
'save_item_no_body_items__post',
E 'requestBody': {'content':
{'application/json': {'schema': {'items': {'$ref': '#/components/schemas/Item'},
E
'title': 'Item',
E
'type': 'array'}}},
E 'required': True},
E 'responses': {'200': {'content':
{'application/json': {'schema': {}}},
E
'description': 'Successful '
E
'Response'},
E '422': {'content':
{'application/json': {'schema': {'$ref':
'#/components/schemas/HTTPValidationError'}}},
E
'description': 'Validation '
E
'Error'}},
E 'summary': 'Save Item No Body'}}}}
E Differing items:
E {'components': {'schemas': {'HTTPValidationError': {'properties':
{'detail': {'items': {...}, 'title': 'Detail', 'type... 'Error Type', 'type':
'string'}}, 'required': ['loc', 'msg', 'type'], 'title': 'ValidationError',
'type': 'object'}}}} != {'components': {'schemas': {'HTTPValidationError':
{'properties': {'detail': {'items': {...}, 'title': 'Detail', 'type... 'Error
Type', 'type': 'string'}}, 'required': ['loc', 'msg', 'type'], 'title':
'ValidationError', 'type': 'object'}}}}
E
E Full diff:
E {
E 'components': {
E 'schemas': {
E 'HTTPValidationError': {
E 'properties': {
E 'detail': {
E 'items': {
E '$ref':
'#/components/schemas/ValidationError',
E },
E 'title': 'Detail',
E 'type': 'array',
E },
E },
E 'title': 'HTTPValidationError',
E 'type': 'object',
E },
E 'Item': {
E 'properties': {
E - 'age': IsDict(title='Age',
anyOf=[{'exclusiveMinimum': 0.0, 'type': 'number'}, {'type': 'string'}]) |
IsDict(title='Age', exclusiveMinimum=0.0, type='number'),
E + 'age': {
E + 'anyOf': [
E + {
E + 'exclusiveMinimum': 0.0,
E + 'type': 'number',
E + },
E + {
E + 'pattern':
'^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$',
E + 'type': 'string',
E + },
E + ],
E + 'title': 'Age',
E + },
E 'name': {
E 'title': 'Name',
E 'type': 'string',
E },
E },
E 'required': [
E 'name',
E 'age',
E ],
E 'title': 'Item',
E 'type': 'object',
E },
E 'ValidationError': {
E 'properties': {
E 'loc': {
E 'items': {
E 'anyOf': [
E {
E 'type': 'string',
E },
E {
E 'type': 'integer',
E },
E ],
E },
E 'title': 'Location',
E 'type': 'array',
E },
E 'msg': {
E 'title': 'Message',
E 'type': 'string',
E },
E 'type': {
E 'title': 'Error Type',
E 'type': 'string',
E },
E },
E 'required': [
E 'loc',
E 'msg',
E 'type',
E ],
E 'title': 'ValidationError',
E 'type': 'object',
E },
E },
E },
E 'info': {
E 'title': 'FastAPI',
E 'version': '0.1.0',
E },
E 'openapi': '3.1.0',
E 'paths': {
E '/items/': {
E 'post': {
E 'operationId': 'save_item_no_body_items__post',
E 'requestBody': {
E 'content': {
E 'application/json': {
E 'schema': {
E 'items': {
E '$ref':
'#/components/schemas/Item',
E },
E 'title': 'Item',
E 'type': 'array',
E },
E },
E },
E 'required': True,
E },
E 'responses': {
E '200': {
E 'content': {
E 'application/json': {
E 'schema': {},
E },
E },
E 'description': 'Successful Response',
E },
E '422': {
E 'content': {
E 'application/json': {
E 'schema': {
E '$ref':
'#/components/schemas/HTTPValidationError',
E },
E },
E },
E 'description': 'Validation Error',
E },
E },
E 'summary': 'Save Item No Body',
E },
E },
E },
E }
tests/test_multi_body_errors.py:136: AssertionError
I pushed an upstream PR to fix this. Perhaps you could cherry-pick it into
Debian?
https://github.com/fastapi/fastapi/pull/14036
At build time there are four more failures in
tests/test_forms_single_model.py; I'm not sure why they don't show up in
autopkgtests. They all seem to be essentially this warning:
pydantic.warnings.UnsupportedFieldAttributeWarning: The 'alias' attribute
with value 'with' was provided to the `Field()` function, which has no effect
in the context it was used. 'alias' is field-specific metadata, and can only be
attached to a model field using `Annotated` metadata or by assignment. This may
have happened because an `Annotated` type alias using the `type` statement was
used, or if the `Field()` function was attached to a single member of a union
type.
This is due to https://github.com/pydantic/pydantic/pull/12028. I
haven't had time to look into it properly yet, although I can if you
need me to.
Thanks,
--
Colin Watson (he/him) [[email protected]]
--- End Message ---