[med-svn] [Git][med-team/genometools][upstream] New upstream version 1.6.5+ds

Sascha Steinbiss (@satta) gitlab at salsa.debian.org
Tue Oct 24 12:45:30 BST 2023



Sascha Steinbiss pushed to branch upstream at Debian Med / genometools


Commits:
a68a01b1 by Sascha Steinbiss at 2023-10-24T13:27:48+02:00
New upstream version 1.6.5+ds
- - - - -


9 changed files:

- CHANGELOG
- VERSION
- gtpython/gt/extended/__init__.py
- gtpython/gt/extended/gff3_in_stream.py
- + gtpython/gt/extended/type_checker.py
- gtpython/tests/__init__.py
- gtpython/tests/test_stream.py
- + gtpython/tests/test_typechecker.py
- + testdata/unknowntype.gff3


Changes:

=====================================
CHANGELOG
=====================================
@@ -1,3 +1,11 @@
+changes in version 1.6.5 (2023-10-23)
+
+- add Python bindings for the `TypeChecker*` classes
+- add Python bindings for `gt_gff3_in_stream_enable_tidy_mode()`,
+  `gt_gff3_in_stream_check_id_attributes()` and
+  `gt_gff3_in_stream_enable_strict_mode()`
+
+
 changes in version 1.6.4 (2023-10-08)
 
 - build compatibility improvements (e.g. newer clang, GCC 13.2)


=====================================
VERSION
=====================================
@@ -1 +1 @@
-1.6.4
+1.6.5


=====================================
gtpython/gt/extended/__init__.py
=====================================
@@ -39,6 +39,7 @@ from .node_visitor import *
 from .region_node import *
 from .sequence_node import *
 from .sort_stream import *
+from .type_checker import *
 
 from .rdb import *
 from .anno_db import *
@@ -66,6 +67,9 @@ NodeVisitor.register(gtlib)
 RegionNode.register(gtlib)
 SequenceNode.register(gtlib)
 SortStream.register(gtlib)
+TypeChecker.register(gtlib)
+TypeCheckerBuiltin.register(gtlib)
+TypeCheckerOBO.register(gtlib)
 try:
     AnnoDBSchema.register(gtlib)
     RDB.register(gtlib)


=====================================
gtpython/gt/extended/gff3_in_stream.py
=====================================
@@ -23,10 +23,10 @@ from gt.dlload import gtlib
 from gt.core.error import gterror
 from gt.core.str_array import StrArray
 from gt.extended.genome_stream import GenomeStream
+from gt.extended.type_checker import TypeChecker
 
 
 class GFF3InStream(GenomeStream):
-
     def __init__(self, filename):
         try:
             p = open(filename)
@@ -49,11 +49,31 @@ class GFF3InStream(GenomeStream):
         used_types = StrArray(str_array_ptr)
         return used_types.to_list()
 
+    def check_id_attributes(self):
+        gtlib.gt_gff3_in_stream_check_id_attributes(self.gs)
+
+    def enable_tidy_mode(self):
+        gtlib.gt_gff3_in_stream_enable_tidy_mode(self.gs)
+
+    def enable_strict_mode(self):
+        gtlib.gt_gff3_in_stream_enable_strict_mode(self.gs)
+
+    def set_type_checker(self, tc):
+        if not isinstance(tc, TypeChecker):
+            raise TypeError("argument must be a TypeChecker")
+        gtlib.gt_gff3_in_stream_set_type_checker(self.gs, tc._as_parameter_)
+
     def register(cls, gtlib):
         from ctypes import c_char_p, c_void_p
+
         gtlib.gt_gff3_in_stream_get_used_types.argtypes = [c_void_p]
         gtlib.gt_gff3_in_stream_new_sorted.argtypes = [c_char_p]
         gtlib.gt_gff3_in_stream_get_used_types.restype = c_void_p
         gtlib.gt_gff3_in_stream_new_sorted.restype = c_void_p
