diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 345460e..e0de92e 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -51,6 +51,11 @@ cdef class DMS : """ return __OBIDMS_COLUMN_CLASS__[obitype][1] + @staticmethod + cdef type get_view_class(bytes viewtype): + return __OBIDMS_VIEW_CLASS__[viewtype] + + def __init__(self, object dms_name) : ''' Constructor of a obitools3.dms.DMS instance. @@ -114,6 +119,18 @@ cdef class DMS : for v in p.glob("*.obiview"): yield str2bytes(v.stem) + + def values(self): + cdef bytes view_name + + for view_name in self.keys(): + yield self.get_view(view_name) + + def items(self): + cdef bytes view_name + + for view_name in self.keys(): + yield (view_name,self.get_view(view_name)) def __contains__(self,key): cdef str key_s = tostr(key) @@ -128,4 +145,21 @@ cdef class DMS : cpdef int view_count(self): return PyList_Size(list(self.keys())) + + def get_view(self): + raise NotImplemented + + def __len__(self): + return self.view_count() + + def __getitem__(self, object view_name): + return self.get_view(view_name) + + def __iter__(self): + return self.keys() + + cpdef bint is_view_writable(self, object view_name): + raise NotImplemented + + \ No newline at end of file diff --git a/python/obitools3/dms/view/view.pyx b/python/obitools3/dms/view/view.pyx index 0852eb2..d1b6287 100644 --- a/python/obitools3/dms/view/view.pyx +++ b/python/obitools3/dms/view/view.pyx @@ -12,6 +12,8 @@ from ..capi.obiview cimport Alias_column_pair_p, \ from ..capi.obidmscolumn cimport OBIDMS_column_p +from .dms cimport __OBIDMS_VIEW_CLASS__ + from obitools3.utils cimport tobytes, \ bytes2str @@ -102,10 +104,10 @@ cdef class View : return view def close(self): - if (self._pointer != NULL - and obi_save_and_close_view(self._pointer) < 0) : - raise Exception("Problem closing view %s" % - bytes2str(self.name)) + if (self._pointer != NULL): + if obi_save_and_close_view(self._pointer) < 0 : + raise Exception("Problem closing view %s" % + bytes2str(self.name)) def __dealloc__(self): self.close() @@ -238,7 +240,7 @@ cdef class View : # view type property getter @property def type(self): # @ReservedAssignment - return bytes2str(self._pointer.infos.view_type) + return self._pointer.infos.view_type # comments property getter @property @@ -410,3 +412,15 @@ cdef class Line : # return view_infos_d +cdef register_view_class(bytes viewtype, + type classe): + """ + Each sub class of `dms.View` needs to be registered after its declaration + to declare its relationship with an `OBIType_t` + """ + global __OBIDMS_VIEW_CLASS__ + + assert issubclass(classe,View) + + __OBIDMS_VIEW_CLASS__[viewtype]=classe +