@@ -15,7 +15,7 @@ class OASBase(pydantic.BaseModel, alias_generator=to_alias, extra="forbid"):
1515
1616class ExtensibleOASBase (OASBase , extra = "allow" ):
1717 @pydantic .model_validator (mode = "after" )
18- def _check_extensions (self ) -> t .Self :
18+ def _check_extensions (self ) -> " t.Self" :
1919 if self .__pydantic_extra__ is not None :
2020 invalid_keys = [
2121 key for key in self .__pydantic_extra__ .keys () if not key .startswith ("x-" )
@@ -30,8 +30,20 @@ def _check_extensions(self) -> t.Self:
3030 return self
3131
3232
33+ OperationName = t .Literal [
34+ "get" ,
35+ "put" ,
36+ "post" ,
37+ "patch" ,
38+ "delete" ,
39+ "options" ,
40+ "head" ,
41+ "trace" ,
42+ ]
43+
44+
3345class Reference (OASBase ):
34- _ref : t .Annotated [str , pydantic .Field (alias = "$ref" )]
46+ ref : t .Annotated [str , pydantic .Field (alias = "$ref" )]
3547 summary : str | None = None
3648 description : str | None = None
3749
@@ -192,7 +204,13 @@ class Encoding(ExtensibleOASBase):
192204 # TODO These only apply to RFC6570
193205 style : (
194206 t .Literal [
195- "simple" , "form" , "matrix" , "label" , "spaceDelimited" , "pipeDelimited" , "deepObject"
207+ "simple" ,
208+ "form" ,
209+ "matrix" ,
210+ "label" ,
211+ "spaceDelimited" ,
212+ "pipeDelimited" ,
213+ "deepObject" ,
196214 ]
197215 | None
198216 ) = None
@@ -237,7 +255,7 @@ class ParameterBase(ExtensibleOASBase):
237255 allow_empty_value : bool = False
238256
239257 @pydantic .model_validator (mode = "after" )
240- def _path_required (self ) -> t .Self :
258+ def _path_required (self ) -> " t.Self" :
241259 if self .in_ == "path" :
242260 assert self .required
243261 return self
@@ -251,10 +269,18 @@ class SchemaParameter(ParameterBase):
251269 schema_ : Schema
252270 style : t .Annotated [
253271 t .Literal [
254- "simple" , "form" , "matrix" , "label" , "spaceDelimited" , "pipeDelimited" , "deepObject"
272+ "simple" ,
273+ "form" ,
274+ "matrix" ,
275+ "label" ,
276+ "spaceDelimited" ,
277+ "pipeDelimited" ,
278+ "deepObject" ,
255279 ],
256280 pydantic .Field (
257- default_factory = lambda data : "simple" if data ["in_" ] in ["header" , "path" ] else "form"
281+ default_factory = lambda data : (
282+ "simple" if data .get ("in_" ) in ["header" , "path" ] else "form"
283+ )
258284 ),
259285 ]
260286 explode : t .Annotated [bool , pydantic .Field (default_factory = lambda data : data ["style" ] == "form" )]
@@ -275,7 +301,7 @@ class RequestBody(ExtensibleOASBase):
275301class Response (ExtensibleOASBase ):
276302 description : str
277303 headers : dict [str , Header | Reference ] | None = None
278- content : dict [str , MediaType ] | None = None
304+ content : dict [str , MediaType ] = {}
279305 links : dict [str , Link | Reference ] | None = None
280306
281307
@@ -291,16 +317,17 @@ class Operation(ExtensibleOASBase):
291317 description : str | None = None
292318 external_docs : ExternalDocumentation | None = None
293319 operation_id : str
294- parameters : list [Parameter | Reference ] | None = None
320+ parameters : list [Parameter | Reference ] = []
295321 request_body : RequestBody | Reference | None = None
296- responses : Responses | None = None
322+ responses : Responses = {}
297323 callbacks : dict [str , Callback | Reference ] | None = None
298324 deprecated : bool = False
299325 security : SecurityRequirements | None = None
300326 servers : list [Server ] | None = None
301327
302328
303- class PathItem (Reference , ExtensibleOASBase ):
329+ class PathItem (ExtensibleOASBase ):
330+ # TODO $ref
304331 get : Operation | None = None
305332 put : Operation | None = None
306333 post : Operation | None = None
@@ -310,17 +337,17 @@ class PathItem(Reference, ExtensibleOASBase):
310337 head : Operation | None = None
311338 trace : Operation | None = None
312339 servers : list [Server ] | None = None
313- parameters : list [Parameter | Reference ] | None = None
340+ parameters : list [Parameter | Reference ] = []
314341
315342
316343class Components (ExtensibleOASBase ):
317- schemas : dict [str , Schema ] | None = None
344+ schemas : dict [str , Schema ] | None = {}
318345 responses : dict [str , Response | Reference ] | None = None
319- parameters : dict [str , Parameter | Reference ] | None = None
346+ parameters : dict [str , Parameter | Reference ] = {}
320347 examples : dict [str , Example | Reference ] | None = None
321348 request_bodies : dict [str , RequestBody | Reference ] | None = None
322349 headers : dict [str , Header | Reference ] | None = None
323- security_schemes : dict [str , SecurityScheme | Reference ] | None = None
350+ security_schemes : dict [str , SecurityScheme | Reference ] = {}
324351 links : dict [str , Link | Reference ] | None = None
325352 callbacks : dict [str , Callback | Reference ] | None = None
326353 path_items : dict [str , PathItem ] | None = None
@@ -333,9 +360,9 @@ class OpenAPISpec(ExtensibleOASBase):
333360 servers : list [Server ] | None = None
334361 # In the specification there is a Paths Object,
335362 # probably because paths as keys can get extra validation.
336- paths : dict [str , PathItem ] | None = None
363+ paths : dict [str , PathItem ] = {}
337364 webhooks : dict [str , PathItem ] | None = None
338- components : Components | None = None
365+ components : Components = Components ()
339366 security : SecurityRequirements | None = None
340367 tags : list [Tag ] | None = None
341368 external_docs : ExternalDocumentation | None = None
0 commit comments