[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