1818from .utils import _to_camel
1919
2020if TYPE_CHECKING :
21+ from .annotations import CaseExact
2122 from .annotations import Mutability
2223 from .annotations import Required
24+ from .annotations import Returned
25+ from .annotations import Uniqueness
2326 from .resources .resource import Resource
2427
2528from .exceptions import InvalidPathException
@@ -666,6 +669,9 @@ def iter_paths(
666669 include_extensions : bool = True ,
667670 required : "list[Required] | None" = None ,
668671 mutability : "list[Mutability] | None" = None ,
672+ uniqueness : "list[Uniqueness] | None" = None ,
673+ returned : "list[Returned] | None" = None ,
674+ case_exact : "list[CaseExact] | None" = None ,
669675 ) -> "Iterator[Path[ResourceT]]" :
670676 """Iterate over all paths for the bound model and its extensions.
671677
@@ -675,10 +681,16 @@ def iter_paths(
675681 :param include_extensions: Whether to include extension attributes.
676682 :param required: Filter by Required annotation values (e.g., [Required.true]).
677683 :param mutability: Filter by Mutability annotation values (e.g., [Mutability.read_write]).
684+ :param uniqueness: Filter by Uniqueness annotation values (e.g., [Uniqueness.server]).
685+ :param returned: Filter by Returned annotation values (e.g., [Returned.always]).
686+ :param case_exact: Filter by CaseExact annotation values (e.g., [CaseExact.true]).
678687 :yields: Path instances for each attribute matching the filters.
679688 """
689+ from .annotations import CaseExact
680690 from .annotations import Mutability
681691 from .annotations import Required
692+ from .annotations import Returned
693+ from .annotations import Uniqueness
682694 from .attributes import ComplexAttribute
683695 from .resources .resource import Extension
684696 from .resources .resource import Resource
@@ -698,6 +710,22 @@ def matches_filters(target_model: type[BaseModel], field_name: str) -> bool:
698710 )
699711 if field_mutability not in mutability :
700712 return False
713+ if uniqueness is not None :
714+ field_uniqueness = target_model .get_field_annotation (
715+ field_name , Uniqueness
716+ )
717+ if field_uniqueness not in uniqueness :
718+ return False
719+ if returned is not None :
720+ field_returned = target_model .get_field_annotation (field_name , Returned )
721+ if field_returned not in returned :
722+ return False
723+ if case_exact is not None :
724+ field_case_exact = target_model .get_field_annotation (
725+ field_name , CaseExact
726+ )
727+ if field_case_exact not in case_exact :
728+ return False
701729 return True
702730
703731 def iter_model_paths (
0 commit comments