Esempio n. 1
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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)
Esempio n. 7
0
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)