#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by pat on 4/5/18
"""
.. currentmodule:: model
.. moduleauthor:: Pat Daburu <pat@daburu.net>
This module contains general members to help you work with the model.
"""
import inspect
import pkgutil
import gcudm.models
from .meta import Column, COLUMN_META_ATTR, TableMeta, TABLE_META_ATTR
_SKIP_ON_LOAD = [
] #: the names of modules that are not loaded automatically with the model
IS_MODEL_CLASS = '__model_cls__' #: signifies a model class
[docs]def model(label: str):
"""
Use this decorator to provide meta-data for your model class.
:param label: the friendly label for the class
"""
def modelify(cls):
"""
This inner function updates the model class.
:param cls: the decorated class
:return: the original class
"""
# In all cases, flag the class as a 'model' class.
setattr(cls, IS_MODEL_CLASS, True)
# If the label parameter hasn't already been specified...
if not hasattr(cls, TABLE_META_ATTR):
# ...update it now.
setattr(cls, TABLE_META_ATTR, TableMeta(label=label))
# Let's go through every class in the hierarchy...
for mro in inspect.getmro(cls):
for name, obj in inspect.getmembers(mro):
# If this attribute:
# 1) has the same name as an attribute of the current class;
# 2) is a Column; and
# 3) has a 'meta' attribute...
if (hasattr(cls, name) and
isinstance(obj, Column) and
hasattr(obj, COLUMN_META_ATTR)):
# ...we need to take a closer look at it.
column: Column = getattr(cls, name)
# If this class' own attribute is missing the 'meta'
# information...
if not hasattr(column, COLUMN_META_ATTR):
# ...copy it from the parent class.
setattr(column,
COLUMN_META_ATTR,
getattr(obj, COLUMN_META_ATTR))
# Return the original class.
return cls
# Return the inner function.
return modelify
[docs]def load():
"""
Load the data model.
"""
package = gcudm.models
prefix = package.__name__ + '.'
for _, modname, _ in pkgutil.walk_packages(
package.__path__, prefix):
if modname in _SKIP_ON_LOAD:
continue
else:
_ = __import__(modname)