[med-svn] [Git][med-team/genometools][master] 3 commits: New upstream version 1.6.5+ds
Sascha Steinbiss (@satta)
gitlab at salsa.debian.org
Tue Oct 24 12:45:24 BST 2023
Sascha Steinbiss pushed to branch master at Debian Med / genometools
Commits:
a68a01b1 by Sascha Steinbiss at 2023-10-24T13:27:48+02:00
New upstream version 1.6.5+ds
- - - - -
178b6ccf by Sascha Steinbiss at 2023-10-24T13:28:12+02:00
Update upstream source from tag 'upstream/1.6.5+ds'
Update to upstream version '1.6.5+ds'
with Debian dir dd96f7e6322afc2f42a8b60ac51e676f2265445e
- - - - -
86716d2b by Sascha Steinbiss at 2023-10-24T13:28:33+02:00
new upstream release
- - - - -
10 changed files:
- CHANGELOG
- VERSION
- debian/changelog
- 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
=====================================
debian/changelog
=====================================
@@ -1,3 +1,9 @@
+genometools (1.6.5+ds-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Sascha Steinbiss <satta at debian.org> Tue, 24 Oct 2023 13:28:17 +0200
+
genometools (1.6.4+ds-1) unstable; urgency=medium
* New upstream release.
=====================================
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/-/compare/7ed4d1a83144ef49994ccb30097610f4b9cb60a7...86716d2b80c56eea58fcf59ad9f766e5dc73edc4
--
View it on GitLab: https://salsa.debian.org/med-team/genometools/-/compare/7ed4d1a83144ef49994ccb30097610f4b9cb60a7...86716d2b80c56eea58fcf59ad9f766e5dc73edc4
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/348b3cdf/attachment-0001.htm>
More information about the debian-med-commit
mailing list