Source code for xedocs.schemas.base_schemas

import re
from typing import ClassVar

import rframe
from .._settings import settings


def camel_to_snake(name):
    name = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
    return re.sub("([a-z0-9])([A-Z])", r"\1_\2", name).lower()


[docs] class XeDoc(rframe.BaseSchema): """Base class for all xedocs schemas.""" _ALIAS: ClassVar = "" _CATEGORY: ClassVar = "general" _XEDOCS = {} class Config: allow_population_by_field_name = True def __init_subclass__(cls) -> None: super().__init_subclass__() if "_ALIAS" not in cls.__dict__: cls._ALIAS = camel_to_snake(cls.__name__) if cls._ALIAS and cls._ALIAS not in cls._XEDOCS: cls._XEDOCS[cls._ALIAS] = cls
[docs] @classmethod def default_datasource(cls): """This method is called when a query method is called and no datasource is passed. """ import xedocs return xedocs.default_datasource_for(cls)
[docs] @classmethod def help(cls): help_str = f""" Schema name: {cls.__name__} Alias: {cls._ALIAS} Index fields: {list(cls.get_index_fields())} Column fields: {list(cls.get_column_fields())} """ print(help_str)
def __repr__(self): idx_str = ", ".join( [f"{attr}={getattr(self, attr)}" for attr in self.get_index_fields()] ) values_str = ", ".join( [f"{attr}={getattr(self, attr)}" for attr in self.get_column_fields()] ) header = f"Xenon {type(self).__name__} Document" repr_str = f""" {header} {len(header)*'-'} Category: {self._CATEGORY} Alias: {self._ALIAS} Index: {idx_str} Values: {values_str} """ return repr_str
[docs] class VersionedXeDoc(XeDoc): _ALIAS = "" version: str = rframe.Index(max_length=20)