Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

787 lignes
28 KiB

  1. import warnings
  2. from enum import Enum
  3. from typing import Any, Callable, Dict, List, Optional, Sequence, Union
  4. from fastapi.openapi.models import Example
  5. from pydantic.fields import FieldInfo
  6. from typing_extensions import Annotated, deprecated
  7. from ._compat import (
  8. PYDANTIC_V2,
  9. PYDANTIC_VERSION_MINOR_TUPLE,
  10. Undefined,
  11. )
  12. _Unset: Any = Undefined
  13. class ParamTypes(Enum):
  14. query = "query"
  15. header = "header"
  16. path = "path"
  17. cookie = "cookie"
  18. class Param(FieldInfo):
  19. in_: ParamTypes
  20. def __init__(
  21. self,
  22. default: Any = Undefined,
  23. *,
  24. default_factory: Union[Callable[[], Any], None] = _Unset,
  25. annotation: Optional[Any] = None,
  26. alias: Optional[str] = None,
  27. alias_priority: Union[int, None] = _Unset,
  28. # TODO: update when deprecating Pydantic v1, import these types
  29. # validation_alias: str | AliasPath | AliasChoices | None
  30. validation_alias: Union[str, None] = None,
  31. serialization_alias: Union[str, None] = None,
  32. title: Optional[str] = None,
  33. description: Optional[str] = None,
  34. gt: Optional[float] = None,
  35. ge: Optional[float] = None,
  36. lt: Optional[float] = None,
  37. le: Optional[float] = None,
  38. min_length: Optional[int] = None,
  39. max_length: Optional[int] = None,
  40. pattern: Optional[str] = None,
  41. regex: Annotated[
  42. Optional[str],
  43. deprecated(
  44. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  45. ),
  46. ] = None,
  47. discriminator: Union[str, None] = None,
  48. strict: Union[bool, None] = _Unset,
  49. multiple_of: Union[float, None] = _Unset,
  50. allow_inf_nan: Union[bool, None] = _Unset,
  51. max_digits: Union[int, None] = _Unset,
  52. decimal_places: Union[int, None] = _Unset,
  53. examples: Optional[List[Any]] = None,
  54. example: Annotated[
  55. Optional[Any],
  56. deprecated(
  57. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  58. "although still supported. Use examples instead."
  59. ),
  60. ] = _Unset,
  61. openapi_examples: Optional[Dict[str, Example]] = None,
  62. deprecated: Union[deprecated, str, bool, None] = None,
  63. include_in_schema: bool = True,
  64. json_schema_extra: Union[Dict[str, Any], None] = None,
  65. **extra: Any,
  66. ):
  67. if example is not _Unset:
  68. warnings.warn(
  69. "`example` has been deprecated, please use `examples` instead",
  70. category=DeprecationWarning,
  71. stacklevel=4,
  72. )
  73. self.example = example
  74. self.include_in_schema = include_in_schema
  75. self.openapi_examples = openapi_examples
  76. kwargs = dict(
  77. default=default,
  78. default_factory=default_factory,
  79. alias=alias,
  80. title=title,
  81. description=description,
  82. gt=gt,
  83. ge=ge,
  84. lt=lt,
  85. le=le,
  86. min_length=min_length,
  87. max_length=max_length,
  88. discriminator=discriminator,
  89. multiple_of=multiple_of,
  90. allow_inf_nan=allow_inf_nan,
  91. max_digits=max_digits,
  92. decimal_places=decimal_places,
  93. **extra,
  94. )
  95. if examples is not None:
  96. kwargs["examples"] = examples
  97. if regex is not None:
  98. warnings.warn(
  99. "`regex` has been deprecated, please use `pattern` instead",
  100. category=DeprecationWarning,
  101. stacklevel=4,
  102. )
  103. current_json_schema_extra = json_schema_extra or extra
  104. if PYDANTIC_VERSION_MINOR_TUPLE < (2, 7):
  105. self.deprecated = deprecated
  106. else:
  107. kwargs["deprecated"] = deprecated
  108. if PYDANTIC_V2:
  109. kwargs.update(
  110. {
  111. "annotation": annotation,
  112. "alias_priority": alias_priority,
  113. "validation_alias": validation_alias,
  114. "serialization_alias": serialization_alias,
  115. "strict": strict,
  116. "json_schema_extra": current_json_schema_extra,
  117. }
  118. )
  119. kwargs["pattern"] = pattern or regex
  120. else:
  121. kwargs["regex"] = pattern or regex
  122. kwargs.update(**current_json_schema_extra)
  123. use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
  124. super().__init__(**use_kwargs)
  125. def __repr__(self) -> str:
  126. return f"{self.__class__.__name__}({self.default})"
  127. class Path(Param):
  128. in_ = ParamTypes.path
  129. def __init__(
  130. self,
  131. default: Any = ...,
  132. *,
  133. default_factory: Union[Callable[[], Any], None] = _Unset,
  134. annotation: Optional[Any] = None,
  135. alias: Optional[str] = None,
  136. alias_priority: Union[int, None] = _Unset,
  137. # TODO: update when deprecating Pydantic v1, import these types
  138. # validation_alias: str | AliasPath | AliasChoices | None
  139. validation_alias: Union[str, None] = None,
  140. serialization_alias: Union[str, None] = None,
  141. title: Optional[str] = None,
  142. description: Optional[str] = None,
  143. gt: Optional[float] = None,
  144. ge: Optional[float] = None,
  145. lt: Optional[float] = None,
  146. le: Optional[float] = None,
  147. min_length: Optional[int] = None,
  148. max_length: Optional[int] = None,
  149. pattern: Optional[str] = None,
  150. regex: Annotated[
  151. Optional[str],
  152. deprecated(
  153. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  154. ),
  155. ] = None,
  156. discriminator: Union[str, None] = None,
  157. strict: Union[bool, None] = _Unset,
  158. multiple_of: Union[float, None] = _Unset,
  159. allow_inf_nan: Union[bool, None] = _Unset,
  160. max_digits: Union[int, None] = _Unset,
  161. decimal_places: Union[int, None] = _Unset,
  162. examples: Optional[List[Any]] = None,
  163. example: Annotated[
  164. Optional[Any],
  165. deprecated(
  166. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  167. "although still supported. Use examples instead."
  168. ),
  169. ] = _Unset,
  170. openapi_examples: Optional[Dict[str, Example]] = None,
  171. deprecated: Union[deprecated, str, bool, None] = None,
  172. include_in_schema: bool = True,
  173. json_schema_extra: Union[Dict[str, Any], None] = None,
  174. **extra: Any,
  175. ):
  176. assert default is ..., "Path parameters cannot have a default value"
  177. self.in_ = self.in_
  178. super().__init__(
  179. default=default,
  180. default_factory=default_factory,
  181. annotation=annotation,
  182. alias=alias,
  183. alias_priority=alias_priority,
  184. validation_alias=validation_alias,
  185. serialization_alias=serialization_alias,
  186. title=title,
  187. description=description,
  188. gt=gt,
  189. ge=ge,
  190. lt=lt,
  191. le=le,
  192. min_length=min_length,
  193. max_length=max_length,
  194. pattern=pattern,
  195. regex=regex,
  196. discriminator=discriminator,
  197. strict=strict,
  198. multiple_of=multiple_of,
  199. allow_inf_nan=allow_inf_nan,
  200. max_digits=max_digits,
  201. decimal_places=decimal_places,
  202. deprecated=deprecated,
  203. example=example,
  204. examples=examples,
  205. openapi_examples=openapi_examples,
  206. include_in_schema=include_in_schema,
  207. json_schema_extra=json_schema_extra,
  208. **extra,
  209. )
  210. class Query(Param):
  211. in_ = ParamTypes.query
  212. def __init__(
  213. self,
  214. default: Any = Undefined,
  215. *,
  216. default_factory: Union[Callable[[], Any], None] = _Unset,
  217. annotation: Optional[Any] = None,
  218. alias: Optional[str] = None,
  219. alias_priority: Union[int, None] = _Unset,
  220. # TODO: update when deprecating Pydantic v1, import these types
  221. # validation_alias: str | AliasPath | AliasChoices | None
  222. validation_alias: Union[str, None] = None,
  223. serialization_alias: Union[str, None] = None,
  224. title: Optional[str] = None,
  225. description: Optional[str] = None,
  226. gt: Optional[float] = None,
  227. ge: Optional[float] = None,
  228. lt: Optional[float] = None,
  229. le: Optional[float] = None,
  230. min_length: Optional[int] = None,
  231. max_length: Optional[int] = None,
  232. pattern: Optional[str] = None,
  233. regex: Annotated[
  234. Optional[str],
  235. deprecated(
  236. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  237. ),
  238. ] = None,
  239. discriminator: Union[str, None] = None,
  240. strict: Union[bool, None] = _Unset,
  241. multiple_of: Union[float, None] = _Unset,
  242. allow_inf_nan: Union[bool, None] = _Unset,
  243. max_digits: Union[int, None] = _Unset,
  244. decimal_places: Union[int, None] = _Unset,
  245. examples: Optional[List[Any]] = None,
  246. example: Annotated[
  247. Optional[Any],
  248. deprecated(
  249. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  250. "although still supported. Use examples instead."
  251. ),
  252. ] = _Unset,
  253. openapi_examples: Optional[Dict[str, Example]] = None,
  254. deprecated: Union[deprecated, str, bool, None] = None,
  255. include_in_schema: bool = True,
  256. json_schema_extra: Union[Dict[str, Any], None] = None,
  257. **extra: Any,
  258. ):
  259. super().__init__(
  260. default=default,
  261. default_factory=default_factory,
  262. annotation=annotation,
  263. alias=alias,
  264. alias_priority=alias_priority,
  265. validation_alias=validation_alias,
  266. serialization_alias=serialization_alias,
  267. title=title,
  268. description=description,
  269. gt=gt,
  270. ge=ge,
  271. lt=lt,
  272. le=le,
  273. min_length=min_length,
  274. max_length=max_length,
  275. pattern=pattern,
  276. regex=regex,
  277. discriminator=discriminator,
  278. strict=strict,
  279. multiple_of=multiple_of,
  280. allow_inf_nan=allow_inf_nan,
  281. max_digits=max_digits,
  282. decimal_places=decimal_places,
  283. deprecated=deprecated,
  284. example=example,
  285. examples=examples,
  286. openapi_examples=openapi_examples,
  287. include_in_schema=include_in_schema,
  288. json_schema_extra=json_schema_extra,
  289. **extra,
  290. )
  291. class Header(Param):
  292. in_ = ParamTypes.header
  293. def __init__(
  294. self,
  295. default: Any = Undefined,
  296. *,
  297. default_factory: Union[Callable[[], Any], None] = _Unset,
  298. annotation: Optional[Any] = None,
  299. alias: Optional[str] = None,
  300. alias_priority: Union[int, None] = _Unset,
  301. # TODO: update when deprecating Pydantic v1, import these types
  302. # validation_alias: str | AliasPath | AliasChoices | None
  303. validation_alias: Union[str, None] = None,
  304. serialization_alias: Union[str, None] = None,
  305. convert_underscores: bool = True,
  306. title: Optional[str] = None,
  307. description: Optional[str] = None,
  308. gt: Optional[float] = None,
  309. ge: Optional[float] = None,
  310. lt: Optional[float] = None,
  311. le: Optional[float] = None,
  312. min_length: Optional[int] = None,
  313. max_length: Optional[int] = None,
  314. pattern: Optional[str] = None,
  315. regex: Annotated[
  316. Optional[str],
  317. deprecated(
  318. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  319. ),
  320. ] = None,
  321. discriminator: Union[str, None] = None,
  322. strict: Union[bool, None] = _Unset,
  323. multiple_of: Union[float, None] = _Unset,
  324. allow_inf_nan: Union[bool, None] = _Unset,
  325. max_digits: Union[int, None] = _Unset,
  326. decimal_places: Union[int, None] = _Unset,
  327. examples: Optional[List[Any]] = None,
  328. example: Annotated[
  329. Optional[Any],
  330. deprecated(
  331. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  332. "although still supported. Use examples instead."
  333. ),
  334. ] = _Unset,
  335. openapi_examples: Optional[Dict[str, Example]] = None,
  336. deprecated: Union[deprecated, str, bool, None] = None,
  337. include_in_schema: bool = True,
  338. json_schema_extra: Union[Dict[str, Any], None] = None,
  339. **extra: Any,
  340. ):
  341. self.convert_underscores = convert_underscores
  342. super().__init__(
  343. default=default,
  344. default_factory=default_factory,
  345. annotation=annotation,
  346. alias=alias,
  347. alias_priority=alias_priority,
  348. validation_alias=validation_alias,
  349. serialization_alias=serialization_alias,
  350. title=title,
  351. description=description,
  352. gt=gt,
  353. ge=ge,
  354. lt=lt,
  355. le=le,
  356. min_length=min_length,
  357. max_length=max_length,
  358. pattern=pattern,
  359. regex=regex,
  360. discriminator=discriminator,
  361. strict=strict,
  362. multiple_of=multiple_of,
  363. allow_inf_nan=allow_inf_nan,
  364. max_digits=max_digits,
  365. decimal_places=decimal_places,
  366. deprecated=deprecated,
  367. example=example,
  368. examples=examples,
  369. openapi_examples=openapi_examples,
  370. include_in_schema=include_in_schema,
  371. json_schema_extra=json_schema_extra,
  372. **extra,
  373. )
  374. class Cookie(Param):
  375. in_ = ParamTypes.cookie
  376. def __init__(
  377. self,
  378. default: Any = Undefined,
  379. *,
  380. default_factory: Union[Callable[[], Any], None] = _Unset,
  381. annotation: Optional[Any] = None,
  382. alias: Optional[str] = None,
  383. alias_priority: Union[int, None] = _Unset,
  384. # TODO: update when deprecating Pydantic v1, import these types
  385. # validation_alias: str | AliasPath | AliasChoices | None
  386. validation_alias: Union[str, None] = None,
  387. serialization_alias: Union[str, None] = None,
  388. title: Optional[str] = None,
  389. description: Optional[str] = None,
  390. gt: Optional[float] = None,
  391. ge: Optional[float] = None,
  392. lt: Optional[float] = None,
  393. le: Optional[float] = None,
  394. min_length: Optional[int] = None,
  395. max_length: Optional[int] = None,
  396. pattern: Optional[str] = None,
  397. regex: Annotated[
  398. Optional[str],
  399. deprecated(
  400. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  401. ),
  402. ] = None,
  403. discriminator: Union[str, None] = None,
  404. strict: Union[bool, None] = _Unset,
  405. multiple_of: Union[float, None] = _Unset,
  406. allow_inf_nan: Union[bool, None] = _Unset,
  407. max_digits: Union[int, None] = _Unset,
  408. decimal_places: Union[int, None] = _Unset,
  409. examples: Optional[List[Any]] = None,
  410. example: Annotated[
  411. Optional[Any],
  412. deprecated(
  413. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  414. "although still supported. Use examples instead."
  415. ),
  416. ] = _Unset,
  417. openapi_examples: Optional[Dict[str, Example]] = None,
  418. deprecated: Union[deprecated, str, bool, None] = None,
  419. include_in_schema: bool = True,
  420. json_schema_extra: Union[Dict[str, Any], None] = None,
  421. **extra: Any,
  422. ):
  423. super().__init__(
  424. default=default,
  425. default_factory=default_factory,
  426. annotation=annotation,
  427. alias=alias,
  428. alias_priority=alias_priority,
  429. validation_alias=validation_alias,
  430. serialization_alias=serialization_alias,
  431. title=title,
  432. description=description,
  433. gt=gt,
  434. ge=ge,
  435. lt=lt,
  436. le=le,
  437. min_length=min_length,
  438. max_length=max_length,
  439. pattern=pattern,
  440. regex=regex,
  441. discriminator=discriminator,
  442. strict=strict,
  443. multiple_of=multiple_of,
  444. allow_inf_nan=allow_inf_nan,
  445. max_digits=max_digits,
  446. decimal_places=decimal_places,
  447. deprecated=deprecated,
  448. example=example,
  449. examples=examples,
  450. openapi_examples=openapi_examples,
  451. include_in_schema=include_in_schema,
  452. json_schema_extra=json_schema_extra,
  453. **extra,
  454. )
  455. class Body(FieldInfo):
  456. def __init__(
  457. self,
  458. default: Any = Undefined,
  459. *,
  460. default_factory: Union[Callable[[], Any], None] = _Unset,
  461. annotation: Optional[Any] = None,
  462. embed: Union[bool, None] = None,
  463. media_type: str = "application/json",
  464. alias: Optional[str] = None,
  465. alias_priority: Union[int, None] = _Unset,
  466. # TODO: update when deprecating Pydantic v1, import these types
  467. # validation_alias: str | AliasPath | AliasChoices | None
  468. validation_alias: Union[str, None] = None,
  469. serialization_alias: Union[str, None] = None,
  470. title: Optional[str] = None,
  471. description: Optional[str] = None,
  472. gt: Optional[float] = None,
  473. ge: Optional[float] = None,
  474. lt: Optional[float] = None,
  475. le: Optional[float] = None,
  476. min_length: Optional[int] = None,
  477. max_length: Optional[int] = None,
  478. pattern: Optional[str] = None,
  479. regex: Annotated[
  480. Optional[str],
  481. deprecated(
  482. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  483. ),
  484. ] = None,
  485. discriminator: Union[str, None] = None,
  486. strict: Union[bool, None] = _Unset,
  487. multiple_of: Union[float, None] = _Unset,
  488. allow_inf_nan: Union[bool, None] = _Unset,
  489. max_digits: Union[int, None] = _Unset,
  490. decimal_places: Union[int, None] = _Unset,
  491. examples: Optional[List[Any]] = None,
  492. example: Annotated[
  493. Optional[Any],
  494. deprecated(
  495. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  496. "although still supported. Use examples instead."
  497. ),
  498. ] = _Unset,
  499. openapi_examples: Optional[Dict[str, Example]] = None,
  500. deprecated: Union[deprecated, str, bool, None] = None,
  501. include_in_schema: bool = True,
  502. json_schema_extra: Union[Dict[str, Any], None] = None,
  503. **extra: Any,
  504. ):
  505. self.embed = embed
  506. self.media_type = media_type
  507. if example is not _Unset:
  508. warnings.warn(
  509. "`example` has been deprecated, please use `examples` instead",
  510. category=DeprecationWarning,
  511. stacklevel=4,
  512. )
  513. self.example = example
  514. self.include_in_schema = include_in_schema
  515. self.openapi_examples = openapi_examples
  516. kwargs = dict(
  517. default=default,
  518. default_factory=default_factory,
  519. alias=alias,
  520. title=title,
  521. description=description,
  522. gt=gt,
  523. ge=ge,
  524. lt=lt,
  525. le=le,
  526. min_length=min_length,
  527. max_length=max_length,
  528. discriminator=discriminator,
  529. multiple_of=multiple_of,
  530. allow_inf_nan=allow_inf_nan,
  531. max_digits=max_digits,
  532. decimal_places=decimal_places,
  533. **extra,
  534. )
  535. if examples is not None:
  536. kwargs["examples"] = examples
  537. if regex is not None:
  538. warnings.warn(
  539. "`regex` has been deprecated, please use `pattern` instead",
  540. category=DeprecationWarning,
  541. stacklevel=4,
  542. )
  543. current_json_schema_extra = json_schema_extra or extra
  544. if PYDANTIC_VERSION_MINOR_TUPLE < (2, 7):
  545. self.deprecated = deprecated
  546. else:
  547. kwargs["deprecated"] = deprecated
  548. if PYDANTIC_V2:
  549. kwargs.update(
  550. {
  551. "annotation": annotation,
  552. "alias_priority": alias_priority,
  553. "validation_alias": validation_alias,
  554. "serialization_alias": serialization_alias,
  555. "strict": strict,
  556. "json_schema_extra": current_json_schema_extra,
  557. }
  558. )
  559. kwargs["pattern"] = pattern or regex
  560. else:
  561. kwargs["regex"] = pattern or regex
  562. kwargs.update(**current_json_schema_extra)
  563. use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
  564. super().__init__(**use_kwargs)
  565. def __repr__(self) -> str:
  566. return f"{self.__class__.__name__}({self.default})"
  567. class Form(Body):
  568. def __init__(
  569. self,
  570. default: Any = Undefined,
  571. *,
  572. default_factory: Union[Callable[[], Any], None] = _Unset,
  573. annotation: Optional[Any] = None,
  574. media_type: str = "application/x-www-form-urlencoded",
  575. alias: Optional[str] = None,
  576. alias_priority: Union[int, None] = _Unset,
  577. # TODO: update when deprecating Pydantic v1, import these types
  578. # validation_alias: str | AliasPath | AliasChoices | None
  579. validation_alias: Union[str, None] = None,
  580. serialization_alias: Union[str, None] = None,
  581. title: Optional[str] = None,
  582. description: Optional[str] = None,
  583. gt: Optional[float] = None,
  584. ge: Optional[float] = None,
  585. lt: Optional[float] = None,
  586. le: Optional[float] = None,
  587. min_length: Optional[int] = None,
  588. max_length: Optional[int] = None,
  589. pattern: Optional[str] = None,
  590. regex: Annotated[
  591. Optional[str],
  592. deprecated(
  593. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  594. ),
  595. ] = None,
  596. discriminator: Union[str, None] = None,
  597. strict: Union[bool, None] = _Unset,
  598. multiple_of: Union[float, None] = _Unset,
  599. allow_inf_nan: Union[bool, None] = _Unset,
  600. max_digits: Union[int, None] = _Unset,
  601. decimal_places: Union[int, None] = _Unset,
  602. examples: Optional[List[Any]] = None,
  603. example: Annotated[
  604. Optional[Any],
  605. deprecated(
  606. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  607. "although still supported. Use examples instead."
  608. ),
  609. ] = _Unset,
  610. openapi_examples: Optional[Dict[str, Example]] = None,
  611. deprecated: Union[deprecated, str, bool, None] = None,
  612. include_in_schema: bool = True,
  613. json_schema_extra: Union[Dict[str, Any], None] = None,
  614. **extra: Any,
  615. ):
  616. super().__init__(
  617. default=default,
  618. default_factory=default_factory,
  619. annotation=annotation,
  620. media_type=media_type,
  621. alias=alias,
  622. alias_priority=alias_priority,
  623. validation_alias=validation_alias,
  624. serialization_alias=serialization_alias,
  625. title=title,
  626. description=description,
  627. gt=gt,
  628. ge=ge,
  629. lt=lt,
  630. le=le,
  631. min_length=min_length,
  632. max_length=max_length,
  633. pattern=pattern,
  634. regex=regex,
  635. discriminator=discriminator,
  636. strict=strict,
  637. multiple_of=multiple_of,
  638. allow_inf_nan=allow_inf_nan,
  639. max_digits=max_digits,
  640. decimal_places=decimal_places,
  641. deprecated=deprecated,
  642. example=example,
  643. examples=examples,
  644. openapi_examples=openapi_examples,
  645. include_in_schema=include_in_schema,
  646. json_schema_extra=json_schema_extra,
  647. **extra,
  648. )
  649. class File(Form):
  650. def __init__(
  651. self,
  652. default: Any = Undefined,
  653. *,
  654. default_factory: Union[Callable[[], Any], None] = _Unset,
  655. annotation: Optional[Any] = None,
  656. media_type: str = "multipart/form-data",
  657. alias: Optional[str] = None,
  658. alias_priority: Union[int, None] = _Unset,
  659. # TODO: update when deprecating Pydantic v1, import these types
  660. # validation_alias: str | AliasPath | AliasChoices | None
  661. validation_alias: Union[str, None] = None,
  662. serialization_alias: Union[str, None] = None,
  663. title: Optional[str] = None,
  664. description: Optional[str] = None,
  665. gt: Optional[float] = None,
  666. ge: Optional[float] = None,
  667. lt: Optional[float] = None,
  668. le: Optional[float] = None,
  669. min_length: Optional[int] = None,
  670. max_length: Optional[int] = None,
  671. pattern: Optional[str] = None,
  672. regex: Annotated[
  673. Optional[str],
  674. deprecated(
  675. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  676. ),
  677. ] = None,
  678. discriminator: Union[str, None] = None,
  679. strict: Union[bool, None] = _Unset,
  680. multiple_of: Union[float, None] = _Unset,
  681. allow_inf_nan: Union[bool, None] = _Unset,
  682. max_digits: Union[int, None] = _Unset,
  683. decimal_places: Union[int, None] = _Unset,
  684. examples: Optional[List[Any]] = None,
  685. example: Annotated[
  686. Optional[Any],
  687. deprecated(
  688. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  689. "although still supported. Use examples instead."
  690. ),
  691. ] = _Unset,
  692. openapi_examples: Optional[Dict[str, Example]] = None,
  693. deprecated: Union[deprecated, str, bool, None] = None,
  694. include_in_schema: bool = True,
  695. json_schema_extra: Union[Dict[str, Any], None] = None,
  696. **extra: Any,
  697. ):
  698. super().__init__(
  699. default=default,
  700. default_factory=default_factory,
  701. annotation=annotation,
  702. media_type=media_type,
  703. alias=alias,
  704. alias_priority=alias_priority,
  705. validation_alias=validation_alias,
  706. serialization_alias=serialization_alias,
  707. title=title,
  708. description=description,
  709. gt=gt,
  710. ge=ge,
  711. lt=lt,
  712. le=le,
  713. min_length=min_length,
  714. max_length=max_length,
  715. pattern=pattern,
  716. regex=regex,
  717. discriminator=discriminator,
  718. strict=strict,
  719. multiple_of=multiple_of,
  720. allow_inf_nan=allow_inf_nan,
  721. max_digits=max_digits,
  722. decimal_places=decimal_places,
  723. deprecated=deprecated,
  724. example=example,
  725. examples=examples,
  726. openapi_examples=openapi_examples,
  727. include_in_schema=include_in_schema,
  728. json_schema_extra=json_schema_extra,
  729. **extra,
  730. )
  731. class Depends:
  732. def __init__(
  733. self, dependency: Optional[Callable[..., Any]] = None, *, use_cache: bool = True
  734. ):
  735. self.dependency = dependency
  736. self.use_cache = use_cache
  737. def __repr__(self) -> str:
  738. attr = getattr(self.dependency, "__name__", type(self.dependency).__name__)
  739. cache = "" if self.use_cache else ", use_cache=False"
  740. return f"{self.__class__.__name__}({attr}{cache})"
  741. class Security(Depends):
  742. def __init__(
  743. self,
  744. dependency: Optional[Callable[..., Any]] = None,
  745. *,
  746. scopes: Optional[Sequence[str]] = None,
  747. use_cache: bool = True,
  748. ):
  749. super().__init__(dependency=dependency, use_cache=use_cache)
  750. self.scopes = scopes or []