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