def DBObject(table_name, versioning=VersioningTypes.NONE):
    """Classes annotated with DBObject gain persistence methods."""
    def wrapped(cls):
        field_names = set()
        all_fields = []

        for name in dir(cls):
            fld = getattr(cls, name)
            if fld and isinstance(fld, Field):
                fld.name = name
                all_fields.append(fld)
                field_names.add(name)

        def add_missing_field(name, default='', insert_pos=None):
            if name not in field_names:
                fld = Field(default=default)
                fld.name = name
                all_fields.insert(
                    len(all_fields) if insert_pos is None else insert_pos,
                    fld
                )

        add_missing_field('id', insert_pos=0)
        add_missing_field('_create_date')
        add_missing_field('_last_update')
        if versioning == VersioningTypes.DELTA_HISTORY:
            add_missing_field('_version_hist', default=list)

        # Things we count on as part of our processing
        cls.__table_name__ = table_name
        cls.__versioning__ = versioning
        cls.__fields__ = all_fields

        # Give them a ctor for free - but make sure we aren't clobbering one
        if not ctor_overridable(cls):
            raise TypeError(
                'Classes with user-supplied __init__ should not be decorated '
                'with DBObject. Use the setup method'
            )
        cls.__init__ = _auto_init

        # Duck-type the class for our data methods
        cls.get_table_name = classmethod(_get_table_name)
        cls.get_id = _get_id
        cls.set_id = _set_id
        cls.to_data = _to_data
        cls.from_data = classmethod(_from_data)
        cls.index_names = classmethod(_index_names)
        cls.indexes = _indexes
        # Bonus methods they get for using gludb.simple
        cls.get_version_hist = _get_version_hist

        # Register with our abc since we actually implement all necessary
        # functionality
        Storable.register(cls)

        # And now that we're registered, we can also get the database
        # read/write functionality for free
        cls = DatabaseEnabled(cls)

        if versioning == VersioningTypes.DELTA_HISTORY:
            cls.save = _delta_save(cls.save)

        return cls

    return wrapped
def DBObject ( table_name , versioning = VersioningTypes . NONE ) : def wrapped ( cls ) : field_names = set ( ) all_fields = [ ] for name in dir ( cls ) : fld = getattr ( cls , name ) if fld and isinstance ( fld , Field ) : fld . name = name all_fields . append ( fld ) field_names . add ( name ) def add_missing_field ( name , default = '' , insert_pos = None ) : if name not in field_names : fld = Field ( default = default ) fld . name = name all_fields . insert ( len ( all_fields ) if insert_pos is None else insert_pos , fld ) add_missing_field ( 'id' , insert_pos = 0 ) add_missing_field ( '_create_date' ) add_missing_field ( '_last_update' ) if versioning == VersioningTypes . DELTA_HISTORY : add_missing_field ( '_version_hist' , default = list ) cls . __table_name__ = table_name cls . __versioning__ = versioning cls . __fields__ = all_fields if not ctor_overridable ( cls ) : raise TypeError ( 'Classes with user-supplied __init__ should not be decorated ' 'with DBObject. Use the setup method' ) cls . __init__ = _auto_init cls . get_table_name = classmethod ( _get_table_name ) cls . get_id = _get_id cls . set_id = _set_id cls . to_data = _to_data cls . from_data = classmethod ( _from_data ) cls . index_names = classmethod ( _index_names ) cls . indexes = _indexes cls . get_version_hist = _get_version_hist Storable . register ( cls ) cls = DatabaseEnabled ( cls ) if versioning == VersioningTypes . DELTA_HISTORY : cls . save = _delta_save ( cls . save ) return cls return wrapped
Classes annotated with DBObject gain persistence methods.