Coverage for mongodb_odm / fields.py: 100%

20 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-12-07 08:37 +0000

1from collections.abc import Mapping 1abcdef

2from collections.abc import Set as AbstractSet 1abcdef

3from typing import Any, Callable, Optional, Union 1abcdef

4 

5from pydantic._internal._repr import Representation as PydanticRepresentation 1abcdef

6from pydantic.fields import FieldInfo as PydanticFieldInfo 1abcdef

7from pydantic_core import PydanticUndefined as Undefined 1abcdef

8 

9IntStr = Union[int, str] 1abcdef

10AbstractSetIntStr = AbstractSet[IntStr] 1abcdef

11MappingIntStrAny = Mapping[IntStr, Any] 1abcdef

12NoArgAnyCallable = Callable[[], Any] 1abcdef

13 

14 

15def Field( 1abcdef

16 default: Any = Undefined, 

17 *, 

18 default_factory: Optional[NoArgAnyCallable] = None, 

19 alias: Optional[str] = None, 

20 title: Optional[str] = None, 

21 description: Optional[str] = None, 

22 exclude: Union[bool, None] = None, 

23 # Will be deprecated soon 

24 include: Union["AbstractSetIntStr", "MappingIntStrAny", Any] = None, 

25 # Will be deprecated soon 

26 const: Optional[bool] = None, 

27 gt: Optional[float] = None, 

28 ge: Optional[float] = None, 

29 lt: Optional[float] = None, 

30 le: Optional[float] = None, 

31 multiple_of: Optional[float] = None, 

32 allow_inf_nan: Optional[bool] = None, 

33 max_digits: Optional[int] = None, 

34 decimal_places: Optional[int] = None, 

35 # Will be deprecated soon 

36 unique_items: Optional[bool] = None, 

37 min_length: Optional[int] = None, 

38 max_length: Optional[int] = None, 

39 frozen: bool = True, 

40 pattern: Optional[str] = None, 

41 discriminator: Optional[str] = None, 

42 repr: bool = True, 

43 **extra: Any, 

44) -> Any: 

45 # Extend Pydantic Field to have more control on the Field 

46 field_info = PydanticFieldInfo( 1abcdef

47 default=default, 

48 default_factory=default_factory, 

49 alias=alias, 

50 title=title, 

51 description=description, 

52 exclude=exclude, 

53 gt=gt, 

54 ge=ge, 

55 lt=lt, 

56 le=le, 

57 multiple_of=multiple_of, 

58 allow_inf_nan=allow_inf_nan, 

59 max_digits=max_digits, 

60 decimal_places=decimal_places, 

61 min_length=min_length, 

62 max_length=max_length, 

63 frozen=frozen, 

64 pattern=pattern, 

65 discriminator=discriminator, 

66 repr=repr, 

67 **extra, 

68 ) 

69 return field_info 1abcdef

70 

71 

72class RelationshipInfo(PydanticRepresentation): 1abcdef

73 def __init__( 1abcdef

74 self, 

75 *, 

76 local_field: str, 

77 related_field: Optional[str] = None, 

78 ) -> None: 

79 self.local_field = local_field 1abcdef

80 self.related_field = related_field 1abcdef

81 

82 

83def Relationship( 1abcdef

84 *, 

85 local_field: str, 

86 related_field: Optional[str] = None, 

87) -> Any: 

88 """ 

89 This is a field of Representation. 

90 That represents another model as the field type. 

91 """ 

92 relationship_info = RelationshipInfo( 1abcdef

93 local_field=local_field, 

94 related_field=related_field, 

95 ) 

96 return relationship_info 1abcdef