Cython API: various improvements and checks

This commit is contained in:
Celine Mercier
2017-07-28 13:15:13 +02:00
parent b9c65a871f
commit 35b0c55a8c
10 changed files with 178 additions and 94 deletions

View File

@ -20,7 +20,7 @@ from ..capi.obiview cimport obi_view_add_column, \
obi_view_get_pointer_on_column_in_view, \
Obiview_p
from ..object cimport OBIObjectClosedInstance
from ..object cimport OBIDeactivatedInstanceError
from obitools3.utils cimport tobytes, \
bytes2str, \
@ -76,7 +76,7 @@ cdef class Column(OBIWrapper) :
cdef char* elements_names_p
if not view.active() :
raise OBIObjectClosedInstance()
raise OBIDeactivatedInstanceError()
if alias_b == b"" :
alias_b = column_name_b
@ -117,7 +117,7 @@ cdef class Column(OBIWrapper) :
cdef type column_class
if not view.active() :
raise OBIObjectClosedInstance()
raise OBIDeactivatedInstanceError()
column_pp = obi_view_get_pointer_on_column_in_view(view.pointer(),
column_name_b)
@ -139,16 +139,17 @@ cdef class Column(OBIWrapper) :
return column
@OBIWrapper.checkIsActive
def add_to_view(self,
View view,
View view,
object column_name=None) :
cdef bytes alias
cdef OBIDMS_column_p column_p = self.pointer()
if not view.active() :
raise OBIObjectClosedInstance()
raise OBIDeactivatedInstanceError()
if (column_name is None):
alias = self._alias
@ -177,7 +178,8 @@ cdef class Column(OBIWrapper) :
view.register(self)
@OBIWrapper.checkIsActive
def __len__(self):
'''
implements the len() function for the Column class
@ -186,7 +188,8 @@ cdef class Column(OBIWrapper) :
'''
return self.lines_used
@OBIWrapper.checkIsActive
def __sizeof__(self):
'''
returns the size of the C object wrapped by the Column instance
@ -194,21 +197,26 @@ cdef class Column(OBIWrapper) :
cdef OBIDMS_column_header_p header = self.pointer().header
return header.header_size + header.data_size
@OBIWrapper.checkIsActive
def __iter__(self):
cdef index_t line_nb
for line_nb in range(self.lines_used):
yield self.get_line(line_nb)
# TODO check time efficiency with and without
@OBIWrapper.checkIsActive
def __setitem__(self, index_t line_nb, object value):
self.set_line(line_nb, value)
@OBIWrapper.checkIsActive
def __getitem__(self, index_t line_nb):
return self.get_line(line_nb)
@OBIWrapper.checkIsActive
def __str__(self) :
cdef str to_print
cdef object line
@ -217,14 +225,15 @@ cdef class Column(OBIWrapper) :
to_print = to_print + str(line) + "\n"
return to_print
@OBIWrapper.checkIsActive
def __repr__(self) :
cdef bytes s
s = self._alias + b", original name: " + self.original_name + b", version " + str2bytes(str(self.version)) + b", data type: " + self.data_type
return bytes2str(s)
cpdef close(self): # TODO discuss, can't be called bc then bug when closing view that tries to close it in C
def close(self): # TODO discuss, can't be called bc then bug when closing view that tries to close it in C
cdef OBIDMS_column_p pointer
@ -239,54 +248,76 @@ cdef class Column(OBIWrapper) :
# Column alias property getter and setter
@property
def name(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self._alias
@name.setter
def name(self, object new_alias): # @DuplicatedSignature
if not self.active() :
raise OBIDeactivatedInstanceError()
self._view.rename_column(self._alias, new_alias)
# elements_names property getter
@property
def elements_names(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return obi_get_elements_names(self.pointer()).split(b';')
# nb_elements_per_line property getter
@property
def nb_elements_per_line(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self.pointer().header.nb_elements_per_line
# data_type property getter
@property
def data_type(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return name_data_type(self.data_type_int)
# data_type integer code property getter
@property
def data_type_int(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self.pointer().header.returned_data_type
# original_name property getter
@property
def original_name(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self.pointer().header.name
# version property getter
@property
def version(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self.pointer().header.version
# lines_used property getter
@property
def lines_used(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self.pointer().header.lines_used
# comments property getter
@property
def comments(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return self.pointer().header.comments
# creation_date property getter
@property
def creation_date(self):
if not self.active() :
raise OBIDeactivatedInstanceError()
return obi_format_date(self.pointer().header.creation_date)
@ -295,10 +326,14 @@ cdef class Column(OBIWrapper) :
cdef class Column_multi_elts(Column) :
@OBIWrapper.checkIsActive
def __getitem__(self, index_t line_nb):
return Column_line(self, line_nb)
cpdef set_line(self, index_t line_nb, object values):
cdef object element_name
if not self.active() :
raise OBIDeactivatedInstanceError()
if values is None :
for element_name in self.elements_names :
self.set_item(line_nb, element_name, None)