+        gtlib.gt_gff3_in_stream_check_id_attributes.argtypes = [c_void_p]
+        gtlib.gt_gff3_in_stream_enable_tidy_mode.argtypes = [c_void_p]
+        gtlib.gt_gff3_in_stream_enable_strict_mode.argtypes = [c_void_p]
+        gtlib.gt_gff3_in_stream_set_type_checker.argtypes = [
+            c_void_p, c_void_p]
 
     register = classmethod(register)


=====================================
gtpython/gt/extended/type_checker.py
=====================================
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2023 Sascha Steinbiss <sascha at steinbiss.name>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+from gt.bytes import gtbytes
+from gt.dlload import gtlib
+from gt.core.error import Error, gterror
+
+
+class TypeChecker(object):
+    def __init__(self, *args):
+        raise NotImplementedError(
+            "Please call the constructor of a " + "TypeChecker implementation."
+        )
+
+    def __del__(self):
+        try:
+            gtlib.gt_type_checker_delete(self.tc)
+        except AttributeError:
+            pass
+
+    def description(self):
+        return str(gtlib.gt_type_checker_description(self.tc))
+
+    def is_valid(self, t):
+        return gtlib.gt_type_checker_is_valid(self.tc, gtbytes(t))
+
+    def register(cls, gtlib):
+        from ctypes import c_void_p, c_bool, c_char_p
+
+        gtlib.gt_type_checker_is_valid.argtypes = [c_void_p, c_char_p]
+        gtlib.gt_type_checker_is_valid.restype = c_bool
+        gtlib.gt_type_checker_description.argtypes = [c_void_p]
+        gtlib.gt_type_checker_description.restype = c_char_p
+        gtlib.gt_type_checker_delete.argtypes = [c_void_p]
+
+    register = classmethod(register)
+
+
+class TypeCheckerOBO(TypeChecker):
+    def __init__(self, filename):
+        try:
+            p = open(filename)
+            tmp = p.readline()
+            p.close()
+        except:
+            gterror("File " + filename + " not readable!")
+        err = Error()
+        self.tc = gtlib.gt_type_checker_obo_new(
+            gtbytes(filename), err._as_parameter_)
+        if self.tc == None:
+            gterror(err)
+        self._as_parameter_ = self.tc
+
+    def from_param(cls, obj):
+        if not isinstance(obj, TypeCheckerOBO):
+            raise TypeError("argument must be a TypeCheckerOBO")
+        return obj._as_parameter_
+
+    from_param = classmethod(from_param)
+
+    def register(cls, gtlib):
+        from ctypes import c_char_p, c_void_p
+
+        gtlib.gt_type_checker_obo_new.argtypes = [c_char_p, c_void_p]
+        gtlib.gt_type_checker_obo_new.restype = c_void_p
+
+    register = classmethod(register)
+
+
+class TypeCheckerBuiltin(TypeChecker):
+    def __init__(self):
+        self.tc = gtlib.gt_type_checker_builtin_new()
+        self._as_parameter_ = self.tc
+
+    def from_param(cls, obj):
+        if not isinstance(obj, TypeCheckerOBO):
+            raise TypeError("argument must be a TypeCheckerBuiltin")
+        return obj._as_parameter_
+
+    from_param = classmethod(from_param)
+
+    def register(cls, gtlib):
+        from ctypes import c_void_p
+
+        gtlib.gt_type_checker_builtin_new.restype = c_void_p
+
+    register = classmethod(register)


=====================================
gtpython/tests/__init__.py
=====================================
@@ -10,6 +10,7 @@ from test_metanode import *
 from test_sequencenode import *
 from test_iterators import *
 from test_stream import *
+from test_typechecker import *
 from test_range import *
 from test_version import *
 


=====================================
gtpython/tests/test_stream.py
=====================================
@@ -9,6 +9,11 @@ op = os.path
 datadir = op.abspath(op.join(op.dirname(__file__), "..", "..",
                              "testdata"))
 
+# This has two names, depending on Python version
+if not hasattr(unittest.TestCase, 'assertRaisesRegex'):
+    setattr(unittest.TestCase, 'assertRaisesRegex',
+            unittest.TestCase.assertRaisesRegexp)
+
 
 class StreamTest(unittest.TestCase):
 
