[med-svn] [Git][med-team/python-ete3][master] 5 commits: python3.13.patch: new: fix test failure with Python 3.13.

Étienne Mollier (@emollier) gitlab at salsa.debian.org
Sat Sep 21 14:14:14 BST 2024



Étienne Mollier pushed to branch master at Debian Med / python-ete3


Commits:
af28d8fa by Étienne Mollier at 2024-09-21T15:11:11+02:00
python3.13.patch: new: fix test failure with Python 3.13.

Closes: #1082310

- - - - -
de8b61e5 by Étienne Mollier at 2024-09-21T15:11:44+02:00
fix-warnings.patch: new: fix a sprawl of SyntaxWarnings.

- - - - -
e644a2ad by Étienne Mollier at 2024-09-21T15:12:17+02:00
d/s/lintian-overrides: fix false positive source missing.

The false positive flags pmodeltest_executable.patch, which does not
make much sense.

- - - - -
4ebaa874 by Étienne Mollier at 2024-09-21T15:13:06+02:00
d/control: declare compliance to standards version 4.7.0.

- - - - -
3798e348 by Étienne Mollier at 2024-09-21T15:13:55+02:00
Ready for upload to unstable.

- - - - -


6 changed files:

- debian/changelog
- debian/control
- + debian/patches/fix-warnings.patch
- + debian/patches/python3.13.patch
- debian/patches/series
- + debian/source/lintian-overrides


Changes:

