From 7dcbf0f20bb93de9feb7932dfd958579a5a873ae Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:30:10 +1100 Subject: [PATCH 01/24] Add other packages that are imported but not in deps --- pyproject.toml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 5c1ce1e3..798ae824 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ classifiers = [ dependencies = [ "biopython", + "bitarray", "boto3", "brewer2mpl", "CrossMap", @@ -54,14 +55,30 @@ dependencies = [ "ortools", "pybedtools", "pyefd", + "pyfasta", + "pygraphviz", + "pyliftover", "pypdf", + "pysam", "pytesseract", "rich", "scikit-image", "scipy", "seaborn", + "segment_anything", "Wand", "webcolors", + #"BCBio", + #"BeautifulSoup", + #"cyvcf2", + #"gurobipy", + #"hmmlearn", + #"holoviews", + #"hvplot", + #"matplotlib_venn", + #"sklearn", + #"xlrd", + #"xlwt", ] dynamic = ["version"] From 011569c9dc035a39b7bed5b6c6422e1d97b62593 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:31:19 +1100 Subject: [PATCH 02/24] check pkg avail with importlib --- src/jcvi/algorithms/lpsolve.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/jcvi/algorithms/lpsolve.py b/src/jcvi/algorithms/lpsolve.py index 0c85b6cf..3bd3aa23 100755 --- a/src/jcvi/algorithms/lpsolve.py +++ b/src/jcvi/algorithms/lpsolve.py @@ -420,14 +420,15 @@ def has_ortools() -> bool: Returns: bool: True if installed """ - try: - from ortools.linear_solver import pywraplp - + import importlib.util + + if importlib.util.find_spec("ortools.linear_solver.pywraplp") is not None: return True - except ImportError: + else: return False + def summation(incident_edges): s = "".join(" + x{0}".format(i + 1) for i in incident_edges) return s From 4aef743eb5194bd77517450c01907fb7a190c97d Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:31:55 +1100 Subject: [PATCH 03/24] use isinstance --- src/jcvi/annotation/pasa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jcvi/annotation/pasa.py b/src/jcvi/annotation/pasa.py index 34c6358d..caf2953e 100644 --- a/src/jcvi/annotation/pasa.py +++ b/src/jcvi/annotation/pasa.py @@ -469,7 +469,7 @@ def consolidate(args): gene = "gene_{0:0{pad}}".format(i, pad=6) if mode == "coords" else None for elem in locus: - if type(elem) == tuple: + if isinstance(elem, tuple): _gene, dbn = elem if gene is None: gene = _gene From 9ebb5ff413279b135a782323406e91419e776b8b Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:32:22 +1100 Subject: [PATCH 04/24] rm unused imports --- src/jcvi/apps/base.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/jcvi/apps/base.py b/src/jcvi/apps/base.py index 2dcbe53b..17d75076 100644 --- a/src/jcvi/apps/base.py +++ b/src/jcvi/apps/base.py @@ -26,12 +26,9 @@ from socket import gethostname from subprocess import CalledProcessError, PIPE, call, check_output from time import ctime -from typing import Any, Collection, List, Optional, Tuple, Union +from typing import Collection, List, Optional, Tuple, Union from urllib.parse import urlencode -# from optparse import OptionParser as OptionP, OptionGroup, SUPPRESS_HELP - - from natsort import natsorted from rich.console import Console from rich.logging import RichHandler @@ -122,7 +119,7 @@ def dispatch(self, globals): action = sys.argv[1] - if not action in self.valid_actions: + if action not in self.valid_actions: print("[error] {0} not a valid {1}\n".format(action, meta), file=sys.stderr) alt = get_close_matches(action, self.valid_actions) print( @@ -1000,7 +997,7 @@ def set_home(self, prog, default=None): if default is None: # Last attempt at guessing the path try: default = op.dirname(which(prog)) - except: + except Exception: default = None else: default = op.expanduser(default) @@ -1029,7 +1026,7 @@ def ConfigSectionMap(Config, section): cfg[option] = Config.get(section, option) if cfg[option] == -1: logger.debug("Skip: %s", option) - except: + except Exception: logger.error("Exception on %s", option) cfg[option] = None return cfg @@ -1318,7 +1315,7 @@ def mkdir(dirname, overwrite=False): else: try: os.mkdir(dirname) - except: + except Exception: os.makedirs(dirname) logger.debug("`%s` not found. Creating new.", dirname) From ee055d1ab449cd1940bf8a860b311b7090b14c08 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:33:07 +1100 Subject: [PATCH 05/24] use isinstance --- src/jcvi/apps/phylo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/jcvi/apps/phylo.py b/src/jcvi/apps/phylo.py index 15fd2564..d4cbb85c 100644 --- a/src/jcvi/apps/phylo.py +++ b/src/jcvi/apps/phylo.py @@ -275,7 +275,7 @@ def smart_reroot(treefile, outgroupfile, outfile, format=0): try: tree.set_outgroup(tree.get_common_ancestor(*outgroup)) except ValueError: - assert type(outgroup) == list + assert isinstance(outgroup, list) outgroup = outgroup[0] tree.set_outgroup(outgroup) tree.write(outfile=outfile, format=format) @@ -481,7 +481,7 @@ def SH_raxml(reftree, querytree, phy_file, shout="SH_out.txt"): # hard coded try: pval = re.search("(Significantly.*:.*)", o).group(0) - except: + except Exception: print("SH test failed.", file=sys.stderr) else: pval = pval.strip().replace("\t", " ").replace("%", "\%") @@ -946,7 +946,7 @@ def build(args): outfile, phy_file = build_nj_phylip( alignment, outfile=out_file, outgroup=outgroup, work_dir=treedir ) - except: + except Exception: print("NJ tree cannot be built for {0}".format(dna_file)) if opts.SH: @@ -964,7 +964,7 @@ def build(args): outfile, phy_file = build_ml_phyml( alignment, outfile=out_file, work_dir=treedir ) - except: + except Exception: print("ML tree cannot be built for {0}".format(dna_file)) elif opts.ml == "raxml": @@ -972,7 +972,7 @@ def build(args): outfile, phy_file = build_ml_raxml( alignment, outfile=out_file, work_dir=treedir ) - except: + except Exception: print("ML tree cannot be built for {0}".format(dna_file)) if outgroup: From 5941d5e71c9034d814c80e4b717f8a5e0b9e8484 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:33:48 +1100 Subject: [PATCH 06/24] Note: uses undefined variable! --- src/jcvi/apps/uclust.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jcvi/apps/uclust.py b/src/jcvi/apps/uclust.py index 1da53f33..6a330297 100644 --- a/src/jcvi/apps/uclust.py +++ b/src/jcvi/apps/uclust.py @@ -599,6 +599,7 @@ def consensus(args): RAD = stack(S) if len(data) == 1: # No computation needed + # TODO: seq is not defined! output.append((fname, seq)) bins.extend(RAD) start = end From f83dd9876ef4a0e5dfbc38c446f988e8fa2e7146 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:34:00 +1100 Subject: [PATCH 07/24] rm unused imports --- src/jcvi/apps/wga2ribbon.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/jcvi/apps/wga2ribbon.py b/src/jcvi/apps/wga2ribbon.py index 12847ada..bf4eba38 100644 --- a/src/jcvi/apps/wga2ribbon.py +++ b/src/jcvi/apps/wga2ribbon.py @@ -8,12 +8,8 @@ from collections import namedtuple from jcvi.graphics.base import AbstractLayout -from operator import attrgetter import argparse -import glob -import os -import shutil -import sys + def mainArgs(): From 7873f904595ffa302a57a6afed8436246f8a1f88 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:34:17 +1100 Subject: [PATCH 08/24] rm unused var --- src/jcvi/assembly/hic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/jcvi/assembly/hic.py b/src/jcvi/assembly/hic.py index 0547ae15..38e30d90 100644 --- a/src/jcvi/assembly/hic.py +++ b/src/jcvi/assembly/hic.py @@ -680,7 +680,6 @@ def generate_groups(groupsfile): Args: groupsfile (str): Path to the groups file """ - data = [] with open(groupsfile) as fp: for row in fp: seqids, color = row.split() From 350ccfa9448a1fa3f869ffd1c285809e5db1a7dd Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:34:48 +1100 Subject: [PATCH 09/24] unused format arg --- src/jcvi/compara/fractionation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jcvi/compara/fractionation.py b/src/jcvi/compara/fractionation.py index 61e59413..43503fd4 100644 --- a/src/jcvi/compara/fractionation.py +++ b/src/jcvi/compara/fractionation.py @@ -381,7 +381,7 @@ def gaps(args): not_in_gaps = popen(cmd).read() not_in_gaps = int(not_in_gaps) in_gaps = total - not_in_gaps - print("Ids in gaps: {1}".format(total, percentage(in_gaps, total)), file=sys.stderr) + print("Ids in gaps: {0}".format(percentage(in_gaps, total)), file=sys.stderr) def get_tags(idsfile): From 212b7bea94f6fc03f161d831cebbe95523476729 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:35:10 +1100 Subject: [PATCH 10/24] use is not --- src/jcvi/compara/quota.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jcvi/compara/quota.py b/src/jcvi/compara/quota.py index 9e6356c3..859eb30a 100755 --- a/src/jcvi/compara/quota.py +++ b/src/jcvi/compara/quota.py @@ -124,7 +124,7 @@ def create_data_model(nodes, constraints_x, qa, constraints_y, qb): num_constraints = len(constraints_x) # non-self - if not (constraints_x is constraints_y): + if constraints_x is not constraints_y: for c in constraints_y: constraint_coeffs.append({x: 1 for x in c}) bounds.append(qb) From 203b7d186ad355a72f1c8bf9d1913f1e3ea34d1a Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:35:31 +1100 Subject: [PATCH 11/24] note: Bigraph imported but not used --- src/jcvi/compara/reconstruct.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jcvi/compara/reconstruct.py b/src/jcvi/compara/reconstruct.py index 83a9c377..54c12695 100644 --- a/src/jcvi/compara/reconstruct.py +++ b/src/jcvi/compara/reconstruct.py @@ -76,6 +76,7 @@ def fuse(args): Fuse gene orders based on anchors file. """ + # TODO: BiGraph is not used from jcvi.algorithms.graph import BiGraph p = OptionParser(fuse.__doc__) From a124091169d6cfac92dfcd3b178c52e80dfe643b Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:35:45 +1100 Subject: [PATCH 12/24] rm unused import --- src/jcvi/compara/synteny.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/jcvi/compara/synteny.py b/src/jcvi/compara/synteny.py index 2e51711c..5f0b465d 100755 --- a/src/jcvi/compara/synteny.py +++ b/src/jcvi/compara/synteny.py @@ -564,7 +564,6 @@ def assemble(args): Contents after the 3rd field (end gene) are ignored. Using the example above, the final .blocks file will contain 5 columns, one column for each line. """ - import shutil from tempfile import mkdtemp, mkstemp from jcvi.apps.align import last From 1279a7b0506e98335db6a3c54b6fc08148999a58 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:36:03 +1100 Subject: [PATCH 13/24] fix logger formatting --- src/jcvi/formats/bed.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jcvi/formats/bed.py b/src/jcvi/formats/bed.py index ac656a58..08947900 100755 --- a/src/jcvi/formats/bed.py +++ b/src/jcvi/formats/bed.py @@ -1257,9 +1257,9 @@ def fix(args): ntotal += 1 if nfixed: - logger.debug("Total fixed: %s".format(percentage(nfixed, ntotal))) + logger.debug("Total fixed: %s", percentage(nfixed, ntotal)) if nfiltered: - logger.debug("Total filtered: %s".format(percentage(nfiltered, ntotal))) + logger.debug("Total filtered: %s", percentage(nfiltered, ntotal)) def some(args): @@ -1307,7 +1307,7 @@ def some(args): print(b, file=fw) fw.close() - logger.debug("Stats: %s features kept.".format(percentage(nkeep, ntotal))) + logger.debug(f"Stats: {percentage(nkeep, ntotal)} features kept.") def uniq(args): From acb0eea05ec5cf808a74c5a659ae4d6f8798410e Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:36:20 +1100 Subject: [PATCH 14/24] fix print formatting --- src/jcvi/formats/fasta.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jcvi/formats/fasta.py b/src/jcvi/formats/fasta.py index 5ca4a516..b20c906c 100644 --- a/src/jcvi/formats/fasta.py +++ b/src/jcvi/formats/fasta.py @@ -1596,7 +1596,7 @@ def diff(args): printf("[green]Two sequence size match ({})".format(asize)) else: printf( - "[red]Two sequence size do not match ({}, {}})".format(asize, bsize) + "[red]Two sequence size do not match ({}, {})".format(asize, bsize) ) # print out the first place the two sequences diff From ebf15acd3e8421bd88616cef17b92671c2539a61 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:36:43 +1100 Subject: [PATCH 15/24] Note: remove BCBio? --- src/jcvi/formats/gff.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jcvi/formats/gff.py b/src/jcvi/formats/gff.py index 6bd66def..9548a2e9 100644 --- a/src/jcvi/formats/gff.py +++ b/src/jcvi/formats/gff.py @@ -1037,6 +1037,7 @@ def gb(args): """ try: + # TODO: remove this dependency. Could maybe substitute with BioPython from BCBio import GFF except ImportError: print( From ae45b52c009883bd17313bfa48c8c17cf3a3df35 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:36:58 +1100 Subject: [PATCH 16/24] fix typehint --- src/jcvi/formats/obo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jcvi/formats/obo.py b/src/jcvi/formats/obo.py index 001df4e6..8fcef6a0 100755 --- a/src/jcvi/formats/obo.py +++ b/src/jcvi/formats/obo.py @@ -10,7 +10,7 @@ from collections import deque from functools import partial -from typing import IO, Optional +from typing import IO, Optional, Tuple from goatools.obo_parser import GODag @@ -22,7 +22,7 @@ ) -def load_GODag(obo_url: str, prt: Optional[IO] = None) -> (GODag, str): +def load_GODag(obo_url: str, prt: Optional[IO] = None) -> Tuple[GODag, str]: """ Load given obo url and returns GODag object. From 806653e5fbaa7d635bc1e4dd41e9fd434b2b9777 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:37:19 +1100 Subject: [PATCH 17/24] rm duplicate function --- src/jcvi/graphics/base.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/jcvi/graphics/base.py b/src/jcvi/graphics/base.py index 62113be5..f71d60df 100644 --- a/src/jcvi/graphics/base.py +++ b/src/jcvi/graphics/base.py @@ -322,24 +322,6 @@ def update_figname(figname: str, format: str) -> str: return figname + "." + format -def update_figname(figname: str, format: str) -> str: - """Update the name of a figure to include the format. - - Args: - figname (str): Path to the figure - format (str): Figure format, must be one of GRAPHIC_FORMATS - - Returns: - str: New file path - """ - _, ext = op.splitext(figname) - if ext.strip(".") in GRAPHIC_FORMATS: # User suffix has precedence - return figname - # When the user has not supplied a format in the filename, use the requested format - assert format in GRAPHIC_FORMATS, "Invalid format" - return figname + "." + format - - def savefig(figname, dpi=150, iopts=None, cleanup=True, transparent=False): try: format = figname.rsplit(".", 1)[-1].lower() @@ -507,7 +489,7 @@ def asciiplot(x, y, digit=1, width=50, title=None, char="="): ay = np.array(y) if title: - print("[bold white]".format(title), file=sys.stderr) + print("[bold white]{}".format(title), file=sys.stderr) az = ay * width // ay.max() tx = [asciiaxis(x, digit=digit) for x in ax] From 4f65f11099185d8299e57aac6f73facbb83bbb76 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:37:34 +1100 Subject: [PATCH 18/24] use not in --- src/jcvi/graphics/tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jcvi/graphics/tree.py b/src/jcvi/graphics/tree.py index 8d96dc77..8c5a4b49 100644 --- a/src/jcvi/graphics/tree.py +++ b/src/jcvi/graphics/tree.py @@ -492,7 +492,7 @@ def cv(x): # Neogene and Cretaceous as these are more relevant for most phylogeny if contrast_epochs: for era, start, end in Geo: - if not era in ("Neogene", "Cretaceous"): + if era not in ("Neogene", "Cretaceous"): continue # Make a beige patch From b496da28793b70f86bf555f637c5b6865385afe3 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:37:45 +1100 Subject: [PATCH 19/24] use isinstance --- src/jcvi/utils/cbook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jcvi/utils/cbook.py b/src/jcvi/utils/cbook.py index 20c7c2c5..9831870e 100644 --- a/src/jcvi/utils/cbook.py +++ b/src/jcvi/utils/cbook.py @@ -346,7 +346,7 @@ def seqid_parse(seqid, sep=["-"], stdpf=True): if sep is None: sep = [""] - elif type(sep) == str: + elif isinstance(sep, str): sep = [sep] prefix = seqid[:lastnumi] From 1252c8f27e137bcb477907768dc2443aad33dc4a Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:37:55 +1100 Subject: [PATCH 20/24] rm logging --- src/jcvi/variation/cnv.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/jcvi/variation/cnv.py b/src/jcvi/variation/cnv.py index e2d397be..beb0bbb1 100644 --- a/src/jcvi/variation/cnv.py +++ b/src/jcvi/variation/cnv.py @@ -4,7 +4,6 @@ """ Helper functions for Copy Number Variations (CNV). """ -import logging import os.path as op import sys From 4a9b9a69d8b0deaba3196fa8cc633cb46950bede Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 17:42:25 +1100 Subject: [PATCH 21/24] add testing packages to conda env yamls for testing install from wheels and black for dev --- env_osx64.yml | 5 +++++ environment.yml | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/env_osx64.yml b/env_osx64.yml index 74bf21e8..f3ea7655 100644 --- a/env_osx64.yml +++ b/env_osx64.yml @@ -10,5 +10,10 @@ dependencies: - wand # Python bindings for ImageMagick - pip - pip: + - black - hatch + - mock - pytest + - pytest-benchmark + - pytest-cov + - PyYAML \ No newline at end of file diff --git a/environment.yml b/environment.yml index f47d16c7..ce923a98 100644 --- a/environment.yml +++ b/environment.yml @@ -10,5 +10,10 @@ dependencies: - wand # Python bindings for ImageMagick - pip - pip: - - pytest + - black - hatch + - mock + - pytest + - pytest-benchmark + - pytest-cov + - PyYAML From 1f8a60b06b5e9c2dd0fac5ea6c5ac18dab3ebb09 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 18:50:29 +1100 Subject: [PATCH 22/24] Allow numpy > 2, no effect on tests --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 798ae824..1b700bb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ dependencies = [ "more-itertools", "natsort", "networkx", - "numpy<2", + "numpy", "ortools", "pybedtools", "pyefd", From 52bef9069e764bb8ccd6b060cddedadb95d29d0d Mon Sep 17 00:00:00 2001 From: Adamtaranto Date: Sun, 5 Jan 2025 07:54:10 +0000 Subject: [PATCH 23/24] Style fixes by Black --- src/jcvi/algorithms/lpsolve.py | 3 +-- src/jcvi/apps/wga2ribbon.py | 1 - src/jcvi/formats/gff.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/jcvi/algorithms/lpsolve.py b/src/jcvi/algorithms/lpsolve.py index 3bd3aa23..60f2de57 100755 --- a/src/jcvi/algorithms/lpsolve.py +++ b/src/jcvi/algorithms/lpsolve.py @@ -421,14 +421,13 @@ def has_ortools() -> bool: bool: True if installed """ import importlib.util - + if importlib.util.find_spec("ortools.linear_solver.pywraplp") is not None: return True else: return False - def summation(incident_edges): s = "".join(" + x{0}".format(i + 1) for i in incident_edges) return s diff --git a/src/jcvi/apps/wga2ribbon.py b/src/jcvi/apps/wga2ribbon.py index bf4eba38..fb0d16dd 100644 --- a/src/jcvi/apps/wga2ribbon.py +++ b/src/jcvi/apps/wga2ribbon.py @@ -11,7 +11,6 @@ import argparse - def mainArgs(): """Parse command line arguments.""" parser = argparse.ArgumentParser( diff --git a/src/jcvi/formats/gff.py b/src/jcvi/formats/gff.py index 9548a2e9..7e7ec548 100644 --- a/src/jcvi/formats/gff.py +++ b/src/jcvi/formats/gff.py @@ -1037,7 +1037,7 @@ def gb(args): """ try: - # TODO: remove this dependency. Could maybe substitute with BioPython + # TODO: remove this dependency. Could maybe substitute with BioPython from BCBio import GFF except ImportError: print( From f525592891f15362c94b912e5e21b3261390e804 Mon Sep 17 00:00:00 2001 From: Adam Taranto Date: Sun, 5 Jan 2025 19:01:01 +1100 Subject: [PATCH 24/24] pygraphviz breaks wheel build in github action for some reason --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1b700bb2..5a0531db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ dependencies = [ "pybedtools", "pyefd", "pyfasta", - "pygraphviz", + #"pygraphviz", "pyliftover", "pypdf", "pysam",