|
9 | 9 | from typing import Type |
10 | 10 |
|
11 | 11 | from openapi_core.extensions.models.types import Field |
| 12 | +from openapi_core.spec import Spec |
12 | 13 |
|
13 | 14 |
|
14 | 15 | class DictFactory: |
15 | 16 |
|
16 | 17 | base_class = dict |
17 | 18 |
|
18 | | - def create(self, fields: Iterable[Field]) -> Type[Dict[Any, Any]]: |
| 19 | + def create( |
| 20 | + self, schema: Spec, fields: Iterable[Field] |
| 21 | + ) -> Type[Dict[Any, Any]]: |
19 | 22 | return self.base_class |
20 | 23 |
|
21 | 24 |
|
22 | | -class DataClassFactory(DictFactory): |
| 25 | +class ModelFactory(DictFactory): |
23 | 26 | def create( |
24 | 27 | self, |
| 28 | + schema: Spec, |
25 | 29 | fields: Iterable[Field], |
26 | | - name: str = "Model", |
27 | 30 | ) -> Type[Any]: |
| 31 | + name = schema.getkey("x-model") |
| 32 | + if name is None: |
| 33 | + return super().create(schema, fields) |
| 34 | + |
28 | 35 | return make_dataclass(name, fields, frozen=True) |
29 | 36 |
|
30 | 37 |
|
31 | | -class ModelClassImporter(DataClassFactory): |
| 38 | +class ModelPathFactory(ModelFactory): |
32 | 39 | def create( |
33 | 40 | self, |
| 41 | + schema: Spec, |
34 | 42 | fields: Iterable[Field], |
35 | | - name: str = "Model", |
36 | | - model: Optional[str] = None, |
37 | 43 | ) -> Any: |
38 | | - if model is None: |
39 | | - return super().create(fields, name=name) |
40 | | - |
41 | | - model_class = self._get_class(model) |
42 | | - if model_class is not None: |
43 | | - return model_class |
44 | | - |
45 | | - return super().create(fields, name=model) |
| 44 | + model_class_path = schema.getkey("x-model-path") |
| 45 | + if model_class_path is None: |
| 46 | + return super().create(schema, fields) |
46 | 47 |
|
47 | | - def _get_class(self, model_class_path: str) -> Optional[object]: |
48 | | - try: |
49 | | - return locate(model_class_path) |
50 | | - except ErrorDuringImport: |
51 | | - return None |
| 48 | + return locate(model_class_path) |
0 commit comments