Source code for onetick.py.core._source.schema
from typing import Dict
import collections.abc
[docs]class Schema(collections.abc.Mapping):
    """
    A source data schema proxy. It allows to work with source schema in
    a frozen-dict manner. It also allows to set using the ``set``
    and update a source schema using the ``update`` methods.
    """
    dict_cls = dict
    def __init__(self, _base_source=None, _hidden_columns=None, **kwargs):
        self._dict = self.dict_cls(**kwargs)
        self._base_source = _base_source
        self._hash = None
        self._hidden_columns = _hidden_columns if _hidden_columns else {}
    def __getitem__(self, item):
        if isinstance(item, list):
            return {key: value for key, value in self._dict.items()
                    if key in item}
        if item in self._hidden_columns:
            return self._hidden_columns[item]
        return self._dict[item]
    def __setitem__(self, key, value):
        self.update(**{key: value})
    def __contains__(self, item):
        if item in self._hidden_columns:
            return True
        return item in self._dict
    def __iter__(self):
        return iter(self._dict)
[docs]    def items(self):
        return self._dict.items() 
[docs]    def keys(self):
        return self._dict.keys() 
[docs]    def copy(self):
        return self._dict.copy() 
[docs]    def set(self, **new_schema: type):
        """
        Drops the python schema representation of a source and sets the new one from the `new_schema`
        Parameters
        ----------
        new_schema: Dict[str, type]
            schema in the column-name -> type format
        Returns
        -------
            None
        """
        self._base_source.set_schema(**new_schema) 
[docs]    def update(self, **other_schema: type):
        """
        Updates the python schema representation of a source: values from matching keys
        will be overridden from the `other_schema`, values from new keys will be added.
        Parameters
        ----------
        other_schema:
            schema in the column-name -> type format
        Returns
        -------
            None
        """
        current_schema = self._base_source.columns(skip_meta_fields=True)
        current_schema.update(other_schema)
        self._base_source.set_schema(**current_schema) 
    def __len__(self):
        return len(self._dict)
    def __repr__(self):
        return repr(self._dict)
    def __hash__(self):
        if self._hash is None:
            h = 0
            for key, value in self._dict.items():
                h ^= hash((key, value))
            self._hash = h
        return self._hash