From 333832bacd3d3e40f291619017200c17bdb14a89 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sun, 12 May 2024 09:14:04 -0700 Subject: [PATCH 1/7] support more general sig loading in sig overlap --- src/sourmash/sig/__main__.py | 15 +++++++++++++-- tests/test_cmd_signature.py | 22 ++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/sourmash/sig/__main__.py b/src/sourmash/sig/__main__.py index 0a9cd4bc9e..316f99d3ee 100644 --- a/src/sourmash/sig/__main__.py +++ b/src/sourmash/sig/__main__.py @@ -384,12 +384,23 @@ def overlap(args): moltype = sourmash_args.calculate_moltype(args) - sig1 = sourmash.load_one_signature( + sig1 = sourmash.load_file_as_signatures( args.signature1, ksize=args.ksize, select_moltype=moltype ) - sig2 = sourmash.load_one_signature( + sig1 = list(sig1) + if len(sig1) != 1: + notify(f"ERROR: 'sig overlap' needs exactly one signature per file; found {len(sig1)} in '{args.signature1}'") + sys.exit(-1) + sig2 = sourmash.load_file_as_signatures( args.signature2, ksize=args.ksize, select_moltype=moltype ) + sig2 = list(sig2) + if len(sig2) != 1: + notify(f"ERROR: 'sig overlap' needs exactly one signature per file; found {len(sig2)} in '{args.signature2}'") + sys.exit(-1) + + sig1 = sig1[0] + sig2 = sig2[0] notify(f"loaded one signature each from {args.signature1} and {args.signature2}") diff --git a/tests/test_cmd_signature.py b/tests/test_cmd_signature.py index 8dfe8dc74a..2dafce15bb 100644 --- a/tests/test_cmd_signature.py +++ b/tests/test_cmd_signature.py @@ -3839,8 +3839,8 @@ def test_sig_describe_3_manifest_fails_when_moved(runtmp): runtmp.sourmash("sig", "describe", "mf.csv") -@utils.in_tempdir -def test_sig_overlap(c): +def test_sig_overlap(runtmp): + c = runtmp # get overlap details sig47 = utils.get_test_data("47.fa.sig") sig63 = utils.get_test_data("63.fa.sig") @@ -3857,6 +3857,24 @@ def test_sig_overlap(c): assert "number of hashes in common: 2529" in out +def test_sig_overlap_2(runtmp): + c = runtmp + # get overlap details + sig47 = utils.get_test_data("47.fa.sig.zip") + sig63 = utils.get_test_data("63.fa.sig.zip") + c.run_sourmash("sig", "overlap", sig47, sig63) + out = c.last_result.out + + print(out) + + # md5s + assert "09a08691ce52952152f0e866a59f6261" in out + assert "38729c6374925585db28916b82a6f513" in out + + assert "similarity: 0.32069" in out + assert "number of hashes in common: 2529" in out + + @utils.in_tempdir def test_import_export_1(c): # check to make sure we can import what we've exported! From 9a458291db7350d4a7a2d443256cd10e329776dd Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sun, 12 May 2024 09:23:16 -0700 Subject: [PATCH 2/7] fix up subtract as well --- src/sourmash/sig/__main__.py | 15 ++++++++++-- tests/test-data/47.fa.sig.zip | Bin 0 -> 43555 bytes tests/test-data/63.fa.sig.zip | Bin 0 -> 44092 bytes tests/test_cmd_signature.py | 44 ++++++++++++++++++++++++---------- 4 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 tests/test-data/47.fa.sig.zip create mode 100644 tests/test-data/63.fa.sig.zip diff --git a/src/sourmash/sig/__main__.py b/src/sourmash/sig/__main__.py index 316f99d3ee..6ef46c9e2c 100644 --- a/src/sourmash/sig/__main__.py +++ b/src/sourmash/sig/__main__.py @@ -658,9 +658,14 @@ def subtract(args): moltype = sourmash_args.calculate_moltype(args) from_sigfile = args.signature_from - from_sigobj = sourmash.load_one_signature( + from_sigobj = sourmash.load_file_as_signatures( from_sigfile, ksize=args.ksize, select_moltype=moltype ) + from_sigobj = list(from_sigobj) + if len(from_sigobj) != 1: + notify(f"ERROR: 'sig subtract' needs exactly one signature per file; found {len(from_sigobj)} in '{from_sigfile}'") + sys.exit(-1) + from_sigobj = from_sigobj[0] if args.abundances_from: # it's ok to work with abund signatures if -A. args.flatten = True @@ -705,9 +710,15 @@ def subtract(args): # borrow abundances from somewhere? if args.abundances_from: notify(f"loading signature from {args.abundances_from}, keeping abundances") - abund_sig = sourmash.load_one_signature( + abund_sig = sourmash.load_file_as_signatures( args.abundances_from, ksize=args.ksize, select_moltype=moltype ) + abund_sig = list(abund_sig) + if len(abund_sig) != 1: + notify(f"ERROR: 'sig subtract' needs exactly one signature per file; found {len(abund_sig)} in '{args.abundances_from}'") + sys.exit(-1) + abund_sig = abund_sig[0] + if not abund_sig.minhash.track_abundance: error("--track-abundance not set on loaded signature?! exiting.") sys.exit(-1) diff --git a/tests/test-data/47.fa.sig.zip b/tests/test-data/47.fa.sig.zip new file mode 100644 index 0000000000000000000000000000000000000000..d194944d88b1de0f1c67c1fb529fd9a485c7e87b GIT binary patch literal 43555 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 z zVW_)2IcYNhx}zm#H&10{xZ_!BIv;=lH*(O^~);IKClf<|z6cY-kp9o>iVnLWg*5c07$+d)^xvi|dd5 z$7>vbX@#u`kL31zdv;~+U)}uAppef@Hy)D^&}P)+4M!pT$B(pCUGLexx)>vUO3`_# zuVA)X>l@$YZ?zPCG%IO|haZ%Ep+UvU&G){ZjuHFcDDSwN7`Vk-Tz&`D&Op`c-fe2Z zFU?zgx^}M670yM^Wo);yGX-69r{`RC-UE#S5S|@^JVg{k0?A{0X)lqF{BENByvZ{4 z#pZ*(MIxd(P+YZN%3pcC6Ui52YEln9%JXtaOLaiilY$bj*B**^3e7=kjB9ii&KDx0 zfeWy6Ko8!@bm`HhbiChS6YkKtNY*nRg0hi&Bmb^4H9tJySj-C>aV-z$eJduh=Sxq4 z!h*#8lE&{(%TuJ_2~CThnzwRtnr3R-P91;vJdG)ted{clx_c

K|gAL7+_8vpdV< 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 literal 0 HcmV?d00001 diff --git a/tests/test_cmd_signature.py b/tests/test_cmd_signature.py index 2dafce15bb..1a23c8867a 100644 --- a/tests/test_cmd_signature.py +++ b/tests/test_cmd_signature.py @@ -769,8 +769,8 @@ def test_sig_inflate_5_bad_moltype(runtmp): assert "no signatures to inflate" in runtmp.last_result.err -@utils.in_tempdir -def test_sig_subtract_1(c): +def test_sig_subtract_1(runtmp): + c = runtmp # subtract of 63 from 47 sig47 = utils.get_test_data("47.fa.sig") sig63 = utils.get_test_data("63.fa.sig") @@ -789,6 +789,26 @@ def test_sig_subtract_1(c): assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins) +def test_sig_subtract_1_sigzip(runtmp): + c = runtmp + # subtract of 63 from 47 + sig47 = utils.get_test_data("47.fa.sig.zip") + sig63 = utils.get_test_data("63.fa.sig.zip") + c.run_sourmash("sig", "subtract", sig47, sig63) + + # stdout should be new signature + out = c.last_result.out + + test1_sig = list(sourmash.load_file_as_signatures(sig47))[0] + test2_sig = list(sourmash.load_file_as_signatures(sig63))[0] + actual_subtract_sig = sourmash.load_one_signature(out) + + mins = set(test1_sig.minhash.hashes.keys()) + mins -= set(test2_sig.minhash.hashes.keys()) + + assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins) + + def test_sig_subtract_1_abund(runtmp): # subtract 63 from 47, with abundances borrowed from 47 @@ -856,8 +876,8 @@ def test_sig_subtract_1_flatten(runtmp): assert set(actual_subtract_sig.minhash.hashes.keys()) == set(mins) -@utils.in_tempdir -def test_sig_subtract_1_multisig(c): +def test_sig_subtract_1_multisig(runtmp): + c = runtmp # subtract of everything from 47 sig47 = utils.get_test_data("47.fa.sig") multisig = utils.get_test_data("47+63-multisig.sig") @@ -871,8 +891,8 @@ def test_sig_subtract_1_multisig(c): assert not set(actual_subtract_sig.minhash.hashes.keys()) -@utils.in_tempdir -def test_sig_subtract_2(c): +def test_sig_subtract_2(runtmp): + c = runtmp # subtract of 63 from 47 should fail if 47 has abund sig47 = utils.get_test_data("track_abund/47.fa.sig") sig63 = utils.get_test_data("63.fa.sig") @@ -881,8 +901,8 @@ def test_sig_subtract_2(c): c.run_sourmash("sig", "subtract", sig47, sig63) -@utils.in_tempdir -def test_sig_subtract_3(c): +def test_sig_subtract_3(runtmp): + c = runtmp # subtract of 63 from 47 should fail if 63 has abund sig47 = utils.get_test_data("47.fa.sig") sig63 = utils.get_test_data("track_abund/63.fa.sig") @@ -891,8 +911,8 @@ def test_sig_subtract_3(c): c.run_sourmash("sig", "subtract", sig47, sig63) -@utils.in_tempdir -def test_sig_subtract_4_ksize_fail(c): +def test_sig_subtract_4_ksize_fail(runtmp): + c = runtmp # subtract of 2 from 47 should fail without -k specified sig47 = utils.get_test_data("47.fa.sig") sig2 = utils.get_test_data("2.fa.sig") @@ -901,8 +921,8 @@ def test_sig_subtract_4_ksize_fail(c): c.run_sourmash("sig", "subtract", sig47, sig2) -@utils.in_tempdir -def test_sig_subtract_4_ksize_succeed(c): +def test_sig_subtract_4_ksize_succeed(runtmp): + c = runtmp # subtract of 2 from 47 should fail without -k specified sig47 = utils.get_test_data("47.fa.sig") sig2 = utils.get_test_data("2.fa.sig") From 6da2d3a36620c4c41dc894ddcf284e1de19f622b Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sun, 12 May 2024 09:54:32 -0700 Subject: [PATCH 3/7] add sourmash_args.load_one_signature --- src/sourmash/sig/__main__.py | 34 +++++---------------------- src/sourmash/sourmash_args.py | 44 ++++++++++++++++++++++++++++++++++- tests/test_cmd_signature.py | 5 ++-- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/sourmash/sig/__main__.py b/src/sourmash/sig/__main__.py index 6ef46c9e2c..d807d2addf 100644 --- a/src/sourmash/sig/__main__.py +++ b/src/sourmash/sig/__main__.py @@ -384,23 +384,12 @@ def overlap(args): moltype = sourmash_args.calculate_moltype(args) - sig1 = sourmash.load_file_as_signatures( + sig1 = sourmash_args.load_one_signature( args.signature1, ksize=args.ksize, select_moltype=moltype ) - sig1 = list(sig1) - if len(sig1) != 1: - notify(f"ERROR: 'sig overlap' needs exactly one signature per file; found {len(sig1)} in '{args.signature1}'") - sys.exit(-1) - sig2 = sourmash.load_file_as_signatures( + sig2 = sourmash_args.load_one_signature( args.signature2, ksize=args.ksize, select_moltype=moltype ) - sig2 = list(sig2) - if len(sig2) != 1: - notify(f"ERROR: 'sig overlap' needs exactly one signature per file; found {len(sig2)} in '{args.signature2}'") - sys.exit(-1) - - sig1 = sig1[0] - sig2 = sig2[0] notify(f"loaded one signature each from {args.signature1} and {args.signature2}") @@ -657,15 +646,9 @@ def subtract(args): set_quiet(args.quiet) moltype = sourmash_args.calculate_moltype(args) - from_sigfile = args.signature_from - from_sigobj = sourmash.load_file_as_signatures( - from_sigfile, ksize=args.ksize, select_moltype=moltype + from_sigobj = sourmash_args.load_one_signature( + args.signature_from, ksize=args.ksize, select_moltype=moltype ) - from_sigobj = list(from_sigobj) - if len(from_sigobj) != 1: - notify(f"ERROR: 'sig subtract' needs exactly one signature per file; found {len(from_sigobj)} in '{from_sigfile}'") - sys.exit(-1) - from_sigobj = from_sigobj[0] if args.abundances_from: # it's ok to work with abund signatures if -A. args.flatten = True @@ -677,7 +660,7 @@ def subtract(args): subtract_mins = set(from_mh.hashes) - notify(f"loaded signature from {from_sigfile}...", end="\r") + notify(f"loaded signature from {args.signature_from}...", end="\r") progress = sourmash_args.SignatureLoadingProgress() @@ -710,14 +693,9 @@ def subtract(args): # borrow abundances from somewhere? if args.abundances_from: notify(f"loading signature from {args.abundances_from}, keeping abundances") - abund_sig = sourmash.load_file_as_signatures( + abund_sig = sourmash_args.load_one_signature( args.abundances_from, ksize=args.ksize, select_moltype=moltype ) - abund_sig = list(abund_sig) - if len(abund_sig) != 1: - notify(f"ERROR: 'sig subtract' needs exactly one signature per file; found {len(abund_sig)} in '{args.abundances_from}'") - sys.exit(-1) - abund_sig = abund_sig[0] if not abund_sig.minhash.track_abundance: error("--track-abundance not set on loaded signature?! exiting.") diff --git a/src/sourmash/sourmash_args.py b/src/sourmash/sourmash_args.py index fdbc0e4cf6..a157cf937b 100644 --- a/src/sourmash/sourmash_args.py +++ b/src/sourmash/sourmash_args.py @@ -51,7 +51,9 @@ from .index import LinearIndex from .picklist import SignaturePicklist, PickStyle from .manifest import CollectionManifest -from .save_load import SaveSignaturesToLocation, load_file_as_index, _load_database +from .save_load import (SaveSignaturesToLocation, + load_file_as_index, + _load_database) DEFAULT_LOAD_K = 31 @@ -810,3 +812,43 @@ def load_file_as_signatures( return progress.start_file(filename, loader) else: return loader + + +def load_one_signature( + filename, + *, + select_moltype=None, + ksize=None, + picklist=None, + yield_all_files=False, + pattern=None, + _use_manifest=True, +): + db = _load_database(filename, yield_all_files) + + # test fixture ;) + if not _use_manifest and db.manifest: + db.manifest = None + + db = db.select(moltype=select_moltype, ksize=ksize) + + # apply pattern search & picklist + db = apply_picklist_and_pattern(db, picklist, pattern) + + loader = db.signatures() + + # load exactly one! + try: + ss = next(iter(loader)) + except StopIteration: + raise ValueError(f"no signatures in '{filename}'? expected exactly one.") + + # make sure there's not a second one... + try: + _ = next(iter(loader)) + + raise ValueError(f"more than one signature in '{filename}'; expected exactly one") + except StopIteration: + pass + + return ss diff --git a/tests/test_cmd_signature.py b/tests/test_cmd_signature.py index 1a23c8867a..b45ab47f83 100644 --- a/tests/test_cmd_signature.py +++ b/tests/test_cmd_signature.py @@ -799,8 +799,9 @@ def test_sig_subtract_1_sigzip(runtmp): # stdout should be new signature out = c.last_result.out - test1_sig = list(sourmash.load_file_as_signatures(sig47))[0] - test2_sig = list(sourmash.load_file_as_signatures(sig63))[0] + from sourmash import sourmash_args + test1_sig = sourmash_args.load_one_signature(sig47) + test2_sig = sourmash_args.load_one_signature(sig63) actual_subtract_sig = sourmash.load_one_signature(out) mins = set(test1_sig.minhash.hashes.keys()) From 0082c45e00757b023af9abb910dbbc41552b08a9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 16:55:01 +0000 Subject: [PATCH 4/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/sourmash/sourmash_args.py | 8 ++++---- tests/test_cmd_signature.py | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/sourmash/sourmash_args.py b/src/sourmash/sourmash_args.py index a157cf937b..c4eddf27fb 100644 --- a/src/sourmash/sourmash_args.py +++ b/src/sourmash/sourmash_args.py @@ -51,9 +51,7 @@ from .index import LinearIndex from .picklist import SignaturePicklist, PickStyle from .manifest import CollectionManifest -from .save_load import (SaveSignaturesToLocation, - load_file_as_index, - _load_database) +from .save_load import SaveSignaturesToLocation, load_file_as_index, _load_database DEFAULT_LOAD_K = 31 @@ -847,7 +845,9 @@ def load_one_signature( try: _ = next(iter(loader)) - raise ValueError(f"more than one signature in '{filename}'; expected exactly one") + raise ValueError( + f"more than one signature in '{filename}'; expected exactly one" + ) except StopIteration: pass diff --git a/tests/test_cmd_signature.py b/tests/test_cmd_signature.py index b45ab47f83..04133a6796 100644 --- a/tests/test_cmd_signature.py +++ b/tests/test_cmd_signature.py @@ -800,6 +800,7 @@ def test_sig_subtract_1_sigzip(runtmp): out = c.last_result.out from sourmash import sourmash_args + test1_sig = sourmash_args.load_one_signature(sig47) test2_sig = sourmash_args.load_one_signature(sig63) actual_subtract_sig = sourmash.load_one_signature(out) From 093ed657dda8485b11f2076ad958987326d71c21 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 13 May 2024 08:23:31 -0700 Subject: [PATCH 5/7] fix one more call to load_one_signature --- src/sourmash/sig/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sourmash/sig/__main__.py b/src/sourmash/sig/__main__.py index d807d2addf..3ec03ed9e0 100644 --- a/src/sourmash/sig/__main__.py +++ b/src/sourmash/sig/__main__.py @@ -573,7 +573,7 @@ def intersect(args): # borrow abundances from a signature? if args.abundances_from: notify(f"loading signature from {args.abundances_from}, keeping abundances") - abund_sig = sourmash.load_one_signature( + abund_sig = sourmash_args.load_one_signature( args.abundances_from, ksize=args.ksize, select_moltype=moltype ) if not abund_sig.minhash.track_abundance: From 6d7ac3583253a6b3fd060ed3c447013cea72dc26 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 13 May 2024 11:14:34 -0700 Subject: [PATCH 6/7] add tests --- src/sourmash/sourmash_args.py | 5 ----- tests/test_sourmash_args.py | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/sourmash/sourmash_args.py b/src/sourmash/sourmash_args.py index c4eddf27fb..c4483cfe6c 100644 --- a/src/sourmash/sourmash_args.py +++ b/src/sourmash/sourmash_args.py @@ -820,14 +820,9 @@ def load_one_signature( picklist=None, yield_all_files=False, pattern=None, - _use_manifest=True, ): db = _load_database(filename, yield_all_files) - # test fixture ;) - if not _use_manifest and db.manifest: - db.manifest = None - db = db.select(moltype=select_moltype, ksize=ksize) # apply pattern search & picklist diff --git a/tests/test_sourmash_args.py b/tests/test_sourmash_args.py index 7fcbe2511e..cce7d1cd26 100644 --- a/tests/test_sourmash_args.py +++ b/tests/test_sourmash_args.py @@ -841,3 +841,30 @@ def test_bug_2370(runtmp): # try running sourmash_args.load_file_as_index # runtmp.sourmash('sig', 'describe', runtmp.output('not_really_gzipped.gz')) sourmash_args.load_file_as_index(runtmp.output("not_really_gzipped.gz")) + + +def test_load_one_signature_1(runtmp): + # test the sourmash_args.load_one_signature function + sigfile = utils.get_test_data("63.fa.sig.zip") + + ss = sourmash_args.load_one_signature(sigfile, ksize=31) + assert ss.name.startswith('NC_011663.1 ') + + +def test_load_one_signature_2_fail(runtmp): + # test the sourmash_args.load_one_signature function on failure - no sig + sigfile = utils.get_test_data("63.fa.sig.zip") + + with pytest.raises(ValueError) as exc: + ss = sourmash_args.load_one_signature(sigfile, ksize=21) + + assert "expected exactly one." in str(exc) + +def test_load_one_signature_3_fail(runtmp): + # test the sourmash_args.load_one_signature function on failure - many sigs + sigfile = utils.get_test_data("prot/all.zip") + + with pytest.raises(ValueError) as exc: + ss = sourmash_args.load_one_signature(sigfile) + + assert "more than one signature" in str(exc) From 9a6a61c6b69470985e0c7da10fe90eae4eb95192 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 18:14:52 +0000 Subject: [PATCH 7/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_sourmash_args.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_sourmash_args.py b/tests/test_sourmash_args.py index cce7d1cd26..8f58a0a25f 100644 --- a/tests/test_sourmash_args.py +++ b/tests/test_sourmash_args.py @@ -848,7 +848,7 @@ def test_load_one_signature_1(runtmp): sigfile = utils.get_test_data("63.fa.sig.zip") ss = sourmash_args.load_one_signature(sigfile, ksize=31) - assert ss.name.startswith('NC_011663.1 ') + assert ss.name.startswith("NC_011663.1 ") def test_load_one_signature_2_fail(runtmp): @@ -856,15 +856,16 @@ def test_load_one_signature_2_fail(runtmp): sigfile = utils.get_test_data("63.fa.sig.zip") with pytest.raises(ValueError) as exc: - ss = sourmash_args.load_one_signature(sigfile, ksize=21) + sourmash_args.load_one_signature(sigfile, ksize=21) assert "expected exactly one." in str(exc) + def test_load_one_signature_3_fail(runtmp): # test the sourmash_args.load_one_signature function on failure - many sigs sigfile = utils.get_test_data("prot/all.zip") with pytest.raises(ValueError) as exc: - ss = sourmash_args.load_one_signature(sigfile) + sourmash_args.load_one_signature(sigfile) assert "more than one signature" in str(exc)