[med-svn] [Git][med-team/q2-vsearch][upstream] New upstream version 2023.9.0
Andreas Tille (@tille)
gitlab at salsa.debian.org
Wed Jan 31 06:13:26 GMT 2024
Andreas Tille pushed to branch upstream at Debian Med / q2-vsearch
Commits:
13e16b60 by Andreas Tille at 2024-01-30T20:25:37+01:00
New upstream version 2023.9.0
- - - - -
28 changed files:
- + .github/workflows/add-to-project-ci.yml
- + .github/workflows/ci-dev.yaml
- + .github/workflows/join-release.yaml
- + .github/workflows/tag-release.yaml
- − .travis.yml
- LICENSE
- README.md
- − ci/recipe/conda_build_config.yaml
- ci/recipe/meta.yaml
- q2_vsearch/__init__.py
- q2_vsearch/_chimera.py
- q2_vsearch/_cluster_features.py
- q2_vsearch/_cluster_sequences.py
- q2_vsearch/_format.py
- q2_vsearch/_join_pairs.py → q2_vsearch/_merge_pairs.py
- q2_vsearch/_stats.py
- q2_vsearch/_transformer.py
- q2_vsearch/_type.py
- q2_vsearch/_version.py
- q2_vsearch/plugin_setup.py
- q2_vsearch/tests/__init__.py
- q2_vsearch/tests/test_chimera.py
- q2_vsearch/tests/test_cluster_features.py
- q2_vsearch/tests/test_cluster_sequences.py
- q2_vsearch/tests/test_join_pairs.py → q2_vsearch/tests/test_merge_pairs.py
- q2_vsearch/tests/test_plugin_setup.py
- q2_vsearch/tests/test_stats.py
- setup.py
Changes:
=====================================
.github/workflows/add-to-project-ci.yml
=====================================
@@ -0,0 +1,21 @@
+name: Add new issues and PRs to triage project board
+
+on:
+ issues:
+ types:
+ - opened
+ pull_request_target:
+ types:
+ - opened
+
+jobs:
+ add-to-project:
+ name: Add issue to project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/add-to-project at v0.3.0
+ with:
+ project-url: https://github.com/orgs/qiime2/projects/36
+ github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
+ labeled: skip-triage
+ label-operator: NOT
=====================================
.github/workflows/ci-dev.yaml
=====================================
@@ -0,0 +1,12 @@
+# Example of workflow trigger for calling workflow (the client).
+name: ci-dev
+on:
+ pull_request:
+ branches: ["dev"]
+ push:
+ branches: ["dev"]
+jobs:
+ ci:
+ uses: qiime2/distributions/.github/workflows/lib-ci-dev.yaml at dev
+ with:
+ distro: core
\ No newline at end of file
=====================================
.github/workflows/join-release.yaml
=====================================
@@ -0,0 +1,6 @@
+name: join-release
+on:
+ workflow_dispatch: {}
+jobs:
+ release:
+ uses: qiime2/distributions/.github/workflows/lib-join-release.yaml at dev
\ No newline at end of file
=====================================
.github/workflows/tag-release.yaml
=====================================
@@ -0,0 +1,7 @@
+name: tag-release
+on:
+ push:
+ branches: ["Release-*"]
+jobs:
+ tag:
+ uses: qiime2/distributions/.github/workflows/lib-tag-release.yaml at dev
\ No newline at end of file
=====================================
.travis.yml deleted
=====================================
@@ -1,25 +0,0 @@
-dist: trusty
-sudo: false
-language: python
-before_install:
- - export MPLBACKEND='Agg'
- - wget -q https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh
- - export MINICONDA_PREFIX="$HOME/miniconda"
- - bash miniconda.sh -b -p $MINICONDA_PREFIX
- - export PATH="$MINICONDA_PREFIX/bin:$PATH"
- - conda config --set always_yes yes
- - conda update -q conda
- - conda info -a
-install:
- - wget -q https://raw.githubusercontent.com/qiime2/environment-files/master/latest/staging/qiime2-latest-py36-linux-conda.yml
- - conda env create -q -n test-env --file qiime2-latest-py36-linux-conda.yml
- - source activate test-env
- - conda install -q pytest-cov
- - pip install -q flake8 coveralls
- - pip install -q https://github.com/qiime2/q2lint/archive/master.zip
- - make install
-script:
- - make lint
- - make test-cov
-after_success:
- - coveralls
=====================================
LICENSE
=====================================
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright (c) 2016-2020, QIIME 2 development team.
+Copyright (c) 2016-2023, QIIME 2 development team.
All rights reserved.
Redistribution and use in source and binary forms, with or without
=====================================
README.md
=====================================
@@ -1,3 +1,5 @@
# q2-vsearch
-This is a QIIME 2 plugin. For details on QIIME 2, see https://qiime2.org.
+![](https://github.com/qiime2/q2-vsearch/workflows/ci/badge.svg)
+
+This is a QIIME 2 plugin. For details on QIIME 2, see https://qiime2.org.
\ No newline at end of file
=====================================
ci/recipe/conda_build_config.yaml deleted
=====================================
@@ -1,2 +0,0 @@
-python:
- - 3.6
=====================================
ci/recipe/meta.yaml
=====================================
@@ -1,6 +1,5 @@
{% set data = load_setup_py_data() %}
{% set version = data.get('version') or 'placehold' %}
-{% set release = '.'.join(version.split('.')[:2]) %}
package:
name: q2-vsearch
@@ -19,12 +18,31 @@ requirements:
run:
- python {{ python }}
- - vsearch 2.7.0
- - scikit-bio
- - biom-format >=2.1.5,<2.2.0
+ - vsearch
+ - scikit-bio {{ scikit_bio }}
+ - biom-format {{ biom_format }}
- numpy
- - pandas
+ - pandas {{ pandas }}
- pyyaml
- - qiime2 {{ release }}.*
- - q2-types {{ release }}.*
- - q2-feature-table {{ release }}.*
+ - qiime2 {{ qiime2_epoch }}.*
+ - q2-types {{ qiime2_epoch }}.*
+ - q2-feature-table {{ qiime2_epoch }}.*
+
+test:
+ commands:
+ - py.test --pyargs q2_vsearch
+
+ requires:
+ - qiime2 >={{ qiime2 }}
+ - q2-types >={{ q2_types }}
+ - q2-feature-table >={{ q2_feature_table }}
+ - pytest
+
+ imports:
+ - q2_vsearch
+ - qiime2.plugins.vsearch
+
+about:
+ home: https://qiime2.org
+ license: BSD-3-Clause
+ license_family: BSD
=====================================
q2_vsearch/__init__.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/_chimera.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -9,7 +9,6 @@
import tempfile
import biom
-import skbio.io
from q2_types.feature_data import DNAFASTAFormat
from ._cluster_features import _fasta_with_sizes, run_command
@@ -46,28 +45,23 @@ def _uchime_ref(sequences, table, reference_sequences, dn, mindiffs,
nonchimeras = DNAFASTAFormat()
uchime_stats = UchimeStatsFmt()
with tempfile.NamedTemporaryFile() as fasta_with_sizes:
- with tempfile.NamedTemporaryFile() as temp_chimeras:
- _fasta_with_sizes(str(sequences), fasta_with_sizes.name, table)
- cmd = ['vsearch',
- '--uchime_ref', fasta_with_sizes.name,
- '--uchimeout', str(uchime_stats),
- '--nonchimeras', str(nonchimeras),
- '--chimeras', temp_chimeras.name,
- '--dn', str(dn),
- '--mindiffs', str(mindiffs),
- '--mindiv', str(mindiv),
- '--minh', str(minh),
- '--xn', str(xn),
- '--db', str(reference_sequences),
- '--qmask', 'none', # ensures no lowercase DNA chars
- '--xsize',
- '--threads', str(threads),
- '--minseqlength', '1',
- '--fasta_width', '0']
- run_command(cmd)
- # this processing step should be removed, pending fix of:
- # https://github.com/qiime2/q2-vsearch/issues/39
- _fix_chimera_ids(temp_chimeras, chimeras)
+ _fasta_with_sizes(str(sequences), fasta_with_sizes.name, table)
+ cmd = ['vsearch',
+ '--uchime_ref', fasta_with_sizes.name,
+ '--uchimeout', str(uchime_stats),
+ '--nonchimeras', str(nonchimeras),
+ '--chimeras', str(chimeras),
+ '--dn', str(dn),
+ '--mindiffs', str(mindiffs),
+ '--mindiv', str(mindiv),
+ '--minh', str(minh),
+ '--xn', str(xn),
+ '--db', str(reference_sequences),
+ '--qmask', 'none', # ensures no lowercase DNA chars
+ '--xsize',
+ '--threads', str(threads),
+ '--fasta_width', '0']
+ run_command(cmd)
return cmd, chimeras, nonchimeras, uchime_stats
@@ -91,36 +85,20 @@ def _uchime_denovo(sequences, table, dn, mindiffs, mindiv, minh, xn):
nonchimeras = DNAFASTAFormat()
uchime_stats = UchimeStatsFmt()
with tempfile.NamedTemporaryFile() as fasta_with_sizes:
- with tempfile.NamedTemporaryFile() as temp_chimeras:
- _fasta_with_sizes(str(sequences), fasta_with_sizes.name, table)
- cmd = ['vsearch',
- '--uchime_denovo', fasta_with_sizes.name,
- '--uchimeout', str(uchime_stats),
- '--nonchimeras', str(nonchimeras),
- '--chimeras', temp_chimeras.name,
- '--dn', str(dn),
- '--mindiffs', str(mindiffs),
- '--mindiv', str(mindiv),
- '--minh', str(minh),
- '--xn', str(xn),
- '--qmask', 'none', # ensures no lowercase DNA chars
- '--xsize',
- '--minseqlength', '1',
- '--fasta_width', '0']
- run_command(cmd)
- # this processing step should be removed, pending fix of:
- # https://github.com/qiime2/q2-vsearch/issues/39
- _fix_chimera_ids(temp_chimeras, chimeras)
+ _fasta_with_sizes(str(sequences), fasta_with_sizes.name, table)
+ cmd = ['vsearch',
+ '--uchime_denovo', fasta_with_sizes.name,
+ '--uchimeout', str(uchime_stats),
+ '--nonchimeras', str(nonchimeras),
+ '--chimeras', str(chimeras),
+ '--dn', str(dn),
+ '--mindiffs', str(mindiffs),
+ '--mindiv', str(mindiv),
+ '--minh', str(minh),
+ '--xn', str(xn),
+ '--qmask', 'none', # ensures no lowercase DNA chars
+ '--xsize',
+ '--fasta_width', '0']
+ run_command(cmd)
return cmd, chimeras, nonchimeras, uchime_stats
-
-
-def _fix_chimera_ids(temp_chimeras, output_chimeras):
- # this processing function should be removed, pending fix of:
- # https://github.com/qiime2/q2-vsearch/issues/39
- temp_chimeras.seek(0)
- with open(str(output_chimeras), 'w') as out_fh:
- for seq in skbio.io.read(temp_chimeras, format='fasta',
- constructor=skbio.DNA):
- seq.metadata['id'] = seq.metadata['id'].rsplit(';', 1)[0]
- seq.write(out_fh)
=====================================
q2_vsearch/_cluster_features.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -69,7 +69,10 @@ def _uc_to_sqlite(uc):
elif fields[0] == b'H':
centroid_id = fields[9].decode('utf-8').split(';')[0]
sequence_id = fields[8].decode('utf-8').split(';size=')
- sequence_id, count = sequence_id[0], sequence_id[1]
+ if len(sequence_id) == 2:
+ sequence_id, count = sequence_id[0], sequence_id[1]
+ else:
+ sequence_id, count = sequence_id[0], '1'
c.execute(insert_stmt, (sequence_id, centroid_id, count))
else:
pass
=====================================
q2_vsearch/_cluster_sequences.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -7,133 +7,37 @@
# ----------------------------------------------------------------------------
import tempfile
-import collections
from q2_types.feature_data import DNAFASTAFormat
from q2_types.per_sample_sequences import QIIME1DemuxDirFmt
import biom
+from biom.parse import parse_uc
import skbio.io
from ._cluster_features import run_command
-def _parse_uc(fh):
- """ This function is copied from the biom-format project temporarily to
- fix a bug in handling of sample ids with underscores in them
- (https://github.com/biocore/biom-format/issues/758). This code
- will be contributed back upstream to the biom-format project, and
- will be removed from this plugin when a biom-format release is
- available that contains this fix.
-
- Create a Table object from a uclust/usearch/vsearch uc file.
- Parameters
- ----------
- fh : file handle
- The ``.uc`` file to be parsed.
- Returns
- -------
- biom.Table : The resulting BIOM table.
- Raises
- ------
- ValueError
- If a sequence identifier is encountered that doesn't have at least
- one underscore in it (see Notes).
- Notes
- -----
- This function assumes sequence identifiers in this file are formated as
- ``<sample-id>_<sequence-id>``. Everything before the last underscore
- will be used as the sample identifier in the resulting ``Table``.
- The information after the last underscore is not used directly, though
- the full identifiers of seeds will be used as the observation
- identifier in the resulting ``Table``.
- """
- data = collections.defaultdict(int)
- sample_idxs = {}
- sample_ids = []
- observation_idxs = {}
- observation_ids = []
- # The types of hit lines we need here are hit (H), seed (S) and
- # library seed (L). Store these in a set for quick reference.
- line_types = set('HSL')
- for line in fh:
- # determine if the current line is one that we need
- line = line.strip()
- if not line:
- continue
- fields = line.split('\t')
-
- line_type = fields[0]
- if line_type not in line_types:
- continue
-
- # grab the fields we care about
- observation_id = fields[9].split()[0]
- query_id = fields[8].split()[0]
-
- if observation_id == '*':
- # S and L lines don't have a separate observation id
- observation_id = query_id
-
- # get the index of the current observation id, or create it if it's
- # the first time we're seeing this id
- if observation_id in observation_idxs:
- observation_idx = observation_idxs[observation_id]
- else:
- observation_idx = len(observation_ids)
- observation_ids.append(observation_id)
- observation_idxs[observation_id] = observation_idx
-
- if line_type == 'H' or line_type == 'S':
- # get the sample id
- try:
- # the following line is modified from biom-format 2.1.6 to
- # find the last underscore rather than the first
- underscore_index = query_id.rindex('_')
- except ValueError:
- raise ValueError(
- "A query sequence was encountered that does not have an "
- "underscore. An underscore is required in all query "
- "sequence identifiers to indicate the sample identifier.")
-
- # get the sample id and its index, creating the index if it is the
- # first time we're seeing this id
- sample_id = query_id[:underscore_index]
- if sample_id in sample_idxs:
- sample_idx = sample_idxs[sample_id]
- else:
- sample_idx = len(sample_ids)
- sample_idxs[sample_id] = sample_idx
- sample_ids.append(sample_id)
- # increment the count of the current observation in the current
- # sample by one.
- data[(observation_idx, sample_idx)] += 1
- else:
- # nothing else needs to be done for 'L' records
- pass
- return biom.Table(data, observation_ids=observation_ids,
- sample_ids=sample_ids)
-
-
def dereplicate_sequences(sequences: QIIME1DemuxDirFmt,
- derep_prefix: bool = False
+ derep_prefix: bool = False,
+ min_seq_length: int = 1,
+ min_unique_size: int = 1
) -> (biom.Table, DNAFASTAFormat):
dereplicated_sequences = DNAFASTAFormat()
with tempfile.NamedTemporaryFile(mode='w+') as out_uc:
seqs_fp = '%s/seqs.fna' % str(sequences)
cmd = ['vsearch',
- '--derep_fulllength', seqs_fp,
+ '--derep_prefix' if derep_prefix else '--derep_fulllength',
+ seqs_fp,
'--output', str(dereplicated_sequences),
'--relabel_sha1', '--relabel_keep',
'--uc', out_uc.name,
- '--qmask', 'none',
'--xsize',
- '--minseqlength', '1',
+ '--minseqlength', str(min_seq_length),
+ '--minuniquesize', str(min_unique_size),
'--fasta_width', '0']
- if derep_prefix:
- cmd[1] = '--derep_prefix'
run_command(cmd)
out_uc.seek(0)
- table = _parse_uc(out_uc)
+ table = parse_uc(out_uc)
id_map = {e.metadata['description']: e.metadata['id']
for e in skbio.io.read(str(dereplicated_sequences),
constructor=skbio.DNA,
=====================================
q2_vsearch/_format.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/_join_pairs.py → q2_vsearch/_merge_pairs.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -19,7 +19,7 @@ from q2_types.per_sample_sequences import (
from ._cluster_features import run_command
-_jp_defaults = {
+_mp_defaults = {
'truncqual': None,
'minlen': 1,
'maxns': None,
@@ -29,53 +29,40 @@ _jp_defaults = {
'minmergelen': None,
'maxmergelen': None,
'maxee': None,
- 'qmin': 0,
- 'qminout': 0,
- 'qmax': 41,
- 'qmaxout': 41,
'threads': 1
}
-def join_pairs(demultiplexed_seqs: SingleLanePerSamplePairedEndFastqDirFmt,
- truncqual: int = _jp_defaults['truncqual'],
- minlen: int = _jp_defaults['minlen'],
- maxns: int = _jp_defaults['maxns'],
- allowmergestagger: bool = _jp_defaults['allowmergestagger'],
- minovlen: int = _jp_defaults['minovlen'],
- maxdiffs: int = _jp_defaults['maxdiffs'],
- minmergelen: int = _jp_defaults['minmergelen'],
- maxmergelen: int = _jp_defaults['maxmergelen'],
- maxee: float = _jp_defaults['maxee'],
- qmin: int = _jp_defaults['qmin'],
- qminout: int = _jp_defaults['qminout'],
- qmax: int = _jp_defaults['qmax'],
- qmaxout: int = _jp_defaults['qmaxout'],
- threads: int = _jp_defaults['threads'],
- ) -> SingleLanePerSampleSingleEndFastqDirFmt:
- _, result = _join_pairs_w_command_output(
+def merge_pairs(demultiplexed_seqs: SingleLanePerSamplePairedEndFastqDirFmt,
+ truncqual: int = _mp_defaults['truncqual'],
+ minlen: int = _mp_defaults['minlen'],
+ maxns: int = _mp_defaults['maxns'],
+ allowmergestagger: bool = _mp_defaults['allowmergestagger'],
+ minovlen: int = _mp_defaults['minovlen'],
+ maxdiffs: int = _mp_defaults['maxdiffs'],
+ minmergelen: int = _mp_defaults['minmergelen'],
+ maxmergelen: int = _mp_defaults['maxmergelen'],
+ maxee: float = _mp_defaults['maxee'],
+ threads: int = _mp_defaults['threads'],
+ ) -> SingleLanePerSampleSingleEndFastqDirFmt:
+ _, result = _merge_pairs_w_command_output(
demultiplexed_seqs, truncqual, minlen, maxns, allowmergestagger,
- minovlen, maxdiffs, minmergelen, maxmergelen, maxee, qmin, qminout,
- qmax, qmaxout, threads)
+ minovlen, maxdiffs, minmergelen, maxmergelen, maxee, threads)
return result
-def _join_pairs_w_command_output(
+def _merge_pairs_w_command_output(
demultiplexed_seqs: SingleLanePerSamplePairedEndFastqDirFmt,
- truncqual: int = _jp_defaults['truncqual'],
- minlen: int = _jp_defaults['minlen'],
- maxns: int = _jp_defaults['maxns'],
- allowmergestagger: bool = _jp_defaults['allowmergestagger'],
- minovlen: int = _jp_defaults['minovlen'],
- maxdiffs: int = _jp_defaults['maxdiffs'],
- minmergelen: int = _jp_defaults['minmergelen'],
- maxmergelen: int = _jp_defaults['maxmergelen'],
- maxee: float = _jp_defaults['maxee'],
- qmin: int = _jp_defaults['qmin'],
- qminout: int = _jp_defaults['qminout'],
- qmax: int = _jp_defaults['qmax'],
- qmaxout: int = _jp_defaults['qmaxout'],
- threads: int = _jp_defaults['threads'],
+ truncqual: int = _mp_defaults['truncqual'],
+ minlen: int = _mp_defaults['minlen'],
+ maxns: int = _mp_defaults['maxns'],
+ allowmergestagger: bool = _mp_defaults['allowmergestagger'],
+ minovlen: int = _mp_defaults['minovlen'],
+ maxdiffs: int = _mp_defaults['maxdiffs'],
+ minmergelen: int = _mp_defaults['minmergelen'],
+ maxmergelen: int = _mp_defaults['maxmergelen'],
+ maxee: float = _mp_defaults['maxee'],
+ threads: int = _mp_defaults['threads'],
) -> (List[str], SingleLanePerSampleSingleEndFastqDirFmt):
# this function exists only to simplify unit testing
@@ -90,7 +77,8 @@ def _join_pairs_w_command_output(
phred_offset = yaml.load(open(
os.path.join(str(demultiplexed_seqs),
- demultiplexed_seqs.metadata.pathspec)))['phred-offset']
+ demultiplexed_seqs.metadata.pathspec)),
+ Loader=yaml.SafeLoader)['phred-offset']
id_to_fps = manifest.pivot(index='sample-id', columns='direction',
values='filename')
@@ -124,11 +112,10 @@ def _join_pairs_w_command_output(
'--fastq_minlen', str(minlen),
'--fastq_minovlen', str(minovlen),
'--fastq_maxdiffs', str(maxdiffs),
- '--fastq_qmin', str(qmin),
- '--fastq_qminout', str(qminout),
- '--fastq_qmax', str(qmax),
- '--fastq_qmaxout', str(qmaxout),
- '--minseqlength', '1',
+ '--fastq_qmin', '0',
+ '--fastq_qminout', '0',
+ '--fastq_qmax', '41',
+ '--fastq_qmaxout', '41',
'--fasta_width', '0']
if truncqual is not None:
cmd += ['--fastq_truncqual', str(truncqual)]
=====================================
q2_vsearch/_stats.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/_transformer.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -20,23 +20,23 @@ from ._format import UchimeStatsFmt
# score strings
_uchime_stats_header = collections.OrderedDict([
('score', np.number),
- ('feature-id', np.str),
- ('A', np.str),
- ('B', np.str),
- ('T', np.str),
- ('idQM', np.str),
- ('idQA', np.str),
- ('idQB', np.str),
- ('idAB', np.str),
- ('idQT', np.str),
- ('LY', np.str),
- ('LN', np.str),
- ('LA', np.str),
- ('RY', np.str),
- ('RN', np.str),
- ('RA', np.str),
- ('div', np.str),
- ('YN', np.str)])
+ ('feature-id', str),
+ ('A', str),
+ ('B', str),
+ ('T', str),
+ ('idQM', str),
+ ('idQA', str),
+ ('idQB', str),
+ ('idAB', str),
+ ('idQT', str),
+ ('LY', str),
+ ('LN', str),
+ ('LA', str),
+ ('RY', str),
+ ('RN', str),
+ ('RA', str),
+ ('div', str),
+ ('YN', str)])
def _stats_to_df(ff):
=====================================
q2_vsearch/_type.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/_version.py
=====================================
@@ -23,9 +23,9 @@ def get_keywords():
# setup.py/versioneer.py will grep for the variable names, so they must
# each be defined on a line of their own. _version.py will just call
# get_keywords().
- git_refnames = " (HEAD -> master, tag: 2020.8.0.dev0)"
- git_full = "ddc5b08cdd202d3b45fc6d9453a3cc5b22e40cfa"
- git_date = "2020-06-30 15:44:15 +0000"
+ git_refnames = " (tag: 2023.9.0, Release-2023.9)"
+ git_full = "ea2b184d76ec1fb30950c7fb76ae10d690b53180"
+ git_date = "2023-10-03 22:06:23 +0000"
keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
return keywords
=====================================
q2_vsearch/plugin_setup.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -11,7 +11,7 @@ import importlib
import qiime2.plugin
import q2_vsearch._cluster_features
import q2_vsearch._cluster_sequences
-import q2_vsearch._join_pairs
+import q2_vsearch._merge_pairs
import q2_vsearch._chimera
import q2_vsearch._stats
@@ -235,6 +235,8 @@ plugin.methods.register_function(
},
parameters={
'derep_prefix': qiime2.plugin.Bool,
+ 'min_seq_length': qiime2.plugin.Int % qiime2.plugin.Range(1, None),
+ 'min_unique_size': qiime2.plugin.Int % qiime2.plugin.Range(1, None),
},
outputs=[
('dereplicated_table', FeatureTable[Frequency]),
@@ -249,6 +251,9 @@ plugin.methods.register_function(
'longer sequences, it is clustered with the shortest '
'of them. If they are equally long, it is clustered '
'with the most abundant.'),
+ 'min_seq_length': ('Discard sequences shorter than this integer.'),
+ 'min_unique_size': ('Discard sequences with a post-dereplication '
+ 'abundance value smaller than integer.'),
},
output_descriptions={
'dereplicated_table': 'The table of dereplicated sequences.',
@@ -265,7 +270,7 @@ plugin.methods.register_function(
)
plugin.methods.register_function(
- function=q2_vsearch._join_pairs.join_pairs,
+ function=q2_vsearch._merge_pairs.merge_pairs,
inputs={
'demultiplexed_seqs': SampleData[PairedEndSequencesWithQuality]
},
@@ -279,23 +284,15 @@ plugin.methods.register_function(
'minmergelen': qiime2.plugin.Int % qiime2.plugin.Range(0, None),
'maxmergelen': qiime2.plugin.Int % qiime2.plugin.Range(0, None),
'maxee': qiime2.plugin.Float % qiime2.plugin.Range(0., None),
- 'qmin': qiime2.plugin.Int % qiime2.plugin.Range(
- -5, 2, inclusive_start=True, inclusive_end=True),
- 'qminout': qiime2.plugin.Int % qiime2.plugin.Range(
- -5, 2, inclusive_start=True, inclusive_end=True),
- 'qmax': qiime2.plugin.Int % qiime2.plugin.Range(
- 40, 41, inclusive_start=True, inclusive_end=True),
- 'qmaxout': qiime2.plugin.Int % qiime2.plugin.Range(
- 40, 41, inclusive_start=True, inclusive_end=True),
'threads': qiime2.plugin.Int % qiime2.plugin.Range(
0, 8, inclusive_start=True, inclusive_end=True)
},
outputs=[
- ('joined_sequences', SampleData[JoinedSequencesWithQuality])
+ ('merged_sequences', SampleData[JoinedSequencesWithQuality])
],
input_descriptions={
'demultiplexed_seqs': ('The demultiplexed paired-end sequences to '
- 'be joined.'),
+ 'be merged.'),
},
parameter_descriptions={
'truncqual': ('Truncate sequences at the first base with the '
@@ -304,33 +301,26 @@ plugin.methods.register_function(
'discarded.'),
'maxns': ('Sequences with more than maxns N characters are '
'discarded.'),
- 'allowmergestagger': ('Allow joining of staggered read pairs.'),
- 'minovlen': ('Minimum overlap length of forward and reverse reads '
- 'for joining.'),
- 'maxdiffs': ('Maximum number of mismatches in the forward/reverse '
- 'read overlap for joining.'),
- 'minmergelen': ('Minimum length of the joined read to be retained.'),
- 'maxmergelen': ('Maximum length of the joined read to be retained.'),
- 'maxee': ('Maximum number of expected errors in the joined read '
+ 'allowmergestagger': ('Allow merging of staggered read pairs.'),
+ 'minovlen': ('Minimum length of the area of overlap between reads '
+ 'during merging.'),
+ 'maxdiffs': ('Maximum number of mismatches in the area of overlap '
+ 'during merging.'),
+ 'minmergelen': ('Minimum length of the merged read to be retained.'),
+ 'maxmergelen': ('Maximum length of the merged read to be retained.'),
+ 'maxee': ('Maximum number of expected errors in the merged read '
'to be retained.'),
- 'qmin': ('The minimum allowed quality score in the input.'),
- 'qminout': ('The minimum allowed quality score to use in output.'),
- 'qmax': ('The maximum allowed quality score in the input.'),
- 'qmaxout': ('The maximum allowed quality score to use in output.'),
'threads': ('The number of threads to use for computation. Does '
'not scale much past 4 threads.')
},
output_descriptions={
- 'joined_sequences': ('The joined sequences.'),
- },
- name='Join paired-end reads.',
- description=('Join paired-end sequence reads using vsearch\'s '
- 'merge_pairs function. The qmin, qminout, qmax, and qmaxout '
- 'parameters should only need to be modified when working '
- 'with older fastq sequence data. See the vsearch '
- 'documentation for details on how paired-end joining is '
- 'performed, and for more information on the parameters to '
- 'this method.')
+ 'merged_sequences': ('The merged sequences.'),
+ },
+ name='Merge paired-end reads.',
+ description=('Merge paired-end sequence reads using vsearch\'s '
+ 'merge_pairs function. See the vsearch documentation for '
+ 'details on how paired-end merging is performed, and for '
+ 'more information on the parameters to this method.')
)
plugin.methods.register_function(
@@ -429,7 +419,7 @@ plugin.methods.register_function(
description=('Apply the vsearch uchime_denovo method to identify chimeric '
'feature sequences. The results of this method can be used '
'to filter chimeric features from the corresponding feature '
- 'table. For additional details, please refer to the vsearch '
+ 'table. For more details, please refer to the vsearch '
'documentation.')
)
=====================================
q2_vsearch/tests/__init__.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/tests/test_chimera.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/tests/test_cluster_features.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/tests/test_cluster_sequences.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -15,8 +15,7 @@ from qiime2.plugin.testing import TestPluginBase
from qiime2.util import redirected_stdio
from q2_types.per_sample_sequences import QIIME1DemuxDirFmt
-from q2_vsearch._cluster_sequences import (dereplicate_sequences,
- _parse_uc)
+from q2_vsearch._cluster_sequences import dereplicate_sequences
class DereplicateSequences(TestPluginBase):
@@ -61,6 +60,41 @@ class DereplicateSequences(TestPluginBase):
'description': 's2_2'})]
self.assertEqual(obs_seqs, exp_seqs)
+ def test_dereplicate_sequences_min_length(self):
+ input_sequences_fp = self.get_data_path('seqs-1')
+ input_sequences = QIIME1DemuxDirFmt(input_sequences_fp, 'r')
+
+ exp_table = biom.Table(np.array([[2, 1],
+ [0, 2]]),
+ ['4574b947a0159c0da35a1f30f989681a1d9f64ef',
+ '16a1263bde4f2f99422630d1bb87935c4236d1ba'],
+ ['sample1', 's2'])
+
+ with redirected_stdio(stderr=os.devnull):
+ obs_table, obs_sequences = dereplicate_sequences(
+ sequences=input_sequences,
+ min_seq_length=36)
+ # order of identifiers is important for biom.Table equality
+ obs_table = \
+ obs_table.sort_order(exp_table.ids(axis='observation'),
+ axis='observation')
+ self.assertEqual(obs_table, exp_table)
+
+ # sequences are reverse-sorted by abundance in output
+ # Short sequence s2_2 is missing from output
+ obs_seqs = list(skbio.io.read(str(obs_sequences),
+ constructor=skbio.DNA, format='fasta'))
+ exp_seqs = [
+ skbio.DNA(
+ 'AAACGTTACGGTTAACTATACATGCAGAAGACTAATCGG',
+ metadata={'id': ('4574b947a0159c0da35a1f30f989681a1d9f64ef'),
+ 'description': 'sample1_1'}),
+ skbio.DNA(
+ 'ACGTACGTACGTACGTACGTACGTACGTACGTGCATGGTGCGACCG',
+ metadata={'id': ('16a1263bde4f2f99422630d1bb87935c4236d1ba'),
+ 'description': 's2_42'})]
+ self.assertEqual(obs_seqs, exp_seqs)
+
def test_dereplicate_sequences_underscores_in_ids(self):
input_sequences_fp = self.get_data_path('seqs-2')
input_sequences = QIIME1DemuxDirFmt(input_sequences_fp, 'r')
@@ -132,89 +166,6 @@ class DereplicateSequences(TestPluginBase):
self.assertEqual(obs_seqs, exp_seqs)
-class ParseUc(TestPluginBase):
- # These tests and the test data below them is copied from the biom-format
- # project temporarily to fix a bug in handling of sample ids with
- # underscores in them (https://github.com/biocore/biom-format/issues/758).
- # This code will be contribued back upstream to the
- # biom-format project, and will be removed from this plugin when a
- # biom-format release is available that contains this fix.
-
- package = 'q2_vsearch.tests'
-
- def test_empty(self):
- """ empty uc file returns empty Table
- """
- actual = _parse_uc(uc_empty.split('\n'))
- expected = biom.Table(np.array([[]]),
- observation_ids=[],
- sample_ids=[])
- self.assertEqual(actual, expected)
-
- def test_minimal(self):
- """ single new seed observed
- """
- actual = _parse_uc(uc_minimal.split('\n'))
- expected = biom.Table(np.array([[1.0]]),
- observation_ids=['f2_1539'],
- sample_ids=['f2'])
- self.assertEqual(actual, expected)
-
- def test_lib_minimal(self):
- """ single library seed observed
- """
- actual = _parse_uc(uc_lib_minimal.split('\n'))
- expected = biom.Table(np.array([[1.0]]),
- observation_ids=['295053'],
- sample_ids=['f2'])
- self.assertEqual(actual, expected)
-
- def test_invalid(self):
- """ invalid query sequence identifier detected
- """
- self.assertRaises(ValueError, _parse_uc, uc_invalid_id.split('\n'))
-
- def test_seed_hits(self):
- """ multiple new seeds observed
- """
- actual = _parse_uc(uc_seed_hits.split('\n'))
- expected = biom.Table(np.array([[2.0, 1.0], [0.0, 1.0]]),
- observation_ids=['f2_1539', 'f3_44'],
- sample_ids=['f2', 'f3'])
- self.assertEqual(actual, expected)
-
- def test_mixed_hits(self):
- """ new and library seeds observed
- """
- actual = _parse_uc(uc_mixed_hits.split('\n'))
- expected = biom.Table(np.array([[2.0, 1.0], [0.0, 1.0], [1.0, 0.0]]),
- observation_ids=['f2_1539', 'f3_44', '295053'],
- sample_ids=['f2', 'f3'])
- self.assertEqual(actual, expected)
-
- # the following tests are new with respect to biom-format project 2.1.6
-
- def test_underscore_in_sample_id(self):
- """ single new seed observed for sample with underscores in id
- """
- actual = _parse_uc(uc_minimal_w_underscores.split('\n'))
- expected = biom.Table(np.array([[1.0]]),
- observation_ids=['sample_id_w_underscores_42'],
- sample_ids=['sample_id_w_underscores'])
- print(actual)
- print(expected)
- self.assertEqual(actual, expected)
-
- def test_uc_w_comments_and_blank_lines(self):
- """ uc contains comments and blank lines
- """
- actual = _parse_uc(uc_w_comments_and_blank_lines.split('\n'))
- expected = biom.Table(np.array([[1.0]]),
- observation_ids=['f2_1539'],
- sample_ids=['f2'])
- self.assertEqual(actual, expected)
-
-
# no hits or library seeds
uc_empty = """
"""
=====================================
q2_vsearch/tests/test_join_pairs.py → q2_vsearch/tests/test_merge_pairs.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
@@ -17,7 +17,7 @@ from q2_types.per_sample_sequences import (
SingleLanePerSamplePairedEndFastqDirFmt,
FastqGzFormat)
-from q2_vsearch._join_pairs import join_pairs, _join_pairs_w_command_output
+from q2_vsearch._merge_pairs import merge_pairs, _merge_pairs_w_command_output
class MergePairsTests(TestPluginBase):
@@ -53,10 +53,10 @@ class MergePairsTests(TestPluginBase):
# input reads are 151 bases, so all output must be longer
self.assertTrue(e > 151)
- def test_join_pairs(self):
+ def test_merge_pairs(self):
with redirected_stdio(stderr=os.devnull):
- obs = join_pairs(self.input_seqs)
+ obs = merge_pairs(self.input_seqs)
# manifest is as expected
self._test_manifest(obs)
@@ -82,16 +82,16 @@ class MergePairsTests(TestPluginBase):
seq_lengths = np.asarray([len(s) for s in seqs])
self._test_seq_lengths(seq_lengths)
- # expected number of sequences are joined
+ # expected number of sequences are merged
self.assertEqual(
len(seq_lengths),
default_exp_sequence_counts[str(fastq_name)])
- def test_join_pairs_some_samples_w_no_joined_seqs(self):
+ def test_merge_pairs_some_samples_w_no_joined_seqs(self):
# minmergelen is set very high here, resulting in only one sequence
- # being joined across the three samples.
+ # being merged across the three samples.
with redirected_stdio(stderr=os.devnull):
- obs = join_pairs(self.input_seqs, minmergelen=279)
+ obs = merge_pairs(self.input_seqs, minmergelen=279)
# manifest is as expected
self._test_manifest(obs)
@@ -114,16 +114,16 @@ class MergePairsTests(TestPluginBase):
seqs = list(seqs)
seq_lengths = np.asarray([len(s) for s in seqs])
- # expected number of sequences are joined
+ # expected number of sequences are merged
self.assertEqual(
len(seq_lengths),
exp_sequence_counts[str(fastq_name)])
- def test_join_pairs_all_samples_w_no_joined_seqs(self):
+ def test_merge_pairs_all_samples_w_no_joined_seqs(self):
# minmergelen is set very high here, resulting in no sequences
- # being joined across the three samples.
+ # being merged across the three samples.
with redirected_stdio(stderr=os.devnull):
- obs = join_pairs(self.input_seqs, minmergelen=500)
+ obs = merge_pairs(self.input_seqs, minmergelen=500)
# manifest is as expected
self._test_manifest(obs)
@@ -141,9 +141,9 @@ class MergePairsTests(TestPluginBase):
self.assertEqual(len(seq_lengths), 0)
- def test_join_pairs_alt_truncqual(self):
+ def test_merge_pairs_alt_truncqual(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, truncqual=5)
# sanity check the output
@@ -154,9 +154,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_truncqual 5' in ' '.join(cmd))
- def test_join_pairs_alt_minlen(self):
+ def test_merge_pairs_alt_minlen(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, minlen=25)
# sanity check the output
@@ -167,9 +167,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_minlen 25' in ' '.join(cmd))
- def test_join_pairs_alt_maxns(self):
+ def test_merge_pairs_alt_maxns(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, maxns=2)
# sanity check the output
@@ -180,9 +180,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_maxns 2' in ' '.join(cmd))
- def test_join_pairs_alt_allowmergestagger(self):
+ def test_merge_pairs_alt_allowmergestagger(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, allowmergestagger=True)
# sanity check the output
@@ -193,9 +193,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_allowmergestagger' in cmd)
- def test_join_pairs_alt_minovlen(self):
+ def test_merge_pairs_alt_minovlen(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, minovlen=42)
# sanity check the output
@@ -206,9 +206,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_minovlen 42' in ' '.join(cmd))
- def test_join_pairs_alt_maxdiffs(self):
+ def test_merge_pairs_alt_maxdiffs(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, maxdiffs=2)
# sanity check the output
@@ -219,9 +219,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_maxdiffs 2' in ' '.join(cmd))
- def test_join_pairs_alt_minmergelen(self):
+ def test_merge_pairs_alt_minmergelen(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, minmergelen=250)
# sanity check the output
@@ -232,9 +232,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_minmergelen 250' in ' '.join(cmd))
- def test_join_pairs_alt_maxmergelen(self):
+ def test_merge_pairs_alt_maxmergelen(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, maxmergelen=250)
# sanity check the output
@@ -245,9 +245,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_maxmergelen 250' in ' '.join(cmd))
- def test_join_pairs_alt_maxee(self):
+ def test_merge_pairs_alt_maxee(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, maxee=25.0)
# sanity check the output
@@ -258,61 +258,9 @@ class MergePairsTests(TestPluginBase):
# confirm altered parameter was passed to vsearch
self.assertTrue('--fastq_maxee 25.0' in ' '.join(cmd))
- def test_join_pairs_alt_qmin(self):
+ def test_merge_pairs_alt_threads(self):
with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
- self.input_seqs, qmin=-1)
-
- # sanity check the output
- self._test_manifest(obs)
- output_fastqs = list(obs.sequences.iter_views(FastqGzFormat))
- self.assertEqual(len(output_fastqs), 3)
-
- # confirm altered parameter was passed to vsearch
- self.assertTrue('--fastq_qmin -1' in ' '.join(cmd))
-
- def test_join_pairs_alt_qminout(self):
- with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
- self.input_seqs, qminout=-1)
-
- # sanity check the output
- self._test_manifest(obs)
- output_fastqs = list(obs.sequences.iter_views(FastqGzFormat))
- self.assertEqual(len(output_fastqs), 3)
-
- # confirm altered parameter was passed to vsearch
- self.assertTrue('--fastq_qminout -1' in ' '.join(cmd))
-
- def test_join_pairs_alt_qmax(self):
- with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
- self.input_seqs, qmax=40)
-
- # sanity check the output
- self._test_manifest(obs)
- output_fastqs = list(obs.sequences.iter_views(FastqGzFormat))
- self.assertEqual(len(output_fastqs), 3)
-
- # confirm altered parameter was passed to vsearch
- self.assertTrue('--fastq_qmax 40' in ' '.join(cmd))
-
- def test_join_pairs_alt_qmaxout(self):
- with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
- self.input_seqs, qmaxout=40)
-
- # sanity check the output
- self._test_manifest(obs)
- output_fastqs = list(obs.sequences.iter_views(FastqGzFormat))
- self.assertEqual(len(output_fastqs), 3)
-
- # confirm altered parameter was passed to vsearch
- self.assertTrue('--fastq_qmaxout 40' in ' '.join(cmd))
-
- def test_join_pairs_alt_threads(self):
- with redirected_stdio(stderr=os.devnull):
- cmd, obs = _join_pairs_w_command_output(
+ cmd, obs = _merge_pairs_w_command_output(
self.input_seqs, threads=2)
# sanity check the output
=====================================
q2_vsearch/tests/test_plugin_setup.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
q2_vsearch/tests/test_stats.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
=====================================
setup.py
=====================================
@@ -1,5 +1,5 @@
# ----------------------------------------------------------------------------
-# Copyright (c) 2016-2020, QIIME 2 development team.
+# Copyright (c) 2016-2023, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
View it on GitLab: https://salsa.debian.org/med-team/q2-vsearch/-/commit/13e16b60f9732b0671ff169343a82fc24c5c5224
--
View it on GitLab: https://salsa.debian.org/med-team/q2-vsearch/-/commit/13e16b60f9732b0671ff169343a82fc24c5c5224
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/20240131/1b139af0/attachment-0001.htm>
More information about the debian-med-commit
mailing list