Cython view API: added NUC_SEQS views and sequence classes + changed

cloning API
This commit is contained in:
Celine Mercier
2017-04-21 12:08:14 +02:00
parent 71b1a43df8
commit c2af955b78
5 changed files with 208 additions and 40 deletions

View File

@ -9,6 +9,7 @@ from libc.stdlib cimport malloc
from ..capi.obiview cimport Alias_column_pair_p, \
obi_new_view, \
obi_open_view, \
obi_clone_view, \
obi_save_and_close_view, \
obi_view_get_pointer_on_column_in_view, \
obi_view_delete_column, \
@ -26,6 +27,8 @@ from ..object cimport OBIObjectClosedInstance
from ..column.column cimport Column
from obitools3.dms.view import typed_view
from ..capi.obitypes cimport only_ATGC, \
OBI_BOOL, \
OBI_CHAR, \
@ -34,27 +37,16 @@ from ..capi.obitypes cimport only_ATGC, \
OBI_QUAL, \
OBI_SEQ, \
OBI_STR
import importlib
import inspect
import pkgutil
cdef class View(OBIWrapper) :
cdef inline Obiview_p pointer(self) :
return <Obiview_p>(self._pointer)
@staticmethod
cdef register_view_class(bytes view_type_name,
type view_class):
'''
Each sub class of `dms.View` needs to be registered after its declaration
to declare its relationship with an `OBIType_t`
'''
global __VIEW_CLASS__
assert issubclass(view_class, View)
__VIEW_CLASS__[view_type_name] = view_class
return <Obiview_p>(self._pointer)
@staticmethod
cdef type get_view_class(bytes view_type):
@ -65,8 +57,7 @@ cdef class View(OBIWrapper) :
@staticmethod
def new(DMS dms,
object view_name,
object comments=None,
type view_class=View):
object comments=None):
cdef bytes view_name_b = tobytes(view_name)
cdef bytes comments_b
@ -74,7 +65,7 @@ cdef class View(OBIWrapper) :
cdef void* pointer
cdef View view # @DuplicatedSignature
if comments is not None:
comments_b = tobytes(comments)
else:
@ -90,7 +81,7 @@ cdef class View(OBIWrapper) :
message = "Error : Cannot create view %s" % bytes2str(view_name_b)
raise RuntimeError(message)
view = OBIWrapper.new(view_class, pointer)
view = OBIWrapper.new(View, pointer)
view._dms = dms
dms.register(view)
@ -115,11 +106,11 @@ cdef class View(OBIWrapper) :
else:
comments_b = b''
pointer = <void*> obi_new_view(self._dms.pointer(),
view_name_b,
self.pointer(),
NULL,
comments_b)
pointer = <void*> obi_clone_view(self._dms.pointer(),
self.pointer(),
view_name_b,
NULL,
comments_b)
if pointer == NULL :
raise RuntimeError("Error : Cannot clone view %s into view %s"
@ -485,13 +476,13 @@ cdef class Line_selection(list):
comments_b = tobytes(comments)
else:
comments_b = b''
pointer = obi_new_view(self._view._dms.pointer(),
view_name_b,
self._view.pointer(),
self.__build_binary_list__(),
comments_b)
pointer = obi_clone_view(self._view._dms.pointer(),
self._view.pointer(),
view_name_b,
self.__build_binary_list__(),
comments_b)
if pointer == NULL :
raise RuntimeError("Error : Cannot clone view %s into view %s with new line selection"
% (str(self._view.name),
@ -504,3 +495,28 @@ cdef class Line_selection(list):
return view
#############################################################
cdef register_view_class(bytes view_type_name,
type view_class):
'''
Each subclass of `dms.view` needs to be registered after its declaration
'''
global __VIEW_CLASS__
assert issubclass(view_class, View)
__VIEW_CLASS__[view_type_name] = view_class
cdef register_all_view_classes() :
x = list(pkgutil.walk_packages(typed_view.__path__, prefix="obitools3.dms.view.typed_view."))
all_modules = [importlib.import_module(a[1]) for a in x]
for mod in all_modules :
getattr(mod, 'register_class')()
register_all_view_classes()