resolved RESOLVED UNSUBMITTED PASS ยท None tool calls ยท 0 s ยท fastapi/fastapi
๐ Fix OpenAPI security scheme OAuth2 scopes declaration, deduplicate security schemes with different scopes ๐ Fix OpenAPI security scheme OAuth2 scopes declaration, deduplicate security schemes with different scopes This should fix https://github.com/fastapi/fastapi/issues/14454
| # | Tool | Arguments | Result |
|---|---|---|---|
| No trace captured. | |||
--- a/fastapi/openapi/utils.py
+++ b/fastapi/openapi/utils.py
@@ -79,7 +79,8 @@ def get_openapi_security_definitions(
flat_dependant: Dependant,
) -> Tuple[Dict[str, Any], List[Dict[str, Any]]]:
security_definitions = {}
- operation_security = []
+ # Use a dict to merge scopes for same security scheme
+ operation_security_dict: Dict[str, List[str]] = {}
for security_requirement in flat_dependant.security_requirements:
security_definition = jsonable_encoder(
security_requirement.security_scheme.model,
@@ -88,7 +89,15 @@ def get_openapi_security_definitions(
)
security_name = security_requirement.security_scheme.scheme_name
security_definitions[security_name] = security_definition
- operation_security.append({security_name: security_requirement.scopes})
+ # Merge scopes for the same security scheme
+ if security_name not in operation_security_dict:
+ operation_security_dict[security_name] = []
+ for scope in security_requirement.scopes or []:
+ if scope not in operation_security_dict[security_name]:
+ operation_security_dict[security_name].append(scope)
+ operation_security = [
+ {name: scopes} for name, scopes in operation_security_dict.items()
+ ]
return security_definitions, operation_security
.... [100%]
=============================== warnings summary ===============================
../../../../../../../Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45
/Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead.
_PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]]
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
4 passed, 1 warning in 0.57s