diff --git a/.gitignore b/.gitignore index 7bbc71c0..93b26b82 100644 --- a/.gitignore +++ b/.gitignore @@ -99,3 +99,6 @@ ENV/ # mypy .mypy_cache/ + +# Jetbrains project files +.idea/ diff --git a/openapi_core/schemas.py b/openapi_core/schemas.py index 31aaca64..66793a63 100644 --- a/openapi_core/schemas.py +++ b/openapi_core/schemas.py @@ -63,6 +63,15 @@ def get_all_properties(self): return properties + def get_all_required_properties(self): + required = self.required.copy() + + for subschema in self.all_of: + subschema_req = subschema.get_all_required_properties() + required += subschema_req + + return required + def get_cast_mapping(self): mapping = DEFAULT_CAST_CALLABLE_GETTER.copy() mapping.update({ @@ -121,6 +130,7 @@ def _unmarshal_object(self, value): value = loads(value) all_properties = self.get_all_properties() + all_required_properties = self.get_all_required_properties() all_properties_keys = all_properties.keys() value_keys = value.keys() @@ -135,7 +145,7 @@ def _unmarshal_object(self, value): try: prop_value = value[prop_name] except KeyError: - if prop_name in self.required: + if prop_name in all_required_properties: raise MissingProperty( "Missing schema property {0}".format(prop_name)) if not prop.nullable and not prop.default: @@ -167,7 +177,7 @@ def __init__(self, dereferencer): def create(self, schema_spec): schema_deref = self.dereferencer.dereference(schema_spec) - schema_type = schema_deref.get('type') + schema_type = schema_deref.get('type', 'object') schema_format = schema_deref.get('format') model = schema_deref.get('x-model', None) required = schema_deref.get('required', False) diff --git a/tests/integration/data/v3.0/petstore.yaml b/tests/integration/data/v3.0/petstore.yaml index 405bdeac..81fe7b1f 100644 --- a/tests/integration/data/v3.0/petstore.yaml +++ b/tests/integration/data/v3.0/petstore.yaml @@ -144,8 +144,13 @@ components: type: integer format: int64 PetCreate: - type: object x-model: PetCreate + allOf: + - $ref: "#/components/schemas/PetCreatePartOne" + - $ref: "#/components/schemas/PetCreatePartTwo" + PetCreatePartOne: + type: object + x-model: PetCreatePartOne required: - name properties: @@ -155,6 +160,10 @@ components: $ref: "#/components/schemas/Tag" address: $ref: "#/components/schemas/Address" + PetCreatePartTwo: + type: object + x-model: PetCreatePartTwo + properties: position: $ref: "#/components/schemas/Position" healthy: diff --git a/tests/integration/test_petstore.py b/tests/integration/test_petstore.py index d1fd9f9e..e67a6ab8 100644 --- a/tests/integration/test_petstore.py +++ b/tests/integration/test_petstore.py @@ -654,4 +654,4 @@ def test_get_pet_not_found(self, spec, response_validator): response_result = response_validator.validate(request, response) assert response_result.errors == [] - assert response_result.data == data + assert response_result.data == data_json diff --git a/tests/integration/test_validators.py b/tests/integration/test_validators.py index 8131d7f5..ab08bb53 100644 --- a/tests/integration/test_validators.py +++ b/tests/integration/test_validators.py @@ -245,6 +245,7 @@ def test_get_pets(self, validator): 'data': [ { 'id': 1, + 'name': 'Sparky' }, ], }