=====================================
debian/changelog
=====================================
@@ -1,3 +1,14 @@
+python-ete3 (3.1.3+dfsg-3) unstable; urgency=medium
+
+  * Team upload.
+  * python3.13.patch: new: fix test failure with Python 3.13.
+    (Closes: #1082310)
+  * fix-warnings.patch: new: fix a sprawl of SyntaxWarnings.
+  * d/s/lintian-overrides: fix false positive source missing.
+  * d/control: declare compliance to standards version 4.7.0.
+
+ -- Étienne Mollier <emollier at debian.org>  Sat, 21 Sep 2024 15:13:21 +0200
+
 python-ete3 (3.1.3+dfsg-2) unstable; urgency=medium
 
   * Team upload.


=====================================
debian/control
=====================================
@@ -17,7 +17,7 @@ Build-Depends: debhelper-compat (= 13),
                python3-six,
                python3-skbio,
                python3-pytest
-Standards-Version: 4.6.2
+Standards-Version: 4.7.0
 Vcs-Browser: https://salsa.debian.org/med-team/python-ete3
 Vcs-Git: https://salsa.debian.org/med-team/python-ete3.git
 Homepage: http://etetoolkit.org


=====================================
debian/patches/fix-warnings.patch
=====================================
@@ -0,0 +1,558 @@
+Description: fix multiple invalid escape sequences.
+ This change fixes multiple variations around the following symptom:
+ .
+         SyntaxWarning: invalid escape sequence
+
+Author: Étienne Mollier <emollier at debian.org>
+Forwarded: no
+Last-Update: 2024-09-21
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- python-ete3.orig/ete3/coretype/tree.py
++++ python-ete3/ete3/coretype/tree.py
+@@ -362,7 +362,7 @@
+             return self.up.remove_child(sister)
+ 
+     def delete(self, prevent_nondicotomic=True, preserve_branch_length=False):
+-        """
++        r"""
+         Deletes node from the tree structure. Notice that this method
+         makes 'disappear' the node from the tree structure. This means
+         that children from the deleted node are transferred to the
+@@ -433,7 +433,7 @@
+ 
+ 
+     def prune(self, nodes, preserve_branch_length=False):
+-        """Prunes the topology of a node to conserve only the selected list of leaf
++        r"""Prunes the topology of a node to conserve only the selected list of leaf
+         internal nodes. The minimum number of nodes that conserve the
+         topological relationships among the requested nodes will be
+         retained. Root node is always conserved.
+@@ -1505,7 +1505,7 @@
+ 
+ 
+     def ladderize(self, direction=0):
+-        """
++        r"""
+         .. versionadded: 2.1
+ 
+         Sort the branches of a given tree (swapping children nodes)
+--- python-ete3.orig/ete3/evol/evoltree.py
++++ python-ete3/ete3/evol/evoltree.py
+@@ -465,10 +465,10 @@
+         from re import sub
+         if int(format) == 11:
+             nwk = ' %s 1\n' % (len(self))
+-            nwk += sub('\[&&NHX:mark=([ #0-9.]*)\]', r'\1',
++            nwk += sub(r'\[&&NHX:mark=([ #0-9.]*)\]', r'\1',
+                        write_newick(self, features=['mark'], format=9))
+         elif int(format) == 10:
+-            nwk = sub('\[&&NHX:mark=([ #0-9.]*)\]', r'\1',
++            nwk = sub(r'\[&&NHX:mark=([ #0-9.]*)\]', r'\1',
+                       write_newick(self, features=['mark'], format=9))
+         else:
+             nwk = write_newick(self, features=features, format=format)
+--- python-ete3.orig/ete3/evol/model.py
++++ python-ete3/ete3/evol/model.py
+@@ -364,8 +364,8 @@
+     '''
+     check that model name corresponds to one of the available
+     '''
+-    if sub('\..*', '', model) in AVAIL:
+-        return model, AVAIL [sub('\..*', '', model)]
++    if sub(r'\..*', '', model) in AVAIL:
++        return model, AVAIL [sub(r'\..*', '', model)]
+ 
+ 
+ 
+--- python-ete3.orig/ete3/evol/parser/codemlparser.py
++++ python-ete3/ete3/evol/parser/codemlparser.py
+@@ -71,25 +71,25 @@
+     for line in open(path):
+         # get number of classes of sites
+         if line.startswith ('dN/dS '):
+-            k = int(re.sub ('.* \(K=([0-9]+)\)\n', '\\1', line))
++            k = int(re.sub (r'.* \(K=([0-9]+)\)\n', '\\1', line))
+             continue
+         # get values of omega and proportions
+         if typ is None and \
+-           re.match ('^[a-z]+.*(\d+\.\d{5} *){'+ str(k) +'}', line):
++           re.match (r'^[a-z]+.*(\d+\.\d{5} *){'+ str(k) +'}', line):
+             var = re.sub (':', '', line.split('  ')[0])
+             if var.startswith ('p'):
+                 var = 'proportions'
+-            classes[var] = [float(v) for v in re.findall('\d+\.\d{5}', line)]
++            classes[var] = [float(v) for v in re.findall(r'\d+\.\d{5}', line)]
+             continue
+         # parse NEB and BEB tables
+         if '(BEB)' in line :
+-            k = int(re.sub('.*for (\d+) classes.*\n', '\\1', line))
++            k = int(re.sub(r'.*for (\d+) classes.*\n', '\\1', line))
+             typ = 'BEB'
+             sites[typ] = {}
+             n_classes[typ] = k
+             continue
+         if '(NEB)' in line :
+-            k = int(re.sub('.*for (\d+) classes.*\n', '\\1', line))
++            k = int(re.sub(r'.*for (\d+) classes.*\n', '\\1', line))
+             typ = 'NEB'
+             sites[typ] = {}
+             n_classes[typ] = k
+@@ -214,7 +214,7 @@
+     # if we do not have tree, load it
+     if model._tree is None:
+         from ..evol import EvolTree
+-        model._tree = EvolTree (re.findall ('\(.*\);', ''.join(all_lines))[2])
++        model._tree = EvolTree (re.findall (r'\(.*\);', ''.join(all_lines))[2])
+         model._tree._label_as_paml()
+     # starts parsing
+     for i, line in enumerate (all_lines):
+@@ -224,7 +224,7 @@
+         if line.startswith('Codon frequencies under model'):
+             model.stats ['codonFreq'] = []
+             for j in range (16):
+-                line = list(map (float, re.findall ('\d\.\d+', all_lines [i+j+1])))
++                line = list(map (float, re.findall (r'\d\.\d+', all_lines [i+j+1])))
+                 model.stats ['codonFreq'] += [line]
+             continue
+         if line.startswith('Nei & Gojobori 1986'):
+@@ -237,32 +237,32 @@
+         # lnL and number of parameters
+         if line.startswith ('lnL'):
+             try:
+-                line = re.sub ('.* np: *(\d+)\): +(-\d+\.\d+).*',
++                line = re.sub (r'.* np: *(\d+)\): +(-\d+\.\d+).*',
+                                '\\1 \\2', line)
+                 model.stats ['np' ] = int   (line.split()[0])
+                 model.stats ['lnL'] = float (line.split()[1])
+             except ValueError:
+-                line = re.sub ('.* np: *(\d+)\): +(nan).*',
++                line = re.sub (r'.* np: *(\d+)\): +(nan).*',
+                                '\\1 \\2', line)
+                 model.stats ['np' ] = int   (line.split()[0])
+                 model.stats ['lnL'] = float ('-inf')
+             continue
+         # get labels of internal branches
+         if line.count('..') >= 2:
+-            labels = re.findall ('\d+\.\.\d+', line + ' ')
++            labels = re.findall (r'\d+\.\.\d+', line + ' ')
+             _check_paml_labels (model._tree, labels, pamout, model)
+             continue
+         # retrieve kappa
+         if line.startswith ('kappa '):
+             try:
+-                model.stats ['kappa'] = float (re.sub ('.*(\d+\.\d+).*',
++                model.stats ['kappa'] = float (re.sub (r'.*(\d+\.\d+).*',
+                                                        '\\1', line))
+             except ValueError:
+                 model.stats ['kappa'] = 'nan'
+         # retrieve dS dN t w N S and if present, errors. from summary table
+         if line.count('..') == 1 and line.startswith (' '):
+-            if not re.match (' +\d+\.\.\d+ +\d+\.\d+ ', line):
+-                if re.match (' +( +\d+\.\d+){8}', all_lines [i+1]):
++            if not re.match (r' +\d+\.\.\d+ +\d+\.\d+ ', line):
++                if re.match (r' +( +\d+\.\d+){8}', all_lines [i+1]):
+                     _get_values (model, line.split ()[0]+'  '+all_lines [i+1])
+                 continue
+             _get_values (model, line)
+--- python-ete3.orig/ete3/parser/newick.py
++++ python-ete3/ete3/parser/newick.py
+@@ -48,11 +48,11 @@
+ ITERABLE_TYPES = set([list, set, tuple, frozenset])
+ 
+ # Regular expressions used for reading newick format
+-_ILEGAL_NEWICK_CHARS = ":;(),\[\]\t\n\r="
++_ILEGAL_NEWICK_CHARS = r":;(),\[\]\t\n\r="
+ _NON_PRINTABLE_CHARS_RE = "[\x00-\x1f]+"
+ 
+-_NHX_RE = "\[&&NHX:[^\]]*\]"
+-_FLOAT_RE = "\s*[+-]?\d+\.?\d*(?:[eE][-+]?\d+)?\s*"
++_NHX_RE = r"\[&&NHX:[^\]]*\]"
++_FLOAT_RE = r"\s*[+-]?\d+\.?\d*(?:[eE][-+]?\d+)?\s*"
+ #_FLOAT_RE = "[+-]?\d+\.?\d*"
+ #_NAME_RE = "[^():,;\[\]]+"
+ _NAME_RE = "[^():,;]+?"
+@@ -399,7 +399,7 @@
+             SECOND_MATCH += "?"
+ 
+ 
+-        matcher_str= '^\s*%s\s*%s\s*(%s)?\s*$' % (FIRST_MATCH, SECOND_MATCH, _NHX_RE)
++        matcher_str= r'^\s*%s\s*%s\s*(%s)?\s*$' % (FIRST_MATCH, SECOND_MATCH, _NHX_RE)
+         compiled_matcher = re.compile(matcher_str)
+         matchers[node_type] = [container1, container2, converterFn1, converterFn2, compiled_matcher]
+ 
+--- python-ete3.orig/ete3/parser/phylip.py
++++ python-ete3/ete3/parser/phylip.py
+@@ -73,7 +73,7 @@
+             continue
+         # Reads head
+         if not nchar or not ntax:
+-            m = re.match("^\s*(\d+)\s+(\d+)",line)
++            m = re.match(r"^\s*(\d+)\s+(\d+)",line)
+             if m:
+                 ntax  = int (m.groups()[0])
+                 nchar = int (m.groups()[1])
+@@ -105,7 +105,7 @@
+                         line = m.groups()[1]
+                     else:
+                         raise Exception("Wrong phylip sequencial format.")
+-                SG.id2seq[id_counter] += re.sub("\s","", line)
++                SG.id2seq[id_counter] += re.sub(r"\s","", line)
+                 if len(SG.id2seq[id_counter]) == nchar:
+                     id_counter += 1
+                     name = None
+@@ -120,7 +120,7 @@
+                     if m:
+                         name = m.groups()[0].strip()
+ 
+-                        seq = re.sub("\s","",m.groups()[1])
++                        seq = re.sub(r"\s","",m.groups()[1])
+                         SG.id2seq[id_counter] = seq
+                         SG.id2name[id_counter] = name
+                         if fix_duplicates and name in SG.name2id:
+@@ -135,7 +135,7 @@
+                     else:
+                         raise Exception("Unexpected number of sequences.")
+                 else:
+-                    seq = re.sub("\s", "", line)
++                    seq = re.sub(r"\s", "", line)
+                     if id_counter == len(SG):
+                         id_counter = 0
+                     SG.id2seq[id_counter] += seq
+--- python-ete3.orig/ete3/phylo/phylotree.py
++++ python-ete3/ete3/phylo/phylotree.py
+@@ -129,7 +129,7 @@
+         return ''.join([pre, node.name, fstring, post])
+ 
+     if newick_only:
+-        id_match = re.compile("([^0-9])?(\d+)([^0-9])?")
++        id_match = re.compile(r"([^0-9])?(\d+)([^0-9])?")
+         for nw in sp_trees:
+             yield re.sub(id_match, _nodereplacer, str(nw)+";")
+     else:
+@@ -185,7 +185,7 @@
+         return ''.join([pre, node.name, fstring, post])
+ 
+     if newick_only:
+-        id_match = re.compile("([^0-9])(\d+)([^0-9])")
++        id_match = re.compile(r"([^0-9])(\d+)([^0-9])")
+         for nw in sptrees:
+             yield re.sub(id_match, _nodereplacer, str(nw)+";")
+     else:
+--- python-ete3.orig/ete3/phylomedb/phylomeDB3.py
++++ python-ete3/ete3/phylomedb/phylomeDB3.py
+@@ -72,7 +72,7 @@
+ def extract_species_name(name):
+   return name.split("_")[1]
+ 
+-ID_PATTERN = re.compile("^[Pp][Hh][Yy]\w{7}(_\w{2,7})?$")
++ID_PATTERN = re.compile(r"^[Pp][Hh][Yy]\w{7}(_\w{2,7})?$")
+ ITERABLE_TYPES = set([list, set, tuple, frozenset])
+ 
+ __all__ = ["PhylomeDB3Connector"]
+@@ -150,7 +150,7 @@
+     """
+     def clean_name(name):
+       quote = lambda x: '"%s"' %x
+-      m = re.search("Phy(\w{7})_[\w\d]+", name)
++      m = re.search(r"Phy(\w{7})_[\w\d]+", name)
+       if m:
+         return quote(m.groups()[0])
+ 
+@@ -497,7 +497,7 @@
+     """
+ 
+     # Check whether the input code is a valid former phylomeDB id or not
+-    QUERY_OLD_REGEXP_FILTER = "^\w{3}\d{1,}$"
++    QUERY_OLD_REGEXP_FILTER = r"^\w{3}\d{1,}$"
+     if not re.match(QUERY_OLD_REGEXP_FILTER, old_id):
+       return None
+ 
+@@ -753,9 +753,9 @@
+     query = id.strip()
+ 
+     # To avoid weird queries which creates slow or invalid MYSQL queries
+-    QUERY_GEN_REGEXP_FILTER = "^[\w\d\-_,;:.|#@\/\\\()'<>!]+$"
+-    QUERY_OLD_REGEXP_FILTER = "^\w{3}\d{1,}$"
+-    QUERY_INT_REGEXP_FILTER = "^[Pp][Hh][Yy]\w{7}(_\w{2,7})?$"
++    QUERY_GEN_REGEXP_FILTER = r"^[\w\d\-_,;:.|#@\/\\\()'<>!]+$"
++    QUERY_OLD_REGEXP_FILTER = r"^\w{3}\d{1,}$"
++    QUERY_INT_REGEXP_FILTER = r"^[Pp][Hh][Yy]\w{7}(_\w{2,7})?$"
+ 
+     phylomeDB_matches = {}
+     # First, check if it is a current phylomeDB ID
+--- python-ete3.orig/ete3/tools/utils.py
++++ python-ete3/ete3/tools/utils.py
+@@ -25,7 +25,7 @@
+     return "%s%s%s" %(COLORS[color], string, COLORS[None])
+ 
+ def clear_color(string):
+-    return re.sub("\\033\[[^m]+m", "", string)
++    return re.sub("\\033\\[[^m]+m", "", string)
+ 
+ def which(program):
+     def is_exe(fpath):
+--- python-ete3.orig/ete3/treeview/faces.py
++++ python-ete3/ete3/treeview/faces.py
+@@ -156,7 +156,7 @@
+            "RectFace", "StackedBarFace", "SVGFace", "DiamondFace"]
+ 
+ class Face(object):
+-    """Base Face object. All Face types (i.e. TextFace, SeqMotifFace,
++    r"""Base Face object. All Face types (i.e. TextFace, SeqMotifFace,
+     etc.) inherit the following options:
+ 
+     :param 0 margin_left: in pixels
+--- python-ete3.orig/ete3/treeview/main.py
++++ python-ete3/ete3/treeview/main.py
+@@ -61,7 +61,7 @@
+ 
+ _LINE_TYPE_CHECKER = lambda x: x in (0,1,2)
+ _SIZE_CHECKER = lambda x: isinstance(x, int)
+-_COLOR_MATCH = re.compile("^#[A-Fa-f\d]{6}$")
++_COLOR_MATCH = re.compile(r"^#[A-Fa-f\d]{6}$")
+ _COLOR_CHECKER = lambda x: x.lower() in SVG_COLORS or re.match(_COLOR_MATCH, x)
+ _NODE_TYPE_CHECKER = lambda x: x in ["sphere", "circle", "square"]
+ _BOOL_CHECKER =  lambda x: isinstance(x, bool) or x in (0,1)
+@@ -709,9 +709,9 @@
+         # Fix a very annoying problem with Radial gradients in
+         # inkscape and browsers...
+         compatible_code = compatible_code.replace("xml:id=", "id=")
+-        compatible_code = re.sub('font-size="(\d+)"', 'font-size="\\1pt"', compatible_code)
++        compatible_code = re.sub(r'font-size="(\d+)"', 'font-size="\\1pt"', compatible_code)
+         compatible_code = compatible_code.replace('\n', ' ')
+-        compatible_code = re.sub('<g [^>]+>\s*</g>', '', compatible_code)
++        compatible_code = re.sub(r'<g [^>]+>\s*</g>', '', compatible_code)
+         # End of fix
+         if ipython_inline:
+             from IPython.core.display import SVG
+--- python-ete3.orig/ete3/utils.py
++++ python-ete3/ete3/utils.py
+@@ -79,7 +79,7 @@
+     return "%s%s%s" %(SHELL_COLORS[color], string, SHELL_COLORS[None])
+ 
+ def clear_color(string):
+-    return re.sub("\\033\[[^m]+m", "", string)
++    return re.sub("\\033\\[[^m]+m", "", string)
+ 
+ def print_table(items, header=None, wrap=True, max_col_width=20,
+                 wrap_style="wrap", row_line=False, fix_col_width=False, title=None):
+--- python-ete3.orig/ete3/phylomedb/phylomeDB.py
++++ python-ete3/ete3/phylomedb/phylomeDB.py
+@@ -252,8 +252,8 @@
+ 
+         # This is to avoid weird queryIDs which make create slow or
+         # invalid MYSQL queries
+-        QUERYID_GENERAL_REGEXP_FILTER = "^[\w\d\-_,;:.|#@\/\\\()'<>!]+$"
+-        QUERYID_INTERNAL_ID_REGEXP_FILTER = "^\w{3}\d{7}$"
++        QUERYID_GENERAL_REGEXP_FILTER = r"^[\w\d\-_,;:.|#@\/\\\()'<>!]+$"
++        QUERYID_INTERNAL_ID_REGEXP_FILTER = r"^\w{3}\d{7}$"
+ 
+         phyID_matches = []
+         # First check if id is a phylomeID
+--- python-ete3.orig/ete3/tools/common.py
++++ python-ete3/ete3/tools/common.py
+@@ -155,7 +155,7 @@
+         return string
+ 
+ def parse_value(fvalue):
+-    func_match = re.search("(\w+)\(([^)]*)\)", fvalue)
++    func_match = re.search(r"(\w+)\(([^)]*)\)", fvalue)
+     if func_match:
+         func_name = func_match.groups()[0]
+         func_arg = func_match.groups()[1]
+--- python-ete3.orig/ete3/tools/ete_build.py
++++ python-ete3/ete3/tools/ete_build.py
+@@ -815,7 +815,7 @@
+                                    " expression will be assumed as sequence name. By default, all "
+                                    " characthers until the first blank space or tab delimiter are "
+                                    " used as the sequence names."),
+-                             default='^([^\s]+)')
++                             default=r'^([^\s]+)')
+ 
+     input_group.add_argument("--no-seq-rename", dest="seq_rename",
+                              action="store_false",
+--- python-ete3.orig/ete3/tools/ete_build_lib/interface.py
++++ python-ete3/ete3/tools/ete_build_lib/interface.py
+@@ -111,7 +111,7 @@
+ 
+ class Screen(StringIO):
+     # tags used to control color of strings and select buffer
+-    TAG = re.compile("@@((\d+),)?(\d+):", re.MULTILINE)
++    TAG = re.compile(r"@@((\d+),)?(\d+):", re.MULTILINE)
+     def __init__(self, windows):
+         StringIO.__init__(self)
+         self.windows = windows
+--- python-ete3.orig/ete3/tools/ete_build_lib/sge.py
++++ python-ete3/ete3/tools/ete_build_lib/sge.py
+@@ -53,7 +53,7 @@
+ from . import db
+ from .errors import SgeError
+ from .utils import GLOBALS
+-OK_PATTERN = 'Your job-array ([\d]+).\d+\-\d+:\d+ \("[^"]*"\) has been submitted'
++OK_PATTERN = r'Your job-array ([\d]+).\d+\-\d+:\d+ \("[^"]*"\) has been submitted'
+ DEFAULT_SGE_CELL = "cgenomics"
+ 
+ def launch_jobs(jobs, conf):
+--- python-ete3.orig/ete3/tools/ete_build_lib/task/iqtree.py
++++ python-ete3/ete3/tools/ete_build_lib/task/iqtree.py
+@@ -74,7 +74,7 @@
+         stats_file = os.path.join(j.jobdir,
+                                   self.alg_phylip_file+".iqtree")
+ 
+-        m = re.search('Log-likelihood of the tree:\s+(-?\d+\.\d+)',
++        m = re.search(r'Log-likelihood of the tree:\s+(-?\d+\.\d+)',
+                       open(stats_file).read())
+         lk = float(m.groups()[0])
+         stats = {"lk": lk}
+--- python-ete3.orig/ete3/tools/ete_build_lib/task/phyml.py
++++ python-ete3/ete3/tools/ete_build_lib/task/phyml.py
+@@ -167,7 +167,7 @@
+         stats_file = os.path.join(j.jobdir,
+                                   self.alg_phylip_file+"_phyml_stats.txt")
+ 
+-        m = re.search('Log-likelihood:\s+(-?\d+\.\d+)',
++        m = re.search(r'Log-likelihood:\s+(-?\d+\.\d+)',
+                       open(stats_file).read())
+         lk = float(m.groups()[0])
+         stats = {"lk": lk}
+--- python-ete3.orig/ete3/tools/ete_build_lib/task/prottest.py
++++ python-ete3/ete3/tools/ete_build_lib/task/prottest.py
+@@ -132,7 +132,7 @@
+                 stats_file = pjoin(phyml_job.jobdir,
+                                    self.alg_phylip_file+"_phyml_stats.txt")
+                 tree = PhyloTree(tree_file)
+-                m = re.search('Log-likelihood:\s+(-?\d+\.\d+)',
++                m = re.search(r'Log-likelihood:\s+(-?\d+\.\d+)',
+                               open(stats_file).read())
+                 lk = float(m.groups()[0])
+                 tree.add_feature("lk", lk)
+--- python-ete3.orig/ete3/tools/ete_build_lib/task/prottest2.py
++++ python-ete3/ete3/tools/ete_build_lib/task/prottest2.py
+@@ -136,7 +136,7 @@
+                 stats_file = os.path.join(j.jobdir,
+                                           self.alg_basename+"_phyml_stats.txt")
+                 tree = PhyloTree(tree_file)
+-                m = re.search('Log-likelihood:\s+(-?\d+\.\d+)',
++                m = re.search(r'Log-likelihood:\s+(-?\d+\.\d+)',
+                               open(stats_file).read())
+                 lk = float(m.groups()[0])
+                 tree.add_feature("lk", lk)
+--- python-ete3.orig/ete3/tools/ete_build_lib/task/raxml.py
++++ python-ete3/ete3/tools/ete_build_lib/task/raxml.py
+@@ -268,10 +268,10 @@
+                                                "RAxML_fastTreeSH_Support." + self.alrt_job.args["-n"])
+             raw_nw = open(alrt_tree_file).read()
+             try:
+-                nw, nsubs = re.subn(":(\d+\.\d+)\[(\d+)\]", parse_alrt, raw_nw, flags=re.MULTILINE)
++                nw, nsubs = re.subn(r":(\d+\.\d+)\[(\d+)\]", parse_alrt, raw_nw, flags=re.MULTILINE)
+             except TypeError:
+                 raw_nw = raw_nw.replace("\n","")
+-                nw, nsubs = re.subn(":(\d+\.\d+)\[(\d+)\]", parse_alrt, raw_nw)
++                nw, nsubs = re.subn(r":(\d+\.\d+)\[(\d+)\]", parse_alrt, raw_nw)
+             if nsubs == 0:
+                 log.warning("alrt values were not detected in raxml tree!")
+             tree = Tree(nw)
+--- python-ete3.orig/ete3/tools/ete_build_lib/utils.py
++++ python-ete3/ete3/tools/ete_build_lib/utils.py
+@@ -372,7 +372,7 @@
+             return str(i)
+ 
+     def _safe_len(i):
+-        return len(re.sub('\\033\[\d+m', '',  _str(i)))
++        return len(re.sub('\\033\\[\\d+m', '',  _str(i)))
+ 
+     def _safe_rjust(s, just):
+         return (" " * (just - _safe_len(s))) + s
+@@ -516,7 +516,7 @@
+ def get_latest_nprdp(basedir):
+     avail_dbs = []
+     for fname in glob(os.path.join(basedir, "*.db")):
+-        m = re.search("npr\.([\d\.]+)\.db", fname)
++        m = re.search(r"npr\.([\d\.]+)\.db", fname)
+         if m:
+             avail_dbs.append([float(m.groups()[0]), fname])
+ 
+@@ -535,7 +535,7 @@
+             tar = tarfile.open(compressed_path)
+             for member in tar:
+                 print(member.name)
+-                m = re.search("npr\.([\d\.]+)\.db", member.name)
++                m = re.search(r"npr\.([\d\.]+)\.db", member.name)
+                 if m:
+                     print(member)
+                     avail_dbs.append([float(m.groups()[0]), member])
+@@ -626,7 +626,7 @@
+     return "%s%s%s" %(COLORS[color], string, COLORS[None])
+ 
+ def clear_color(string):
+-    return re.sub("\\033\[[^m]+m", "", string)
++    return re.sub("\\033\\[[^m]+m", "", string)
+ 
+     
+ def iter_cog_seqs(cogs_file, spname_delimiter):
+--- python-ete3.orig/ete3/tools/ete_build_lib/visualize.py
++++ python-ete3/ete3/tools/ete_build_lib/visualize.py
+@@ -198,11 +198,11 @@
+     name2sp = ncbi.get_name_translator(tree.get_species())
+     for lf in tree.iter_leaves():
+         lf.add_features(taxid=name2sp.get(lf.species, [0])[0])
+-        lf.add_features(genename=re.sub('\{[^}]+\}', '', lf.name).strip())
++        lf.add_features(genename=re.sub(r'\{[^}]+\}', '', lf.name).strip())
+     ncbi.annotate_tree(tree, attr_name='taxid')
+ 
+ def spname(name):
+-    m = re.search('\{([^}]+)\}', name)
++    m = re.search(r'\{([^}]+)\}', name)
+     if m:
+         return m.groups()[0]
+     else:
+--- python-ete3.orig/ete3/tools/ete_build_lib/workflow/genetree.py
++++ python-ete3/ete3/tools/ete_build_lib/workflow/genetree.py
+@@ -160,7 +160,7 @@
+     #print output
+     conservation = []
+     for line in output.split("\n"):
+-        m = re.search("#MaxIdentity\s+(\d+\.\d+)", line)
++        m = re.search(r"#MaxIdentity\s+(\d+\.\d+)", line)
+         if m:
+             max_identity = float(m.groups()[0])
+     return max_identity
+--- python-ete3.orig/ete3/tools/ete_view.py
++++ python-ete3/ete3/tools/ete_view.py
+@@ -206,7 +206,7 @@
+         for tindex, tfile in enumerate(src_tree_iterator(args)):
+             #print tfile
+             if args.raxml:
+-                nw = re.sub(":(\d+\.\d+)\[(\d+)\]", ":\\1[&&NHX:support=\\2]", open(tfile).read())
++                nw = re.sub(r":(\d+\.\d+)\[(\d+)\]", ":\\1[&&NHX:support=\\2]", open(tfile).read())
+                 t = Tree(nw, format=args.src_newick_format)
+             else:
+                 t = Tree(tfile, format=args.src_newick_format)
+@@ -272,7 +272,7 @@
+     for tindex, tfile in enumerate(src_tree_iterator(args)):
+         #print tfile
+         if args.raxml:
+-            nw = re.sub(":(\d+\.\d+)\[(\d+)\]", ":\\1[&&NHX:support=\\2]", open(tfile).read())
++            nw = re.sub(r":(\d+\.\d+)\[(\d+)\]", ":\\1[&&NHX:support=\\2]", open(tfile).read())
+             t = PhyloTree(nw, format=args.src_newick_format)
+         else:
+             t = PhyloTree(tfile, format=args.src_newick_format)
+@@ -369,7 +369,7 @@
+ 
+                             if fcolor:
+                                 # Parse color options
+-                                auto_m = re.search("auto\(([^)]*)\)", fcolor)
++                                auto_m = re.search(r"auto\(([^)]*)\)", fcolor)
+                                 if auto_m:
+                                     target_attr = auto_m.groups()[0].strip()
+                                     if not target_attr :
+@@ -389,7 +389,7 @@
+ 
+                             if fbgcolor:
+                                 # Parse color options
+-                                auto_m = re.search("auto\(([^)]*)\)", fbgcolor)
++                                auto_m = re.search(r"auto\(([^)]*)\)", fbgcolor)
+                                 if auto_m:
+                                     target_attr = auto_m.groups()[0].strip()
+                                     if not target_attr :


=====================================
debian/patches/python3.13.patch
=====================================
@@ -0,0 +1,45 @@
+Description: fix test failure due to missing cgi in Python 3.13.
+ This change fixes the following symptom while runnong the test suite:
+ .
+         ==================================== ERRORS ====================================
+         ___ ERROR collecting .pybuild/cpython3_3.13_ete3/build/ete3/test/test_api.py ___
+         ImportError while importing test module '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_ete3/build/ete3/test/test_api.py'.
+         Hint: make sure your test modules/packages have valid Python names.
+         Traceback:
+         /usr/lib/python3.13/importlib/__init__.py:88: in import_module
+             return _bootstrap._gcd_import(name[level:], package, level)
+         ete3/__init__.py:56: in <module>
+             from .webplugin.webapp import *
+         ete3/webplugin/webapp.py:44: in <module>
+             import cgi
+         E   ModuleNotFoundError: No module named 'cgi'
+
+Author: Étienne Mollier <emollier at debian.org>
+Bug-Debian: https://bugs.debian.org/1082310
+Forwarded: no
+Last-Update: 2024-09-21
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- python-ete3.orig/ete3/webplugin/webapp.py
++++ python-ete3/ete3/webplugin/webapp.py
+@@ -41,7 +41,7 @@
+ import sys
+ import os
+ import time
+-import cgi
++import urllib
+ from hashlib import md5
+ import six.moves.cPickle
+ from six.moves import map
+@@ -259,9 +259,9 @@
+         path = environ['PATH_INFO'].split("/")
+         start_response('202 OK', [('content-type', 'text/plain')])
+         if environ['REQUEST_METHOD'].upper() == 'GET' and  environ['QUERY_STRING']:
+-            self.queries = cgi.parse_qs(environ['QUERY_STRING'])
++            self.queries = urllib.parse.parse_qs(environ['QUERY_STRING'])
+         elif environ['REQUEST_METHOD'].upper() == 'POST' and environ['wsgi.input']:
+-            self.queries = cgi.parse_qs(environ['wsgi.input'].read())
++            self.queries = urllib.parse.parse_qs(environ['wsgi.input'].read())
+         else:
+             self.queries = {}
+ 


=====================================
debian/patches/series
=====================================
@@ -1,3 +1,5 @@
 syntax_fixes.patch
 pmodeltest_executable.patch
 python3.12.patch
+python3.13.patch
+fix-warnings.patch


=====================================
debian/source/lintian-overrides
=====================================
@@ -0,0 +1,2 @@
+# Why on earth is this error tripping?
+source-is-missing [debian/patches/pmodeltest_executable.patch]



View it on GitLab: https://salsa.debian.org/med-team/python-ete3/-/compare/666f77f0412a14d3489ea5590c247b4bf64c5415...3798e34834b91c08179abe91287380cb3a02bd59

-- 
View it on GitLab: https://salsa.debian.org/med-team/python-ete3/-/compare/666f77f0412a14d3489ea5590c247b4bf64c5415...3798e34834b91c08179abe91287380cb3a02bd59
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/20240921/bb563311/attachment-0001.htm>


More information about the debian-med-commit mailing list