def _get_model_definition(model: Type[BaseModel], model_name_map: ModelDict, schemas: Dict[str, Dict]) -> Any: """ ВАЖНО! Аргументы model_name_map и schemas модифицируются в процессе выполнения функции """ model_schema, model_definitions, a = model_process_schema( model, model_name_map=model_name_map, ref_prefix='#/components/schemas/', ) # TODO тут стоит сверить с существющими моделями. Чтоб исключить дубликаты # обновляем по ссылке все схемы связанных объектов schemas.update(model_definitions) # при обращении к элементу словаря, магия добавляет его в этот словарь и # все его дочерние модели _ = model_name_map[model] # хак для того чтоб в список components.schemas не попадали искусственно # созданные классы запроса и ответа # (MethodnameRequestParams и MethodnameResponse) del model_name_map[model] return model_schema
def get_model_definitions( *, flat_models: Set[Type[BaseModel]], model_name_map: Dict[Type[BaseModel], str]) -> Dict[str, Any]: definitions: Dict[str, Dict] = {} for model in flat_models: m_schema, m_definitions, m_nested_models = model_process_schema( model, model_name_map=model_name_map, ref_prefix=REF_PREFIX) definitions.update(m_definitions) model_name = model_name_map[model] definitions[model_name] = m_schema return definitions
def get_model_definitions( *, models: Set[TypeModelOrEnum], model_name_map: Dict[TypeModelOrEnum, str], ) -> Dict[str, Any]: definitions: Dict[str, Dict] = {} for model in models: model_schema, model_definitions, _ = model_process_schema( model, model_name_map=model_name_map, ref_prefix=REF_PREFIX ) definitions.update(model_definitions) model_name = model_name_map[model] definitions[model_name] = model_schema return definitions
def get_model_definitions( *, flat_models: Set[Union[Type[BaseModel], Type[Enum]]], model_name_map: Dict[Union[Type[BaseModel], Type[Enum]], str], ) -> Dict[str, Any]: definitions: Dict[str, Dict] = {} for model in flat_models: # ignore mypy error until enum schemas are released m_schema, m_definitions, m_nested_models = model_process_schema( model, model_name_map=model_name_map, ref_prefix=REF_PREFIX # type: ignore ) definitions.update(m_definitions) model_name = model_name_map[model] definitions[model_name] = m_schema return definitions
def get_model_definitions( *, flat_models: Set[Union[Type[BaseModel], Type[Enum]]], model_name_map: Dict[Union[Type[BaseModel], Type[Enum]], str], ) -> Dict[str, Any]: definitions: Dict[str, Dict] = {} for model in filter(lambda m: issubclass(m, BaseModel), flat_models): # 将类型为ObjectId的字段的类型改为str for field in model.__fields__.values(): replace_field_type(field) for model in flat_models: # ignore mypy error until enum schemas are released m_schema, m_definitions, m_nested_models = model_process_schema( model, model_name_map=model_name_map, ref_prefix=REF_PREFIX # type: ignore ) definitions.update(m_definitions) model_name = model_name_map[model] definitions[model_name] = m_schema return definitions
def discover( registry: Union[RpcRegistry, object], *, servers: Optional[List[Server]] = None, external_docs: Optional[ExternalDocs] = None, ) -> OpenRPC: methods = _get_methods(registry) model_name_map = ModelDict() schemas: Dict[str, Dict] = {} method_models = _get_methods_models(methods, model_name_map=model_name_map, schemas=schemas) for k, v in model_name_map.items(): model_schema, model_definitions, _ = model_process_schema( k, model_name_map=model_name_map, ref_prefix='#/components/schemas/', ) schemas[v] = model_schema for key in model_definitions.keys(): if key not in schemas: schemas[key] = model_definitions[key] if isinstance(registry, RpcRegistry): info_kwargs = {'title': '', 'version': registry.version or '0'} if registry.title is not None: info_kwargs['title'] = registry.title if registry.description: info_kwargs['description'] = registry.description else: # legacy version = '0' if hasattr(registry, '__version__'): version = getattr(registry, '__version__') info_kwargs = { 'title': '', 'version': version, } if not isinstance(registry, list) and registry.__doc__: docstr = docstring_parser.parse(registry.__doc__) if docstr.short_description: info_kwargs['title'] = docstr.short_description if docstr.long_description: info_kwargs['description'] = docstr.long_description orpc_kwargs = { 'openrpc': OPENRPC_VERSION, 'info': Info(**info_kwargs), 'methods': method_models, } if servers is not None: orpc_kwargs['servers'] = servers if external_docs is not None: orpc_kwargs['external_docs'] = external_docs if len(schemas) > 0: orpc_kwargs['components'] = {'schemas': schemas} return OpenRPC(**orpc_kwargs)
from pydantic import BaseModel from pydantic.schema import model_process_schema from dictknife import loading class User(BaseModel): id: str = None name: str createdAt: str = None # datetime REF_PREFIX = "#/components/schemas/" model_name_map = {} m_schema, m_definitions = model_process_schema(User, model_name_map=model_name_map, ref_prefix=REF_PREFIX) print("## m_schema") loading.dumpfile(m_schema) print("## m_definitions") loading.dumpfile(m_definitions)