#!/usr/bin/python

import core.models
import inspect
from core.models import XOSBase, PlModelMixIn
import pdb


def count(lst):
    c = 0
    for l in lst[0]:
        ll = l.lstrip()
        if (ll and not ll.startswith('#') and ll.rstrip() != 'pass' and 'ModelLink' not in ll and 'CHOICES' not in ll):
            c += 1
    return c


def is_model_class(model):
    """ Return True if 'model' is something that we're interested in """
    if not inspect.isclass(model):
        return False
    if model.__name__ in ["PlModelMixIn"]:
        return False
    bases = inspect.getmro(model)
    bases = [x.__name__ for x in bases]
    if ("XOSBase" in bases) or ("PlModelMixIn" in bases):
        return True

    return False


for a in dir(core.models):
    x = getattr(core.models, a)
    if (is_model_class(x)):
        lines = inspect.getsourcelines(x)
        print x.__name__, ":", count(lines)
