diff --git a/openapi3/schemas.py b/openapi3/schemas.py index fd57ccb..2341fc4 100644 --- a/openapi3/schemas.py +++ b/openapi3/schemas.py @@ -85,7 +85,7 @@ def _parse_data(self): self.anyOf = self._get("anyOf", list) self.items = self._get("items", ["Schema", "Reference"]) self.properties = self._get("properties", ["Schema", "Reference"], is_map=True) - self.additionalProperties = self._get("additionalProperties", [bool, dict]) + self.additionalProperties = self._get("additionalProperties", ["Schema", "Reference"]) self.description = self._get("description", str) self.format = self._get("format", str) self.default = self._get("default", TYPE_LOOKUP.get(self.type, str)) # TODO - str as a default? @@ -157,6 +157,11 @@ def model(self, data): # TODO - perhaps assert that the type of data matches the type we # expected return data + elif self.additionalProperties: + o = {} + for k, v in data.items(): + o[k] = self.additionalProperties.get_type()(v, self.additionalProperties) + return o elif self.type == "array": return [self.items.get_type()(i, self.items) for i in data] else: @@ -285,14 +290,20 @@ def __init__(self, data, schema): # initialize all slots to None setattr(self, s, None) + if schema.additionalProperties: + prop = schema.additionalProperties + for k, v in data.items(): + setattr(self, k, prop.model(v)) + return + keys = set(data.keys()) - frozenset(self.__slots__) + if keys: raise ModelError("Schema {} got unexpected attribute keys {}".format(self.__class__.__name__, keys)) # collect the data into this model for k, v in data.items(): prop = schema.properties[k] - if prop.type == "array": # handle arrays item_schema = prop.items