@@ -23,6 +28,37 @@ class StreamTest(unittest.TestCase):
 
         self.assertTrue('1877523' in fi.get_seqids())
 
+    def test_checker(self):
+        tc = gt.extended.TypeCheckerBuiltin()
+        self.ins.set_type_checker(tc)
+        self.ins.pull()
+
+    def test_checker_fail(self):
+        tc = gt.extended.TypeCheckerBuiltin()
+        gff_file = op.join(datadir, "unknowntype.gff3")
+        ins = gt.GFF3InStream(gff_file)
+        ins.set_type_checker(tc)
+        self.assertRaisesRegex(
+            gt.core.error.GTError,
+            'GenomeTools error: type "something" on line 3',
+            ins.pull)
+
+    def test_tidy_fail(self):
+        gff_file = op.join(datadir, "missing_gff3_header.gff3")
+        ins = gt.GFF3InStream(gff_file)
+        self.assertRaisesRegex(
+            gt.core.error.GTError,
+            'does not begin with "##gff-version" or "##gff-version"',
+            ins.pull)
+
+    def test_tidy_succ(self):
+        gff_file = op.join(datadir, "missing_gff3_header.gff3")
+        ins = gt.GFF3InStream(gff_file)
+        ins.enable_tidy_mode()
+        fi = gt.FeatureIndexMemory()
+        gt.FeatureStream(ins, fi).pull()
+        self.assertTrue('ctg123' in fi.get_seqids())
+
 
 class TestDuplicateStream(unittest.TestCase):
 
@@ -106,5 +142,6 @@ class TestCustomExample(unittest.TestCase):
             f = dfi.next()
         self.assertTrue('bar' in types, types)
 
+
 if __name__ == "__main__":
     unittest.main()


=====================================
gtpython/tests/test_typechecker.py
=====================================
@@ -0,0 +1,39 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import unittest
+import gt
+import os
+
+op = os.path
+datadir = op.abspath(op.join(op.dirname(__file__), "..", "..", "testdata"))
+gtdatadir = op.abspath(op.join(op.dirname(__file__), "..", "..", "gtdata"))
+
+
+class TypeCheckerTest(unittest.TestCase):
+    def test_builtin(self):
+        tc = gt.extended.TypeCheckerBuiltin()
+        self.assertTrue(tc.is_valid("gene"))
+        self.assertFalse(tc.is_valid("nothing"))
+
+    def test_obo_success(self):
+        tc = gt.extended.TypeCheckerOBO(
+            os.path.join(gtdatadir, "obo_files/sofa.obo"))
+        self.assertTrue(tc.is_valid("gene"))
+        self.assertFalse(tc.is_valid("nothing"))
+        self.assertFalse(tc.is_valid(""))
+        self.assertFalse(tc.is_valid(None))
+
+    def test_obo_fail(self):
+        self.assertRaises(
+            gt.core.error.GTError, gt.extended.TypeCheckerOBO, "nonexistant"
+        )
+        self.assertRaises(
+            gt.core.error.GTError,
+            gt.extended.TypeCheckerOBO,
+            os.path.join(datadir, "obo_files/corrupt_instance_stanza.obo"),
+        )
+
+
+if __name__ == "__main__":
+    unittest.main()


=====================================
testdata/unknowntype.gff3
=====================================
@@ -0,0 +1,4 @@
+##gff-version 3
+##sequence-region   ctg123 1 1497228
+ctg123	gth	something	106716	106973	0.847	+	.	ID=invalid
+



View it on GitLab: https://salsa.debian.org/med-team/genometools/-/commit/a68a01b1be4764adc1cb3653d572a42b1fa5d325

-- 
View it on GitLab: https://salsa.debian.org/med-team/genometools/-/commit/a68a01b1be4764adc1cb3653d572a42b1fa5d325
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20231024/c69e77a2/attachment-0001.htm>


More information about the debian-med-commit mailing list