Source code for notiondb.SchemaProperty

from abc import ABC, abstractmethod
from dataclasses import dataclass


[docs]class SchemaProperty(ABC): """Data class for all schema objects. All schema objects have: - type (string) - name (string). Optional - id (string). Optional if name is specified - config (dict). Optional, type specific following Notion API For example, to create a 'checkbox' column called 'In stock': >>> SchemaObject(type="checkbox", name="In stock") {'name': 'In stock', 'type': 'checkbox', 'checkbox': {}} To create a 'select' column called 'Color' with options 'red', 'green', 'blue': >>> SchemaObject(type="select", name="Color", config={"options": ["red", "green", "blue"]}) {'name': 'Color', 'type': 'select', 'select': {'options': ['red', 'green', 'blue']}} To create a schema object from a notion response: >>> notion_response { "id": "fk%5EY", "name": "In stock", "type": "checkbox", "checkbox": {} } >>> SchemaObject(**notion_response) {'id': 'fk%5EY', 'name': 'In stock', 'type': 'checkbox', 'checkbox': {}} To update the config of a schema object: >>> schema_object = SchemaObject(type='number', name='Price') >>> schema_object.config = {"format": "number"} >>> schema_object {'name': 'Price', 'type': 'number', 'number': {'format': 'number'}} Or use: >>> schema_object["format"] = "number" >>> schema_object {'name': 'Price', 'type': 'number', 'number': {'format': 'number'}} """ def __init__(self, **kwargs): if "type" not in kwargs: raise ValueError("type must be specified") if "name" not in kwargs and "id" not in kwargs: raise ValueError("name or id must be specified") self._obj = kwargs if "config" in kwargs: self._obj[self.type] = kwargs["config"] del self._obj["config"] self._obj[self.type] = self._obj.get(self.type, {}) @property def type(self): """Type of the column""" return self._obj.get("type") @property def key(self): """Returns id if exists, otherwise name""" return self.id or self.name @property def id(self): """ID of the column""" return self._obj.get("id", None) @property def name(self): """Name of the column""" return self._obj.get("name", None) @property def config(self): """Returns the configuration of the column""" return self._obj[self.type] @config.setter def config(self, value): self._obj[self.type] = value @property def notion(self): """Returns the notion representation of the column""" return self._obj def __getitem__(self, key): return self._obj[self.type][key] def __setitem__(self, key, value): self._obj[self.type][key] = value def __str__(self): return f"ID - {self.id} {self.name} ({self.type}) - Config: {self.config}" def __repr__(self): return str(self._obj) def __hash__(self) -> int: return hash(self.id or self.name)