Skip to content

Commit b2f5ed5

Browse files
committed
wip
1 parent ece6822 commit b2f5ed5

File tree

7 files changed

+308
-0
lines changed

7 files changed

+308
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from __future__ import annotations
2+
from typing import Any, List, Dict, Optional, Union
3+
from pydantic import model_serializer, model_validator, BaseModel, Field
4+
from . import MessageObjectHeadersObject
5+
from . import MessageObjectPayloadObject
6+
from . import Reference
7+
from . import CorrelationId
8+
from . import Tag
9+
from . import ExternalDocs
10+
from . import BindingsObject
11+
from . import MessageTrait
12+
class MessageObject(BaseModel):
13+
schema_format: Optional[str] = Field(default=None, alias='''schemaFormat''')
14+
content_type: Optional[str] = Field(default=None, alias='''contentType''')
15+
headers: Optional[Union[MessageObjectHeadersObject.MessageObjectHeadersObject, bool]] = Field(default=None)
16+
message_id: Optional[str] = Field(default=None, alias='''messageId''')
17+
payload: Optional[Union[MessageObjectPayloadObject.MessageObjectPayloadObject, bool]] = Field(default=None)
18+
correlation_id: Optional[Union[Reference.Reference, CorrelationId.CorrelationId]] = Field(default=None, alias='''correlationId''')
19+
tags: Optional[List[Tag.Tag]] = Field(default=None)
20+
summary: Optional[str] = Field(description='''A brief summary of the message.''', default=None)
21+
name: Optional[str] = Field(description='''Name of the message.''', default=None)
22+
title: Optional[str] = Field(description='''A human-friendly title for the message.''', default=None)
23+
description: Optional[str] = Field(description='''A longer description of the message. CommonMark is allowed.''', default=None)
24+
external_docs: Optional[ExternalDocs.ExternalDocs] = Field(description='''Allows referencing an external resource for extended documentation.''', default=None, alias='''externalDocs''')
25+
deprecated: Optional[bool] = Field(default=None)
26+
examples: Optional[List[Any]] = Field(description='''List of examples.''', default=None)
27+
bindings: Optional[BindingsObject.BindingsObject] = Field(description='''Map describing protocol-specific definitions for a server.''', default=None)
28+
traits: Optional[List[Reference.Reference | MessageTrait.MessageTrait]] = Field(default=None)
29+
extensions: Optional[dict[str, Any]] = Field(exclude=True, default=None)
30+
31+
@model_serializer(mode='wrap')
32+
def custom_serializer(self, handler):
33+
serialized_self = handler(self)
34+
extensions = getattr(self, "extensions")
35+
if extensions is not None:
36+
for key, value in extensions.items():
37+
# Never overwrite existing values, to avoid clashes
38+
if not hasattr(serialized_self, key):
39+
serialized_self[key] = value
40+
41+
return serialized_self
42+
43+
@model_validator(mode='before')
44+
@classmethod
45+
def unwrap_extensions(cls, data):
46+
json_properties = list(data.keys())
47+
known_object_properties = ['schema_format', 'content_type', 'headers', 'message_id', 'payload', 'correlation_id', 'tags', 'summary', 'name', 'title', 'description', 'external_docs', 'deprecated', 'examples', 'bindings', 'traits', 'extensions']
48+
unknown_object_properties = [element for element in json_properties if element not in known_object_properties]
49+
# Ignore attempts that validate regular models, only when unknown input is used we add unwrap extensions
50+
if len(unknown_object_properties) == 0:
51+
return data
52+
53+
known_json_properties = ['schemaFormat', 'contentType', 'headers', 'messageId', 'payload', 'correlationId', 'tags', 'summary', 'name', 'title', 'description', 'externalDocs', 'deprecated', 'examples', 'bindings', 'traits', 'extensions']
54+
extensions = {}
55+
for obj_key in list(data.keys()):
56+
if not known_json_properties.__contains__(obj_key):
57+
extensions[obj_key] = data.pop(obj_key, None)
58+
data['extensions'] = extensions
59+
return data
60+
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from __future__ import annotations
2+
from typing import Any, List, Dict, Optional, Union
3+
from pydantic import model_serializer, model_validator, BaseModel, Field
4+
from . import CoreSchemaMetaSchemaObject
5+
from . import MessageObjectPayloadObject
6+
from . import JsonSchemaDraft07SchemaSimpleTypes
7+
from . import SchemaAllOf1DiscriminatorObject
8+
from . import ExternalDocs
9+
class MessageObjectHeadersObject(BaseModel):
10+
dollar_id: Optional[str] = Field(default=None, alias='''$id''')
11+
dollar_schema: Optional[str] = Field(default=None, alias='''$schema''')
12+
dollar_ref: Optional[str] = Field(default=None, alias='''$ref''')
13+
dollar_comment: Optional[str] = Field(default=None, alias='''$comment''')
14+
title: Optional[str] = Field(default=None)
15+
description: Optional[str] = Field(default=None)
16+
default: Optional[Any] = Field(description='''Configuration for the OAuth Authorization Code flow.''', default=None)
17+
read_only: Optional[bool] = Field(default=None, alias='''readOnly''')
18+
write_only: Optional[bool] = Field(default=None, alias='''writeOnly''')
19+
examples: Optional[List[Any]] = Field(default=None)
20+
multiple_of: Optional[float] = Field(default=None, alias='''multipleOf''')
21+
maximum: Optional[float] = Field(default=None)
22+
exclusive_maximum: Optional[Union[float, bool]] = Field(default=None, alias='''exclusiveMaximum''')
23+
minimum: Optional[float] = Field(default=None)
24+
exclusive_minimum: Optional[Union[float, bool]] = Field(default=None, alias='''exclusiveMinimum''')
25+
max_length: Optional[int] = Field(default=None, alias='''maxLength''')
26+
min_length: Optional[int] = Field(default=None, alias='''minLength''')
27+
pattern: Optional[str] = Field(default=None)
28+
additional_items: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None, alias='''additionalItems''')
29+
items: Optional[Union[Any, List[MessageObjectPayloadObject.MessageObjectPayloadObject | bool]]] = Field(default=None)
30+
max_items: Optional[int] = Field(default=None, alias='''maxItems''')
31+
min_items: Optional[int] = Field(default=None, alias='''minItems''')
32+
unique_items: Optional[bool] = Field(default=None, alias='''uniqueItems''')
33+
contains: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None)
34+
max_properties: Optional[int] = Field(default=None, alias='''maxProperties''')
35+
min_properties: Optional[int] = Field(default=None, alias='''minProperties''')
36+
required: Optional[List[str]] = Field(default=None)
37+
additional_properties: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None, alias='''additionalProperties''')
38+
definitions: Optional[dict[str, MessageObjectPayloadObject.MessageObjectPayloadObject | bool]] = Field(default=None)
39+
properties: Optional[dict[str, MessageObjectPayloadObject.MessageObjectPayloadObject | bool]] = Field(default=None)
40+
pattern_properties: Optional[dict[str, MessageObjectPayloadObject.MessageObjectPayloadObject | bool]] = Field(default=None, alias='''patternProperties''')
41+
dependencies: Optional[dict[str, Any | List[str]]] = Field(default=None)
42+
property_names: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None, alias='''propertyNames''')
43+
const: Optional[Any] = Field(description='''Configuration for the OAuth Authorization Code flow.''', default=None)
44+
enum: Optional[List[Any]] = Field(default=None)
45+
type: Optional[Union[JsonSchemaDraft07SchemaSimpleTypes.JsonSchemaDraft07SchemaSimpleTypes, List[JsonSchemaDraft07SchemaSimpleTypes.JsonSchemaDraft07SchemaSimpleTypes]]] = Field(default=None)
46+
format: Optional[str] = Field(default=None)
47+
content_media_type: Optional[str] = Field(default=None, alias='''contentMediaType''')
48+
content_encoding: Optional[str] = Field(default=None, alias='''contentEncoding''')
49+
reserved_if: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None, alias='''if''')
50+
then: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None)
51+
reserved_else: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None, alias='''else''')
52+
all_of: Optional[List[MessageObjectPayloadObject.MessageObjectPayloadObject | bool]] = Field(default=None, alias='''allOf''')
53+
any_of: Optional[List[MessageObjectPayloadObject.MessageObjectPayloadObject | bool]] = Field(default=None, alias='''anyOf''')
54+
one_of: Optional[List[MessageObjectPayloadObject.MessageObjectPayloadObject | bool]] = Field(default=None, alias='''oneOf''')
55+
reserved_not: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject, bool]] = Field(default=None, alias='''not''')
56+
discriminator: Optional[Union[SchemaAllOf1DiscriminatorObject.SchemaAllOf1DiscriminatorObject, str]] = Field(default=None)
57+
external_docs: Optional[ExternalDocs.ExternalDocs] = Field(default=None, alias='''externalDocs''')
58+
deprecated: Optional[bool] = Field(default=None)
59+
extensions: Optional[dict[str, Any]] = Field(exclude=True, default=None)
60+
61+
@model_serializer(mode='wrap')
62+
def custom_serializer(self, handler):
63+
serialized_self = handler(self)
64+
extensions = getattr(self, "extensions")
65+
if extensions is not None:
66+
for key, value in extensions.items():
67+
# Never overwrite existing values, to avoid clashes
68+
if not hasattr(serialized_self, key):
69+
serialized_self[key] = value
70+
71+
return serialized_self
72+
73+
@model_validator(mode='before')
74+
@classmethod
75+
def unwrap_extensions(cls, data):
76+
json_properties = list(data.keys())
77+
known_object_properties = ['dollar_id', 'dollar_schema', 'dollar_ref', 'dollar_comment', 'title', 'description', 'default', 'read_only', 'write_only', 'examples', 'multiple_of', 'maximum', 'exclusive_maximum', 'minimum', 'exclusive_minimum', 'max_length', 'min_length', 'pattern', 'additional_items', 'items', 'max_items', 'min_items', 'unique_items', 'contains', 'max_properties', 'min_properties', 'required', 'additional_properties', 'definitions', 'properties', 'pattern_properties', 'dependencies', 'property_names', 'const', 'enum', 'type', 'format', 'content_media_type', 'content_encoding', 'reserved_if', 'then', 'reserved_else', 'all_of', 'any_of', 'one_of', 'reserved_not', 'discriminator', 'external_docs', 'deprecated', 'extensions']
78+
unknown_object_properties = [element for element in json_properties if element not in known_object_properties]
79+
# Ignore attempts that validate regular models, only when unknown input is used we add unwrap extensions
80+
if len(unknown_object_properties) == 0:
81+
return data
82+
83+
known_json_properties = ['$id', '$schema', '$ref', '$comment', 'title', 'description', 'default', 'readOnly', 'writeOnly', 'examples', 'multipleOf', 'maximum', 'exclusiveMaximum', 'minimum', 'exclusiveMinimum', 'maxLength', 'minLength', 'pattern', 'additionalItems', 'items', 'maxItems', 'minItems', 'uniqueItems', 'contains', 'maxProperties', 'minProperties', 'required', 'additionalProperties', 'definitions', 'properties', 'patternProperties', 'dependencies', 'propertyNames', 'const', 'enum', 'type', 'format', 'contentMediaType', 'contentEncoding', 'if', 'then', 'else', 'allOf', 'anyOf', 'oneOf', 'not', 'discriminator', 'externalDocs', 'deprecated', 'extensions']
84+
extensions = {}
85+
for obj_key in list(data.keys()):
86+
if not known_json_properties.__contains__(obj_key):
87+
extensions[obj_key] = data.pop(obj_key, None)
88+
data['extensions'] = extensions
89+
return data
90+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from __future__ import annotations
2+
from typing import Any, List, Dict, Optional, Union
3+
from pydantic import BaseModel, Field
4+
from . import Reference
5+
from . import MessageObject
6+
class MessageObjectMultiple(BaseModel):
7+
one_of: List[Reference.Reference | MessageObject.MessageObject] = Field(alias='''oneOf''')
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
from __future__ import annotations
2+
from typing import Any, List, Dict, Optional, Union
3+
from pydantic import model_serializer, model_validator, BaseModel, Field
4+
from . import CoreSchemaMetaSchemaObject
5+
from . import JsonSchemaDraft07SchemaType
6+
from . import SchemaAllOf1DiscriminatorObject
7+
from . import ExternalDocs
8+
from . import OpenapiSchema30Xml
9+
class MessageObjectPayloadObject(BaseModel):
10+
dollar_id: Optional[str] = Field(default=None, alias='''$id''')
11+
dollar_schema: Optional[str] = Field(default=None, alias='''$schema''')
12+
dollar_ref: Optional[str] = Field(default=None, alias='''$ref''')
13+
dollar_comment: Optional[str] = Field(default=None, alias='''$comment''')
14+
title: Optional[str] = Field(default=None)
15+
description: Optional[str] = Field(default=None)
16+
default: Optional[Any] = Field(description='''Configuration for the OAuth Authorization Code flow.''', default=None)
17+
read_only: Optional[bool] = Field(default=None, alias='''readOnly''')
18+
write_only: Optional[bool] = Field(default=None, alias='''writeOnly''')
19+
examples: Optional[List[Any]] = Field(default=None)
20+
multiple_of: Optional[float] = Field(default=None, alias='''multipleOf''')
21+
maximum: Optional[float] = Field(default=None)
22+
exclusive_maximum: Optional[Union[float, bool]] = Field(default=None, alias='''exclusiveMaximum''')
23+
minimum: Optional[float] = Field(default=None)
24+
exclusive_minimum: Optional[Union[float, bool]] = Field(default=None, alias='''exclusiveMinimum''')
25+
max_length: Optional[int] = Field(default=None, alias='''maxLength''')
26+
min_length: Optional[int] = Field(default=None, alias='''minLength''')
27+
pattern: Optional[str] = Field(default=None)
28+
additional_items: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None, alias='''additionalItems''')
29+
items: Optional[Union[CoreSchemaMetaSchemaObject.CoreSchemaMetaSchemaObject | bool, List[MessageObjectPayloadObject | bool]]] = Field(default=None)
30+
max_items: Optional[int] = Field(default=None, alias='''maxItems''')
31+
min_items: Optional[int] = Field(default=None, alias='''minItems''')
32+
unique_items: Optional[bool] = Field(default=None, alias='''uniqueItems''')
33+
contains: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None)
34+
max_properties: Optional[int] = Field(default=None, alias='''maxProperties''')
35+
min_properties: Optional[int] = Field(default=None, alias='''minProperties''')
36+
required: Optional[List[str]] = Field(default=None)
37+
additional_properties: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None, alias='''additionalProperties''')
38+
definitions: Optional[dict[str, MessageObjectPayloadObject | bool]] = Field(default=None)
39+
properties: Optional[dict[str, MessageObjectPayloadObject | bool]] = Field(default=None)
40+
pattern_properties: Optional[dict[str, MessageObjectPayloadObject | bool]] = Field(default=None, alias='''patternProperties''')
41+
dependencies: Optional[dict[str, Any | List[str]]] = Field(default=None)
42+
property_names: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None, alias='''propertyNames''')
43+
const: Optional[Any] = Field(description='''Configuration for the OAuth Authorization Code flow.''', default=None)
44+
enum: Optional[List[Any]] = Field(default=None)
45+
type: Optional[JsonSchemaDraft07SchemaType.JsonSchemaDraft07SchemaType] = Field(default=None)
46+
format: Optional[str] = Field(default=None)
47+
content_media_type: Optional[str] = Field(default=None, alias='''contentMediaType''')
48+
content_encoding: Optional[str] = Field(default=None, alias='''contentEncoding''')
49+
reserved_if: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None, alias='''if''')
50+
then: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None)
51+
reserved_else: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None, alias='''else''')
52+
all_of: Optional[List[MessageObjectPayloadObject | bool]] = Field(default=None, alias='''allOf''')
53+
any_of: Optional[List[MessageObjectPayloadObject | bool]] = Field(default=None, alias='''anyOf''')
54+
one_of: Optional[List[MessageObjectPayloadObject | bool]] = Field(default=None, alias='''oneOf''')
55+
reserved_not: Optional[Union[MessageObjectPayloadObject, bool]] = Field(default=None, alias='''not''')
56+
discriminator: Optional[Union[SchemaAllOf1DiscriminatorObject.SchemaAllOf1DiscriminatorObject, str]] = Field(default=None)
57+
external_docs: Optional[ExternalDocs.ExternalDocs] = Field(default=None, alias='''externalDocs''')
58+
deprecated: Optional[bool] = Field(default=None)
59+
nullable: Optional[bool] = Field(default=None)
60+
example: Optional[Any] = Field(description='''Configuration for the OAuth Authorization Code flow.''', default=None)
61+
xml: Optional[OpenapiSchema30Xml.OpenapiSchema30Xml] = Field(default=None)
62+
extensions: Optional[dict[str, Any]] = Field(exclude=True, default=None)
63+
64+
@model_serializer(mode='wrap')
65+
def custom_serializer(self, handler):
66+
serialized_self = handler(self)
67+
extensions = getattr(self, "extensions")
68+
if extensions is not None:
69+
for key, value in extensions.items():
70+
# Never overwrite existing values, to avoid clashes
71+
if not hasattr(serialized_self, key):
72+
serialized_self[key] = value
73+
74+
return serialized_self
75+
76+
@model_validator(mode='before')
77+
@classmethod
78+
def unwrap_extensions(cls, data):
79+
json_properties = list(data.keys())
80+
known_object_properties = ['dollar_id', 'dollar_schema', 'dollar_ref', 'dollar_comment', 'title', 'description', 'default', 'read_only', 'write_only', 'examples', 'multiple_of', 'maximum', 'exclusive_maximum', 'minimum', 'exclusive_minimum', 'max_length', 'min_length', 'pattern', 'additional_items', 'items', 'max_items', 'min_items', 'unique_items', 'contains', 'max_properties', 'min_properties', 'required', 'additional_properties', 'definitions', 'properties', 'pattern_properties', 'dependencies', 'property_names', 'const', 'enum', 'type', 'format', 'content_media_type', 'content_encoding', 'reserved_if', 'then', 'reserved_else', 'all_of', 'any_of', 'one_of', 'reserved_not', 'discriminator', 'external_docs', 'deprecated', 'nullable', 'example', 'xml', 'extensions']
81+
unknown_object_properties = [element for element in json_properties if element not in known_object_properties]
82+
# Ignore attempts that validate regular models, only when unknown input is used we add unwrap extensions
83+
if len(unknown_object_properties) == 0:
84+
return data
85+
86+
known_json_properties = ['$id', '$schema', '$ref', '$comment', 'title', 'description', 'default', 'readOnly', 'writeOnly', 'examples', 'multipleOf', 'maximum', 'exclusiveMaximum', 'minimum', 'exclusiveMinimum', 'maxLength', 'minLength', 'pattern', 'additionalItems', 'items', 'maxItems', 'minItems', 'uniqueItems', 'contains', 'maxProperties', 'minProperties', 'required', 'additionalProperties', 'definitions', 'properties', 'patternProperties', 'dependencies', 'propertyNames', 'const', 'enum', 'type', 'format', 'contentMediaType', 'contentEncoding', 'if', 'then', 'else', 'allOf', 'anyOf', 'oneOf', 'not', 'discriminator', 'externalDocs', 'deprecated', 'nullable', 'example', 'xml', 'extensions']
87+
extensions = {}
88+
for obj_key in list(data.keys()):
89+
if not known_json_properties.__contains__(obj_key):
90+
extensions[obj_key] = data.pop(obj_key, None)
91+
data['extensions'] = extensions
92+
return data
93+

0 commit comments

Comments
 (0)