@@ -10,115 +10,112 @@ class UserModel(BaseModel):
1010 email : Optional [str ] # Noncompliant {{Add an explicit default value to this optional field.}}
1111# ^^^^^^^^^^^^^
1212
13- class ProfileModel (BaseModel ):
14- bio : str | None # Noncompliant
15- # ^^^^^^^^^^
16-
1713class SettingsModel (BaseModel ):
1814 theme : Optional [str ] = Field (...) # Noncompliant
1915# ^^^^^^^^^^^^^
2016
21- class ArticleModel (BaseModel ):
22- title : str
23- subtitle : Optional [str ] # Noncompliant
24- tags : list [str ] | None # Noncompliant
17+ class ModelWithMethods (BaseModel ):
18+ optional_field : Optional [str ] # Noncompliant
19+ required_field : str
20+
21+ def some_method (self ):
22+ pass
23+
24+ # Field(...) with ellipsis always raises, even for X | None and Union[X, None]
2525
26- class DataModel (BaseModel ):
27- value : Union [str , None ] # Noncompliant
26+ class BitwiseOrWithFieldEllipsis (BaseModel ):
27+ value : str | None = Field (...) # Noncompliant
28+ # ^^^^^^^^^^
2829
29- class ComplexModel (BaseModel ):
30- data : Union [str , int , None ] # Noncompliant
30+ class NoneLeftWithFieldEllipsis (BaseModel ):
31+ value : None | str = Field (...) # Noncompliant
32+ # ^^^^^^^^^^
33+
34+ class UnionWithFieldEllipsis (BaseModel ):
35+ value : Union [str , None ] = Field (...) # Noncompliant
36+ # ^^^^^^^^^^^^^^^^
3137
3238# =====================
3339# COMPLIANT CASES
3440# =====================
3541
3642class UserModelCompliant (BaseModel ):
3743 name : str
38- email : Optional [str ] = None # Compliant
44+ email : Optional [str ] = None
3945
4046class ProfileModelCompliant (BaseModel ):
41- bio : str | None = None # Compliant
47+ bio : str | None = None
4248
4349class SettingsModelCompliant (BaseModel ):
44- theme : Optional [str ] = Field (default = None ) # Compliant
45- priority : Optional [int ] = Field (default = 0 ) # Compliant
50+ theme : Optional [str ] = Field (default = None )
51+ priority : Optional [int ] = Field (default = 0 )
4652
4753class RequiredModel (BaseModel ):
48- required_field : str # Compliant - not Optional
49- another_field : int = Field (...) # Compliant - not Optional
54+ required_field : str
55+ another_field : int = Field (...) # not Optional, no issue
5056
5157class ConfigModel (BaseModel ):
52- timeout : Optional [int ] = 30 # Compliant - has default
58+ timeout : Optional [int ] = 30
5359
5460class FactoryModel (BaseModel ):
55- items : Optional [list ] = Field (default_factory = list ) # Compliant
61+ items : Optional [list ] = Field (default_factory = list )
5662
5763class RegularClass :
58- value : Optional [str ] # Compliant - not a BaseModel
64+ value : Optional [str ] # not a BaseModel
65+
66+ # X | None and Union[X, None] without default: not Optional[X], so no issue
67+
68+ class BitwiseOrNoneCompliant (BaseModel ):
69+ reason : int | None
70+
71+ class BitwiseOrNoneWithFieldDefaultCompliant (BaseModel ):
72+ title : str | None = Field (default = None )
73+
74+ class NoneLeftCompliant (BaseModel ):
75+ description : None | str
76+
77+ class UnionWithNoneCompliant (BaseModel ):
78+ data : Union [str , None ]
5979
6080# =====================
6181# EDGE CASES
6282# =====================
6383
6484class ComplexModelCompliant (BaseModel ):
65- data : Union [str , int , None ] = None # Compliant
85+ data : Union [str , int , None ] = None
6686
6787class EmptyModel (BaseModel ):
68- pass # Compliant - no fields
88+ pass
6989
7090class OnlyRequiredModel (BaseModel ):
7191 id : int
72- name : str
73-
74- # =====================
75- # ADDITIONAL EDGE CASES FOR COVERAGE
76- # =====================
77-
78- class NoneLeftModel (BaseModel ):
79- value : None | str # Noncompliant
80-
81- class NestedUnionLeftModel (BaseModel ):
82- value : None | str | int # Noncompliant
92+ name : str
8393
8494class EmptyFieldModel (BaseModel ):
85- value : Optional [str ] = Field () # Compliant - Field() with no ellipsis
95+ value : Optional [str ] = Field ()
8696
8797class FieldWithValueModel (BaseModel ):
88- value : Optional [str ] = Field (42 ) # Compliant - first arg is not ellipsis
98+ value : Optional [str ] = Field (42 )
8999
90100class FieldWithKeywordFirstModel (BaseModel ):
91- value : Optional [str ] = Field (default = None ) # Compliant - default is specified
101+ value : Optional [str ] = Field (default = None )
92102
93103class FieldEllipsisWithDefaultModel (BaseModel ):
94- value : Optional [str ] = Field (..., default = None ) # Compliant
104+ value : Optional [str ] = Field (..., default = None )
95105
96106class FieldEllipsisWithFactoryModel (BaseModel ):
97- value : Optional [list ] = Field (..., default_factory = list ) # Compliant
98-
99- class ModelWithMethods (BaseModel ):
100- optional_field : Optional [str ] # Noncompliant
101- required_field : str
102-
103- def some_method (self ):
104- pass
105-
106- @classmethod
107- def class_method (cls ):
108- pass
107+ value : Optional [list ] = Field (..., default_factory = list )
109108
110- class MultiNestedModel (BaseModel ):
111- left_none : None | str # Noncompliant
112- right_none : str | None # Noncompliant
113- deep_left : None | int | str # Noncompliant
114- deep_right1 : int | str | None # Noncompliant
115- deep_right2 : int | str | str | str # Compliant
109+ class MultiNoneFieldCompliant (BaseModel ):
110+ deep_left : None | int | str
111+ deep_right : int | str | None
112+ no_none : int | str | str
116113
117114def custom_field ():
118115 return None
119116
120117class CustomFieldModel (BaseModel ):
121- value : Optional [str ] = custom_field () # Compliant - not pydantic.Field
118+ value : Optional [str ] = custom_field ()
122119
123120class OtherSubscriptionModel (BaseModel ):
124- value : list [str ] # Compliant
121+ value : list [str ]
0 commit comments