Skip to content
Commits on Source (11)
pynast (1.2.2-5) UNRELEASED; urgency=medium
* Use 2to3 to port from Python2 to Python3
Closes: #937488
* debhelper-compat 12
* Standards-Version: 4.4.1
* Remove trailing whitespace in debian/changelog
* Remove trailing whitespace in debian/control
* autopkgtest: s/ADTTMP/AUTOPKGTEST_TMP/g
* Trim trailing whitespace.
* Set upstream metadata fields: Bug-Database, Repository, Repository-
Browse.
* Remove obsolete field Name from debian/upstream/metadata (already
present in machine-readable debian/copyright).
TODO: python3-cogent
-- Andreas Tille <tille@debian.org> Thu, 19 Dec 2019 17:57:15 +0100
pynast (1.2.2-4) unstable; urgency=medium
* Point Vcs-URLs to Salsa
......@@ -116,14 +134,14 @@ python-pynast (1.1-3) unstable; urgency=low
python-pynast (1.1-2ubuntu4) lucid; urgency=low
* Fix Lintian warning on docs, clean up build file
* Allow building with either python2 or python-central
* Allow building with either python2 or python-central
* Renamed main package to pynast
-- Tim Booth <tbooth@ceh.ac.uk> Fri, 26 Aug 2011 11:29:17 +0100
python-pynast (1.1-2ubuntu3) lucid; urgency=low
* Rebuild for Lucid, lowered dependencies
* Rebuild for Lucid, lowered dependencies
-- Tim Booth <tbooth@ceh.ac.uk> Fri, 26 Aug 2011 10:05:42 +0100
......@@ -141,4 +159,3 @@ python-pynast (1.1-1) experimental; urgency=low
* Initial release (Closes: #587189)
-- Sri Girish Srinivasa Murthy <srigirish@evolbio.mpg.de> Sun, 25 Jul 2010 22:21:11 +0200
......@@ -5,15 +5,15 @@ Uploaders: Steffen Moeller <moeller@debian.org>,
Tim Booth <tbooth@ceh.ac.uk>
Section: python
Priority: optional
Build-Depends: debhelper (>= 11~),
python,
python-cogent (>= 1.5.3),
Build-Depends: debhelper-compat (= 12),
python3,
python-cogent,
python3-sphinx,
blast2,
clustalw,
mafft,
muscle
Standards-Version: 4.2.1
Standards-Version: 4.4.1
Vcs-Browser: https://salsa.debian.org/med-team/pynast
Vcs-Git: https://salsa.debian.org/med-team/pynast.git
Homepage: https://github.com/biocore/pynast
......@@ -21,20 +21,20 @@ Homepage: https://github.com/biocore/pynast
Package: pynast
Architecture: all
Depends: ${misc:Depends},
${python:Depends},
${python3:Depends},
libjs-jquery,
libjs-underscore
Recommends: blast2,
clustalw,
mafft,
muscle,
python-mpi4py
python3-mpi4py
Suggests: uclust
Conflicts: python-pynast
Provides: python-pynast
Replaces: python-pynast
Description: alignment of short DNA sequences
The package provices a reimplementation of the Nearest Alignment
The package provices a reimplementation of the Nearest Alignment
Space Termination tool in Python. It was prepared for next generation
sequencers.
.
......
Description: Use 2to3 to port from Python2 to Python3
Bug-Debian: https://bugs.debian.org/937488
Author: Andreas Tille <tille@debian.org>
Last-Update: Thu, 19 Dec 2019 17:57:15 +0100
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -37,8 +37,8 @@ source_suffix = '.rst'
master_doc = 'index'
# General information about the project.
-project = u'PyNAST'
-copyright = u'2010, Greg Caporaso'
+project = 'PyNAST'
+copyright = '2010, Greg Caporaso'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -172,8 +172,8 @@ htmlhelp_basename = 'PyNASTdoc'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
- ('index', 'PyNAST.tex', u'PyNAST Documentation',
- u'Greg Caporaso', 'manual'),
+ ('index', 'PyNAST.tex', 'PyNAST Documentation',
+ 'Greg Caporaso', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
--- a/pynast/__init__.py
+++ b/pynast/__init__.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
--- a/pynast/logger.py
+++ b/pynast/logger.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
--- a/pynast/pycogent_backports/__init__.py
+++ b/pynast/pycogent_backports/__init__.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
--- a/pynast/pycogent_backports/uclust.py
+++ b/pynast/pycogent_backports/uclust.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
"""Application controller for uclust version 1.1.579
Includes application controllers for uclust and
@@ -127,9 +127,8 @@ class Uclust(CommandLineApplication):
unsupported_parameters = set(data.keys()) - set(allowed_values)
if unsupported_parameters:
- raise ApplicationError,\
- "Unsupported parameter(s) passed when calling uclust: %s" %\
- ' '.join(unsupported_parameters)
+ raise ApplicationError("Unsupported parameter(s) passed when calling uclust: %s" %\
+ ' '.join(unsupported_parameters))
for v in allowed_values:
# turn the parameter off so subsequent runs are not
@@ -216,30 +215,28 @@ def process_uclust_pw_alignment_results(
strand_id = ''
target_rev_match = False
else:
- raise UclustParseError, "Unknown strand type: %s" % matching_strand
+ raise UclustParseError("Unknown strand type: %s" % matching_strand)
uc_query_id = hit[8]
uc_target_id = hit[9]
percent_id = float(hit[3])
- fasta_pair = alignments.next()
+ fasta_pair = next(alignments)
fasta_query_id = fasta_pair[0][0]
aligned_query = fasta_pair[0][1]
if fasta_query_id != uc_query_id:
- raise UclustParseError,\
- "Order of fasta and uc files do not match."+\
+ raise UclustParseError("Order of fasta and uc files do not match."+\
" Got query %s but expected %s." %\
- (fasta_query_id, uc_query_id)
+ (fasta_query_id, uc_query_id))
fasta_target_id = fasta_pair[1][0]
aligned_target = fasta_pair[1][1]
if fasta_target_id != uc_target_id + strand_id:
- raise UclustParseError, \
- "Order of fasta and uc files do not match."+\
+ raise UclustParseError("Order of fasta and uc files do not match."+\
" Got target %s but expected %s." %\
- (fasta_target_id, uc_target_id + strand_id)
+ (fasta_target_id, uc_target_id + strand_id))
if target_rev_match:
query_id = uc_query_id + ' RC'
@@ -289,8 +286,7 @@ def clusters_from_uc_file(uc_lines,
target_cluster = record[9].split()[0]
if hit_type == 'H':
if error_on_multiple_hits and query_id in all_hits:
- raise UclustParseError, \
- ("Query id " + query_id + " hit multiple seeds. "
+ raise UclustParseError("Query id " + query_id + " hit multiple seeds. "
"This can happen if --allhits is "
"enabled in the call to uclust, which isn't supported by default. "
"Call clusters_from_uc_file(lines, error_on_multiple_hits=False) to "
@@ -304,8 +300,7 @@ def clusters_from_uc_file(uc_lines,
# a new seed was identified -- create a cluster with this
# sequence as the first instance
if query_id in clusters:
- raise UclustParseError,\
- ("A seq id was provided as a seed, but that seq id already "
+ raise UclustParseError("A seq id was provided as a seed, but that seq id already "
"represents a cluster. Are there overlapping seq ids in your "
"reference and input files or repeated seq ids in either? "
"Offending seq id is %s" % query_id)
@@ -318,8 +313,7 @@ def clusters_from_uc_file(uc_lines,
# lines separately from the H lines to detect overlapping seq ids
# between the reference and the input fasta files
if query_id in clusters:
- raise UclustParseError,\
- ("A seq id was provided as a seed, but that seq id already "
+ raise UclustParseError("A seq id was provided as a seed, but that seq id already "
"represents a cluster. Are there overlapping seq ids in your "
"reference and input files or repeated seq ids in either? "
"Offending seq id is %s" % query_id)
@@ -330,8 +324,7 @@ def clusters_from_uc_file(uc_lines,
else:
# shouldn't be possible to get here, but provided for
# clarity
- raise UclustParseError,\
- "Unexpected result parsing line:\n%s" % '\t'.join(record)
+ raise UclustParseError("Unexpected result parsing line:\n%s" % '\t'.join(record))
# will need to return the full clusters dict, I think, to support
# useful identifiers in reference database clustering
@@ -567,7 +560,7 @@ def get_clusters_from_fasta_filepath(
remove_files(files_to_remove)
except ApplicationError:
remove_files(files_to_remove)
- raise ApplicationError, ('Error running uclust. Possible causes are '
+ raise ApplicationError('Error running uclust. Possible causes are '
'unsupported version (current supported version is v1.2.22) is installed or '
'improperly formatted input file was provided')
except ApplicationNotFoundError:
@@ -586,6 +579,6 @@ def get_clusters_from_fasta_filepath(
if return_cluster_maps:
return clusters, failures, seeds
else:
- return clusters.values(), failures, seeds
+ return list(clusters.values()), failures, seeds
## End uclust convenience functions
--- a/pynast/util.py
+++ b/pynast/util.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
@@ -8,7 +8,7 @@
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
-from __future__ import division
+
from os import system, remove, popen
from os.path import exists
from tempfile import gettempdir, NamedTemporaryFile
@@ -80,10 +80,9 @@ def pair_hmm_align_unaligned_seqs(seqs,m
seqs = LoadSeqs(data=seqs,moltype=moltype,aligned=False)
try:
- s1, s2 = seqs.values()
+ s1, s2 = list(seqs.values())
except ValueError:
- raise ValueError,\
- "Pairwise aligning of seqs requires exactly two seqs."
+ raise ValueError("Pairwise aligning of seqs requires exactly two seqs.")
try:
gap_open = params['gap_open']
@@ -110,13 +109,12 @@ def blast_align_unaligned_seqs(seqs,
This needs to be moved to the blast application controller.
"""
- seqs = dict(LoadSeqs(data=seqs,moltype=moltype,aligned=False).items())
- seq_ids = seqs.keys()
+ seqs = dict(list(LoadSeqs(data=seqs,moltype=moltype,aligned=False).items()))
+ seq_ids = list(seqs.keys())
query_id = seq_ids[0]
subject_id = seq_ids[1]
if len(seq_ids) != 2:
- raise ValueError,\
- "Pairwise aligning of seqs with blast requires exactly two seqs."
+ raise ValueError("Pairwise aligning of seqs with blast requires exactly two seqs.")
# Create temporary input and output files. Note that
# delete = False here because we don't want these to
@@ -150,7 +148,7 @@ def blast_align_unaligned_seqs(seqs,
bl2seq_res = system('bl2seq -i %s -j %s -o %s -F F -S 1 -q -1 -E 2 -W 11 -p blastn' %\
(in_filepath1,in_filepath2,out_filepath))
if bl2seq_res != 0:
- raise RuntimeError, "bl2seq failed:\n %s" % bl2seq_res
+ raise RuntimeError("bl2seq failed:\n %s" % bl2seq_res)
query_seq = []
subject_seq = []
@@ -322,7 +320,7 @@ def reintroduce_template_spacing(templat
# add the positions of the new gaps chars to the list
# of new gaps
new_gaps_in_pw_alignment += \
- range(first_new_gap_pos,first_new_gap_pos + (-1*addl_gaps))
+ list(range(first_new_gap_pos,first_new_gap_pos + (-1*addl_gaps)))
else:
# gap pattern is the same following the current sequence
# position
@@ -337,7 +335,7 @@ def nearest_gap(seq,pos):
"""
# Catch negative sequence positions
if pos < 0:
- raise IndexError, "Sequence positions cannot be negative: %d" % pos
+ raise IndexError("Sequence positions cannot be negative: %d" % pos)
# If pos contains a gap, that's the closest gap
if seq[pos] == '-':
@@ -364,11 +362,10 @@ def nearest_gap(seq,pos):
# error if there are no gaps in the sequence
if not choices:
- raise UnalignableSequenceError,\
- "Can't adjust alignment because there are too few gaps to "+\
+ raise UnalignableSequenceError("Can't adjust alignment because there are too few gaps to "+\
"remove in the aligned candidate to reduce to the length of "+\
"the template alignment (i.e., candidate adds too many insertions "+\
- "during pairwise alignment)."
+ "during pairwise alignment).")
# return the gap_index of the choice with the smaller distance -- if there
# is a tie, will delete the 5' gap (which is what original NAST does)
@@ -452,9 +449,8 @@ def remove_template_terminal_gaps(candid
"""Remove template terminal gaps and corresponding bases in candidate
"""
if len(template) != len(candidate):
- raise ValueError, \
- "Sequences must be aligned, but their "+\
- "lengths aren't equal. %d != %d" % (len(candidate),len(template))
+ raise ValueError("Sequences must be aligned, but their "+\
+ "lengths aren't equal. %d != %d" % (len(candidate),len(template)))
if len(template) == 0:
return candidate, template
@@ -487,10 +483,10 @@ def remove_template_terminal_gaps(candid
def deprecation_warning(d):
if d:
- print "Unsupported or deprecated options "+\
- "passed to pynast: %s\n" % ' '.join(d.keys()) +\
+ print("Unsupported or deprecated options "+\
+ "passed to pynast: %s\n" % ' '.join(list(d.keys())) +\
" blast_db, max_e_value, and addl_blast_params are deprecated " +\
- "and will be removed in PyNAST 1.3."
+ "and will be removed in PyNAST 1.3.")
def pynast_seq(candidate_sequence, template_alignment,
max_hits=30, min_pct=75.0, min_len=1000, align_unaligned_seqs_f=None,
@@ -534,7 +530,7 @@ def pynast_seq(candidate_sequence, templ
if exit_status == 0:
return l.Data[3], aligned_seq
else:
- raise UnalignableSequenceError, l.Data[2]
+ raise UnalignableSequenceError(l.Data[2])
def ipynast_seqs(candidate_sequences, template_alignment,
max_hits=30, min_pct=75.0, min_len=1000, align_unaligned_seqs_f=None,
@@ -614,8 +610,7 @@ def ipynast_seqs(candidate_sequences, te
try:
template_alignment_f = open(template_alignment)
except IOError:
- raise IOError,\
- "Cannot open specified filepath: %s" % template_alignment
+ raise IOError("Cannot open specified filepath: %s" % template_alignment)
# template alignment provided as filepath -- process it iteratively
# to handle potentially massive template_alignments
template_alignment = {}
@@ -648,7 +643,7 @@ def ipynast_seqs(candidate_sequences, te
tmp_dir=temp_dir)
try:
- current_result = pw_alignment_iterator.next()
+ current_result = next(pw_alignment_iterator)
except StopIteration:
current_result = None
@@ -658,7 +653,7 @@ def ipynast_seqs(candidate_sequences, te
# clean-up temporary blast database files if any were created
pw_alignment_iterator.close()
remove_files(files_to_remove,error_on_missing=False)
- raise ValueError, "Candidate sequence contains gaps. This is not supported."
+ raise ValueError("Candidate sequence contains gaps. This is not supported.")
try:
candidate_seq_id, template_seq_id, pw_aligned_candidate,\
@@ -748,7 +743,7 @@ def ipynast_seqs(candidate_sequences, te
# get the next alignment
try:
- current_result = pw_alignment_iterator.next()
+ current_result = next(pw_alignment_iterator)
except StopIteration:
# end of the input fasta file indicates completion,
# not end of the aligned sequences
--- a/scripts/pynast
+++ b/scripts/pynast
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
@@ -8,7 +8,7 @@
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
-from __future__ import division
+
from distutils.core import setup
import re
--- a/tests/all_tests.py
+++ b/tests/all_tests.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
@@ -21,7 +21,7 @@ def main():
unittest_good_pattern = re.compile('OK\s*$')
application_not_found_pattern = re.compile('ApplicationNotFoundError')
- python_name = 'python'
+ python_name = 'python3'
bad_tests = []
missing_application_tests = []
@@ -38,11 +38,11 @@ def main():
unittest_names.sort()
for unittest_name in unittest_names:
- print "Testing %s:\n" % unittest_name
+ print("Testing %s:\n" % unittest_name)
command = '%s %s -v' % (python_name, unittest_name)
result = Popen(command,shell=True,universal_newlines=True,\
stdout=PIPE,stderr=STDOUT).stdout.read()
- print result
+ print(result)
if not unittest_good_pattern.search(result):
if application_not_found_pattern.search(result):
missing_application_tests.append(unittest_name)
@@ -63,7 +63,7 @@ def main():
for script_name in script_names:
script_good_pattern = re.compile('^Usage: %s' % split(script_name)[1])
- print "Testing %s." % script_name
+ print("Testing %s." % script_name)
command = '%s %s -h' % (python_name, script_name)
result = Popen(command,shell=True,universal_newlines=True,\
stdout=PIPE,stderr=STDOUT).stdout.read()
@@ -74,16 +74,16 @@ def main():
bad_scripts.append(script_name)
if bad_tests:
- print "\nFailed the following unit tests.\n%s" % '\n'.join(bad_tests)
+ print("\nFailed the following unit tests.\n%s" % '\n'.join(bad_tests))
if missing_application_tests:
- print "\nFailed the following unit tests, in part or whole due "+\
+ print("\nFailed the following unit tests, in part or whole due "+\
"to missing external applications.\nDepending on the QIIME features "+\
"you plan to use, this may not be critical.\n%s"\
- % '\n'.join(missing_application_tests)
+ % '\n'.join(missing_application_tests))
if bad_scripts:
- print "\nFailed the following script tests.\n%s" % '\n'.join(bad_scripts)
+ print("\nFailed the following script tests.\n%s" % '\n'.join(bad_scripts))
# If any of the unit tests or script tests failed, or if we have any
# missing application errors, use return code 1 (as python's
@@ -91,7 +91,7 @@ def main():
# suite.
return_code = 1
if not (bad_tests or missing_application_tests or bad_scripts):
- print "\nAll tests passed successfully."
+ print("\nAll tests passed successfully.")
return_code = 0
return return_code
--- a/tests/test_logger.py
+++ b/tests/test_logger.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
@@ -8,7 +8,7 @@
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
-from __future__ import division
+
from tempfile import NamedTemporaryFile
from os import remove
from cogent import LoadSeqs, DNA
--- a/tests/test_pycogent_backports/test_uclust.py
+++ b/tests/test_pycogent_backports/test_uclust.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
"""
: provides unit tests for the uclust.py module
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
#-----------------------------------------------------------------------------
# Copyright (c) 2013, The PyNAST Development Team.
@@ -8,7 +8,7 @@
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
-from __future__ import division
+
from tempfile import NamedTemporaryFile
from os.path import exists
import sys
......@@ -2,3 +2,4 @@ do_not_install_privacy_breaching_scripts.patch
skip_tests_needing_uclust.patch
avoid_python-mpi4py_missing_warning.patch
accommodate_blast+.patch
2to3.patch
......@@ -4,14 +4,11 @@
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
#Allowing this to be overridden by environemnt helps with backports
DEB_PYTHON_SUPPORT?=python2
# Get the supported Python versions
PYVERS = $(shell pyversions -r -v)
PY3VERS = $(shell py3versions -r -v)
%:
dh $@ --with $(DEB_PYTHON_SUPPORT)
dh $@ --with python3 --buildsystem=pybuild
override_dh_auto_build:
dh_auto_build
......@@ -29,7 +26,7 @@ override_dh_auto_test:
ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
set -e -x; \
cd tests; \
for py in $(PYVERS); do \
for py in $(PY3VERS); do \
PYTHONPATH=$$( echo $(CURDIR)/build/lib.*-$$py ) python$$py all_tests.py ; \
done
endif
......
#!/bin/sh -e
pkg=pynast
if [ "$ADTTMP" = "" ] ; then
ADTTMP=`mktemp -d /tmp/${pkg}-test.XXXXXX`
if [ "$AUTOPKGTEST_TMP" = "" ] ; then
AUTOPKGTEST_TMP=`mktemp -d /tmp/${pkg}-test.XXXXXX`
fi
cd $ADTTMP
cp -a /usr/share/doc/${pkg}/tests $ADTTMP
cd $AUTOPKGTEST_TMP
cp -a /usr/share/doc/${pkg}/tests $AUTOPKGTEST_TMP
find . -name "*.gz" -exec gunzip \{\} \;
cd tests
LC_ALL=C.UTF-8 python all_tests.py
......
Name: PyNAST
Reference:
Author: >
J. Gregory Caporaso and Kyle Bittinger and Frederic D. Bushman and
Todd Z. DeSantis and Gary L. Andersen and Rob Knight
Title: >
PyNAST: a flexible tool for aligning sequences to a template alignment
Journal: Bioinformatics
Volume: 26
Pages: 266-267
Year: 2010
DOI: 10.1093/bioinformatics/btp636
PMID: 19914921
URL: http://bioinformatics.oxfordjournals.org/content/26/2/266.long
Author: >
J. Gregory Caporaso and Kyle Bittinger and Frederic D. Bushman and
Todd Z. DeSantis and Gary L. Andersen and Rob Knight
Title: >
PyNAST: a flexible tool for aligning sequences to a template alignment
Journal: Bioinformatics
Volume: 26
Pages: 266-267
Year: 2010
DOI: 10.1093/bioinformatics/btp636
PMID: 19914921
URL: http://bioinformatics.oxfordjournals.org/content/26/2/266.long
Registry:
- Name: SciCrunch
Entry: NA
- Name: conda:bioconda
Entry: pynast
- Name: OMICtools
Entry: OMICS_15419
- Name: bio.tools
Entry: NA
- Name: SciCrunch
Entry: NA
- Name: conda:bioconda
Entry: pynast
- Name: OMICtools
Entry: OMICS_15419
- Name: bio.tools
Entry: NA
Bug-Database: https://github.com/biocore/pynast/issues
Repository: https://github.com/biocore/pynast.git
Repository-Browse: https://github.com/biocore/pynast